Class: Chef::Provider::WindowsEnv
- Inherits:
-
Chef::Provider
- Object
- Chef::Provider
- Chef::Provider::WindowsEnv
- Includes:
- Mixin::WindowsEnvHelper
- Defined in:
- lib/chef/provider/windows_env.rb
Constant Summary
Constants included from Mixin::WindowsEnvHelper
Mixin::WindowsEnvHelper::HWND_BROADCAST, Mixin::WindowsEnvHelper::SMTO_ABORTIFHUNG, Mixin::WindowsEnvHelper::SMTO_BLOCK, Mixin::WindowsEnvHelper::SMTO_NOTIMEOUTIFNOTHUNG, Mixin::WindowsEnvHelper::WM_SETTINGCHANGE
Constants included from ReservedNames::Win32::API::System
ReservedNames::Win32::API::System::PRODUCT_BUSINESS, ReservedNames::Win32::API::System::PRODUCT_BUSINESS_N, ReservedNames::Win32::API::System::PRODUCT_CLUSTER_SERVER, ReservedNames::Win32::API::System::PRODUCT_DATACENTER_SERVER, ReservedNames::Win32::API::System::PRODUCT_DATACENTER_SERVER_CORE, ReservedNames::Win32::API::System::PRODUCT_DATACENTER_SERVER_CORE_V, ReservedNames::Win32::API::System::PRODUCT_DATACENTER_SERVER_V, ReservedNames::Win32::API::System::PRODUCT_ENTERPRISE, ReservedNames::Win32::API::System::PRODUCT_ENTERPRISE_E, ReservedNames::Win32::API::System::PRODUCT_ENTERPRISE_N, ReservedNames::Win32::API::System::PRODUCT_ENTERPRISE_SERVER, ReservedNames::Win32::API::System::PRODUCT_ENTERPRISE_SERVER_CORE, ReservedNames::Win32::API::System::PRODUCT_ENTERPRISE_SERVER_CORE_V, ReservedNames::Win32::API::System::PRODUCT_ENTERPRISE_SERVER_IA64, ReservedNames::Win32::API::System::PRODUCT_ENTERPRISE_SERVER_V, ReservedNames::Win32::API::System::PRODUCT_HOME_BASIC, ReservedNames::Win32::API::System::PRODUCT_HOME_BASIC_E, ReservedNames::Win32::API::System::PRODUCT_HOME_BASIC_N, ReservedNames::Win32::API::System::PRODUCT_HOME_PREMIUM, ReservedNames::Win32::API::System::PRODUCT_HOME_PREMIUM_E, ReservedNames::Win32::API::System::PRODUCT_HOME_PREMIUM_N, ReservedNames::Win32::API::System::PRODUCT_HOME_PREMIUM_SERVER, ReservedNames::Win32::API::System::PRODUCT_HOME_SERVER, ReservedNames::Win32::API::System::PRODUCT_HYPERV, ReservedNames::Win32::API::System::PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT, ReservedNames::Win32::API::System::PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING, ReservedNames::Win32::API::System::PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY, ReservedNames::Win32::API::System::PRODUCT_PROFESSIONAL, ReservedNames::Win32::API::System::PRODUCT_PROFESSIONAL_E, ReservedNames::Win32::API::System::PRODUCT_PROFESSIONAL_N, ReservedNames::Win32::API::System::PRODUCT_SB_SOLUTION_SERVER, ReservedNames::Win32::API::System::PRODUCT_SERVER_FOR_SMALLBUSINESS, ReservedNames::Win32::API::System::PRODUCT_SERVER_FOR_SMALLBUSINESS_V, ReservedNames::Win32::API::System::PRODUCT_SERVER_FOUNDATION, ReservedNames::Win32::API::System::PRODUCT_SMALLBUSINESS_SERVER, ReservedNames::Win32::API::System::PRODUCT_SOLUTION_EMBEDDEDSERVER, ReservedNames::Win32::API::System::PRODUCT_STANDARD_SERVER, ReservedNames::Win32::API::System::PRODUCT_STANDARD_SERVER_CORE, ReservedNames::Win32::API::System::PRODUCT_STANDARD_SERVER_CORE_V, ReservedNames::Win32::API::System::PRODUCT_STANDARD_SERVER_V, ReservedNames::Win32::API::System::PRODUCT_STARTER, ReservedNames::Win32::API::System::PRODUCT_STARTER_E, ReservedNames::Win32::API::System::PRODUCT_STARTER_N, ReservedNames::Win32::API::System::PRODUCT_STORAGE_ENTERPRISE_SERVER, ReservedNames::Win32::API::System::PRODUCT_STORAGE_EXPRESS_SERVER, ReservedNames::Win32::API::System::PRODUCT_STORAGE_STANDARD_SERVER, ReservedNames::Win32::API::System::PRODUCT_STORAGE_WORKGROUP_SERVER, ReservedNames::Win32::API::System::PRODUCT_ULTIMATE, ReservedNames::Win32::API::System::PRODUCT_ULTIMATE_E, ReservedNames::Win32::API::System::PRODUCT_ULTIMATE_N, ReservedNames::Win32::API::System::PRODUCT_UNDEFINED, ReservedNames::Win32::API::System::PRODUCT_WEB_SERVER, ReservedNames::Win32::API::System::PRODUCT_WEB_SERVER_CORE, ReservedNames::Win32::API::System::SM_SERVERR2, ReservedNames::Win32::API::System::VER_NT_DOMAIN_CONTROLLER, ReservedNames::Win32::API::System::VER_NT_SERVER, ReservedNames::Win32::API::System::VER_NT_WORKSTATION, ReservedNames::Win32::API::System::VER_SUITE_BACKOFFICE, ReservedNames::Win32::API::System::VER_SUITE_BLADE, ReservedNames::Win32::API::System::VER_SUITE_COMPUTE_SERVER, ReservedNames::Win32::API::System::VER_SUITE_DATACENTER, ReservedNames::Win32::API::System::VER_SUITE_EMBEDDEDNT, ReservedNames::Win32::API::System::VER_SUITE_ENTERPRISE, ReservedNames::Win32::API::System::VER_SUITE_PERSONAL, ReservedNames::Win32::API::System::VER_SUITE_SINGLEUSERTS, ReservedNames::Win32::API::System::VER_SUITE_SMALLBUSINESS, ReservedNames::Win32::API::System::VER_SUITE_SMALLBUSINESS_RESTRICTED, ReservedNames::Win32::API::System::VER_SUITE_STORAGE_SERVER, ReservedNames::Win32::API::System::VER_SUITE_TERMINAL, ReservedNames::Win32::API::System::VER_SUITE_WH_SERVER
Instance Attribute Summary collapse
-
#key_exists ⇒ Object
Returns the value of attribute key_exists.
Attributes inherited from Chef::Provider
#action, #current_resource, #logger, #new_resource, #recipe_name, #run_context
Instance Method Summary collapse
- #action_create ⇒ Object
- #action_delete ⇒ Object
- #action_modify ⇒ Object
- #create_env ⇒ Object
-
#current_values ⇒ Object
Returns the current values to split by delimiter.
-
#delete_element ⇒ Object
e.g.
- #delete_env ⇒ Object
- #env_key_exists(key_name) ⇒ Object
- #env_obj(key_name) ⇒ Object
- #env_value(key_name) ⇒ Object
-
#initialize(new_resource, run_context) ⇒ WindowsEnv
constructor
A new instance of WindowsEnv.
- #load_current_resource ⇒ Object
- #modify_env ⇒ Object
-
#new_values ⇒ Object
Returns the new values to split by delimiter.
-
#requires_modify_or_create? ⇒ Boolean
(also: #compare_value)
Check to see if value needs any changes.
- #whyrun_supported? ⇒ Boolean
Methods included from Mixin::WindowsEnvHelper
#broadcast_env_change, #expand_path
Methods included from Mixin::WideString
#utf8_to_wide, #wide_to_utf8, #wstring
Methods inherited from Chef::Provider
action, #action_nothing, #check_resource_semantics!, #cleanup_after_converge, #compile_and_converge_action, #converge_by, #converge_if_changed, #cookbook_name, #define_resource_requirements, #description, #events, include_resource_dsl?, include_resource_dsl_module, #introduced, #node, #process_resource_requirements, provides, provides?, #requirements, #resource_collection, #resource_updated?, #run_action, #set_updated_status, supports?, use_inline_resources, #whyrun_mode?
Methods included from Mixin::Provides
#provided_as, #provides, #provides?
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::LazyModuleInclude
#descendants, #include, #included
Methods included from Mixin::NotifyingBlock
#notifying_block, #subcontext_block
Methods included from DSL::DeclareResource
#build_resource, #declare_resource, #delete_resource, #delete_resource!, #edit_resource, #edit_resource!, #find_resource, #find_resource!, #with_run_context
Methods included from Mixin::ShellOut
#a_to_s, #clean_array, #shell_out, #shell_out!, #shell_out_compact, #shell_out_compact!, #shell_out_compact_timeout, #shell_out_compact_timeout!, #shell_out_with_systems_locale, #shell_out_with_systems_locale!
Methods included from Mixin::PathSanity
#enforce_path_sanity, #sanitized_path
Methods included from Mixin::PowershellOut
#powershell_out, #powershell_out!
Methods included from Mixin::WindowsArchitectureHelper
#assert_valid_windows_architecture!, #disable_wow64_file_redirection, #forced_32bit_override_required?, #is_i386_process_on_x86_64_windows?, #node_supports_windows_architecture?, #node_windows_architecture, #restore_wow64_file_redirection, #valid_windows_architecture?, #with_os_architecture, #wow64_architecture_override_required?, #wow64_directory
Methods included from Mixin::PowershellExec
Methods included from DSL::PlatformIntrospection
#docker?, #platform?, #platform_family?, #value_for_platform, #value_for_platform_family
Constructor Details
#initialize(new_resource, run_context) ⇒ WindowsEnv
Returns a new instance of WindowsEnv.
36 37 38 39 |
# File 'lib/chef/provider/windows_env.rb', line 36 def initialize(new_resource, run_context) super @key_exists = true end |
Instance Attribute Details
#key_exists ⇒ Object
Returns the value of attribute key_exists.
27 28 29 |
# File 'lib/chef/provider/windows_env.rb', line 27 def key_exists @key_exists end |
Instance Method Details
#action_create ⇒ Object
80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/chef/provider/windows_env.rb', line 80 def action_create if @key_exists if requires_modify_or_create? modify_env logger.info("#{new_resource} altered") new_resource.updated_by_last_action(true) end else create_env logger.info("#{new_resource} created") new_resource.updated_by_last_action(true) end end |
#action_delete ⇒ Object
124 125 126 127 128 129 130 |
# File 'lib/chef/provider/windows_env.rb', line 124 def action_delete if ( ENV[new_resource.key_name] || @key_exists ) && !delete_element delete_env logger.info("#{new_resource} deleted") new_resource.updated_by_last_action(true) end end |
#action_modify ⇒ Object
132 133 134 135 136 137 138 139 140 141 142 |
# File 'lib/chef/provider/windows_env.rb', line 132 def action_modify if @key_exists if requires_modify_or_create? modify_env logger.info("#{new_resource} modified") new_resource.updated_by_last_action(true) end else raise Chef::Exceptions::WindowsEnv, "Cannot modify #{new_resource} - key does not exist!" end end |
#create_env ⇒ Object
144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
# File 'lib/chef/provider/windows_env.rb', line 144 def create_env obj = env_obj(@new_resource.key_name) unless obj obj = WIN32OLE.connect("winmgmts://").get("Win32_Environment").spawninstance_ obj.name = @new_resource.key_name obj.username = new_resource.user end obj.variablevalue = @new_resource.value obj.put_ value = @new_resource.value value = (value) if @new_resource.key_name.casecmp("PATH") == 0 ENV[@new_resource.key_name] = value broadcast_env_change end |
#current_values ⇒ Object
Returns the current values to split by delimiter
178 179 180 |
# File 'lib/chef/provider/windows_env.rb', line 178 def current_values @current_values ||= current_resource.value.split(new_resource.delim) end |
#delete_element ⇒ Object
e.g. delete a PATH element
Returns
- <true>
-
If we handled the element case and caller should not delete the key
- <false>
-
Caller should delete the key, either no :delim was specific or value was empty after we removed the element.
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
# File 'lib/chef/provider/windows_env.rb', line 100 def delete_element return false unless new_resource.delim #no delim: delete the key needs_delete = new_values.any? { |v| current_values.include?(v) } if !needs_delete logger.trace("#{new_resource} element '#{new_resource.value}' does not exist") return true #do not delete the key else new_value = current_values.select do |item| not new_values.include?(item) end.join(new_resource.delim) if new_value.empty? return false #nothing left here, delete the key else old_value = new_resource.value(new_value) create_env logger.trace("#{new_resource} deleted #{old_value} element") new_resource.updated_by_last_action(true) return true #we removed the element and updated; do not delete the key end end end |
#delete_env ⇒ Object
159 160 161 162 163 164 165 166 167 168 |
# File 'lib/chef/provider/windows_env.rb', line 159 def delete_env obj = env_obj(@new_resource.key_name) if obj obj.delete_ broadcast_env_change end if ENV[@new_resource.key_name] ENV.delete(@new_resource.key_name) end end |
#env_key_exists(key_name) ⇒ Object
55 56 57 |
# File 'lib/chef/provider/windows_env.rb', line 55 def env_key_exists(key_name) env_value(key_name) ? true : false end |
#env_obj(key_name) ⇒ Object
192 193 194 195 196 197 198 199 200 201 202 203 204 |
# File 'lib/chef/provider/windows_env.rb', line 192 def env_obj(key_name) return @env_obj if @env_obj wmi = WmiLite::Wmi.new # Note that by design this query is case insensitive with regard to key_name environment_variables = wmi.query("select * from Win32_Environment where name = '#{key_name}'") if environment_variables && environment_variables.length > 0 environment_variables.each do |env| @env_obj = env.wmi_ole_object return @env_obj if @env_obj.username.split('\\').last.casecmp(new_resource.user) == 0 end end @env_obj = nil end |
#env_value(key_name) ⇒ Object
187 188 189 190 |
# File 'lib/chef/provider/windows_env.rb', line 187 def env_value(key_name) obj = env_obj(key_name) obj.variablevalue if obj end |
#load_current_resource ⇒ Object
41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/chef/provider/windows_env.rb', line 41 def load_current_resource @current_resource = Chef::Resource::WindowsEnv.new(new_resource.name) current_resource.key_name(new_resource.key_name) if env_key_exists(new_resource.key_name) current_resource.value(env_value(new_resource.key_name)) else @key_exists = false logger.trace("#{new_resource} key does not exist") end current_resource end |
#modify_env ⇒ Object
170 171 172 173 174 175 |
# File 'lib/chef/provider/windows_env.rb', line 170 def modify_env if new_resource.delim new_resource.value((new_values + current_values).uniq.join(new_resource.delim)) end create_env end |
#new_values ⇒ Object
Returns the new values to split by delimiter
183 184 185 |
# File 'lib/chef/provider/windows_env.rb', line 183 def new_values @new_values ||= new_resource.value.split(new_resource.delim) end |
#requires_modify_or_create? ⇒ Boolean Also known as: compare_value
Check to see if value needs any changes
Returns
- <true>
-
If a change is required
- <false>
-
If a change is not required
64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/chef/provider/windows_env.rb', line 64 def requires_modify_or_create? if new_resource.delim #e.g. check for existing value within PATH new_values.inject(0) do |index, val| next_index = current_values.find_index val return true if next_index.nil? || next_index < index next_index end false else new_resource.value != current_resource.value end end |
#whyrun_supported? ⇒ Boolean
32 33 34 |
# File 'lib/chef/provider/windows_env.rb', line 32 def whyrun_supported? false end |