浏览代码

create/extract: add --noacls option, #3955

when given with borg create, borg will not get ACLs from input files (and thus, it will not archive ACLs).

when given with borg extract, borg will not read ACLs from archive and it will not set ACLs on extracted files.
Thomas Waldmann 4 年之前
父节点
当前提交
9412a8430e
共有 2 个文件被更改,包括 15 次插入4 次删除
  1. 7 3
      src/borg/archive.py
  2. 8 1
      src/borg/archiver.py

+ 7 - 3
src/borg/archive.py

@@ -379,7 +379,8 @@ class Archive:
         """Failed to encode filename "{}" into file system encoding "{}". Consider configuring the LANG environment variable."""
         """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,
     def __init__(self, repository, key, manifest, name, cache=None, create=False,
-                 checkpoint_interval=1800, numeric_owner=False, noatime=False, noctime=False, noflags=False,
+                 checkpoint_interval=1800, numeric_owner=False, noatime=False, noctime=False,
+                 noflags=False, noacls=False,
                  progress=False, chunker_params=CHUNKER_PARAMS, start=None, start_monotonic=None, end=None,
                  progress=False, chunker_params=CHUNKER_PARAMS, start=None, start_monotonic=None, end=None,
                  consider_part_files=False, log_json=False):
                  consider_part_files=False, log_json=False):
         self.cwd = os.getcwd()
         self.cwd = os.getcwd()
@@ -398,6 +399,7 @@ class Archive:
         self.noatime = noatime
         self.noatime = noatime
         self.noctime = noctime
         self.noctime = noctime
         self.noflags = noflags
         self.noflags = noflags
+        self.noacls = noacls
         assert (start is None) == (start_monotonic is None), 'Logic error: if start is given, start_monotonic must be given as well and vice versa.'
         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:
         if start is None:
             start = datetime.utcnow()
             start = datetime.utcnow()
@@ -853,7 +855,8 @@ Utilization of max. archive size: {csize_max:.0%}
             except OSError:
             except OSError:
                 # some systems don't support calling utime on a symlink
                 # some systems don't support calling utime on a symlink
                 pass
                 pass
-            acl_set(path, item, self.numeric_owner, fd=fd)
+            if not self.noacls:
+                acl_set(path, item, self.numeric_owner, fd=fd)
             # chown removes Linux capabilities, so set the extended attributes at the end, after chown, since they include
             # 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.
             # the Linux capabilities in the "security.capability" attribute.
             warning = xattr.set_all(fd or path, item.get('xattrs', {}), follow_symlinks=False)
             warning = xattr.set_all(fd or path, item.get('xattrs', {}), follow_symlinks=False)
@@ -1077,7 +1080,8 @@ class MetadataCollector:
             if not self.noflags:
             if not self.noflags:
                 flags = get_flags(path, st, fd=fd)
                 flags = get_flags(path, st, fd=fd)
             xattrs = xattr.get_all(fd or path, follow_symlinks=False)
             xattrs = xattr.get_all(fd or path, follow_symlinks=False)
-            acl_get(path, attrs, st, self.numeric_owner, fd=fd)
+            if not self.noacls:
+                acl_get(path, attrs, st, self.numeric_owner, fd=fd)
         if xattrs:
         if xattrs:
             attrs['xattrs'] = StableDict(xattrs)
             attrs['xattrs'] = StableDict(xattrs)
         if flags:
         if flags:

+ 8 - 1
src/borg/archiver.py

@@ -189,6 +189,7 @@ def with_archive(method):
         archive = Archive(repository, key, manifest, args.location.archive,
         archive = Archive(repository, key, manifest, args.location.archive,
                           numeric_owner=getattr(args, 'numeric_owner', False),
                           numeric_owner=getattr(args, 'numeric_owner', False),
                           noflags=getattr(args, 'nobsdflags', False) or getattr(args, 'noflags', False),
                           noflags=getattr(args, 'nobsdflags', False) or getattr(args, 'noflags', False),
+                          noacls=getattr(args, 'noacls', False),
                           cache=kwargs.get('cache'),
                           cache=kwargs.get('cache'),
                           consider_part_files=args.consider_part_files, log_json=args.log_json)
                           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)
         return method(self, args, repository=repository, manifest=manifest, key=key, archive=archive, **kwargs)
@@ -635,6 +636,7 @@ class Archiver:
         self.output_filter = args.output_filter
         self.output_filter = args.output_filter
         self.output_list = args.output_list
         self.output_list = args.output_list
         self.noflags = args.nobsdflags or args.noflags
         self.noflags = args.nobsdflags or args.noflags
+        self.noacls = args.noacls
         self.exclude_nodump = args.exclude_nodump
         self.exclude_nodump = args.exclude_nodump
         dry_run = args.dry_run
         dry_run = args.dry_run
         t0 = datetime.utcnow()
         t0 = datetime.utcnow()
@@ -651,7 +653,8 @@ class Archiver:
                                   chunker_params=args.chunker_params, start=t0, start_monotonic=t0_monotonic,
                                   chunker_params=args.chunker_params, start=t0, start_monotonic=t0_monotonic,
                                   log_json=args.log_json)
                                   log_json=args.log_json)
                 metadata_collector = MetadataCollector(noatime=not args.atime, noctime=args.noctime,
                 metadata_collector = MetadataCollector(noatime=not args.atime, noctime=args.noctime,
-                    noflags=args.nobsdflags or args.noflags, numeric_owner=args.numeric_owner, nobirthtime=args.nobirthtime)
+                    noflags=args.nobsdflags or args.noflags, noacls=args.noacls,
+                    numeric_owner=args.numeric_owner, nobirthtime=args.nobirthtime)
                 cp = ChunksProcessor(cache=cache, key=key,
                 cp = ChunksProcessor(cache=cache, key=key,
                     add_item=archive.add_item, write_checkpoint=archive.write_checkpoint,
                     add_item=archive.add_item, write_checkpoint=archive.write_checkpoint,
                     checkpoint_interval=args.checkpoint_interval, rechunkify=False)
                     checkpoint_interval=args.checkpoint_interval, rechunkify=False)
@@ -3379,6 +3382,8 @@ class Archiver:
                               help='deprecated, use ``--noflags`` instead')
                               help='deprecated, use ``--noflags`` instead')
         fs_group.add_argument('--noflags', dest='noflags', action='store_true',
         fs_group.add_argument('--noflags', dest='noflags', action='store_true',
                               help='do not read and store flags (e.g. NODUMP, IMMUTABLE) into archive')
                               help='do not read and store flags (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('--sparse', dest='sparse', action='store_true',
         fs_group.add_argument('--sparse', dest='sparse', action='store_true',
                                help='detect sparse holes in input (supported only by fixed chunker)')
                                help='detect sparse holes in input (supported only by fixed chunker)')
         fs_group.add_argument('--files-cache', metavar='MODE', dest='files_cache_mode',
         fs_group.add_argument('--files-cache', metavar='MODE', dest='files_cache_mode',
@@ -3797,6 +3802,8 @@ class Archiver:
                                help='deprecated, use ``--noflags`` instead')
                                help='deprecated, use ``--noflags`` instead')
         subparser.add_argument('--noflags', dest='noflags', action='store_true',
         subparser.add_argument('--noflags', dest='noflags', action='store_true',
                                help='do not extract/set flags (e.g. NODUMP, IMMUTABLE)')
                                help='do not extract/set flags (e.g. NODUMP, IMMUTABLE)')
+        subparser.add_argument('--noacls', dest='noacls', action='store_true',
+                               help='do not extract/set ACLs')
         subparser.add_argument('--stdout', dest='stdout', action='store_true',
         subparser.add_argument('--stdout', dest='stdout', action='store_true',
                                help='write all extracted data to stdout')
                                help='write all extracted data to stdout')
         subparser.add_argument('--sparse', dest='sparse', action='store_true',
         subparser.add_argument('--sparse', dest='sparse', action='store_true',