mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
Expand tilde remotely in action plugins
This commit is contained in:
parent
fa953e162e
commit
bc4272d2a2
7 changed files with 33 additions and 4 deletions
|
@ -1159,6 +1159,27 @@ class Runner(object):
|
|||
|
||||
# *****************************************************
|
||||
|
||||
def _remote_expand_user(self, conn, path, tmp):
|
||||
''' takes a remote path and performs tilde expansion on the remote host '''
|
||||
if not path.startswith('~'):
|
||||
return path
|
||||
split_path = path.split(os.path.sep, 1)
|
||||
cmd = conn.shell.expand_user(split_path[0])
|
||||
data = self._low_level_exec_command(conn, cmd, tmp, sudoable=False, su=False)
|
||||
initial_fragment = utils.last_non_blank_line(data['stdout'])
|
||||
|
||||
if not initial_fragment:
|
||||
# Something went wrong trying to expand the path remotely. Return
|
||||
# the original string
|
||||
return path
|
||||
|
||||
if len(split_path) > 1:
|
||||
return os.path.join(initial_fragment, *split_path[1:])
|
||||
else:
|
||||
return initial_fragment
|
||||
|
||||
# *****************************************************
|
||||
|
||||
def _remote_checksum(self, conn, tmp, path, inject):
|
||||
''' takes a remote checksum and returns 1 if no file '''
|
||||
python_interp = inject['hostvars'][inject['inventory_hostname']].get('ansible_python_interpreter', 'python')
|
||||
|
|
|
@ -109,6 +109,7 @@ class ActionModule(object):
|
|||
path = self._assemble_from_fragments(src, delimiter, _re)
|
||||
|
||||
path_checksum = utils.checksum_s(path)
|
||||
dest = self.runner._remote_expand_user(conn, dest, tmp)
|
||||
remote_checksum = self.runner._remote_checksum(conn, tmp, dest, inject)
|
||||
|
||||
if path_checksum != remote_checksum:
|
||||
|
|
|
@ -157,6 +157,9 @@ class ActionModule(object):
|
|||
if "-tmp-" not in tmp_path:
|
||||
tmp_path = self.runner._make_tmp_path(conn)
|
||||
|
||||
# expand any user home dir specifier
|
||||
dest = self.runner._remote_expand_user(conn, dest, tmp_path)
|
||||
|
||||
for source_full, source_rel in source_files:
|
||||
# Generate a hash of the local file.
|
||||
local_checksum = utils.checksum(source_full)
|
||||
|
|
|
@ -71,6 +71,7 @@ class ActionModule(object):
|
|||
return ReturnData(conn=conn, result=results)
|
||||
|
||||
source = conn.shell.join_path(source)
|
||||
source = self.runner._remote_expand_user(conn, source, tmp)
|
||||
|
||||
# calculate checksum for the remote file
|
||||
remote_checksum = self.runner._remote_checksum(conn, tmp, source, inject)
|
||||
|
|
|
@ -75,6 +75,8 @@ class ActionModule(object):
|
|||
else:
|
||||
source = utils.path_dwim(self.runner.basedir, source)
|
||||
|
||||
# Expand any user home dir specification
|
||||
dest = self.runner._remote_expand_user(conn, dest, tmp)
|
||||
|
||||
if dest.endswith("/"): # CCTODO: Fix path for Windows hosts.
|
||||
base = os.path.basename(source)
|
||||
|
|
|
@ -54,7 +54,7 @@ class ActionModule(object):
|
|||
result = dict(failed=True, msg="src (or content) and dest are required")
|
||||
return ReturnData(conn=conn, result=result)
|
||||
|
||||
dest = os.path.expanduser(dest) # CCTODO: Fix path for Windows hosts.
|
||||
dest = self.runner._remote_expand_user(conn, dest, tmp) # CCTODO: Fix path for Windows hosts.
|
||||
source = template.template(self.runner.basedir, os.path.expanduser(source), inject)
|
||||
if copy:
|
||||
if '_original_file' in inject:
|
||||
|
|
|
@ -37,12 +37,10 @@ class ShellModule(object):
|
|||
return path.endswith('/')
|
||||
|
||||
def chmod(self, mode, path):
|
||||
#path = os.path.expanduser(path)
|
||||
path = pipes.quote(path)
|
||||
return 'chmod %s %s' % (mode, path)
|
||||
|
||||
def remove(self, path, recurse=False):
|
||||
#path = os.path.expanduser(path)
|
||||
path = pipes.quote(path)
|
||||
if recurse:
|
||||
return "rm -rf %s >/dev/null 2>&1" % path
|
||||
|
@ -61,8 +59,11 @@ class ShellModule(object):
|
|||
cmd += ' && echo %s' % basetmp
|
||||
return cmd
|
||||
|
||||
def expand_user(self, user_path):
|
||||
# Quote the user portion but leave the tilde to be expanded
|
||||
return 'echo ~%s' % pipes.quote(user_path[1:])
|
||||
|
||||
def checksum(self, path, python_interp):
|
||||
#path = os.path.expanduser(path)
|
||||
path = pipes.quote(path)
|
||||
# The following test needs to be SH-compliant. BASH-isms will
|
||||
# not work if /bin/sh points to a non-BASH shell.
|
||||
|
|
Loading…
Reference in a new issue