vagrant-windows-domain 1.1.12 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +6 -5
- data/README.md +39 -2
- data/lib/vagrant-windows-domain/action/leave_domain.rb +11 -7
- data/lib/vagrant-windows-domain/config.rb +5 -0
- data/lib/vagrant-windows-domain/provisioner.rb +94 -17
- data/lib/vagrant-windows-domain/templates/runner.ps1.erb +74 -5
- data/lib/vagrant-windows-domain/version.rb +1 -1
- data/spec/provisioner/leave_domain_spec.rb +1 -1
- data/spec/provisioner/provisioner_spec.rb +28 -91
- data/spec/spec_helper.rb +2 -2
- data/vagrant-windows-domain.gemspec +7 -7
- metadata +59 -65
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 37f4d0b98f1c8ef3ed13f7df4c7873d80f989e7a
|
4
|
+
data.tar.gz: 11ff28a22ab25368c455195e971167447617b439
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 92a8e46f287fad2cc852bd0b444dd75ee68c671000f12bec1c0aad6de904cac1b81f53840e012abc1f0ea46f06543ee935f7efef0a54cfd0487775cbb24fa43e
|
7
|
+
data.tar.gz: ed683d8d59acd3ceafa4bee83ef04390136764efe2f9762eff960fde970f48370d8a81ae1be73e5c9875d6af785b1c345ecee4ee5ec15012328f169941107b53
|
data/.travis.yml
CHANGED
@@ -2,10 +2,11 @@ language: ruby
|
|
2
2
|
before_install:
|
3
3
|
- rvm @global do gem uninstall bundler --all --executables
|
4
4
|
- gem uninstall bundler --all --executables
|
5
|
-
- gem install bundler --version
|
5
|
+
- gem install bundler --version 1.12.5
|
6
|
+
- gem install bundler --version 1.12.5
|
6
7
|
rvm:
|
7
|
-
- 2.
|
8
|
-
- 2.
|
8
|
+
- 2.2.3
|
9
|
+
- 2.3.0
|
9
10
|
- ruby-head
|
10
11
|
matrix:
|
11
12
|
allow_failures:
|
@@ -13,7 +14,7 @@ matrix:
|
|
13
14
|
fast_finish: true
|
14
15
|
env:
|
15
16
|
matrix:
|
16
|
-
- VAGRANT_VERSION=v1.
|
17
|
+
- VAGRANT_VERSION=v1.8.0
|
17
18
|
global:
|
18
19
|
secure: bs4ezY+1Wksy8hH3nymPJ3AL99mpXULVc/AIh16JetEYw1850QkX7r4gQukMlcyByKUhxucjDLid0Y+KDH5kGMM16QjrVQGhAnUQzMoLD2qPbAaxDCUqpCJtFEEQKYxJvFvEK8a5SQzAsTVG4sgABQ/MllsIIH0FjkWgFtH6050=
|
19
|
-
script: bundle exec rake test:unit
|
20
|
+
script: bundle _1.12.5_ exec rake test:unit
|
data/README.md
CHANGED
@@ -28,7 +28,7 @@ config.vm.provision :windows_domain do |domain|
|
|
28
28
|
|
29
29
|
# The new Computer Name to use when joining the domain.
|
30
30
|
#
|
31
|
-
# Uses the Rename-Computer PowerShell command.
|
31
|
+
# Uses the Rename-Computer PowerShell command.
|
32
32
|
# Specifies a new name for the computer in the new domain.
|
33
33
|
domain.computer_name = "myfandangledname"
|
34
34
|
|
@@ -74,7 +74,44 @@ This is a great real-life example to get you on your way.
|
|
74
74
|
|
75
75
|
Currently the plugin supports any Windows environment with Powershell 3+ installed (2008r2, 2012r2 should work nicely).
|
76
76
|
|
77
|
-
##
|
77
|
+
## Development
|
78
|
+
|
79
|
+
Before getting started, read the Vagrant plugin [development basics](https://docs.vagrantup.com/v2/plugins/development-basics.html) and [packaging](https://docs.vagrantup.com/v2/plugins/packaging.html) documentation.
|
80
|
+
|
81
|
+
You will need Ruby 2.1.5 and Bundler v1.12.5 installed before proceeding.
|
82
|
+
|
83
|
+
_NOTE_: it _must_ be bundler v1.12.5 due to a hard dependency in Vagrant at this time.
|
84
|
+
|
85
|
+
```
|
86
|
+
git clone git@github.com:mefellows/vagrant-dsc.git
|
87
|
+
cd vagrant-dsc
|
88
|
+
bundle install
|
89
|
+
```
|
90
|
+
|
91
|
+
Run tests:
|
92
|
+
```
|
93
|
+
bundle exec rake spec
|
94
|
+
```
|
95
|
+
|
96
|
+
Run Vagrant in context of current vagrant-dsc plugin:
|
97
|
+
```
|
98
|
+
cd <directory>
|
99
|
+
bundle exec vagrant up
|
100
|
+
```
|
101
|
+
|
102
|
+
There is a test Vagrant DSC setup in `./development` that is a good example of a simple acceptance test.
|
103
|
+
|
104
|
+
### Multiple Bundlers?
|
105
|
+
|
106
|
+
If you have multiple Bundler versions, you can still use 1.12.5 with the following:
|
107
|
+
|
108
|
+
```
|
109
|
+
bundle _1.12.5_ <command>
|
110
|
+
```
|
111
|
+
|
112
|
+
e.g. `bundle _1.12.5_ exec rake spec`
|
113
|
+
|
114
|
+
## Uninstallation
|
78
115
|
|
79
116
|
```vagrant plugin uninstall vagrant-windows-domain```
|
80
117
|
|
@@ -45,16 +45,20 @@ module VagrantPlugins
|
|
45
45
|
if [:not_created].include? @machine.state.id
|
46
46
|
@logger.debug("Machine not created, nothing to do")
|
47
47
|
elsif [:running].include? @machine.state.id
|
48
|
-
|
49
|
-
|
48
|
+
if !(env[:force_confirm_box_remove] || env[:force_confirm_destroy])
|
49
|
+
answer = @machine.env.ui.ask("Are you sure you want to destroy this machine and disconnect from #{@config.domain}? (y/n)")
|
50
|
+
return unless answer.downcase == 'y' # Bail out of destroy and prevent middleware from continuing on
|
51
|
+
end
|
50
52
|
|
51
|
-
env[:force_confirm_destroy] = true # Prevent the popup dialog again
|
52
|
-
@logger.debug("Valid configuration detected, triggering leave domain action")
|
53
|
-
@provisioner.destroy
|
53
|
+
env[:force_confirm_destroy] = true # Prevent the popup dialog again
|
54
|
+
@logger.debug("Valid configuration detected, triggering leave domain action")
|
55
|
+
@provisioner.destroy
|
54
56
|
else
|
55
57
|
@machine.env.ui.say(:warn, "Machine is currently not running. To properly leave the #{@config.domain} network the machine needs to be running and connected to the network in which it was provisioned. Please run `vagrant up` and then `vagrant destroy`.\n")
|
56
|
-
|
57
|
-
|
58
|
+
if !(env[:force_confirm_box_remove] || env[:force_confirm_destroy])
|
59
|
+
answer = @machine.env.ui.ask("Would you like to continue destroying this machine, leaving this machine orphaned in the '#{@config.domain}' network? If so, type 'destroy'")
|
60
|
+
return unless answer.downcase == 'destroy' # Bail out of destroy and prevent middleware from continuing on
|
61
|
+
end
|
58
62
|
|
59
63
|
# OK, we're being naughty and letting the rest of the middleware do their things (i.e. destroy the machine, and such)
|
60
64
|
|
@@ -45,6 +45,9 @@ module VagrantPlugins
|
|
45
45
|
# When this option is used username/password are not required
|
46
46
|
attr_accessor :unsecure
|
47
47
|
|
48
|
+
# The trigger whether plugin should rename the computer or omit the renaming
|
49
|
+
attr_accessor :rename
|
50
|
+
|
48
51
|
def initialize
|
49
52
|
super
|
50
53
|
@domain = UNSET_VALUE
|
@@ -54,6 +57,7 @@ module VagrantPlugins
|
|
54
57
|
@join_options = {}
|
55
58
|
@ou_path = UNSET_VALUE
|
56
59
|
@unsecure = UNSET_VALUE
|
60
|
+
@rename = UNSET_VALUE
|
57
61
|
@logger = Log4r::Logger.new("vagrant::vagrant_windows_domain")
|
58
62
|
end
|
59
63
|
|
@@ -72,6 +76,7 @@ module VagrantPlugins
|
|
72
76
|
@join_options = [] if @join_options == UNSET_VALUE
|
73
77
|
@ou_path = nil if @ou_path == UNSET_VALUE
|
74
78
|
@unsecure = false if @unsecure == UNSET_VALUE
|
79
|
+
@rename = true if @rename == UNSET_VALUE
|
75
80
|
end
|
76
81
|
|
77
82
|
# Validate configuration and return a hash of errors.
|
@@ -47,22 +47,68 @@ module VagrantPlugins
|
|
47
47
|
raise WindowsDomainError, :unsupported_platform if !windows?
|
48
48
|
end
|
49
49
|
|
50
|
+
|
51
|
+
def is_part_of_domain(computer_name, domain)
|
52
|
+
command = <<-EOH
|
53
|
+
function Test-PartOfDomain($computerName, $domain){
|
54
|
+
$computerSystem = gwmi win32_computersystem
|
55
|
+
$partofDomain = ($computerSystem.Name -eq $computerName) -and ($computerSystem.PartOfDomain) -and ($computerSystem.Domain -eq $domain)
|
56
|
+
|
57
|
+
if ($partofDomain) {
|
58
|
+
exit 0
|
59
|
+
} else {
|
60
|
+
exit 1
|
61
|
+
}
|
62
|
+
}
|
63
|
+
Test-PartOfDomain -computerName '#{computer_name}' -domain '#{domain}'
|
64
|
+
EOH
|
65
|
+
@machine.communicate.test(command, sudo: true)
|
66
|
+
end
|
67
|
+
|
68
|
+
def is_joined_to_domain()
|
69
|
+
command = <<-EOH
|
70
|
+
function Test-JoinedToADomain(){
|
71
|
+
$computerSystem = gwmi win32_computersystem
|
72
|
+
$partOfDomain = $computerSystem.PartOfDomain
|
73
|
+
if ($partofDomain) {
|
74
|
+
exit 0
|
75
|
+
} else {
|
76
|
+
exit 1
|
77
|
+
}
|
78
|
+
}
|
79
|
+
Test-JoinedToADomain
|
80
|
+
EOH
|
81
|
+
@machine.communicate.test(command, sudo: true)
|
82
|
+
end
|
83
|
+
|
84
|
+
|
50
85
|
# Run the Provisioner!
|
51
86
|
def provision
|
52
87
|
verify_guest_capability
|
53
88
|
|
54
89
|
@old_computer_name = get_guest_computer_name(machine)
|
55
|
-
|
56
|
-
@machine.env.ui.say(:info, "Connecting guest machine to domain '#{config.domain}' with computer name '#{config.computer_name}'")
|
57
90
|
|
58
|
-
|
91
|
+
result = is_part_of_domain(config.computer_name, config.domain)
|
92
|
+
|
93
|
+
if result
|
94
|
+
@machine.env.ui.say(:info, "Guest machine with computer name '#{config.computer_name}' is already a member of domain '#{config.domain}'")
|
95
|
+
else
|
96
|
+
@machine.env.ui.say(:info, "Connecting guest machine to domain '#{config.domain}' with computer name '#{config.computer_name}'")
|
97
|
+
|
98
|
+
set_credentials
|
59
99
|
|
60
|
-
|
100
|
+
result = join_domain
|
61
101
|
|
62
|
-
|
102
|
+
remove_command_runner_script
|
63
103
|
|
64
|
-
|
65
|
-
|
104
|
+
if result
|
105
|
+
#Often requires 2 reboots to ensure that all AD stuff has been applied
|
106
|
+
@logger.debug("Need to reboot to join the domain correctly - 1st reboot")
|
107
|
+
restart_guest
|
108
|
+
|
109
|
+
@logger.debug("Need to reboot to join the domain correctly - 2nd reboot")
|
110
|
+
restart_guest
|
111
|
+
end
|
66
112
|
end
|
67
113
|
end
|
68
114
|
|
@@ -89,6 +135,8 @@ module VagrantPlugins
|
|
89
135
|
if (config.username == nil)
|
90
136
|
@logger.info("==> Requesting username as none provided")
|
91
137
|
config.username = @machine.env.ui.ask("Please enter your domain username: ")
|
138
|
+
else
|
139
|
+
@logger.info("==> Using domain username: #{config.username}")
|
92
140
|
end
|
93
141
|
|
94
142
|
if (config.password == nil)
|
@@ -104,9 +152,13 @@ module VagrantPlugins
|
|
104
152
|
# to be cleaned up.
|
105
153
|
def destroy
|
106
154
|
if @config && @config.domain != nil
|
107
|
-
|
108
|
-
|
109
|
-
|
155
|
+
if is_joined_to_domain()
|
156
|
+
set_credentials
|
157
|
+
result = leave_domain
|
158
|
+
if result
|
159
|
+
@logger.debug("Need to reboot to leave the domain correctly")
|
160
|
+
restart_guest
|
161
|
+
end
|
110
162
|
end
|
111
163
|
else
|
112
164
|
@logger.debug("Not leaving domain on `destroy` action - no valid configuration detected")
|
@@ -119,10 +171,13 @@ module VagrantPlugins
|
|
119
171
|
@machine.env.ui.say(:info, "Restarting computer for updates to take effect.")
|
120
172
|
options = {}
|
121
173
|
options[:provision_ignore_sentinel] = false
|
174
|
+
options[:lock] = false
|
122
175
|
@machine.action(:reload, options)
|
123
|
-
|
124
|
-
|
125
|
-
|
176
|
+
Timeout.timeout(@machine.config.vm.boot_timeout) do
|
177
|
+
begin
|
178
|
+
sleep @restart_sleep_duration
|
179
|
+
end until @machine.communicate.ready?
|
180
|
+
end
|
126
181
|
end
|
127
182
|
|
128
183
|
# Verify that we can call the remote operations.
|
@@ -149,17 +204,36 @@ module VagrantPlugins
|
|
149
204
|
def generate_command_runner_script(add_to_domain=true)
|
150
205
|
path = File.expand_path("../templates/runner.ps1", __FILE__)
|
151
206
|
|
207
|
+
if @config.computer_name != nil && @old_computer_name != nil && @config.computer_name.casecmp(@old_computer_name) != 0
|
208
|
+
@config.rename = true
|
209
|
+
end
|
210
|
+
|
152
211
|
Vagrant::Util::TemplateRenderer.render(path, options: {
|
153
212
|
config: @config,
|
154
213
|
username: @config.username,
|
155
214
|
password: @config.password,
|
156
215
|
domain: @config.domain,
|
216
|
+
computer_name: @config.computer_name,
|
217
|
+
ou_path: @config.ou_path,
|
157
218
|
add_to_domain: add_to_domain,
|
158
219
|
unsecure: @config.unsecure,
|
220
|
+
rename: @config.rename,
|
159
221
|
parameters: generate_command_arguments(add_to_domain)
|
222
|
+
}, options_rename: {
|
223
|
+
parameters: generate_command_arguments_rename
|
160
224
|
})
|
161
225
|
end
|
162
226
|
|
227
|
+
# Generates the argument list for rename
|
228
|
+
def generate_command_arguments_rename
|
229
|
+
|
230
|
+
params = {"-NewName" => @config.computer_name}
|
231
|
+
params["-DomainCredential $credentials"] = nil
|
232
|
+
join_params = @config.join_options.map { |a| "#{a}" }.join(',')
|
233
|
+
params.map { |k,v| "#{k}" + (!v.nil? ? " #{v}": '') }.join(' ') + join_params
|
234
|
+
|
235
|
+
end
|
236
|
+
|
163
237
|
# Generates the argument list
|
164
238
|
def generate_command_arguments(add_to_domain=true)
|
165
239
|
|
@@ -179,6 +253,12 @@ module VagrantPlugins
|
|
179
253
|
if @config.ou_path
|
180
254
|
params["-OUPath"] = "'#{@config.ou_path}'"
|
181
255
|
end
|
256
|
+
|
257
|
+
# Remove with unsecure
|
258
|
+
join_params = @config.join_options.map { |a| "#{a}" }.join(',')
|
259
|
+
if join_params.to_s != ''
|
260
|
+
params["-Options"] = join_params
|
261
|
+
end
|
182
262
|
else
|
183
263
|
params = {}
|
184
264
|
if !@config.unsecure
|
@@ -186,10 +266,7 @@ module VagrantPlugins
|
|
186
266
|
end
|
187
267
|
end
|
188
268
|
|
189
|
-
#
|
190
|
-
join_params = @config.join_options.map { |a| "#{a}" }.join(',')
|
191
|
-
params.map { |k,v| "#{k}" + (!v.nil? ? " #{v}": '') }.join(' ') + join_params
|
192
|
-
|
269
|
+
params.map { |k,v| "#{k}" + (!v.nil? ? " #{v}": '') }.join(' ')
|
193
270
|
end
|
194
271
|
|
195
272
|
# Writes the PowerShell runner script to a location on the guest.
|
@@ -1,9 +1,78 @@
|
|
1
|
+
function Test-PartOfDomain($computerName, $domain){
|
2
|
+
$computerSystem = gwmi win32_computersystem
|
3
|
+
return ($computerSystem.Name -eq $computerName) -and ($computerSystem.PartOfDomain) -and ($computerSystem.Domain -eq $domain)
|
4
|
+
}
|
5
|
+
|
6
|
+
function Test-JoinedToADomain(){
|
7
|
+
$computerSystem = gwmi win32_computersystem
|
8
|
+
return $computerSystem.PartOfDomain
|
9
|
+
}
|
10
|
+
|
11
|
+
function Repair-OpenSSHPasswd(){
|
12
|
+
$passwdPath = 'C:\Program Files\OpenSSH\etc\passwd'
|
13
|
+
$mkpasswdPath = 'C:\Program Files\OpenSSH\bin\mkpasswd.exe'
|
14
|
+
if ((Test-Path $passwdPath) -and (Test-Path $mkpasswdPath)){
|
15
|
+
$passwd = &$mkpasswdPath
|
16
|
+
$passwd = $passwd -replace '^([^+]*\+)', ''
|
17
|
+
$passwd | Set-Content $passwdPath -Encoding Ascii
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
$computerName='<%= options[:computer_name] %>'
|
1
22
|
<% if options[:username] != nil && options[:unsecure] != true %>
|
2
|
-
$
|
3
|
-
$
|
23
|
+
$domain='<%= options[:domain] %>'
|
24
|
+
$username='<%= options[:username] %>'
|
25
|
+
$password='<%= options[:password] %>'
|
26
|
+
$secpasswd = ConvertTo-SecureString $password -AsPlainText -Force
|
27
|
+
$credentials = New-Object System.Management.Automation.PSCredential ($username, $secpasswd)
|
4
28
|
<% end %>
|
5
29
|
<% if options[:add_to_domain] === true %>
|
6
|
-
|
30
|
+
if (Test-PartOfDomain -computerName $computerName -domain $domain){
|
31
|
+
throw "$computerName already part of domain $domain"
|
32
|
+
} else {
|
33
|
+
Add-Computer <%= options[:parameters] %> -Verbose -Force -PassThru
|
34
|
+
|
35
|
+
# Rename computer separately: Fixes GH issue #11
|
36
|
+
<% if options[:rename] === true %>
|
37
|
+
$completed = $false
|
38
|
+
while ( -not $completed) {
|
39
|
+
try {
|
40
|
+
Rename-Computer <%= options_rename[:parameters] %> -Verbose -Force -ErrorAction Stop
|
41
|
+
$completed = $true
|
42
|
+
} catch {
|
43
|
+
if ($retrycount -ge 5) {
|
44
|
+
Write-Host ("Rename failed the maximum number of $retrycount times.")
|
45
|
+
throw
|
46
|
+
} else {
|
47
|
+
Write-Host ("Rename failed, Retrying in 5 seconds...")
|
48
|
+
Start-sleep -s 5
|
49
|
+
$retrycount++
|
50
|
+
}
|
51
|
+
}
|
52
|
+
}
|
53
|
+
<% end %>
|
54
|
+
|
55
|
+
Repair-OpenSSHPasswd
|
56
|
+
|
57
|
+
# Fix vagrant-windows GH-129, if there's an existing scheduled
|
58
|
+
# reboot cancel it so shutdown succeeds
|
59
|
+
&shutdown /a
|
60
|
+
|
61
|
+
# Force shutdown the machine now
|
62
|
+
&shutdown /s /t 15 /c "Vagrant Halt" /f /d p:4:1
|
63
|
+
}
|
7
64
|
<% else %>
|
8
|
-
|
9
|
-
|
65
|
+
if (!(Test-JoinedToADomain)) {
|
66
|
+
Throw "$computerName not part of any domain"
|
67
|
+
} else {
|
68
|
+
Remove-Computer <%= options[:parameters] %> -Workgroup 'WORKGROUP' -Verbose -Force -PassThru
|
69
|
+
Repair-OpenSSHPasswd
|
70
|
+
|
71
|
+
# Fix vagrant-windows GH-129, if there's an existing scheduled
|
72
|
+
# reboot cancel it so shutdown succeeds
|
73
|
+
&shutdown /a
|
74
|
+
|
75
|
+
# Force shutdown the machine now
|
76
|
+
&shutdown /s /t 15 /c "Vagrant Halt" /f /d p:4:1
|
77
|
+
}
|
78
|
+
<% end %>
|
@@ -21,7 +21,7 @@ describe VagrantPlugins::WindowsDomain::LeaveDomain do
|
|
21
21
|
let(:module_path) { ["foo/modules", "foo/modules2"] }
|
22
22
|
let(:config) { VagrantPlugins::WindowsDomain::Config.new }
|
23
23
|
let(:vm) { double("vm", provisioners: [double("prov", config: config)]) }
|
24
|
-
let(:root_config) { double("root_config", vm: vm) }
|
24
|
+
let(:root_config) { double("root_config", vm: vm) }
|
25
25
|
let(:env) { {:ui => ui, :machine => machine} }
|
26
26
|
let(:machine) { double("machine", ui: ui, id: "1234", config: root_config) }
|
27
27
|
let(:provisioner) { double("provisioner") }
|
@@ -73,10 +73,12 @@ describe VagrantPlugins::WindowsDomain::Provisioner do
|
|
73
73
|
it "should join the domain" do
|
74
74
|
allow(communicator).to receive(:upload)
|
75
75
|
allow(ui).to receive(:info)
|
76
|
+
expect(communicator).to receive(:test)
|
77
|
+
expect(vm).to receive(:boot_timeout).twice
|
76
78
|
expect(communicator).to receive(:sudo).with("powershell -ExecutionPolicy Bypass -OutputFormat Text -file c:/tmp/vagrant-windows-domain-runner.ps1", {:elevated=>true, :error_check=>true, :error_key=>nil, :good_exit=>0, :shell=>:powershell})
|
77
79
|
expect(communicator).to receive(:sudo).with("del c:/tmp/vagrant-windows-domain-runner.ps1")
|
78
|
-
expect(machine).to receive(:action).
|
79
|
-
expect(communicator).to receive(:ready?).and_return(true)
|
80
|
+
expect(machine).to receive(:action).with(:reload, {:provision_ignore_sentinel=>false, :lock=>false}).twice
|
81
|
+
expect(communicator).to receive(:ready?).and_return(true).twice
|
80
82
|
subject.restart_sleep_duration = 0
|
81
83
|
subject.provision
|
82
84
|
expect(subject.old_computer_name).to eq("myoldcomputername")
|
@@ -85,21 +87,25 @@ describe VagrantPlugins::WindowsDomain::Provisioner do
|
|
85
87
|
it "should restart the machine on a successful domain join" do
|
86
88
|
allow(communicator).to receive(:upload)
|
87
89
|
allow(ui).to receive(:info)
|
90
|
+
expect(communicator).to receive(:test)
|
91
|
+
expect(vm).to receive(:boot_timeout).twice
|
88
92
|
expect(communicator).to receive(:sudo).with("powershell -ExecutionPolicy Bypass -OutputFormat Text -file c:/tmp/vagrant-windows-domain-runner.ps1", {:elevated=>true, :error_check=>true, :error_key=>nil, :good_exit=>0, :shell=>:powershell})
|
89
93
|
expect(communicator).to receive(:sudo).with("del c:/tmp/vagrant-windows-domain-runner.ps1")
|
90
|
-
expect(machine).to receive(:action). with(:reload, {:provision_ignore_sentinel=>false})
|
91
|
-
expect(communicator).to receive(:ready?).and_return(true)
|
94
|
+
expect(machine).to receive(:action). with(:reload, {:provision_ignore_sentinel=>false, :lock=>false}).twice
|
95
|
+
expect(communicator).to receive(:ready?).and_return(true).twice
|
92
96
|
subject.restart_sleep_duration = 0
|
93
97
|
subject.provision
|
94
98
|
end
|
95
99
|
|
96
100
|
it "should not restart the machine on a failed domain join attempt" do
|
97
101
|
allow(communicator).to receive(:upload)
|
102
|
+
expect(communicator).to receive(:test)
|
103
|
+
expect(vm).to_not receive(:boot_timeout)
|
98
104
|
allow(ui).to receive(:info).with("some exception thrown!", {:color=>:red, :new_line=>false, :prefix=>false}) # Red output on error please!
|
99
105
|
allow(ui).to receive(:info).with("\"Running Windows Domain Provisioner\"")
|
100
106
|
expect(communicator).to receive(:sudo).with("powershell -ExecutionPolicy Bypass -OutputFormat Text -file c:/tmp/vagrant-windows-domain-runner.ps1", {:elevated=>true, :error_check=>true, :error_key=>nil, :good_exit=>0, :shell=>:powershell}).and_yield(:stderr, "some exception thrown!")
|
101
107
|
expect(communicator).to receive(:sudo).with("del c:/tmp/vagrant-windows-domain-runner.ps1")
|
102
|
-
expect(machine).to_not receive(:action). with(:reload, {:provision_ignore_sentinel=>false})
|
108
|
+
expect(machine).to_not receive(:action). with(:reload, {:provision_ignore_sentinel=>false, :lock=>false})
|
103
109
|
subject.restart_sleep_duration = 0
|
104
110
|
subject.provision
|
105
111
|
end
|
@@ -150,18 +156,24 @@ describe VagrantPlugins::WindowsDomain::Provisioner do
|
|
150
156
|
|
151
157
|
describe "cleanup" do
|
152
158
|
before do
|
159
|
+
allow(machine).to receive(:root_config).and_return(root_config)
|
160
|
+
machine.stub(config: root_config, env: env, id: "1234")
|
161
|
+
allow(ui).to receive(:say).with(any_args)
|
162
|
+
allow(machine).to receive(:communicate).and_return(communicator)
|
153
163
|
allow(communicator).to receive(:shell).and_return(shell)
|
154
|
-
allow(shell).to receive(:powershell).and_yield(:stdout, "myoldcomputername")
|
155
|
-
|
156
|
-
allow(
|
157
|
-
allow(
|
158
|
-
allow(
|
164
|
+
allow(shell).to receive(:powershell).with("$env:COMPUTERNAME").and_yield(:stdout, "myoldcomputername")
|
165
|
+
allow(root_config).to receive(:vm).and_return(vm)
|
166
|
+
allow(vm).to receive(:communicator).and_return(:winrm)
|
167
|
+
allow(communicator).to receive(:sudo).with("which Add-Computer", {:error_class=>VagrantPlugins::WindowsDomain::WindowsDomainError, :error_key=>:binary_not_detected, :domain=>"foo.com", :binary=>"Add-Computer"})
|
168
|
+
allow(communicator).to receive(:sudo).with("which Remove-Computer", {:error_class=>VagrantPlugins::WindowsDomain::WindowsDomainError, :error_key=>:binary_not_detected, :domain=>"foo.com", :binary=>"Remove-Computer"})
|
159
169
|
|
160
170
|
root_config.domain = "foo.com"
|
161
171
|
root_config.username = "username"
|
162
172
|
root_config.password = "password"
|
173
|
+
|
163
174
|
root_config.finalize!
|
164
175
|
root_config.validate(machine)
|
176
|
+
subject.configure(root_config)
|
165
177
|
end
|
166
178
|
|
167
179
|
it "should leave domain" do
|
@@ -177,13 +189,14 @@ describe VagrantPlugins::WindowsDomain::Provisioner do
|
|
177
189
|
|
178
190
|
it "should leave domain when a `vagrant destroy` is issued" do
|
179
191
|
allow(machine).to receive(:communicate).and_return(communicator)
|
180
|
-
|
192
|
+
expect(communicator).to receive(:test).and_return(true)
|
193
|
+
expect(vm).to receive(:boot_timeout)
|
181
194
|
expect(communicator).to receive(:upload)
|
182
195
|
expect(communicator).to receive(:sudo).with("powershell -ExecutionPolicy Bypass -OutputFormat Text -file c:/tmp/vagrant-windows-domain-runner.ps1", {:elevated=>true, :error_check=>true, :error_key=>nil, :good_exit=>0, :shell=>:powershell}).and_yield(:stdout, "deleted")
|
183
196
|
expect(ui).to receive(:info).with("\"Running Windows Domain Provisioner\"")
|
184
197
|
expect(ui).to receive(:info).with("deleted", {:color=>:green, :new_line=>false, :prefix=>false})
|
185
198
|
expect(ui).to receive(:say).with(:info, "Restarting computer for updates to take effect.")
|
186
|
-
expect(machine).to receive(:action). with(:reload, {:provision_ignore_sentinel=>false})
|
199
|
+
expect(machine).to receive(:action). with(:reload, {:provision_ignore_sentinel=>false, :lock=>false})
|
187
200
|
expect(ui).to_not receive(:say)
|
188
201
|
expect(ui).to_not receive(:ask)
|
189
202
|
expect(communicator).to receive(:ready?).and_return(true)
|
@@ -207,13 +220,15 @@ describe VagrantPlugins::WindowsDomain::Provisioner do
|
|
207
220
|
allow(machine).to receive(:communicate).and_return(communicator)
|
208
221
|
allow(machine).to receive(:env).and_return(env)
|
209
222
|
|
223
|
+
expect(vm).to receive(:boot_timeout)
|
224
|
+
expect(communicator).to receive(:test).and_return(true)
|
210
225
|
expect(communicator).to receive(:upload)
|
211
226
|
expect(communicator).to receive(:sudo).with("powershell -ExecutionPolicy Bypass -OutputFormat Text -file c:/tmp/vagrant-windows-domain-runner.ps1", {:elevated=>true, :error_check=>true, :error_key=>nil, :good_exit=>0, :shell=>:powershell}).and_yield(:stdout, "deleted")
|
212
227
|
expect(ui).to receive(:info).with(any_args).twice
|
213
228
|
expect(ui).to receive(:ask).with("Please enter your domain password (output will be hidden): ", {:echo=>false}).and_return("myusername")
|
214
229
|
expect(ui).to receive(:ask).with("Please enter your domain username: ")
|
215
230
|
expect(ui).to receive(:say).with(:info, "Restarting computer for updates to take effect.")
|
216
|
-
expect(machine).to receive(:action). with(:reload, {:provision_ignore_sentinel=>false})
|
231
|
+
expect(machine).to receive(:action). with(:reload, {:provision_ignore_sentinel=>false, :lock=>false})
|
217
232
|
expect(communicator).to receive(:ready?).and_return(true)
|
218
233
|
subject.restart_sleep_duration = 0
|
219
234
|
|
@@ -221,82 +236,4 @@ describe VagrantPlugins::WindowsDomain::Provisioner do
|
|
221
236
|
end
|
222
237
|
|
223
238
|
end
|
224
|
-
|
225
|
-
describe "Powershell runner script" do
|
226
|
-
before do
|
227
|
-
allow(machine).to receive(:root_config).and_return(root_config)
|
228
|
-
machine.stub(config: root_config, env: env, id: "1234")
|
229
|
-
allow(ui).to receive(:say).with(any_args)
|
230
|
-
allow(machine).to receive(:communicate).and_return(communicator)
|
231
|
-
allow(communicator).to receive(:shell).and_return(shell)
|
232
|
-
allow(shell).to receive(:powershell).with("$env:COMPUTERNAME").and_yield(:stdout, "myoldcomputername")
|
233
|
-
allow(root_config).to receive(:vm).and_return(vm)
|
234
|
-
allow(vm).to receive(:communicator).and_return(:winrm)
|
235
|
-
root_config.domain = "foo.com"
|
236
|
-
root_config.username = "username"
|
237
|
-
root_config.password = "password"
|
238
|
-
root_config.finalize!
|
239
|
-
root_config.validate(machine)
|
240
|
-
end
|
241
|
-
|
242
|
-
context "with credentials provided" do
|
243
|
-
|
244
|
-
it "should generate a valid powershell command to add the computer to a domain" do
|
245
|
-
script = subject.generate_command_runner_script
|
246
|
-
expect_script =
|
247
|
-
%Q{$secpasswd = ConvertTo-SecureString "password" -AsPlainText -Force
|
248
|
-
$credentials = New-Object System.Management.Automation.PSCredential ("username", $secpasswd)
|
249
|
-
Add-Computer -DomainName foo.com -Credential $credentials -Verbose -Force
|
250
|
-
}
|
251
|
-
expect(script).to eq(expect_script)
|
252
|
-
end
|
253
|
-
|
254
|
-
it "should generate a valid powershell command to remove the computer from a domain" do
|
255
|
-
script = subject.generate_command_runner_script(false)
|
256
|
-
expect_script =
|
257
|
-
%Q{$secpasswd = ConvertTo-SecureString "password" -AsPlainText -Force
|
258
|
-
$credentials = New-Object System.Management.Automation.PSCredential ("username", $secpasswd)
|
259
|
-
Remove-Computer -UnjoinDomainCredential $credentials -Workgroup "WORKGROUP" -Verbose -Force
|
260
|
-
}
|
261
|
-
expect(script).to eq(expect_script)
|
262
|
-
end
|
263
|
-
|
264
|
-
context "with join options" do
|
265
|
-
it "should rename the computer on join" do
|
266
|
-
|
267
|
-
root_config.computer_name = "mynewcomputername"
|
268
|
-
root_config.ou_path = "OU=testOU,DC=domain,DC=Domain,DC=com"
|
269
|
-
root_config.finalize!
|
270
|
-
root_config.validate(machine)
|
271
|
-
|
272
|
-
script = subject.generate_command_runner_script
|
273
|
-
expect_script =
|
274
|
-
%Q{$secpasswd = ConvertTo-SecureString "password" -AsPlainText -Force
|
275
|
-
$credentials = New-Object System.Management.Automation.PSCredential ("username", $secpasswd)
|
276
|
-
Add-Computer -DomainName foo.com -Credential $credentials -NewName 'mynewcomputername' -OUPath 'OU=testOU,DC=domain,DC=Domain,DC=com' -Verbose -Force
|
277
|
-
}
|
278
|
-
expect(script).to eq(expect_script)
|
279
|
-
end
|
280
|
-
end
|
281
|
-
end
|
282
|
-
|
283
|
-
context "with 'unsecure' parameter provided" do
|
284
|
-
before do
|
285
|
-
root_config.unsecure = true
|
286
|
-
end
|
287
|
-
|
288
|
-
it "should generate a valid powershell command to add the computer to a domain" do
|
289
|
-
script = subject.generate_command_runner_script.strip
|
290
|
-
expect_script = "Add-Computer -DomainName foo.com -Unsecure -Verbose -Force"
|
291
|
-
expect(script).to eq(expect_script)
|
292
|
-
end
|
293
|
-
|
294
|
-
it "should generate a valid powershell command to remove the computer from a domain" do
|
295
|
-
script = subject.generate_command_runner_script(false).strip
|
296
|
-
expect_script = "Remove-Computer -Workgroup \"WORKGROUP\" -Verbose -Force"
|
297
|
-
expect(script).to eq(expect_script)
|
298
|
-
end
|
299
|
-
end
|
300
|
-
|
301
|
-
end
|
302
239
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -6,7 +6,7 @@ require 'vagrant-windows-domain/plugin'
|
|
6
6
|
require 'rspec/its'
|
7
7
|
require 'base'
|
8
8
|
|
9
|
-
SimpleCov.
|
9
|
+
SimpleCov.formatters = [
|
10
10
|
SimpleCov::Formatter::HTMLFormatter,
|
11
11
|
Coveralls::SimpleCov::Formatter
|
12
12
|
]
|
@@ -18,7 +18,7 @@ end
|
|
18
18
|
|
19
19
|
RSpec.configure do |config|
|
20
20
|
config.expect_with :rspec do |c|
|
21
|
-
c.syntax = :expect
|
21
|
+
c.syntax = [:should, :expect]
|
22
22
|
end
|
23
23
|
config.color = true
|
24
24
|
config.tty = true
|
@@ -18,11 +18,11 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_development_dependency "rake"
|
22
|
-
spec.add_development_dependency "bundler", "
|
23
|
-
spec.add_development_dependency "coveralls", "~> 0.
|
24
|
-
spec.add_development_dependency "rspec-core", '~> 3.
|
25
|
-
spec.add_development_dependency "rspec-expectations", '~> 3.
|
26
|
-
spec.add_development_dependency "rspec-mocks", '~> 3.1', '>= 3.1
|
27
|
-
spec.add_development_dependency "rspec-its", "~> 1.0
|
21
|
+
spec.add_development_dependency "rake"
|
22
|
+
spec.add_development_dependency "bundler", ">= 1.5.2", "<= 1.12.5"
|
23
|
+
spec.add_development_dependency "coveralls", "~> 0.8.10", '>= 0.8.10'
|
24
|
+
spec.add_development_dependency "rspec-core", '~> 3.4.2', '>= 3.4.2'
|
25
|
+
spec.add_development_dependency "rspec-expectations", '~> 3.4.0', '>= 3.4.0'
|
26
|
+
spec.add_development_dependency "rspec-mocks", '~> 3.4.1', '>= 3.4.1'
|
27
|
+
spec.add_development_dependency "rspec-its", "~> 1.2.0", '>= 1.2.0'
|
28
28
|
end
|
metadata
CHANGED
@@ -1,155 +1,149 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-windows-domain
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Fellows
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-10-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
20
|
-
- - '>='
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: 10.3.0
|
19
|
+
version: '0'
|
23
20
|
type: :development
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '10.3'
|
30
|
-
- - '>='
|
24
|
+
- - ">="
|
31
25
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
26
|
+
version: '0'
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: bundler
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
36
30
|
requirements:
|
37
|
-
- -
|
31
|
+
- - ">="
|
38
32
|
- !ruby/object:Gem::Version
|
39
|
-
version:
|
40
|
-
- -
|
33
|
+
version: 1.5.2
|
34
|
+
- - "<="
|
41
35
|
- !ruby/object:Gem::Version
|
42
|
-
version: 1.
|
36
|
+
version: 1.12.5
|
43
37
|
type: :development
|
44
38
|
prerelease: false
|
45
39
|
version_requirements: !ruby/object:Gem::Requirement
|
46
40
|
requirements:
|
47
|
-
- -
|
41
|
+
- - ">="
|
48
42
|
- !ruby/object:Gem::Version
|
49
|
-
version:
|
50
|
-
- -
|
43
|
+
version: 1.5.2
|
44
|
+
- - "<="
|
51
45
|
- !ruby/object:Gem::Version
|
52
|
-
version: 1.
|
46
|
+
version: 1.12.5
|
53
47
|
- !ruby/object:Gem::Dependency
|
54
48
|
name: coveralls
|
55
49
|
requirement: !ruby/object:Gem::Requirement
|
56
50
|
requirements:
|
57
|
-
- - ~>
|
51
|
+
- - "~>"
|
58
52
|
- !ruby/object:Gem::Version
|
59
|
-
version: 0.
|
60
|
-
- -
|
53
|
+
version: 0.8.10
|
54
|
+
- - ">="
|
61
55
|
- !ruby/object:Gem::Version
|
62
|
-
version: 0.
|
56
|
+
version: 0.8.10
|
63
57
|
type: :development
|
64
58
|
prerelease: false
|
65
59
|
version_requirements: !ruby/object:Gem::Requirement
|
66
60
|
requirements:
|
67
|
-
- - ~>
|
61
|
+
- - "~>"
|
68
62
|
- !ruby/object:Gem::Version
|
69
|
-
version: 0.
|
70
|
-
- -
|
63
|
+
version: 0.8.10
|
64
|
+
- - ">="
|
71
65
|
- !ruby/object:Gem::Version
|
72
|
-
version: 0.
|
66
|
+
version: 0.8.10
|
73
67
|
- !ruby/object:Gem::Dependency
|
74
68
|
name: rspec-core
|
75
69
|
requirement: !ruby/object:Gem::Requirement
|
76
70
|
requirements:
|
77
|
-
- - ~>
|
71
|
+
- - "~>"
|
78
72
|
- !ruby/object:Gem::Version
|
79
|
-
version:
|
80
|
-
- -
|
73
|
+
version: 3.4.2
|
74
|
+
- - ">="
|
81
75
|
- !ruby/object:Gem::Version
|
82
|
-
version: 3.
|
76
|
+
version: 3.4.2
|
83
77
|
type: :development
|
84
78
|
prerelease: false
|
85
79
|
version_requirements: !ruby/object:Gem::Requirement
|
86
80
|
requirements:
|
87
|
-
- - ~>
|
81
|
+
- - "~>"
|
88
82
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
90
|
-
- -
|
83
|
+
version: 3.4.2
|
84
|
+
- - ">="
|
91
85
|
- !ruby/object:Gem::Version
|
92
|
-
version: 3.
|
86
|
+
version: 3.4.2
|
93
87
|
- !ruby/object:Gem::Dependency
|
94
88
|
name: rspec-expectations
|
95
89
|
requirement: !ruby/object:Gem::Requirement
|
96
90
|
requirements:
|
97
|
-
- - ~>
|
91
|
+
- - "~>"
|
98
92
|
- !ruby/object:Gem::Version
|
99
|
-
version:
|
100
|
-
- -
|
93
|
+
version: 3.4.0
|
94
|
+
- - ">="
|
101
95
|
- !ruby/object:Gem::Version
|
102
|
-
version: 3.
|
96
|
+
version: 3.4.0
|
103
97
|
type: :development
|
104
98
|
prerelease: false
|
105
99
|
version_requirements: !ruby/object:Gem::Requirement
|
106
100
|
requirements:
|
107
|
-
- - ~>
|
101
|
+
- - "~>"
|
108
102
|
- !ruby/object:Gem::Version
|
109
|
-
version:
|
110
|
-
- -
|
103
|
+
version: 3.4.0
|
104
|
+
- - ">="
|
111
105
|
- !ruby/object:Gem::Version
|
112
|
-
version: 3.
|
106
|
+
version: 3.4.0
|
113
107
|
- !ruby/object:Gem::Dependency
|
114
108
|
name: rspec-mocks
|
115
109
|
requirement: !ruby/object:Gem::Requirement
|
116
110
|
requirements:
|
117
|
-
- - ~>
|
111
|
+
- - "~>"
|
118
112
|
- !ruby/object:Gem::Version
|
119
|
-
version:
|
120
|
-
- -
|
113
|
+
version: 3.4.1
|
114
|
+
- - ">="
|
121
115
|
- !ruby/object:Gem::Version
|
122
|
-
version: 3.1
|
116
|
+
version: 3.4.1
|
123
117
|
type: :development
|
124
118
|
prerelease: false
|
125
119
|
version_requirements: !ruby/object:Gem::Requirement
|
126
120
|
requirements:
|
127
|
-
- - ~>
|
121
|
+
- - "~>"
|
128
122
|
- !ruby/object:Gem::Version
|
129
|
-
version:
|
130
|
-
- -
|
123
|
+
version: 3.4.1
|
124
|
+
- - ">="
|
131
125
|
- !ruby/object:Gem::Version
|
132
|
-
version: 3.1
|
126
|
+
version: 3.4.1
|
133
127
|
- !ruby/object:Gem::Dependency
|
134
128
|
name: rspec-its
|
135
129
|
requirement: !ruby/object:Gem::Requirement
|
136
130
|
requirements:
|
137
|
-
- - ~>
|
131
|
+
- - "~>"
|
138
132
|
- !ruby/object:Gem::Version
|
139
|
-
version: 1.0
|
140
|
-
- -
|
133
|
+
version: 1.2.0
|
134
|
+
- - ">="
|
141
135
|
- !ruby/object:Gem::Version
|
142
|
-
version: 1.
|
136
|
+
version: 1.2.0
|
143
137
|
type: :development
|
144
138
|
prerelease: false
|
145
139
|
version_requirements: !ruby/object:Gem::Requirement
|
146
140
|
requirements:
|
147
|
-
- - ~>
|
141
|
+
- - "~>"
|
148
142
|
- !ruby/object:Gem::Version
|
149
|
-
version: 1.0
|
150
|
-
- -
|
143
|
+
version: 1.2.0
|
144
|
+
- - ">="
|
151
145
|
- !ruby/object:Gem::Version
|
152
|
-
version: 1.
|
146
|
+
version: 1.2.0
|
153
147
|
description: Adds and Removes Windows Guests from a Windows Domain, as part of the
|
154
148
|
standard machine lifecycle.
|
155
149
|
email:
|
@@ -158,8 +152,8 @@ executables: []
|
|
158
152
|
extensions: []
|
159
153
|
extra_rdoc_files: []
|
160
154
|
files:
|
161
|
-
- .gitignore
|
162
|
-
- .travis.yml
|
155
|
+
- ".gitignore"
|
156
|
+
- ".travis.yml"
|
163
157
|
- Gemfile
|
164
158
|
- LICENSE.txt
|
165
159
|
- README.md
|
@@ -189,17 +183,17 @@ require_paths:
|
|
189
183
|
- lib
|
190
184
|
required_ruby_version: !ruby/object:Gem::Requirement
|
191
185
|
requirements:
|
192
|
-
- -
|
186
|
+
- - ">="
|
193
187
|
- !ruby/object:Gem::Version
|
194
188
|
version: '0'
|
195
189
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
196
190
|
requirements:
|
197
|
-
- -
|
191
|
+
- - ">="
|
198
192
|
- !ruby/object:Gem::Version
|
199
193
|
version: '0'
|
200
194
|
requirements: []
|
201
195
|
rubyforge_project:
|
202
|
-
rubygems_version: 2.
|
196
|
+
rubygems_version: 2.5.1
|
203
197
|
signing_key:
|
204
198
|
specification_version: 4
|
205
199
|
summary: Windows Domain Provisioner for Vagrant
|