diff options
Diffstat (limited to 'poky/scripts/lib/wic/plugins/source/rootfs.py')
-rw-r--r-- | poky/scripts/lib/wic/plugins/source/rootfs.py | 133 |
1 files changed, 16 insertions, 117 deletions
diff --git a/poky/scripts/lib/wic/plugins/source/rootfs.py b/poky/scripts/lib/wic/plugins/source/rootfs.py index f1db83f8a1..705aeb5563 100644 --- a/poky/scripts/lib/wic/plugins/source/rootfs.py +++ b/poky/scripts/lib/wic/plugins/source/rootfs.py @@ -17,11 +17,10 @@ import shutil import sys from oe.path import copyhardlinktree -from pathlib import Path from wic import WicError from wic.pluginbase import SourcePlugin -from wic.misc import get_bitbake_var, exec_native_cmd +from wic.misc import get_bitbake_var logger = logging.getLogger('wic') @@ -33,22 +32,6 @@ class RootfsPlugin(SourcePlugin): name = 'rootfs' @staticmethod - def __validate_path(cmd, rootfs_dir, path): - if os.path.isabs(path): - logger.error("%s: Must be relative: %s" % (cmd, orig_path)) - sys.exit(1) - - # Disallow climbing outside of parent directory using '..', - # because doing so could be quite disastrous (we will delete the - # directory, or modify a directory outside OpenEmbedded). - full_path = os.path.realpath(os.path.join(rootfs_dir, path)) - if not full_path.startswith(os.path.realpath(rootfs_dir)): - logger.error("%s: Must point inside the rootfs:" % (cmd, path)) - sys.exit(1) - - return full_path - - @staticmethod def __get_rootfs_dir(rootfs_dir): if os.path.isdir(rootfs_dir): return os.path.realpath(rootfs_dir) @@ -61,15 +44,6 @@ class RootfsPlugin(SourcePlugin): return os.path.realpath(image_rootfs_dir) - @staticmethod - def __get_pseudo(native_sysroot, rootfs, pseudo_dir): - pseudo = "export PSEUDO_PREFIX=%s/usr;" % native_sysroot - pseudo += "export PSEUDO_LOCALSTATEDIR=%s;" % pseudo_dir - pseudo += "export PSEUDO_PASSWD=%s;" % rootfs - pseudo += "export PSEUDO_NOSYMLINKEXP=1;" - pseudo += "%s " % get_bitbake_var("FAKEROOTCMD") - return pseudo - @classmethod def do_prepare_partition(cls, part, source_params, cr, cr_workdir, oe_builddir, bootimg_dir, kernel_dir, @@ -94,16 +68,10 @@ class RootfsPlugin(SourcePlugin): "it is not a valid path, exiting" % part.rootfs_dir) part.rootfs_dir = cls.__get_rootfs_dir(rootfs_dir) - pseudo_dir = os.path.join(part.rootfs_dir, "../pseudo") - if not os.path.lexists(pseudo_dir): - logger.warn("%s folder does not exist. " - "Usernames and permissions will be invalid " % pseudo_dir) - pseudo_dir = None new_rootfs = None - new_pseudo = None # Handle excluded paths. - if part.exclude_path or part.include_path or part.change_directory: + if part.exclude_path or part.include_path: # We need a new rootfs directory we can delete files from. Copy to # workdir. new_rootfs = os.path.realpath(os.path.join(cr_workdir, "rootfs%d" % part.lineno)) @@ -111,93 +79,25 @@ class RootfsPlugin(SourcePlugin): if os.path.lexists(new_rootfs): shutil.rmtree(os.path.join(new_rootfs)) - if part.change_directory: - cd = part.change_directory - if cd[-1] == '/': - cd = cd[:-1] - orig_dir = cls.__validate_path("--change-directory", part.rootfs_dir, cd) - else: - orig_dir = part.rootfs_dir - copyhardlinktree(orig_dir, new_rootfs) - - # Convert the pseudo directory to its new location - if (pseudo_dir): - new_pseudo = os.path.realpath( - os.path.join(cr_workdir, "pseudo%d" % part.lineno)) - if os.path.lexists(new_pseudo): - shutil.rmtree(new_pseudo) - os.mkdir(new_pseudo) - shutil.copy(os.path.join(pseudo_dir, "files.db"), - os.path.join(new_pseudo, "files.db")) - - pseudo_cmd = "%s -B -m %s -M %s" % (cls.__get_pseudo(native_sysroot, - new_rootfs, - new_pseudo), - orig_dir, new_rootfs) - exec_native_cmd(pseudo_cmd, native_sysroot) - - for in_path in part.include_path or []: - #parse arguments - include_path = in_path[0] - if len(in_path) > 2: - logger.error("'Invalid number of arguments for include-path") - sys.exit(1) - if len(in_path) == 2: - path = in_path[1] - else: - path = None - - # Pack files to be included into a tar file. - # We need to create a tar file, because that way we can keep the - # permissions from the files even when they belong to different - # pseudo enviroments. - # If we simply copy files using copyhardlinktree/copytree... the - # copied files will belong to the user running wic. - tar_file = os.path.realpath( - os.path.join(cr_workdir, "include-path%d.tar" % part.lineno)) - if os.path.isfile(include_path): - parent = os.path.dirname(os.path.realpath(include_path)) - tar_cmd = "tar c --owner=root --group=root -f %s -C %s %s" % ( - tar_file, parent, os.path.relpath(include_path, parent)) - exec_native_cmd(tar_cmd, native_sysroot) - else: - if include_path in krootfs_dir: - include_path = krootfs_dir[include_path] - include_path = cls.__get_rootfs_dir(include_path) - include_pseudo = os.path.join(include_path, "../pseudo") - if os.path.lexists(include_pseudo): - pseudo = cls.__get_pseudo(native_sysroot, include_path, - include_pseudo) - tar_cmd = "tar cf %s -C %s ." % (tar_file, include_path) - else: - pseudo = None - tar_cmd = "tar c --owner=root --group=root -f %s -C %s ." % ( - tar_file, include_path) - exec_native_cmd(tar_cmd, native_sysroot, pseudo) - - #create destination - if path: - destination = cls.__validate_path("--include-path", new_rootfs, path) - Path(destination).mkdir(parents=True, exist_ok=True) - else: - destination = new_rootfs + copyhardlinktree(part.rootfs_dir, new_rootfs) - #extract destination - untar_cmd = "tar xf %s -C %s" % (tar_file, destination) - if new_pseudo: - pseudo = cls.__get_pseudo(native_sysroot, new_rootfs, new_pseudo) - else: - pseudo = None - exec_native_cmd(untar_cmd, native_sysroot, pseudo) - os.remove(tar_file) + for path in part.include_path or []: + copyhardlinktree(path, new_rootfs) for orig_path in part.exclude_path or []: path = orig_path + if os.path.isabs(path): + logger.error("Must be relative: --exclude-path=%s" % orig_path) + sys.exit(1) - full_path = cls.__validate_path("--exclude-path", new_rootfs, path) + full_path = os.path.realpath(os.path.join(new_rootfs, path)) - if not os.path.lexists(full_path): - continue + # Disallow climbing outside of parent directory using '..', + # because doing so could be quite disastrous (we will delete the + # directory). + if not full_path.startswith(new_rootfs): + logger.error("'%s' points to a path outside the rootfs" % orig_path) + sys.exit(1) if path.endswith(os.sep): # Delete content only. @@ -212,5 +112,4 @@ class RootfsPlugin(SourcePlugin): shutil.rmtree(full_path) part.prepare_rootfs(cr_workdir, oe_builddir, - new_rootfs or part.rootfs_dir, native_sysroot, - pseudo_dir = new_pseudo or pseudo_dir) + new_rootfs or part.rootfs_dir, native_sysroot) |