vagrant-windows-domain 1.1.12 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|