Netzlaufwerk überwachen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
dll-live
User
Beiträge: 32
Registriert: Dienstag 11. August 2020, 09:25
Wohnort: CH

Hallo zusammen.

Folgendes ist meine Anordnung:
- Auf einer Synology läuft dieWebstation - Somit habe ich das Verzeichnis "web"da habe ich das Unterverzeichnis "Steuerdateien" angelegt.
- Auf der Synology kann eine php-Datei aufgerufen werden, die je nach dem welcher Button gedrückt wird, verschiedenes macht - unter anderem Datei(en) in den Ordner Steuerdateien ablegt.

- Auf meinem Laptop habe ich das folgende Script zusammen geschnitten (Die Idee / das Original Script ist auf folgendem Beitrag : viewtopic.php?t=46446 .

Code: Alles auswählen

#!/usr/bin/python3
# -*- coding: utf-8 -*-
#Sebang...
# Benötigtes Packet: watchdog => pip3 install watchdog

from time import sleep
from watchdog.events import PatternMatchingEventHandler
from watchdog.observers import Observer

PATH = "/mnt/web/Steuerdateien"
#PATH = "/home/p13_dani/Desktop/tes"


class FileEventHandler(PatternMatchingEventHandler):

    def _on_event(self, event):
        print(event.src_path)
        print("Das Tut")

    on_created = _on_event
    #on_modified = on_deleted = on_created = on_moved = _on_event


def main():
    observer = Observer()
    event_handler = FileEventHandler(
        ignore_patterns=["*.swp", "*.swx", "*.swpx"]
    )
    observer.schedule(event_handler, PATH, recursive=True)
    observer.start()
    try:
        while True:
            sleep(10)
            print(".. weiterer Schleifendurchgang")
    except KeyboardInterrupt:
        observer.stop()
    observer.join()
    print("ende")
    

if __name__ == "__main__":
    main()
Führe ich das Script mit einem Lokal überwachtem Pfad aus ("/home/p13_dani/Desktop/tes") funktioniert es einwandfrei. :)
Stelle ich den Pfad nun auf das Netzlaufwerk ein, und mache von meinem Laptop eine Datei in dieses Netzlaufwerk - funktioniert es :)

