vagrant-windows-domain 1.2.0 → 1.3.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 37f4d0b98f1c8ef3ed13f7df4c7873d80f989e7a
4
- data.tar.gz: 11ff28a22ab25368c455195e971167447617b439
2
+ SHA256:
3
+ metadata.gz: b03f283e47170d9b9a2db97da8a456a11ba260a851fc2f54f8a84d5513e258bd
4
+ data.tar.gz: 05f3530dd6fa06382d09515160c8a06f4c538d45f66ee15f80840e6d1276b059
5
5
  SHA512:
6
- metadata.gz: 92a8e46f287fad2cc852bd0b444dd75ee68c671000f12bec1c0aad6de904cac1b81f53840e012abc1f0ea46f06543ee935f7efef0a54cfd0487775cbb24fa43e
7
- data.tar.gz: ed683d8d59acd3ceafa4bee83ef04390136764efe2f9762eff960fde970f48370d8a81ae1be73e5c9875d6af785b1c345ecee4ee5ec15012328f169941107b53
6
+ metadata.gz: 75ed7c28a93fe9a00a5cc7d30ed30f4631e1e4773f196fe5dcfb667265f30bcf514afcc74a4af08230dacbd39364eef6c5850494f0c29824bbe21a0f22f9ee15
7
+ data.tar.gz: 247b3cb63c12c8597a1fcceeca3799f4f30cd529fcd197e3d0d7eb198febeb11d977bc1eab66d989ba0efb2d56b8cca05d3e705a994b705ff409844d65835097
@@ -1,20 +1,16 @@
1
1
  language: ruby
2
2
  before_install:
3
- - rvm @global do gem uninstall bundler --all --executables
4
- - gem uninstall bundler --all --executables
5
- - gem install bundler --version 1.12.5
6
- - gem install bundler --version 1.12.5
3
+ - gem update --system
4
+ - gem install bundler
7
5
  rvm:
8
- - 2.2.3
9
- - 2.3.0
10
6
  - ruby-head
7
+ - 2.5.1
8
+ - 2.4.4
11
9
  matrix:
12
10
  allow_failures:
13
11
  - rvm: ruby-head
14
12
  fast_finish: true
15
13
  env:
16
14
  matrix:
17
- - VAGRANT_VERSION=v1.8.0
18
- global:
19
- secure: bs4ezY+1Wksy8hH3nymPJ3AL99mpXULVc/AIh16JetEYw1850QkX7r4gQukMlcyByKUhxucjDLid0Y+KDH5kGMM16QjrVQGhAnUQzMoLD2qPbAaxDCUqpCJtFEEQKYxJvFvEK8a5SQzAsTVG4sgABQ/MllsIIH0FjkWgFtH6050=
20
- script: bundle _1.12.5_ exec rake test:unit
15
+ - VAGRANT_VERSION=v2.1.5
16
+ script: bundle exec rake test:unit
data/Gemfile CHANGED
@@ -4,9 +4,6 @@ source 'https://rubygems.org'
4
4
  gemspec
5
5
 
6
6
  group :development do
7
- gem "vagrant", git: "https://github.com/mitchellh/vagrant.git"
7
+ gem "vagrant", git: "https://github.com/mitchellh/vagrant.git", :tag => "v2.1.5"
8
8
  end
9
9
 
10
- group :plugins do
11
- gem "vagrant-windows-domain", path: "."
12
- end
data/README.md CHANGED
@@ -47,6 +47,18 @@ config.vm.provision :windows_domain do |domain|
47
47
  # If not supplied the plugin will prompt the user during provisioning to provide one.
48
48
  domain.password = "iprobablyshouldntusethisfield"
49
49
 
50
+ # IP address of primary DNS server
51
+ #
52
+ # Specifies the IP address you want assigned as the primary DNS server for the primary nic.
53
+ # If not supplied, the nic's primary dns server will be assigned dynamically.
54
+ domain.primary_dns = "8.8.8.8"
55
+
56
+ #IP address of the secondary DNS server
57
+ #
58
+ # Specifies the IP address you want assigned as the secondary DNS server for the primary nic
59
+ # If not supplied, the nic's secondary dns server will be assigned dynamically.
60
+ domain.secondary_dns = "8.8.4.4"
61
+
50
62
  # The set of Advanced options to pass when joining the Domain.
51
63
  #
52
64
  # See (https://technet.microsoft.com/en-us/library/hh849798.aspx) for detail, these are generally not required.
@@ -13,7 +13,8 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
13
13
  config.vm.box = "mfellows/windows2012r2"
14
14
  config.vm.guest = :windows
15
15
  config.vm.communicator = "winrm"
16
- config.vm.network :forwarded_port, guest: 5985, host: 5985, id: "winrm", auto_correct: true
16
+ #ALlows for vagrant to successfully connect to destination machine with winrm
17
+ config.vm.network :forwarded_port, guest: 5985, host: 55985 #, id: "winrm", auto_correct: true
17
18
 
18
19
  config.vm.provider "virtualbox" do |v|
19
20
  v.gui = true
@@ -40,6 +40,16 @@ module VagrantPlugins
40
40
  # The default value is the default OU for machine objects in the domain.
