From 876055ee7be3bc1f05cdff4f3cb070cbe3b0e6a7 Mon Sep 17 00:00:00 2001 From: Jonathas-Conceicao Date: Wed, 9 Jun 2021 18:31:40 -0300 Subject: [PATCH] Add support for archiving raw-delta object Signed-off-by: Jonathas-Conceicao --- uhu/core/_object.py | 8 ++++++++ uhu/core/delta.py | 33 +++++++++++++++++++++++++++++++++ uhu/core/modes.py | 20 ++++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 uhu/core/delta.py diff --git a/uhu/core/_object.py b/uhu/core/_object.py index 5d52beb..4bddfbb 100644 --- a/uhu/core/_object.py +++ b/uhu/core/_object.py @@ -9,6 +9,7 @@ from ._options import Options from .compression import compression_to_metadata +from .delta import validate_delta from .install_condition import InstallCondition from .validators import validate_options @@ -64,6 +65,7 @@ def __init__(cls, classname, bases, methods): class BaseObject(metaclass=ObjectType): mode = None + using_delta = False allow_compression = False allow_install_condition = False options = [] @@ -93,6 +95,7 @@ def to_metadata(self, callback=None): metadata['mode'] = self.mode metadata.update(self._metadata_install_condition(metadata)) metadata.update(self._metadata_compression()) + metadata.update(self._metadata_delta()) return metadata def _metadata_install_condition(self, metadata): @@ -105,6 +108,11 @@ def _metadata_compression(self): return {} return compression_to_metadata(self.filename) + def _metadata_delta(self): + if not self.using_delta: + return {} + return validate_delta(self.filename) + def to_upload(self): return { 'filename': self['filename'], diff --git a/uhu/core/delta.py b/uhu/core/delta.py new file mode 100644 index 0000000..c3f9f94 --- /dev/null +++ b/uhu/core/delta.py @@ -0,0 +1,33 @@ +# Copyright (C) 2021 O.S. Systems Software LTDA. +# SPDX-License-Identifier: GPL-2.0 + +ARCHIVERS = { + # Bita format: https://github.com/oll3/bita + 'bita': { + 'signature': b'BITA1\0', + }, +} + + +MAX_ARCHIVER_SIGNATURE_SIZE = max( + [len(archiver['signature']) for archiver in ARCHIVERS.values()] +) + + +def get_archiver_format(fn): + """Returns the delta archiver backend for a given file. + """ + with open(fn, 'rb') as fp: + header = fp.read(MAX_ARCHIVER_SIGNATURE_SIZE) + for fmt, archiver in ARCHIVERS.items(): + signature = archiver['signature'] + if signature == header[:len(signature)]: + return fmt + return None + + +def validate_delta(filename): + if get_archiver_format(filename) is None: + err = '"{}" doesn\'t match a known format type' + raise ValueError(err.format(filename)) + return {} diff --git a/uhu/core/modes.py b/uhu/core/modes.py index 5cad348..9b06d3a 100644 --- a/uhu/core/modes.py +++ b/uhu/core/modes.py @@ -209,3 +209,23 @@ class ZephyrObject(BaseObject): required_options = [ 'filename', ] + + +class RawDeltaObject(BaseObject): + mode = 'raw-delta' + using_delta = True + allow_compression = False + allow_install_condition = False + target_types = ['device'] + options = [ + 'filename', + 'sha256sum', + 'size', + 'target-type', + 'target', + ] + required_options = [ + 'filename', + 'target-type', + 'target', + ]