[elbe-devel] [PATCH v2 3/6] Add definition/implementation of 'finetuning/file' XML tag

Torben Hohn torben.hohn at linutronix.de
Tue May 21 10:34:50 CEST 2019


On Fri, May 17, 2019 at 04:36:56PM +0200, dion at linutronix.de wrote:
> From: Olivier Dion <dion at linutronix.de>
> 
> The tag 'file' can be used under the tag 'finetuning'.
> 
> The implementation will ensure that the path to the
> destination exists by using 'mkdir_p'.
> 
> The user can provide the attribute 'append="true"' if she
> wants to append to the destination instead of truncate it
> (the default).
> 
> The user can also provide the attribute 'encoding'.  If
> that's the case, the content of the XML tag is decode
> according to the type of encoding before written to the
> file.  As for now, the only encoding supported are plain
> text (the default) and base64.
> 
> The user can provide the attribute 'owner', 'group' or
> 'mode' to the XML tag, using the 'chown', 'chgrp' and
> 'chmod' syntaxes.
> 
> NOTE!
> =====
> 
> - The 'owner' and 'group' attributes might stop the
>   operation if the user or group doesn't exist.  e.g. if the
>   group doesn't exist and thus 'chgrp' failed, 'chmod' will
>   never be done because of the exception throwed by Python
> 
> - The whole operation can fail if the destination is an
>   existing directory
> 
> Signed-off-by: Olivier Dion <dion at linutronix.de>

Reviewed-by: Torben Hohn <torben.hohn at linutronix.de>

> ---
>  elbepack/finetuning.py | 55 ++++++++++++++++++++++++++++++++++++++++++
>  schema/dbsfed.xsd      | 36 +++++++++++++++++++++++++++
>  2 files changed, 91 insertions(+)
> 
> diff --git a/elbepack/finetuning.py b/elbepack/finetuning.py
> index 97342862..7f6c4a6b 100644
> --- a/elbepack/finetuning.py
> +++ b/elbepack/finetuning.py
> @@ -9,6 +9,8 @@
>  from __future__ import print_function
>  
>  import os
> +import errno
> +import base64
>  
>  from shutil import rmtree
>  from gpg import core
> @@ -344,6 +346,59 @@ class AddGroupAction(FinetuningAction):
>  FinetuningAction.register(AddGroupAction)
>  
>  
> +class AddFileAction(FinetuningAction):
> +
> +    tag = 'file'
> +
> +    def __init__(self, node):
> +        FinetuningAction.__init__(self, node)
> +
> +    @staticmethod
> +    def decode(text, encoding):
> +        if encoding == "base64":
> +            return base64.standard_b64decode(text)
> +        else:
> +            raise FinetuningException("Invalid encoding %s" % encoding)
> +
> +    def execute(self, log, _buildenv, target):
> +
> +        att = self.node.et.attrib
> +        dst = att["dst"]
> +        content = self.node.et.text
> +        owner = None
> +        group = None
> +        mode = None
> +
> +        if "owner" in att: owner = att["owner"]
> +        if "group" in att: group = att["group"]
> +        if "mode"  in att: mode  = att["mode"]
> +
> +        try:
> +            target.mkdir_p(os.path.dirname(dst))
> +        except OSError as E:
> +            if E.errno is not errno.EEXIST:
> +                raise
> +
> +        if "encoding" in att:
> +            content = AddFileAction.decode(content, att["encoding"])
> +
> +        if "append" in att and att["append"] == "true":
> +            target.append_file(dst, content)
> +        else:
> +            target.write_file(dst, None, content)
> +
> +        if owner is not None:
> +            log.chroot(target.path, 'chown "%s" "%s"' % (owner, dst))
> +
> +        if group is not None:
> +            log.chroot(target.path, 'chgrp "%s" "%s"' % (group, dst))
> +
> +        if mode is not None:
> +            log.chroot(target.path, 'chmod "%s" "%s"' % (mode, dst))
> +
> +FinetuningAction.register(AddFileAction)
> +
> +
>  class RawCmdAction(FinetuningAction):
>  
>      tag = 'raw_cmd'
> diff --git a/schema/dbsfed.xsd b/schema/dbsfed.xsd
> index 333c0a8b..991a8d6f 100644
> --- a/schema/dbsfed.xsd
> +++ b/schema/dbsfed.xsd
> @@ -1737,6 +1737,13 @@
>            </documentation>
>          </annotation>
>        </element>
> +      <element name="file" type="rfs:file" minOccurs="0">
> +        <annotation>
> +          <documentation>
> +	    write or append text to a file
> +          </documentation>
> +        </annotation>
> +      </element>
>        <element name="rm" type="rfs:rm" minOccurs="0">
>          <annotation>
>            <documentation>
> @@ -2085,6 +2092,35 @@
>      </simpleContent>
>    </complexType>
>  
> +    <complexType name="file">
> +    <annotation>
> +      <documentation>
> +        write or append text to a file, the following parameters
> +        are avaible:
> +
> +        'dst' - the destination to write to
> +        'encoding' - the (optional) encoding of the content
> +        'append="True"' - append the content to file instead of writing
> +        'owner' - (optional) set file owner
> +        'group' - (optional) set group ownership
> +        'mode' - (optional) set file mode bits
> +
> +        The value of the tag is the raw/encoded content to
> +        write/append to the destination
> +      </documentation>
> +    </annotation>
> +    <simpleContent>
> +      <extension base="rfs:string">
> +        <attribute name="dst"      type="string"  use="required" />
> +        <attribute name="encoding" type="string"  use="optional" />
> +        <attribute name="append"   type="boolean" use="optional" />
> +        <attribute name="owner"    type="string"  use="optional" />
> +        <attribute name="group"    type="string"  use="optional" />
> +        <attribute name="mode"     type="string"  use="optional" />
> +      </extension>
> +    </simpleContent>
> +  </complexType>
> +
>    <complexType name="adduser">
>      <annotation>
>        <documentation>
> -- 
> 2.21.0
> 
> 
> _______________________________________________
> elbe-devel mailing list
> elbe-devel at linutronix.de
> https://lists.linutronix.de/mailman/listinfo/elbe-devel

-- 
Torben Hohn
Linutronix GmbH | Bahnhofstrasse 3 | D-88690 Uhldingen-Mühlhofen
Phone: +49 7556 25 999 18; Fax.: +49 7556 25 999 99

Hinweise zum Datenschutz finden Sie hier (Informations on data privacy 
can be found here): https://linutronix.de/kontakt/Datenschutz.php

Linutronix GmbH | Firmensitz (Registered Office): Uhldingen-Mühlhofen | 
Registergericht (Registration Court): Amtsgericht Freiburg i.Br., HRB700 
806 | Geschäftsführer (Managing Directors): Heinz Egger, Thomas Gleixner



More information about the elbe-devel mailing list