41
41
  attr_accessor :ou_path
42
42
 
43
+ # IP address of primary DNS server
44
+ #
45
+ # Specifies the IP address you want assigned as the primary DNS server for the primary nic
46
+ attr_accessor :primary_dns
47
+
48
+ #IP address of the secondary DNS server
49
+ #
50
+ # Specifies the IP address you want assigned as the secondary DNS server for the primary nic
51
+ attr_accessor :secondary_dns
52
+
43
53
  # Performs an unsecure join to the specified domain.
44
54
  #
45
55
  # When this option is used username/password are not required
@@ -56,6 +66,8 @@ module VagrantPlugins
56
66
  @password = UNSET_VALUE
57
67
  @join_options = {}
58
68
  @ou_path = UNSET_VALUE
69
+ @primary_dns = UNSET_VALUE
70
+ @secondary_dns = UNSET_VALUE
59
71
  @unsecure = UNSET_VALUE
60
72
  @rename = UNSET_VALUE
61
73
  @logger = Log4r::Logger.new("vagrant::vagrant_windows_domain")
@@ -63,7 +75,7 @@ module VagrantPlugins
63
75
 
64
76
  # Final step of the Configuration lifecyle prior to
65
77
  # validation.
66
- #
78
+ #
67
79
  # Ensures all attributes are set to defaults if not provided.
68
80
  def finalize!
69
81
  super
@@ -75,8 +87,10 @@ module VagrantPlugins
75
87
  @password = nil if @password == UNSET_VALUE || @password == ""
76
88
  @join_options = [] if @join_options == UNSET_VALUE
77
89
  @ou_path = nil if @ou_path == UNSET_VALUE
90
+ @primary_dns = nil if @primary_dns == UNSET_VALUE || @primary_dns == ""
91
+ @secondary_dns = nil if @secondary_dns == UNSET_VALUE || @secondary_dns == ""
78
92
  @unsecure = false if @unsecure == UNSET_VALUE
79
- @rename = true if @rename == UNSET_VALUE
93
+ @rename = false if @rename == UNSET_VALUE
80
94
  end
81
95
 
82
96
  # Validate configuration and return a hash of errors.
@@ -89,9 +103,13 @@ module VagrantPlugins
89
103
  errors = _detected_errors
90
104
 
91
105
  # Need to supply one of them!
92
- if ( (@username != nil && @password != nil) && @unsecure == true)
106
+ if (@username != nil && @password != nil) && @unsecure == true
93
107
  errors << I18n.t("vagrant_windows_domain.errors.both_credentials_provided")
94
108
  end
109
+
110
+ if @secondary_dns != nil && @primary_dns == nil
111
+ errors << I18n.t("vagrant_windows_domain.errors.invalid_dns_config")
112
+ end
95
113
 
96
114
  { "windows domain provisioner" => errors }
97
115
  end
@@ -14,4 +14,6 @@ en:
14
14
  binary_not_detected: |-
15
15
  "The command '%{binary} required to join/remove the guest machine from the domain '%{domain}' was not found on the guest machine"
16
16
  absolute_module_path: |-
17
- "Absolute 'module_path' not allowed. Please provide a path relative to your Vagrantfile."
17
+ "Absolute 'module_path' not allowed. Please provide a path relative to your Vagrantfile."
18
+ invalid_dns_config: |-
19
+ "Primary dns must be set before configuring Secondary DNS."
@@ -24,10 +24,10 @@ module VagrantPlugins
24
24
  Provisioner
25
25
  end
26
26
 
27
- action_hook(:windows_domain, :machine_action_destroy) do |hook|
28
- require_relative 'action/leave_domain'
29
- hook.prepend(VagrantPlugins::WindowsDomain::LeaveDomain)
30
- end
27
+ # action_hook(:windows_domain, :machine_action_destroy) do |hook|
28
+ # require_relative 'action/leave_domain'
29
+ # hook.prepend(VagrantPlugins::WindowsDomain::LeaveDomain)
30
+ # end
31
31
  end
32
32
  end
33
33
  end
@@ -107,7 +107,7 @@ module VagrantPlugins
107
107
  restart_guest
108
108
 
109
109
  @logger.debug("Need to reboot to join the domain correctly - 2nd reboot")
110
- restart_guest
110
+ #restart_guest
111
111
  end
112
112
  end
113
113
  end
@@ -150,14 +150,14 @@ module VagrantPlugins
150
150
  # This is the method called when destroying a machine that allows
151
151
  # for any state related to the machine created by the provisioner
152
152
  # to be cleaned up.
153
- def destroy
153
+ def cleanup
154
154
  if @config && @config.domain != nil
155
155
  if is_joined_to_domain()
156
156
  set_credentials
157
157
  result = leave_domain
158
158
  if result
159
159
  @logger.debug("Need to reboot to leave the domain correctly")
160
- restart_guest
160
+ #restart_guest
161
161
  end
162
162
  end
163
163
  else
@@ -215,6 +215,8 @@ module VagrantPlugins
215
215
  domain: @config.domain,
216
216
  computer_name: @config.computer_name,
217
217
  ou_path: @config.ou_path,
