44 lines
1.3 KiB
Python
44 lines
1.3 KiB
Python
#!/usr/bin/env python3
|
|
"""Sign firmware and stage it for the server OTA endpoint."""
|
|
import argparse, hashlib, json
|
|
from pathlib import Path
|
|
|
|
from sign_firmware import sign_firmware
|
|
|
|
|
|
def deploy(firmware_path: Path, key_path: Path,
|
|
version: str, output_dir: Path) -> None:
|
|
output_dir.mkdir(parents=True, exist_ok=True)
|
|
|
|
data = firmware_path.read_bytes()
|
|
sig = sign_firmware(firmware_path, key_path)
|
|
|
|
(output_dir / "current.bin").write_bytes(data)
|
|
(output_dir / "current.sig").write_bytes(sig)
|
|
(output_dir / "manifest.json").write_text(json.dumps({
|
|
"version": version,
|
|
"size": len(data),
|
|
"sha256": hashlib.sha256(data).hexdigest(),
|
|
}, indent=2))
|
|
|
|
print(f"Deployed {firmware_path.name} v{version} → {output_dir}/")
|
|
|
|
|
|
def main() -> None:
|
|
p = argparse.ArgumentParser(description=__doc__)
|
|
p.add_argument("firmware", help="Path to .bin")
|
|
p.add_argument("version", help="Version string, e.g. 1.2.3")
|
|
p.add_argument("--key", default="secrets/firmware_signing_key.pem")
|
|
p.add_argument("--out-dir", default="server/firmware")
|
|
args = p.parse_args()
|
|
deploy(
|
|
firmware_path=Path(args.firmware),
|
|
key_path=Path(args.key),
|
|
version=args.version,
|
|
output_dir=Path(args.out_dir),
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|