diff --git a/.gitignore b/.gitignore index 4172497..4f273e9 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ __pycache__/ *.pyc activation.log + +data/devices/*.json diff --git a/app.py b/app.py index 7cc25b2..9e481de 100644 --- a/app.py +++ b/app.py @@ -15,6 +15,7 @@ app = FastAPI(title="Provisioning Activation Server", version="0.1.0") class ActivationRequest(BaseModel): activation_code: str + device_fingerprint: str hostname: str | None = None machine_id: str | None = None client_version: str | None = None @@ -29,6 +30,43 @@ def write_log(entry: dict) -> None: with LOG_PATH.open("a", encoding="utf-8") as f: f.write(json.dumps(entry, ensure_ascii=False) + "\n") +DEVICES_DIR = Path("data/devices") + +def load_or_create_device(device_fingerprint: str) -> tuple[dict, bool]: + """ + Lädt ein bekanntes Gerät oder legt es neu an. + + Rückgabe: + (device, created) + """ + + DEVICES_DIR.mkdir(parents=True, exist_ok=True) + + device_file = DEVICES_DIR / f"{device_fingerprint}.json" + + if device_file.exists(): + with device_file.open("r", encoding="utf-8") as f: + device = json.load(f) + + device["last_seen"] = datetime.now(timezone.utc).isoformat() + device["activation_count"] = device.get("activation_count", 0) + 1 + + with device_file.open("w", encoding="utf-8") as f: + json.dump(device, f, indent=2) + + return device, False + + device = { + "device_fingerprint": device_fingerprint, + "created_at": datetime.now(timezone.utc).isoformat(), + "last_seen": datetime.now(timezone.utc).isoformat(), + "activation_count": 1 + } + + with device_file.open("w", encoding="utf-8") as f: + json.dump(device, f, indent=2) + + return device, True @app.get("/health") def health(): @@ -45,6 +83,13 @@ def activate(payload: ActivationRequest, request: Request): activation_entry = config.get("activation_codes", {}).get(payload.activation_code) success = activation_entry is not None + device = None + device_created = False + + if success: + device, device_created = load_or_create_device( + payload.device_fingerprint + ) write_log({ "timestamp": datetime.now(timezone.utc).isoformat(), @@ -73,6 +118,11 @@ def activate(payload: ActivationRequest, request: Request): return { "success": True, + + "device": { + "fingerprint": device["device_fingerprint"], + }, + "customer": activation_entry["customer"], "profiles": available_profiles } diff --git a/data/devices/.gitkeep b/data/devices/.gitkeep new file mode 100644 index 0000000..e69de29