Ein Modul zur Erfassen von diversen RPi/Linux-Statistiken (SYSMON)

Begonnen von hexenmeister, 06 Dezember 2013, 17:44:38

Vorheriges Thema - Nächstes Thema

Wernieman

- 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

Elektrolurch

Hallo,

habe da ein kleines Problem:
Möchte den Status der Festplatte mit hdparm als "user-defined" abfragen. hdparm erfordert allerdings root - Rechte und ich "stutze" Die Ausgabe von hdparm per perl-script.
Das "user-defined" schaut so aus:

user-defined eth0_ipv6:2:eth0_ipv6:/usr/local/sbin/getipv6.plx, drive_state:2:drive_state:/usr/bin/sudo -u root /usr/local/sbin/getdrivestate.plx

Wenn ich in der fhem - Zeile folgendes eingebe:

{qx(/usr/bin/sudo -u root /usr/local/sbin/getdrivestate.plx)}

bekomme ich:    active/idle

fhem wurde für das Skript in die sudoers eingetragen.
Jedoch bleibt das reading in dem Sysmon - Objekt leer.
Jemand einen Tipp, warum das in sysmon nicht klappt?

Das erste user-defined eth0-ipv6 wird gelesen....

Elektrolurch
configDB und Windows befreite Zone!

Wernieman

Ich möchte Dir einen Tip geben:
bevor Du fhem jetzt soooo viele Rechte gibst, würde ich Dein Proggy als Deamon mit einem passenden User starten und die Daten in fhem "piushen". z.B. durch echo | nc über die telnet-schnitstelle
- 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

hexenmeister

Oder aus cron in eine Textdatei schreiben und in fhem (user-defined) in ein Reading einlesen. Braucht man keine besondere Rechte mehr.
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

Wernieman

Ups ... meinte mit "deamon" eigentlich cron .... und ob man jetzt in eine Textdatei und FHEM pullt, oder man pusht es gleich direkt rein ...
- 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

Elektrolurch

Na, fhem bekommt nur das Recht über sudoers das eine Skript auszuführen:

fhem ALL:NOPASSWD = /usr/lockal/sbin/getdrivestate.plx

Und das Skript kann auch nur von root editiert werden.
Von fhem über Kommandozeile klappt das ja auch, aber nicht über das sysmon als user-defined reading. Und ich hätte gerne gewusst warum.
Das einzige, was mir nur dazu einfällt, ist dass das sysmon Modul hier einen eigenen Prozess startet und der nicht unter fhem läuft...?
Oder worin legt der Denkfehler?
Über cron - job und Datei ist ein wenig von "hinten" durch die Brust geschossen und auch nicht sicherer, als fhem ein Skript zu erlauben über sudoers...

Elektrolurch
configDB und Windows befreite Zone!

hexenmeister

SYSMON nutzt BlockingCall für die Werteabfrage, sollte eigentlich in gleichen User-Context geschehen und sudo sollte funktionieren. Leider keine Idee.

Warum soll cron-job unsicher sein? Wäre ein root-job und würde nur eine lesbare textdatei erstellen. Vorteile: unabhängig von fhem und belastet fhem-Thread nicht.
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

Wernieman

Und es ist (fast) genau so wie fhem.

Normalerweise:
Fhem startet nonblock-job, der die Daten ermittelt und nach fhem pusht
Unser Vorschlag:
Cron startet job der die Daten ermittelt ujnd nach fhem pusht ....

Der Unterschied ist also nur, wer den Job startet.

In der Sicherheit bemüht man sich, immer einem User sowenig Rechte wie möglich zu geben. Weshalb man auch für verschiedene Aufgaben verschiedene User verwendet. Genau so ist es hier auch.

Aber unabhängig davon zu Deinem Problem:
Es dürfte das Leerzeichen in der Definition sein. Du müsstest also das "sudo" auch ins script auslagern ....
- 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

Elektrolurch

#1553
Hallo, das Leerzeichen war es nicht.
da ja eh ein perl-Skript aufgerufen wird, habe ich es auf user-fn umgestellt:

user-fn GetIPV6:2:eth0_ipv6:eth0_ipv6_prefix:eht0_ipv6_host:drive_state

Die sub GetIPV6 liefert zurück:

return ($addr,$prefix,$host,$state);

Wenn ich die Funktion direkt in der fhem - Zeile aufrufe, bekomme ich auch ein array zurück, so wie es die command-ref für user-fn bei mehreren readings verlangt. Setzen tut aber sysmon immer nur das erste reading aus der Liste.

Mache ich da was falsch?
Alle Werte werden in der GetIPV6() korrekt ermittelt, steht so im log.

Edit:
Habe mal mir den Code in sysmon angesehen und log auf 5 gestellt:
a) Alle vier Werte von der subroutine kommen in sysmon an und werden auch per dumper in das log geschrieben. Nur werden zwei von den vier readings aktualisiert, bzw. erzeugt. Die letzten zwei aus der Liste der user-fn - Definition werden ignoriert. An den Werten kann es nicht liegen.
Elektrolurch
configDB und Windows befreite Zone!

PeMue

Ups,

jetzt hat's der Peter auch kapiert, wie das mit dem Filesystem in Sysmon funktioniert. Aber da musste erst das Telefon sagen: "Speicher für Anrufbeantworter voll."  8) 8) 8)

