from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from pydantic import BaseModel from typing import Optional import re import json import os from datetime import datetime COMPOSE_FILE = "docker-compose.yml" JSON_FILE = "compose_changes.json" app = FastAPI() app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"], ) class ComposeConfig(BaseModel): icesecretwrite: Optional[str] = None icesecretread: Optional[str] = None dbDriver: Optional[str] = None dbHost: Optional[str] = None dbPort: Optional[str] = None database: Optional[str] = None dbUsername: Optional[str] = None dbPassword: Optional[str] = None def read_json(): if not os.path.exists(JSON_FILE): return {"file": "docker-compose.yml", "version": 0} with open(JSON_FILE) as f: return json.load(f) def write_json(changes): data = read_json() data["version"] += 1 data["last_updated"] = datetime.now().isoformat() with open(JSON_FILE, "w") as f: json.dump(data, f, indent=2) return data["version"] def update_compose( icesecretwrite=None, icesecretread=None, dbDriver=None, dbHost=None, dbPort=None, database=None, dbUsername=None, dbPassword=None ): with open(COMPOSE_FILE, "r") as f: content = f.read() changes = { "MUMBLE_CONFIG_icesecretwrite": icesecretwrite, "MUMBLE_CONFIG_icesecretread": icesecretread, "MUMBLE_CONFIG_dbDriver": dbDriver, "MUMBLE_CONFIG_dbHost": dbHost, "MUMBLE_CONFIG_dbPort": dbPort, "MUMBLE_CONFIG_database": database, "MUMBLE_CONFIG_dbUsername": dbUsername, "MUMBLE_CONFIG_dbPassword": dbPassword, } for key, value in changes.items(): if value is None: continue # skip fields not passed in # replace the value after the = sign content = re.sub( rf"({key}=).*", rf"\g<1>{value}", content ) with open(COMPOSE_FILE, "w") as f: f.write(content) version = write_json(changes) print(f"[✓] docker-compose.yml updated") # --- usage --- # update_compose( # dbHost="172.test.test.test", # dbPassword="testpassword", # dbPort="5437test" # ) @app.post("/update") def update(config: ComposeConfig): changes = config.model_dump() # check at least one field provided if not any(v is not None for v in changes.values()): return {"error": "No fields provided — nothing to update"} print(changes) updated = update_compose(icesecretwrite=changes["icesecretwrite"], icesecretread=changes["icesecretread"], dbDriver=changes["dbDriver"], dbHost=changes["dbHost"], dbPort=changes["dbPort"], database=changes["database"], dbUsername=changes["dbUsername"], dbPassword=changes["dbPassword"]) version = write_json(updated) return { "message": "docker-compose.yml updated" }