╔══════════════════════════════════════════════════════════════════════════════╗
║     ███╗   ███╗███████╗███████╗██╗  ██╗ ██████╗ ██████╗ ██████╗ ███████╗     ║
║     ████╗ ████║██╔════╝██╔════╝██║  ██║██╔════╝██╔═══██╗██╔══██╗██╔════╝     ║
║     ██╔████╔██║█████╗  ███████╗███████║██║     ██║   ██║██████╔╝█████╗       ║
║     ██║╚██╔╝██║██╔══╝  ╚════██║██╔══██║██║     ██║   ██║██╔══██╗██╔══╝       ║
║     ██║ ╚═╝ ██║███████╗███████║██║  ██║╚██████╗╚██████╔╝██║  ██║███████╗     ║
║     ╚═╝     ╚═╝╚══════╝╚══════╝╚═╝  ╚═╝ ╚═════╝ ╚═════╝ ╚═╝  ╚═╝╚══════╝     ║
║                                                                              ║
║             ~ ~ ~  befehle per funk  ~  listener + client  ~ ~ ~             ║
║                                                                              ║
╠══════════════════════════════════════════════════════════════════════════════╣
║                                                                              ║
║  RELEASE ...: meshcore-remote                                                ║
║  DATEIEN ...: meshcore-remote.zip (2 Skripte)                                ║
║  SPRACHE ...: Python 3 (asyncio)                                             ║
║  BENÖTIGT ..: pip install meshcore                                           ║
║  PLATTFORM .: Linux / Debian, MeshCore-Node per USB (seriell)                ║
║  DATUM .....: 04.10.2026                                                     ║
║                                                                              ║
╠══════════════════════════════════════════════════════════════════════════════╣
║                                                                              ║
║ ░▒▓█ 01 :: WAS IST DAS? █▓▒░                                                 ║
║                                                                              ║
║   Zwei kleine Skripte, um einen entfernten Rechner über MeshCore (LoRa-Mesh) ║
║   fernzusteuern - ganz ohne Internet dazwischen.                             ║
║                                                                              ║
║   Listener  läuft auf dem Remote-Rechner, an dem ein Node per USB hängt.     ║
║   Client    läuft bei dir, schickt den Befehl und setzt die Antwort          ║
║             wieder zu einem Text zusammen.                                   ║
║                                                                              ║
║   [Client]--USB--[Node]  ~ ~ ~ LoRa ~ ~ ~  [Node]--USB--[Listener]           ║
║                                                                              ║
╠══════════════════════════════════════════════════════════════════════════════╣
║                                                                              ║
║ ░▒▓█ 02 :: meshcore_listener.py █▓▒░                                         ║
║                                                                              ║
║   Nimmt Direktnachrichten entgegen und führt Befehle mit dem Präfix ! aus.   ║
║   Läuft auf dem Remote-Rechner.                                              ║
║                                                                              ║
║   * nur Absender aus der Whitelist (ALLOWED, Public-Key-Präfix mit           ║
║     mindestens 12 Hex-Zeichen), alle anderen werden abgelehnt                ║
║   * feste Befehle: !uptime !load !mem !disk !ip !help                        ║
║   * freie Shell per !sh <befehl>, standardmäßig AUS (ENABLE_SHELL)           ║
║   * Antwort in bis zu 3 Teilen à 120 Bytes; Channel-Nachrichten und          ║
║     Nachrichten älter als 5 Minuten werden ignoriert                         ║
║                                                                              ║
║   # auf dem Remote-Rechner                                                   ║
║   python3 -m venv ~/meshcore-listener                                        ║
║   ~/meshcore-listener/bin/pip install meshcore                               ║
║   # ALLOWED im Skript auf deinen Node-Key setzen, dann starten:              ║
║   ~/meshcore-listener/bin/python meshcore_listener.py                        ║
║                                                                              ║
║   # danach per DM an den Node schicken, z.B.:                                ║
║   !help   !uptime   !disk                                                    ║
║                                                                              ║
╠══════════════════════════════════════════════════════════════════════════════╣
║                                                                              ║
║ ░▒▓█ 03 :: meshcore_client.py  (mc-run) █▓▒░                                 ║
║                                                                              ║
║   Schickt einen Befehl an den Listener und gibt die Antwort zusammengesetzt  ║
║   aus, statt als einzelne Häppchen. Läuft bei dir.                           ║
║                                                                              ║
║   * sucht den Kontakt per Namen, sendet als Direktnachricht                  ║
║   * Shell-Befehle bekommen automatisch !sh davor; beginnt der Text mit !,    ║
║     geht er unverändert raus                                                 ║
║   * wartet auf den ACK; fehlt er, bis zu 2 Wiederholungen (Pfad-Reset,       ║
║     Flood)                                                                   ║
║   * setzt die Teile zusammen (erkennt [i/n]-Marker, sonst gilt die Antwort   ║
║     nach --idle Sekunden Stille als fertig)                                  ║
║   * Exit-Code: 0 komplett, 1 keine Antwort, 2 unvollständig, 3 nicht         ║
║     zugestellt                                                               ║
║   * Optionen (-v, --idle, --timeout, --retries, -p) stehen VOR dem           ║
║     Kontaktnamen                                                             ║
║                                                                              ║
║   # Beispiel: Kontakt "server1" fragt den Plattenplatz ab                    ║
║   mc-run server1 '!disk'                                                     ║
║   Ziel: server1 (a1b2c3d4e5f6...)                                            ║
║   An lokalen Node übergeben: '!disk'                                         ║
║   ACK erhalten: Befehl ist beim Ziel-Node angekommen.                        ║
║   Filesystem      Size  Used Avail Use% Mounted on                           ║
║   /dev/sda2       110G   38G   67G  36% /                                    ║
║                                                                              ║
║   # weitere Aufrufe                                                          ║
║   mc-run server1 df -h              # sendet "!sh df -h"                     ║
║   mc-run -v --idle 10 server1 uptime                                         ║
║                                                                              ║
╠══════════════════════════════════════════════════════════════════════════════╣
║                                                                              ║
║ ░▒▓█ 04 :: ACHTUNG █▓▒░                                                      ║
║                                                                              ║
║   * !sh (und damit mc-run server1 df -h) geht nur, wenn im Listener          ║
║     ENABLE_SHELL = True steht. Dann darf jeder Node aus ALLOWED eine freie   ║
║     Shell benutzen - Liste kurz halten.                                      ║
║   * Der serielle Port gehört immer nur einem Programm: MeshCore Open und     ║
║     meshcli dürfen auf dem Rechner nicht parallel laufen.                    ║
║                                                                              ║
╠══════════════════════════════════════════════════════════════════════════════╣
║                                                                              ║
║ ░▒▓█ 05 :: DOWNLOAD █▓▒░                                                     ║
║                                                                              ║
║   >> meshcore-remote.zip                                                     ║
║                                                                              ║
║      enthält:                                                                ║
║      meshcore_listener.py   Listener, für den Remote-Rechner                 ║
║      meshcore_client.py     Client (mc-run), für deinen Rechner              ║
║                                                                              ║
╠══════════════════════════════════════════════════════════════════════════════╣
║              greetz: alle Funker, LoRa-Nerds und Mesh-Betreiber              ║
╚══════════════════════════════════════════════════════════════════════════════╝