mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-04-26 20:31:27 -07: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):
|
def _remote_checksum(self, conn, tmp, path, inject):
|
||||||
''' takes a remote checksum and returns 1 if no file '''
|
''' takes a remote checksum and returns 1 if no file '''
|
||||||
python_interp = inject['hostvars'][inject['inventory_hostname']].get('ansible_python_interpreter', 'python')
|
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 = self._assemble_from_fragments(src, delimiter, _re)
|
||||||
|
|
||||||
path_checksum = utils.checksum_s(path)
|
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)
|
remote_checksum = self.runner._remote_checksum(conn, tmp, dest, inject)
|
||||||
|
|
||||||
if path_checksum != remote_checksum:
|
if path_checksum != remote_checksum:
|
||||||
|
|
|
@ -157,6 +157,9 @@ class ActionModule(object):
|
||||||
if "-tmp-" not in tmp_path:
|
if "-tmp-" not in tmp_path:
|
||||||
tmp_path = self.runner._make_tmp_path(conn)
|
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:
|
for source_full, source_rel in source_files:
|
||||||
# Generate a hash of the local file.
|
# Generate a hash of the local file.
|
||||||
local_checksum = utils.checksum(source_full)
|
local_checksum = utils.checksum(source_full)
|
||||||
|
|
|
@ -71,6 +71,7 @@ class ActionModule(object):
|
||||||
return ReturnData(conn=conn, result=results)
|
return ReturnData(conn=conn, result=results)
|
||||||
|
|
||||||
source = conn.shell.join_path(source)
|
source = conn.shell.join_path(source)
|
||||||
|
source = self.runner._remote_expand_user(conn, source, tmp)
|
||||||
|
|
||||||
# calculate checksum for the remote file
|
# calculate checksum for the remote file
|
||||||
remote_checksum = self.runner._remote_checksum(conn, tmp, source, inject)
|
remote_checksum = self.runner._remote_checksum(conn, tmp, source, inject)
|
||||||
|
|
|
@ -75,6 +75,8 @@ class ActionModule(object):
|
||||||
else:
|
else:
|
||||||
source = utils.path_dwim(self.runner.basedir, source)
|
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.
|
if dest.endswith("/"): # CCTODO: Fix path for Windows hosts.
|
||||||
base = os.path.basename(source)
|
base = os.path.basename(source)
|
||||||
|
|
|
@ -54,7 +54,7 @@ class ActionModule(object):
|
||||||
result = dict(failed=True, msg="src (or content) and dest are required")
|
result = dict(failed=True, msg="src (or content) and dest are required")
|
||||||
return ReturnData(conn=conn, result=result)
|
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)
|
source = template.template(self.runner.basedir, os.path.expanduser(source), inject)
|
||||||
if copy:
|
if copy:
|
||||||
if '_original_file' in inject:
|
if '_original_file' in inject:
|
||||||
|
|
|
@ -37,12 +37,10 @@ class ShellModule(object):
|
||||||
return path.endswith('/')
|
return path.endswith('/')
|
||||||
|
|
||||||
def chmod(self, mode, path):
|
def chmod(self, mode, path):
|
||||||
#path = os.path.expanduser(path)
|
|
||||||
path = pipes.quote(path)
|
path = pipes.quote(path)
|
||||||
return 'chmod %s %s' % (mode, path)
|
return 'chmod %s %s' % (mode, path)
|
||||||
|
|
||||||
def remove(self, path, recurse=False):
|
def remove(self, path, recurse=False):
|
||||||
#path = os.path.expanduser(path)
|
|
||||||
path = pipes.quote(path)
|
path = pipes.quote(path)
|
||||||
if recurse:
|
if recurse:
|
||||||
return "rm -rf %s >/dev/null 2>&1" % path
|
return "rm -rf %s >/dev/null 2>&1" % path
|
||||||
|
@ -61,8 +59,11 @@ class ShellModule(object):
|
||||||
cmd += ' && echo %s' % basetmp
|
cmd += ' && echo %s' % basetmp
|
||||||
return cmd
|
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):
|
def checksum(self, path, python_interp):
|
||||||
#path = os.path.expanduser(path)
|
|
||||||
path = pipes.quote(path)
|
path = pipes.quote(path)
|
||||||
# The following test needs to be SH-compliant. BASH-isms will
|
# The following test needs to be SH-compliant. BASH-isms will
|
||||||
# not work if /bin/sh points to a non-BASH shell.
|
# not work if /bin/sh points to a non-BASH shell.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue