Push the expanduser call on the source down to slurp rather than fetch

Also moves the calculation of the destination file name until after
the slurp of the file contents, since the source as returned by slurp
may now be different, so we want to use that expanded path locally.

Fixes #8942
This commit is contained in:
James Cammarata 2014-09-23 15:19:50 -05:00
parent 889dfc4374
commit e47f6137e5
2 changed files with 24 additions and 17 deletions

View file

@ -56,8 +56,28 @@ class ActionModule(object):
results = dict(failed=True, msg="src and dest are required") results = dict(failed=True, msg="src and dest are required")
return ReturnData(conn=conn, result=results) return ReturnData(conn=conn, result=results)
source = os.path.expanduser(source)
source = conn.shell.join_path(source) source = conn.shell.join_path(source)
# 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') or 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)
# the source path may have been expanded on the
# target system, so we compare it here and use the
# expanded version if it's different
remote_source = slurpres.result.get('source')
if remote_source and remote_source != source:
source = remote_source
# calculate the destination name
if os.path.sep not in conn.shell.join_path('a', ''): if os.path.sep not in conn.shell.join_path('a', ''):
source_local = source.replace('\\', '/') source_local = source.replace('\\', '/')
else: else:
@ -76,20 +96,7 @@ class ActionModule(object):
# files are saved in dest dir, with a subdir for each host, then the filename # 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_local) dest = "%s/%s/%s" % (utils.path_dwim(self.runner.basedir, dest), conn.host, source_local)
dest = os.path.expanduser(dest.replace("//","/")) dest = dest.replace("//","/")
# 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') or 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 # 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 # but keep going to fetch other log files

View file

@ -57,7 +57,7 @@ def main():
), ),
supports_check_mode=True supports_check_mode=True
) )
source = module.params['src'] source = os.path.expanduser(module.params['src'])
if not os.path.exists(source): if not os.path.exists(source):
module.fail_json(msg="file not found: %s" % source) module.fail_json(msg="file not found: %s" % source)
@ -66,7 +66,7 @@ def main():
data = base64.b64encode(file(source).read()) data = base64.b64encode(file(source).read())
module.exit_json(content=data, encoding='base64') module.exit_json(content=data, source=source, encoding='base64')
# import module snippets # import module snippets
from ansible.module_utils.basic import * from ansible.module_utils.basic import *