Files
NODEDC_MISSION_CORE/plugins/vesc/packaging/payload.py
T

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