Also ich finde das (`watchdog`) ist keine gute Wahl weil Cross-Plattform → Es kann nur den kleinsten gemeinsamen Nenner und der ist für diese Aufgabe Sch…. Das funktioniert nur einfach wenn die Dateien in dem Verzeichnis nicht geöffnet, geschrieben, und geschlossen werden, sondern dort hin verschoben werden. Sonst hat man nämlich das Problem, dass es kein Ereignis gibt, das einem sagt, das die Datei komplett geschrieben ist.
Da es sich um einen Raspi handelt, also sehr wahrscheinlich Linux, kann man die `inotify`-Funktionalität vom Kernel verwenden und sich beispielsweise auch über das Schliessen von Dateien informieren lassen. Ist jetzt auch kein Garant das die Datei dann tatsächlich komplett ist, aber es ist recht wahrscheinlich.
Der Code auf Github ist auch nicht so besonders. Python 2, ein Haufen Importe die gar nicht verwendet werden (`git` zum Beispiel, WTF‽), ein komplett sinnfreie `SendMail`-Klasse deren einzige Methode einfach nur eine Funktion sein sollte. Bei `FileEventHandler` sind alle Methoden bis auf die `on_moved()` gleich – das hätte man nicht 3× hinschreiben müssen. Und die `on_moved()` funktioniert nicht, weil da `obj` nie erstellt wird.
``time.asctime(time.localtime(time.time()))`` ist eine sehr umständliche Art um ``time.asctime()`` zu schreiben. Wobei in dem Ausdruck wo das steht auch eine Liste mit *einem* Element erstellt wird und das dann mit ``"".join(…)`` zusammengesetzt wird. Das eine Element ist eine Zeichenkette die aus Literalen und Werten mit ``+`` zusammengesetzt wird.
Das Hauptprogramm erzeugt globale Variablen – das sollte in einer Funktion stecken.
Ungetestet:
Code: Alles auswählen
#!/usr/bin/env python3
"""
Copyright (C) 2013 - Ebru Akagündüz <ebru.akagunduz@gmail.com>
This file is part of watchdog-email-notification.
watchdog-email-notification is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
watchdog-email-notification is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>
"""
import time
import smtplib
from email.mime.text import MIMEText
from watchdog.events import PatternMatchingEventHandler
from watchdog.observers import Observer
SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 587
SMTP_USERNAME = "user"
SMTP_PASSWORD = "passwd"
EMAIL_TO = "to"
EMAIL_FROM = "from"
EMAIL_SUBJECT = "Info from watchdog"
PATH = "/etc/"
def send_email(file_path):
message = MIMEText(f"{file_path} changed\n\n{time.asctime()}")
message["Subject"] = EMAIL_SUBJECT
message["To"] = EMAIL_TO
message["From"] = EMAIL_FROM
mail_server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
mail_server.starttls()
mail_server.login(SMTP_USERNAME, SMTP_PASSWORD)
mail_server.sendmail(EMAIL_FROM, EMAIL_TO, message.as_string())
mail_server.quit()
class FileEventHandler(PatternMatchingEventHandler):
@staticmethod
def _on_event(event):
send_email(event.src_path)
on_modified = on_deleted = on_created = _on_event
@staticmethod
def on_moved(event):
# if exist backup file
if event.src_path + "~" == event.dest_path:
return
send_email(event.src_path)
def main():
observer = Observer()
event_handler = FileEventHandler(
ignore_patterns=["*.swp", "*.swx", "*.swpx"]
)
observer.schedule(event_handler, PATH, recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
if __name__ == "__main__":
main()