class Chef::Provisioning::Transport::WinRM

Transport to handle the WinRM connection protocol.

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