218
+ primary_dns: @config.primary_dns,
219
+ secondary_dns: @config.secondary_dns,
218
220
  add_to_domain: add_to_domain,
219
221
  unsecure: @config.unsecure,
220
222
  rename: @config.rename,
@@ -246,10 +248,6 @@ module VagrantPlugins
246
248
  params["-Credential $credentials"] = nil
247
249
  end
248
250
 
249
- if @config.computer_name != nil && @config.computer_name != @old_computer_name
250
- params["-NewName"] = "'#{@config.computer_name}'"
251
- end
252
-
253
251
  if @config.ou_path
254
252
  params["-OUPath"] = "'#{@config.ou_path}'"
255
253
  end
@@ -314,7 +312,7 @@ module VagrantPlugins
314
312
  last_type = nil
315
313
  new_line = ""
316
314
  error = false
317
- machine.communicate.sudo("powershell -ExecutionPolicy Bypass -OutputFormat Text -file #{script_path}", opts) do |type, data|
315
+ exit_status = @machine.communicate.sudo("powershell -ExecutionPolicy Bypass -OutputFormat Text -file #{script_path}", opts) do |type, data|
318
316
  if !data.chomp.empty?
319
317
  error = true if type == :stderr
320
318
  if [:stderr, :stdout].include?(type)
@@ -17,8 +17,192 @@ function Repair-OpenSSHPasswd(){
17
17
  $passwd | Set-Content $passwdPath -Encoding Ascii
18
18
  }
19
19
  }
20
+ function New-ADSIPrincipalContext
21
+ {
22
+ [CmdletBinding(SupportsShouldProcess = $true)]
23
+ [OutputType('System.DirectoryServices.AccountManagement.PrincipalContext')]
24
+ PARAM
25
+ (
26
+ [Alias("RunAs")]
27
+ [System.Management.Automation.PSCredential]
28
+ [System.Management.Automation.Credential()]
29
+ $Credential = [System.Management.Automation.PSCredential]::Empty,
30
+
31
+ [Parameter(Mandatory = $true)]
32
+ [System.DirectoryServices.AccountManagement.ContextType]$ContextType,
33
+
34
+ $DomainName = [System.DirectoryServices.ActiveDirectory.Domain]::Getcurrentdomain(),
35
+
36
+ $Container,
37
+
38
+ [System.DirectoryServices.AccountManagement.ContextOptions[]]$ContextOptions
39
+ )
40
+
41
+ BEGIN
42
+ {
43
+ $ScriptName = (Get-Variable -name MyInvocation -Scope 0 -ValueOnly).MyCommand
44
+ Write-Verbose -Message "[$ScriptName] Add Type System.DirectoryServices.AccountManagement"
45
+ Add-Type -AssemblyName System.DirectoryServices.AccountManagement
46
+ }
47
+ PROCESS
48
+ {
49
+ TRY
50
+ {
51
+ switch ($ContextType)
52
+ {
53
+ "Domain" { $ArgumentList = $ContextType, $DomainName }
54
+ "Machine" { $ArgumentList = $ContextType, $ComputerName }
55
+ "ApplicationDirectory" { $ArgumentList = $ContextType }
56
+ }
57
+
58
+ IF ($PSBoundParameters['Container'])
59
+ {
60
+ $ArgumentList += $Container
61
+ }
62
+
63
+ IF ($PSBoundParameters['ContextOptions'])
64
+ {
65
+ $ArgumentList += $($ContextOptions)
66
+ }
67
+
68
+ IF ($PSBoundParameters['Credential'])
69
+ {
70
+ # Query the specified domain or current if not entered, with the specified credentials
71
+ $ArgumentList += $($Credential.UserName), $($Credential.GetNetworkCredential().password)
72
+ }
73
+
74
+ IF ($PSCmdlet.ShouldProcess($DomainName, "Create Principal Context"))
75
+ {
76
+ # Query
77
+ New-Object -TypeName System.DirectoryServices.AccountManagement.PrincipalContext -ArgumentList $ArgumentList
78
+ }
79
+ } #TRY
80
+ CATCH
81
+ {
82
+ $PSCmdlet.ThrowTerminatingError($_)
83
+ }
84
+ } #PROCESS
85
+ }
20
86
 