Richtig eingerichtet hätte man das schon früher merken können  ::)

Gruß PeMue
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

hexenmeister

@Elektrolurch
Kann leider nicht sagen, warum das nicht funktioniert. Wenn Deine Funktion ein Artray liefert und eine genügende Anzahl Readings angegeben wurde, sollte ich klappen. Habe kurz getestet mit einer einfachen Expression, es wunktioniert ohne Probleme.
attr sysmon user-fn {('t1','t2','t3')}:1:testr1:testr2:testr3

Probiere Dich der Lösung schrittweise zu nähern. Nehme erstmal eine Funktion, die einfach ein paar Test-Zeichenketten liefert.
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

Elektrolurch

ok. Habe ich ja gemacht. Aber von den vier Werten landen dann nur die ersten zwei in den readings, obwohl bei verbose 5 auch vier Werte im log stehen und das Modul keine Fehlermeldung bezüglich der Anzahl der readings gibt.
Mir ist aber da noch was aufgefallen:

setreading sysmon eth0_ipv6_host  ein_Wert

Steht zunächst zwar in den Readings, ist aber nach dem update durch das Modul gelöscht.
Das reading eth0_ipv6 wird durch die user-fn erzeugt. Kann es sein, dass vor dem Update alle readings gelöscht werden?
Also nicht nur eth0_ipv6 sondern auch eth0_ipv6_host bzw. eth0_ipv6.* ...

Ist schon merkwürdig. ok. Habe das jetzt auch anders gelöst.

Elektrolurch
configDB und Windows befreite Zone!

hexenmeister

Sysmon löscht tatsächlich alle Readings, die es nicht kennt. Daher funktioniert setreading nicht. Aber in user-fn gibst Du ja die Namn an, daher sollte SYSMON sie auch stehen lasssen.
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

RitterSport

Hallo Zusammen,

ich habe Fhem nach ein paar Jahren ganz neu aufgesetzt unter Stretch und Raspi3 und habe nun folgendes Problem:

Einerseits kam Anfangs sehr oft im Modul der Hinweis: non- Blocking
Nach nochmaligem Update war dies weg.

Dafür stieg die Auslastung durch Fhem , welches aber nicht in Sysmon angezeigt wurde, sondern nur zusehen war unter htop direkt auf dem Raspi.
Folglich dauerte es ewig lange bis Fhem reagierte. Sobald ich Sysmon nicht nur disable, sondern komplett aus der Config rausnehme läuft es wieder.

Jemand eine Idee wie ich ansetzen kann?

Ajuba

Ich möchte mich auch mit 2 Grundsatzfragen melden:

1. Begrenzen der Datenmengen
Im empfohlenen Beispiel in der CommandRef "define sysmon SYSMON 1 1 1 10" kommen die Daten im 60-Sekundentakt
- Ich frage mich warum wird hier eine Begrenzung empfohlen mit
attr sysmon event-on-update-reading cpu_temp,cpu_temp_avg,cpu_freq,eth0_diff,loadavg,ram,fs_.*,stat_cpu_percent
und nicht mit
attr sysmon event-on-change-reading cpu_temp,cpu_temp_avg,cpu_freq,eth0_diff,loadavg,ram,fs_.*,stat_cpu_percent
Ein update gibt es ja wohl sicher alle 60 Sekunden. Auch dass es gar keine Änderung gibt ist zwar auch eher unwahrscheinlich aber meiner Meinung nach trotzdem besser. Wie komme ich nun zu einer Event/Datenreduktion?

  • Wie kann ich bei Event-on-change-reading in Zusammenhang mit Kombi-Readings "eth0_diff: RX: 0.66 MB, TX: 0.06 MB, Total: 0.72 MB" ein [:threshold] eingeben, damit ich nur bei größeren Änderungen ein event erzeuge?
  • Wie viel Sinn macht eine Erhöhung auf "define sysmon SYSMON 10 1 1 10"? Geht mir da nicht sinnvolle Information verloren?



2. SVG mit DbLog
Die CommandRef zu SYSMON ist wirklich vorbildlich ausführlich und auch die Beispiele sind toll.
SVG Plots sind nur anhand von SVG FileLog beschrieben. Beim Umstellen auf DbLog scheitere ich nun wahrscheinlich an der Spaltenbreite von DbLog
Laut diesem Thread https://forum.fhem.de/index.php?topic=25648.0 wird für MySQL die Value-Spalte nur als Varchar(32) definiert. Wenn man die Spalte auf Varchar(64) ändert soll angeblich alles funktionieren.
Diese Information finde ich aber weder in CommandRef noch im Wiki - Ich bitte um Bestätigung.


Warum habe ich überhaupt diese Fragen:
Seit ich mit DbLog und Sysmon experimentiere schlägt bei meinem Raspi relativ oft "Perfmon" an und meldet Verzögerungen von mehreren Sekunden und es kommt zu Freezing bei dem Fhem nicht reagiert. Primär fällt mir das auf, wenn ich meine aktuellen Sysmon Filelogs anschauen möchte.

Für Tips ware ich sehr dankbar.
FHEM auf RPi3, Homematic CCU3 mit Cuxd und CUL 868 für FS20, Siemens S7 über CP343-1,
DbLog zu MySQL auf NAS QNAP TS-253D,
Yeelight