[OE-core] [PATCH] do_image: Implement IMAGE_ROOTFS_EXCLUDE_PATH feature.
Kristian Amlie
kristian.amlie at mender.io
Wed Apr 26 15:03:51 UTC 2017
This is a direct followup from the earlier f6a064d969f414 commit in
wic. It works more or less the same way: The variable specifies a list
of directories relative to the root of the rootfs, and these
directories will be excluded from the resulting rootfs image. If an
entry ends with a slash, only the contents are omitted, not the
directory itself.
Signed-off-by: Kristian Amlie <kristian.amlie at mender.io>
---
meta/classes/image.bbclass | 73 ++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 71 insertions(+), 2 deletions(-)
diff --git a/meta/classes/image.bbclass b/meta/classes/image.bbclass
index 405fd73..a309435 100644
--- a/meta/classes/image.bbclass
+++ b/meta/classes/image.bbclass
@@ -496,8 +496,8 @@ python () {
d.setVar('do_image_%s' % t, '\n'.join(cmds))
d.setVarFlag('do_image_%s' % t, 'func', '1')
d.setVarFlag('do_image_%s' % t, 'fakeroot', '1')
- d.setVarFlag('do_image_%s' % t, 'prefuncs', debug + 'set_image_size')
- d.setVarFlag('do_image_%s' % t, 'postfuncs', 'create_symlinks')
+ d.setVarFlag('do_image_%s' % t, 'prefuncs', debug + 'set_image_size prepare_excluded_directories')
+ d.setVarFlag('do_image_%s' % t, 'postfuncs', 'create_symlinks cleanup_excluded_directories')
d.setVarFlag('do_image_%s' % t, 'subimages', ' '.join(subimages))
d.appendVarFlag('do_image_%s' % t, 'vardeps', ' '.join(vardeps))
d.appendVarFlag('do_image_%s' % t, 'vardepsexclude', 'DATETIME')
@@ -506,6 +506,75 @@ python () {
bb.build.addtask('do_image_%s' % t, 'do_image_complete', after, d)
}
+python prepare_excluded_directories() {
+ exclude_var = d.getVar('IMAGE_ROOTFS_EXCLUDE_PATH')
+ if not exclude_var:
+ return
+
+ import shutil
+ from oe.path import copyhardlinktree
+
+ exclude_list = exclude_var.split()
+
+ taskname = d.getVar("BB_CURRENTTASK")
+
+ rootfs_orig = d.getVar('IMAGE_ROOTFS')
+ # We need a new rootfs directory we can delete files from. Copy to
+ # workdir.
+ new_rootfs = os.path.realpath(os.path.join(d.getVar("WORKDIR"), "rootfs.%s" % taskname))
+
+ if os.path.lexists(new_rootfs):
+ shutil.rmtree(os.path.join(new_rootfs))
+
+ copyhardlinktree(rootfs_orig, new_rootfs)
+
+ for orig_path in exclude_list:
+ path = orig_path
+ if os.path.isabs(path):
+ msger.error("IMAGE_ROOTFS_EXCLUDE_PATH: Must be relative: %s" % orig_path)
+
+ full_path = os.path.realpath(os.path.join(new_rootfs, path))
+
+ # 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):
+ msger.error("'%s' points to a path outside the rootfs" % orig_path)
+
+ if path.endswith(os.sep):
+ # Delete content only.
+ for entry in os.listdir(full_path):
+ full_entry = os.path.join(full_path, entry)
+ if os.path.isdir(full_entry) and not os.path.islink(full_entry):
+ shutil.rmtree(full_entry)
+ else:
+ os.remove(full_entry)
+ else:
+ # Delete whole directory.
+ shutil.rmtree(full_path)
+
+ # Save old value for cleanup later.
+ d.setVar('IMAGE_ROOTFS_ORIG', rootfs_orig)
+ d.setVar('IMAGE_ROOTFS', new_rootfs)
+}
+
+python cleanup_excluded_directories() {
+ exclude_var = d.getVar('IMAGE_ROOTFS_EXCLUDE_PATH')
+ if not exclude_var:
+ return
+
+ import shutil
+
+ rootfs_dirs_excluded = d.getVar('IMAGE_ROOTFS')
+ rootfs_orig = d.getVar('IMAGE_ROOTFS_ORIG')
+ # This should never happen, since we should have set it to a different
+ # directory in the prepare function.
+ assert rootfs_dirs_excluded != rootfs_orig
+
+ shutil.rmtree(rootfs_dirs_excluded)
+ d.setVar('IMAGE_ROOTFS', rootfs_orig)
+}
+
#
# Compute the rootfs size
#
--
2.7.4
More information about the Openembedded-core
mailing list