De melding verscheen twintig minuten na het verbinden. De teller eronder liep sinds de vorige ochtend, of sinds het account zich voor het laatst authenticeerde, en niets in de waarschuwing zei welke. Dat is het symptoom: een herinnering die aan iets anders vastzit dan aan de verbinding voor je.

De oplossing is geen betere waarschuwing. Het is beslissen welke klok de eis bedoelt, en dan de timer vastmaken aan een object dat in die klok bestaat.

Wat er afging, en wat het telde

Drie plausibele bronnen produceren hetzelfde bericht. Een kalenderregel loopt op een vaste lokale tijd en weet niets van tunnels. Een teller in de client loopt op zolang een verbinding actief is en overleeft herverbindingen. Een gatewaybeleid laat de sessie aan de serverkant verlopen en stuurt eerst een waarschuwing.

Alleen de laatste twee gaan over een sessie, en zelfs die zijn het niet eens. De clientteller meet wat het lokale proces zag; de gateway meet wat zij authenticeerde en verrekende. Slaap, een netwerkwijziging of een herstart van de waarnemer kunnen de twee uren uit elkaar trekken, en daarom lopen de waarschuwing en de afgedwongen afloop uiteen.

Drie klokken achter één eis

Begin met het opschrijven van de zin die je echt wilt. Waarschuwen voordat de gateway deze verbinding beëindigt is niet dezelfde eis als herinneren na een dag verbonden tijd. Het is ook niet hetzelfde als melden dat deze sessie al 23 uur loopt. Elke versie noemt een andere gebeurtenis, en een andere component moet daarop antwoorden.

Controleer dan of de gegevens bestaan. Een lokaal starttijdstempel geeft je de leeftijd van de sessie zonder afhankelijkheid van de server. Een gatewaybeleid geeft je de resterende levensduur, maar alleen als de gateway die blootlegt. Een gebruiksrapport geeft je de duur achteraf, en dat kan geen voorafmelding aansturen.

Koppel de timer aan de sessie, niet aan het account

Kies eerst het object. Een account kan meerdere apparaten en meerdere gelijktijdige sessies bevatten, dus een herinnering die op de gebruikersnaam is gesleuteld, kan niet zeggen welke verbinding de leeftijd bereikte. Sleutel hem op het profiel plus die activering, en annuleer de wachtende melding wanneer de activering eindigt.

Evidence you can readWhat it establishesWhere it misleads
Connection state changes to activeA session started nowDoes not carry the gateway's own session identifier
Duration reported at disconnectTotal service time for that sessionArrives too late for any advance notice
Interim usage updateTime accounted up to that updateStaleness equals the update interval
Local timestamp taken at activationAge of your observationResets whenever the observer restarts

Die tabel is een contract voor je eigen notifier, geen beschrijving van de callback-API van welke client dan ook. Wat het geïnstalleerde product ook documenteert over de verbindingsstatus, dat is de bron waaraan je moet vastmaken; waar het alleen authenticatiegebeurtenissen blootlegt, zeg dat hardop en accepteer het grovere gedrag in plaats van een sessie af te leiden.

Test het met een korte drempel

Debug nooit een etmaal durende timer met een etmaal wachten. Voeg een configureerbare drempel toe, zet die op dertig seconden en voer vier overgangen in volgorde uit: verbinden, wachten, verbreken, opnieuw verbinden. Elke overgang moet precies één toestandsverandering opleveren, en de herverbinding moet een nieuwe deadline plannen in plaats van de oude te erven.

# current connection state and profile identity
nmcli -f GENERAL.STATE,GENERAL.CONNECTION connection show work

# the notifier unit you wrote: does it restart the deadline or resume it?
journalctl --user -u vpn-timer.service --since "-5 min" -o cat

Let op de tijdstempels, niet op de formulering. Een melding die aankomt met de starttijd van de vorige sessie heeft het verkeerde object vastgemaakt, en een melding die twee keer aankomt voor één deadline betekent dat de verzonden-vlag nooit is opgeslagen.

Slaap, herverbinden en gemiste bezorging

Slaap breekt beide naïeve ontwerpen. Een monotone aftelling stopt terwijl de machine slaapt, een deadline op de wandklok blijft doorlopen, en een timer die tijdens de slaap afgaat, wordt te laat of helemaal niet bezorgd. Beslis welk gedrag je eis nodig heeft, breng de machine dan over de drempel in slaap en bevestig het.

Bezorging verdient dezelfde zorg. Als de melding niet kan worden getoond, zet hem dan in de wachtrij, en controleer opnieuw of de doelsessie nog bestaat voordat je hem eindelijk toont; anders wordt de gebruiker gewaarschuwd voor een verbinding die al is beëindigd. Gedwongen verbreking en vernieuwing van inloggegevens blijven buiten dit pad, want een herinnering die stilletjes het lot van de verbinding verandert, is een beleidsbeslissing in de kleren van een melding.

Gerelateerde artikelen