87
+ function Get-ADSIComputer
88
+ {
89
+ [CmdletBinding(DefaultParameterSetName="All")]
90
+ param ([Parameter(Mandatory=$true,ParameterSetName="Identity")]
91
+ [string]$Identity,
92
+
93
+ [Alias("RunAs")]
94
+ [System.Management.Automation.PSCredential]
95
+ [System.Management.Automation.Credential()]
96
+ $Credential = [System.Management.Automation.PSCredential]::Empty,
97
+
98
+ [String]$DomainName
99
+ )
100
+ BEGIN
101
+ {
102
+ Add-Type -AssemblyName System.DirectoryServices.AccountManagement
103
+
104
+ # Create Context splatting
105
+ $ContextSplatting = @{ ContextType = "Domain" }
106
+
107
+ IF ($PSBoundParameters['Credential']) { $ContextSplatting.Credential = $Credential }
108
+ IF ($PSBoundParameters['DomainName']) { $ContextSplatting.DomainName = $DomainName }
109
+
110
+ $Context = New-ADSIPrincipalContext @ContextSplatting
111
+
112
+ }
113
+ PROCESS
114
+ {
115
+ TRY{
116
+ IF($Identity)
117
+ {
118
+ [System.DirectoryServices.AccountManagement.ComputerPrincipal]::FindByIdentity($Context, $Identity)
119
+ }
120
+ ELSE{
121
+ $ComputerPrincipal = New-object -TypeName System.DirectoryServices.AccountManagement.ComputerPrincipal -ArgumentList $Context
122
+ $Searcher = new-object System.DirectoryServices.AccountManagement.PrincipalSearcher
123
+ $Searcher.QueryFilter = $ComputerPrincipal
124
+
125
+ $Searcher.FindAll()
126
+ }
127
+ }
128
+ CATCH
129
+ {
130
+ $pscmdlet.ThrowTerminatingError($_)
131
+ }
132
+ }
133
+ }
134
+
135
+ function Remove-ADSIComputer
136
+ {
137
+ [CmdletBinding(SupportsShouldProcess = $true)]
138
+ PARAM (
139
+ [parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, ValueFromPipeline = $true)]
140
+ $Identity,
141
+
142
+ [Alias("RunAs")]
143
+ [System.Management.Automation.PSCredential]
144
+ [System.Management.Automation.Credential()]
145
+ $Credential = [System.Management.Automation.PSCredential]::Empty,
146
+
147
+ [String]$DomainName,
148
+
149
+ [Switch]$Recursive
150
+ )
151
+
152
+ BEGIN
153
+ {
154
+ Add-Type -AssemblyName System.DirectoryServices.AccountManagement
155
+
156
+ # Create Context splatting
157
+ $ContextSplatting = @{ }
158
+ IF ($PSBoundParameters['Credential']) { $ContextSplatting.Credential = $Credential }
159
+ IF ($PSBoundParameters['DomainName']) { $ContextSplatting.DomainName = $DomainName }
160
+
161
+ }
162
+ PROCESS
163
+ {
164
+ TRY
165
+ {
166
+ # Not Recursive
167
+ if (-not $PSBoundParameters['Recursive'])
168
+ {
169
+ if ($pscmdlet.ShouldProcess("$Identity", "Remove Account"))
170
+ {
171
+ $Account = Get-ADSIComputer -Identity $Identity @ContextSplatting
172
+ $Account.delete()
173
+ }
174
+ }
175
+
176
+ # Recursive (if the computer is the parent of one leaf or more)
177
+ if ($PSBoundParameters['Recursive'])
178
+ {
179
+ if ($pscmdlet.ShouldProcess("$Identity", "Remove Account and any child objects"))
180
+ {
181
+ $Account = Get-ADSIComputer -Identity $Identity @ContextSplatting
182
+ $Account.GetUnderlyingObject().deletetree()
183
+ }
184
+ }
185
+
186
+ }
187
+ CATCH
188
+ {
189
+ $pscmdlet.ThrowTerminatingError($_)
190
+ }
191
+ }
192
+ }
193
+ try
194
+ {
195
+ Get-NetConnectionProfile -ErrorAction Stop | Set-NetConnectionProfile -NetworkCategory private -ErrorAction Stop
196
+ }
197
+ catch
198
+ {
199
+ Write-host "Network adapters already set to private network type"
200
+ }
201
+ <% if options[:computer_name] != nil %>
21
202
  $computerName='<%= options[:computer_name] %>'
203
+ <% else %>
204
+ $computerName = $env:COMPUTERNAME
205
+ <% end %>
22
206
  <% if options[:username] != nil && options[:unsecure] != true %>
23
207
  $domain='<%= options[:domain] %>'
24
208
  $username='<%= options[:username] %>'
@@ -26,14 +210,41 @@ $password='<%= options[:password] %>'
26
210
  $secpasswd = ConvertTo-SecureString $password -AsPlainText -Force
27
211
  $credentials = New-Object System.Management.Automation.PSCredential ($username, $secpasswd)
28
212
  <% end %>
213
+
29
214
  <% if options[:add_to_domain] === true %>
