O aviso apareceu vinte minutos despois de conectar. O contador de debaixo levaba funcionando desde a mañá anterior, ou desde a última autenticación da conta, e nada na alerta dicía cal. Ese é o síntoma: un recordatorio ligado a algo distinto da conexión que ten diante.

A solución non é unha alerta mellor. É decidir que reloxo quere dicir o requisito e despois ligar o temporizador a un obxecto que exista nese reloxo.

Que se disparou e que contaba

Tres fontes plausibles producen a mesma mensaxe. Unha regra de calendario execútase a unha hora local fixa e non sabe nada de túneles. Un contador no cliente acumúlase mentres calquera conexión está activa e sobrevive ás reconexións. Unha política de pasarela caduca a sesión no lado do servidor e envía primeiro un aviso.

Só as dúas últimas tratan dunha sesión, e nin sequera esas coinciden. O contador do cliente mide o que observou o proceso local; a pasarela mide o que autenticou e contabilizou. Unha suspensión, un cambio de rede ou un reinicio do observador poden separalos por horas, e por iso o aviso e a caducidade forzada se afastan.

Tres reloxos detrás dun requisito

Empece escribindo a frase que realmente quere. Avisar antes de que a pasarela remate esta conexión non é o mesmo requisito que recordar tras un día de tempo conectado. Tampouco é o mesmo que informar de que esta sesión leva 23 horas en pé. Cada versión nomea un suceso distinto, e un compoñente distinto ten que responder.

Despois comprobe se os datos existen. Unha marca de tempo local de inicio dálle a idade da sesión sen depender do servidor. Unha política de pasarela dálle a vida restante, pero só se a pasarela a expón. Un informe de uso dálle a duración a posteriori, e iso non pode impulsar un aviso previo.

Ligue o temporizador á sesión, non á conta

Escolla primeiro o obxecto. Unha conta pode ter varios dispositivos e varias sesións simultáneas, así que un recordatorio ligado ao nome de usuario non pode dicir que conexión acadou a idade. Lígueo ao perfil máis esa activación, e cancele o aviso pendente cando a activación remate.

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

Esa táboa é un contrato para o seu propio notificador, non unha descrición da API de retorno de chamada de ningún cliente. O que o produto instalado documente sobre o estado da conexión é a fonte á que se ligar; onde só expoña eventos de autenticación, dígao en voz alta e acepte o comportamento máis groso en lugar de inferir unha sesión.

Próbeo cun limiar curto

Nunca depure un temporizador dun día cunha espera dun día. Engada un limiar configurable, póñao en trinta segundos e execute catro transicións en orde: conectar, esperar, desconectar, reconectar. Cada transición debe producir exactamente un cambio de estado, e a reconexión debe programar un prazo novo en vez de herdar o vello.

# 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

Mire as marcas de tempo, non a redacción. Un aviso que chega coa hora de inicio da sesión anterior ligou o obxecto equivocado, e un aviso que chega dúas veces para un prazo significa que a marca de envío nunca se gardou.

Suspensión, reconexión e entrega perdida

A suspensión rompe os dous deseños inxenuos. Unha conta atrás monótona detense mentres a máquina dorme, un prazo de reloxo de parede segue avanzando, e un temporizador que se dispara durante a suspensión entrégase tarde ou non se entrega. Decida que comportamento necesita o seu requisito, despois suspenda a máquina máis alá do limiar e confírmelo.

A entrega merece o mesmo coidado. Se o aviso non se pode mostrar, póñao en cola e volva comprobar que a sesión obxectivo segue existindo antes de mostralo por fin; se non, avísase o usuario dunha conexión que xa rematou. A desconexión forzada e a renovación de credenciais quedan fóra deste camiño, porque un recordatorio que cambia en silencio o destino da conexión é unha decisión de política vestida de aviso.

Artigos relacionados