Explorar el Código

Merge pull request #5701 from ThomasWaldmann/noacls-noxattrs-1.1

implement --noacls --noxattrs (1.1-maint)
TW hace 4 años
padre
commit
2f9fc3dc09
Se han modificado 2 ficheros con 46 adiciones y 32 borrados
  1. 35 31
      src/borg/archive.py
  2. 11 1
      src/borg/archiver.py

+ 35 - 31
src/borg/archive.py

@@ -315,7 +315,8 @@ class Archive:
         """Failed to encode filename "{}" into file system encoding "{}". Consider configuring the LANG environment variable."""
 
     def __init__(self, repository, key, manifest, name, cache=None, create=False,
-                 checkpoint_interval=1800, numeric_owner=False, noatime=False, noctime=False, nobirthtime=False, nobsdflags=False,
+                 checkpoint_interval=1800, numeric_owner=False, noatime=False, noctime=False, nobirthtime=False,
+                 nobsdflags=False, noacls=False, noxattrs=False,
                  progress=False, chunker_params=CHUNKER_PARAMS, start=None, start_monotonic=None, end=None,
                  consider_part_files=False, log_json=False):
         self.cwd = os.getcwd()
@@ -335,6 +336,8 @@ class Archive:
         self.noctime = noctime
         self.nobirthtime = nobirthtime
         self.nobsdflags = nobsdflags
+        self.noacls = noacls
+        self.noxattrs = noxattrs
         assert (start is None) == (start_monotonic is None), 'Logic error: if start is given, start_monotonic must be given as well and vice versa.'
         if start is None:
             start = datetime.utcnow()
@@ -762,31 +765,33 @@ Utilization of max. archive size: {csize_max:.0%}
         except OSError:
             # some systems don't support calling utime on a symlink
             pass
-        acl_set(path, item, self.numeric_owner)
-        # chown removes Linux capabilities, so set the extended attributes at the end, after chown, since they include
-        # the Linux capabilities in the "security.capability" attribute.
-        xattrs = item.get('xattrs', {})
-        for k, v in xattrs.items():
-            try:
-                xattr.setxattr(fd or path, k, v, follow_symlinks=False)
-            except OSError as e:
-                msg_format = '%s: when setting extended attribute %s: %%s' % (path, k.decode())
-                if e.errno == errno.E2BIG:
-                    err_str = 'too big for this filesystem'
-                elif e.errno == errno.ENOTSUP:
-                    err_str = 'xattrs not supported on this filesystem'
-                elif e.errno == errno.ENOSPC:
-                    # no space left on device while setting this specific xattr
-                    # ext4 reports ENOSPC when trying to set an xattr with >4kiB while ext4 can only support 4kiB xattrs
-                    # (in this case, this is NOT a "disk full" error, just a ext4 limitation).
-                    err_str = 'no space left on device [xattr len = %d]' % (len(v), )
-                else:
-                    # generic handler
-                    # EACCES: permission denied to set this specific xattr (this may happen related to security.* keys)
-                    # EPERM: operation not permitted
-                    err_str = os.strerror(e.errno)
-                logger.warning(msg_format % err_str)
-                set_ec(EXIT_WARNING)
+        if not self.noacls:
+            acl_set(path, item, self.numeric_owner)
+        if not self.noxattrs:
+            # chown removes Linux capabilities, so set the extended attributes at the end, after chown, since they include
+            # the Linux capabilities in the "security.capability" attribute.
+            xattrs = item.get('xattrs', {})
+            for k, v in xattrs.items():
+                try:
+                    xattr.setxattr(fd or path, k, v, follow_symlinks=False)
+                except OSError as e:
+                    msg_format = '%s: when setting extended attribute %s: %%s' % (path, k.decode())
+                    if e.errno == errno.E2BIG:
+                        err_str = 'too big for this filesystem'
+                    elif e.errno == errno.ENOTSUP:
+                        err_str = 'xattrs not supported on this filesystem'
+                    elif e.errno == errno.ENOSPC:
+                        # no space left on device while setting this specific xattr
+                        # ext4 reports ENOSPC when trying to set an xattr with >4kiB while ext4 can only support 4kiB xattrs
+                        # (in this case, this is NOT a "disk full" error, just a ext4 limitation).
+                        err_str = 'no space left on device [xattr len = %d]' % (len(v), )
+                    else:
+                        # generic handler
+                        # EACCES: permission denied to set this specific xattr (this may happen related to security.* keys)
+                        # EPERM: operation not permitted
+                        err_str = os.strerror(e.errno)
+                    logger.warning(msg_format % err_str)
+                    set_ec(EXIT_WARNING)
         # bsdflags include the immutable flag and need to be set last:
         if not self.nobsdflags and 'bsdflags' in item:
             try:
