[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:
@@ -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}"
|
||||
)
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user