lib/chef/knife/winrm_session.rb in knife-windows-1.7.0 vs lib/chef/knife/winrm_session.rb in knife-windows-1.7.1

- old
+ new

@@ -1,98 +1,98 @@ -# -# Author:: Steven Murawski <smurawski@chef.io> -# Copyright:: Copyright (c) 2015-2016 Chef Software, Inc. -# License:: Apache License, Version 2.0 -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# 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/application' -require 'winrm' -require 'winrm-elevated' - -class Chef - class Knife - class WinrmSession - attr_reader :host, :endpoint, :port, :output, :error, :exit_code - - def initialize(options) - configure_proxy - - @host = options[:host] - @port = options[:port] - @user = options[:user] - @shell_args = [ options[:shell] ] - @shell_args << { codepage: options[:codepage] } if options[:shell] == :cmd - url = "#{options[:host]}:#{options[:port]}/wsman" - scheme = options[:transport] == :ssl ? 'https' : 'http' - @endpoint = "#{scheme}://#{url}" - - opts = Hash.new - opts = { - user: @user, - password: options[:password], - basic_auth_only: options[:basic_auth_only], - disable_sspi: options[:disable_sspi], - no_ssl_peer_verification: options[:no_ssl_peer_verification], - ssl_peer_fingerprint: options[:ssl_peer_fingerprint], - endpoint: endpoint, - transport: options[:transport] - } - options[:transport] == :kerberos ? opts.merge!({:service => options[:service], :realm => options[:realm]}) : opts.merge!({:ca_trust_path => options[:ca_trust_path]}) - opts[:operation_timeout] = options[:operation_timeout] if options[:operation_timeout] - Chef::Log.debug("WinRM::WinRMWebService options: #{opts}") - Chef::Log.debug("Endpoint: #{endpoint}") - Chef::Log.debug("Transport: #{options[:transport]}") - - @winrm_session = WinRM::Connection.new(opts) - @winrm_session.logger = Chef::Log - - transport = @winrm_session.send(:transport) - http_client = transport.instance_variable_get(:@httpcli) - Chef::HTTP::DefaultSSLPolicy.new(http_client.ssl_config).set_custom_certs - end - - def relay_command(command) - session_result = WinRM::Output.new - @winrm_session.shell(*@shell_args) do |shell| - shell.username = @user.split("\\").last if shell.respond_to?(:username) - session_result = shell.run(command) do |stdout, stderr| - print_data(@host, stdout) if stdout - print_data(@host, stderr, :red) if stderr - end - end - @exit_code = session_result.exitcode - session_result - end - - private - - def print_data(host, data, color = :cyan) - if data =~ /\n/ - data.split(/\n/).each { |d| print_data(host, d, color) } - elsif !data.nil? - print Chef::Knife::Winrm.ui.color(host, color) - puts " #{data}" - end - end - - def configure_proxy - if Chef::Config.respond_to?(:export_proxies) - Chef::Config.export_proxies - else - Chef::Application.new.configure_proxy_environment_variables - end - end - end - end -end +# +# Author:: Steven Murawski <smurawski@chef.io> +# Copyright:: Copyright (c) 2015-2016 Chef Software, Inc. +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# 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/application' +require 'winrm' +require 'winrm-elevated' + +class Chef + class Knife + class WinrmSession + attr_reader :host, :endpoint, :port, :output, :error, :exit_code + + def initialize(options) + configure_proxy + + @host = options[:host] + @port = options[:port] + @user = options[:user] + @shell_args = [ options[:shell] ] + @shell_args << { codepage: options[:codepage] } if options[:shell] == :cmd + url = "#{options[:host]}:#{options[:port]}/wsman" + scheme = options[:transport] == :ssl ? 'https' : 'http' + @endpoint = "#{scheme}://#{url}" + + opts = Hash.new + opts = { + user: @user, + password: options[:password], + basic_auth_only: options[:basic_auth_only], + disable_sspi: options[:disable_sspi], + no_ssl_peer_verification: options[:no_ssl_peer_verification], + ssl_peer_fingerprint: options[:ssl_peer_fingerprint], + endpoint: endpoint, + transport: options[:transport] + } + options[:transport] == :kerberos ? opts.merge!({:service => options[:service], :realm => options[:realm]}) : opts.merge!({:ca_trust_path => options[:ca_trust_path]}) + opts[:operation_timeout] = options[:operation_timeout] if options[:operation_timeout] + Chef::Log.debug("WinRM::WinRMWebService options: #{opts}") + Chef::Log.debug("Endpoint: #{endpoint}") + Chef::Log.debug("Transport: #{options[:transport]}") + + @winrm_session = WinRM::Connection.new(opts) + @winrm_session.logger = Chef::Log + + transport = @winrm_session.send(:transport) + http_client = transport.instance_variable_get(:@httpcli) + Chef::HTTP::DefaultSSLPolicy.new(http_client.ssl_config).set_custom_certs + end + + def relay_command(command) + session_result = WinRM::Output.new + @winrm_session.shell(*@shell_args) do |shell| + shell.username = @user.split("\\").last if shell.respond_to?(:username) + session_result = shell.run(command) do |stdout, stderr| + print_data(@host, stdout) if stdout + print_data(@host, stderr, :red) if stderr + end + end + @exit_code = session_result.exitcode + session_result + end + + private + + def print_data(host, data, color = :cyan) + if data =~ /\n/ + data.split(/\n/).each { |d| print_data(host, d, color) } + elsif !data.nil? + print Chef::Knife::Winrm.ui.color(host, color) + puts " #{data}" + end + end + + def configure_proxy + if Chef::Config.respond_to?(:export_proxies) + Chef::Config.export_proxies + else + Chef::Application.new.configure_proxy_environment_variables + end + end + end + end +end