[OE-core] [PATCH v1] wic: Add --exclude-path option to rootfs source plugin.
Maciej Borzęcki
maciej.borzecki at rndity.com
Fri Nov 25 12:28:20 UTC 2016
On Fri, Nov 25, 2016 at 11:15 AM, Kristian Amlie
<kristian.amlie at mender.io> wrote:
> It will omit the given path from the resulting partition, and if the
> given path ends in a slash, it will only delete the content, and keep
> the directory.
>
> Since mkfs only accepts whole directories as input, we need to copy
> the rootfs directory to the workdir so that we can selectively delete
> files from it.
>
> Signed-off-by: Kristian Amlie <kristian.amlie at mender.io>
> ---
> scripts/lib/wic/help.py | 6 ++++
> scripts/lib/wic/ksparser.py | 1 +
> scripts/lib/wic/partition.py | 1 +
> scripts/lib/wic/plugins/source/rootfs.py | 51 +++++++++++++++++++++++++++++++-
> 4 files changed, 58 insertions(+), 1 deletion(-)
>
> diff --git a/scripts/lib/wic/help.py b/scripts/lib/wic/help.py
> index e5347ec..9dab670 100644
> --- a/scripts/lib/wic/help.py
> +++ b/scripts/lib/wic/help.py
> @@ -715,6 +715,12 @@ DESCRIPTION
> partition table. It may be useful for
> bootloaders.
>
> + --exclude-path: This option is specific to wic. It excludes the given
> + absolute path from the resulting image. If the path
> + ends with a slash, only the content of the directory
> + is omitted, not the directory itself. This option only
> + has an effect with the rootfs source plugin.
> +
> --extra-space: This option is specific to wic. It adds extra
> space after the space filled by the content
> of the partition. The final size can go
> diff --git a/scripts/lib/wic/ksparser.py b/scripts/lib/wic/ksparser.py
> index 0894e2b..17b97fd0 100644
> --- a/scripts/lib/wic/ksparser.py
> +++ b/scripts/lib/wic/ksparser.py
> @@ -127,6 +127,7 @@ class KickStart():
> part.add_argument('mountpoint', nargs='?')
> part.add_argument('--active', action='store_true')
> part.add_argument('--align', type=int)
> + part.add_argument('--exclude-path', nargs='+')
> part.add_argument("--extra-space", type=sizetype, default=10*1024)
> part.add_argument('--fsoptions', dest='fsopts')
> part.add_argument('--fstype')
> diff --git a/scripts/lib/wic/partition.py b/scripts/lib/wic/partition.py
> index ac4c836..cba78a5 100644
> --- a/scripts/lib/wic/partition.py
> +++ b/scripts/lib/wic/partition.py
> @@ -45,6 +45,7 @@ class Partition():
> self.align = args.align
> self.disk = args.disk
> self.extra_space = args.extra_space
> + self.exclude_path = args.exclude_path
> self.fsopts = args.fsopts
> self.fstype = args.fstype
> self.label = args.label
> diff --git a/scripts/lib/wic/plugins/source/rootfs.py b/scripts/lib/wic/plugins/source/rootfs.py
> index 425da8b..d97d99c 100644
> --- a/scripts/lib/wic/plugins/source/rootfs.py
> +++ b/scripts/lib/wic/plugins/source/rootfs.py
> @@ -26,10 +26,11 @@
> #
>
> import os
> +import shutil
>
> from wic import msger
> from wic.pluginbase import SourcePlugin
> -from wic.utils.oe.misc import get_bitbake_var
> +from wic.utils.oe.misc import get_bitbake_var, exec_cmd
>
> class RootfsPlugin(SourcePlugin):
> """
> @@ -78,6 +79,54 @@ class RootfsPlugin(SourcePlugin):
>
> real_rootfs_dir = cls.__get_rootfs_dir(rootfs_dir)
>
> + # Handle excluded paths.
> + if part.exclude_path is not None:
> + # We need a new rootfs directory we can delete files from. Copy to
> + # workdir.
> + new_rootfs = os.path.join(cr_workdir, "rootfs")
> +
> + if os.path.lexists(new_rootfs):
> + shutil.rmtree(os.path.join(new_rootfs))
> +
> + if os.stat(real_rootfs_dir).st_dev == os.stat(cr_workdir).st_dev:
> + # Optimization if both directories are on the same file system:
> + # copy using hardlinks.
> + cp_args = "-al"
> + else:
> + cp_args = "-a"
> + exec_cmd("cp %s %s %s" % (cp_args, real_rootfs_dir, new_rootfs))
> +
> + real_rootfs_dir = new_rootfs
> +
> + for orig_path in part.exclude_path:
> + path = orig_path
> + if not os.path.isabs(path):
> + msger.error("Must be absolute: --exclude-path=%s" % orig_path)
> +
> + while os.path.isabs(path):
> + path = path[1:]
> +
> + # Disallow '..', because doing so could be quite disastrous
> + # (we will delete the directory).
> + remaining = path
> + while True:
> + (head, tail) = os.path.split(remaining)
> + if tail == '..':
> + msger.error("'..' not allowed: --exclude-path=%s" % orig_path)
> + elif head == "":
> + break
> + remaining = head
Why not do this instead?
if '..' in path:
msger.error("'..' not allowed: --exclude-path=%s" % orig_path)
> +
> + full_path = os.path.join(new_rootfs, path)
> +
> + if path.endswith(os.sep):
> + # Delete content only.
> + for entry in os.listdir(full_path):
> + shutil.rmtree(os.path.join(full_path, entry))
> + else:
> + # Delete whole directory.
> + shutil.rmtree(full_path)
> +
> part.rootfs_dir = real_rootfs_dir
> part.prepare_rootfs(cr_workdir, oe_builddir, real_rootfs_dir, native_sysroot)
>
> --
> 2.7.4
>
--
Maciej Borzecki
RnDity
More information about the Openembedded-core
mailing list