Linux (z.B. RaspberryPi) aus FHEM neu starten

Hier stelle ich euch meine Lösung vor, wie ich aus FHEM heraus meinen Server (lokal) und meine(n) Raspberry Pi(’s) per FHEM2FHEM (remote) neu starte.

Meine Systeme basieren alle auf Debian Linux (DietPi) als Betriebssystem. Bei anderen Betriebssystemen und/oder anderer Hardware (oDroid, BeagleBone etc.) können sich Dateien und Einstellungen wo anders befinden!

Grundvorraussetzungen:

FHEM braucht Zugriff auf die Shell des Linux-Systems sowie die Rechte „sudo“ benutzen zu dürfen!
Dazu müssen zwei System-Dateien bearbeitet werden.

1. /etc/passwd

sudo nano /etc/passwd

Hier wird folgendes geändert:

fhem:x:999:20::/opt/fhem:/bin/none

in:

fhem:x:999:20::/opt/fhem:/bin/bash

Wichtig ist die Änderung am Ende (none -> bash). Alles andere könnte unterschiedlich sein und ist für uns uninteressant!

Mit „Strg+O“ speichern und mit „Strg+X“ schließen.

2. /etc/sudoers

Ich empfehle diese Änderungen nicht in der Datei /etc/sudoers durchzuführen, sondern eine seperate Datei im Ordner /etc/sudoers.d/ anzulegen.

sudo nano /etc/sudoers.d/fhem

In diese Datei fügt ihr folgende Zeile ein:

fhem ALL=(ALL) NOPASSWD: ALL

Mit „Strg+O“ speichern und mit „Strg+X“ schließen.

Jetzt fehlt nur noch ein:

sudo reboot

Nach dem Neustart hat der User „fhem“, vollen Zugriff auf das System und kann Befehle per sudo ausführen.

Denkt daran euer System korrekt abzusichern, solltet ihr eine Portfreigabe oder Ähnliches eingerichtet haben um von Unterwegs auf FHEM zugreifen zu können. Sollte sich jemand Anderes Zugriff zu eurer FHEM-Instanz verschaffen, so kann auch dieser Jemand Befehle per sudo auf eurem System ausführen!

Lokales System neustarten

Hier reicht ein einfacher Befehl über die FHEM-Commandozeile oder z.B. FTUI.

Bei dem Befehl „system(“);“ handelt sich um einen in FHEM integrierten Perl-Befehl. Darum muss dieser Befehl in der Commando-Zeile mit geschwungenen Klammern {} geschrieben werden.

{ system('sudo reboot &') }

Das System sollte nun neustarten.

Remote System über FHEM2FHEM neustarten

Vorrausetzung hierfür ist ein funktionierendes FHEM2FHEM-Device auf dem Remote-System

define [NAME] FHEM2FHEM [IP:TELNETPORT] LOG: [PASSWORT]

[IP] und [TELNETPORT] stammen vom Haupt-System. [PASSWORT] wird benötigt falls der Telnet-Port des FHEM auf dem Haupt-System mit einem Passwort geschützt ist.
Hierzu schaut ihr aber am Besten in die commandRef!

Seit dem 02.06.2017 ist für Telnet-Verbindungen welche nicht lokal sind immer ein Passwort oder eine explizite Ausnahme für das Remote-Device erforderlich! Siehe auch im FHEM-Forum: Verbindung von einer nicht-lokalen Adresse ab sofort nur mit Passwort

Auf dem Haupt-System definieren wir in FHEM einen Dummy, welcher später getriggert wird.

define reboot_remote dummy

Auf dem Remote-System definieren wir ein notify welches auf den Dummy des Haupt-System’s lauscht:

define reboot_per_remote notify reboot_remote:reboot.* { system('sudo reboot &') }

Nun muss noch die Definition des FHEM2FHEM-Devices ergänzt werden:
Ich mache diesen Schritt gern über FHEM-WEB, indem ich das FHEM2FHEM-Device öffne und links neben der Device-Definition auf „DEF“ klicke.

Die Defnition sollte dann minimal so aussehen:

[IP]:[TELNETPORT] LOG:reboot_remote [PASSWORT]

Mit einem klick auf „modify [NAME]“ speichern!

Um jetzt das Remote-System vom Haupt-System aus neu zu starten reicht auf dem Haupt-System der Befehl:

trigger reboot_remote reboot

Der Dummy im Hauptsystem wird getriggert.

Wer jetzt den EventMonitor verfolgt, sieht, dass auf beiden Systemen ein Event ähnlich

XXXX dummy reboot_remote reboot

erzeugt wird. Dieses wird vom notify „abgefangen“ und löst den „System-Befehl“ zum neustarten aus.

3 Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert