mirror of
https://github.com/Jeuners/Logpy-AgentOne.git
synced 2026-09-09 23:12:32 +02:00
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
56 lines
1.8 KiB
Python
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())
|