Logpy-AgentOne/pipe/resync.py
Jeuner 08ca806cda feat: Kontakt-Abgleich gegen Nextcloud-Adressbuch bei eingehenden Anrufen
pipe/kontakte.py: CardDAV-Abgleich (stdlib urllib, gleicher Stil wie
store.py) gegen ein konfigurierbares Adressbuch (NEXTCLOUD_ADRESSBUCH,
Default "contacts"). Rufnummer wird normalisiert (+49/0049/0-Schreibweisen,
Leerzeichen/Bindestriche), Adressbuch 5 Minuten gecacht statt pro Anruf neu
geladen. Ohne Nextcloud-Konfiguration oder bei Ausfall: sauber None, kein
Anruf bricht deswegen ab.

process_call.py speichert den Treffer als "bekannter_kontakt" in meta.json;
server.py zeigt ihn als gruenen Badge neben der Rufnummer im Board - fuer den
Abgleich "Anrufer sagt X, Nummer gehoert laut Adressbuch Y" auf einen Blick.

Nextcloud-Zugangsdaten aktivierten bisher automatisch auch den Datei-Upload
(store.hochladen) - fuer den reinen Kontakt-Abgleich waere das ein unge-
wollter Nebeneffekt, der das "Vollstaendig on-prem"-Versprechen des Projekts
bricht. Neuer Schalter NEXTCLOUD_UPLOAD (Default an, bestehende Installa-
tionen unveraendert) trennt beides.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PuP3zfgYqhnrwyEne2ejG7
2026-08-23 02:18:51 +02:00

56 lines
1.8 KiB
Python

"""Nachsync: lädt lokal abgelegte Anrufe nach Nextcloud, die noch nicht oben sind.
Nützlich nach einem Nextcloud-Ausfall (z. B. Wartungsmodus): die Pipe speichert
in dem Fall nur lokal; dieser Befehl holt das Hochladen nach.
python3 -m pipe.resync
Erkennt bereits hochgeladene Ordner an der Marker-Datei ``.nextcloud_ok``.
"""
from __future__ import annotations
import sys
from . import config, store
def _anruf_ordner():
"""Alle Anruf-Ordner (JJJJ-MM-TT/HH-MM-SS_*) unter der lokalen Ablage."""
if not config.ABLAGE_LOKAL.is_dir():
return
for tag in sorted(config.ABLAGE_LOKAL.iterdir()):
if tag.is_dir():
for ordner in sorted(tag.iterdir()):
if ordner.is_dir() and (ordner / "meta.json").is_file():
yield ordner
def nachsync() -> tuple[int, int, int]:
"""Gibt (hochgeladen, bereits_oben, fehlgeschlagen) zurück."""
hoch = schon = fehler = 0
for ordner in _anruf_ordner():
if (ordner / store.MARKER).exists():
schon += 1
continue
if store.hochladen(ordner):
print(f"{ordner.parent.name}/{ordner.name}")
hoch += 1
else:
fehler += 1
return hoch, schon, fehler
def main() -> int:
if not config.nextcloud_aktiv():
print("Nextcloud ist nicht konfiguriert — nichts zu tun.", file=sys.stderr)
return 1
if not config.NEXTCLOUD_UPLOAD:
print("NEXTCLOUD_UPLOAD=0 — Datei-Upload ist bewusst ausgeschaltet.", file=sys.stderr)
return 1
hoch, schon, fehler = nachsync()
print(f"\nNachsync fertig: {hoch} hochgeladen, {schon} bereits oben, {fehler} fehlgeschlagen.")
return 0 if fehler == 0 else 2
if __name__ == "__main__":
raise SystemExit(main())