lib/chef/knife/winrm_knife_base.rb in knife-windows-3.0.6 vs lib/chef/knife/winrm_knife_base.rb in knife-windows-3.0.10

- old
+ new

@@ -14,21 +14,20 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # +require "chef/knife" +require_relative "winrm_base" +require_relative "winrm_shared_options" +require_relative "knife_windows_base" -require 'chef/knife' -require_relative 'winrm_base' -require_relative 'winrm_shared_options' -require_relative 'knife_windows_base' - class Chef class Knife module WinrmCommandSharedFunctions - FAILED_BASIC_HINT ||= "Hint: Please check winrm configuration 'winrm get winrm/config/service' AllowUnencrypted flag on remote server." + FAILED_BASIC_HINT ||= "Hint: Please check winrm configuration 'winrm get winrm/config/service' AllowUnencrypted flag on remote server.".freeze FAILED_NOT_BASIC_HINT ||= <<-eos.gsub /^\s+/, "" Hint: Make sure to prefix domain usernames with the correct domain name. Hint: Local user names should be prefixed with computer name or IP address. EXAMPLE: my_domain\\user_namer eos @@ -43,21 +42,21 @@ include Chef::Knife::KnifeWindowsBase def validate_winrm_options! winrm_auth_protocol = locate_config_value(:winrm_authentication_protocol) - if ! Chef::Knife::WinrmBase::WINRM_AUTH_PROTOCOL_LIST.include?(winrm_auth_protocol) + unless Chef::Knife::WinrmBase::WINRM_AUTH_PROTOCOL_LIST.include?(winrm_auth_protocol) ui.error "Invalid value '#{winrm_auth_protocol}' for --winrm-authentication-protocol option." ui.info "Valid values are #{Chef::Knife::WinrmBase::WINRM_AUTH_PROTOCOL_LIST.join(",")}." exit 1 end warn_no_ssl_peer_verification if resolve_no_ssl_peer_verification end - #Overrides Chef::Knife#configure_session, as that code is tied to the SSH implementation - #Tracked by Issue # 3042 / https://github.com/chef/chef/issues/3042 + # Overrides Chef::Knife#configure_session, as that code is tied to the SSH implementation + # Tracked by Issue # 3042 / https://github.com/chef/chef/issues/3042 def configure_session validate_winrm_options! resolve_session_options resolve_target_nodes session_from_list @@ -66,30 +65,30 @@ def resolve_target_nodes @list = case config[:manual] when true @name_args[0].split(" ") when false - r = Array.new + r = [] q = Chef::Search::Query.new @action_nodes = q.search(:node, @name_args[0])[0] @action_nodes.each do |item| i = extract_nested_value(item, config[:attribute]) r.push(i) unless i.nil? end r end - if @list.length == 0 + if @list.length == 0 if @action_nodes.length == 0 ui.fatal("No nodes returned from search!") else - ui.fatal("#{@action_nodes.length} #{@action_nodes.length > 1 ? "nodes":"node"} found, " + + ui.fatal("#{@action_nodes.length} #{@action_nodes.length > 1 ? "nodes" : "node"} found, " + "but does not have the required attribute (#{config[:attribute]}) to establish the connection. " + "Try setting another attribute to open the connection using --attribute.") end exit 10 - end + end end # TODO: Copied from Knife::Core:GenericPresenter. Should be extracted def extract_nested_value(data, nested_value_spec) nested_value_spec.split(".").each do |attr| @@ -105,14 +104,14 @@ rescue NoMethodError nil end end end - ( !data.kind_of?(Array) && data.respond_to?(:to_hash) ) ? data.to_hash : data + ( !data.is_a?(Array) && data.respond_to?(:to_hash) ) ? data.to_hash : data end - def run_command(command = '') + def run_command(command = "") relay_winrm_command(command) check_for_errors! @exit_code end @@ -141,11 +140,11 @@ def run_command_in_thread(s, command) @session_results << s.relay_command(command) rescue WinRM::WinRMHTTPTransportError, WinRM::WinRMAuthorizationError => e if authorization_error?(e) - if ! config[:suppress_auth_failure] + unless config[:suppress_auth_failure] # Display errors if the caller hasn't opted to retry ui.error "Failed to authenticate to #{s.host} as #{locate_config_value(:winrm_user)}" ui.info "Response: #{e.message}" ui.info get_failed_authentication_hint raise e @@ -178,24 +177,25 @@ end end end def success_return_codes - #Redundant if the CLI options parsing occurs + # Redundant if the CLI options parsing occurs return [0] unless config[:returns] - return @success_return_codes ||= config[:returns].split(',').collect {|item| item.to_i} + + @success_return_codes ||= config[:returns].split(",").collect(&:to_i) end def session_from_list @list.each do |item| Chef::Log.debug("Adding #{item}") @session_opts[:host] = item create_winrm_session(@session_opts) end end - def create_winrm_session(options={}) + def create_winrm_session(options = {}) session = Chef::Knife::WinrmSession.new(options) @winrm_sessions ||= [] @winrm_sessions.push(session) end @@ -209,14 +209,14 @@ disable_sspi: resolve_winrm_disable_sspi, transport: resolve_winrm_transport, no_ssl_peer_verification: resolve_no_ssl_peer_verification, ssl_peer_fingerprint: resolve_ssl_peer_fingerprint, shell: locate_config_value(:winrm_shell), - codepage: locate_config_value(:winrm_codepage) + codepage: locate_config_value(:winrm_codepage), } - if @session_opts[:user] and (not @session_opts[:password]) + if @session_opts[:user] && (not @session_opts[:password]) @session_opts[:password] = Chef::Config[:knife][:winrm_password] = config[:winrm_password] = get_password end if @session_opts[:transport] == :kerberos @session_opts.merge!(resolve_winrm_kerberos_options) @@ -229,21 +229,21 @@ user = locate_config_value(:winrm_user) # Prefixing with '.\' when using negotiate # to auth user against local machine domain if resolve_winrm_basic_auth || - resolve_winrm_transport == :kerberos || - user.include?("\\") || - user.include?("@") + resolve_winrm_transport == :kerberos || + user.include?("\\") || + user.include?("@") user else ".\\#{user}" end end def resolve_winrm_session_timeout - #30 min (Default) OperationTimeout for long bootstraps fix for KNIFE_WINDOWS-8 + # 30 min (Default) OperationTimeout for long bootstraps fix for KNIFE_WINDOWS-8 locate_config_value(:session_timeout).to_i * 60 if locate_config_value(:session_timeout) end def resolve_winrm_basic_auth locate_config_value(:winrm_authentication_protocol) == "basic" @@ -257,11 +257,11 @@ kerberos_opts end def resolve_winrm_transport transport = locate_config_value(:winrm_transport).to_sym - if config.any? {|k,v| k.to_s =~ /kerberos/ && !v.nil? } + if config.any? { |k, v| k.to_s =~ /kerberos/ && !v.nil? } transport = :kerberos elsif transport != :ssl && negotiate_auth? transport = :negotiate end @@ -287,25 +287,25 @@ def negotiate_auth? locate_config_value(:winrm_authentication_protocol) == "negotiate" end def warn_no_ssl_peer_verification - if ! @@ssl_warning_given + unless @@ssl_warning_given @@ssl_warning_given = true - ui.warn(<<-WARN) -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -SSL validation of HTTPS requests for the WinRM transport is disabled. HTTPS WinRM -connections are still encrypted, but knife is not able to detect forged replies -or spoofing attacks. + ui.warn(<<~WARN) + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + SSL validation of HTTPS requests for the WinRM transport is disabled. HTTPS WinRM + connections are still encrypted, but knife is not able to detect forged replies + or spoofing attacks. -To fix this issue add an entry like this to your knife configuration file: + To fix this issue add an entry like this to your knife configuration file: -``` - # Verify all WinRM HTTPS connections (default, recommended) - knife[:winrm_ssl_verify_mode] = :verify_peer -``` -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -WARN + ``` + # Verify all WinRM HTTPS connections (default, recommended) + knife[:winrm_ssl_verify_mode] = :verify_peer + ``` + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + WARN end end end end