118 lines
3.0 KiB
Python
118 lines
3.0 KiB
Python
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"
|
|
} |