71 lines
2.4 KiB
Ruby
71 lines
2.4 KiB
Ruby
#
|
|
# Author:: Greg Zapp (<greg.zapp@gmail.com>)
|
|
# Cookbook:: windows
|
|
# Provider:: feature_powershell
|
|
#
|
|
|
|
property :feature_name, [Array, String], name_attribute: true
|
|
property :source, String
|
|
property :all, [true, false], default: false
|
|
|
|
include Chef::Mixin::PowershellOut
|
|
include Windows::Helper
|
|
|
|
action :remove do
|
|
if installed?
|
|
converge_by("remove Windows feature #{new_resource.feature_name}") do
|
|
cmd = powershell_out!("#{remove_feature_cmdlet} #{to_array(new_resource.feature_name).join(',')}")
|
|
Chef::Log.info(cmd.stdout)
|
|
end
|
|
end
|
|
end
|
|
|
|
action :delete do
|
|
if available?
|
|
converge_by("delete Windows feature #{new_resource.feature_name} from the image") do
|
|
cmd = powershell_out!("Uninstall-WindowsFeature #{to_array(new_resource.feature_name).join(',')} -Remove")
|
|
Chef::Log.info(cmd.stdout)
|
|
end
|
|
end
|
|
end
|
|
|
|
action_class do
|
|
def install_feature_cmdlet
|
|
node['os_version'].to_f < 6.2 ? 'Import-Module ServerManager; Add-WindowsFeature' : 'Install-WindowsFeature'
|
|
end
|
|
|
|
def remove_feature_cmdlet
|
|
node['os_version'].to_f < 6.2 ? 'Import-Module ServerManager; Remove-WindowsFeature' : 'Uninstall-WindowsFeature'
|
|
end
|
|
|
|
def installed?
|
|
@installed ||= begin
|
|
cmd = powershell_out("(Get-WindowsFeature #{to_array(new_resource.feature_name).join(',')} | ?{$_.InstallState -ne \'Installed\'}).count")
|
|
cmd.stderr.empty? && cmd.stdout.chomp.to_i == 0
|
|
end
|
|
end
|
|
|
|
def available?
|
|
@available ||= begin
|
|
cmd = powershell_out("(Get-WindowsFeature #{to_array(new_resource.feature_name).join(',')} | ?{$_.InstallState -ne \'Removed\'}).count")
|
|
cmd.stderr.empty? && cmd.stdout.chomp.to_i > 0
|
|
end
|
|
end
|
|
end
|
|
|
|
action :install do
|
|
Chef::Log.warn("Requested feature #{new_resource.feature_name} is not available on this system.") unless available?
|
|
unless !available? || installed?
|
|
converge_by("install Windows feature #{new_resource.feature_name}") do
|
|
addsource = new_resource.source ? "-Source \"#{new_resource.source}\"" : ''
|
|
addall = new_resource.all ? '-IncludeAllSubFeature' : ''
|
|
cmd = if node['os_version'].to_f < 6.2
|
|
powershell_out!("#{install_feature_cmdlet} #{to_array(new_resource.feature_name).join(',')} #{addall}")
|
|
else
|
|
powershell_out!("#{install_feature_cmdlet} #{to_array(new_resource.feature_name).join(',')} #{addsource} #{addall}")
|
|
end
|
|
Chef::Log.info(cmd.stdout)
|
|
end
|
|
end
|
|
end
|