#!/usr/bin/env bash set -euo pipefail DST="/opt/hx-ki/com2-stack/docker-compose.yml" [ -f "$DST" ] || { echo "FEHLT: $DST"; exit 1; } pick_src() { # 1) COM2 Backups (neueste zuerst) for f in $(ls -1t /opt/hx-ki/com2-stack/docker-compose.yml.bak.* 2>/dev/null); do grep -qE '^[[:space:]]{2}hxki-web:[[:space:]]*$' "$f" && { echo "$f"; return 0; } done # 2) COM-Stack for f in /opt/hx-ki/com-stack/docker-compose.yml /opt/hx-ki/com-stack/docker-compose.yml.bak.*; do [ -f "$f" ] || continue grep -qE '^[[:space:]]{2}hxki-web:[[:space:]]*$' "$f" && { echo "$f"; return 0; } done # 3) docker Backups for f in /opt/hx-ki/docker/docker-compose.yml*; do [ -f "$f" ] || continue grep -qE '^[[:space:]]{2}hxki-web:[[:space:]]*$' "$f" && { echo "$f"; return 0; } done return 1 } SRC="$(pick_src)" [ -n "$SRC" ] || { echo "FAIL: Keine Quelle mit hxki-web gefunden"; exit 1; } export SRC DST echo "=== COM2 RESTORE hxki-web ===" echo "SRC=$SRC" echo "DST=$DST" python3 <<'PY' import re, pathlib, os src = pathlib.Path(os.environ["SRC"]).read_text() dstp = pathlib.Path(os.environ["DST"]) dst = dstp.read_text() m = re.search(r'(?ms)^services:\s*\n(.*?)(?=^\S|\Z)', src) if not m: raise SystemExit("FEHLT: services: im Source") block = m.group(1) pat = r'(?ms)^\s{2}hxki-web:\s*\n(?:^\s{4}.*\n|^\s{6}.*\n|^\s{8}.*\n|^\s*\n)*?(?=^\s{2}[A-Za-z0-9_.-]+:\s*$|\Z)' mm = re.search(pat, block) if not mm: raise SystemExit("FEHLT: hxki-web Block") web = mm.group(0) if 'hxki-web:' in dst: print("OK: hxki-web bereits vorhanden") raise SystemExit(0) dst = re.sub(r'(?m)^(services:\s*\n)', r'\1' + web + '\n', dst, count=1) dstp.write_text(dst) print("OK: hxki-web eingefügt") PY docker compose -f "$DST" config >/dev/null echo "OK: Compose valide."