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

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

Vorheriges Thema - Nächstes Thema

JoWiemann

Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

marvin78

Gut, dann geht die Version morgen ins update. Danke für den Hinweis.

Das mit dem check auf das Perl Modul "Linux::inotify2" beim define hat sich damit vorerst erledigt. Aber es sollte ja jedem klar sein, dass das hier benötigt wird.

JoWiemann

Zitat von: marvin78 am 31 Januar 2019, 19:52:03
Das mit dem check auf das Perl Modul "Linux::inotify2" beim define hat sich damit vorerst erledigt. Aber es sollte ja jedem klar sein, dass das hier benötigt wird.

Hm. ich habe jetzt nicht mehr nachgesehen, aber in vielen Modulen wird folgendes erfolgreich genutzt

        eval { require Linux::inotify2; };

        unless($@)
        {
            Log3 $name, 5, "inotify ($name) - found Linux::inotify2";
        }
        else
        {
            Log3 $name, 5, "inotify ($name) - unable to load Linux::inotify2 module: $@. Please install with sudo apt-get install liblinux-inotify2-perl";
        }


Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

marvin78

Ja. So ähnlich mache ich das auch. Das Einbinden über eval scheint aber zu dem bareword Fehler zu führen.

Ich werde die Tage mal ein paar andere Varianten testen.

JoWiemann

Hm, Du könntest das eval() vor Zeile 296 $inotify = new Linux::Inotify2; setzen und dann entsprechend reagieren. Im Def Bereich habe ich bisher noch nie genutzt. Beim googeln habe ich Deine Variante auf die Schnelle auch nicht gefunden.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

marvin78

Ich habe gerade eine Version eingecheckt, die es richtig machen solte. Sie orientiert sich mehr an deinem Beispiel, als an meiner ersten Variante.

Manchmal macht mich Perl noch immer wahnsinnig ;)

Danke.

JoWiemann

Ok, läuft jetzt auf dem Testsystem. Wenn ich am Wochenende Zeit habe, werde ich noch mal die intotify2 Lib löschen und testen, ob die Warnmeldung kommt.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

CQuadrat

Hallo Marvin,

geht mit diesem Modul nur eine Instanz?

Ich habe für die Überwachung einer Datei ein entsprechendes Device angelegt. Das lief hervorragend:

DEF        /opt/fhem/B29/Oelverbrauch parameter.dat
   FD         28
   FILES      parameter.dat
   MID        inotify_optfhemB29Oelverbrauchparameterdat
   NAME       intfy_Oelverbrauch
   NOTIFYDEV  global
   NR         1956
   NTFY_ORDER 81-intfy_Oelverbrauch
   PATH       /opt/fhem/B29/Oelverbrauch
   STATE      active
   TYPE       inotify
   VERSION    0.6.1
   READINGS:
     2019-02-04 00:03:50   lastEventFile   /opt/fhem/B29/Oelverbrauch/parameter.dat
     2019-02-04 00:03:50   lastEventMask   IN_CLOSE_WRITE
     2019-02-04 00:02:35   state           active
   helper:
     dirs:
       /opt/fhem/B29/Oelverbrauch
     events:
       0:
         file       /opt/fhem/B29/Oelverbrauch/parameter.dat
         mask       IN_CLOSE_WRITE
         time       2019-02-04 00:03:50
       1:
       2:
       3:
       4:
       5:
       6:
       7:
       8:
     masks:
       IN_MODIFY
       IN_CLOSE_WRITE
       IN_CREATE
Attributes:
   mask       IN_MODIFY,IN_CLOSE_WRITE,IN_CREATE
   room       Heizung
   verbose    2


Dann wollte ich eine zweite Datei überwachen und habe dafür ebenfalls ein Device angelegt:

Internals:
   CFGFN     
   DEF        /opt/fhem/B29 wlan.cfg
   FD         26
   FILES      wlan.cfg
   MID        inotify_optfhemB29wlancfg
   NAME       intfy_GaesteWLAN
   NOTIFYDEV  global
   NR         32690
   NTFY_ORDER 81-intfy_GaesteWLAN
   PATH       /opt/fhem/B29
   STATE      active
   TYPE       inotify
   VERSION    0.6.1
   READINGS:
     2019-02-03 23:28:21   lastEventFile   /opt/fhem/B29/wlan.cfg
     2019-02-03 23:28:21   lastEventMask   IN_CLOSE_WRITE
     2019-02-04 00:02:14   state           active
   helper:
     dirs:
       /opt/fhem/B29
     masks:
       IN_MODIFY
       IN_CLOSE_WRITE
       IN_CREATE
Attributes:
   mask       IN_MODIFY,IN_CLOSE_WRITE,IN_CREATE
   room       Maschinenraum
   verbose    2

Das lief dann auch super. Bis ich dann aber merkte, dass das erste inotify-Device nicht mehr lief. Ein defmod auf das erste Device führte wieder dazu, dass es lief; dafür war dann das zweite ohne Reaktion.

