fhem mit monit Überwachen - fhem Verfügbarkeit

Begonnen von Mitch, 19 Dezember 2014, 14:29:28

Vorheriges Thema - Nächstes Thema

Mitch

Hallo Zusammen,

nachdem ich in letzter Zeit viele Probleme (Performance, Abstürtze, etc.) hatte, wollte ich eine vernüftige Überwachung von fhem einrichten, um eine bessere Verfügbarkeit zu erreichen.

Durch Zufall bin ich auf eine Interessante Lösung von User gandy gestossen: http://forum.fhem.de/index.php/topic,25110.msg204529.html#msg204529
Hierbei wir das kostenlose Tool monit benutzt: http://mmonit.com/monit/

Ich habe den Ansatz von gandy genommen und noch etwas für meine Bedürfnisse erweitert. Ich möchte dies hier gerne zusammen schreiben, damit auch andere interessierte user es hier finden können.

monit installieren
sudo apt-get install monit

monit einrichten. Geht recht einfach, indem man das control file anpasst
sudo nano /etc/monit/monitrc

Hier habe ich erstmal den Webzugriff auf Port 2812 für User der Gruppe dialout eingeschalten:
  set httpd port 2812 and
     allow @dialout


Dann habe ich mir für die zu überwachenden Prozesse "Regeln" definiert. In meinem Fall perl, fhem, mysql, hcitool und sonos.
Hier kann man nach belieben Dinge hinzu packe.
check process perl
       matching "perl"
       start program = "/opt/fhem/fhemstart.sh"
       stop program = "/opt/fhem/fhemstop.sh"
       if cpu usage > 15% for 10 cycles then exec /opt/monit/monitpushover.sh
       if cpu usage > 90% for 10 cycles then restart

check process fhem with pidfile /var/run/fhem/fhem.pid
        start program = "/opt/fhem/fhemstart.sh"
        stop = "/opt/fhem/fhemstop.sh"
        if cpu usage > 15% for 10 cycles then exec /opt/monit/monitpushover.sh
        if failed host localhost port 7070 with send "knock\n" expect "hello." timeout 20 seconds then restart
        if cpu usage > 90% for 10 cycles then restart
        if 5 restarts with 5 cycles then timeout

check process mysql with pidfile /var/run/mysqld/mysqld.pid
       start program = "/usr/sbin/mysqld"
       stop program = "/bin/bash -c 'kill -s SIGTERM `cat /var/run/mysqld.pid`'"
       if cpu usage > 15% for 10 cycles then exec /opt/monit/monitpushover.sh
       if cpu usage > 95% for 10 cycles then restart

check process lescan
        matching "/usr/bin/hcitool lescan"
        if cpu usage > 10% for 10 cycles then exec /opt/monit/monitpushover.sh

check process sonos
        matching "00_SONOS.pm"
        if cpu usage > 10% for 10 cycles then exec /opt/monit/monitpushover.sh


Um das PID File von fhem zu nutzen, muss folgendes globale Attribut gesetzt werden:
attr global pidfilename /var/run/fhem/fhem.pid
Hierbei auf die Rechte achten! (danke an betateilchen)


Ich lasse mich bei bestimmten Dingen (z.B. CPU Last vom Perl Prozess über 15%) per Pushover benachrichtigen.
Hierzu benötigt man einen Account bei Pushover: https://pushover.net/

Ich rufe aus monit den Script monitpushover.sh auf:
#!/bin/sh
/usr/bin/curl -s \
  -F "token=token ID" \
  -F "user=user ID" \
  -F "message=[$MONIT_HOST] $MONIT_SERVICE - $MONIT_DESCRIPTION" \
  https://api.pushover.net/1/messages.json


Im Script muss die Token und User ID entsprechend angepasst werden.

Ansonsten habe ich wie von gandy beschrieben ein Device in fhem angelegt:
define cmd_knock cmdalias knock AS { "hello." }

Dieses wird von monit per if failed host localhost port 7072 with send "knock\n" expect "hello." timeout 20 seconds then restart "überwacht".
Der Vorteil hierbei ist, auch wenn der fhem Prozess noch in der Prozessliste ist, aber hängt, reagiert er nicht mehr auf die telnet Anfrage und sendet kein hello mehr zurück. Dies wird wiederum von monit registriert und ein Neustart von fhem wird initiiert.

Start und Stop von fhem habe ich auch in extra Scripte ausgelagert.

