|
|
@ -76,6 +76,12 @@ options:
|
|
|
|
required: false
|
|
|
|
required: false
|
|
|
|
default: ""
|
|
|
|
default: ""
|
|
|
|
version_added: "1.2"
|
|
|
|
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 the system
|
|
|
|
|
|
|
|
defaults.
|
|
|
|
|
|
|
|
required: false
|
|
|
|
|
|
|
|
version_added: "1.5"
|
|
|
|
others:
|
|
|
|
others:
|
|
|
|
description:
|
|
|
|
description:
|
|
|
|
- all arguments accepted by the M(file) module also work here
|
|
|
|
- all arguments accepted by the M(file) module also work here
|
|
|
@ -97,6 +103,34 @@ EXAMPLES = '''
|
|
|
|
- copy: src=/mine/sudoers dest=/etc/sudoers validate='visudo -cf %s'
|
|
|
|
- copy: src=/mine/sudoers dest=/etc/sudoers validate='visudo -cf %s'
|
|
|
|
'''
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def split_pre_existing_dir(dirname):
|
|
|
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
Return the first pre-existing directory and a list of the new directories that will be created.
|
|
|
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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):
|
|
|
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
Walk the new directories list and make sure that permissions are as we would expect
|
|
|
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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():
|
|
|
|
def main():
|
|
|
|
|
|
|
|
|
|
|
|
module = AnsibleModule(
|
|
|
|
module = AnsibleModule(
|
|
|
@ -109,6 +143,7 @@ def main():
|
|
|
|
backup = dict(default=False, type='bool'),
|
|
|
|
backup = dict(default=False, type='bool'),
|
|
|
|
force = dict(default=True, aliases=['thirsty'], type='bool'),
|
|
|
|
force = dict(default=True, aliases=['thirsty'], type='bool'),
|
|
|
|
validate = dict(required=False, type='str'),
|
|
|
|
validate = dict(required=False, type='str'),
|
|
|
|
|
|
|
|
directory_mode = dict(required=False)
|
|
|
|
),
|
|
|
|
),
|
|
|
|
add_file_common_args=True,
|
|
|
|
add_file_common_args=True,
|
|
|
|
)
|
|
|
|
)
|
|
|
@ -128,12 +163,22 @@ def main():
|
|
|
|
md5sum_src = module.md5(src)
|
|
|
|
md5sum_src = module.md5(src)
|
|
|
|
md5sum_dest = None
|
|
|
|
md5sum_dest = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
changed = False
|
|
|
|
|
|
|
|
|
|
|
|
# Special handling for recursive copy - create intermediate dirs
|
|
|
|
# Special handling for recursive copy - create intermediate dirs
|
|
|
|
if original_basename and dest.endswith("/"):
|
|
|
|
if original_basename and dest.endswith("/"):
|
|
|
|
dest = os.path.join(dest, original_basename)
|
|
|
|
dest = os.path.join(dest, original_basename)
|
|
|
|
dirname = os.path.dirname(dest)
|
|
|
|
dirname = os.path.dirname(dest)
|
|
|
|
if not os.path.exists(dirname):
|
|
|
|
if not os.path.exists(dirname):
|
|
|
|
|
|
|
|
(pre_existing_dir, new_directory_list) = split_pre_existing_dir(dirname)
|
|
|
|
os.makedirs(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
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
directory_args['mode'] = None
|
|
|
|
|
|
|
|
adjust_recursive_directory_permissions(pre_existing_dir, new_directory_list, module, directory_args, changed)
|
|
|
|
|
|
|
|
|
|
|
|
if os.path.exists(dest):
|
|
|
|
if os.path.exists(dest):
|
|
|
|
if not force:
|
|
|
|
if not force:
|
|
|
|