浏览代码

borg mount: support umask= mount option

(cherry picked from commit eb61c2153bfd8ebc96cf77bfb50f1507f6544bfd)
Thomas Waldmann 7 年之前
父节点
当前提交
cd70192bea
共有 1 个文件被更改,包括 11 次插入3 次删除
  1. 11 3
      src/borg/fuse.py

+ 11 - 3
src/borg/fuse.py

@@ -238,6 +238,7 @@ class FuseBackend(object):
         self.versions = False
         self.uid_forced = None
         self.gid_forced = None
+        self.umask = 0
 
     def _create_filesystem(self):
         self._create_dir(parent=1)  # first call, create root dir (inode == 1)
@@ -446,7 +447,7 @@ class FuseOperations(llfuse.Operations, FuseBackend):
     def mount(self, mountpoint, mount_options, foreground=False):
         """Mount filesystem on *mountpoint* with *mount_options*."""
 
-        def pop_option(options, key, present, not_present, wanted_type):
+        def pop_option(options, key, present, not_present, wanted_type, int_base=0):
             assert isinstance(options, list)  # we mutate this
             for idx, option in enumerate(options):
                 if option == key:
@@ -462,6 +463,11 @@ class FuseOperations(llfuse.Operations, FuseBackend):
                         if v in ('n', 'no', 'false', '0'):
                             return False
                         raise ValueError('unsupported value in option: %s' % option)
+                    if wanted_type is int:
+                        try:
+                            return int(value, base=int_base)
+                        except ValueError:
+                            raise ValueError('unsupported value in option: %s' % option) from None
                     try:
                         return wanted_type(value)
                     except ValueError:
@@ -476,9 +482,11 @@ class FuseOperations(llfuse.Operations, FuseBackend):
         self.versions = pop_option(options, 'versions', True, False, bool)
         self.uid_forced = pop_option(options, 'uid', None, None, int)
         self.gid_forced = pop_option(options, 'gid', None, None, int)
+        self.umask = pop_option(options, 'umask', 0, 0, int, int_base=8)  # umask is octal, e.g. 222 or 0222
         dir_uid = self.uid_forced if self.uid_forced is not None else self.default_uid
         dir_gid = self.gid_forced if self.gid_forced is not None else self.default_gid
-        self.default_dir = Item(mode=0o40755, mtime=int(time.time() * 1e9), uid=dir_uid, gid=dir_gid)
+        dir_mode = 0o40755 & ~self.umask
+        self.default_dir = Item(mode=dir_mode, mtime=int(time.time() * 1e9), uid=dir_uid, gid=dir_gid)
         self._create_filesystem()
         llfuse.init(self, mountpoint, options)
         if not foreground:
@@ -521,7 +529,7 @@ class FuseOperations(llfuse.Operations, FuseBackend):
         entry.generation = 0
         entry.entry_timeout = 300
         entry.attr_timeout = 300
-        entry.st_mode = item.mode
+        entry.st_mode = item.mode & ~self.umask
         entry.st_nlink = item.get('nlink', 1)
         entry.st_uid = self.uid_forced if self.uid_forced is not None else item.uid if item.uid >= 0 else self.default_uid
         entry.st_gid = self.gid_forced if self.gid_forced is not None else item.gid if item.gid >= 0 else self.default_gid