Class: Chef::Provider::RegistryKey

Inherits:
Chef::Provider show all
Includes:
Mixin::Checksum
Defined in:
lib/chef/provider/registry_key.rb

Constant Summary

Constants included from Mixin::ShellOut

Mixin::ShellOut::DEPRECATED_OPTIONS

Instance Attribute Summary

Attributes inherited from Chef::Provider

#action, #cookbook_name, #current_resource, #new_resource, #recipe_name, #run_context

Instance Method Summary collapse

Methods included from Mixin::Checksum

#checksum

Methods inherited from Chef::Provider

#action_nothing, #cleanup_after_converge, #converge_by, #events, #initialize, #node, node_map, #process_resource_requirements, provides, provides?, #requirements, #resource_collection, #resource_updated?, #run_action, #set_updated_status, supports?, #whyrun_mode?

Methods included from Mixin::DescendantsTracker

#descendants, descendants, direct_descendants, #direct_descendants, find_descendants_by_name, #find_descendants_by_name, #inherited, store_inherited

Methods included from Mixin::ShellOut

#run_command_compatible_options, #shell_out, #shell_out!, #shell_out_with_systems_locale, #shell_out_with_systems_locale!

Constructor Details

This class inherits a constructor from Chef::Provider

Instance Method Details

#action_createObject



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/chef/provider/registry_key.rb', line 94

def action_create
  unless registry.key_exists?(@current_resource.key)
    converge_by("create key #{@new_resource.key}") do
      registry.create_key(@new_resource.key, @new_resource.recursive)
    end
  end
  @new_resource.unscrubbed_values.each do |value|
    if @name_hash.has_key?(value[:name])
      current_value = @name_hash[value[:name]]
      unless current_value[:type] == value[:type] && current_value[:data] == value[:data]
        converge_by("set value #{value}") do
          registry.set_value(@new_resource.key, value)
        end
      end
    else
      converge_by("set value #{value}") do
        registry.set_value(@new_resource.key, value)
      end
    end
  end
end

#action_create_if_missingObject



116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/chef/provider/registry_key.rb', line 116

def action_create_if_missing
  unless registry.key_exists?(@new_resource.key)
    converge_by("create key #{@new_resource.key}") do
      registry.create_key(@new_resource.key, @new_resource.recursive)
    end
  end
  @new_resource.unscrubbed_values.each do |value|
    unless @name_hash.has_key?(value[:name])
      converge_by("create value #{value}") do
        registry.set_value(@new_resource.key, value)
      end
    end
  end
end

#action_deleteObject



131
132
133
134
135
136
137
138
139
140
141
# File 'lib/chef/provider/registry_key.rb', line 131

def action_delete
  if registry.key_exists?(@new_resource.key)
    @new_resource.unscrubbed_values.each do |value|
      if @name_hash.has_key?(value[:name])
        converge_by("delete value #{value}") do
          registry.delete_value(@new_resource.key, value)
        end
      end
    end
  end
end

#action_delete_keyObject



143
144
145
146
147
148
149
# File 'lib/chef/provider/registry_key.rb', line 143

def action_delete_key
  if registry.key_exists?(@new_resource.key)
    converge_by("delete key #{@new_resource.key}") do
      registry.delete_key(@new_resource.key, @new_resource.recursive)
    end
  end
end

#define_resource_requirementsObject



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/chef/provider/registry_key.rb', line 71

def define_resource_requirements
  requirements.assert(:create, :create_if_missing, :delete, :delete_key) do |a|
    a.assertion{ registry.hive_exists?(@new_resource.key) }
    a.failure_message(Chef::Exceptions::Win32RegHiveMissing, "Hive #{@new_resource.key.split("\\").shift} does not exist")
  end
  requirements.assert(:create) do |a|
    a.assertion{ registry.key_exists?(@new_resource.key) }
    a.whyrun("Key #{@new_resource.key} does not exist. Unless it would have been created before, attempt to modify its values would fail.")
  end
  requirements.assert(:create, :create_if_missing) do |a|
    #If keys missing in the path and recursive == false
    a.assertion{ !registry.keys_missing?(@current_resource.key) || @new_resource.recursive }
    a.failure_message(Chef::Exceptions::Win32RegNoRecursive, "Intermediate keys missing but recursive is set to false")
    a.whyrun("Intermediate keys in #{@new_resource.key} go not exist. Unless they would have been created earlier, attempt to modify them would fail.")
  end
  requirements.assert(:delete_key) do |a|
    #If key to be deleted has subkeys but recurssive == false
    a.assertion{ !registry.key_exists?(@new_resource.key) || !registry.has_subkeys?(@new_resource.key) || @new_resource.recursive }
    a.failure_message(Chef::Exceptions::Win32RegNoRecursive, "#{@new_resource.key} has subkeys but recursive is set to false.")
    a.whyrun("#{@current_resource.key} has subkeys, but recursive is set to false. attempt to delete would fails unless subkeys were deleted prior to this action.")
  end
end

#load_current_resourceObject



46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/chef/provider/registry_key.rb', line 46

def load_current_resource
  running_on_windows!
  @current_resource ||= Chef::Resource::RegistryKey.new(@new_resource.key, run_context)
  @current_resource.key(@new_resource.key)
  @current_resource.architecture(@new_resource.architecture)
  @current_resource.recursive(@new_resource.recursive)
  if registry.key_exists?(@new_resource.key)
    @current_resource.values(registry.get_values(@new_resource.key))
  end
  values_to_hash(@current_resource.unscrubbed_values)
  @current_resource
end

#registryObject



59
60
61
# File 'lib/chef/provider/registry_key.rb', line 59

def registry
  @registry ||= Chef::Win32::Registry.new(@run_context, @new_resource.architecture)
end

#running_on_windows!Object



40
41
42
43
44
# File 'lib/chef/provider/registry_key.rb', line 40

def running_on_windows!
  unless Chef::Platform.windows?
    raise Chef::Exceptions::Win32NotWindows, "Attempt to manipulate the windows registry on a non-windows node"
  end
end

#values_to_hash(values) ⇒ Object



63
64
65
66
67
68
69
# File 'lib/chef/provider/registry_key.rb', line 63

def values_to_hash(values)
  if values
   @name_hash = Hash[values.map { |val| [val[:name], val] }]
  else
    @name_hash = {}
  end
end

#whyrun_supported?Boolean

Returns:

  • (Boolean)


36
37
38
# File 'lib/chef/provider/registry_key.rb', line 36

def whyrun_supported?
  true
end