vagrant-windows 0.1.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-windows
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
5
- prerelease:
4
+ version: 1.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Paul Morton
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-12-05 00:00:00.000000000 Z
11
+ date: 2013-04-30 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: winrm
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
@@ -22,41 +20,22 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
29
26
  version: 1.1.1
30
- - !ruby/object:Gem::Dependency
31
- name: vagrant
32
- requirement: !ruby/object:Gem::Requirement
33
- none: false
34
- requirements:
35
- - - ~>
36
- - !ruby/object:Gem::Version
37
- version: 1.0.3
38
- type: :runtime
39
- prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ~>
44
- - !ruby/object:Gem::Version
45
- version: 1.0.3
46
27
  - !ruby/object:Gem::Dependency
47
28
  name: highline
48
29
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
30
  requirements:
51
- - - ! '>='
31
+ - - '>='
52
32
  - !ruby/object:Gem::Version
53
33
  version: '0'
54
34
  type: :runtime
55
35
  prerelease: false
56
36
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
37
  requirements:
59
- - - ! '>='
38
+ - - '>='
60
39
  - !ruby/object:Gem::Version
61
40
  version: '0'
62
41
  description: Windows Guest Support for Vagrant
@@ -71,42 +50,44 @@ files:
71
50
  - Gemfile.lock
72
51
  - README.md
73
52
  - Rakefile
74
- - lib/vagrant-windows/communication/winrm.rb
53
+ - lib/vagrant-windows.rb
54
+ - lib/vagrant-windows/communication/winrmcommunicator.rb
75
55
  - lib/vagrant-windows/config/windows.rb
76
56
  - lib/vagrant-windows/config/winrm.rb
77
57
  - lib/vagrant-windows/errors.rb
78
58
  - lib/vagrant-windows/guest/windows.rb
79
- - lib/vagrant-windows/monkey_patches/driver.rb
80
- - lib/vagrant-windows/monkey_patches/vm.rb
59
+ - lib/vagrant-windows/monkey_patches/chef_solo.rb
60
+ - lib/vagrant-windows/monkey_patches/machine.rb
61
+ - lib/vagrant-windows/monkey_patches/puppet.rb
62
+ - lib/vagrant-windows/plugin.rb
81
63
  - lib/vagrant-windows/scripts/command_alias.ps1
82
64
  - lib/vagrant-windows/scripts/mount_volume.ps1.erb
65
+ - lib/vagrant-windows/scripts/ps_runas.ps1.erb
83
66
  - lib/vagrant-windows/version.rb
84
- - lib/vagrant-windows/winrm.rb
85
- - lib/vagrant_init.rb
67
+ - locales/en.yml
86
68
  - vagrant-windows.gemspec
87
69
  homepage: ''
88
70
  licenses: []
71
+ metadata: {}
89
72
  post_install_message:
90
73
  rdoc_options: []
91
74
  require_paths:
92
75
  - lib
93
76
  required_ruby_version: !ruby/object:Gem::Requirement
94
- none: false
95
77
  requirements:
96
- - - ! '>='
78
+ - - '>='
97
79
  - !ruby/object:Gem::Version
98
80
  version: '0'
99
81
  required_rubygems_version: !ruby/object:Gem::Requirement
100
- none: false
101
82
  requirements:
102
- - - ! '>='
83
+ - - '>='
103
84
  - !ruby/object:Gem::Version
104
85
  version: '0'
105
86
  requirements: []
106
87
  rubyforge_project:
107
- rubygems_version: 1.8.24
88
+ rubygems_version: 2.0.3
108
89
  signing_key:
109
- specification_version: 3
90
+ specification_version: 4
110
91
  summary: A small gem that adds windows guest support to vagrant, uses WinRM as the
111
92
  Communication Channel
112
93
  test_files: []
