[unarchive] work on older RHEL with group: <gid> (#72098)

Change:
- No longer fail due to old Fedora/RHEL and our failure to try to cast
  gids to integers before trying to pass them to getgrgid() before
  trying to use them.
- Add tests for user/mode for various unarchive formats.

Test Plan:
- New integration tests, ran against centos6 container

Tickets:
- Fixes #71903
pull/72138/head
Rick Elrod 4 years ago committed by GitHub
parent a90e37d017
commit ebc91a9b93
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -0,0 +1,2 @@
bugfixes:
- unarchive - ``zip`` unarchive no longer errors on RHEL/CentOS 6 and old Fedora when attempting to use a numeric gid (https://github.com/ansible/ansible/issues/71903).

@ -332,8 +332,8 @@ class ZipArchive(object):
tpw = pwd.getpwnam(self.file_args['owner']) tpw = pwd.getpwnam(self.file_args['owner'])
except KeyError: except KeyError:
try: try:
tpw = pwd.getpwuid(self.file_args['owner']) tpw = pwd.getpwuid(int(self.file_args['owner']))
except (TypeError, KeyError): except (TypeError, KeyError, ValueError):
tpw = pwd.getpwuid(run_uid) tpw = pwd.getpwuid(run_uid)
fut_owner = tpw.pw_name fut_owner = tpw.pw_name
fut_uid = tpw.pw_uid fut_uid = tpw.pw_uid
@ -351,7 +351,9 @@ class ZipArchive(object):
tgr = grp.getgrnam(self.file_args['group']) tgr = grp.getgrnam(self.file_args['group'])
except (ValueError, KeyError): except (ValueError, KeyError):
try: try:
tgr = grp.getgrgid(self.file_args['group']) # no need to check isdigit() explicitly here, if we fail to
# parse, the ValueError will be caught.
tgr = grp.getgrgid(int(self.file_args['group']))
except (KeyError, ValueError, OverflowError): except (KeyError, ValueError, OverflowError):
tgr = grp.getgrgid(run_gid) tgr = grp.getgrgid(run_gid)
fut_group = tgr.gr_name fut_group = tgr.gr_name

@ -0,0 +1,162 @@
- block:
- name: Create a group to chown to
group:
name: testgroup
register: testgroup
- name: Create a user to chown to
user:
name: testuser
groups:
- testgroup
register: testuser
- set_fact:
outdir: '{{remote_tmp_dir}}/test-unarchive-{{ ext | replace(".", "_") }}'
- debug:
msg: Username test
# username
- name: create our unarchive destinations
file:
path: '{{outdir}}'
state: directory
- name: unarchive a file
unarchive:
src: '{{remote_tmp_dir}}/{{archive}}'
dest: '{{outdir}}'
list_files: True
remote_src: yes
owner: testuser
- name: stat an output file
stat:
path: '{{outdir}}/{{testfile}}'
register: stat
- name: verify that the file has the right owner
assert:
that:
- stat.stat.exists
- stat.stat.pw_name == testuser.name
- stat.stat.uid == testuser.uid
- name: nuke destination
file:
path: '{{outdir}}'
state: absent
- debug:
msg: uid test
# uid
- name: create our unarchive destinations
file:
path: '{{outdir}}'
state: directory
- name: unarchive a file
unarchive:
src: '{{remote_tmp_dir}}/{{archive}}'
dest: '{{outdir}}'
list_files: True
remote_src: yes
owner: '{{ testuser.uid }}'
- name: stat an output file
stat:
path: '{{outdir}}/{{testfile}}'
register: stat
- name: verify that the file has the right owner
assert:
that:
- stat.stat.exists
- stat.stat.pw_name == testuser.name
- stat.stat.uid == testuser.uid
- name: nuke destination
file:
path: '{{outdir}}'
state: absent
- debug:
msg: groupname test
# groupname
- name: create our unarchive destinations
file:
path: '{{outdir}}'
state: directory
- name: unarchive a file
unarchive:
src: '{{remote_tmp_dir}}/{{archive}}'
dest: '{{outdir}}'
list_files: True
remote_src: yes
group: testgroup
- name: stat an output file
stat:
path: '{{outdir}}/{{testfile}}'
register: stat
- name: verify that the file has the right owner
assert:
that:
- stat.stat.exists
- stat.stat.gr_name == testgroup.name
- stat.stat.gid == testgroup.gid
- name: nuke destination
file:
path: '{{outdir}}'
state: absent
- debug:
msg: gid test
# gid
- name: create our unarchive destinations
file:
path: '{{outdir}}'
state: directory
- name: unarchive a file
unarchive:
src: '{{remote_tmp_dir}}/{{archive}}'
dest: '{{outdir}}'
list_files: True
remote_src: yes
group: '{{ testgroup.gid }}'
- name: stat an output file
stat:
path: '{{outdir}}/{{testfile}}'
register: stat
- name: verify that the file has the right owner
assert:
that:
- stat.stat.exists
- stat.stat.gr_name == testgroup.name
- stat.stat.gid == testgroup.gid
- name: nuke destination
file:
path: '{{outdir}}'
state: absent
always:
- name: Remove testuser
user:
name: testuser
state: absent
- name: Remove testgroup
group:
name: testgroup
state: absent

@ -24,3 +24,10 @@
file: file:
path: '{{remote_tmp_dir}}/test-unarchive-tar' path: '{{remote_tmp_dir}}/test-unarchive-tar'
state: absent state: absent
- name: test owner/group perms
include_tasks: test_owner_group.yml
vars:
ext: tar
archive: test-unarchive.tar
testfile: foo-unarchive.txt

@ -26,3 +26,10 @@
file: file:
path: '{{remote_tmp_dir}}/test-unarchive-tar-gz' path: '{{remote_tmp_dir}}/test-unarchive-tar-gz'
state: absent state: absent
- name: test owner/group perms
include_tasks: test_owner_group.yml
vars:
ext: tar.gz
archive: test-unarchive.tar.gz
testfile: foo-unarchive.txt

@ -43,3 +43,15 @@
assert: assert:
that: that:
- "unarchive03b.changed == false" - "unarchive03b.changed == false"
- name: nuke zip destination
file:
path: '{{remote_tmp_dir}}/test-unarchive-zip'
state: absent
- name: test owner/group perms
include_tasks: test_owner_group.yml
vars:
ext: zip
archive: test-unarchive.zip
testfile: foo-unarchive.txt

Loading…
Cancel
Save