Skip to content

Commit

Permalink
Merge pull request ansible#9688 from cchurch/fix_win_fetch
Browse files Browse the repository at this point in the history
Fixes for fetch module when connecting to Windows hosts
  • Loading branch information
cchurch committed Dec 2, 2014
2 parents 2b11c2b + de267b5 commit 2bf2695
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 8 deletions.
2 changes: 1 addition & 1 deletion lib/ansible/runner/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -1207,7 +1207,7 @@ def _remote_expand_user(self, conn, path, tmp):
return path

if len(split_path) > 1:
return os.path.join(initial_fragment, *split_path[1:])
return conn.shell.join_path(initial_fragment, *split_path[1:])
else:
return initial_fragment

Expand Down
2 changes: 1 addition & 1 deletion lib/ansible/runner/connection_plugins/winrm.py
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ def put_file(self, in_path, out_path):
def fetch_file(self, in_path, out_path):
out_path = out_path.replace('\\', '/')
vvv("FETCH %s TO %s" % (in_path, out_path), host=self.host)
buffer_size = 2**20 # 1MB chunks
buffer_size = 2**19 # 0.5MB chunks
if not os.path.exists(os.path.dirname(out_path)):
os.makedirs(os.path.dirname(out_path))
out_file = None
Expand Down
16 changes: 14 additions & 2 deletions lib/ansible/runner/shell_plugins/powershell.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,12 +84,24 @@ def mkdtemp(self, basefile, system=False, mode=None):
# FIXME: Support system temp path!
return _encode_script('''(New-Item -Type Directory -Path $env:temp -Name "%s").FullName | Write-Host -Separator '';''' % basefile)

def md5(self, path):
def expand_user(self, user_home_path):
# PowerShell only supports "~" (not "~username"). Resolve-Path ~ does
# not seem to work remotely, though by default we are always starting
# in the user's home directory.
if user_home_path == '~':
script = 'Write-Host (Get-Location).Path'
elif user_home_path.startswith('~\\'):
script = 'Write-Host ((Get-Location).Path + "%s")' % _escape(user_home_path[1:])
else:
script = 'Write-Host "%s"' % _escape(user_home_path)
return _encode_script(script)

def checksum(self, path, python_interp):
path = _escape(path)
script = '''
If (Test-Path -PathType Leaf "%(path)s")
{
$sp = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider;
$sp = new-object -TypeName System.Security.Cryptography.SHA1CryptoServiceProvider;
$fp = [System.IO.File]::Open("%(path)s", [System.IO.Filemode]::Open, [System.IO.FileAccess]::Read);
[System.BitConverter]::ToString($sp.ComputeHash($fp)).Replace("-", "").ToLower();
$fp.Dispose();
Expand Down
9 changes: 5 additions & 4 deletions test/integration/roles/test_win_fetch/tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@

- name: clean out the test directory
local_action: file name={{ output_dir|mandatory }} state=absent
tags: me
run_once: true

- name: create the test directory
local_action: file name={{ output_dir }} state=directory
tags: me
run_once: true

- name: fetch a small file
fetch: src="C:/Windows/win.ini" dest={{ output_dir }}
Expand Down Expand Up @@ -145,7 +145,7 @@
- "not fetch_missing_nofail|changed"

- name: attempt to fetch a non-existent file - fail on missing
fetch: src="C:/this_file_should_not_exist.txt" dest={{ output_dir }} fail_on_missing=yes
fetch: src="~/this_file_should_not_exist.txt" dest={{ output_dir }} fail_on_missing=yes
register: fetch_missing
ignore_errors: true

Expand All @@ -164,5 +164,6 @@
- name: check fetch directory result
assert:
that:
- "fetch_dir|failed"
# Doesn't fail anymore, only returns a message.
- "not fetch_dir|changed"
- "fetch_dir.msg"

0 comments on commit 2bf2695

Please sign in to comment.