30
215
  if (Test-PartOfDomain -computerName $computerName -domain $domain){
31
216
  throw "$computerName already part of domain $domain"
32
217
  } else {
33
- Add-Computer <%= options[:parameters] %> -Verbose -Force -PassThru
34
-
218
+ #If a value is provided for the Primary_DNS and Secondary_DNS variable in the vagrantfile, powershell will determine if the string is a valid IP and will statically set the primary and secondary dns servers of the vm's nic if it is. If only Primary_DNS variable is provided, powershell will statically set the primary dns server of the vm's nic while leaving the secondary unset.
219
+ <% if options[:primary_dns] != nil %>
220
+ $wmi = Get-WmiObject -ComputerName $env:COMPUTERNAME -Namespace "root\CIMV2" -Class "Win32_NetworkAdapterconfiguration" -Filter 'IPENABLED=TRUE AND Index=2' -Impersonation Impersonate -ErrorAction Stop | Where-Object { $_.DefaultIPGateway }
221
+ # $currdns = $wmi.DNSServerSearchOrder
222
+ $prim = '<%= options[:primary_dns] %>'
223
+ # Modified the configuration so that the secondary dns can only be set if the primary dns server has also been set
224
+ <% if options[:secondary_dns] != nil %>
225
+ $sec = '<%= options[:secondary_dns] %>'
226
+ If (($prim -match "^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$") -and ($sec -match "^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$"))
227
+ {
228
+ $wmi.SetDNSServerSearchOrder(@("$prim", "$sec"))
229
+ }
230
+ else
231
+ {
232
+ throw "Invalid value provided for dns server ip"
233
+ }
234
+ <% else %>
235
+ If ($prim -match "^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
236
+ {
237
+ $wmi.SetDNSServerSearchOrder("$prim")
238
+ }
239
+ else
240
+ {
241
+ throw "Invalid IP address provided"
242
+ }
243
+ <% end %>
244
+ <% end %>
245
+ Add-Computer <%= options[:parameters] %> -Verbose -Force
35
246
  # Rename computer separately: Fixes GH issue #11
36
- <% if options[:rename] === true %>
247
+ <% if options[:computer_name] != nil %>
37
248
  $completed = $false
38
249
  while ( -not $completed) {
39
250
  try {
@@ -51,28 +262,26 @@ if (Test-PartOfDomain -computerName $computerName -domain $domain){
51
262
  }
52
263
  }
53
264
  <% end %>
54
-
55
265
  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
266
  }
64
267
  <% else %>
65
- if (!(Test-JoinedToADomain)) {
66
- Throw "$computerName not part of any domain"
268
+ $compobj = Get-ADSIComputer -Identity $computerName -Credential $credentials -DomainName $domain
269
+ if (!(Test-JoinedToADomain) -or !($compobj)) {
270
+ # Throw "$computerName not part of any domain"
271
+ return
67
272
  } else {
68
- Remove-Computer <%= options[:parameters] %> -Workgroup 'WORKGROUP' -Verbose -Force -PassThru
273
+ #When destroying the vagrant machine, the goal is not as much to have the virtual machine disjoin from the domain, but to remove the computer object associated with the
274
+ #machine so that future runs of vagrant up will succeed (especially when the vagrantfile explicitly defines a computer name. That being the case, the remove-computer
275
+ #command has been replaced with a custom function which is able to remove the computer object associated with the vagrant machine in active directory.
276
+ try
277
+ {
278
+ Remove-ADSIComputer -Identity $env:COMPUTERNAME -DomainName $domain -Credential $credentials -Verbose -ErrorAction Stop
69
279
  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
280
+ }
281
+ catch
282
+ {
283
+ Repair-OpenSSHPasswd
284
+ }
285
+
77
286
  }
78
287
  <% end %>
@@ -1,5 +1,5 @@
1
1
  module Vagrant
2
2
  module WindowsDomain
3
- VERSION = "1.2.0"
3
+ VERSION = "1.3.5"
4
4
  end
5
5
  end
@@ -52,6 +52,7 @@ describe VagrantPlugins::WindowsDomain::Config do
52
52
  expect(subject.computer_name).to be_nil
53
53
  expect(subject.username).to be_nil
54
54
  expect(subject.password).to be_nil
55
+
55
56
  end
56
57
  end
57
58
 
@@ -74,11 +74,11 @@ describe VagrantPlugins::WindowsDomain::Provisioner do
74
74
  allow(communicator).to receive(:upload)
75
75
  allow(ui).to receive(:info)
76
76
  expect(communicator).to receive(:test)
77
- expect(vm).to receive(:boot_timeout).twice
77
+ expect(vm).to receive(:boot_timeout).once
78
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})
79
79
  expect(communicator).to receive(:sudo).with("del c:/tmp/vagrant-windows-domain-runner.ps1")
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
+ expect(machine).to receive(:action).with(:reload, {:provision_ignore_sentinel=>false, :lock=>false}).once
81
+ expect(communicator).to receive(:ready?).and_return(true).once
82
82
  subject.restart_sleep_duration = 0
83
83
  subject.provision
84
84
  expect(subject.old_computer_name).to eq("myoldcomputername")
@@ -88,11 +88,11 @@ describe VagrantPlugins::WindowsDomain::Provisioner do
88
88
  allow(communicator).to receive(:upload)
89
89
  allow(ui).to receive(:info)
90
90
  expect(communicator).to receive(:test)
91
- expect(vm).to receive(:boot_timeout).twice
91
+ expect(vm).to receive(:boot_timeout).once
92
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})
93
93
  expect(communicator).to receive(:sudo).with("del c:/tmp/vagrant-windows-domain-runner.ps1")
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
94
+ expect(machine).to receive(:action). with(:reload, {:provision_ignore_sentinel=>false, :lock=>false}).once
95
+ expect(communicator).to receive(:ready?).and_return(true).once
96
96
  subject.restart_sleep_duration = 0
97
97
  subject.provision
98
98
  end
@@ -190,19 +190,12 @@ describe VagrantPlugins::WindowsDomain::Provisioner do
190
190
  it "should leave domain when a `vagrant destroy` is issued" do