@@ -907,12 +912,11 @@ Utilization of max. archive size: {csize_max:.0%}
 
     def stat_ext_attrs(self, st, path):
         attrs = {}
-        bsdflags = 0
         with backup_io('extended stat'):
-            xattrs = xattr.get_all(path, follow_symlinks=False)
-            if not self.nobsdflags:
-                bsdflags = get_flags(path, st)
-            acl_get(path, attrs, st, self.numeric_owner)
+            xattrs = {} if self.noxattrs else xattr.get_all(path, follow_symlinks=False)
+            bsdflags = 0 if self.nobsdflags else get_flags(path, st)
+            if not self.noacls:
+                acl_get(path, attrs, st, self.numeric_owner)
         if xattrs:
             attrs['xattrs'] = StableDict(xattrs)
         if bsdflags:

+ 11 - 1
src/borg/archiver.py

@@ -185,6 +185,8 @@ def with_archive(method):
         archive = Archive(repository, key, manifest, args.location.archive,
                           numeric_owner=getattr(args, 'numeric_owner', False),
                           nobsdflags=getattr(args, 'nobsdflags', False),
+                          noacls=getattr(args, 'noacls', False),
+                          noxattrs=getattr(args, 'noxattrs', False),
                           cache=kwargs.get('cache'),
                           consider_part_files=args.consider_part_files, log_json=args.log_json)
         return method(self, args, repository=repository, manifest=manifest, key=key, archive=archive, **kwargs)
@@ -587,7 +589,7 @@ class Archiver:
                 archive = Archive(repository, key, manifest, args.location.archive, cache=cache,
                                   create=True, checkpoint_interval=args.checkpoint_interval,
                                   numeric_owner=args.numeric_owner, noatime=args.noatime, noctime=args.noctime, nobirthtime=args.nobirthtime,
-                                  nobsdflags=args.nobsdflags, progress=args.progress,
+                                  nobsdflags=args.nobsdflags, noacls=args.noacls, noxattrs=args.noxattrs, progress=args.progress,
                                   chunker_params=args.chunker_params, start=t0, start_monotonic=t0_monotonic,
                                   log_json=args.log_json)
                 create_inner(archive, cache)
@@ -3473,6 +3475,10 @@ class Archiver:
                               help='do not store birthtime (creation date) into archive')
         fs_group.add_argument('--nobsdflags', dest='nobsdflags', action='store_true',
                               help='do not read and store bsdflags (e.g. NODUMP, IMMUTABLE) into archive')
+        fs_group.add_argument('--noacls', dest='noacls', action='store_true',
+                              help='do not read and store ACLs into archive')
+        fs_group.add_argument('--noxattrs', dest='noxattrs', action='store_true',
+                              help='do not read and store xattrs into archive')
         fs_group.add_argument('--ignore-inode', dest='ignore_inode', action='store_true',
                               help='ignore inode data in the file metadata cache used to detect unchanged files.')
         fs_group.add_argument('--files-cache', metavar='MODE', dest='files_cache_mode',
@@ -3541,6 +3547,10 @@ class Archiver:
                                help='only obey numeric user and group identifiers')
         subparser.add_argument('--nobsdflags', dest='nobsdflags', action='store_true',
                                help='do not extract/set bsdflags (e.g. NODUMP, IMMUTABLE)')
+        subparser.add_argument('--noacls', dest='noacls', action='store_true',
+                               help='do not extract/set ACLs')
+        subparser.add_argument('--noxattrs', dest='noxattrs', action='store_true',
+                               help='do not extract/set xattrs')
         subparser.add_argument('--stdout', dest='stdout', action='store_true',
                                help='write all extracted data to stdout')
         subparser.add_argument('--sparse', dest='sparse', action='store_true',