mirror of
https://github.com/hashicorp/vagrant.git
synced 2026-05-28 04:36:05 -04:00
Remove customized require behaviors and modify the bin executable to check for missing tools that Vagrant expects to exist when running outside of an installer.
74 lines
2.3 KiB
Ruby
74 lines
2.3 KiB
Ruby
# Copyright (c) HashiCorp, Inc.
|
|
# SPDX-License-Identifier: BUSL-1.1
|
|
|
|
require 'vagrant/util/guest_inspection'
|
|
require "log4r"
|
|
|
|
module VagrantPlugins
|
|
module GuestLinux
|
|
module Cap
|
|
class Reboot
|
|
extend Vagrant::Util::GuestInspection::Linux
|
|
|
|
DEFAULT_MAX_REBOOT_RETRY_DURATION = 120
|
|
WAIT_SLEEP_TIME = 5
|
|
|
|
def self.reboot(machine)
|
|
@logger = Log4r::Logger.new("vagrant::linux::reboot")
|
|
reboot_script = "ps -q 1 -o comm=,start= > /tmp/.vagrant-reboot"
|
|
|
|
if systemd?(machine.communicate)
|
|
reboot_cmd = "systemctl reboot"
|
|
else
|
|
reboot_cmd = "reboot"
|
|
end
|
|
|
|
comm = machine.communicate
|
|
reboot_script += "; #{reboot_cmd}"
|
|
|
|
@logger.debug("Issuing reboot command for guest")
|
|
comm.sudo(reboot_script)
|
|
|
|
machine.ui.info(I18n.t("vagrant.guests.capabilities.rebooting"))
|
|
|
|
@logger.debug("Waiting for machine to finish rebooting")
|
|
|
|
wait_remaining = ENV.fetch("VAGRANT_MAX_REBOOT_RETRY_DURATION",
|
|
DEFAULT_MAX_REBOOT_RETRY_DURATION).to_i
|
|
wait_remaining = DEFAULT_MAX_REBOOT_RETRY_DURATION if wait_remaining < 1
|
|
|
|
begin
|
|
wait_for_reboot(machine)
|
|
rescue Vagrant::Errors::MachineGuestNotReady
|
|
raise if wait_remaining < 0
|
|
@logger.warn("Machine not ready, cannot start reboot yet. Trying again")
|
|
sleep(WAIT_SLEEP_TIME)
|
|
wait_remaining -= WAIT_SLEEP_TIME
|
|
retry
|
|
end
|
|
end
|
|
|
|
def self.wait_for_reboot(machine)
|
|
caught = false
|
|
begin
|
|
check_script = 'grep "$(ps -q 1 -o comm=,start=)" /tmp/.vagrant-reboot'
|
|
while machine.guest.ready? && machine.communicate.execute(check_script, error_check: false) == 0
|
|
sleep 10
|
|
end
|
|
rescue
|
|
# The check script execution may result in an exception
|
|
# getting raised depending on the state of the communicator
|
|
# when executing. We'll allow for it to happen once, and then
|
|
# raise if we get an exception again
|
|
if caught
|
|
raise
|
|
end
|
|
caught = true
|
|
sleep 10
|
|
retry
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|