From def09fa2e51e849e7706cbc698abd2cd5456e5a7 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 16 Mar 2026 15:52:12 +0700 Subject: [PATCH] =?UTF-8?q?Neues=20Tool:=20services.py=20=E2=80=94=20Diens?= =?UTF-8?q?t-Verzeichnis=20mit=20URLs=20+=20Zugangsdaten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- homelab-ai-bot/tools/services.py | 78 ++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 homelab-ai-bot/tools/services.py diff --git a/homelab-ai-bot/tools/services.py b/homelab-ai-bot/tools/services.py new file mode 100644 index 00000000..4695afac --- /dev/null +++ b/homelab-ai-bot/tools/services.py @@ -0,0 +1,78 @@ +"""Service-Verzeichnis — URLs, Zugangsdaten, Dienste aus homelab.conf.""" + +from core import config + +TOOLS = [ + { + "type": "function", + "function": { + "name": "get_service_directory", + "description": "Verzeichnis aller Dienste mit Web-URLs, Zugangsdaten und Beschreibungen. Nutze bei: 'wie komme ich auf X', 'URL von Y', 'Passwort fuer Z', 'welche Dienste haben wir', 'wo laeuft X'.", + "parameters": { + "type": "object", + "properties": { + "query": {"type": "string", "description": "Optional: Suchbegriff zum Filtern (z.B. 'matomo', 'gold', 'mail')", "default": ""} + }, + "required": [], + }, + }, + }, +] + +SERVICES = [ + {"name": "WordPress (Arakava News)", "url": "https://arakavanews.com", "tailscale": "http://100.91.212.19", "login": "admin / {PW_WP_ADMIN}", "ct": "101 HZ", "keys": ["wordpress", "wp", "arakava", "news", "blog"]}, + {"name": "Matomo Analytics", "url": "https://matomo.orbitalo.net", "tailscale": "http://100.113.244.101", "login": "Token: {MATOMO_TOKEN}", "ct": "109 HZ", "keys": ["matomo", "analytics", "besucher", "statistik", "tracking"]}, + {"name": "Forgejo (Git)", "url": "http://100.89.246.60:3000", "login": "Token: {FORGEJO_TOKEN}", "ct": "111 HZ", "keys": ["forgejo", "git", "repo", "code", "issue"]}, + {"name": "Seafile (Cloud)", "url": "https://seafile.orbitalo.net", "tailscale": "http://100.75.247.60", "login": "root / astral66", "ct": "103 HZ", "keys": ["seafile", "cloud", "dateien", "sync"]}, + {"name": "Grafana (Monitoring)", "url": "https://grafana.orbitalo.net", "login": "admin / astral66", "ct": "Host HZ", "keys": ["grafana", "monitoring", "dashboard", "metriken"]}, + {"name": "Portainer (Docker)", "url": "http://100.109.206.43:9000", "login": "admin / astral66", "ct": "110 HZ", "keys": ["portainer", "docker", "container"]}, + {"name": "Fuenf vor Acht Dashboard", "url": "http://100.73.171.62:5000", "login": "{PW_5V8_USER} / {PW_5V8_PASS}", "ct": "112 HZ", "keys": ["5v8", "fuenf", "acht", "5vor8", "fuenfvoracht", "telegram"]}, + {"name": "Edelmetall Dashboard", "url": "http://100.72.230.87:8501", "login": "kein Login", "ct": "134 KA1", "keys": ["gold", "silber", "edelmetall", "preis"]}, + {"name": "RSS Manager", "url": "http://100.113.244.101:8080", "login": "kein Login", "ct": "109 HZ", "keys": ["rss", "feed", "artikel", "news"]}, + {"name": "Proxmox Datacenter Manager", "url": "https://pdm.orbitalo.info", "login": "{PW_PDM_USER} / {PW_PDM_PASS}", "ct": "Host", "keys": ["pdm", "proxmox", "datacenter", "server", "verwaltung"]}, + {"name": "Memory Service", "url": "http://100.121.192.94:8400", "login": "Token: {MEMORY_API_TOKEN}", "ct": "117 HZ", "keys": ["memory", "gedaechtnis", "rag"]}, + {"name": "Loki (Logs)", "url": "http://100.109.206.43:3100", "login": "kein Login", "ct": "110 HZ", "keys": ["loki", "logs", "logging"]}, + {"name": "Prometheus", "url": "http://100.88.230.59:9090", "login": "kein Login", "ct": "Host HZ", "keys": ["prometheus", "metriken", "cpu", "ram"]}, + {"name": "Webcam (Takeo)", "url": "https://cam.arakavanews.com", "login": "kein Login", "ct": "600 KA3", "keys": ["webcam", "kamera", "cam", "takeo"]}, + {"name": "Frigate NVR", "url": "http://100.104.64.99:5000", "login": "kein Login", "ct": "VM 500 KA3", "keys": ["frigate", "nvr", "kamera", "ueberwachung"]}, + {"name": "Uptime Kuma", "url": "auf pve-ka-1 CT 110", "login": "—", "ct": "110 KA1", "keys": ["uptime", "kuma", "monitoring", "verfuegbarkeit"]}, +] + + +def _resolve(text, cfg_raw): + """Ersetzt {PLATZHALTER} durch Werte aus homelab.conf.""" + import re + for match in re.findall(r'\{(\w+)\}', text): + val = cfg_raw.get(match, "???") + text = text.replace(f"{{{match}}}", val) + return text + + +def handle_get_service_directory(query="", **kw): + cfg = config.parse_config() + raw = cfg.raw + + matches = SERVICES + if query: + q = query.lower() + matches = [s for s in SERVICES if any(q in k for k in s["keys"]) or q in s["name"].lower()] + + if not matches: + return f"Kein Dienst gefunden fuer '{query}'." + + lines = [] + for s in matches: + lines.append(f"=== {s['name']} ===") + lines.append(f" URL: {s['url']}") + if s.get("tailscale"): + lines.append(f" Tailscale: {s['tailscale']}") + lines.append(f" Login: {_resolve(s['login'], raw)}") + lines.append(f" CT: {s['ct']}") + lines.append("") + + return "\n".join(lines) + + +HANDLERS = { + "get_service_directory": handle_get_service_directory, +}