[FL-2477] Updater support for resource bundles (#1131)

* Resource unpacking core
* Added more fields to manifest; updated dist scripts
* Python linter fixes
* Parsing manifest before unpacking
* Updated pipelines for separate resource build
* Removed raw path formatting
* Visual progress for resource extraction
* Renamed update status enum

Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
This commit is contained in:
hedger
2022-04-19 11:03:28 +03:00
committed by GitHub
parent 1623134a82
commit e8499e4ede
12 changed files with 260 additions and 47 deletions

View File

@@ -18,6 +18,7 @@ class Main(App):
self.parser_copy.add_argument("-t", dest="target", required=True)
self.parser_copy.add_argument("-p", dest="projects", nargs="+", required=True)
self.parser_copy.add_argument("-s", dest="suffix", required=True)
self.parser_copy.add_argument("-a", dest="assets", required=False)
self.parser_copy.add_argument(
"--bundlever",
dest="version",
@@ -83,6 +84,13 @@ class Main(App):
"-stage",
self.get_dist_filepath(self.get_project_filename("updater", "bin")),
]
if self.args.assets:
bundle_args.extend(
(
"-a",
self.args.assets,
)
)
self.logger.info(
f"Use this directory to self-update your Flipper:\n\t{bundle_dir}"
)

View File

@@ -3,12 +3,16 @@
from flipper.app import App
from flipper.utils.fff import FlipperFormatFile
from os.path import basename, join, exists
from os import makedirs
import os
import shutil
import zlib
import tarfile
class Main(App):
# No compression, plain tar
ASSET_TAR_MODE = "w:"
def init(self):
self.subparsers = self.parser.add_subparsers(help="sub-command help")
@@ -20,24 +24,41 @@ class Main(App):
self.parser_generate.add_argument("-d", dest="directory", required=True)
self.parser_generate.add_argument("-v", dest="version", required=True)
self.parser_generate.add_argument("-t", dest="target", required=True)
self.parser_generate.add_argument("-dfu", dest="dfu", required=True)
self.parser_generate.add_argument("-dfu", dest="dfu", required=False)
self.parser_generate.add_argument("-a", dest="assets", required=False)
self.parser_generate.add_argument("-stage", dest="stage", required=True)
self.parser_generate.add_argument("-radio", dest="radiobin", required=False)
self.parser_generate.add_argument(
"-radio", dest="radiobin", default="", required=False
)
self.parser_generate.add_argument(
"-radioaddr", dest="radioaddr", required=False
)
self.parser_generate.add_argument(
"-radiover", dest="radioversion", required=False
)
self.parser_generate.set_defaults(func=self.generate)
def generate(self):
stage_basename = basename(self.args.stage)
dfu_basename = basename(self.args.dfu)
radiobin_basename = basename(self.args.radiobin)
assets_basename = ""
if not exists(self.args.directory):
makedirs(self.args.directory)
os.makedirs(self.args.directory)
shutil.copyfile(self.args.stage, join(self.args.directory, stage_basename))
shutil.copyfile(self.args.dfu, join(self.args.directory, dfu_basename))
if radiobin_basename:
shutil.copyfile(
self.args.radiobin, join(self.args.directory, radiobin_basename)
)
if self.args.assets:
assets_basename = "assets.tar"
self.package_assets(
self.args.assets, join(self.args.directory, assets_basename)
)
file = FlipperFormatFile()
file.setHeader("Flipper firmware upgrade configuration", 1)
@@ -47,12 +68,24 @@ class Main(App):
file.writeComment("little-endian hex!")
file.writeKey("Loader CRC", self.int2ffhex(self.crc(self.args.stage)))
file.writeKey("Firmware", dfu_basename)
file.writeKey("Radio", self.args.radiobin or "")
file.writeKey("Radio", radiobin_basename or "")
file.writeKey("Radio address", self.int2ffhex(self.args.radioaddr or 0))
file.save("%s/update.fuf" % self.args.directory)
file.writeKey("Radio version", self.int2ffhex(self.args.radioversion or 0))
if radiobin_basename:
file.writeKey("Radio CRC", self.int2ffhex(self.crc(self.args.radiobin)))
else:
file.writeKey("Radio CRC", self.int2ffhex(0))
file.writeKey("Assets", assets_basename)
file.save(join(self.args.directory, "update.fuf"))
return 0
def package_assets(self, srcdir: str, dst_name: str):
with tarfile.open(
dst_name, self.ASSET_TAR_MODE, format=tarfile.USTAR_FORMAT
) as tarball:
tarball.add(srcdir, arcname="")
@staticmethod
def int2ffhex(value: int):
hexstr = "%08X" % value