Anbei noch zwei Bilder der monit Weboberfläche.
FHEM im Proxmox Container

forum-merlin

coole sache!
Danke dass Du es aufgeschrieben hast.
Ich packe es mit auf meine To-Do Liste der Dinge die ich dann auf meiner neuen Kiste einpflegen will.
FHEM 5.8 auf RasPi3; CULv3-868; RFXtrx433; HM-Sec-SC-2; HM-CFG-LAN; HM-LC-Bl1-FM; HM-CC-RT-DN; HM-ES-PMSw1-Pl; HM-LC-Sw4-DR; Hunter Ventile; 8ch Relais; ENIGMA2; ONKYO_AVR; SONOS; Harmony; telegram; HM-PB-6-WM55; GPIO; HM-Sen-MDIR-O; HM-SEC-SD; HM-LC-Dim1L-Pl-3;

Alveole

Hallo,
Danke für den Script - funktioniert super!
Nur der Pushover Script geht bei mir nicht. Natürlich habe ich die Userdaten eingetragen
es kommt immer
Zitatcurl: option -F: is badly used here

Hast Du eine Idee und funktioniert das bei Dir?

Mitch

Muss ich mal bei mir testen.
Geht aber erst am WE, bin unterwegs.
FHEM im Proxmox Container

Alveole

Hallo,
Mein Problem mit den Pushover-Nachrichten hab ich gelöst - es war nur ein Schreibfehler meinerseits!!!

Nun stellt sich bei mir seit 1 Tag (warum auch immer erst jetzt) das Problem: keine Berechtigung für die pid-Datei.
Du schreibst nur "Hierbei auf die Rechte achten! "
Welche sind dies und wo?

Danke und Sorry für die dumme Frage die mein Fehler war!

Mitch

Hatte ich auch, hier die Lösung:

    Auf der Systemkonsole als root: "mkdir -p /var/run/fhem"
    Auf der Systemkonsole als root: "chown -R fhem:root /var/run/fhem"
    in fhem: attr global pidfilename /var/run/fhem/fhem.pid
    in fhem: save config
    in fhem: shutdown restart
FHEM im Proxmox Container

Amenophis86

Bei mir ist das Problem, sobald ich den Pi neustarte, ist der Ordner "var/run/fhem" wieder weg und damit lässt sich FHEM nicht starten. Betriebssystem ist OSMC. Eine Lösung, wie man das umgehen kann?
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

Wernieman

Wie ich in einem anderen Thread schon geschrieben habe:
http://forum.fhem.de/index.php/topic,30604.0.html

ZitatQuick and Dirty:
Im Init-Script von FHEM den Ordner anlegen lassen und richtige Berechtigung setzen. Dann erst FHEM starten ...

Es ist ein noramles Unix-Doing, das der /var/run Ordner nach einem Neustart gelöscht/wiederangelegt ist, aber eben ohne die Unterordner
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

HansDampfHH

Moin, habe auch nun monit laufen und Deine Idee umgesetzt.
Eigentlich schon ganz gut. Monit läuft, FHEM erstellt ein pid-File.

Wenn ich nun testweise FHEM herunterfahre springt monit an und startet FHEM neu weil das pid-File ja fehlt.

Das einzige was bisher nicht funktioniert ist das telnet Kommando:

if failed host localhost port 7072 with send "knock\n" expect "hello" timeout 20 seconds then restart


Wenn ich auf der Kommandozeile "echo "knock" | netcat localhost 7072" eingebe erhalte ich "hello".

Nun wollte ich das testen und habe in FHEM als Rückgabe "hallotest" definiert. Nun sollte monit ja eigentlich darüber stolpern und neu starten.
Aber da tut sich nichts. Hat jemand eine Idee wie ich hier weiter komme?
FHEM Docker, CUL868, Zigbee, CCU2, Jeelink

betateilchen

Warum muss man einfachste Dinge maximal kompliziert lösen?
Und was nützt mir eine Pushover-Nachricht, dass mein fhem hängt, wenn ich 2000km von zuhause weg bin?

Einen "hängenden" fhem Prozess hatte ich in all den Jahren noch nie, wohl aber ein abgestürztes fhem, bspw. wegen wide-chars in irgendwelchen Frontend Informationen. Ein abgestürztes dhem heilt systemd von ganz alleine durch einen fhem-Neustart, ohne dass es dazu monit bedarf.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

HansDampfHH