191
191
  allow(machine).to receive(:communicate).and_return(communicator)
192
192
  expect(communicator).to receive(:test).and_return(true)
193
- expect(vm).to receive(:boot_timeout)
194
193
  expect(communicator).to receive(:upload)
195
194
  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")
196
195
  expect(ui).to receive(:info).with("\"Running Windows Domain Provisioner\"")
197
196
  expect(ui).to receive(:info).with("deleted", {:color=>:green, :new_line=>false, :prefix=>false})
198
- expect(ui).to receive(:say).with(:info, "Restarting computer for updates to take effect.")
199
- expect(machine).to receive(:action). with(:reload, {:provision_ignore_sentinel=>false, :lock=>false})
200
- expect(ui).to_not receive(:say)
201
- expect(ui).to_not receive(:ask)
202
- expect(communicator).to receive(:ready?).and_return(true)
203
- subject.restart_sleep_duration = 0
204
197
 
205
- subject.destroy
198
+ subject.cleanup
206
199
  end
207
200
 
208
201
  it "should not leave domain plugin not associated with current Vagrantfile" do
@@ -211,7 +204,7 @@ describe VagrantPlugins::WindowsDomain::Provisioner do
211
204
  subject = described_class.new machine, double("env", :domain => nil)
212
205
 
213
206
  expect(ui).to_not receive(:ask)
214
- expect(subject.destroy).to eq(nil)
207
+ expect(subject.cleanup).to eq(nil)
215
208
  end
216
209
 
217
210
  it "should ask for credentials when leaving domain when no credentials were provided" do
@@ -220,19 +213,13 @@ describe VagrantPlugins::WindowsDomain::Provisioner do
220
213
  allow(machine).to receive(:communicate).and_return(communicator)
221
214
  allow(machine).to receive(:env).and_return(env)
222
215
 
223
- expect(vm).to receive(:boot_timeout)
224
216
  expect(communicator).to receive(:test).and_return(true)
225
217
  expect(communicator).to receive(:upload)
226
218
  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")
227
219
  expect(ui).to receive(:info).with(any_args).twice
228
220
  expect(ui).to receive(:ask).with("Please enter your domain password (output will be hidden): ", {:echo=>false}).and_return("myusername")
229
221
  expect(ui).to receive(:ask).with("Please enter your domain username: ")
230
- expect(ui).to receive(:say).with(:info, "Restarting computer for updates to take effect.")
231
- expect(machine).to receive(:action). with(:reload, {:provision_ignore_sentinel=>false, :lock=>false})
232
- expect(communicator).to receive(:ready?).and_return(true)
233
- subject.restart_sleep_duration = 0
234
-
235
- subject.destroy
222
+ subject.cleanup
236
223
  end
237
224
 
238
225
  end
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["matt.fellows@onegeek.com.au"]
11
11
  spec.summary = "Windows Domain Provisioner for Vagrant"
12
12
  spec.description = "Adds and Removes Windows Guests from a Windows Domain, as part of the standard machine lifecycle."
13
- spec.homepage = "https://github.com/SEEK-Jobs/vagrant-windows-domain"
13
+ spec.homepage = "https://github.com/mefellows/vagrant-windows-domain"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0")
@@ -19,10 +19,10 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
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'
22
+ spec.add_development_dependency "bundler"
23
+ spec.add_development_dependency "coveralls"
24
+ spec.add_development_dependency "rspec-core"
25
+ spec.add_development_dependency "rspec-expectations"
26
+ spec.add_development_dependency "rspec-mocks"
27
+ spec.add_development_dependency "rspec-its"
28
28
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-windows-domain
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Fellows
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-14 00:00:00.000000000 Z
11
+ date: 2021-01-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -30,120 +30,84 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 1.5.2
34
- - - "<="
35
- - !ruby/object:Gem::Version
36
- version: 1.12.5
33
+ version: '0'
37
34
  type: :development
38
35
  prerelease: false
39
36
  version_requirements: !ruby/object:Gem::Requirement
40
37
  requirements:
41
38
  - - ">="
42
39
  - !ruby/object:Gem::Version
43
- version: 1.5.2
44
- - - "<="
45
- - !ruby/object:Gem::Version
46
- version: 1.12.5
40
+ version: '0'
47
41
  - !ruby/object:Gem::Dependency
48
42
  name: coveralls
49
43
  requirement: !ruby/object:Gem::Requirement
50
44
  requirements:
51
- - - "~>"
52
- - !ruby/object:Gem::Version
53
- version: 0.8.10
54
45
  - - ">="
55
46
  - !ruby/object:Gem::Version
56
- version: 0.8.10
47
+ version: '0'
57
48
  type: :development
58
49
  prerelease: false
59
50
  version_requirements: !ruby/object:Gem::Requirement
60
51
  requirements:
61
- - - "~>"
62
- - !ruby/object:Gem::Version
63
- version: 0.8.10
64
52
  - - ">="
65
53
  - !ruby/object:Gem::Version
66
- version: 0.8.10
54
+ version: '0'
67
55
  - !ruby/object:Gem::Dependency
