summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard C Isaacson <richard.c.isaacson@gmail.com>2014-02-28 01:14:32 -0600
committerRichard C Isaacson <richard.c.isaacson@gmail.com>2014-02-28 01:14:32 -0600
commitcf4a6b39ccec3108d501897a7fd8fd1b943c82d9 (patch)
tree079d1ef95bfb2d97dc684f903f55ba1ddbcc6091
parentf95786b52ddb947f3a0560f76cd633dbc78db747 (diff)
downloadansible-cf4a6b39ccec3108d501897a7fd8fd1b943c82d9.tar.gz
Copy Module: Add the ability to set directory attributes on recursive copy.
Closes GH-6194. These changes pass attribute modifications through to new directories during a recursive copy with an addition allowing for the directory mode to be set independantly.
-rw-r--r--library/files/copy32
1 files changed, 32 insertions, 0 deletions
diff --git a/library/files/copy b/library/files/copy
index d961764772..62cb4dcfaf 100644
--- a/library/files/copy
+++ b/library/files/copy
@@ -76,6 +76,12 @@ options:
required: false
default: ""
version_added: "1.2"
+ directory_mode:
+ description:
+ - When doing a recursive copy set the mode for the directories. If this is not set we will default to the file
+ permissions if set.
+ required: false
+ version_added: "1.5"
others:
description:
- all arguments accepted by the M(file) module also work here
@@ -97,6 +103,23 @@ EXAMPLES = '''
- copy: src=/mine/sudoers dest=/etc/sudoers validate='visudo -cf %s'
'''
+def split_pre_existing_dir(dirname):
+ head, tail = os.path.split(dirname)
+ if not os.path.exists(head):
+ (pre_existing_dir, new_directory_list) = split_pre_existing_dir(head)
+ else:
+ return (head, [ tail ])
+ new_directory_list.insert(0, tail)
+ return (pre_existing_dir, new_directory_list)
+
+def adjust_recursive_directory_permissions(pre_existing_dir, new_directory_list, module, directory_args, changed):
+ if len(new_directory_list) > 0:
+ working_dir = os.path.join(pre_existing_dir, new_directory_list.pop(0))
+ directory_args['path'] = working_dir
+ changed = module.set_directory_attributes_if_different(directory_args, changed)
+ changed = adjust_recursive_directory_permissions(working_dir, new_directory_list, module, directory_args, changed)
+ return changed
+
def main():
module = AnsibleModule(
@@ -109,6 +132,7 @@ def main():
backup = dict(default=False, type='bool'),
force = dict(default=True, aliases=['thirsty'], type='bool'),
validate = dict(required=False, type='str'),
+ directory_mode = dict(required=False)
),
add_file_common_args=True,
)
@@ -128,12 +152,20 @@ def main():
md5sum_src = module.md5(src)
md5sum_dest = None
+ changed = False
+
# Special handling for recursive copy - create intermediate dirs
if original_basename and dest.endswith("/"):
dest = os.path.join(dest, original_basename)
dirname = os.path.dirname(dest)
if not os.path.exists(dirname):
+ (pre_existing_dir, new_directory_list) = split_pre_existing_dir(dirname)
os.makedirs(dirname)
+ directory_args = module.load_file_common_arguments(module.params)
+ directory_mode = module.params["directory_mode"]
+ if directory_mode is not None:
+ directory_args['mode'] = directory_mode
+ adjust_recursive_directory_permissions(pre_existing_dir, new_directory_list, module, directory_args, changed)
if os.path.exists(dest):
if not force: