mirror of
https://github.com/borgbackup/borg.git
synced 2025-02-23 22:51:35 +00:00
borg mount: support uid= and gid= mount options
also: refactor popping an option, converting an options value
(cherry picked from commit f993f0fd49
)
This commit is contained in:
parent
6ffb0e1a33
commit
c7d12e3fc0
1 changed files with 36 additions and 13 deletions
|
@ -230,12 +230,14 @@ def __init__(self, key, manifest, repository, args, decrypted_repository):
|
||||||
self.contents = defaultdict(dict)
|
self.contents = defaultdict(dict)
|
||||||
self.default_uid = os.getuid()
|
self.default_uid = os.getuid()
|
||||||
self.default_gid = os.getgid()
|
self.default_gid = os.getgid()
|
||||||
self.default_dir = Item(mode=0o40755, mtime=int(time.time() * 1e9), uid=self.default_uid, gid=self.default_gid)
|
self.default_dir = None
|
||||||
# Archives to be loaded when first accessed, mapped by their placeholder inode
|
# Archives to be loaded when first accessed, mapped by their placeholder inode
|
||||||
self.pending_archives = {}
|
self.pending_archives = {}
|
||||||
self.cache = ItemCache(decrypted_repository)
|
self.cache = ItemCache(decrypted_repository)
|
||||||
self.allow_damaged_files = False
|
self.allow_damaged_files = False
|
||||||
self.versions = False
|
self.versions = False
|
||||||
|
self.uid_forced = None
|
||||||
|
self.gid_forced = None
|
||||||
|
|
||||||
def _create_filesystem(self):
|
def _create_filesystem(self):
|
||||||
self._create_dir(parent=1) # first call, create root dir (inode == 1)
|
self._create_dir(parent=1) # first call, create root dir (inode == 1)
|
||||||
|
@ -443,19 +445,40 @@ def sig_info_handler(self, sig_no, stack):
|
||||||
|
|
||||||
def mount(self, mountpoint, mount_options, foreground=False):
|
def mount(self, mountpoint, mount_options, foreground=False):
|
||||||
"""Mount filesystem on *mountpoint* with *mount_options*."""
|
"""Mount filesystem on *mountpoint* with *mount_options*."""
|
||||||
|
|
||||||
|
def pop_option(options, key, present, not_present, wanted_type):
|
||||||
|
assert isinstance(options, list) # we mutate this
|
||||||
|
for idx, option in enumerate(options):
|
||||||
|
if option == key:
|
||||||
|
options.pop(idx)
|
||||||
|
return present
|
||||||
|
if option.startswith(key + '='):
|
||||||
|
options.pop(idx)
|
||||||
|
value = option.split('=', 1)[1]
|
||||||
|
if wanted_type is bool:
|
||||||
|
v = value.lower()
|
||||||
|
if v in ('y', 'yes', 'true', '1'):
|
||||||
|
return True
|
||||||
|
if v in ('n', 'no', 'false', '0'):
|
||||||
|
return False
|
||||||
|
raise ValueError('unsupported value in option: %s' % option)
|
||||||
|
try:
|
||||||
|
return wanted_type(value)
|
||||||
|
except ValueError:
|
||||||
|
raise ValueError('unsupported value in option: %s' % option) from None
|
||||||
|
else:
|
||||||
|
return not_present
|
||||||
|
|
||||||
options = ['fsname=borgfs', 'ro']
|
options = ['fsname=borgfs', 'ro']
|
||||||
if mount_options:
|
if mount_options:
|
||||||
options.extend(mount_options.split(','))
|
options.extend(mount_options.split(','))
|
||||||
try:
|
self.allow_damaged_files = pop_option(options, 'allow_damaged_files', True, False, bool)
|
||||||
options.remove('allow_damaged_files')
|
self.versions = pop_option(options, 'versions', True, False, bool)
|
||||||
self.allow_damaged_files = True
|
self.uid_forced = pop_option(options, 'uid', None, None, int)
|
||||||
except ValueError:
|
self.gid_forced = pop_option(options, 'gid', None, None, int)
|
||||||
pass
|
dir_uid = self.uid_forced if self.uid_forced is not None else self.default_uid
|
||||||
try:
|
dir_gid = self.gid_forced if self.gid_forced is not None else self.default_gid
|
||||||
options.remove('versions')
|
self.default_dir = Item(mode=0o40755, mtime=int(time.time() * 1e9), uid=dir_uid, gid=dir_gid)
|
||||||
self.versions = True
|
|
||||||
except ValueError:
|
|
||||||
pass
|
|
||||||
self._create_filesystem()
|
self._create_filesystem()
|
||||||
llfuse.init(self, mountpoint, options)
|
llfuse.init(self, mountpoint, options)
|
||||||
if not foreground:
|
if not foreground:
|
||||||
|
@ -500,8 +523,8 @@ def getattr(self, inode, ctx=None):
|
||||||
entry.attr_timeout = 300
|
entry.attr_timeout = 300
|
||||||
entry.st_mode = item.mode
|
entry.st_mode = item.mode
|
||||||
entry.st_nlink = item.get('nlink', 1)
|
entry.st_nlink = item.get('nlink', 1)
|
||||||
entry.st_uid = item.uid if item.uid >= 0 else self.default_uid
|
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 = item.gid if item.gid >= 0 else self.default_gid
|
entry.st_gid = self.gid_forced if self.gid_forced is not None else item.gid if item.gid >= 0 else self.default_gid
|
||||||
entry.st_rdev = item.get('rdev', 0)
|
entry.st_rdev = item.get('rdev', 0)
|
||||||
entry.st_size = item.get_size()
|
entry.st_size = item.get_size()
|
||||||
entry.st_blksize = 512
|
entry.st_blksize = 512
|
||||||
|
|
Loading…
Reference in a new issue