From 11175781b8b9ecd576f1b228ba035a61a2784401 Mon Sep 17 00:00:00 2001 From: Daniel Hokka Zakrisson Date: Sun, 18 Nov 2012 17:51:01 +0100 Subject: [PATCH] Use slurp for fetch is sudo is enabled and needed Fixes #1020. --- lib/ansible/runner/action_plugins/fetch.py | 23 ++++++++++++++++------ lib/ansible/utils/__init__.py | 7 +++++++ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/lib/ansible/runner/action_plugins/fetch.py b/lib/ansible/runner/action_plugins/fetch.py index 48de2949591..912bc99c38d 100644 --- a/lib/ansible/runner/action_plugins/fetch.py +++ b/lib/ansible/runner/action_plugins/fetch.py @@ -20,6 +20,7 @@ import pwd import random import traceback import tempfile +import base64 import ansible.constants as C from ansible import utils @@ -43,11 +44,6 @@ class ActionModule(object): results = dict(failed=True, msg="src and dest are required") return ReturnData(conn=conn, result=results) - # apply templating to source argument - source = utils.template(self.runner.basedir, source, inject) - # apply templating to dest argument - dest = utils.template(self.runner.basedir, dest, inject) - # files are saved in dest dir, with a subdir for each host, then the filename dest = "%s/%s/%s" % (utils.path_dwim(self.runner.basedir, dest), conn.host, source) dest = dest.replace("//","/") @@ -55,6 +51,16 @@ class ActionModule(object): # calculate md5 sum for the remote file remote_md5 = self.runner._remote_md5(conn, tmp, source) + # use slurp if sudo and permissions are lacking + remote_data = None + if remote_md5 in ('1', '2') and self.runner.sudo: + slurpres = self.runner._execute_module(conn, tmp, 'slurp', 'src=%s' % source, inject=inject) + if slurpres.is_successful(): + if slurpres.result['encoding'] == 'base64': + remote_data = base64.b64decode(slurpres.result['content']) + if remote_data is not None: + remote_md5 = utils.md5s(remote_data) + # these don't fail because you may want to transfer a log file that possibly MAY exist # but keep going to fetch other log files if remote_md5 == '0': @@ -76,7 +82,12 @@ class ActionModule(object): os.makedirs(os.path.dirname(dest)) # fetch the file and check for changes - conn.fetch_file(source, dest) + if remote_data is None: + conn.fetch_file(source, dest) + else: + f = open(dest, 'w') + f.write(remote_data) + f.close() new_md5 = utils.md5(dest) if new_md5 != remote_md5: result = dict(failed=True, md5sum=new_md5, msg="md5 mismatch", file=source) diff --git a/lib/ansible/utils/__init__.py b/lib/ansible/utils/__init__.py index 40fd3c9e103..b1c06390c2c 100644 --- a/lib/ansible/utils/__init__.py +++ b/lib/ansible/utils/__init__.py @@ -261,6 +261,13 @@ def parse_kv(args): options[k]=v return options +def md5s(data): + ''' Return MD5 hex digest of data. ''' + + digest = _md5() + digest.update(data) + return digest.hexdigest() + def md5(filename): ''' Return MD5 hex digest of local file, or None if file is not present. '''