68
56
  name: rspec-core
69
57
  requirement: !ruby/object:Gem::Requirement
70
58
  requirements:
71
- - - "~>"
72
- - !ruby/object:Gem::Version
73
- version: 3.4.2
74
59
  - - ">="
75
60
  - !ruby/object:Gem::Version
76
- version: 3.4.2
61
+ version: '0'
77
62
  type: :development
78
63
  prerelease: false
79
64
  version_requirements: !ruby/object:Gem::Requirement
80
65
  requirements:
81
- - - "~>"
82
- - !ruby/object:Gem::Version
83
- version: 3.4.2
84
66
  - - ">="
85
67
  - !ruby/object:Gem::Version
86
- version: 3.4.2
68
+ version: '0'
87
69
  - !ruby/object:Gem::Dependency
88
70
  name: rspec-expectations
89
71
  requirement: !ruby/object:Gem::Requirement
90
72
  requirements:
91
- - - "~>"
92
- - !ruby/object:Gem::Version
93
- version: 3.4.0
94
73
  - - ">="
95
74
  - !ruby/object:Gem::Version
96
- version: 3.4.0
75
+ version: '0'
97
76
  type: :development
98
77
  prerelease: false
99
78
  version_requirements: !ruby/object:Gem::Requirement
100
79
  requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: 3.4.0
104
80
  - - ">="
105
81
  - !ruby/object:Gem::Version
106
- version: 3.4.0
82
+ version: '0'
107
83
  - !ruby/object:Gem::Dependency
108
84
  name: rspec-mocks
109
85
  requirement: !ruby/object:Gem::Requirement
110
86
  requirements:
111
- - - "~>"
112
- - !ruby/object:Gem::Version
113
- version: 3.4.1
114
87
  - - ">="
115
88
  - !ruby/object:Gem::Version
116
- version: 3.4.1
89
+ version: '0'
117
90
  type: :development
118
91
  prerelease: false
119
92
  version_requirements: !ruby/object:Gem::Requirement
120
93
  requirements:
121
- - - "~>"
122
- - !ruby/object:Gem::Version
123
- version: 3.4.1
124
94
  - - ">="
125
95
  - !ruby/object:Gem::Version
126
- version: 3.4.1
96
+ version: '0'
127
97
  - !ruby/object:Gem::Dependency
128
98
  name: rspec-its
129
99
  requirement: !ruby/object:Gem::Requirement
130
100
  requirements:
131
- - - "~>"
132
- - !ruby/object:Gem::Version
133
- version: 1.2.0
134
101
  - - ">="
135
102
  - !ruby/object:Gem::Version
136
- version: 1.2.0
103
+ version: '0'
137
104
  type: :development
138
105
  prerelease: false
139
106
  version_requirements: !ruby/object:Gem::Requirement
140
107
  requirements:
141
- - - "~>"
142
- - !ruby/object:Gem::Version
143
- version: 1.2.0
144
108
  - - ">="
145
109
  - !ruby/object:Gem::Version
146
- version: 1.2.0
110
+ version: '0'
147
111
  description: Adds and Removes Windows Guests from a Windows Domain, as part of the
148
112
  standard machine lifecycle.
149
113
  email:
@@ -169,11 +133,10 @@ files:
169
133
  - lib/vagrant-windows-domain/version.rb
170
134
  - spec/base.rb
171
135
  - spec/provisioner/config_spec.rb
172
- - spec/provisioner/leave_domain_spec.rb
173
136
  - spec/provisioner/provisioner_spec.rb
174
137
  - spec/spec_helper.rb
175
138
  - vagrant-windows-domain.gemspec
176
- homepage: https://github.com/SEEK-Jobs/vagrant-windows-domain
139
+ homepage: https://github.com/mefellows/vagrant-windows-domain
177
140
  licenses:
178
141
  - MIT
179
142
  metadata: {}
@@ -192,14 +155,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
192
155
  - !ruby/object:Gem::Version
193
156
  version: '0'
194
157
  requirements: []
195
- rubyforge_project:
196
- rubygems_version: 2.5.1
158
+ rubygems_version: 3.0.3
197
159
  signing_key:
198
160
  specification_version: 4
199
161
  summary: Windows Domain Provisioner for Vagrant
200
162
  test_files:
201
163
  - spec/base.rb
202
164
  - spec/provisioner/config_spec.rb
203
- - spec/provisioner/leave_domain_spec.rb
204
165
  - spec/provisioner/provisioner_spec.rb
205
166
  - spec/spec_helper.rb
@@ -1,131 +0,0 @@
1
- require 'spec_helper'
2
- require 'vagrant-windows-domain/provisioner'
3
- require 'vagrant-windows-domain/action/leave_domain'
4
- require 'vagrant-windows-domain/config'
5
- require 'base'
6
-
7
- describe VagrantPlugins::WindowsDomain::LeaveDomain do
8
-
9
- include_context "unit"
10
- let(:instance) { described_class.new }
11
-
12
- let(:root_path) { (Pathname.new(Dir.mktmpdir)).to_s }
13
- let(:domain) { "foo.com" }
14
- let(:ui) { double("ui") }
15
- let(:app) { double("app") }
16
- let(:communicator) { double ("communicator") }
17
- let(:shell) { double ("shell") }
18
- let(:powershell) { double ("powershell") }
19
- let(:guest) { double ("guest") }
20
- let(:configuration_file) { "manifests/MyWebsite.ps1" }
21
- let(:module_path) { ["foo/modules", "foo/modules2"] }
22
- let(:config) { VagrantPlugins::WindowsDomain::Config.new }
23
- let(:vm) { double("vm", provisioners: [double("prov", config: config)]) }
24
- let(:root_config) { double("root_config", vm: vm) }
25
- let(:env) { {:ui => ui, :machine => machine} }
26
- let(:machine) { double("machine", ui: ui, id: "1234", config: root_config) }
27
- let(:provisioner) { double("provisioner") }
28
- subject { described_class.new app, env }
29
-
30
- describe "call" do
31
-
32
- before do
33
- allow(machine).to receive(:communicate).and_return(communicator)
34
- allow(env).to receive(:machine).and_return(machine)
35
- allow(communicator).to receive(:shell).and_return(shell)
36
- allow(shell).to receive(:powershell).and_yield(:stdout, "myoldcomputername")
37
- config.domain = domain
38
- allow(env).to receive(:machine).and_return(machine)
39
- allow(machine).to receive(:env).and_return(env)
40
- allow(env).to receive(:ui).and_return(ui)
41
- subject.provisioner = provisioner
42
- end
43
-
44
- context "when no configuration exists for the machine" do
45
- it "should pass control to the next middleware Action" do
46
- config.domain = nil
47
- expect(app).to receive(:call).with(env)
48
- subject.call(env)
49
- end
50
- end
51
-
52
- context "when machine is running" do
53
- it "should prompt the user if they would like to destroy & d/c the machine" do
54
- state = double("state", id: :running)
55
- expect(provisioner).to receive(:destroy)
56
-
57
- expect(app).to receive(:call).with(env)
58
- expect(ui).to receive(:ask).with("Are you sure you want to destroy this machine and disconnect from #{domain}? (y/n)").and_return("y")
59
- expect(machine).to receive(:state).and_return(state).twice
60
- subject.call(env)
61
-
62
- end
63
-
64
- it "should not continue if the user declines to destroy the machine" do
65
- state = double("state", id: :running)
66
- expect(provisioner).to_not receive(:destroy)
67
-
68
- expect(ui).to receive(:ask).with("Are you sure you want to destroy this machine and disconnect from #{domain}? (y/n)").and_return("n")
69
- expect(machine).to receive(:state).and_return(state).twice
70
- expect(app).to_not receive(:call).with(env)
71
- subject.call(env)
72
- end
73
- end
74
-
75
- context "when machine is :paused, :saved or :poweroff" do
76
- it "should prompt the user if they would like to force destroy the machine" do
77
- state = double("state", id: :poweroff)
78
- provisioner = double("provisioner")
79
- subject.provisioner = provisioner
80
-
81
- expect(ui).to receive(:say).with(:warn, "Machine is currently not running. To properly leave the #{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")
82
- expect(ui).to receive(:ask).with("Would you like to continue destroying this machine, leaving this machine orphaned in the '#{domain}' network? If so, type 'destroy'").and_return("destroy")
83
- expect(ui).to receive(:say).with(:warn, "Force destroying this machine and not leaving the domain foo.com. May FSM have mercy on your soul.")
84
- expect(machine).to receive(:state).and_return(state).twice
85
- expect(app).to receive(:call).with(env)
86
- # Can't call destroy on a non-running machine
87
- expect(provisioner).to_not receive(:destroy)
88
-
89
- subject.call(env)
90
-
91
- expect(env[:force_confirm_destroy]).to be(true)
92
- end
93
-
94
- it "should not pass on to middleware if user declines force destroy" do
95
- state = double("state", id: :poweroff)
96
- provisioner = double("provisioner")
97
- subject.provisioner = provisioner
98
-
99
- expect(ui).to receive(:say).with(:warn, "Machine is currently not running. To properly leave the #{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")
100
- expect(ui).to receive(:ask).with("Would you like to continue destroying this machine, leaving this machine orphaned in the '#{domain}' network? If so, type 'destroy'").and_return("n")
101
- expect(machine).to receive(:state).and_return(state).twice
102
- expect(app).to_not receive(:call).with(env)
103
- expect(provisioner).to_not receive(:destroy)
104
- expect(env[:force_confirm_destroy]).to be(nil)
105
-
106
- subject.call(env)
107
- end
108
- end
109
-
110
- context "when machine is :not_created" do
111
- it "should pass control to the next middleware action" do
112
- state = double("state", id: :not_created)
113
- expect(machine).to receive(:state).and_return(state)
114
-
115
- expect(app).to receive(:call).with(env)
116
- subject.call(env)
117
- end
118
- end
119
- end
120
-
121
-
122
- describe "initialize" do
123
-
124
- its("env") { should eq(env) }
125
- its("app") { should eq(app) }
126
- its("config") { should eq(config) }
127
- its("machine") { should eq(machine) }
128
-
129
- end
130
-
131
- end