From aa6c73f11b76e710fd436efa5055d8b506031312 Mon Sep 17 00:00:00 2001 From: Toshio Kuratomi Date: Mon, 16 Feb 2015 07:06:11 -0800 Subject: [PATCH] When recursing subdirectories, honor the follow parameter for setting file attributes. One half of the fix for https://github.com/ansible/ansible-modules-core/issues/778 The other half is in basic.py --- files/file.py | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/files/file.py b/files/file.py index 35bb52ab1e3..11c2cf2a585 100644 --- a/files/file.py +++ b/files/file.py @@ -120,6 +120,28 @@ def get_state(path): return 'absent' +def recursive_set_attributes(module, path, follow, file_args): + changed = False + for root, dirs, files in os.walk(path): + for fsobj in dirs + files: + fsname = os.path.join(root, fsobj) + if not os.path.islink(fsname): + tmp_file_args = file_args.copy() + tmp_file_args['path']=fsname + changed |= module.set_fs_attributes_if_different(tmp_file_args, changed) + else: + tmp_file_args = file_args.copy() + tmp_file_args['path']=fsname + changed |= module.set_fs_attributes_if_different(tmp_file_args, changed) + if follow: + fsname = os.path.join(root, os.readlink(fsname)) + if os.path.isdir(fsname): + changed |= recursive_set_attributes(module, fsname, follow, file_args) + tmp_file_args = file_args.copy() + tmp_file_args['path']=fsname + changed |= module.set_fs_attributes_if_different(tmp_file_args, changed) + return changed + def main(): module = AnsibleModule( @@ -234,7 +256,6 @@ def main(): module.exit_json(path=path, changed=changed) elif state == 'directory': - if follow and prev_state == 'link': path = os.readlink(path) prev_state = get_state(path) @@ -266,12 +287,7 @@ def main(): changed = module.set_fs_attributes_if_different(file_args, changed) if recurse: - for root,dirs,files in os.walk( file_args['path'] ): - for fsobj in dirs + files: - fsname=os.path.join(root, fsobj) - tmp_file_args = file_args.copy() - tmp_file_args['path']=fsname - changed = module.set_fs_attributes_if_different(tmp_file_args, changed) + changed |= recursive_set_attributes(module, file_args['path'], follow, file_args) module.exit_json(path=path, changed=changed) @@ -379,5 +395,6 @@ def main(): # import module snippets from ansible.module_utils.basic import * -main() +if __name__ == '__main__': + main()