Verzeichnisüberwachung, eMail wenn kein neuer Ordner

ds_cheater

Lieutenant
Registriert
Jan. 2008
Beiträge
774
Hallo,
ich mache gerade ein Zeitraffer Projekt. Jetzt suche ich nach einer Möglichkeit, wie ich überwachen kann, dass die Kamera noch ihren dienst tut.

Ich stelle mir das in etwa so vor, dass wenn kein neuer Ordner erstelle wurde, ich eine eMail erhalte. Also eine Art Verzeichnisüberwachung. Bisher habe ich nur Programme gefunden, die signalisieren, wenn ein neuer Ordner erstellt wurde, leider brauche ich aber genau das Gegenteil.

Ich wäre für jede Hilfe dankbar.

Grüße, cheater
 
Wieviele eMails willst Du denn jede Sekunde kriegen? Na mußt Du schon präziser werden. An was soll denn "kein Ordner erstellt" gekoppelt sein.
 
So was lässt sich mit ein paar Zeilen Skriptcode umsetzen. Die Frage wäre, ob Dir das reicht oder ob es ein Programm mit einer GUI sein muss?
 
Sry, hätte vielleicht noch etwas präziser sein können.

Also die Kamera wird ist mit CHDK ausgrüstet und wird mit Programm ptpCamGui angesteuert. Das Starten und Beenden der Zeitrafferaufnahme übernimmt Eventghost.

Was dann passiert ist, dass jeden Abend zu einer bestimmten Zeit die Bilder von der SD-Card auf den PC geladen werden. Nur gab es die Tage ein Problem und es passierte nichts. Und dann sollte eben nach diesem Zeitpunkt getestet werden, ob der neue Ordner erstellt wurde, wenn ja ist alles OK, wenn nicht brauche ich eine Benachrichtigung.

Eventghost selbst beherrscht sogar Phython-Skripte, die ich zeitgestuert ausführen kann. Leider kann ich nicht programmieren und weiss nicht, wie ich das machen soll.

Prinzipiell ist mir es aber egal, wie das funktioniert, hauptsache ich bekomme eine eMail, wenn kein Ordner nach xx Uhr hinzugekomen ist :D.

Grüße, cheater!
 
Das Skript soll also nicht kontinuierlich einen Ordner überwachen, sondern lediglich einmalig prüfen, ob seit einer bestimmten Zeit ein neuer Ordner erstellt wurde?

Bsp: das Skript wird um 01:00 aufgerufen, und prüft ob in den vorigen drei Stunden einer neuer Ordner erstellt wurde und wenn nicht, wird eine Nachricht verschickt?
 
Jup, genau so sollte das sein :).
 
Zum Verschicken der E-Mail benötigt es einen Server. Auf dem Rechner läuft vermutlich kein E-Mail Server? Bist Du Kunde bei Google etc. deren SMTP-Server man verwenden könnte? Welche Python-Version wird verwendet?
 
Also,
habe gerade nochmal geschaut, Eventghost bietet ein Email Plugin. Das heisst, ich bräuchte nur einen Code, der mir eine Überprüfung macht und dann ein Event triggert, mit welchem ich die Mail verschicke.

Die Phyton-Version konnte ich leider nicht in Erfahrung bringen.
 
Ich gehe mal davon aus, dass noch eine 2er Version verwendet wird. Mit Eventghost kenne ich mich allerdings nicht aus. Insofern müsstest Du testen, ob das mit dem Event triggern so funktioniert (Zeile 44). Ansonsten kann man wie gesagt, auch selbst eine Mail verschicken. Dafür wird dann aber ein SMTP-Server benötigt.

Geprüft wird, ob in den letzten 3 h vor Aufruf des Skriptes ein neuer Ordner innerhalb des angegebenen Verzeichnisses erstellt wurde. Der absolute Verzeichnispfad muss in Zeile 12 angegeben werden. Die Zeitspanne (in Stunden) kann in Zeile 9 angegeben werden.

Getestet haben ich den Code unter Mac OS X mit Python 2.5. Viel Glück :)

Code:
from datetime import datetime, timedelta
import logging
import os
import pipes


# the time delta in hours. If no folder has been created within this
# delta, an event will be triggered
delta = 3

# the absolute path to the folder to check, always use forward slashes
folder = r'/set/path/to/folder/here'


