Fix for file module with recursive permission setting and broken symlinks

There was a traceback when setting permissions on a directory tree when
there were broken symlinks inside of the tree and follow=true.  chmod -R
ignores broken symlinks inside of the tree so we've fixed the file
module to do the same.

Fixes #39456

(cherry picked from commit 6b159fdb03)
pull/39735/head
Toshio Kuratomi 7 years ago
parent 3b17141525
commit c11d8abf9a

@ -0,0 +1,5 @@
---
bugfixes:
- file module - Fix error when recursively assigning permissions and
a symlink to a nonexistent file is present in the directory tree
(https://github.com/ansible/ansible/issues/39456)

@ -160,16 +160,23 @@ def recursive_set_attributes(module, b_path, follow, file_args):
tmp_file_args['path'] = to_native(b_fsname, errors='surrogate_or_strict') tmp_file_args['path'] = to_native(b_fsname, errors='surrogate_or_strict')
changed |= module.set_fs_attributes_if_different(tmp_file_args, changed, expand=False) changed |= module.set_fs_attributes_if_different(tmp_file_args, changed, expand=False)
else: else:
# Change perms on the link
tmp_file_args = file_args.copy() tmp_file_args = file_args.copy()
tmp_file_args['path'] = to_native(b_fsname, errors='surrogate_or_strict') tmp_file_args['path'] = to_native(b_fsname, errors='surrogate_or_strict')
changed |= module.set_fs_attributes_if_different(tmp_file_args, changed, expand=False) changed |= module.set_fs_attributes_if_different(tmp_file_args, changed, expand=False)
if follow: if follow:
b_fsname = os.path.join(b_root, os.readlink(b_fsname)) b_fsname = os.path.join(b_root, os.readlink(b_fsname))
if os.path.isdir(b_fsname): # The link target could be nonexistent
changed |= recursive_set_attributes(module, b_fsname, follow, file_args) if os.path.exists(b_fsname):
tmp_file_args = file_args.copy() if os.path.isdir(b_fsname):
tmp_file_args['path'] = to_native(b_fsname, errors='surrogate_or_strict') # Link is a directory so change perms on the directory's contents
changed |= module.set_fs_attributes_if_different(tmp_file_args, changed, expand=False) changed |= recursive_set_attributes(module, b_fsname, follow, file_args)
# Change perms on the file pointed to by the link
tmp_file_args = file_args.copy()
tmp_file_args['path'] = to_native(b_fsname, errors='surrogate_or_strict')
changed |= module.set_fs_attributes_if_different(tmp_file_args, changed, expand=False)
return changed return changed

@ -610,6 +610,9 @@
- name: create a symlink to the directory - name: create a symlink to the directory
file: path={{output_dir}}/test_follow_rec/test_link_dir state=link src="../test_follow_rec_target_dir" file: path={{output_dir}}/test_follow_rec/test_link_dir state=link src="../test_follow_rec_target_dir"
- name: create a symlink to a nonexistent file
file: path={{output_dir}}/test_follow_rec/nonexistent state=link src=does_not_exist force=True
- name: try to change permissions without following symlinks - name: try to change permissions without following symlinks
file: path={{output_dir}}/test_follow_rec follow=False mode="a-x" recurse=True file: path={{output_dir}}/test_follow_rec follow=False mode="a-x" recurse=True

Loading…
Cancel
Save