From de267b56557f36c93c9f90a89796bdd58c1ca84d Mon Sep 17 00:00:00 2001 From: Chris Church Date: Mon, 1 Dec 2014 22:18:35 -0500 Subject: [PATCH] Fix PowerShell plugin issues affecting fetch module when used against Windows hosts. --- lib/ansible/runner/__init__.py | 2 +- lib/ansible/runner/connection_plugins/winrm.py | 2 +- lib/ansible/runner/shell_plugins/powershell.py | 16 ++++++++++++++-- .../roles/test_win_fetch/tasks/main.yml | 9 +++++---- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/lib/ansible/runner/__init__.py b/lib/ansible/runner/__init__.py index ce61e7d90f..0254449e7d 100644 --- a/lib/ansible/runner/__init__.py +++ b/lib/ansible/runner/__init__.py @@ -1193,7 +1193,7 @@ class Runner(object): 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 diff --git a/lib/ansible/runner/connection_plugins/winrm.py b/lib/ansible/runner/connection_plugins/winrm.py index d6e51710b5..7a761e69b2 100644 --- a/lib/ansible/runner/connection_plugins/winrm.py +++ b/lib/ansible/runner/connection_plugins/winrm.py @@ -193,7 +193,7 @@ class Connection(object): 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 diff --git a/lib/ansible/runner/shell_plugins/powershell.py b/lib/ansible/runner/shell_plugins/powershell.py index 7254df6f7e..0125721c64 100644 --- a/lib/ansible/runner/shell_plugins/powershell.py +++ b/lib/ansible/runner/shell_plugins/powershell.py @@ -84,12 +84,24 @@ class ShellModule(object): # 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(); diff --git a/test/integration/roles/test_win_fetch/tasks/main.yml b/test/integration/roles/test_win_fetch/tasks/main.yml index b07b681bdd..8c0f5aa21f 100644 --- a/test/integration/roles/test_win_fetch/tasks/main.yml +++ b/test/integration/roles/test_win_fetch/tasks/main.yml @@ -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 }} @@ -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 @@ -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"