- Mitglied seit
- 4 Dez 2018
- Beiträge
- 47
- Punkte für Reaktionen
- 1
- Punkte
- 8
Preface:
Die Umsetzung und alle Tests wurden auf einer realen FB4050 mit Freetz-NG durchgeführt.
ChatGPT wurde zur Strukturierung, Dokumentation, Fehlersuche und Code-Unterstützung verwendet.
Die ersten Beiträge dieses Threads wurden zu 100% von ChatGPT formuliert und fassen (hoffentlich vollständig) zusammen, was in etwa zwei Tagen Entwicklungs- und Testarbeit entstanden ist.
Das Ergebnis läuft produktiv und ist für mich sehr zufriedenstellend. Es gibt aber sicherlich noch Möglichkeiten zur Verbesserung und Weiterentwicklung.
Tippfehler, Copy-&-Paste-Fehler und kleine Unstimmigkeiten sind natürlich von mir. ;-)
======================
Randbedingungen:
Beispiel:
<span>/var/mod/root/usbdevice/ftp/<br><br>└── 20260716/<br> └── record/<br> ├── A260716_092128_092142.264<br> └── A260716_092303_092317.264</span>
Ein Cronjob startet regelmäßig ein Script:
<span>IP-Kamera<br> |<br> v<br>USB-Speicher Fritzbox<br> |<br> v<br>cammail.sh<br> |<br> v<br>stunnel<br> |<br> v<br>SMTP Server<br> |<br> v<br>E-Mail mit Videoanhang</span>
Deshalb wurde stunnel als lokaler TLS-Wrapper verwendet:
<span>cammail.sh<br> |<br> | SMTP Klartext lokal<br> |<br>127.0.0.1:1465<br> |<br> | TLS<br> |<br>smtp.provider.de:465</span>
Das Script selbst benötigt dadurch keine TLS-Funktionalität.
Beispiel:
<span>/tmp/flash/<br><br>├── checkmaild/<br>│ └── smtp.conf<br>│<br>└── cammail/<br> ├── cammail.sh<br> └── sent.log</span>
Wichtig:
<span>/var/mod</span> ist bei Freetz-NG nicht der richtige Ort für dauerhafte Dateien.
<span>/tmp/flash/checkmaild/smtp.conf</span>
Beispiel:
<span>SMTP_USER="[email protected]"<br>SMTP_PASS_B64="Base64Passwort"<br>BOX_MAIL="[email protected]"<br>ADMIN_MAIL="[email protected]"</span>
Das Passwort liegt nicht direkt im Script.
Beispiel:
<span>/tmp/flash/cammail.lock</span>
Der Lock wird nicht persistent gespeichert.
Grund:
Ein Stromausfall oder Neustart darf keinen alten Lock hinterlassen.
Verwendet wird:
<span>mkdir "$LOCKDIR"</span>
weil <span>mkdir</span> atomar ist.
Wenn bereits ein Prozess läuft:
<span>cammail: already running - exit</span>
<span>*.264<br>*.265</span>
Nur Dateien, die älter als eine definierte Zeit sind, werden verarbeitet.
Beispiel:
<span>MAX_AGE=120</span>
Damit wird verhindert, dass gerade noch geschriebene Dateien verschickt werden.
Der Originalclip bleibt erhalten:
<span>264<br>265</span>
und wird direkt als MIME-Anhang verschickt:
<span>Content-Type:<br>application/octet-stream<br><br>Content-Transfer-Encoding:<br>base64</span>
Damit entstehen keine zusätzlichen CPU-Lasten durch Video-Konvertierung.
<span>cammail: sent A260716_092128_092142.264<br>cammail: deleted A260716_092128_092142.264</span>
Danach wird die Datei gelöscht.
<span>cammail: send failed A260716_092128_092142.264</span>
Die Datei bleibt erhalten.
Beim nächsten Cron-Lauf wird erneut versucht.
Alle 5 Minuten:
<span>*/5 * * * * nice -n 10 /tmp/flash/cammail/cammail.sh</span>
<span>nice</span> reduziert die CPU-Priorität.
Die Fritzbox soll weiterhin bevorzugt:
Alle Meldungen gehen über:
<span>logger -t cammail</span>
Anzeige:
<span>logread | grep cammail</span>
Vorteile:
Eine Datei wird erst gelöscht, wenn der SMTP-Server den Versand bestätigt.
Ablauf:
<span>Datei vorhanden<br><br> |<br> v<br><br>SMTP Versand<br><br> |<br> +---- Fehler<br> | |<br> | v<br> | Datei bleibt<br> |<br> v<br><br>250 OK vom SMTP Server<br><br> |<br> v<br><br>Datei löschen</span>
Die Umsetzung und alle Tests wurden auf einer realen FB4050 mit Freetz-NG durchgeführt.
ChatGPT wurde zur Strukturierung, Dokumentation, Fehlersuche und Code-Unterstützung verwendet.
Die ersten Beiträge dieses Threads wurden zu 100% von ChatGPT formuliert und fassen (hoffentlich vollständig) zusammen, was in etwa zwei Tagen Entwicklungs- und Testarbeit entstanden ist.
Das Ergebnis läuft produktiv und ist für mich sehr zufriedenstellend. Es gibt aber sicherlich noch Möglichkeiten zur Verbesserung und Weiterentwicklung.
Tippfehler, Copy-&-Paste-Fehler und kleine Unstimmigkeiten sind natürlich von mir. ;-)
======================
Freetz-NG: Kamera-Videoclips automatisch per Mail versenden mit checkmaild und stunnel
Ziel
Ich wollte eine Freetz-NG-Fritzbox dazu verwenden, automatisch Videoclips einer IP-Kamera per E-Mail zu versenden.Randbedingungen:
- kein <span>ffmpeg</span>
- keine zusätzliche Mailsoftware
- möglichst wenig Ressourcenverbrauch
- kompatibel mit BusyBox-Umgebung
- Versand über verschlüsseltes SMTP
- bei erfolgreichem Versand Datei löschen
- bei Fehler Datei behalten und später erneut versuchen
- Fritzbox FB4050
- Freetz-NG
- BusyBox
- USB-Speicher über FritzNAS/FTP
- SMTP-Anbieter mit Port 465
Architektur
Die Kamera schreibt ihre Clips auf den USB-Speicher der Fritzbox.Beispiel:
<span>/var/mod/root/usbdevice/ftp/<br><br>└── 20260716/<br> └── record/<br> ├── A260716_092128_092142.264<br> └── A260716_092303_092317.264</span>
Ein Cronjob startet regelmäßig ein Script:
<span>IP-Kamera<br> |<br> v<br>USB-Speicher Fritzbox<br> |<br> v<br>cammail.sh<br> |<br> v<br>stunnel<br> |<br> v<br>SMTP Server<br> |<br> v<br>E-Mail mit Videoanhang</span>
Warum stunnel?
Die vorhandene Freetz-NG-Umgebung konnte SMTP nicht direkt mit SSL/TLS.Deshalb wurde stunnel als lokaler TLS-Wrapper verwendet:
<span>cammail.sh<br> |<br> | SMTP Klartext lokal<br> |<br>127.0.0.1:1465<br> |<br> | TLS<br> |<br>smtp.provider.de:465</span>
Das Script selbst benötigt dadurch keine TLS-Funktionalität.
Verzeichnisstruktur
Alle dauerhaften Dateien liegen unter <span>/tmp/flash</span>.Beispiel:
<span>/tmp/flash/<br><br>├── checkmaild/<br>│ └── smtp.conf<br>│<br>└── cammail/<br> ├── cammail.sh<br> └── sent.log</span>
Wichtig:
<span>/var/mod</span> ist bei Freetz-NG nicht der richtige Ort für dauerhafte Dateien.
SMTP-Konfiguration
Datei:<span>/tmp/flash/checkmaild/smtp.conf</span>
Beispiel:
<span>SMTP_USER="[email protected]"<br>SMTP_PASS_B64="Base64Passwort"<br>BOX_MAIL="[email protected]"<br>ADMIN_MAIL="[email protected]"</span>
Das Passwort liegt nicht direkt im Script.
cammail.sh
Das Script macht:- Lock setzen
- SMTP-Konfiguration laden
- fertige Kamera-Clips suchen
- Clip als MIME-Mail versenden
- bei Erfolg löschen
- Fehler über Syslog melden
Lock-Mechanismus
Der Lock wird absichtlich unter <span>/tmp</span> angelegt.Beispiel:
<span>/tmp/flash/cammail.lock</span>
Der Lock wird nicht persistent gespeichert.
Grund:
Ein Stromausfall oder Neustart darf keinen alten Lock hinterlassen.
Verwendet wird:
<span>mkdir "$LOCKDIR"</span>
weil <span>mkdir</span> atomar ist.
Wenn bereits ein Prozess läuft:
<span>cammail: already running - exit</span>
Auswahl der Videodateien
Gesucht werden:<span>*.264<br>*.265</span>
Nur Dateien, die älter als eine definierte Zeit sind, werden verarbeitet.
Beispiel:
<span>MAX_AGE=120</span>
Damit wird verhindert, dass gerade noch geschriebene Dateien verschickt werden.
Versand
Die Datei wird nicht konvertiert.Der Originalclip bleibt erhalten:
<span>264<br>265</span>
und wird direkt als MIME-Anhang verschickt:
<span>Content-Type:<br>application/octet-stream<br><br>Content-Transfer-Encoding:<br>base64</span>
Damit entstehen keine zusätzlichen CPU-Lasten durch Video-Konvertierung.
Erfolgs- und Fehlerverhalten
Erfolgreicher Versand
Beispiel Log:<span>cammail: sent A260716_092128_092142.264<br>cammail: deleted A260716_092128_092142.264</span>
Danach wird die Datei gelöscht.
Fehler
Beispiel:- SMTP nicht erreichbar
- TLS Fehler
- Netzwerkproblem
<span>cammail: send failed A260716_092128_092142.264</span>
Die Datei bleibt erhalten.
Beim nächsten Cron-Lauf wird erneut versucht.
Cronjob
Beispiel:Alle 5 Minuten:
<span>*/5 * * * * nice -n 10 /tmp/flash/cammail/cammail.sh</span>
<span>nice</span> reduziert die CPU-Priorität.
Die Fritzbox soll weiterhin bevorzugt:
- Routing
- WLAN
- Telefonie
Logging
Es wird kein eigenes Debug-Log geführt.Alle Meldungen gehen über:
<span>logger -t cammail</span>
Anzeige:
<span>logread | grep cammail</span>
Vorteile:
- zentrale Fritzbox-Logs
- keine zusätzlichen Dateien
- einfache Integration in weitere Überwachungsfunktionen
Sicherheit gegen Datenverlust
Die wichtigste Designentscheidung:Eine Datei wird erst gelöscht, wenn der SMTP-Server den Versand bestätigt.
Ablauf:
<span>Datei vorhanden<br><br> |<br> v<br><br>SMTP Versand<br><br> |<br> +---- Fehler<br> | |<br> | v<br> | Datei bleibt<br> |<br> v<br><br>250 OK vom SMTP Server<br><br> |<br> v<br><br>Datei löschen</span>
Mögliche Erweiterungen
Noch nicht umgesetzt:- automatische Bereinigung leerer Kamera-Tagesordner
- Statusmail bei Fehlern
- mehrere Kameras
- maximale Mailgröße
- Überwachung des USB-Mounts
- Alarmprioritäten
Erfahrungen
Die wichtigsten Punkte bei diesem Projekt:- Freetz-NG-Pfade beachten:
- persistent: <span>/tmp/flash</span>
- flüchtig: <span>/var/mod</span>
- Locks nicht persistent machen
- Fehlerfälle zuerst planen
- keine Datei löschen, bevor der Erfolg sicher ist
- Syslog statt eigener Logdateien verwenden
- möglichst kleine BusyBox-kompatible Shell-Scripte einsetzen
Anhänge
Zuletzt bearbeitet: