homelab-brain/homelab-ai-bot/tools/services.py

78 lines
5.2 KiB
Python

"""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 (nur Tailscale)", "tailscale": "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", "tailscale": "http://100.88.230.59:3000", "login": "admin / astral66", "ct": "Host HZ", "keys": ["grafana", "monitoring", "dashboard", "metriken"]},
{"name": "Portainer (Docker)", "url": "http://100.109.206.43:9000 (nur Tailscale)", "tailscale": "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 (nur Tailscale)", "tailscale": "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 (nur Tailscale)", "tailscale": "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 (nur Tailscale)", "tailscale": "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 (nur Tailscale)", "tailscale": "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 (nur Tailscale)", "tailscale": "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 (nur Tailscale)", "tailscale": "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", "tailscale": "http://100.80.76.118:8080", "login": "kein Login", "ct": "600 KA3", "keys": ["webcam", "kamera", "cam", "takeo"]},
{"name": "Frigate NVR", "url": "http://100.104.64.99:5000 (nur Tailscale)", "tailscale": "http://100.104.64.99:5000", "login": "kein Login", "ct": "VM 500 KA3", "keys": ["frigate", "nvr", "kamera", "ueberwachung"]},
{"name": "Uptime Kuma", "url": "http://100.122.56.60:8001 (nur Tailscale)", "tailscale": "http://100.122.56.60:8001", "login": "admin / astral66", "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,
}