docs+feat: Loeschung selbstgesteuert statt Cron, README auf aktuellen Stand

pipe.watch prueft die Aufbewahrungsfrist jetzt selbst alle 24h mit (kein
Cron/launchd noetig - der Watcher laeuft ohnehin dauerhaft). README ergaenzt
um Sicher-Modus, Notfall-Alarm, Loeschfristen/Audit-Log und korrigiert eine
falsche Behauptung zur Ansage (Notruf-Hinweis/Aufnahme-Einwilligung fehlen
in der aktuellen telefon/ansage.txt noch tatsaechlich).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015vtvcyNkapuDh583643hNs
This commit is contained in:
Jeuner 2026-08-24 19:32:31 +02:00
parent 989d3ba85b
commit 2e767f3737
3 changed files with 65 additions and 7 deletions

View file

@ -9,7 +9,9 @@ landet unveraenderlich in audit.log (ueber protokoll.schreibe).
python3 -m pipe.loeschen # loescht faellige Anrufe
python3 -m pipe.loeschen --pruefen # zeigt nur, was faellig waere
Gedacht fuer taeglichen Cron/launchd-Lauf - siehe README fuer die Einrichtung.
Laeuft automatisch alle 24h aus pipe.watch heraus (kein Cron/launchd noetig,
solange der Watcher laeuft - siehe telefon/starten.sh). Manueller Aufruf hier
ist nur fuer Tests/Ad-hoc-Kontrolle gedacht.
"""
from __future__ import annotations

View file

@ -25,12 +25,17 @@ import time
from datetime import datetime
from pathlib import Path
from . import config, process_call, protokoll
from . import config, loeschen, process_call, protokoll
TAKT_S = 3 # Wartezeit zwischen zwei Durchläufen
RUHE_S = 2 # So lange muss die Dateigröße stabil sein (Aufnahme fertig)
ENDUNGEN = {".wav", ".mp3", ".opus", ".ogg", ".m4a", ".aiff"}
# Aufbewahrungsfrist pruefen (pipe.loeschen) - kein Cron noetig, der Watcher
# laeuft ohnehin dauerhaft. time.monotonic() statt datetime.now(): unempfindlich
# gegen Systemzeit-Spruenge (Zeitzone/NTP), zaehlt einfach vergangene Sekunden.
LOESCH_TAKT_S = 24 * 60 * 60
# JJJJMMTT-HHMMSS_<nummer>.<ext> - beides optional, damit auch handverlesene
# Dateien verarbeitet werden.
_NAME = re.compile(r"^(?:(\d{8})-(\d{6}))?_?(.*)$")
@ -139,10 +144,19 @@ def main(argv: list[str] | None = None) -> int:
return 0
print(f"Beobachte {eingang} — Abbruch mit Strg-C")
if config.LOESCHFRIST_TAGE:
print(f"Aufbewahrungsfrist: {config.LOESCHFRIST_TAGE} Tage "
f"(Pruefung alle {LOESCH_TAKT_S // 3600}h, kein Cron noetig)")
protokoll.schreibe("system", "Watcher gestartet")
letzter_loeschlauf = 0.0 # 0 => gleich beim ersten Durchlauf pruefen
try:
while True:
durchlauf(eingang)
if config.LOESCHFRIST_TAGE and time.monotonic() - letzter_loeschlauf >= LOESCH_TAKT_S:
anzahl = loeschen.laeuft()
if anzahl:
print(f"🗑 {anzahl} Anruf(e) nach Aufbewahrungsfrist geloescht.")
letzter_loeschlauf = time.monotonic()
time.sleep(TAKT_S)
except KeyboardInterrupt:
print("\nBeobachtung beendet.")