mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
Fix quoting of shell parameters used in remote_checksum and add integration test to detect the error
Fixes #682
This commit is contained in:
parent
1011530a34
commit
364f772cc5
3 changed files with 35 additions and 8 deletions
|
@ -79,7 +79,6 @@ class ShellModule(object):
|
|||
return 'echo %s' % user_home_path
|
||||
|
||||
def checksum(self, path, python_interp):
|
||||
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.
|
||||
#
|
||||
|
@ -97,14 +96,14 @@ class ShellModule(object):
|
|||
# 0. This logic is added to the end of the cmd at the bottom of this
|
||||
# function.
|
||||
|
||||
test = "rc=flag; [ -r \"%(p)s\" ] || rc=2; [ -f \"%(p)s\" ] || rc=1; [ -d \"%(p)s\" ] && rc=3; %(i)s -V 2>/dev/null || rc=4; [ x\"$rc\" != \"xflag\" ] && echo \"${rc} %(p)s\" && exit 0" % dict(p=path, i=python_interp)
|
||||
test = "rc=flag; [ -r \'%(p)s\' ] || rc=2; [ -f \'%(p)s\' ] || rc=1; [ -d \'%(p)s\' ] && rc=3; %(i)s -V 2>/dev/null || rc=4; [ x\"$rc\" != \"xflag\" ] && echo \"${rc}\"\' %(p)s\' && exit 0" % dict(p=path, i=python_interp)
|
||||
csums = [
|
||||
"(%s -c 'import hashlib; print(hashlib.sha1(open(\"%s\", \"rb\").read()).hexdigest())' 2>/dev/null)" % (python_interp, path), # Python > 2.4 (including python3)
|
||||
"(%s -c 'import sha; print(sha.sha(open(\"%s\", \"rb\").read()).hexdigest())' 2>/dev/null)" % (python_interp, path), # Python == 2.4
|
||||
]
|
||||
|
||||
cmd = " || ".join(csums)
|
||||
cmd = "%s; %s || (echo \"0 %s\")" % (test, cmd, path)
|
||||
cmd = "%s; %s || (echo \'0 %s\')" % (test, cmd, path)
|
||||
return cmd
|
||||
|
||||
def build_module_command(self, env_string, shebang, cmd, rm_tmp=None):
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
when: ansible_pkg_mgr == 'yum'
|
||||
|
||||
- name: Ensure zip is present to create test archive (apt)
|
||||
yum: name=zip state=latest
|
||||
apt: name=zip state=latest
|
||||
when: ansible_pkg_mgr == 'apt'
|
||||
|
||||
- name: prep our file
|
||||
|
@ -196,5 +196,34 @@
|
|||
- "unarchive07.changed == false"
|
||||
|
||||
- name: remove our tar.gz unarchive destination
|
||||
file: path={{output_dir}}/test-unarchive-tar-gz state=absent
|
||||
file: path={{ output_dir }}/test-unarchive-tar-gz state=absent
|
||||
|
||||
- name: create a directory with quotable chars
|
||||
file: path="{{ output_dir }}/test-quotes~root" state=directory
|
||||
|
||||
- name: unarchive into directory with quotable chars
|
||||
unarchive:
|
||||
src: "{{ output_dir }}/test-unarchive.tar.gz"
|
||||
dest: "{{ output_dir | expanduser }}/test-quotes~root"
|
||||
copy: no
|
||||
register: unarchive08
|
||||
|
||||
- name: Test that unarchive succeeded
|
||||
assert:
|
||||
that:
|
||||
- "unarchive08.changed == true"
|
||||
|
||||
- name: unarchive into directory with quotable chars a second time
|
||||
unarchive:
|
||||
src: "{{ output_dir }}/test-unarchive.tar.gz"
|
||||
dest: "{{ output_dir | expanduser }}/test-quotes~root"
|
||||
copy: no
|
||||
register: unarchive09
|
||||
|
||||
- name: Test that unarchive did nothing
|
||||
assert:
|
||||
that:
|
||||
- "unarchive09.changed == false"
|
||||
|
||||
- name: remove quotable chars test
|
||||
file: path="{{ output_dir }}/test-quotes~root" state=absent
|
||||
|
|
|
@ -79,7 +79,6 @@ class ShellModule(object):
|
|||
return 'echo %s' % user_home_path
|
||||
|
||||
def checksum(self, path, python_interp):
|
||||
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.
|
||||
#
|
||||
|
@ -97,14 +96,14 @@ class ShellModule(object):
|
|||
# 0. This logic is added to the end of the cmd at the bottom of this
|
||||
# function.
|
||||
|
||||
test = "rc=flag; [ -r \"%(p)s\" ] || rc=2; [ -f \"%(p)s\" ] || rc=1; [ -d \"%(p)s\" ] && rc=3; %(i)s -V 2>/dev/null || rc=4; [ x\"$rc\" != \"xflag\" ] && echo \"${rc} %(p)s\" && exit 0" % dict(p=path, i=python_interp)
|
||||
test = "rc=flag; [ -r \'%(p)s\' ] || rc=2; [ -f \'%(p)s\' ] || rc=1; [ -d \'%(p)s\' ] && rc=3; %(i)s -V 2>/dev/null || rc=4; [ x\"$rc\" != \"xflag\" ] && echo \"${rc}\"\' %(p)s\' && exit 0" % dict(p=path, i=python_interp)
|
||||
csums = [
|
||||
"(%s -c 'import hashlib; print(hashlib.sha1(open(\"%s\", \"rb\").read()).hexdigest())' 2>/dev/null)" % (python_interp, path), # Python > 2.4 (including python3)
|
||||
"(%s -c 'import sha; print(sha.sha(open(\"%s\", \"rb\").read()).hexdigest())' 2>/dev/null)" % (python_interp, path), # Python == 2.4
|
||||
]
|
||||
|
||||
cmd = " || ".join(csums)
|
||||
cmd = "%s; %s || (echo \"0 %s\")" % (test, cmd, path)
|
||||
cmd = "%s; %s || (echo \'0 %s\')" % (test, cmd, path)
|
||||
return cmd
|
||||
|
||||
def build_module_command(self, env_string, shebang, cmd, rm_tmp=None):
|
||||
|
|
Loading…
Reference in a new issue