Kann es vielleicht daran liegen, dass beide zu überwachenden Dateien im gleichen Verzeichnis /opt/fhem/B29 liegen?


Danke und Gruß

Christoph
FHEM auf Mini-ITX-Server mit Intel Quad-Core J1900:
+ HM: HM-LAN, HM-USB, HM-MOD-UART mit div. HM-Komponenten
+ RFXtrx: Funkwetterstation Bresser mit ext. Thermometer, Regenmesser und Windmesser
+ TUL (KNX-Anbindung), KM271 (per ser2net), SONOS (div. Gimmicks), OneWire, Hue

marvin78

Das inotify Modul ist ursprünglich als Ordnerüberwachung konzipiert worden (und das ist auch das Grundkonzept von Linux::Inotify2). Fileüberwachung über Regex kam später auf Wunsch dazu. Meine Empfehlung ist, vorerst den gesamten Ordner zu überwachen und das entsprechende Event für die Dateien auszuwerten.

Ich schaue mir das aber an, sobald ich Zeit habe.

CQuadrat

Danke.

Das war auch meine Vermutung und Idee, das "Problem" zu lösen.
FHEM auf Mini-ITX-Server mit Intel Quad-Core J1900:
+ HM: HM-LAN, HM-USB, HM-MOD-UART mit div. HM-Komponenten
+ RFXtrx: Funkwetterstation Bresser mit ext. Thermometer, Regenmesser und Windmesser
+ TUL (KNX-Anbindung), KM271 (per ser2net), SONOS (div. Gimmicks), OneWire, Hue

TomLee

#55
Hallo,

kann mir wer bitte einen Tipp geben, was mir diese Meldungen mit verbose 5 sagen wollen.

Hatte bisher keine Probleme mit inotify.

Es ist ein neu aufgesetztes RasPiOS System, die Bibliotheken sind vorhanden:

pi@FHEMPIOS:/opt/fhem $ sudo apt-get install liblinux-inotify2-perl
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.       
Statusinformationen werden eingelesen.... Fertig
liblinux-inotify2-perl ist schon die neueste Version (1:2.1-1).
0 aktualisiert, 0 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.
pi@FHEMPIOS:/opt/fhem $ sudo apt-get install libdata-dump-perl
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.       
Statusinformationen werden eingelesen.... Fertig
libdata-dump-perl ist schon die neueste Version (1.23-1).
0 aktualisiert, 0 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.


defmod inot_Umsatz inotify /opt/fhem UMFHEM.csv
attr inot_Umsatz fhem_widget_channels [{"controlled_attribute":"STATE","order":2,"alias":"Umsatz","allowed_values":[]}]
attr inot_Umsatz mask IN_ATTRIB
attr inot_Umsatz room Büro,Fhem_Widget
attr inot_Umsatz stateFormat umsatzmtl €
attr inot_Umsatz verbose 5

setstate inot_Umsatz umsatzmtl €
setstate inot_Umsatz 2020-11-17 17:55:29 state active



2020.11.17 18:22:51 4: inotify (inot_Umsatz): path to watch /opt/fhem
2020.11.17 18:22:51 5: inotify (inot_Umsatz): Fullname /opt/fhem
2020.11.17 18:22:53 4: inotify (inot_Umsatz): path to watch /opt/fhem
2020.11.17 18:22:53 5: inotify (inot_Umsatz): Fullname /opt/fhem/UMFHEM.csv
2020.11.17 18:22:53 5: inotify (inot_Umsatz): got $VAR1 = bless( {
                 'cookie' => 0,
                 'w' => bless( {
                                 'wd' => 1,
                                 'name' => '/opt/fhem',
                                 'mask' => 4095,
                                 'cb' => sub { "DUMMY" },
                                 'inotify' => bless( {
                                                       'ignore' => {},
                                                       'w' => {
                                                                '1' => $VAR1->{'w'}
                                                              },
                                                       'fd' => 70
                                                     }, 'Linux::Inotify2' )
                               }, 'Linux::Inotify2::Watch' ),
                 'mask' => 2,
                 'name' => 'UMFHEM.csv',
                 'wd' => 1
               }, 'Linux::Inotify2::Event' );

2020.11.17 18:22:53 4: inotify (inot_Umsatz): event is not matching any configured mask: IN_MODIFY
2020.11.17 18:22:53 4: inotify (inot_Umsatz): path to watch /opt/fhem
2020.11.17 18:22:53 5: inotify (inot_Umsatz): Fullname /opt/fhem/UMFHEM.csv
2020.11.17 18:22:53 5: inotify (inot_Umsatz): got $VAR1 = bless( {
                 'name' => 'UMFHEM.csv',
                 'wd' => 1,
                 'w' => bless( {
                                 'wd' => 1,
                                 'name' => '/opt/fhem',
                                 'mask' => 4095,
                                 'cb' => sub { "DUMMY" },
                                 'inotify' => bless( {
                                                       'ignore' => {},
                                                       'w' => {
                                                                '1' => $VAR1->{'w'}
                                                              },
                                                       'fd' => 70
                                                     }, 'Linux::Inotify2' )
                               }, 'Linux::Inotify2::Watch' ),
                 'mask' => 32,
                 'cookie' => 0
               }, 'Linux::Inotify2::Event' );

2020.11.17 18:22:53 4: inotify (inot_Umsatz): event is not matching any configured mask: IN_OPEN
2020.11.17 18:22:53 4: inotify (inot_Umsatz): path to watch /opt/fhem
2020.11.17 18:22:53 5: inotify (inot_Umsatz): Fullname /opt/fhem/UMFHEM.csv
2020.11.17 18:22:53 5: inotify (inot_Umsatz): got $VAR1 = bless( {
                 'cookie' => 0,
                 'w' => bless( {
                                 'wd' => 1,
                                 'name' => '/opt/fhem',
                                 'mask' => 4095,
                                 'cb' => sub { "DUMMY" },
                                 'inotify' => bless( {
                                                       'ignore' => {},
                                                       'w' => {
                                                                '1' => $VAR1->{'w'}
                                                              },
                                                       'fd' => 70
                                                     }, 'Linux::Inotify2' )
                               }, 'Linux::Inotify2::Watch' ),
                 'mask' => 2,
                 'name' => 'UMFHEM.csv',
                 'wd' => 1
               }, 'Linux::Inotify2::Event' );

2020.11.17 18:22:53 4: inotify (inot_Umsatz): event is not matching any configured mask: IN_MODIFY
2020.11.17 18:22:53 4: inotify (inot_Umsatz): path to watch /opt/fhem
2020.11.17 18:22:53 5: inotify (inot_Umsatz): Fullname /opt/fhem/UMFHEM.csv
2020.11.17 18:22:53 5: inotify (inot_Umsatz): got $VAR1 = bless( {
                 'cookie' => 0,
                 'wd' => 1,
                 'name' => 'UMFHEM.csv',
                 'mask' => 8,
                 'w' => bless( {
                                 'wd' => 1,
                                 'name' => '/opt/fhem',
                                 'mask' => 4095,
                                 'cb' => sub { "DUMMY" },
                                 'inotify' => bless( {
                                                       'ignore' => {},
                                                       'w' => {
                                                                '1' => $VAR1->{'w'}
                                                              },
                                                       'fd' => 70
                                                     }, 'Linux::Inotify2' )
                               }, 'Linux::Inotify2::Watch' )
               }, 'Linux::Inotify2::Event' );

2020.11.17 18:22:53 4: inotify (inot_Umsatz): event is not matching any configured mask: IN_CLOSE_WRITE
2020.11.17 18:22:53 4: inotify (inot_Umsatz): path to watch /opt/fhem
2020.11.17 18:22:53 5: inotify (inot_Umsatz): Fullname /opt/fhem


-rw-r--r--  1 fhem dialout      5 Nov 17 18:22 UMFHEM.csv

Gruß

Thomas

marvin78

Ich sehe auf die Schnelle keine Fehler. Es gibt bloß kein Event, das der eingestellten Maske entspricht. Die Events können sich tatsächlich in ihrer Ausprägung von System zu System unterscheiden. Da muss man etwas probieren.

TomLee

ZitatEs gibt bloß kein Event, das der eingestellten Maske entspricht.

Das verstehe ich erstmal nicht, die gezeigten Meldungen gibts doch nur im Log wenn ich eine Änderung an der Datei vornehme ?

marvin78

Schon. Es steht aber auch klar in den Meldungen, dass Events erfasst wurden, diese aber nicht zur eingestellten Maske passen. Deshalb werden sie ignoriert.

TomLee

ZitatDa muss man etwas probieren.

Hatte ich noch gestern Abend und jetzt etwas mehr verstanden.
In der Regel wird die Datei UMFHEM.csv regelmäßig aus einer Access-Datenbank nach /opt/fhem exportiert, Dank der derzeitigen Situation weniger oft. Darum hab ich manuell getestet (hätt ichs nur sein lassen).
In Erinnerung war mir das ich damals wenn ich am Tablet mit der App QuickEdit an der Datei Änderungen vornahm und dann per FTP (ja ich weiß) hochlud, es mit der Maske IN_ATTRIB zu einem passenden Event kam.
Mittlerweile mach ich aber mehr mit dem PC/Ubuntu, hier hatte ich die Datei mit LibreOffice Calc editiert und dann hoch geladen aber auch mit nano editiert, gespeichert, mit dem Ergebnis das es wie oben beschrieben zu keinem Event mehr kam.
Wenn ich IN_MODIFY mit dazu nehme gibts auch dann ein Event.
Habs immer noch nicht mit der Datei aus Access probiert (mach ich heute Abend), gehe aber davon das es auch hier weiterhin klappt, da es mit Quickedit mit nur der Maske IN_ATTRIB weiterhin wie immer klappt.
Hab mir das nicht genauer angeschaut, aber kann ja dann nur daran gelegen haben das Access und QuickEdit Änderungen an den Meta-Daten vornehmen, LibreOffice und nano nicht.