"""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