L'avviso è apparso venti minuti dopo la connessione. Il contatore sotto aveva funzionato dalla mattina precedente, o dall'ultima autenticazione dell'account, e nulla nell'allarme diceva quale. È il sintomo: un promemoria legato a qualcosa di diverso dalla connessione davanti a voi.

La correzione non è un avviso migliore. È decidere quale orologio intende il requisito, poi legare il timer a un oggetto che esiste in quell'orologio.

Che cosa è scattato, e che cosa contava

Tre fonti plausibili producono lo stesso messaggio. Una regola di calendario gira a un'ora locale fissa e non sa nulla dei tunnel. Un contatore nel client si accumula finché una connessione è attiva e sopravvive alle riconnessioni. Una politica del gateway fa scadere la sessione lato server e spinge prima un avviso.

Solo le ultime due riguardano una sessione, e nemmeno loro concordano. Il contatore del client misura ciò che ha osservato il processo locale; il gateway misura ciò che ha autenticato e contabilizzato. Una sospensione, un cambio di rete o un riavvio dell'osservatore possono separarli di ore, ed è per questo che l'avviso e la scadenza imposta divergono.

Tre orologi dietro un solo requisito

Cominciate scrivendo la frase che volete davvero. Avvisare prima che il gateway termini questa connessione non è lo stesso requisito che ricordare dopo un giorno di tempo connesso. Non è nemmeno lo stesso che segnalare che questa sessione è attiva da 23 ore. Ogni versione nomina un evento diverso, e un componente diverso deve rispondere.

Poi verificate se i dati esistono. Un timestamp locale di inizio vi dà l'età della sessione senza dipendere dal server. Una politica del gateway vi dà la vita residua, ma solo se il gateway la espone. Un report di utilizzo vi dà la durata a posteriori, e questo non può guidare un avviso anticipato.

Lega il timer alla sessione, non all'account

Scegliete prima l'oggetto. Un account può contenere più dispositivi e più sessioni simultanee, quindi un promemoria imperniato sul nome utente non può dire quale connessione ha raggiunto l'età. Imperniatelo sul profilo più quell'attivazione, e annullate l'avviso in sospeso quando l'attivazione finisce.

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

Quella tabella è un contratto per il vostro notificatore, non una descrizione dell'API di callback di alcun client. Qualunque cosa documenti il prodotto installato sullo stato della connessione è la fonte a cui legarsi; dove espone solo eventi di autenticazione, ditelo ad alta voce e accettate il comportamento più grossolano invece di dedurre una sessione.

Provalo con una soglia breve

Non fate mai debug di un timer di un giorno con un'attesa di un giorno. Aggiungete una soglia configurabile, impostatala a trenta secondi ed eseguite quattro transizioni in ordine: connetti, attendi, disconnetti, riconnetti. Ogni transizione deve produrre esattamente un cambio di stato, e la riconnessione deve programmare una nuova scadenza invece di ereditare la vecchia.

# 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

Guardate i timestamp, non la formulazione. Un avviso che arriva con l'ora di inizio della sessione precedente ha legato l'oggetto sbagliato, e un avviso che arriva due volte per una scadenza significa che il flag di invio non è mai stato salvato.

Sospensione, riconnessione e consegna mancata

La sospensione rompe entrambi i progetti ingenui. Un conto alla rovescia monotono si ferma mentre la macchina dorme, una scadenza a orologio da parete continua a muoversi, e un timer che scatta durante la sospensione viene consegnato tardi o per niente. Decidete quale comportamento serve al vostro requisito, poi sospendete la macchina oltre la soglia e confermatelo.

La consegna merita la stessa cura. Se l'avviso non può essere mostrato, mettetelo in coda e ricontrollate che la sessione di destinazione esista ancora prima di mostrarlo infine; altrimenti l'utente viene avvisato di una connessione già terminata. La disconnessione forzata e il rinnovo delle credenziali restano fuori da questo percorso, perché un promemoria che cambia in silenzio il destino della connessione è una decisione politica vestita da notifica.

Articoli correlati