49 lines
1.7 KiB
Python
49 lines
1.7 KiB
Python
"""Root-only CLI for the branch-bound repair lease API."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import json
|
|
import os
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
from aios_branch_repair_lease_api import BranchRepairLeaseAPI
|
|
from branch_repair_lease import GitProbe, LeaseStore
|
|
from branch_repair_lease import RepairLeaseManager
|
|
|
|
|
|
def main() -> int:
|
|
parser = argparse.ArgumentParser(description="AIOS branch repair lease CLI")
|
|
parser.add_argument("--store", required=True)
|
|
parser.add_argument("--bare-repo", required=True)
|
|
parser.add_argument("--request-file")
|
|
parser.add_argument("--request-json")
|
|
args = parser.parse_args()
|
|
if hasattr(os, "geteuid") and os.geteuid() != 0:
|
|
print(json.dumps({"status": "blocked", "error": "root_required"}))
|
|
return 2
|
|
if bool(args.request_file) == bool(args.request_json):
|
|
print(json.dumps({"status": "blocked", "error": "one_request_source_required"}))
|
|
return 2
|
|
try:
|
|
raw = (
|
|
Path(args.request_file).read_text(encoding="utf-8")
|
|
if args.request_file
|
|
else str(args.request_json)
|
|
)
|
|
request = json.loads(raw)
|
|
if not isinstance(request, dict):
|
|
raise ValueError("request must be an object")
|
|
api = BranchRepairLeaseAPI(RepairLeaseManager(LeaseStore(args.store), GitProbe(args.bare_repo)))
|
|
response = api.handle(request)
|
|
print(json.dumps(response, ensure_ascii=True, sort_keys=True, separators=(",", ":")))
|
|
return 0 if response.get("status") == "ok" else 1
|
|
except Exception:
|
|
print(json.dumps({"status": "blocked", "error": "lease_cli_failed"}))
|
|
return 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|