summaryrefslogtreecommitdiffstats
path: root/scripts/lib/wic/plugins/source/rootfs.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/lib/wic/plugins/source/rootfs.py')
-rw-r--r--scripts/lib/wic/plugins/source/rootfs.py43
1 files changed, 42 insertions, 1 deletions
diff --git a/scripts/lib/wic/plugins/source/rootfs.py b/scripts/lib/wic/plugins/source/rootfs.py
index 9d959fa7d7..c57a4341d1 100644
--- a/scripts/lib/wic/plugins/source/rootfs.py
+++ b/scripts/lib/wic/plugins/source/rootfs.py
@@ -26,10 +26,13 @@
26# 26#
27 27
28import os 28import os
29import shutil
30
31from oe.path import copyhardlinktree
29 32
30from wic import msger 33from wic import msger
31from wic.pluginbase import SourcePlugin 34from wic.pluginbase import SourcePlugin
32from wic.utils.misc import get_bitbake_var 35from wic.utils.misc import get_bitbake_var, exec_cmd
33 36
34class RootfsPlugin(SourcePlugin): 37class RootfsPlugin(SourcePlugin):
35 """ 38 """
@@ -78,6 +81,44 @@ class RootfsPlugin(SourcePlugin):
78 81
79 real_rootfs_dir = cls.__get_rootfs_dir(rootfs_dir) 82 real_rootfs_dir = cls.__get_rootfs_dir(rootfs_dir)
80 83
84 # Handle excluded paths.
85 if part.exclude_path is not None:
86 # We need a new rootfs directory we can delete files from. Copy to
87 # workdir.
88 new_rootfs = os.path.realpath(os.path.join(cr_workdir, "rootfs"))
89
90 if os.path.lexists(new_rootfs):
91 shutil.rmtree(os.path.join(new_rootfs))
92
93 copyhardlinktree(real_rootfs_dir, new_rootfs)
94
95 real_rootfs_dir = new_rootfs
96
97 for orig_path in part.exclude_path:
98 path = orig_path
99 if os.path.isabs(path):
100 msger.error("Must be relative: --exclude-path=%s" % orig_path)
101
102 full_path = os.path.realpath(os.path.join(new_rootfs, path))
103
104 # Disallow climbing outside of parent directory using '..',
105 # because doing so could be quite disastrous (we will delete the
106 # directory).
107 if not full_path.startswith(new_rootfs):
108 msger.error("'%s' points to a path outside the rootfs" % orig_path)
109
110 if path.endswith(os.sep):
111 # Delete content only.
112 for entry in os.listdir(full_path):
113 full_entry = os.path.join(full_path, entry)
114 if os.path.isdir(full_entry) and not os.path.islink(full_entry):
115 shutil.rmtree(full_entry)
116 else:
117 os.remove(full_entry)
118 else:
119 # Delete whole directory.
120 shutil.rmtree(full_path)
121
81 part.rootfs_dir = real_rootfs_dir 122 part.rootfs_dir = real_rootfs_dir
82 part.prepare_rootfs(cr_workdir, oe_builddir, 123 part.prepare_rootfs(cr_workdir, oe_builddir,
83 real_rootfs_dir, native_sysroot) 124 real_rootfs_dir, native_sysroot)