Module: Chef::Platform::Rebooter

Extended by:
DSL::RebootPending, Mixin::ShellOut
Defined in:
lib/chef/platform/rebooter.rb

Class Method Summary collapse

Methods included from DSL::RebootPending

reboot_pending?

Methods included from DSL::PlatformIntrospection

#older_than_win_2012_or_8?, #platform?, #platform_family?, #value_for_platform, #value_for_platform_family

Methods included from DSL::RegistryHelper

#registry_data_exists?, #registry_get_subkeys, #registry_get_values, #registry_has_subkeys?, #registry_key_exists?, #registry_value_exists?

Class Method Details

.reboot!(node) ⇒ Object


34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/chef/platform/rebooter.rb', line 34

def reboot!(node)
  reboot_info = node.run_context.reboot_info

  cmd = case
        when ChefUtils.windows?
          # should this do /f as well? do we then need a minimum delay to let apps quit?
          # Use explicit path to shutdown.exe, to protect against https://github.com/chef/chef/issues/5594
          windows_shutdown_path = "#{ENV["SYSTEMROOT"]}/System32/shutdown.exe"
          "#{windows_shutdown_path} /r /t #{reboot_info[:delay_mins] * 60} /c \"#{reboot_info[:reason]}\""
        when node["os"] == "solaris2"
          # SysV-flavored shutdown
          "shutdown -i6 -g#{reboot_info[:delay_mins]} -y \"#{reboot_info[:reason]}\" &"
        else
          # Linux/BSD/Mac/AIX and other systems with BSD-ish shutdown
          "shutdown -r +#{reboot_info[:delay_mins]} \"#{reboot_info[:reason]}\" &"
        end

  msg = "Rebooting server at a recipe's request. Details: #{reboot_info.inspect}"
  begin
    Chef::Log.warn msg
    shell_out!(cmd)
  rescue Mixlib::ShellOut::ShellCommandFailed => e
    raise Chef::Exceptions::RebootFailed.new(e.message)
  end

  raise Chef::Exceptions::Reboot.new(msg)
end

.reboot_if_needed!(node) ⇒ Object

this is a wrapper function so Chef::Client only needs a single line of code.


63
64
65
66
67
# File 'lib/chef/platform/rebooter.rb', line 63

def reboot_if_needed!(node)
  if node.run_context.reboot_requested?
    reboot!(node)
  end
end