Skip to content

Commit 2d1875b

Browse files
committed
fixup! Add support for RAUC file parsing
1 parent c3407de commit 2d1875b

4 files changed

Lines changed: 132 additions & 15 deletions

File tree

goosebit/updates/__init__.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,25 @@
1919
async def create_software_update(uri: str, temp_file: Path | None) -> Software:
2020
parsed_uri = urlparse(uri)
2121

22-
# parse swu header into update_info
22+
# parse image header into update_info
2323
if parsed_uri.scheme == "file":
2424
if temp_file is None:
2525
raise HTTPException(500, "Temporary file missing, cannot parse file information")
2626
try:
2727
update_info = await swdesc.parse_file(temp_file)
2828
except Exception:
29-
raise HTTPException(422, "Software swu header cannot be parsed")
29+
raise HTTPException(422, "Software image header cannot be parsed")
3030

3131
elif parsed_uri.scheme.startswith("http"):
3232
try:
3333
update_info = await swdesc.parse_remote(uri)
3434
except Exception:
35-
raise HTTPException(422, "Software swu header cannot be parsed")
35+
raise HTTPException(422, "Software image header cannot be parsed")
3636
else:
3737
raise HTTPException(422, "Software URI protocol unknown")
3838

3939
if update_info is None:
40-
raise HTTPException(422, "Software swu header contains invalid data")
40+
raise HTTPException(422, "Software image header contains invalid data")
4141

4242
# check for collisions
4343
is_colliding = await _is_software_colliding(update_info)

goosebit/updates/swdesc/rauc.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import configparser
22
import logging
3+
import re
34

45
import semver
56
from anyio import Path, open_file
@@ -32,14 +33,17 @@ async def parse_file(file: Path):
3233
def parse_descriptor(manifest: configparser.ConfigParser):
3334
swdesc_attrs = {}
3435
try:
35-
swdesc_attrs["version"] = semver.Version.parse(manifest["system"].get("version"))
36-
swdesc_attrs["compatibility"] = [{"hw_model": "default", "hw_revision": manifest["system"]["compatible"]}]
37-
except KeyError:
38-
try:
39-
swdesc_attrs["version"] = semver.Version.parse(manifest["update"].get("version"))
40-
swdesc_attrs["compatibility"] = [{"hw_model": "default", "hw_revision": manifest["update"]["compatible"]}]
41-
except KeyError as e:
42-
logger.warning(f"Parsing RAUC descriptor failed, error={e}")
43-
raise ValueError("Parsing RAUC descriptor failed", e)
36+
swdesc_attrs["version"] = semver.Version.parse(manifest["update"].get("version"))
37+
pattern = re.compile(r"^(?P<hw_model>.+?)[- ]?(?P<hw_revision>\w*[\d.]+\w*)?$")
38+
hw_model = "default"
39+
hw_revision = "default"
40+
m = pattern.match(manifest["update"]["compatible"])
41+
if m:
42+
hw_model = m.group("hw_model")
43+
hw_revision = m.group("hw_revision") or "default"
44+
swdesc_attrs["compatibility"] = [{"hw_model": hw_model, "hw_revision": hw_revision}]
45+
except KeyError as e:
46+
logger.warning(f"Parsing RAUC descriptor failed, error={e}")
47+
raise ValueError("Parsing RAUC descriptor failed", e)
4448

4549
return swdesc_attrs

poetry.lock

Lines changed: 113 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ dependencies = [
2626
"pydantic-settings[yaml] (>=2.10.1,<3.0.0)",
2727
"uvicorn (>=0.35.0,<0.36.0)",
2828
"boto3 (>=1.40.8,<2.0.0)",
29-
"pysquashfsimage (>=0.9.0,<1.0.0)"
29+
"pysquashfsimage (>=0.9.0,<1.0.0)",
30+
"zstandard (>=0.24.0,<0.25.0)"
3031
]
3132

3233
[project.optional-dependencies]

0 commit comments

Comments
 (0)