Dank VPN spielt es keine Rolle, ob ich 100 oder 5.000 Km entfernt bin.
Praktisch nur wenn ich mich direkt zu Hause einwählen kann um zu schauen was los ist bevor die ganze Familie nicht mal mehr Licht anmachen kann.

Das freut mich, dass Dein FHEM noch nie hängen geblieben ist.
Bei mir ist das leider schon vorgekommen. Und ja, ich versuche die Ursache zu beseitigen.
Genau auf diesem Weg kann ich das nämlich genau dann wenn es passiert.

"Warum muss man einfachste Dinge maximal kompliziert lösen?"
Das fragt mich meine Frau auch. Warum ich nicht einfach den Lichtschalter benutze?
Weil es mir Spaß macht.

Edit: send/expect läuft nun. Ich habe den Rückgabewert angepasst.
FHEM Docker, CUL868, Zigbee, CCU2, Jeelink

Benni

Zitat von: HansDampfHH am 16 Juli 2016, 13:24:59
bevor die ganze Familie nicht mal mehr Licht anmachen kann.

eventuell solltest du aber auch dein Gesamtkonzept nochmal überdenken. ;)
Grundsätzliche Funktionen, wie Licht und Heizung sollten idealerweise auch ohne FHEM noch funktionieren.

betateilchen

Zitat von: HansDampfHH am 16 Juli 2016, 13:24:59
Dank VPN spielt es keine Rolle, ob ich 100 oder 5.000 Km entfernt bin.

Egal ob mit VPN oder ohne - wer Wert auf ein "bisschen sicheres" fhem legt, verschafft seiner Installation keinen Zugang von aussen. Und wer glaubt, VPN sei sicher, glaubt auch an Landhausstil und Laminatfussboden - für mich sind das alles Irrwege.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

HansDampfHH

@Benni
Es ist eine wirtschaftliche Entscheidung gewesen diverse Steh-/Tischlampen durch EUR 5,- Steckdosen zu steuern.
Natürlich kann man diese auch entfernen und Licht schalten.

Die Grundsatzdiskussion über Sicherheit lass ich mal. Ich habe auch kein wired sondern nutze potentiell unsicher und manipulierbare Funk-/Wlan-Komponenten.
Muss ja jeder selber entscheiden, ob er es praktisch findet auch von unterwegs Komponenten zu schalten. Für mich macht aber gerade das einen großen Faktor bei SmartHome aus.
FHEM Docker, CUL868, Zigbee, CCU2, Jeelink

betateilchen

Zitat von: HansDampfHH am 16 Juli 2016, 14:28:45
Muss ja jeder selber entscheiden, ob er es praktisch findet auch von unterwegs Komponenten zu schalten. Für mich macht aber gerade das einen großen Faktor bei SmartHome aus.

Nur um das klarzustellen: das sind doch zwei völlig getrennte Themen.

Auch ich kann meine fhem Installation von jedem Punkt der Erde aus beeinflussen, an dem es eine Internetverbindung gibt. Aber ich kann das eben, ohne dazu eine direkte Verbindung von meinem Endgerät unterwegs zu meiner fhem Installation zuhause zu benötigen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

herrmannj

sorry, ich muss mal das folgende loswerden, weil ich es unschön finde.

Jemand stellt eine Lösung vor und bekommt als Antwort: "unnötig, überflüssig, brauch ich nicht" etc. Mag ja alles sein, für den TE und Poster hat es aber sichtlich einen Wert. Welchen Wert haben denn aber Allgemeinpositionen wie " er glaubt, VPN sei sicher, glaubt auch an Landhausstil " ?

Tacheless: natürlich kann *eine konkrete VPN Implementierung* mit einem *konkreten Versionsstand* eine bekannte Vulnerability aufweisen - für die es in der Regel ein Update gibt. Völlig anderes Thema.

Hier gehts doch aber darum das sich der TE über die korrekte Funktion seines Servers benachrichtigen lassen möchte. Total valide. Wenn man das nicht benötigt und nichts beitragen mag -> Post überspringen.

vg
joerg

betateilchen

Hallo Jörg,

Die hier vorgestellte "Lösung" per monit ist bald zwei Jahre alt. Nun hat jemand nach einem dreiviertel Jahr diesen Thread ausgegraben und geschrieben "ich mach das jetzt auch so, wie hier beschrieben". Da sollte einfach erlaubt sein, darauf hinzuweisen, dass es zwischenzeitlich vielleicht auch andere/aktuellere/einfachere Lösungen geben könnte.