Mache ich nun von einem anderen PC im Netzwerk eine Datei in dieses Netzlaufwerk passiert nichts. :( :(
Wieso ist das so?
Was muss ich tun? Damit auch "diese - von anderen PC erstellte Dateien" eine Aktion vom Script auslösen?

Die Netzwerkfreigabe habe ich "normal" über /etc/fstab als auch einmal über "nfs" versucht - Das Ergebnis, war jedes mal das selbe....

Über Hinweise und Lösungsansätze / Lösungen freue ich mich ;)

Gruss Daniel
Benutzeravatar
sparrow
User
Beiträge: 4186
Registriert: Freitag 17. April 2009, 10:28

Der Observer benutzt Schnittstellen des Betriebssystems um darüber informiert zu werden, wnn das Betriebssystem eine Datei erstellt. Dein Betriebssystem erstellt aber die Datei auf dem Netzlaufwerk nicht - also kann es darüber auch nicht informieren.

Man kann watchdog auch implizit so verwendet, dass er selbst nach Änderungen in der Verzeichnisstruktur sucht. Das ist aber langsam und laut Dokumentation nicht eimpfohlen.

Code: Alles auswählen

from watchdog.observers.polling import PollingObserver as Observer
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das klingt so, als ob du dir via Filesystem einen Service stricken willst. Statt den gleich mit einem normalen service zb via HTTP zu bauen. Was für ein eigentliches Problem soll denn da gelöst werden?
dll-live
User
Beiträge: 32
Registriert: Dienstag 11. August 2020, 09:25
Wohnort: CH

@sparrow: Besten Dank für die Info. Von einer „Von-Hinten-Mitten-in-die-Brust-direkt-ins-Auge“ Lösung, sehe ich ab.

@__deets__: Die selbstgestrickt Aufgabe ist wie folgt:
Auf der Synology ist eine Webseite mit Buttons, sobald diese gedrückt werden, soll auf dem Server (nicht Synology sondern eine andere Maschine) - quasi in „Echtzeit“ die jeweilige Aktion ausgeführt werden. (Z.B.: Das Licht aus oder einschalten, oder WLAN Passwort neu generieren und auf einer Anzeige anzeigen).

Freundliche Grüsse
Daniel
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

Joa. Das wuerde ich eben nicht mit solchen komischen Dateiexperimenten machen. Ich weiss jetzt nicht, was Synology alles kann, aber wenn da wenigstens HTML drauf liegen & abgerufen werden kann, dann kannst du mindestens mal mit javascript einen Server im Netzwerk ansprechen. Wenn es sogar PHP ist, kann das auch direkt ein HTTP-Request an eben den anderen Server stellen. Statt sich da sowas mit Datei-Shares zurecht zu frickeln.
dll-live
User
Beiträge: 32
Registriert: Dienstag 11. August 2020, 09:25
Wohnort: CH

@__deets__

Vielen Dank für deine Ausführungen. Ja auf der Synology kann ich PHP ausführen.

HTTP-Request tönt gut, nur ist jetzt meine Frage wie ich dass (mit meinen begrenzten Fähigkeiten) aufbaue / einsetze.

Wenn ich es richtig verstanden habe, mache ich auf der Synology mit PHP nach einem Klick auf einen Button ein HTTP-Request zum Server (IP 192.168.1.88) inkl. Payload (also eine Anweisung was zu tun ist)

Wie verarbeite ich dass auf dem Server? Gehe ich richtig in der Annahme dass ich da jetzt ein Python-Script in dauerschleife laufen lasse (oder besser als Service), welches die Requests empfängt und dann irgendwelche Aktionen ausführt, und wieder wartet bis ein neuer Request kommt.

Wenn diese Annahme richtig ist - wie muss ich da das Grundgerüst - also „warte auf Empfang - verarbeitete den Empfang und warte wieder auf neuen Empfang“ machen?
Die Verarbeitung des Empfangs (also Auswertung was angekommen ist und dann die entsprechende Aktion starten - dafür habe ich eine Idee wie ich das machen kann.

Besten Dank für die Unterstützung.

Freundliche Grüsse Daniel
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na du benutzt eine der üblichen Web-Rahmenwerke wie Flask. Und das ist ja nun auch nicht anders als dein bisheriges Problem, denn auch die Überwachung des Filesystems (so sie denn funktionierte & auch noch eine gute Idee wäre) braucht ja einen Service.
dll-live
User
Beiträge: 32
Registriert: Dienstag 11. August 2020, 09:25
Wohnort: CH

@__deets__

Besten Dank für die schnelle Antwort.

Mit Web-Rahmenwerke (z.B.: Flask) habe ich bis jetzt noch nie gearbeitet.
Nun habe ich etwas Arbeit vor mir. Ich werde mich versuchen und ggf. wieder melden wenn ich Hilfe benötige oder wenn ich etwas lauffähiges habe.

Freundliche Grüsse Daniel
dll-live
User
Beiträge: 32
Registriert: Dienstag 11. August 2020, 09:25
Wohnort: CH

Lang ist's her....
Heute wieder mal etwas Zeit.
Zu diesem Thema habe ich es geschafft, und mein "Script" läuft, wie versprochen stelle ich es hier ein, evtl hilft es ja mal jemand in einer ähnlichen Situation wie mir damals...

Code: Alles auswählen

# Benötigtes Paket: (flask) installieren => pip3 install flask
# Um Flask im Netzwerk sichtbar zu machen => bei run host='0.0.0.0' hinzufügen

# Beispiel aufruf: curl http://127.0.0.1:5000/query?language=Python

from flask import Flask, request

# create the Flask app
app = Flask(__name__)

@app.route('/query')
def query():
    print("Test1")
    # if key doesn't exist, returns None
    language = request.args.get('language')

    # if key doesn't exist, returns a 400, bad request error => Eckige klammern
    #framework = request.args['framework']
    framework = request.args.get('framework')

    website = request.args.get('website')

    return '''
              <h1>The language value is: {}</h1>
              <h1>The framework value is: {}</h1>
              <h1>The website value is: {}
              '''.format(language, framework, website)

@app.route('/example')
def example():
    return 'Form Data Example'

if __name__ == '__main__':
    # run app in debug mode on port 5000
    app.run(host='0.0.0.0', debug=True, port=5000)
Fruendliche Grüsse
Dani
Antworten