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