diff options
Diffstat (limited to 'scripts/lib/wic/plugins/source/rootfs.py')
| -rw-r--r-- | scripts/lib/wic/plugins/source/rootfs.py | 60 |
1 files changed, 58 insertions, 2 deletions
diff --git a/scripts/lib/wic/plugins/source/rootfs.py b/scripts/lib/wic/plugins/source/rootfs.py index 247f61ff7c..544e868b5e 100644 --- a/scripts/lib/wic/plugins/source/rootfs.py +++ b/scripts/lib/wic/plugins/source/rootfs.py | |||
| @@ -17,6 +17,7 @@ import shutil | |||
| 17 | import sys | 17 | import sys |
| 18 | 18 | ||
| 19 | from oe.path import copyhardlinktree | 19 | from oe.path import copyhardlinktree |
| 20 | from pathlib import Path | ||
| 20 | 21 | ||
| 21 | from wic import WicError | 22 | from wic import WicError |
| 22 | from wic.pluginbase import SourcePlugin | 23 | from wic.pluginbase import SourcePlugin |
| @@ -126,8 +127,63 @@ class RootfsPlugin(SourcePlugin): | |||
| 126 | orig_dir, new_rootfs) | 127 | orig_dir, new_rootfs) |
| 127 | exec_native_cmd(pseudo_cmd, native_sysroot) | 128 | exec_native_cmd(pseudo_cmd, native_sysroot) |
| 128 | 129 | ||
| 129 | for path in part.include_path or []: | 130 | for in_path in part.include_path or []: |
| 130 | copyhardlinktree(path, new_rootfs) | 131 | #parse arguments |
| 132 | include_path = in_path[0] | ||
| 133 | if len(in_path) > 2: | ||
| 134 | logger.error("'Invalid number of arguments for include-path") | ||
| 135 | sys.exit(1) | ||
| 136 | if len(in_path) == 2: | ||
| 137 | path = in_path[1] | ||
| 138 | else: | ||
| 139 | path = None | ||
| 140 | |||
| 141 | # Pack files to be included into a tar file. | ||
| 142 | # We need to create a tar file, because that way we can keep the | ||
| 143 | # permissions from the files even when they belong to different | ||
| 144 | # pseudo enviroments. | ||
| 145 | # If we simply copy files using copyhardlinktree/copytree... the | ||
| 146 | # copied files will belong to the user running wic. | ||
| 147 | tar_file = os.path.realpath( | ||
| 148 | os.path.join(cr_workdir, "include-path%d.tar" % part.lineno)) | ||
| 149 | if os.path.isfile(include_path): | ||
| 150 | parent = os.path.dirname(os.path.realpath(include_path)) | ||
| 151 | tar_cmd = "tar c --owner=root --group=root -f %s -C %s %s" % ( | ||
| 152 | tar_file, parent, os.path.relpath(include_path, parent)) | ||
| 153 | exec_native_cmd(tar_cmd, native_sysroot) | ||
| 154 | else: | ||
| 155 | if include_path in krootfs_dir: | ||
| 156 | include_path = krootfs_dir[include_path] | ||
| 157 | include_path = cls.__get_rootfs_dir(include_path) | ||
| 158 | include_pseudo = os.path.join(include_path, "../pseudo") | ||
| 159 | if os.path.lexists(include_pseudo): | ||
| 160 | pseudo = cls.__get_pseudo(native_sysroot, include_path, | ||
| 161 | include_pseudo) | ||
| 162 | tar_cmd = "tar cf %s -C %s ." % (tar_file, include_path) | ||
| 163 | else: | ||
| 164 | pseudo = None | ||
| 165 | tar_cmd = "tar c --owner=root --group=root -f %s -C %s ." % ( | ||
| 166 | tar_file, include_path) | ||
| 167 | exec_native_cmd(tar_cmd, native_sysroot, pseudo) | ||
| 168 | |||
| 169 | #create destination | ||
| 170 | if path: | ||
| 171 | destination = os.path.realpath(os.path.join(new_rootfs, path)) | ||
| 172 | if not destination.startswith(new_rootfs): | ||
| 173 | logger.error("%s %s" % (destination, new_rootfs)) | ||
| 174 | sys.exit(1) | ||
| 175 | Path(destination).mkdir(parents=True, exist_ok=True) | ||
| 176 | else: | ||
| 177 | destination = new_rootfs | ||
| 178 | |||
| 179 | #extract destination | ||
| 180 | untar_cmd = "tar xf %s -C %s" % (tar_file, destination) | ||
| 181 | if new_pseudo: | ||
| 182 | pseudo = cls.__get_pseudo(native_sysroot, new_rootfs, new_pseudo) | ||
| 183 | else: | ||
| 184 | pseudo = None | ||
| 185 | exec_native_cmd(untar_cmd, native_sysroot, pseudo) | ||
| 186 | os.remove(tar_file) | ||
| 131 | 187 | ||
| 132 | for orig_path in part.exclude_path or []: | 188 | for orig_path in part.exclude_path or []: |
| 133 | path = orig_path | 189 | path = orig_path |
