class Chef::Resource::WindowsFeaturePowershell
Public Instance Methods
add_to_feature_mash(feature_type, feature_details)
click to toggle source
add the features values to the appropriate array @return [void]
# File lib/chef/resource/windows_feature_powershell.rb, line 225 def add_to_feature_mash(feature_type, feature_details) # add the lowercase feature name to the mash so we can compare it lowercase later node.override["powershell_features_cache"][feature_type] << feature_details.downcase end
fail_if_removed()
click to toggle source
Fail if any of the packages are in a removed state @return [void]
# File lib/chef/resource/windows_feature_powershell.rb, line 232 def fail_if_removed return if new_resource.source # if someone provides a source then all is well return if registry_key_exists?('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Servicing') && registry_value_exists?('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Servicing', name: "LocalSourcePath") # if source is defined in the registry, still fine removed = new_resource.feature_name & node["powershell_features_cache"]["removed"] raise "The Windows feature#{"s" if removed.count > 1} #{removed.join(",")} #{removed.count > 1 ? "are" : "is"} removed from the host and cannot be installed." unless removed.empty? end
features_to_delete()
click to toggle source
@return [Array] features the user has requested to delete which need deleting
# File lib/chef/resource/windows_feature_powershell.rb, line 161 def features_to_delete # the intersection of the features to remove & enabled/disabled features are what needs removing @remove ||= begin all_available = node["powershell_features_cache"]["enabled"] + node["powershell_features_cache"]["disabled"] new_resource.feature_name & all_available end end
features_to_install()
click to toggle source
@return [Array] features the user has requested to install which need installation
# File lib/chef/resource/windows_feature_powershell.rb, line 145 def features_to_install # the intersection of the features to install & disabled/removed features are what needs installing @features_to_install ||= begin features = node["powershell_features_cache"]["disabled"] features |= node["powershell_features_cache"]["removed"] if new_resource.source new_resource.feature_name & features end end
features_to_remove()
click to toggle source
@return [Array] features the user has requested to remove which need removing
# File lib/chef/resource/windows_feature_powershell.rb, line 155 def features_to_remove # the intersection of the features to remove & enabled features are what needs removing @remove ||= new_resource.feature_name & node["powershell_features_cache"]["enabled"] end
parsed_feature_list()
click to toggle source
fetch the list of available feature names and state in JSON and parse the JSON
# File lib/chef/resource/windows_feature_powershell.rb, line 216 def parsed_feature_list # Grab raw feature information from WindowsFeature raw_list_of_features = powershell_out!("Get-WindowsFeature | Select-Object -Property Name,InstallState | ConvertTo-Json -Compress", timeout: new_resource.timeout).stdout Chef::JSONCompat.from_json(raw_list_of_features) end
reload_cached_powershell_data()
click to toggle source
run Get-WindowsFeature to get a list of all available features and their state and save that to the node at node.override level. @return [void]
# File lib/chef/resource/windows_feature_powershell.rb, line 189 def reload_cached_powershell_data Chef::Log.debug("Caching Windows features available via Get-WindowsFeature.") # # FIXME FIXME FIXME # The node object should not be used for caching state like this and this is not a public API and may break. # FIXME FIXME FIXME # node.override["powershell_features_cache"] = Mash.new node.override["powershell_features_cache"]["enabled"] = [] node.override["powershell_features_cache"]["disabled"] = [] node.override["powershell_features_cache"]["removed"] = [] parsed_feature_list.each do |feature_details_raw| case feature_details_raw["InstallState"] when 5 # matches 'Removed' InstallState add_to_feature_mash("removed", feature_details_raw["Name"]) when 1, 3 # matches 'Installed' or 'InstallPending' states add_to_feature_mash("enabled", feature_details_raw["Name"]) when 0, 2 # matches 'Available' or 'UninstallPending' states add_to_feature_mash("disabled", feature_details_raw["Name"]) end end Chef::Log.debug("The powershell cache contains\n#{node["powershell_features_cache"]}") end
to_formatted_array(x)
click to toggle source
Converts strings of features into an Array. Array objects are lowercased @return [Array] array of features
# File lib/chef/resource/windows_feature_powershell.rb, line 83 def to_formatted_array(x) x = x.split(/\s*,\s*/) if x.is_a?(String) # split multiple forms of a comma separated list # features aren't case sensitive so let's compare in lowercase x.map(&:downcase) end