# module Chef::DSL::RebootPending

### Public Instance Methods

reboot_pending?() click to toggle source

Returns true if the system needs a reboot or is expected to reboot Raises UnsupportedPlatform if this functionality isn’t provided yet

    # File lib/chef/dsl/reboot_pending.rb, line 31
    def reboot_pending?

      if platform?("windows")
        # PendingFileRenameOperations contains pairs (REG_MULTI_SZ) of filenames that cannot be updated
        # due to a file being in use (usually a temporary file and a system file)
        # \??\c:\temp\test.sys!\??\c:\winnt\system32\test.sys
        # http://technet.microsoft.com/en-us/library/cc960241.aspx
        registry_value_exists?('HKLM\SYSTEM\CurrentControlSet\Control\Session Manager', { :name => 'PendingFileRenameOperations' }) ||

        # RebootRequired key contains Update IDs with a value of 1 if they require a reboot.
        # The existence of RebootRequired alone is sufficient on my Windows 8.1 workstation in Windows Update
        registry_key_exists?('HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired') ||

        # Vista + Server 2008 and newer may have reboots pending from CBS
        registry_key_exists?('HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootRequired') ||

        # The mere existance of the UpdateExeVolatile key should indicate a pending restart for certain updates
        # http://support.microsoft.com/kb/832475
        (registry_key_exists?('HKLM\SOFTWARE\Microsoft\Updates\UpdateExeVolatile') &&
              !registry_get_values('HKLM\SOFTWARE\Microsoft\Updates\UpdateExeVolatile').select { |v| v[:name] == "Flags" }[0].nil? &&
              [1,2,3].include?(registry_get_values('HKLM\SOFTWARE\Microsoft\Updates\UpdateExeVolatile').select { |v| v[:name] == "Flags" }[0][:data]))
      elsif platform?("ubuntu")
        # This should work for Debian as well if update-notifier-common happens to be installed. We need an API for that.
        File.exists?('/var/run/reboot-required')
      else
        raise Chef::Exceptions::UnsupportedPlatform.new(node[:platform])
      end
    end