Modul: inotify - Überwachung von Dateiänderungen nach Pfad

Begonnen von marvin78, 29 Januar 2018, 15:24:32

Vorheriges Thema - Nächstes Thema

marvin78

Mit dem Linux Kernel-Subsystem inotify werden Veränderungen an Dateien oder Verzeichnissen überwacht und an Applikationen weiter gegeben. Das Modul, um das es hier geht, kann dazu verwendet werden, auf solche Änderungen zu reagieren. Die entsprechenden Readings und Events werden im Modul bereit gestellt. Folgende Perl Module werden benötigt:

Linux::Inotify2,Data::Dumper und File::Find

Debian Pakete:

sudo apt-get install liblinux-inotify2-perl
sudo apt-get install libdata-dump-perl
sudo apt-get install libfile-find-rule-perl


Definition:

defmod <name> inotify <Pfad> [<datei-RegEx>]

Pfad muss dabei ein absoluter Pfad sein.

Beispiel:

defmod inotify inotify /tmp test.*

erzeugt Events bei allen Änderungen an Dateien, die mit "test" beginnen und sich im Pfad /tmp befinden.

Das Modul kann durch folgendem Befehl installiert werden:

update all https://raw.githubusercontent.com/marvin78/FHEM-inotify/master/controls_inotify.txt

oder Download hier

https://github.com/marvin78/FHEM-inotify

Die Attribute "subfolders" und "mask" können verwendet werden, um das Verhalten zu steuern. Eine kleine Doku (commandref) befindet sich im Modul.

Support zu inotify gibt es woanders, zum FHEM-Modul (nicht in Echtzeit) hier im Forum. Informationen zum verwendeten Perl Modul gibt es hier.

marvin78

In Version 0.4.0 kann das mask Attribut per multiselect widget befüllt werden (in FHEMWEB). Den Trenner habe ich dafür auf Komma umgestellt. Die Pipe (|) wird in vorhandenen Installationen nach einem update und restart von FHEM automatisch umgewandelt.

rabehd

Ich hatte das Modul gestern abend mal installiert. Habe es heute vormittag disabled.
Zwischen Einrichtung und disable hatte ich fast jede Minute einen automatischen Neustart. Jetzt nicht mehr.

Events habe ich leider auch keine gefunden.
Vielleicht weil ich ein gemountetes Verzeichnis überwacht habe.

Auch funktionierende Lösungen kann man hinterfragen.

marvin78

Bitte die Doku zu inotify lesen. Es handelt sich um ein Kernel Modul welches natürlich nicht auf remote Dateisystemen funktionieren kann.

Zu dem Problem mit dem Neustart kann ich nur raten (ein Neustart wird definitiv nicht durch das Modul ausgelöst und es hat vermutlich nichts mit dem remote Filesystem zu tun). Falls FHEM beendet wird und dein Neustart automatisch durch einen watchdog o.ä. erfolgt, kann ein Logauszug helfen, dem Problem auf die Spur zu kommen. Bitte die angepinnten Beiträge aus dem Anfängerfragen-Forum lesen. Dort steht, was benötigt wird, damit man bei Problemen nicht raten muss.

Was für ein System verwendest du?

Vorher empfehle ich aber, die aktuelle Version aus dem git zu installieren.

LT@Home

#4
events sind also da - ich muss jetzt den Inhalt des Files noch parsen - und dann in Abhängigkeit davon etwas tun - (es kommen Kommandos per SMS)

list:


Internals:
   CFGFN     
   DEF        /var/spool/gammu/inbox IN*
   FD         32
   FILES      IN*
   NAME       SMSReceive
   NOTIFYDEV  global
   NR         94
   NTFY_ORDER 50-SMSReceive
   PATH       /var/spool/gammu/inbox
   STATE      ???
   TYPE       inotify
   VERSION    0.4.6
   Helper:
     DBLOG:
       lastEventFile:
         logdb:
           TIME       1517647835.57428
           VALUE      /var/spool/gammu/inbox/IN20180123_121141_00_+xxxxxxxxxxxxxx_00.txt
       lastEventMask:
         logdb:
           TIME       1517647835.57428
           VALUE      IN_CLOSE_WRITE
   READINGS:
     2018-02-03 09:50:35   lastEventFile   /var/spool/gammu/inbox/IN20180123_121141_00_+xxxxxxxxxxx_00.txt
     2018-02-03 09:50:35   lastEventMask   IN_CLOSE_WRITE
   helper:
     dirs:
       /var/spool/gammu/inbox
     events:
       0:
         file       /var/spool/gammu/inbox/IN20180123_121141_00_+xxxxxxxxxxxxxx_00.txt
         mask       IN_CLOSE_WRITE
         time       2018-02-03 09:50:35
       1:
         file       /var/spool/gammu/inbox/IN20180123_121141_00_+xxxxxxxxxxxxxx_00.txt
         mask       IN_CLOSE_WRITE
         time       2018-02-03 09:44:11
       2:
       3:
       4:
       5:
       6:
       7:
       8:
     masks:
       IN_CLOSE_WRITE
