From 3bb59f178b36910788e1bf70bb8a1669d23114f5 Mon Sep 17 00:00:00 2001 From: "info@pi-farm.de" Date: Sat, 7 Mar 2026 00:20:00 +0000 Subject: [PATCH] main.py aktualisiert --- main.py | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/main.py b/main.py index d86d2af..673fed3 100644 --- a/main.py +++ b/main.py @@ -218,16 +218,36 @@ async def get_remote_info(ip, user): # --- ERWEITERTES NODE BOOTSTRAPPING (Inventur) --- async def bootstrap_node(ip, user, password): - await manager.broadcast(f"🔑 SSH-Handshake für {ip}...") - # 1. Key kopieren - ssh_copy_cmd = f"sshpass -p '{password}' ssh-copy-id -o StrictHostKeyChecking=no -i {SSH_KEY}.pub {user}@{ip}" - proc = subprocess.run(ssh_copy_cmd, shell=True, capture_output=True, text=True) + await manager.broadcast(f"🔑 Starte Kopplung für {ip}...") - if proc.returncode != 0: - await manager.broadcast(f"❌ Fehler beim Key-Copy für {ip}: {proc.stderr}") + # Pfad zum lokalen Public Key + with open(f"{SSH_KEY}.pub", "r") as f: + pub_key = f.read().strip() + + # Strategie: Wir versuchen den Key per PowerShell zu setzen (funktioniert bei Win & Linux/Mac oft universeller) + # Dieser Befehl erstellt das Verzeichnis, die Datei und setzt den Key – alles in einer Zeile. + powershell_fix = ( + f'if (!(Test-Path ~\\.ssh)) {{ New-Item -ItemType Directory -Path ~\\.ssh }}; ' + f'Add-Content -Path ~\\.ssh\\authorized_keys -Value "{pub_key}"' + ) + + # Wir nutzen sshpass, um den Befehl einmalig mit Passwort abzuschicken + setup_cmd = f"sshpass -p '{password}' ssh -o StrictHostKeyChecking=no {user}@{ip} 'powershell -Command \"{powershell_fix}\" || (mkdir -p ~/.ssh && echo {pub_key} >> ~/.ssh/authorized_keys)'" + + try: + # Wir führen das Setup aus + proc = subprocess.run(setup_cmd, shell=True, capture_output=True, text=True, timeout=15) + + if proc.returncode != 0: + await manager.broadcast(f"⚠️ Erster Kopplungsversuch für {ip} mit Warnung: {proc.stderr[:50]}...") + else: + await manager.broadcast(f"✅ Key-Transfer zu {ip} abgeschlossen.") + + except subprocess.TimeoutExpired: + await manager.broadcast(f"❌ Timeout bei Kopplung mit {ip}. Rechner erreichbar?") return - # 2. System-Infos abrufen (Inventur) + # Danach folgt deine Inventur (OS/Arch Check)... await manager.broadcast(f"🔍 Inventur auf {ip} wird durchgeführt...") info = await get_remote_info(ip, user)