Neues Tool: services.py — Dienst-Verzeichnis mit URLs + Zugangsdaten
This commit is contained in:
parent
99b726495e
commit
def09fa2e5
1 changed files with 78 additions and 0 deletions
78
homelab-ai-bot/tools/services.py
Normal file
78
homelab-ai-bot/tools/services.py
Normal file
|
|
@ -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,
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue