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:
parent
889dfc4374
commit
e47f6137e5
2 changed files with 24 additions and 17 deletions
|
@ -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
|
||||||
|
|
|
@ -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 *
|
||||||
|
|
Loading…
Reference in a new issue