[elbe-devel] [PATCH 4/6] finetuning: implement <copy_to|from_partition /> for <image-finetuning>
Manuel Traut
manut at linutronix.de
Fri Dec 21 10:55:46 CET 2018
On 17:02 Wed 19 Dec , Torben Hohn wrote:
> image-finetuning is in the body of an <losetup> block.
> allow copying artifact from/to a filesystem residing on an image partition.
>
> Signed-off-by: Torben Hohn <torben.hohn at linutronix.de>
> ---
> elbepack/finetuning.py | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++
> schema/dbsfed.xsd | 48 ++++++++++++++++++++++++++++++++++++
> 2 files changed, 115 insertions(+)
>
> diff --git a/elbepack/finetuning.py b/elbepack/finetuning.py
> index 324aebef..3ef273d8 100644
> --- a/elbepack/finetuning.py
> +++ b/elbepack/finetuning.py
> @@ -20,6 +20,7 @@ from apt.package import FetchError
> from elbepack.repomanager import UpdateRepo
> from elbepack.rpcaptcache import get_rpcaptcache
> from elbepack.shellhelper import CommandError
> +from elbepack.filesystem import Filesystem
>
>
> class FinetuningException(Exception):
> @@ -623,6 +624,72 @@ class ExtractPartitionAction(ImageFinetuningAction):
> FinetuningAction.register(ExtractPartitionAction)
>
>
> +class CopyFromPartition(ImageFinetuningAction):
> +
> + tag = 'copy_from_partition'
> +
> + def __init__(self, node):
> + ImageFinetuningAction.__init__(self, node)
> +
> + def execute(self, _log, _buildenv, _target):
> + raise NotImplementedError("<copy_from_partition> may only be "
> + "used in <mount_drive>")
> +
> + def execute_img(self, log, _buildenv, target, builddir, loop_dev):
> + part_nr = self.node.et.attrib['part']
> + aname = self.node.et.attrib['artifact']
> +
> + img_mnt = os.path.join(builddir, 'imagemnt')
> + mnt_fs = Filesystem(img_mnt)
> + fname = mnt_fs.fname(self.node.et.text)
> +
> + cmd = 'mount "%sp%s" "%s"' % (loop_dev, part_nr, img_mnt)
> + log.do(cmd)
i think mount is needed in multiple finetunings, shouldn't it be implemented in
an reusable way?
with mount() as mnt_fs: ??
> +
> + try:
> + cmd = 'cp "%s" "%s"' % (fname, os.path.join(builddir, aname))
> + log.do(cmd)
> +
> + target.images.append(aname)
> + finally:
> + log.do('umount "%s"' % img_mnt)
> +
> +
> +FinetuningAction.register(CopyFromPartition)
> +
> +
> +class CopyToPartition(ImageFinetuningAction):
> +
> + tag = 'copy_to_partition'
> +
> + def __init__(self, node):
> + ImageFinetuningAction.__init__(self, node)
> +
> + def execute(self, _log, _buildenv, _target):
> + raise NotImplementedError("<copy_to_partition> may only be "
> + "used in <mount_drive>")
> +
> + def execute_img(self, log, _buildenv, _target, builddir, loop_dev):
> + part_nr = self.node.et.attrib['part']
> + aname = self.node.et.attrib['artifact']
> +
> + img_mnt = os.path.join(builddir, 'imagemnt')
> + mnt_fs = Filesystem(img_mnt)
> + fname = mnt_fs.fname(self.node.et.text)
> +
> + cmd = 'mount "%sp%s" "%s"' % (loop_dev, part_nr, img_mnt)
> + log.do(cmd)
> +
> + try:
> + cmd = 'cp "%s" "%s"' % (os.path.join(builddir, aname), fname)
> + log.do(cmd)
> + finally:
> + log.do('umount "%s"' % img_mnt)
> +
> +
> +FinetuningAction.register(CopyToPartition)
> +
> +
> def do_finetuning(xml, log, buildenv, target):
>
> if not xml.has('target/finetuning'):
> diff --git a/schema/dbsfed.xsd b/schema/dbsfed.xsd
> index b1fb0f45..bdd3d013 100644
> --- a/schema/dbsfed.xsd
> +++ b/schema/dbsfed.xsd
> @@ -1944,6 +1944,22 @@
> </documentation>
> </annotation>
> </element>
> + <element name="copy_from_partition" type="rfs:copy_from_partition" minOccurs="0">
> + <annotation>
> + <documentation>
> + Copy a file from a partition. The partition is mounted, and the file is then
> + copied from the mounted filesystem into the builddir. Its marked as an Artifact.
> + </documentation>
> + </annotation>
> + </element>
> + <element name="copy_to_partition" type="rfs:copy_to_partition" minOccurs="0">
> + <annotation>
> + <documentation>
> + Copy an artifact onto a partition. The partition is mounted, and the file is then
> + copied into the mounted filesystem.
> + </documentation>
> + </annotation>
> + </element>
> </choice>
> </group>
>
> @@ -1962,6 +1978,38 @@
> </simpleContent>
> </complexType>
>
> + <complexType name="copy_from_partition">
> + <annotation>
> + <documentation>
> + Attribute 'part' describes the partition to be mounted (nr).
> + The value of the tag describes the filename to be copied from the
> + Filesystem, after it has been mounted.
> + Attribute 'artifact' is the artifact name.
> + </documentation>
> + </annotation>
> + <simpleContent>
> + <extension base="rfs:string">
> + <attribute name="part" type="integer" use="required" />
> + <attribute name="artifact" type="string" use="required" />
> + </extension>
> + </simpleContent>
> + </complexType>
> + <complexType name="copy_to_partition">
> + <annotation>
> + <documentation>
> + Attribute 'part' describes the partition to be mounted (nr).
> + The value of the tag describes the filename where the artifact shall
> + be copied to, onto the filesystem, after it has been mounted.
> + Attribute 'artifact' is the artifact name.
> + </documentation>
> + </annotation>
> + <simpleContent>
> + <extension base="rfs:string">
> + <attribute name="part" type="integer" use="required" />
> + <attribute name="artifact" type="string" use="required" />
> + </extension>
> + </simpleContent>
> + </complexType>
> <complexType name="addgroup">
> <annotation>
> <documentation>
> --
> 2.11.0
>
>
> _______________________________________________
> elbe-devel mailing list
> elbe-devel at linutronix.de
> https://lists.linutronix.de/mailman/listinfo/elbe-devel
More information about the elbe-devel
mailing list