diff --git a/main.py b/main.py index 8320884..299dc2f 100644 --- a/main.py +++ b/main.py @@ -7,6 +7,7 @@ import asyncio import openai import re import httpx +import subprocess from google import genai from google.genai import types import json @@ -211,38 +212,53 @@ async def check_and_update_node(node_id: int): if not node: conn.close() return "Node nicht gefunden" - - # Dieser geniale Einzeiler holt uns Architektur, Docker-Status und das OS - check_cmd = """ - arch=$(uname -m); - dock=$(command -v docker >/dev/null 2>&1 && echo 1 || echo 0); - os=$(grep '^ID=' /etc/os-release 2>/dev/null | cut -d= -f2 | tr -d '"'); - [ -z "$os" ] && os=$(uname -s); - vnc=$(command -v vncserver >/dev/null 2>&1 && echo 1 || echo 0); - echo "$arch|$dock|$os|$vnc" - """ - - ssh_cmd = f"ssh -o StrictHostKeyChecking=no -o ConnectTimeout=3 {node['user']}@{node['ip']} '{check_cmd}'" - + + # Wir bauen den Befehl kompakt zusammen + # Nutze im Grep nun doppelte Anführungszeichen, um Konflikte zu vermeiden + check_cmd = ( + 'arch=$(uname -m); ' + 'dock=$(command -v docker >/dev/null 2>&1 && echo 1 || echo 0); ' + 'os=$(grep "^ID=" /etc/os-release 2>/dev/null | cut -d= -f2 | tr -d \'"\'); ' + '[ -z "$os" ] && os=$(uname -s); ' + 'vnc=$(command -v vncserver >/dev/null 2>&1 && echo 1 || echo 0); ' + 'echo "$arch|$dock|$os|$vnc"' + ) + + # WICHTIG: Als Liste übergeben, damit kein f-String Quoting nötig ist! + ssh_args = [ + "ssh", + "-o", "StrictHostKeyChecking=no", + "-o", "ConnectTimeout=3", + f"{node['user']}@{node['ip']}", + check_cmd + ] + try: - output = subprocess.check_output(ssh_cmd, shell=True).decode().strip() + # Kein shell=True mehr nötig + output = subprocess.check_output(ssh_args, stderr=subprocess.STDOUT).decode().strip() + + # Debugging: Falls doch was schief geht, sehen wir es im Log + if "|" not in output: + raise ValueError(f"Unerwarteter Output: {output}") + arch, dock, os_name, vnc = output.split('|') - status = "Docker Aktiv" if dock == "1" else "Bereit (Kein Docker)" - + conn.execute(''' UPDATE nodes SET status=?, arch=?, docker=?, os=?, vnc=? WHERE id=? ''', (status, arch, int(dock), os_name, int(vnc), node_id)) conn.commit() - conn.close() return status + except Exception as e: + print(f"Fehler bei Node {node_id} ({node['ip']}): {e}") conn.execute("UPDATE nodes SET status='Offline/Fehler' WHERE id=?", (node_id,)) conn.commit() - conn.close() return "Offline/Fehler" + finally: + conn.close() # --- Routen ---