class Chef::Provisioning::Transport::WinRM
Attributes
config[R]
options[R]
Public Class Methods
new(endpoint, type, options, global_config)
click to toggle source
Create a new WinRM
transport.
Arguments¶ ↑
-
endpoint: the
WinRM
endpoint, e.g. 145.14.51.45:5985/wsman. -
type: the connection type, e.g. :plaintext.
-
options: options hash, including both
WinRM
options and transport options. For transport options, see the Transport.options definition.WinRM
options include :user, :pass, :disable_sspi => true, among others. -
global_config: an options hash that looks suspiciously similar to
Chef::Config
, containing at least the key :log_level.
The actual connection is made as ::WinRM::WinRMWebService.new(endpoint, type, options)
# File lib/chef/provisioning/transport/winrm.rb, line 26 def initialize(endpoint, type, options, global_config) @options = options @options[:endpoint] = endpoint @options[:transport] = type # WinRM v2 switched from :pass to :password # we accept either to avoid having to update every driver @options[:password] = @options[:password] || @options[:pass] @config = global_config end
Public Instance Methods
available?()
click to toggle source
# File lib/chef/provisioning/transport/winrm.rb, line 75 def available? execute('pwd') true rescue ::WinRM::WinRMAuthorizationError Chef::Log.debug("unavailable: winrm authentication error: #{$!.inspect} ") disconnect false rescue Timeout::Error, Errno::EHOSTUNREACH, Errno::ETIMEDOUT, Errno::ECONNREFUSED, Errno::ECONNRESET, ::WinRM::WinRMError, Errno::ECONNABORTED Chef::Log.debug("unavailable: network connection failed or broke: #{$!.inspect}") disconnect false end
disconnect()
click to toggle source
# File lib/chef/provisioning/transport/winrm.rb, line 67 def disconnect # end
escape(string)
click to toggle source
# File lib/chef/provisioning/transport/winrm.rb, line 71 def escape(string) "\"#{string.gsub("\"", "`\"")}\"" end
execute(command, execute_options = {})
click to toggle source
# File lib/chef/provisioning/transport/winrm.rb, line 41 def execute(command, execute_options = {}) block = Proc.new { |stdout, stderr| stream_chunk(execute_options, stdout, stderr) } output = session.run(command, &block) WinRMResult.new(command, execute_options, config, output) end
make_url_available_to_remote(local_url)
click to toggle source
# File lib/chef/provisioning/transport/winrm.rb, line 88 def make_url_available_to_remote(local_url) uri = URI(local_url) uri.scheme = 'http' if uri.scheme == 'chefzero' && uri.host == 'localhost' host = Socket.getaddrinfo(uri.host, uri.scheme, nil, :STREAM)[0][3] if host == '127.0.0.1' || host == '::1' raise 'Unable to converge locally via winrm. Local converge is currently only supported with SSH. You may only converge with winrm against a chef-server.' end local_url end
read_file(path)
click to toggle source
# File lib/chef/provisioning/transport/winrm.rb, line 47 def read_file(path) result = execute("[Convert]::ToBase64String((Get-Content #{escape(path)} -Encoding byte -ReadCount 0))") if result.exitstatus == 0 Base64.decode64(result.stdout) else nil end end
write_file(path, content)
click to toggle source
# File lib/chef/provisioning/transport/winrm.rb, line 56 def write_file(path, content) file = Tempfile.new('provisioning-upload') begin file.write(content) file.close file_manager.upload(file.path, path) ensure file.unlink end end
Protected Instance Methods
file_manager()
click to toggle source
# File lib/chef/provisioning/transport/winrm.rb, line 104 def file_manager @file_manager ||= ::WinRM::FS::FileManager.new(connection) end
session()
click to toggle source
# File lib/chef/provisioning/transport/winrm.rb, line 100 def session @session ||= connection.shell(:elevated) end
Private Instance Methods
connection()
click to toggle source
# File lib/chef/provisioning/transport/winrm.rb, line 110 def connection @connection ||= begin ::WinRM::Connection.new(@options) end end