FritzMonitor ist ein nativer Linux-Systemtray-Monitor für den
FRITZ!Box-Callmonitor. Er verbindet sich über TCP mit Port 1012, meldet
eingehende Anrufe per Desktop-Benachrichtigung und zeigt den Anrufstatus im
Tray.
Außerhalb des Heimnetzes bleibt FritzMonitor aktiv, verbindet sich aber
standardmäßig ausschließlich mit lokalen Zieladressen. Eine öffentliche oder
eine nach dem Entfernen öffentlicher Adressen leere DNS-Antwort für fritz.box
wird verworfen, bevor Callmonitor- oder TR-064-Daten übertragen werden. Nach der
Rückkehr ins Heimnetz nimmt das Programm die Verbindung ohne manuellen Neustart
wieder auf.
Die aktuelle Projektversion steht in VERSION und wird von CMake für Binary und
Pakete übernommen. FritzMonitor wurde erstellt und gestaltet von Thomas Tuul
zusammen mit OpenAI Codex.
Das telefonförmige Icon ist gelb, solange keine Verbindung zur FRITZ!Box besteht. Bei bestehender Verbindung ist es grün, solange keine ungelesenen eingehenden Anrufe vorliegen. Nach einem eingehenden Anruf wird es rot; das Öffnen des Menüs markiert die Anrufe als gelesen.
Das Menü enthält pro Anruf genau eine Zeile. Sie zeigt in dieser Reihenfolge
einen grünen Telefonhörer für angenommene beziehungsweise einen roten
Telefonhörer für verpasste Anrufe, Datum und Uhrzeit im Format 12.07. 18:23
und anschließend den Namen oder – falls keine Namensauflösung möglich ist – die
Rufnummer. Es bleiben die letzten drei Anrufe erhalten, der neueste steht oben.
Die Menü- und Statussprache folgt der Systemlokalisierung: Deutsch bei einer deutschen Locale, sonst Englisch.
Der FRITZ!Box-Callmonitor muss aktiviert sein. Dazu auf einem angeschlossenen
Telefon #96*5* wählen. FritzMonitor verbindet sich anschließend automatisch
mit fritz.box:1012 beziehungsweise dem in der Konfiguration angegebenen Host
und verbindet sich nach Netzwerkunterbrechungen erneut.
Die Konfiguration liegt standardmäßig unter:
~/.config/fritzmonitor/config.toml
host = "fritz.box"
port = 1012
reconnect_seconds = 5
reconnect_max_seconds = 60
allow_nonlocal_addresses = false
max_events = 20
notify_incoming = true
notify_missed = true
# Optional: Telefonbuchabfrage über TR-064
addressbook_enabled = true
tr064_port = 49000
tr064_username = "fritzmonitor"Erlaubt sind standardmäßig private IPv4-Adressen (10/8, 172.16/12 und
192.168/16), IPv4-Link-Local und Loopback sowie IPv6-ULA, IPv6-Link-Local und
Loopback. Andere Adressen werden aus der DNS-Antwort entfernt; bleibt keine
erlaubte Adresse übrig, schlägt die Prüfung fehl. Die gefilterte Antwort wird
für den anschließenden Socket- beziehungsweise libcurl-Aufruf festgeschrieben,
sodass keine zweite, abweichende Auflösung stattfinden kann. Auch eine von
TR-064 gelieferte Telefonbuch-URL wird erneut geprüft; sie darf nur HTTP(S)
verwenden, wird nicht über einen Proxy oder Redirect abgerufen und erhält nie
die TR-064-Zugangsdaten.
reconnect_seconds ist das erste Wiederholungsintervall. Bei anhaltender
Nichterreichbarkeit wächst es bis reconnect_max_seconds; pro Ausfallphase wird
nur eine Statusmeldung geschrieben. Der Standardwert von 60 Sekunden begrenzt
damit zugleich die Wartezeit bis zur Erkennung des wieder verfügbaren
Heimnetzes.
Die Ausnahme allow_nonlocal_addresses = true hebt die Adressgrenze bewusst für
ungewöhnliche Remote- oder VPN-Konfigurationen auf. Sie ist standardmäßig
deaktiviert und sollte nur verwendet werden, wenn Routing und Zielnetz selbst
vertrauenswürdig abgesichert sind. Insbesondere bleibt TR-064 über http://
unverschlüsselt; eine Freigabe für beliebige Internetziele ist daher nicht
sicher.
Das TR-064-Passwort wird standardmäßig geschützt im Secret Service des Desktops
gespeichert und kann beispielsweise mit Seahorse verwaltet werden. Bei einer
noch vorhandenen Klartext-Konfiguration übernimmt der folgende Befehl das
Passwort in den Keyring, prüft den gespeicherten Wert und entfernt erst danach
die Zeile tr064_password atomar aus der TOML-Datei:
fritzmonitor --migrate-tr064-passwordEin neues oder geändertes Passwort wird ohne sichtbare Terminaleingabe mit
fritzmonitor --store-tr064-password gespeichert. Der Eintrag erscheint in
Seahorse als FritzMonitor TR-064 (fritz.box). Weitere Einzelheiten und die
Fallback-Reihenfolge stehen in FRITZMONITOR.md.
Eine kurze, kopierfertige Anleitung für Debian-Paket, FRITZ!Box-Konfiguration, Seahorse und den systemd-User-Service steht in QUICK-SETUP.md.
Die Paketversion folgt SemVer: MAJOR.MINOR.PATCH für
API-/Funktionsänderungen und Fehlerkorrekturen. Debian- und RPM-Pakete tragen
zusätzlich ein distributionsspezifisches Paket-Release, derzeit 1.
Nach einer CMake-Konfiguration mit den Paketpfaden können die Pakete manuell gebaut werden:
cmake -S . -B build/packages -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr \
-DFRITZMONITOR_SERVICE_EXECUTABLE=/usr/bin/fritzmonitor
cmake --build build/packages --target package-deb
cmake --build build/packages --target package-rpmDie erzeugten Dateien liegen unter build/packages/. Für reproduzierbare Builds
ohne Entwicklungssoftware auf dem Host stehen Container-Wrapper bereit:
./scripts/package-in-container.sh deb
./scripts/package-in-container.sh rpmDie Wrapper schreiben nach build/package-deb/ beziehungsweise
build/package-rpm/. Die Pakete können anschließend mit den üblichen
Systemwerkzeugen installiert werden:
sudo apt install "./build/package-deb/fritzmonitor-$(cat VERSION)-Linux.deb"Auf Fedora:
sudo dnf install "./build/package-rpm/fritzmonitor-$(cat VERSION)-Linux.rpm"Nach der Installation wird der User-Service mit systemd aktiviert:
systemctl --user daemon-reload
systemctl --user enable --now fritzmonitor.serviceDie installierte Version lässt sich prüfen:
fritzmonitor --versionUnterwegs ist eine einzelne Meldung
FRITZ!Box unavailable (untrusted address ...); retrying ... erwartbar.
Wiederholt sie sich nicht und bleibt der Prozess aktiv, arbeitet die
Schutzgrenze wie vorgesehen. Zur Diagnose dienen getent ahosts fritz.box und
journalctl --user -u fritzmonitor.service -n 30 --no-pager. Nach der Rückkehr
ins Heimnetz muss das Journal wieder connected to fritz.box:1012 melden.
Der produktive Native-Build ohne Paketierung bleibt:
./scripts/container-build.shDie geprüften Artefakte liegen danach unter build/container-release/. Eine
vollständige technische Beschreibung steht in
FRITZMONITOR.md.
GitHub Actions baut Debian- und Fedora-Pakete bei manueller Auslösung sowie bei
Pushes auf master und legt sie als Workflow-Artefakte ab. Für einen
veröffentlichten Release wird ein zur Datei VERSION passender Tag gepusht.
Dann hängt der Workflow die Pakete automatisch an einen gleichnamigen
GitHub-Release an:
version=$(cat VERSION)
git tag -a "v$version" -m "FritzMonitor $version"
git push origin "v$version"Die Attribution steht in COPYRIGHT.md. FritzMonitor steht unter der GNU General Public License Version 3.
Der Build verwendet C++20 und CMake. Entwicklungsabhängigkeiten werden nur im Builder-Container installiert; auf dem Produktivsystem werden ausschließlich Runtime-Bibliotheken benötigt. Der Container-Build führt auch die Tests aus. Für den geschützten Credential-Speicher wird auf dem Host zusätzlich die libsecret-Runtime benötigt; die Pakete deklarieren diese Abhängigkeit.
Die Markdown-Werkzeuge laufen ausschließlich in einem eigenen Container. Auf dem
Host werden nur Docker und eine funktionierende Docker-Engine benötigt; Node.js,
npm, Prettier und markdownlint werden nicht installiert. Der Container verwendet
die in tools/markdown/package-lock.json festgeschriebenen Abhängigkeiten und
wird vom Wrapper bei Bedarf neu gebaut.
Alle Projekt-Markdown-Dateien read-only auf korrekte Prettier-Formatierung und markdownlint-Regeln prüfen:
./scripts/markdown-in-container.sh checkPrettier auf README.md, FRITZMONITOR.md, QUICK-SETUP.md, COPYRIGHT.md
und AGENTS.md anwenden und anschließend markdownlint ausführen:
./scripts/markdown-in-container.sh formatDie Regeln stehen in .prettierrc.json und .markdownlint-cli2.yaml. Das
Repository wird im Prüfmodus read-only und im Formatiermodus mit der UID und GID
des aktuellen Benutzers eingebunden, damit keine root-eigenen Dateien entstehen.
Der gleiche Prüfpfad läuft auch in GitHub Actions.
