From 5e99d46cea7dccd3a0010b8850114b7365b2cf98 Mon Sep 17 00:00:00 2001 From: dave-q <24652224+dave-q@users.noreply.github.com> Date: Fri, 2 Apr 2021 15:55:12 +0100 Subject: [PATCH] [GH-476] Windows feature lookup works with dism name and powershell name --- libraries/windowsfeature_helper.rb | 2 +- recipes/default.rb | 1 - recipes/mod_application_initialization.rb | 4 +-- recipes/mod_aspnet45.rb | 4 +-- recipes/mod_auth_basic.rb | 4 +-- recipes/mod_auth_digest.rb | 4 +-- recipes/mod_auth_windows.rb | 4 +-- recipes/mod_cgi.rb | 4 +-- recipes/mod_compress_dynamic.rb | 4 +-- recipes/mod_compress_static.rb | 4 +-- recipes/mod_ftp.rb | 4 +-- recipes/mod_iis6_metabase_compat.rb | 4 +-- recipes/mod_isapi.rb | 4 +-- recipes/mod_logging.rb | 4 +-- recipes/mod_security.rb | 4 +-- recipes/mod_tracing.rb | 4 +-- resources/install.rb | 2 -- resources/manager.rb | 1 - resources/windows_feature_wrapper.rb | 34 +++++++++++++---------- spec/unit/recipes/default_spec.rb | 14 ---------- 20 files changed, 34 insertions(+), 76 deletions(-) diff --git a/libraries/windowsfeature_helper.rb b/libraries/windowsfeature_helper.rb index d87e88a4..583ca592 100644 --- a/libraries/windowsfeature_helper.rb +++ b/libraries/windowsfeature_helper.rb @@ -24,7 +24,7 @@ def transform_feature_name(install_method, *names) if install_method.to_sym == :windows_feature_powershell translated_features = [] names.each do |name| - cmd = "Get-WindowsFeature | Where-Object {$_.AdditionalInfo.InstallName -Eq '#{name}'} | Select -Expand Name" + cmd = "Get-WindowsFeature | Where-Object {$_.AdditionalInfo.InstallName -Eq '#{name}' -or $_.Name -eq '#{name}'} | Select -Expand Name" result = powershell_out cmd if result.stderr.empty? translated_features.push(result.stdout.strip) diff --git a/recipes/default.rb b/recipes/default.rb index 7159261a..4c2d7041 100644 --- a/recipes/default.rb +++ b/recipes/default.rb @@ -21,7 +21,6 @@ iis_install 'install IIS' do additional_components node['iis']['components'] source node['iis']['source'] - install_method node['iis']['windows_feature_install_method']&.to_sym end service 'iis' do diff --git a/recipes/mod_application_initialization.rb b/recipes/mod_application_initialization.rb index fbd61c18..7345d5e1 100644 --- a/recipes/mod_application_initialization.rb +++ b/recipes/mod_application_initialization.rb @@ -20,6 +20,4 @@ include_recipe 'iis' -iis_windows_feature_wrapper 'IIS-ApplicationInit' do - install_method node['iis']['windows_feature_install_method']&.to_sym -end +iis_windows_feature_wrapper 'IIS-ApplicationInit' diff --git a/recipes/mod_aspnet45.rb b/recipes/mod_aspnet45.rb index 345ff718..7e04dcf0 100644 --- a/recipes/mod_aspnet45.rb +++ b/recipes/mod_aspnet45.rb @@ -21,6 +21,4 @@ include_recipe 'iis' include_recipe 'iis::mod_isapi' -iis_windows_feature_wrapper %w(NetFx4Extended-ASPNET45 IIS-NetFxExtensibility45 IIS-ASPNET45) do - install_method node['iis']['windows_feature_install_method']&.to_sym -end +iis_windows_feature_wrapper %w(NetFx4Extended-ASPNET45 IIS-NetFxExtensibility45 IIS-ASPNET45) diff --git a/recipes/mod_auth_basic.rb b/recipes/mod_auth_basic.rb index dd1a8688..f4fc81e6 100644 --- a/recipes/mod_auth_basic.rb +++ b/recipes/mod_auth_basic.rb @@ -20,9 +20,7 @@ include_recipe 'iis' -iis_windows_feature_wrapper 'IIS-BasicAuthentication' do - install_method node['iis']['windows_feature_install_method']&.to_sym -end +iis_windows_feature_wrapper 'IIS-BasicAuthentication' iis_section 'unlocks basic authentication control in web.config' do section 'system.webServer/security/authentication/basicAuthentication' diff --git a/recipes/mod_auth_digest.rb b/recipes/mod_auth_digest.rb index dcb31a99..722f9d4f 100644 --- a/recipes/mod_auth_digest.rb +++ b/recipes/mod_auth_digest.rb @@ -20,9 +20,7 @@ include_recipe 'iis' -iis_windows_feature_wrapper 'IIS-DigestAuthentication' do - install_method node['iis']['windows_feature_install_method']&.to_sym -end +iis_windows_feature_wrapper 'IIS-DigestAuthentication' iis_section 'unlocks digest authentication control in web.config' do section 'system.webServer/security/authentication/digestAuthentication' diff --git a/recipes/mod_auth_windows.rb b/recipes/mod_auth_windows.rb index 01717e42..a3d67d62 100644 --- a/recipes/mod_auth_windows.rb +++ b/recipes/mod_auth_windows.rb @@ -20,9 +20,7 @@ include_recipe 'iis' -iis_windows_feature_wrapper 'IIS-WindowsAuthentication' do - install_method node['iis']['windows_feature_install_method']&.to_sym -end +iis_windows_feature_wrapper 'IIS-WindowsAuthentication' iis_section 'unlocks windows authentication control in web.config' do section 'system.webServer/security/authentication/windowsAuthentication' diff --git a/recipes/mod_cgi.rb b/recipes/mod_cgi.rb index 17264af1..b37cd792 100644 --- a/recipes/mod_cgi.rb +++ b/recipes/mod_cgi.rb @@ -20,6 +20,4 @@ include_recipe 'iis' -iis_windows_feature_wrapper 'IIS-CGI' do - install_method node['iis']['windows_feature_install_method']&.to_sym -end +iis_windows_feature_wrapper 'IIS-CGI' diff --git a/recipes/mod_compress_dynamic.rb b/recipes/mod_compress_dynamic.rb index cd48b57e..951b6c68 100644 --- a/recipes/mod_compress_dynamic.rb +++ b/recipes/mod_compress_dynamic.rb @@ -20,6 +20,4 @@ include_recipe 'iis' -iis_windows_feature_wrapper 'IIS-HttpCompressionDynamic' do - install_method node['iis']['windows_feature_install_method']&.to_sym -end +iis_windows_feature_wrapper 'IIS-HttpCompressionDynamic' diff --git a/recipes/mod_compress_static.rb b/recipes/mod_compress_static.rb index f7dded0c..50ff21e4 100644 --- a/recipes/mod_compress_static.rb +++ b/recipes/mod_compress_static.rb @@ -20,6 +20,4 @@ include_recipe 'iis' -iis_windows_feature_wrapper 'IIS-HttpCompressionStatic' do - install_method node['iis']['windows_feature_install_method']&.to_sym -end +iis_windows_feature_wrapper 'IIS-HttpCompressionStatic' diff --git a/recipes/mod_ftp.rb b/recipes/mod_ftp.rb index de3d9772..054ce1e2 100644 --- a/recipes/mod_ftp.rb +++ b/recipes/mod_ftp.rb @@ -20,6 +20,4 @@ include_recipe 'iis' -iis_windows_feature_wrapper %w(IIS-FTPServer IIS-FTPSvc IIS-FTPExtensibility) do - install_method node['iis']['windows_feature_install_method']&.to_sym -end +iis_windows_feature_wrapper %w(IIS-FTPServer IIS-FTPSvc IIS-FTPExtensibility) diff --git a/recipes/mod_iis6_metabase_compat.rb b/recipes/mod_iis6_metabase_compat.rb index 6714b685..9ff3071e 100644 --- a/recipes/mod_iis6_metabase_compat.rb +++ b/recipes/mod_iis6_metabase_compat.rb @@ -20,6 +20,4 @@ include_recipe 'iis' -iis_windows_feature_wrapper %w(IIS-IIS6ManagementCompatibility IIS-Metabase) do - install_method node['iis']['windows_feature_install_method']&.to_sym -end +iis_windows_feature_wrapper %w(IIS-IIS6ManagementCompatibility IIS-Metabase) diff --git a/recipes/mod_isapi.rb b/recipes/mod_isapi.rb index 9b7f470e..4b3ff20a 100644 --- a/recipes/mod_isapi.rb +++ b/recipes/mod_isapi.rb @@ -20,6 +20,4 @@ include_recipe 'iis' -iis_windows_feature_wrapper %w(IIS-ISAPIFilter IIS-ISAPIExtensions) do - install_method node['iis']['windows_feature_install_method']&.to_sym -end +iis_windows_feature_wrapper %w(IIS-ISAPIFilter IIS-ISAPIExtensions) diff --git a/recipes/mod_logging.rb b/recipes/mod_logging.rb index 199d2654..9fddb663 100644 --- a/recipes/mod_logging.rb +++ b/recipes/mod_logging.rb @@ -20,6 +20,4 @@ include_recipe 'iis' -iis_windows_feature_wrapper 'IIS-CustomLogging' do - install_method node['iis']['windows_feature_install_method']&.to_sym -end +iis_windows_feature_wrapper 'IIS-CustomLogging' diff --git a/recipes/mod_security.rb b/recipes/mod_security.rb index 1380c1d5..0d5c5520 100644 --- a/recipes/mod_security.rb +++ b/recipes/mod_security.rb @@ -20,6 +20,4 @@ include_recipe 'iis' -iis_windows_feature_wrapper %w(IIS-URLAuthorization IIS-RequestFiltering IIS-IPSecurity) do - install_method node['iis']['windows_feature_install_method']&.to_sym -end +iis_windows_feature_wrapper %w(IIS-URLAuthorization IIS-RequestFiltering IIS-IPSecurity) diff --git a/recipes/mod_tracing.rb b/recipes/mod_tracing.rb index 82e3f779..929ff0a1 100644 --- a/recipes/mod_tracing.rb +++ b/recipes/mod_tracing.rb @@ -20,6 +20,4 @@ include_recipe 'iis' -iis_windows_feature_wrapper 'IIS-HttpTracing' do - install_method node['iis']['windows_feature_install_method']&.to_sym -end +iis_windows_feature_wrapper 'IIS-HttpTracing' diff --git a/resources/install.rb b/resources/install.rb index 0c899a4d..218d5d67 100644 --- a/resources/install.rb +++ b/resources/install.rb @@ -21,7 +21,6 @@ property :source, String property :additional_components, Array, default: [] -property :install_method, Symbol, required: false, equal_to: [:windows_feature_dism, :windows_feature_powershell, :windows_feature_servermanagercmd], default: :windows_feature_dism action :install do features_to_install = ['IIS-WebServerRole'].concat new_resource.additional_components @@ -31,6 +30,5 @@ action :install all !IISCookbook::Helper.older_than_windows2012? source new_resource.source unless new_resource.source.nil? - install_method new_resource.install_method end end diff --git a/resources/manager.rb b/resources/manager.rb index 03e13f16..bac03675 100644 --- a/resources/manager.rb +++ b/resources/manager.rb @@ -27,7 +27,6 @@ action :config do iis_install 'Web-Mgmt-Service' do additional_components ['IIS-ManagementService'] - install_method new_resource.install_method end # properties stored in the registry diff --git a/resources/windows_feature_wrapper.rb b/resources/windows_feature_wrapper.rb index 502c8dff..1962d4db 100644 --- a/resources/windows_feature_wrapper.rb +++ b/resources/windows_feature_wrapper.rb @@ -34,48 +34,52 @@ description: 'Install all applicable management tools for the roles, role services, or features (PowerShell-only).', default: false -property :install_method, Symbol, - description: 'The underlying installation method to use for feature installation. Specify `:windows_feature_dism` for DISM or `:windows_feature_powershell` for PowerShell.', - equal_to: %i(windows_feature_dism windows_feature_powershell windows_feature_servermanagercmd), - default: :windows_feature_dism - property :timeout, Integer, description: 'Specifies a timeout (in seconds) for the feature installation.', default: 600, desired_state: false -action :delete do - feature = transform_feature_name(new_resource.install_method, *new_resource.feature_name) +action :install do + install_method = get_install_mode + feature = transform_feature_name(install_method, *new_resource.feature_name) windows_feature feature do source new_resource.source all new_resource.all management_tools new_resource.management_tools - install_method new_resource.install_method + install_method install_method timeout new_resource.timeout - action :delete + action :install end end -action :install do - feature = transform_feature_name(new_resource.install_method, *new_resource.feature_name) +action :delete do + install_method = get_install_mode + feature = transform_feature_name(install_method, *new_resource.feature_name) windows_feature feature do source new_resource.source all new_resource.all management_tools new_resource.management_tools - install_method new_resource.install_method + install_method install_method timeout new_resource.timeout - action :install + action :delete end end action :remove do - feature = transform_feature_name(new_resource.install_method, *new_resource.feature_name) + install_method = get_install_mode + feature = transform_feature_name(install_method, *new_resource.feature_name) windows_feature feature do source new_resource.source all new_resource.all management_tools new_resource.management_tools - install_method new_resource.install_method + install_method install_method timeout new_resource.timeout action :remove end end + +action_class.class_eval do + def get_install_mode + node['iis']['windows_feature_install_method']&.to_sym + end +end diff --git a/spec/unit/recipes/default_spec.rb b/spec/unit/recipes/default_spec.rb index e1f24a58..cf7cdd16 100644 --- a/spec/unit/recipes/default_spec.rb +++ b/spec/unit/recipes/default_spec.rb @@ -55,18 +55,4 @@ expect(chef_run).to start_service('iis').with(service_name: 'W3SVC') end end - - [:windows_feature_dism, :windows_feature_powershell, :windows_feature_servermanagercmd].each do |method| - context "When iis windows feature install method is provided as #{method}, on a unspecified platform" do - let(:chef_run) do - ChefSpec::SoloRunner.new do |node| - node.override['iis']['windows_feature_install_method'] = method - end.converge(described_recipe) - end - - it "installs windows features using #{method}" do - expect(chef_run).to install_iis_install('install IIS').with(install_method: method) - end - end - end end