@@ -1,185 +0,0 @@
1
- require 'timeout'
2
-
3
- require 'log4r'
4
- #require 'em-winrm'
5
- require 'winrm'
6
- require 'highline'
7
-
8
- require 'vagrant/util/ansi_escape_code_remover'
9
- require 'vagrant/util/file_mode'
10
- require 'vagrant/util/platform'
11
- require 'vagrant/util/retryable'
12
-
13
- module Vagrant
14
- module Communication
15
- # Provides communication with the VM via WinRM.
16
- class WinRM < Base
17
-
18
- include Util::ANSIEscapeCodeRemover
19
- include Util::Retryable
20
-
21
- attr_reader :logger
22
- attr_reader :vm
23
-
24
- def initialize(vm)
25
- @vm = vm
26
- @logger = Log4r::Logger.new("vagrant::communication::winrm")
27
- @co = nil
28
- end
29
-
30
- def ready?
31
- logger.debug("Checking whether WinRM is ready...")
32
-
33
- Timeout.timeout(@vm.config.winrm.timeout) do
34
- execute "hostname"
35
- end
36
-
37
- # If we reached this point then we successfully connected
38
- logger.info("WinRM is ready!")
39
- true
40
- rescue Timeout::Error, HTTPClient::KeepAliveDisconnected => e
41
- #, Errors::SSHConnectionRefused, Net::SSH::Disconnect => e
42
- # The above errors represent various reasons that WinRM may not be
43
- # ready yet. Return false.
44
- logger.info("WinRM not up yet: #{e.inspect}")
45
-
46
- return false
47
- end
48
-
49
- # Wrap Sudo in execute.... One day we could integrate with UAC, but Icky
50
- def sudo(command, opts=nil, &block)
51
- execute(command,opts,&block)
52
- end
53
-
54
- def execute(command, opts=nil, &block)
55
-
56
- # Connect to WinRM, giving it a few tries
57
- logger.info("Connecting to WinRM: #{@vm.winrm.info[:host]}:#{@vm.winrm.info[:port]}")
58
-
59
- opts = {
60
- :error_check => true,
61
- :error_class => Errors::VagrantError,
62
- :error_key => :winrm_bad_exit_status,
63
- :command => command,
64
- :sudo => false,
65
- :shell => :powershell
66
- }.merge(opts || {})
67
-
68
- # Connect via WinRM and execute the command in the shell.
69
- exceptions = [HTTPClient::KeepAliveDisconnected]
70
- exit_status = retryable(:tries => @vm.config.winrm.max_tries, :on => exceptions, :sleep => 10) do
71
- logger.debug "WinRM Trying to connect"
72
- shell_execute(command,opts[:shell], &block)
73
- end
74
-
75
- logger.debug("#{command} EXIT STATUS #{exit_status.inspect}")
76
-
77
- # Check for any errors
78
- if opts[:error_check] && exit_status != 0
79
- # The error classes expect the translation key to be _key,
80
- # but that makes for an ugly configuration parameter, so we
81
- # set it here from `error_key`
82
- error_opts = opts.merge(:_key => opts[:error_key])
83
- raise opts[:error_class], error_opts
84
- end
85
-
86
- # Return the exit status
87
- exit_status
88
- end
89
-
90
- def new_session
91
- opts = {
92
- :user => vm.config.winrm.username,
93
- :pass => vm.config.winrm.password,
94
- :host => vm.config.winrm.host,
95
- :port => vm.winrm.info[:port],
96
- :operation_timeout => vm.config.winrm.timeout,
97
- :basic_auth_only => true
98
- }.merge ({})
99
-
100
- # create a session
101
- logger.info("Attempting WinRM session with options: #{opts}")
102
- begin
103
- endpoint = "http://#{opts[:host]}:#{opts[:port]}/wsman"
104
- client = ::WinRM::WinRMWebService.new(endpoint, :plaintext, opts)
105
- client.set_timeout(opts[:operation_timeout]) if opts[:operation_timeout]
106
- rescue ::WinRM::WinRMAuthorizationError => error
107
- raise ::WinRM::WinRMAuthorizationError.new("#{error.message}@#{opts[:host]}")
108
- end
109
-
110
- client
111
- end
112
-
113
- def session
114
- @session ||= new_session
115
- end
116
-
117
- def h
118
- @highline ||= HighLine.new
119
- end
120
-
121
- def print_data(data, color = :green)
122
- if data =~ /\n/
123
- data.split(/\n/).each { |d| print_data(d, color) }
124
- else
125
- puts h.color(data.chomp, color)
126
- end
127
- end
128
-
129
- def upload(from, to)
130
- file = "winrm-upload-#{rand()}"
131
- file_name = (session.cmd("echo %TEMP%\\#{file}"))[:data][0][:stdout].chomp
132
- session.powershell <<-EOH
133
- if(Test-Path #{to})
134
- {
135
- rm #{to}
136
- }
137
- EOH
138
- Base64.encode64(IO.binread(from)).gsub("\n",'').chars.to_a.each_slice(8000-file_name.size) do |chunk|
139
- out = session.cmd( "echo #{chunk.join} >> \"#{file_name}\"" )
140
- end
141
- execute "mkdir [System.IO.Path]::GetDirectoryName(\"#{to}\")"
142
- execute <<-EOH
143
- $base64_string = Get-Content \"#{file_name}\"
144
- $bytes = [System.Convert]::FromBase64String($base64_string)
145
- $new_file = [System.IO.Path]::GetFullPath(\"#{to}\")
146
- [System.IO.File]::WriteAllBytes($new_file,$bytes)
147
- EOH
148
- end
149
-
150
- protected
151
-
152
- # Executes the command on an SSH connection within a login shell.
153
- def shell_execute(command,shell = :powershell)
154
- logger.info("Execute: #{command}")
155
- exit_status = nil
156
-
157
- if shell.eql? :cmd
158
- output = session.cmd(command) do |out,error|
159
- print_data(out) if out
160
- print_data(error, :red) if error
161
- end
162
- elsif shell.eql? :powershell
163
- new_command = File.read(File.expand_path("#{File.dirname(__FILE__)}/../scripts/command_alias.ps1"))
164
- new_command << "\r\n"
165
- new_command << command
166
- output = session.powershell(new_command) do |out,error|
167
- print_data(out) if out
168
- print_data(error, :red) if error
169
- end
170
- else
171
- raise Vagrant::Errors::WinRMInvalidShell, "#{shell} is not a valid type of shell"
172
- end
173
-
174
-
175
- exit_status = output[:exitcode]
176
- logger.debug exit_status.inspect
177
-
178
- # Return the final exit status
179
- return exit_status
180
- rescue ::WinRM::WinRMHTTPTransportError => e
181
- raise Vagrant::Errors::WinRMTimeout, e.message
182
- end
183
- end
184
- end
185
- end
@@ -1,57 +0,0 @@
1
- require 'vagrant/driver/virtualbox_base'
2
- require 'vagrant/driver/virtualbox'
3
-
4
-
5
- module Vagrant
6
- module Driver
7
-
8
- class VirtualBox_4_2 < VirtualBoxBase
9
- def read_mac_addresses
10
- macs = {}
11
- info = execute("showvminfo", @uuid, "--machinereadable", :retryable => true)
12
- info.split("\n").each do |line|
13
- if matcher = /^macaddress(\d+)="(.+?)"$/.match(line)
14
- adapter = matcher[1].to_i
15
- mac = matcher[2].to_s
16
- macs[adapter] = mac
17
- end
18
- end
19
- macs
20
- end
21
- end
22
-
23
- class VirtualBox_4_1 < VirtualBoxBase
24
- def read_mac_addresses
25
- macs = {}
26
- info = execute("showvminfo", @uuid, "--machinereadable", :retryable => true)
27
- info.split("\n").each do |line|
28
- if matcher = /^macaddress(\d+)="(.+?)"$/.match(line)
29
- adapter = matcher[1].to_i
30
- mac = matcher[2].to_s
31
- macs[adapter] = mac
32
- end
33
- end
34
- macs
35
- end
36
- end
37
-
38
- class VirtualBox_4_0 < VirtualBoxBase
39
- def read_mac_addresses
40
- macs = {}
41
- info = execute("showvminfo", @uuid, "--machinereadable", :retryable => true)
42
- info.split("\n").each do |line|
43
- if matcher = /^macaddress(\d+)="(.+?)"$/.match(line)
44
- adapter = matcher[1].to_i
45
- mac = matcher[2].to_s
46
- macs[adapter] = mac
47
- end
48
- end
49
- macs
50
- end
51
- end
52
-
53
- class VirtualBox < VirtualBoxBase
54
- def_delegator :@driver, :read_mac_addresses
55
- end
56
- end
57
- end
@@ -1,16 +0,0 @@
1
- module Vagrant
2
- class VM
3
- def winrm
4
- @winrm ||= WinRM.new(self)
5
- end
6
-
7
- def channel
8
- if @guest.class.eql? Vagrant::Guest::Windows
9
- @channel ||= Communication::WinRM.new(self)
10
- else
11
- @channel ||= Communication::SSH.new(self)
12
- end
13
- @channel
14
- end
15
- end
16
- end
@@ -1,82 +0,0 @@
1
- require 'log4r'
2
- #require 'em-winrm'
3
-
4
- module Vagrant
5
- # Manages WINRM access to a specific environment. Allows an environment to
6
- # run commands, upload files, and check if a host is up.
7
- class WinRM
8
- include Util::SafeExec
9
-
10
- def initialize(vm)
11
- @vm = vm
12
- @logger = Log4r::Logger.new("vagrant::winrm")
13
- end
14
-
15
- # Returns a hash of information necessary for accessing this
16
- # virtual machine via WINRM.
17
- #
18
- # @return [Hash]
19
- def info
20
- results = {
21
- :host => @vm.config.winrm.host,
22
- :port => @vm.config.winrm.port || @vm.driver.ssh_port(@vm.config.winrm.guest_port),
23
- :username => @vm.config.winrm.username
24
- }
25
-
26
- # This can happen if no port is set and for some reason Vagrant
27
- # can't detect an SSH port.
28
- raise Errors::WinRMPortNotDetected if !results[:port]
29
-
30
- # Return the results
31
- return results
32
- end
33
-
34
- # Checks if this environment's machine is up (i.e. responding to WINRM).
35
- #
36
- # @return [Boolean]
37
- def up?
38
- # We have to determine the port outside of the block since it uses
39
- # API calls which can only be used from the main thread in JRuby on
40
- # Windows
41
- ssh_port = port
42
-
43
- require 'timeout'
44
- Timeout.timeout(@env.config.ssh.timeout) do
45
- execute 'hostname'
46
- end
47
-
48
- true
49
- rescue Timeout::Error, Errno::ECONNREFUSED
50
- return false
51
- end
52
-
53
- # Returns the port which is either given in the options hash or taken from
54
- # the config by finding it in the forwarded ports hash based on the
55
- # `config.ssh.forwarded_port_key`.
56
- def port(opts={})
57
- # Check if port was specified in options hash
58
- return opts[:port] if opts[:port]
59
-
60
- # Check if a port was specified in the config
61
- return @env.config.winrm.port if @env.config.winrm.port
62
-
63
- # Check if we have an SSH forwarded port
64
- pnum_by_name = nil
65
- pnum_by_destination = nil
66
- @logger.info("Looking for winrm port: #{opts}")
67
- @logger.info("Looking for winrm port: #{env.config.winrm.inspect}")
68
-
69
- env.vm.vm.network_adapters.each do |na|
70
- # Look for the port number by destination...
71
- pnum_by_destination = na.nat_driver.forwarded_ports.detect do |fp|
72
- fp.guestport == env.config.winrm.guest_port
73
- end
74
- end
75
-
76
- return pnum_by_destination.hostport if pnum_by_destination
77
-
78
- # This should NEVER happen.
79
- raise Errors::WinRMPortNotDetected
80
- end
81
- end
82
- end
data/lib/vagrant_init.rb DELETED
@@ -1,21 +0,0 @@
1
- #Add Windows Guest Defintion
2
- require 'vagrant-windows/guest/windows'
3
-
4
- #Add Configuration Items
5
- require 'vagrant-windows/config/windows'
6
- require 'vagrant-windows/config/winrm'
7
-
8
- # Add WinRM Communication Channel
9
- require 'vagrant-windows/communication/winrm'
10
-
11
- #Monkey Patch the VM object to support multiple channels
12
- require 'vagrant-windows/monkey_patches/vm'
13
-
14
- #Monkey Patch the driver to support returning a mapping of mac addresses to nics
15
- require 'vagrant-windows/monkey_patches/driver'
16
-
17
- require 'vagrant-windows/winrm'
18
-
19
- #Errors are good
20
- require 'vagrant-windows/errors'
21
-