vagrant-windows 1.6.0 → 1.7.0.pre.1
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 +0 -1
- data/CHANGELOG.md +7 -1
- data/Gemfile +5 -1
- data/README.md +3 -1
- data/lib/vagrant-windows/communication/command_filters/cat.rb +27 -0
- data/lib/vagrant-windows/communication/command_filters/chmod.rb +21 -0
- data/lib/vagrant-windows/communication/command_filters/chown.rb +21 -0
- data/lib/vagrant-windows/communication/command_filters/rm.rb +28 -0
- data/lib/vagrant-windows/communication/command_filters/test.rb +37 -0
- data/lib/vagrant-windows/communication/command_filters/uname.rb +36 -0
- data/lib/vagrant-windows/communication/command_filters/which.rb +26 -0
- data/lib/vagrant-windows/communication/linux_command_filter.rb +44 -0
- data/lib/vagrant-windows/communication/winrmcommunicator.rb +19 -12
- data/lib/vagrant-windows/communication/winrmfilemanager.rb +166 -0
- data/lib/vagrant-windows/communication/winrmshell.rb +4 -23
- data/lib/vagrant-windows/errors.rb +5 -1
- data/lib/vagrant-windows/monkey_patches/plugins/provisioners/chef/provisioner/chef_client.rb +2 -5
- data/lib/vagrant-windows/monkey_patches/plugins/provisioners/chef/provisioner/chef_solo.rb +2 -5
- data/lib/vagrant-windows/monkey_patches/plugins/provisioners/shell/provisioner.rb +13 -6
- data/lib/vagrant-windows/provisioners/chef_command_builder.rb +7 -53
- data/lib/vagrant-windows/scripts/elevated_shell.ps1.erb +95 -0
- data/lib/vagrant-windows/version.rb +1 -1
- data/locales/en.yml +7 -0
- data/spec/vagrant-windows/chef_command_builder_spec.rb +7 -53
- data/spec/vagrant-windows/guestnetwork_spec.rb +3 -3
- data/spec/vagrant-windows/linux_command_filter_spec.rb +73 -0
- data/spec/vagrant-windows/winrmcommunicator_spec.rb +55 -6
- data/spec/vagrant-windows/winrmshell_spec.rb +3 -3
- metadata +16 -8
- data/lib/vagrant-windows/scripts/cheftask.ps1.erb +0 -48
- data/lib/vagrant-windows/scripts/cheftask.xml.erb +0 -45
- data/lib/vagrant-windows/scripts/cheftaskrun.ps1.erb +0 -18
- data/lib/vagrant-windows/scripts/command_alias.ps1 +0 -36
@@ -22,58 +22,16 @@ module VagrantWindows
|
|
22
22
|
@client_type = client_type
|
23
23
|
end
|
24
24
|
|
25
|
-
def prepare_for_chef_run()
|
26
|
-
options = create_chef_options()
|
27
|
-
|
28
|
-
# create cheftaskrun.ps1 that the scheduled task will invoke when run
|
29
|
-
render_file_and_upload('cheftaskrun.ps1', options[:chef_task_run_ps1],
|
30
|
-
:options => options)
|
31
|
-
|
32
|
-
# create cheftask.xml that the scheduled task will be created with
|
33
|
-
render_file_and_upload('cheftask.xml', options[:chef_task_xml],
|
34
|
-
:options => options)
|
35
|
-
|
36
|
-
# create cheftask.ps1 that will immediately invoke the scheduled task and wait for completion
|
37
|
-
render_file_and_upload('cheftask.ps1', options[:chef_task_ps1],
|
38
|
-
:options => options)
|
39
|
-
end
|
40
|
-
|
41
25
|
def run_chef_command()
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
Set-ExecutionPolicy $old -force
|
47
|
-
EOH
|
48
|
-
end
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
def render_file_and_upload(script_name, dest_file, options)
|
53
|
-
# render the script file to a local temp file and then upload
|
54
|
-
script_local = Tempfile.new(script_name)
|
55
|
-
IO.write(script_local, VagrantWindows.load_script_template(script_name, options))
|
56
|
-
@windows_machine.winrmshell.upload(script_local, dest_file)
|
57
|
-
end
|
58
|
-
|
59
|
-
def create_chef_options
|
60
|
-
command_env = @config.binary_env ? "#{@config.binary_env} " : ''
|
61
|
-
return {
|
62
|
-
:user => @windows_machine.winrm_config.username,
|
63
|
-
:pass => @windows_machine.winrm_config.password,
|
64
|
-
:chef_arguments => create_chef_arguments(),
|
65
|
-
:chef_task_xml => provisioning_path('cheftask.xml'),
|
66
|
-
:chef_task_running => provisioning_path('cheftask.running'),
|
67
|
-
:chef_task_exitcode => provisioning_path('cheftask.exitcode'),
|
68
|
-
:chef_task_ps1 => chef_task_ps1_path(),
|
69
|
-
:chef_task_run_ps1 => provisioning_path('cheftaskrun.ps1'),
|
70
|
-
:chef_stdout_log => provisioning_path("chef-#{@client_type}.log"),
|
71
|
-
:chef_stderr_log => provisioning_path("chef-#{@client_type}.err.log"),
|
72
|
-
:chef_binary_path => win_friendly_path("#{command_env}#{chef_binary_path}")
|
26
|
+
options = {
|
27
|
+
:command => "#{chef_binary_path} #{chef_arguments}",
|
28
|
+
:username => @windows_machine.winrm_config.username,
|
29
|
+
:password => @windows_machine.winrm_config.password
|
73
30
|
}
|
31
|
+
return VagrantWindows.load_script_template('elevated_shell.ps1', :options => options)
|
74
32
|
end
|
75
33
|
|
76
|
-
def
|
34
|
+
def chef_arguments()
|
77
35
|
command_args = @config.arguments ? @config.arguments : ''
|
78
36
|
chef_path = provisioning_path("#{@client_type}.rb")
|
79
37
|
chef_dna_path = provisioning_path('dna.json')
|
@@ -84,10 +42,6 @@ module VagrantWindows
|
|
84
42
|
chef_arguments.strip
|
85
43
|
end
|
86
44
|
|
87
|
-
def chef_task_ps1_path()
|
88
|
-
provisioning_path('cheftask.ps1')
|
89
|
-
end
|
90
|
-
|
91
45
|
# Returns the path to the Chef binary, taking into account the
|
92
46
|
# `binary_path` configuration option.
|
93
47
|
def chef_binary_path()
|
@@ -102,4 +56,4 @@ module VagrantWindows
|
|
102
56
|
|
103
57
|
end
|
104
58
|
end
|
105
|
-
end
|
59
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
$command = "<%= options[:command] %>"
|
2
|
+
$user = "<%= options[:username] %>"
|
3
|
+
$password = "<%= options[:password] %>"
|
4
|
+
|
5
|
+
$task_name = "WinRM_Elevated_Shell"
|
6
|
+
$out_file = "$env:SystemRoot\Temp\WinRM_Elevated_Shell.log"
|
7
|
+
|
8
|
+
if (Test-Path $out_file) {
|
9
|
+
del $out_file
|
10
|
+
}
|
11
|
+
|
12
|
+
$task_xml = @'
|
13
|
+
<?xml version="1.0" encoding="UTF-16"?>
|
14
|
+
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
|
15
|
+
<Principals>
|
16
|
+
<Principal id="Author">
|
17
|
+
<UserId>{user}</UserId>
|
18
|
+
<LogonType>Password</LogonType>
|
19
|
+
<RunLevel>HighestAvailable</RunLevel>
|
20
|
+
</Principal>
|
21
|
+
</Principals>
|
22
|
+
<Settings>
|
23
|
+
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
|
24
|
+
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
|
25
|
+
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
|
26
|
+
<AllowHardTerminate>true</AllowHardTerminate>
|
27
|
+
<StartWhenAvailable>false</StartWhenAvailable>
|
28
|
+
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
|
29
|
+
<IdleSettings>
|
30
|
+
<StopOnIdleEnd>true</StopOnIdleEnd>
|
31
|
+
<RestartOnIdle>false</RestartOnIdle>
|
32
|
+
</IdleSettings>
|
33
|
+
<AllowStartOnDemand>true</AllowStartOnDemand>
|
34
|
+
<Enabled>true</Enabled>
|
35
|
+
<Hidden>false</Hidden>
|
36
|
+
<RunOnlyIfIdle>false</RunOnlyIfIdle>
|
37
|
+
<WakeToRun>false</WakeToRun>
|
38
|
+
<ExecutionTimeLimit>PT2H</ExecutionTimeLimit>
|
39
|
+
<Priority>4</Priority>
|
40
|
+
</Settings>
|
41
|
+
<Actions Context="Author">
|
42
|
+
<Exec>
|
43
|
+
<Command>cmd</Command>
|
44
|
+
<Arguments>{arguments}</Arguments>
|
45
|
+
</Exec>
|
46
|
+
</Actions>
|
47
|
+
</Task>
|
48
|
+
'@
|
49
|
+
|
50
|
+
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
|
51
|
+
$encoded_command = [Convert]::ToBase64String($bytes)
|
52
|
+
$arguments = "/c powershell.exe -EncodedCommand $encoded_command > $out_file 2>&1"
|
53
|
+
|
54
|
+
$task_xml = $task_xml.Replace("{arguments}", $arguments)
|
55
|
+
$task_xml = $task_xml.Replace("{user}", $user)
|
56
|
+
|
57
|
+
$schedule = New-Object -ComObject "Schedule.Service"
|
58
|
+
$schedule.Connect()
|
59
|
+
$task = $schedule.NewTask($null)
|
60
|
+
$task.XmlText = $task_xml
|
61
|
+
$folder = $schedule.GetFolder("\")
|
62
|
+
$folder.RegisterTaskDefinition($task_name, $task, 6, $user, $password, 1, $null) | Out-Null
|
63
|
+
|
64
|
+
$registered_task = $folder.GetTask("\$task_name")
|
65
|
+
$registered_task.Run($null) | Out-Null
|
66
|
+
|
67
|
+
$timeout = 10
|
68
|
+
$sec = 0
|
69
|
+
while ( (!($registered_task.state -eq 4)) -and ($sec -lt $timeout) ) {
|
70
|
+
Start-Sleep -s 1
|
71
|
+
$sec++
|
72
|
+
}
|
73
|
+
|
74
|
+
# Read the entire file, but only write out new lines we haven't seen before
|
75
|
+
$numLinesRead = 0
|
76
|
+
do {
|
77
|
+
Start-Sleep -m 100
|
78
|
+
|
79
|
+
if (Test-Path $out_file) {
|
80
|
+
$text = (get-content $out_file)
|
81
|
+
$numLines = ($text | Measure-Object -line).lines
|
82
|
+
$numLinesToRead = $numLines - $numLinesRead
|
83
|
+
|
84
|
+
if ($numLinesToRead -gt 0) {
|
85
|
+
$text | select -first $numLinesToRead -skip $numLinesRead | ForEach {
|
86
|
+
Write-Host "$_"
|
87
|
+
}
|
88
|
+
$numLinesRead += $numLinesToRead
|
89
|
+
}
|
90
|
+
}
|
91
|
+
} while (!($registered_task.state -eq 3))
|
92
|
+
|
93
|
+
$exit_code = $registered_task.LastTaskResult
|
94
|
+
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($schedule) | Out-Null
|
95
|
+
exit $exit_code
|
data/locales/en.yml
CHANGED
@@ -32,70 +32,24 @@ describe VagrantWindows::Provisioners::ChefCommandBuilder, :unit => true do
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
describe '
|
35
|
+
describe 'chef_arguments' do
|
36
36
|
it 'should include paths to client.rb and dna.json' do
|
37
37
|
expected = '-c c:\tmp\vagrant-chef-1\client.rb -j c:\tmp\vagrant-chef-1\dna.json'
|
38
|
-
@chef_cmd_builder.
|
38
|
+
@chef_cmd_builder.chef_arguments().should eql expected
|
39
39
|
end
|
40
40
|
|
41
41
|
it 'should include Chef arguments if specified' do
|
42
42
|
@chef_config.stubs(:arguments).returns('-l DEBUG')
|
43
43
|
expected = '-c c:\tmp\vagrant-chef-1\client.rb -j c:\tmp\vagrant-chef-1\dna.json -l DEBUG'
|
44
|
-
@chef_cmd_builder.
|
44
|
+
@chef_cmd_builder.chef_arguments().should eql expected
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
-
describe '
|
49
|
-
it "should include
|
50
|
-
|
51
|
-
|
52
|
-
options[:pass].should eql 'secret'
|
48
|
+
describe 'run chef command' do
|
49
|
+
it "should include chef-client cmd line" do
|
50
|
+
expect(@chef_cmd_builder.run_chef_command()).to include(
|
51
|
+
'chef-client -c c:\\tmp\\vagrant-chef-1\\client.rb -j c:\\tmp\\vagrant-chef-1\\dna.json')
|
53
52
|
end
|
54
|
-
|
55
|
-
it 'should include paths to scripts' do
|
56
|
-
options = @chef_cmd_builder.create_chef_options()
|
57
|
-
options[:chef_task_xml].should eql 'c:\tmp\vagrant-chef-1\cheftask.xml'
|
58
|
-
options[:chef_task_ps1].should eql 'c:\tmp\vagrant-chef-1\cheftask.ps1'
|
59
|
-
options[:chef_task_run_ps1].should eql 'c:\tmp\vagrant-chef-1\cheftaskrun.ps1'
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'should include paths to process flow files' do
|
63
|
-
options = @chef_cmd_builder.create_chef_options()
|
64
|
-
options[:chef_task_running].should eql 'c:\tmp\vagrant-chef-1\cheftask.running'
|
65
|
-
options[:chef_task_exitcode].should eql 'c:\tmp\vagrant-chef-1\cheftask.exitcode'
|
66
|
-
end
|
67
|
-
|
68
|
-
it 'should include paths to logs' do
|
69
|
-
options = @chef_cmd_builder.create_chef_options()
|
70
|
-
options[:chef_stdout_log].should eql 'c:\tmp\vagrant-chef-1\chef-client.log'
|
71
|
-
options[:chef_stderr_log].should eql 'c:\tmp\vagrant-chef-1\chef-client.err.log'
|
72
|
-
end
|
73
|
-
|
74
|
-
it 'should include path to chef binary' do
|
75
|
-
options = @chef_cmd_builder.create_chef_options()
|
76
|
-
options[:chef_binary_path].should eql 'chef-client'
|
77
|
-
end
|
78
|
-
|
79
|
-
it 'should include full path to chef binary when binary_path is set' do
|
80
|
-
@chef_config.stubs(:binary_path).returns('c:/opscode/chef/bin')
|
81
|
-
options = @chef_cmd_builder.create_chef_options()
|
82
|
-
options[:chef_binary_path].should eql 'c:\opscode\chef\bin\chef-client'
|
83
|
-
end
|
84
|
-
|
85
|
-
end
|
86
|
-
|
87
|
-
describe 'prepare_for_chef_run' do
|
88
|
-
it 'should upload cheftask scripts' do
|
89
|
-
winrmshell = double()
|
90
|
-
@windows_machine.stubs(:winrmshell).returns(winrmshell)
|
91
|
-
|
92
|
-
winrmshell.should_receive(:upload).with(anything(), 'c:\tmp\vagrant-chef-1\cheftaskrun.ps1')
|
93
|
-
winrmshell.should_receive(:upload).with(anything(), 'c:\tmp\vagrant-chef-1\cheftask.xml')
|
94
|
-
winrmshell.should_receive(:upload).with(anything(), 'c:\tmp\vagrant-chef-1\cheftask.ps1')
|
95
|
-
|
96
|
-
@chef_cmd_builder.prepare_for_chef_run()
|
97
|
-
end
|
98
|
-
|
99
53
|
end
|
100
54
|
|
101
55
|
end
|
@@ -3,9 +3,9 @@ require 'spec_helper'
|
|
3
3
|
describe VagrantWindows::Communication::GuestNetwork , :integration => true do
|
4
4
|
|
5
5
|
before(:all) do
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
port = (ENV['WINRM_PORT'] || 5985).to_i
|
7
|
+
@shell = VagrantWindows::Communication::WinRMShell.new(
|
8
|
+
"127.0.0.1", "vagrant", "vagrant", { port: port })
|
9
9
|
@guestnetwork = VagrantWindows::Communication::GuestNetwork.new(@shell)
|
10
10
|
end
|
11
11
|
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'vagrant-windows/communication/linux_command_filter'
|
3
|
+
|
4
|
+
describe VagrantWindows::Communication::LinuxCommandFilter, :unit => true do
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
@cmd_filter = VagrantWindows::Communication::LinuxCommandFilter.new()
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'command filters' do
|
11
|
+
it 'should initialize all command filters in command filters directory' do
|
12
|
+
expect(@cmd_filter.command_filters()).not_to be_empty
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'filter' do
|
17
|
+
it 'should filter out uname commands' do
|
18
|
+
expect(@cmd_filter.filter('uname -s stuff')).to eq('')
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should filter out which commands' do
|
22
|
+
expect(@cmd_filter.filter('which ruby')).to include(
|
23
|
+
'[Array](Get-Command ruby -errorAction SilentlyContinue)')
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should filter out test -d commands' do
|
27
|
+
expect(@cmd_filter.filter('test -d /tmp/dir')).to eq(
|
28
|
+
"if ((Test-Path '/tmp/dir') -and (get-item '/tmp/dir').PSIsContainer) { exit 0 } exit 1")
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should filter out test -f commands' do
|
32
|
+
expect(@cmd_filter.filter('test -f /tmp/file.txt')).to eq(
|
33
|
+
"if ((Test-Path '/tmp/file.txt') -and (!(get-item '/tmp/file.txt').PSIsContainer)) { exit 0 } exit 1")
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should filter out test -x commands' do
|
37
|
+
expect(@cmd_filter.filter('test -x /tmp/file.txt')).to eq(
|
38
|
+
"if ((Test-Path '/tmp/file.txt') -and (!(get-item '/tmp/file.txt').PSIsContainer)) { exit 0 } exit 1")
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should filter out other test commands' do
|
42
|
+
expect(@cmd_filter.filter('test -L /tmp/file.txt')).to eq(
|
43
|
+
"if (Test-Path '/tmp/file.txt') { exit 0 } exit 1")
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'should filter out rm -Rf commands' do
|
47
|
+
expect(@cmd_filter.filter('rm -Rf /some/dir')).to eq(
|
48
|
+
"rm '/some/dir' -recurse -force")
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should filter out rm commands' do
|
52
|
+
expect(@cmd_filter.filter('rm /some/dir')).to eq(
|
53
|
+
"rm '/some/dir' -force")
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should filter out chown commands' do
|
57
|
+
expect(@cmd_filter.filter("chown -R root '/tmp/dir'")).to eq('')
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should filter out chmod commands' do
|
61
|
+
expect(@cmd_filter.filter("chmod 0600 ~/.ssh/authorized_keys")).to eq('')
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should filter out certain cat commands' do
|
65
|
+
expect(@cmd_filter.filter("cat /etc/release | grep -i OmniOS")).to eq('')
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should not filter out other cat commands' do
|
69
|
+
expect(@cmd_filter.filter("cat /tmp/somefile")).to eq('cat /tmp/somefile')
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
@@ -3,10 +3,10 @@ require 'spec_helper'
|
|
3
3
|
describe VagrantWindows::Communication::WinRMCommunicator, :integration => true do
|
4
4
|
|
5
5
|
before(:all) do
|
6
|
-
# This test requires you already have a running Windows Server 2008 R2 Vagrant VM
|
7
|
-
# Not ideal, but you have to start somewhere
|
8
6
|
@communicator = VagrantWindows::Communication::WinRMCommunicator.new({})
|
9
|
-
|
7
|
+
port = (ENV['WINRM_PORT'] || 5985).to_i
|
8
|
+
@communicator.winrmshell = VagrantWindows::Communication::WinRMShell.new(
|
9
|
+
"127.0.0.1", "vagrant", "vagrant", { port: port })
|
10
10
|
end
|
11
11
|
|
12
12
|
describe "execute" do
|
@@ -28,20 +28,69 @@ describe VagrantWindows::Communication::WinRMCommunicator, :integration => true
|
|
28
28
|
it "should upload the file and overwrite it if it exists" do
|
29
29
|
test_file = Tempfile.new("uploadtest")
|
30
30
|
IO.write(test_file, "hello world")
|
31
|
-
@communicator.upload(test_file, "c
|
31
|
+
@communicator.upload(test_file, "c:/tmp/winrm-test/vagrantuploadtest.txt")
|
32
32
|
|
33
33
|
# ensure we can overwrite
|
34
34
|
IO.write(test_file, "goodbye cruel world")
|
35
|
-
@communicator.upload(test_file, "c
|
35
|
+
@communicator.upload(test_file, "c:/tmp/winrm-test/vagrantuploadtest.txt")
|
36
36
|
|
37
37
|
# get the uploaded file's contents to ensure it uploaded properly
|
38
38
|
uploaded_file_content = ''
|
39
|
-
@communicator.execute("cat c
|
39
|
+
@communicator.execute("cat c:/tmp/winrm-test/vagrantuploadtest.txt", {}) do |type, line|
|
40
40
|
uploaded_file_content = uploaded_file_content + line
|
41
41
|
end
|
42
42
|
|
43
43
|
expect(uploaded_file_content.chomp).to eq("goodbye cruel world")
|
44
44
|
end
|
45
|
+
|
46
|
+
it "should recursively upload directories" do
|
47
|
+
# create a some test data
|
48
|
+
host_src_dir = Dir.mktmpdir("winrm_comm")
|
49
|
+
|
50
|
+
begin
|
51
|
+
IO.write(File.join(host_src_dir, 'root.txt'), "root\n")
|
52
|
+
|
53
|
+
subdir2 = File.join(host_src_dir, '/subdir1/subdir2')
|
54
|
+
FileUtils.mkdir_p(subdir2)
|
55
|
+
|
56
|
+
IO.write(File.join(subdir2, 'leaf1.txt'), "leaf1\n")
|
57
|
+
IO.write(File.join(subdir2, 'leaf2.txt'), "leaf2\n")
|
58
|
+
|
59
|
+
@communicator.upload(host_src_dir, '/tmp/winrm-test-upload') #c:\tmp\winrm-test-upload
|
60
|
+
|
61
|
+
@communicator.execute <<-EOH
|
62
|
+
function AssertExists($p) {
|
63
|
+
if (!(Test-Path $p)) {
|
64
|
+
exit 1
|
65
|
+
}
|
66
|
+
}
|
67
|
+
|
68
|
+
AssertExists 'c:/tmp/winrm-test-upload/root.txt'
|
69
|
+
AssertExists 'c:/tmp/winrm-test-upload/subdir1/subdir2/leaf2.txt'
|
70
|
+
AssertExists 'c:/tmp/winrm-test-upload/subdir1/subdir2/leaf1.txt'
|
71
|
+
EOH
|
72
|
+
ensure
|
73
|
+
FileUtils.remove_entry_secure host_src_dir
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe 'test' do
|
79
|
+
it "should return true if directory exists" do
|
80
|
+
@communicator.execute('mkdir -p /tmp/winrm-test/1')
|
81
|
+
expect(@communicator.test('test -d /tmp/winrm-test/1')).to be_true
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should return false if directory does not exist" do
|
85
|
+
expect(@communicator.test('test -d /tmp/winrm-test/doesnotexit')).to be_false
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should differentiate between directories and files" do
|
89
|
+
@communicator.execute('mkdir -p /tmp/winrm-test/2')
|
90
|
+
@communicator.execute('Add-Content /tmp/winrm-test/2/file.txt "The content"')
|
91
|
+
expect(@communicator.test('test -d /tmp/winrm-test/2/file.txt')).to be_false
|
92
|
+
expect(@communicator.test('test -f /tmp/winrm-test/2/file.txt')).to be_true
|
93
|
+
end
|
45
94
|
end
|
46
95
|
|
47
96
|
end
|
@@ -3,9 +3,9 @@ require 'spec_helper'
|
|
3
3
|
describe VagrantWindows::Communication::WinRMShell, :integration => true do
|
4
4
|
|
5
5
|
before(:all) do
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
port = (ENV['WINRM_PORT'] || 5985).to_i
|
7
|
+
@shell = VagrantWindows::Communication::WinRMShell.new(
|
8
|
+
"127.0.0.1", "vagrant", "vagrant", { port: port })
|
9
9
|
end
|
10
10
|
|
11
11
|
describe "powershell" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-windows
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.7.0.pre.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Morton
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-04-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: winrm
|
@@ -105,8 +105,17 @@ extra_rdoc_files: []
|
|
105
105
|
files:
|
106
106
|
- CHANGELOG.md
|
107
107
|
- Gemfile
|
108
|
+
- lib/vagrant-windows/communication/command_filters/cat.rb
|
109
|
+
- lib/vagrant-windows/communication/command_filters/chmod.rb
|
110
|
+
- lib/vagrant-windows/communication/command_filters/chown.rb
|
111
|
+
- lib/vagrant-windows/communication/command_filters/rm.rb
|
112
|
+
- lib/vagrant-windows/communication/command_filters/test.rb
|
113
|
+
- lib/vagrant-windows/communication/command_filters/uname.rb
|
114
|
+
- lib/vagrant-windows/communication/command_filters/which.rb
|
108
115
|
- lib/vagrant-windows/communication/guestnetwork.rb
|
116
|
+
- lib/vagrant-windows/communication/linux_command_filter.rb
|
109
117
|
- lib/vagrant-windows/communication/winrmcommunicator.rb
|
118
|
+
- lib/vagrant-windows/communication/winrmfilemanager.rb
|
110
119
|
- lib/vagrant-windows/communication/winrmfinder.rb
|
111
120
|
- lib/vagrant-windows/communication/winrmshell.rb
|
112
121
|
- lib/vagrant-windows/communication/winrmshell_factory.rb
|
@@ -130,10 +139,7 @@ files:
|
|
130
139
|
- lib/vagrant-windows/monkey_patches/plugins/provisioners/shell/provisioner.rb
|
131
140
|
- lib/vagrant-windows/plugin.rb
|
132
141
|
- lib/vagrant-windows/provisioners/chef_command_builder.rb
|
133
|
-
- lib/vagrant-windows/scripts/
|
134
|
-
- lib/vagrant-windows/scripts/cheftask.xml.erb
|
135
|
-
- lib/vagrant-windows/scripts/cheftaskrun.ps1.erb
|
136
|
-
- lib/vagrant-windows/scripts/command_alias.ps1
|
142
|
+
- lib/vagrant-windows/scripts/elevated_shell.ps1.erb
|
137
143
|
- lib/vagrant-windows/scripts/mount_volume.ps1.erb
|
138
144
|
- lib/vagrant-windows/scripts/reboot_detect.ps1
|
139
145
|
- lib/vagrant-windows/scripts/set_work_network.ps1
|
@@ -149,6 +155,7 @@ files:
|
|
149
155
|
- spec/vagrant-windows/chef_command_builder_spec.rb
|
150
156
|
- spec/vagrant-windows/guestnetwork_spec.rb
|
151
157
|
- spec/vagrant-windows/helper_spec.rb
|
158
|
+
- spec/vagrant-windows/linux_command_filter_spec.rb
|
152
159
|
- spec/vagrant-windows/mount_shared_folder_spec.rb
|
153
160
|
- spec/vagrant-windows/windows_config_spec.rb
|
154
161
|
- spec/vagrant-windows/windows_machine_spec.rb
|
@@ -174,9 +181,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
174
181
|
version: '0'
|
175
182
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
176
183
|
requirements:
|
177
|
-
- - '
|
184
|
+
- - '>'
|
178
185
|
- !ruby/object:Gem::Version
|
179
|
-
version:
|
186
|
+
version: 1.3.1
|
180
187
|
requirements: []
|
181
188
|
rubyforge_project:
|
182
189
|
rubygems_version: 2.0.14
|
@@ -189,6 +196,7 @@ test_files:
|
|
189
196
|
- spec/vagrant-windows/chef_command_builder_spec.rb
|
190
197
|
- spec/vagrant-windows/guestnetwork_spec.rb
|
191
198
|
- spec/vagrant-windows/helper_spec.rb
|
199
|
+
- spec/vagrant-windows/linux_command_filter_spec.rb
|
192
200
|
- spec/vagrant-windows/mount_shared_folder_spec.rb
|
193
201
|
- spec/vagrant-windows/windows_config_spec.rb
|
194
202
|
- spec/vagrant-windows/windows_machine_spec.rb
|
@@ -1,48 +0,0 @@
|
|
1
|
-
# kill the task so we can recreate it
|
2
|
-
schtasks /delete /tn "chef-solo" /f 2>&1 | out-null
|
3
|
-
|
4
|
-
# Ensure the chef task running file doesn't exist from a previous failure
|
5
|
-
if (Test-Path "<%= options[:chef_task_running] %>") {
|
6
|
-
del "<%= options[:chef_task_running] %>"
|
7
|
-
}
|
8
|
-
|
9
|
-
# schedule the task to run once in the far distant future
|
10
|
-
schtasks /create /tn 'chef-solo' /xml '<%= options[:chef_task_xml] %>' /ru '<%= options[:user] %>' /rp '<%= options[:pass] %>' | Out-Null
|
11
|
-
|
12
|
-
# start the scheduled task right now
|
13
|
-
schtasks /run /tn "chef-solo" | Out-Null
|
14
|
-
|
15
|
-
# wait for run_chef.ps1 to start or timeout after 1 minute
|
16
|
-
$timeoutSeconds = 60
|
17
|
-
$elapsedSeconds = 0
|
18
|
-
while ( (!(Test-Path "<%= options[:chef_task_running] %>")) -and ($elapsedSeconds -lt $timeoutSeconds) ) {
|
19
|
-
Start-Sleep -s 1
|
20
|
-
$elapsedSeconds++
|
21
|
-
}
|
22
|
-
|
23
|
-
if ($elapsedSeconds -ge $timeoutSeconds) {
|
24
|
-
Write-Error "Timed out waiting for chef scheduled task to start"
|
25
|
-
exit -2
|
26
|
-
}
|
27
|
-
|
28
|
-
# read the entire file, but only write out new lines we haven't seen before
|
29
|
-
$numLinesRead = 0
|
30
|
-
$success = $TRUE
|
31
|
-
while (Test-Path "<%= options[:chef_task_running] %>") {
|
32
|
-
Start-Sleep -m 100
|
33
|
-
|
34
|
-
if (Test-Path "<%= options[:chef_stdout_log] %>") {
|
35
|
-
$text = (get-content "<%= options[:chef_stdout_log] %>")
|
36
|
-
$numLines = ($text | Measure-Object -line).lines
|
37
|
-
$numLinesToRead = $numLines - $numLinesRead
|
38
|
-
|
39
|
-
if ($numLinesToRead -gt 0) {
|
40
|
-
$text | select -first $numLinesToRead -skip $numLinesRead | ForEach {
|
41
|
-
Write-Host "$_"
|
42
|
-
}
|
43
|
-
$numLinesRead += $numLinesToRead
|
44
|
-
}
|
45
|
-
}
|
46
|
-
}
|
47
|
-
|
48
|
-
exit Get-Content "<%= options[:chef_task_exitcode] %>"
|
@@ -1,45 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-16"?>
|
2
|
-
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
|
3
|
-
<RegistrationInfo>
|
4
|
-
<Date>2013-06-21T22:41:43</Date>
|
5
|
-
<Author>Administrator</Author>
|
6
|
-
</RegistrationInfo>
|
7
|
-
<Triggers>
|
8
|
-
<TimeTrigger>
|
9
|
-
<StartBoundary>2045-01-01T12:00:00</StartBoundary>
|
10
|
-
<Enabled>true</Enabled>
|
11
|
-
</TimeTrigger>
|
12
|
-
</Triggers>
|
13
|
-
<Principals>
|
14
|
-
<Principal id="Author">
|
15
|
-
<UserId>vagrant</UserId>
|
16
|
-
<LogonType>Password</LogonType>
|
17
|
-
<RunLevel>HighestAvailable</RunLevel>
|
18
|
-
</Principal>
|
19
|
-
</Principals>
|
20
|
-
<Settings>
|
21
|
-
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
|
22
|
-
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
|
23
|
-
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
|
24
|
-
<AllowHardTerminate>true</AllowHardTerminate>
|
25
|
-
<StartWhenAvailable>false</StartWhenAvailable>
|
26
|
-
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
|
27
|
-
<IdleSettings>
|
28
|
-
<StopOnIdleEnd>true</StopOnIdleEnd>
|
29
|
-
<RestartOnIdle>false</RestartOnIdle>
|
30
|
-
</IdleSettings>
|
31
|
-
<AllowStartOnDemand>true</AllowStartOnDemand>
|
32
|
-
<Enabled>true</Enabled>
|
33
|
-
<Hidden>false</Hidden>
|
34
|
-
<RunOnlyIfIdle>false</RunOnlyIfIdle>
|
35
|
-
<WakeToRun>false</WakeToRun>
|
36
|
-
<ExecutionTimeLimit>PT2H</ExecutionTimeLimit>
|
37
|
-
<Priority>4</Priority>
|
38
|
-
</Settings>
|
39
|
-
<Actions Context="Author">
|
40
|
-
<Exec>
|
41
|
-
<Command>powershell</Command>
|
42
|
-
<Arguments>-file <%= options[:chef_task_run_ps1] %></Arguments>
|
43
|
-
</Exec>
|
44
|
-
</Actions>
|
45
|
-
</Task>
|
@@ -1,18 +0,0 @@
|
|
1
|
-
$exitCode = -1
|
2
|
-
Set-ExecutionPolicy Unrestricted -force;
|
3
|
-
|
4
|
-
Try
|
5
|
-
{
|
6
|
-
"running" | Out-File "<%= options[:chef_task_running] %>"
|
7
|
-
$process = (Start-Process "<%= options[:chef_binary_path] %>" -ArgumentList "<%= options[:chef_arguments] %>" -NoNewWindow -PassThru -Wait -RedirectStandardOutput "<%= options[:chef_stdout_log] %>" -RedirectStandardError "<%= options[:chef_stderr_log] %>")
|
8
|
-
$exitCode = $process.ExitCode
|
9
|
-
}
|
10
|
-
Finally
|
11
|
-
{
|
12
|
-
$exitCode | Out-File "<%= options[:chef_task_exitcode] %>"
|
13
|
-
if (Test-Path "<%= options[:chef_task_running] %>") {
|
14
|
-
del "<%= options[:chef_task_running] %>"
|
15
|
-
}
|
16
|
-
}
|
17
|
-
|
18
|
-
exit $exitCode
|