Files
BartelLuis 06c3474636
CI / javascript-check (push) Successful in 51s
CI / container-policy (push) Successful in 2s
CI / container-verify (push) Canceled after 0s
CI / container-publish (push) Canceled after 0s
CI / python-tests (push) Canceled after 6m59s
feat: add Proxmox provisioning service with CI and deployment tooling
2026-09-14 20:09:12 +02:00

54 lines
3.5 KiB
Python

"""Conservative module drafts. Publication always requires target-host evidence."""
from pathlib import Path
def schema(properties, required=()):
return {"type": "object", "additionalProperties": False, "properties": properties, "required": list(required)}
STRING_LIST = {"type": "array", "items": {"type": "string"}, "maxItems": 100}
DEFINITIONS = [
("prerequisites", "Voraussetzungen", "PVE-Version, DNS, Uhrzeit und freien Speicher prüfen.",
schema({"allowed_versions": STRING_LIST, "dns_names": STRING_LIST,
"minimum_free_mb": {"type": "integer", "minimum": 512, "maximum": 1048576}}),
{"allowed_versions": [], "dns_names": [], "minimum_free_mb": 2048}, [], 120, True),
("repositories", "Paketquellen", "Eine signierte, explizit freigegebene HTTPS-Paketquelle verwalten.",
schema({"url": {"type": "string"}, "suite": {"type": "string"}, "components": STRING_LIST,
"keyring": {"type": "string"}}, ("url", "suite", "components", "keyring")),
{}, ["prerequisites"], 600, True),
("packages", "Basispakete", "Explizit genannte Pakete installieren; keine globale Aktualisierung.",
schema({"packages": STRING_LIST}), {"packages": []}, ["prerequisites"], 1800, True),
("ssh", "SSH-Zugang", "Freigegebene Schlüssel vorhandenen Benutzern hinzufügen; sshd validieren.",
schema({"users": {"type": "array", "maxItems": 50, "items": schema({
"name": {"type": "string", "pattern": "^[a-z_][a-z0-9_-]{0,31}$"},
"authorized_keys": STRING_LIST}, ("name", "authorized_keys"))}}),
{"users": []}, ["prerequisites"], 120, True),
("time", "Zeitsynchronisation", "Chrony mit expliziten Zeitservern konfigurieren und Synchronisation prüfen.",
schema({"servers": STRING_LIST}, ("servers",)), {"servers": []}, ["packages"], 600, True),
("monitoring", "Monitoring", "Optional den Debian prometheus-node-exporter aktivieren.",
schema({"enabled": {"type": "boolean"}}), {"enabled": False}, ["packages"], 600, False),
("storage", "Zusätzlicher Storage", "Vorhandenes Verzeichnis ohne Formatierung als PVE-Storage anbinden.",
schema({"id": {"type": "string", "pattern": "^[A-Za-z][A-Za-z0-9_-]{0,31}$"},
"path": {"type": "string"}, "content": STRING_LIST}, ("id", "path", "content")),
{}, ["prerequisites"], 120, True),
("final-verification", "Abschlussprüfung", "PVE-Dienste, Versionsstand, DNS, Zeit und aktiven Storage prüfen.",
schema({"allowed_versions": STRING_LIST, "dns_names": STRING_LIST,
"storage_ids": STRING_LIST, "require_time_sync": {"type": "boolean"}}),
{"allowed_versions": [], "dns_names": [], "storage_ids": [], "require_time_sync": True},
["prerequisites"], 180, True),
]
def catalog():
result = []
root = Path(__file__).parent
names = {definition[0]: definition[1] for definition in DEFINITIONS}
for module_id, name, description, parameters_schema, defaults, dependencies, timeout, required in DEFINITIONS:
result.append({"id": module_id, "name": name, "description": description, "version": "1.0.0",
"source": (root / f"{module_id}.sh").read_text(encoding="utf-8"),
"parameters_schema": parameters_schema, "default_parameters": defaults,
"dependencies": [names[dependency] for dependency in dependencies], "timeout_seconds": timeout,
"retry_safe": True, "required": required, "status": "draft",
"test_evidence": "", "target_builds": []})
return result