class Chef::Provider::Package::Windows::RegistryUninstallEntry

Constants

UNINSTALL_SUBKEY

Attributes

data[R]
display_name[R]
display_version[R]
hive[R]
key[R]
logger[R]
uninstall_string[R]

Public Class Methods

find_entries(package_name) click to toggle source
# File lib/chef/provider/package/windows/registry_uninstall_entry.rb, line 28
def self.find_entries(package_name)
  logger.trace("Finding uninstall entries for #{package_name}")
  entries = []
  [
    [::Win32::Registry::HKEY_LOCAL_MACHINE, (::Win32::Registry::Constants::KEY_READ | 0x0100)],
    [::Win32::Registry::HKEY_LOCAL_MACHINE, (::Win32::Registry::Constants::KEY_READ | 0x0200)],
    [::Win32::Registry::HKEY_CURRENT_USER],
  ].each do |hkey|
    desired = hkey.length > 1 ? hkey[1] : ::Win32::Registry::Constants::KEY_READ
    begin
      ::Win32::Registry.open(hkey[0], UNINSTALL_SUBKEY, desired) do |reg|
        reg.each_key do |key, _wtime|
          begin
            entry = reg.open(key, desired)
            display_name = read_registry_property(entry, "DisplayName")
            if display_name.to_s.rstrip == package_name
              quiet_uninstall_string = RegistryUninstallEntry.read_registry_property(entry, "QuietUninstallString")
              entries.push(quiet_uninstall_string_key?(quiet_uninstall_string, hkey, key, entry))
            end
          rescue ::Win32::Registry::Error => ex
            logger.trace("Registry error opening key '#{key}' on node #{desired}: #{ex}")
          end
        end
      end
    rescue ::Win32::Registry::Error => ex
      logger.trace("Registry error opening hive '#{hkey[0]}' :: #{desired}: #{ex}")
    end
  end
  entries
end
logger() click to toggle source
# File lib/chef/provider/package/windows/registry_uninstall_entry.rb, line 71
def self.logger
  Chef::Log
end
new(hive, key, registry_data, uninstall_key = "UninstallString") click to toggle source
# File lib/chef/provider/package/windows/registry_uninstall_entry.rb, line 75
def initialize(hive, key, registry_data, uninstall_key = "UninstallString")
  @logger = Chef::Log.with_child({ subsystem: "registry_uninstall_entry" })
  logger.trace("Creating uninstall entry for #{hive}::#{key}")
  @hive = hive
  @key = key
  @data = registry_data
  @display_name = RegistryUninstallEntry.read_registry_property(registry_data, "DisplayName")
  @display_version = RegistryUninstallEntry.read_registry_property(registry_data, "DisplayVersion")
  @uninstall_string = RegistryUninstallEntry.read_registry_property(registry_data, uninstall_key)
end
quiet_uninstall_string_key?(quiet_uninstall_string, hkey, key, entry) click to toggle source
# File lib/chef/provider/package/windows/registry_uninstall_entry.rb, line 59
def self.quiet_uninstall_string_key?(quiet_uninstall_string, hkey, key, entry)
  return RegistryUninstallEntry.new(hkey, key, entry) if quiet_uninstall_string.nil?
  RegistryUninstallEntry.new(hkey, key, entry, "QuietUninstallString")
end
read_registry_property(data, property) click to toggle source
# File lib/chef/provider/package/windows/registry_uninstall_entry.rb, line 64
def self.read_registry_property(data, property)
  data[property]
rescue ::Win32::Registry::Error
  logger.trace("Failure to read property '#{property}'")
  nil
end