summaryrefslogtreecommitdiffstats
path: root/lib/ansible/modules/copy.py
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-05 16:16:47 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-05 16:16:47 +0000
commit7a7fb74454bb3a169acecd30e87067502bfe3260 (patch)
treed684cbea7ffc70bd39a1e52bb65b0ea5ae156bda /lib/ansible/modules/copy.py
parentAdding upstream version 2.16.6. (diff)
downloadansible-core-7a7fb74454bb3a169acecd30e87067502bfe3260.tar.xz
ansible-core-7a7fb74454bb3a169acecd30e87067502bfe3260.zip
Adding upstream version 2.17.0.upstream/2.17.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'lib/ansible/modules/copy.py')
-rw-r--r--lib/ansible/modules/copy.py80
1 files changed, 4 insertions, 76 deletions
diff --git a/lib/ansible/modules/copy.py b/lib/ansible/modules/copy.py
index 0e7dfe2..cb2ccf9 100644
--- a/lib/ansible/modules/copy.py
+++ b/lib/ansible/modules/copy.py
@@ -4,8 +4,7 @@
# Copyright: (c) 2017, Ansible Project
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
-from __future__ import absolute_import, division, print_function
-__metaclass__ = type
+from __future__ import annotations
DOCUMENTATION = r'''
@@ -96,7 +95,7 @@ options:
- If V(true) it will search for O(src) on the managed (remote) node.
- O(remote_src) supports recursive copying as of version 2.8.
- O(remote_src) only works with O(mode=preserve) as of version 2.6.
- - Autodecryption of files does not work when O(remote_src=yes).
+ - Auto-decryption of files does not work when O(remote_src=yes).
type: bool
default: no
version_added: '2.0'
@@ -273,7 +272,7 @@ mode:
description: Permissions of the target, after execution.
returned: success
type: str
- sample: "0644"
+ sample: '0644'
size:
description: Size of the target, after execution.
returned: success
@@ -291,7 +290,6 @@ import filecmp
import grp
import os
import os.path
-import platform
import pwd
import shutil
import stat
@@ -300,13 +298,6 @@ import traceback
from ansible.module_utils.common.text.converters import to_bytes, to_native
from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils.common.process import get_bin_path
-from ansible.module_utils.common.locale import get_best_parsable_locale
-from ansible.module_utils.six import PY3
-
-
-# The AnsibleModule object
-module = None
class AnsibleModuleError(Exception):
@@ -314,21 +305,6 @@ class AnsibleModuleError(Exception):
self.results = results
-# Once we get run_command moved into common, we can move this into a common/files module. We can't
-# until then because of the module.run_command() method. We may need to move it into
-# basic::AnsibleModule() until then but if so, make it a private function so that we don't have to
-# keep it for backwards compatibility later.
-def clear_facls(path):
- setfacl = get_bin_path('setfacl')
- # FIXME "setfacl -b" is available on Linux and FreeBSD. There is "setfacl -D e" on z/OS. Others?
- acl_command = [setfacl, '-b', path]
- b_acl_command = [to_bytes(x) for x in acl_command]
- locale = get_best_parsable_locale(module)
- rc, out, err = module.run_command(b_acl_command, environ_update=dict(LANG=locale, LC_ALL=locale, LC_MESSAGES=locale))
- if rc != 0:
- raise RuntimeError('Error running "{0}": stdout: "{1}"; stderr: "{2}"'.format(' '.join(b_acl_command), out, err))
-
-
def split_pre_existing_dir(dirname):
'''
Return the first pre-existing directory and a list of the new directories that will be created.
@@ -529,8 +505,6 @@ def copy_common_dirs(src, dest, module):
def main():
- global module
-
module = AnsibleModule(
# not checking because of daisy chain to file module
argument_spec=dict(
@@ -705,54 +679,8 @@ def main():
else:
raise
- # might be needed below
- if PY3 and hasattr(os, 'listxattr'):
- try:
- src_has_acls = 'system.posix_acl_access' in os.listxattr(src)
- except Exception as e:
- # assume unwanted ACLs by default
- src_has_acls = True
-
# at this point we should always have tmp file
- module.atomic_move(b_mysrc, dest, unsafe_writes=module.params['unsafe_writes'])
-
- if PY3 and hasattr(os, 'listxattr') and platform.system() == 'Linux' and not remote_src:
- # atomic_move used above to copy src into dest might, in some cases,
- # use shutil.copy2 which in turn uses shutil.copystat.
- # Since Python 3.3, shutil.copystat copies file extended attributes:
- # https://docs.python.org/3/library/shutil.html#shutil.copystat
- # os.listxattr (along with others) was added to handle the operation.
-
- # This means that on Python 3 we are copying the extended attributes which includes
- # the ACLs on some systems - further limited to Linux as the documentation above claims
- # that the extended attributes are copied only on Linux. Also, os.listxattr is only
- # available on Linux.
-
- # If not remote_src, then the file was copied from the controller. In that
- # case, any filesystem ACLs are artifacts of the copy rather than preservation
- # of existing attributes. Get rid of them:
-
- if src_has_acls:
- # FIXME If dest has any default ACLs, there are not applied to src now because
- # they were overridden by copystat. Should/can we do anything about this?
- # 'system.posix_acl_default' in os.listxattr(os.path.dirname(b_dest))
-
- try:
- clear_facls(dest)
- except ValueError as e:
- if 'setfacl' in to_native(e):
- # No setfacl so we're okay. The controller couldn't have set a facl
- # without the setfacl command
- pass
- else:
- raise
- except RuntimeError as e:
- # setfacl failed.
- if 'Operation not supported' in to_native(e):
- # The file system does not support ACLs.
- pass
- else:
- raise
+ module.atomic_move(b_mysrc, dest, unsafe_writes=module.params['unsafe_writes'], keep_dest_attrs=not remote_src)
except (IOError, OSError):
module.fail_json(msg="failed to copy: %s to %s" % (src, dest), traceback=traceback.format_exc())