50 lines
3.1 KiB
Python
50 lines
3.1 KiB
Python
"""The Node release carries this model profile from the first hardware use."""
|
|
from pathlib import Path, PurePosixPath
|
|
import hashlib
|
|
import json
|
|
import tarfile
|
|
|
|
|
|
def payload():
|
|
root = Path(__file__).resolve().parents[1]
|
|
files = [("usr/lib/mission-core-vesc/runtime/" + p.name, p.read_bytes(), 0o644)
|
|
for p in sorted((root / "runtime").glob("*.py"))]
|
|
files.extend(("usr/lib/mission-core-vesc/runtime/" + str(p.relative_to(root / "runtime")), p.read_bytes(), 0o644)
|
|
for p in sorted((root / "runtime/schemas").rglob("*")) if p.is_file())
|
|
files.append(("usr/lib/mission-core-vesc/runtime/archive.py",
|
|
(root.parents[1] / "src/k1link/device_plugins/vesc/archive.py").read_bytes(), 0o644))
|
|
for name in ("mission-core-vesc.service", "mission-core-node-vesc-prepare.service"):
|
|
files.append(("usr/lib/systemd/system/" + name, (root / "packaging" / name).read_bytes(), 0o644))
|
|
files.append(("usr/lib/mission-core-vesc/prepare.py", (root / "packaging/prepare.py").read_bytes(), 0o644))
|
|
files.append(("usr/lib/mission-core-vesc/clear_runtime_cache.py", (root / "packaging/clear_runtime_cache.py").read_bytes(), 0o644))
|
|
files.append(("usr/share/mission-core-node/profiles/vesc/70-mission-core-vesc.rules",
|
|
(root / "packaging/70-mission-core-vesc.rules").read_bytes(), 0o644))
|
|
manifest = json.loads((root / "packaging/native-runtime.json").read_text())
|
|
bundle = root / "build/native-runtime" / manifest["file"]
|
|
data = bundle.read_bytes()
|
|
if len(data) != manifest["bytes"] or hashlib.sha256(data).hexdigest() != manifest["sha256"]:
|
|
raise ValueError("Native VESC Tool bundle changed")
|
|
seen = set()
|
|
with tarfile.open(bundle, "r:gz") as archive:
|
|
for member in archive.getmembers():
|
|
path = PurePosixPath(member.name)
|
|
if (not member.isfile() or path.is_absolute() or ".." in path.parts
|
|
or path.as_posix() != member.name or member.name in seen
|
|
or member.name not in manifest["files"]):
|
|
raise ValueError("Unexpected native payload member")
|
|
seen.add(member.name)
|
|
expected = manifest["files"][member.name]
|
|
if member.size != expected["bytes"] or member.size > 128 * 1024**2:
|
|
raise ValueError("Native member size mismatch")
|
|
content = archive.extractfile(member).read()
|
|
if hashlib.sha256(content).hexdigest() != expected["sha256"]:
|
|
raise ValueError("Native member hash mismatch")
|
|
mode = 0o755 if member.name.startswith("bin/") else 0o644
|
|
files.append(("usr/lib/mission-core-vesc/native/" + member.name, content, mode))
|
|
if seen != set(manifest["files"]): raise ValueError("Incomplete native payload")
|
|
files.append(("usr/lib/mission-core-vesc/native/manifest.json",
|
|
(root / "packaging/native-runtime.json").read_bytes(), 0o644))
|
|
files.append(("usr/lib/mission-core-vesc/native_check.py",
|
|
(root / "packaging/native_check.py").read_bytes(), 0o644))
|
|
return files
|