X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/waydroid.git/blobdiff_plain/1f0393876d891d0e32a995d0bf7259cc6505afdc..c9ea5abff749e660c9aca0fcd224875464c3dacd:/tools/helpers/mount.py diff --git a/tools/helpers/mount.py b/tools/helpers/mount.py index 4d77206..236ff5b 100644 --- a/tools/helpers/mount.py +++ b/tools/helpers/mount.py @@ -2,6 +2,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later import os import tools.helpers.run +from tools.helpers.version import versiontuple, kernel_version def ismount(folder): @@ -37,13 +38,13 @@ def bind(args, source, destination, create_folders=True, umount=False): if os.path.exists(path): continue if create_folders: - tools.helpers.run.root(args, ["mkdir", "-p", path]) + tools.helpers.run.user(args, ["mkdir", "-p", path]) else: raise RuntimeError("Mount failed, folder does not exist: " + path) # Actually mount the folder - tools.helpers.run.root(args, ["mount", "-o", "bind", source, destination]) + tools.helpers.run.user(args, ["mount", "-o", "bind", source, destination]) # Verify, that it has worked if not ismount(destination): @@ -64,12 +65,12 @@ def bind_file(args, source, destination, create_folders=False): if create_folders: dir = os.path.dirname(destination) if not os.path.isdir(dir): - tools.helpers.run.root(args, ["mkdir", "-p", dir]) + tools.helpers.run.user(args, ["mkdir", "-p", dir]) - tools.helpers.run.root(args, ["touch", destination]) + tools.helpers.run.user(args, ["touch", destination]) # Mount - tools.helpers.run.root(args, ["mount", "-o", "bind", source, + tools.helpers.run.user(args, ["mount", "-o", "bind", source, destination]) @@ -102,36 +103,78 @@ def umount_all(args, folder): """ Umount all folders, that are mounted inside a given folder. """ - for mountpoint in umount_all_list(folder): - tools.helpers.run.root(args, ["umount", mountpoint]) + all_list = umount_all_list(folder) + for mountpoint in all_list: + tools.helpers.run.user(args, ["umount", mountpoint]) + for mountpoint in all_list: if ismount(mountpoint): raise RuntimeError("Failed to umount: " + mountpoint) -def mount(args, source, destination, create_folders=True, umount=False, readonly=True): +def mount(args, source, destination, create_folders=True, umount=False, + readonly=True, mount_type=None, options=None, force=True): """ Mount and create necessary directory structure. :param umount: when destination is already a mount point, umount it first. + :param force: attempt mounting even if the mount point already exists. """ # Check/umount destination if ismount(destination): if umount: umount_all(args, destination) else: - return + if not force: + return # Check/create folders if not os.path.exists(destination): if create_folders: - tools.helpers.run.root(args, ["mkdir", "-p", destination]) + tools.helpers.run.user(args, ["mkdir", "-p", destination]) else: raise RuntimeError("Mount failed, folder does not exist: " + destination) - # Actually mount the folder - tools.helpers.run.root(args, ["mount", source, destination]) + extra_args = [] + opt_args = [] + if mount_type: + extra_args.extend(["-t", mount_type]) if readonly: - tools.helpers.run.root(args, ["mount", "-o", "remount,ro", source, destination]) + opt_args.append("ro") + if options: + opt_args.extend(options) + if opt_args: + extra_args.extend(["-o", ",".join(opt_args)]) + + # Actually mount the folder + tools.helpers.run.user(args, ["mount", *extra_args, source, destination]) # Verify, that it has worked if not ismount(destination): raise RuntimeError("Mount failed: " + source + " -> " + destination) + +def mount_overlay(args, lower_dirs, destination, upper_dir=None, work_dir=None, + create_folders=True, readonly=True): + """ + Mount an overlay. + """ + dirs = [*lower_dirs] + options = ["lowerdir=" + (":".join(lower_dirs))] + + if upper_dir: + dirs.append(upper_dir) + dirs.append(work_dir) + options.append("upperdir=" + upper_dir) + options.append("workdir=" + work_dir) + + if kernel_version() >= versiontuple("4.17"): + options.append("xino=off") + + for dir_path in dirs: + if not os.path.exists(dir_path): + if create_folders: + tools.helpers.run.user(args, ["mkdir", "-p", dir_path]) + else: + raise RuntimeError("Mount failed, folder does not exist: " + + dir_path) + + mount(args, "overlay", destination, mount_type="overlay", options=options, + readonly=readonly, create_folders=create_folders, force=True)