Und VPN ist nicht sicher. Egal in welchem Versions- und/oder Patchlevel 😀
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

HansDampfHH

"dass es zwischenzeitlich vielleicht auch andere/aktuellere/einfachere Lösungen geben könnte"

Wie wäre es denn der Einfachheit halber gewesen einfach darauf hinzuweisen wie es mittlerweile einfacher geht?
Bin gespannt wie ich es denn noch lösen könnte wobei das hier beschrieben Prozedere nun sehr gut funktioniert.
Monit zu nutzen ist ja ohnehin nicht ganz verkehrt.

Obgleich Deinem Engagement hier finde ich Deine Art zu schreiben oder zu antworten oft nicht angebracht. Sehr schade.
FHEM Docker, CUL868, Zigbee, CCU2, Jeelink

fiedel

ZitatWie wäre es denn der Einfachheit halber gewesen einfach darauf hinzuweisen wie es mittlerweile einfacher geht?
Das hat er uns ja schon verraten:
ZitatEin abgestürztes dhem heilt systemd von ganz alleine durch einen fhem-Neustart, ohne dass es dazu monit bedarf.
Mich würde ja noch interessieren, wie betateilchen nun von außen zugreift. Ich will im Winter mal endlich NGINX mit SSL, BasicAuth und ggf. noch fail2ban als Sicherheitserhöhung einrichten. Das ist vermutlich noch unsicherer als VPN...  ???

Gruß
Frank
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

betateilchen

Zitat von: fiedel am 17 Juli 2016, 10:00:10
Das hat er uns ja schon verraten:

Schön, dass es endlich jemandem auffällt :)

Zitat von: fiedel am 17 Juli 2016, 10:00:10
Mich würde ja noch interessieren, wie betateilchen nun von außen zugreift.

Nochmal: ich greife nicht von aussen direkt auf mein fhem zu.

Grundsätzlich habe ich zwei Möglichkeiten, meine fhem "von aussen" Kommandos zu geben.


  • ich kann dafür einen externen Kalender nutzten, der von meinem fhem alle zehn Minuten ausgewertet wird
  • ich kann - für dringende Fälle - meinem fhem eine email schicken, in der drinsteht, was es tun soll.

In beiden Fällen funktioniert die Kommunikation asynchron, ohne eine direkte Verbindung herzustellen. Der umgekehrte Weg läuft über InfoPanels, die alle fünf Minuten aktualisiert und auf einem externen Webserver bereitgestellt werden.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

fiedel

Vielen Dank Udo!  Kalender ist nichts für mich - schon gar nicht der von Google, aber das mit den Mails ist interessant. Da gibt es ja auch ein Modul für. Werde das mal im Hinterkopf behalten...

Gruß
Frank
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

betateilchen

Meine von fhem genutzten Kalender liegen auf meinem eigenen ownCloud Server, der über ein qualifiziertes SSL Zertifikat verfügt.

Die emails, die ich meinem fhem schicke, sind ebenfalls mit Zertifikat digital unterschrieben, und mein fhem prüft auf diese Tatsache.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

harway2007

am Anfang schreibt der Author:

Hier habe ich erstmal den Webzugriff auf Port 2812 für User der Gruppe dialout eingeschalten:
Code: [Auswählen]
  set httpd port 2812 and
     allow @dialout
und dann :
Dann habe ich mir für die zu überwachenden Prozesse "Regeln" definiert. In meinem Fall perl, fhem, mysql, hcitool und sonos.
Hier kann man nach belieben Dinge hinzu packe.
usw...

kann mir bitte jemand sagen wo die Scripte hinkommen ????

ChrisW

#23
Wenn ich meinen PI neu starte ist der order /var/run/fhem .. wieder weg :(
Ist das normal das das nicht dauerhaft gespeichert bleibt ? fhem hat auch keine Rechnte einen neuen Ordner /Datei anzulegen
Raspberry PI3 mit allem möglichen.

vencam

Der Thread ist zwar schon ne Weile alt, aber vielleicht hilft es ja dem einen oder anderen.

Damit /var/run/fhem automatisch gestartet wird, führt man folgenden Befehl aus:

sudo systemctl edit --full fhem

.. und macht unter [Service] (nach Group=dialout) diese Einträge:

[Service]
PermissionsStartOnly=true
ExecStartPre=-/bin/mkdir -p /var/run/fhem
ExecStartPre=/bin/chown -R fhem:dialout /var/run/fhem


Danach STRG+X und mit J speichern.