vagrant-windows-domain 1.2.0 → 1.3.5

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 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