Attributes:
   mask       IN_CLOSE_WRITE
   room       System

marvin78

#5
Du kannst ja mit einem notify auf das Event reagieren und dort dann (ggf. über eine sub in der myUtils) dann alles weitere machen.

LT@Home

ja - notify schon - aber wie lautet das event? Ich hab grad nen Balken vorm Kopf - sorry

marvin78

#7
Das reading auf das du reagieren musst,ist lastEventFile. Wie das Event genau  aussieht, siehst du, wie immer, im Eventmonitor. Das sind aber FHEM Grundlagen.

Edit: Beispiel:


define inotify_notify_1 notify SMSReceive:lastEventFile:.* {MACHEWAS}


LT@Home

nen reload der 99_myUtils führt zu:


2018.02.03 11:47:08 1: ERROR: Select error -1 (9), error count= 0
2018.02.03 11:47:08 1: Found and deleted bad fileno for SMSReceive


danach bekommt fhem keine Events mehr bus zum n. Neustart

marvin78

Ich brauche immer alle Infos. Ich weiß nicht was in deiner myUtils steht oder wie dein notify aussieht. Ich vermute, dass hier eine Endlosschleife wegen der Zugriffe entsteht.

LT@Home

Jetzt passt's - danke für die Unterstützung - coole Sache das....

marvin78

Freut mich. Vielleicht schilderst du für andere trotzdem noch kurz Ursache und Lösung. Ich fürchte nämlich, dass man dieses Problem häufig haben könnte, wenn man nicht genug aufpasst. Man sollte z.B. auch nicht das FHEM log Verzeichnis auf bestimmte Art überwachen und dann das log von inotify hoch drehen.  ;)

LT@Home

Würde ich gerne - "irgendwann" ging dann auch der reload der 99_myUtils.pm....

Ich hab mir mit dem Modul Input per SMS realisiert - vllt. als Anregung ganz interessant:

Per gammu-smsd https://www.datenreise.de/raspberry-pi-sms-per-kommandozeile-versenden/ laufen SMS ein.

Die SMS landen im Ordner /var/spool/gammu/inbox und haben im Dateinamen die Absendernummer drin - damit lässt sich dann was anfangen:

Mit deinem Notify-Modul überwache ich das Spoolverzeichnis auf eingehende IN*.txt - Files:


define SMSReceive inotify /var/spool/gammu/inbox IN*
attr SMSReceive group SMS
attr SMSReceive mask IN_CLOSE_WRITE
attr SMSReceive room System


Per Notify-Event wird dann bei eingehenden SMS geschaut was denn so anliegt...

define SMSReceive_notify_1 notify SMSReceive:lastEventFile:./var/spool/gammu/inbox/IN.*\.txt {\
    SMSReceived("$EVENT")\
}
attr SMSReceive_notify_1 group SMS
attr SMSReceive_notify_1 room System


Die Funktion SMSReceive (in 99_myUtils) sieht dann so aus:


sub SMSReceived($) {
    my @ev = split(' ', shift);
    my $fname = $ev[1];
    Log 1, "SMS received >$fname<";
    my @fn = split /_/, $fname;
    my $cmd = "";
    if ($#fn > 3) {
        my $phonenumber = $fn[3];
        foreach my $pn (@main::smsrcpts) {
            if ($phonenumber eq $pn) {
                #The SMS was received from one of our numbers
                $cmd = ReadSMS($fname);
                Log 1, "SMSReceived: $cmd";
                fhem($cmd);
            }
        }
    }
}


In $smsrcpts stehen die gültigen Absendernummern drin - ReadSMS holt das Kommando aus der SMS raus wobei ich in ReadSMS noch eine im Moment noch recht plumpe "Übersetzung" drin habe

Für meinen Zweck tut es was es soll.

esk

Hi marvin78,
Danke für das modul... kann ich gut für meine Webcam/Ftp verwenden.


defmod inotify inotify /var/www/upload/camera *.jpg

führt zum fhem absturz.

2018.05.15 07:45:07 3: inotify (inotify): startet watching /var/www/upload/camera with the file pattern *.jpg
Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE .jpg/ at ./FHEM/98_inotify.pm line 341.

Mein Workaround für meine Webcam ...:

defmod inotify inotify /var/www/upload/camera ARC*


Gruß esk