lib/chef/knife/winrm.rb in knife-windows-0.5.3 vs lib/chef/knife/winrm.rb in knife-windows-0.5.4

- old
+ new

@@ -15,18 +15,22 @@ # See the License for the specific language governing permissions and # limitations under the License. # require 'chef/knife' +require 'chef/knife/winrm_base' class Chef class Knife class Winrm < Knife + include Chef::Knife::WinrmBase + deps do require 'readline' require 'chef/search/query' + require 'em-winrm' end attr_writer :password banner "knife winrm QUERY COMMAND (options)" @@ -42,69 +46,11 @@ :long => "--manual-list", :boolean => true, :description => "QUERY is a space separated list of servers", :default => false - option :winrm_user, - :short => "-x USERNAME", - :long => "--winrm-user USERNAME", - :description => "The WinRM username", - :default => "Administrator", - :proc => Proc.new { |key| Chef::Config[:knife][:winrm_user] = key } - - option :winrm_password, - :short => "-P PASSWORD", - :long => "--winrm-password PASSWORD", - :description => "The WinRM password", - :proc => Proc.new { |key| Chef::Config[:knife][:winrm_password] = key } - - option :winrm_port, - :short => "-p PORT", - :long => "--winrm-port PORT", - :description => "The WinRM port", - :default => "5985", - :proc => Proc.new { |key| Chef::Config[:knife][:winrm_port] = key } - - option :winrm_transport, - :short => "-t TRANSPORT", - :long => "--winrm-transport TRANSPORT", - :description => "The WinRM transport type: ssl, or plaintext", - :default => 'plaintext', - :proc => Proc.new { |transport| Chef::Config[:knife][:winrm_transport] = transport } - - option :kerberos_keytab_file, - :short => "-i KEYTAB_FILE", - :long => "--keytab-file KEYTAB_FILE", - :description => "The Kerberos keytab file used for authentication", - :proc => Proc.new { |keytab| Chef::Config[:knife][:kerberos_keytab_file] = keytab } - - option :kerberos_realm, - :short => "-R KERBEROS_REALM", - :long => "--kerberos-realm KERBEROS_REALM", - :description => "The Kerberos realm used for authentication", - :proc => Proc.new { |realm| Chef::Config[:knife][:kerberos_realm] = realm } - - option :kerberos_service, - :short => "-S KERBEROS_SERVICE", - :long => "--kerberos-service KERBEROS_SERVICE", - :description => "The Kerberos service used for authentication", - :proc => Proc.new { |service| Chef::Config[:knife][:kerberos_service] = service } - - option :keytab_file, - :short => "-i KEYTAB_FILE", - :long => "--keytab-file KEYTAB_FILE", - :description => "The Kerberos keytab file used for authentication", - :proc => Proc.new { |keytab| Chef::Config[:knife][:keytab_file] = keytab } - - option :ca_trust_file, - :short => "-f CA_TRUST_FILE", - :long => "--ca-trust-file CA_TRUST_FILE", - :description => "The Certificate Authority (CA) trust file used for SSL transport", - :proc => Proc.new { |trust| Chef::Config[:knife][:ca_trust_file] = trust } - def session - require 'em-winrm' session_opts = {} session_opts[:logger] = Chef::Log.logger if Chef::Log.level == :debug @session ||= begin s = EventMachine::WinRM::Session.new(session_opts) s.on_output do |host, data| @@ -149,10 +95,11 @@ session_opts[:port] = Chef::Config[:knife][:winrm_port] || config[:winrm_port] session_opts[:keytab] = Chef::Config[:knife][:kerberos_keytab_file] if Chef::Config[:knife][:kerberos_keytab_file] session_opts[:realm] = Chef::Config[:knife][:kerberos_realm] if Chef::Config[:knife][:kerberos_realm] session_opts[:service] = Chef::Config[:knife][:kerberos_service] if Chef::Config[:knife][:kerberos_service] session_opts[:ca_trust_path] = Chef::Config[:knife][:ca_trust_file] if Chef::Config[:knife][:ca_trust_file] + session_opts[:operation_timeout] = 1800 # 30 min OperationTimeout for long bootstraps fix for KNIFE_WINDOWS-8 if config.keys.any? {|k| k.to_s =~ /kerberos/ } session_opts[:transport] = :kerberos session_opts[:basic_auth_only] = false else @@ -241,19 +188,31 @@ end end end def run - @longest = 0 + STDOUT.sync = STDERR.sync = true - configure_session + begin + @longest = 0 - case @name_args[1] - when "interactive" - interactive - else - winrm_command(@name_args[1..-1].join(" ")) - session.close + configure_session + + case @name_args[1] + when "interactive" + interactive + else + winrm_command(@name_args[1..-1].join(" ")) + session.close + end + rescue WinRM::WinRMHTTPTransportError => e + case e.message + when /401/ + ui.error "Failed to authenticate to #{@name_args[0].split(" ")} as #{config[:winrm_user]}" + ui.info "Response: #{e.message}" + else + raise e + end end end end end