Class: Chef::Provider::RegistryKey

Inherits:
Chef::Provider show all
Includes:
Mixin::Checksum, Mixin::ShellOut
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, #current_resource, #new_resource, #run_context

Instance Method Summary collapse

Methods included from Mixin::ShellOut

#run_command_compatible_options, #shell_out, #shell_out!

Methods included from Mixin::Checksum

#checksum

Methods inherited from Chef::Provider

#action_nothing, #cleanup_after_converge, #cookbook_name, #events, #initialize, #node, #process_resource_requirements, #requirements, #resource_collection, #run_action, #set_updated_status, #whyrun_mode?

Methods included from DSL::Recipe

#method_missing

Methods included from Mixin::ConvertToClassName

#convert_to_class_name, #convert_to_snake_case, #filename_to_qualified_string, #snake_case_basename

Constructor Details

This class inherits a constructor from Chef::Provider

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Chef::DSL::Recipe

Instance Method Details

#action_createObject



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

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.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



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

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.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



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

def action_delete
  if registry.key_exists?(@new_resource.key)
    @new_resource.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



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

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



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

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



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

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.values)
  @current_resource
end

#registryObject



61
62
63
# File 'lib/chef/provider/registry_key.rb', line 61

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

#running_on_windows!Object



42
43
44
45
46
# File 'lib/chef/provider/registry_key.rb', line 42

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



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

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)


38
39
40
# File 'lib/chef/provider/registry_key.rb', line 38

def whyrun_supported?
  true
end