format = logging.Formatter('[%(levelname)s] %(message)s')
consoleHandler = logging.StreamHandler()
consoleHandler.setFormatter(format)
log = logging.getLogger('Check')
log.addHandler(consoleHandler)
log.setLevel(logging.DEBUG)


def contains_changes(folder):
    return datetime.today() - timedelta(hours = delta) < last_modified(folder)

def last_modified(dir):
    if not os.path.exists(dir):
       raise IOError('Dateipfad "%s" existiert nicht' % (dir))
    if not os.path.isdir(dir):
       raise IOError('Dateipfad "%s" ist kein Verzeichnis' % (dir))
    log.debug('Check "%s"' % dir)
    time = 0
    for entry in os.listdir(dir):
        path = os.path.join(dir, entry)
        if os.path.isdir(path):
            modified = os.path.getmtime(path)
	    if modified > time:
	        time = modified
    log.debug('Aktuellster Ordner: %s' % datetime.fromtimestamp(time))
    return datetime.fromtimestamp(time)

def trigger_event():
    log.debug('Trigger EventGhost event')
    eg.TriggerEvent('SendMailNotification')


if contains_changes(pipes.quote(folder)):
    trigger_event()
 
Sry,
muss alles vorherige wiederrufen. Ich war zu blöd den Code zu kopieren. Nun schaut das schon besser aus :D.

Wenns Probleme gibt, oder es funktioniert, melde ich mich wieder.
 
Zuletzt bearbeitet:
ds_cheater schrieb:
schonmal vielen Dank bis hierher. Leider gibt es noch ein paar Probleme. Der Code sieht nun so aus:

Bei Python ist die korrekte Einrückung essentiel. Der Code muss so aussehen, wie in meinem Beispiel oben. Bei Deinem Code ist die Einrückung komplett weg, damit funktioniert das Skript nicht. Der Pfad schaut aber gut aus. Ich hänge das noch mal als Datei an, damit die Einrückung keine Probleme macht. Hätte ich gleich daran denken sollen...
 

Anhänge

Hehe,
drum habe ich ja nochmal editiert, da ich dass dann auch gemerkt habe und es nun erstmal gar nicht so schlecht aussieht.

Mit dem
eg.TriggerEvent('Error')
kann ich dann anschließend die Aktion auslösen, mit der mir eine Fehlermail gesand wird.

Jetzt muss das Ganze nur noch ein paar Tests überstehen!
 
Der Edit kam zu spät! :D

Mit EventGhost im speziellen kenne ich mich wie gesagt nicht aus. Welches Event ausgelöst werden muss, musst Du ausprobieren. Die Syntax sollte stimmen.

Ich weiß nicht, ob die Logging-Ausgabe irgendwo angezeigt wird. Man könnte zusätzlich noch in eine Logdatei schreiben, damit man den Ablauf verfolgen kann.
 
Eventghost hat selbst ein Logfenster, da wird dann ausgegeben:
23:05:03 [DEBUG] Aktuellster Ordner: 2013-02-03 23:03:47.646130
 
Dann passt das ja mit der Ausgabe nach sys.stderr. Wenn alles läuft, kann man den Level von "logging.DEBUG" auf "logging.WARNING" setzen, um die Meldungen zu unterdrücken.
 
So ganz will es noch nicht.

Frage, kann es sein, dass es hier noch einen Fehler gibt:
if contains_changes(pipes.quote(folder)):
trigger_event()
Müsste dieser Ausdruck nicht verneint werden, da das Event ja generiert werden soll, wenn kein neuer Ordner in der angegebenen Zeit erstellt wurde?
 
Autsch! Da fehlt in der Tat die Negierung:

Code:
if not contains_changes(pipes.quote(folder)):
    trigger_event()
 
Sehr schön, nun klappt das schon besser ;).

Frage:
Momentan prüft das Skript das Änderungsdatum, wäre es auch möglich, das Erstelldatum zu prüfen?

Grüße
 
Schaut mir zu aufwändig aus :D. Es funktioniert, aber denke ich auch so. :rolleyes:

Ich sage schon mal vielen, vielen Dank, ohne dich hätte ich das so nicht hinbekommen.

Grüße, cheater

Edit: Habe jetzt mal alles sauber eingepflegt und dem Skript einen täglichen Startzeitpunkt gegeben. Denke das funktioniert, wie gedacht.
 
Zuletzt bearbeitet:
Zurück
Oben