Por que un recordatorio de VPN de 23 horas se dispara para a sesión equivocada
Un aviso de 23 horas debe seguir unha sesión, non a conta. Ancore o temporizador á conexión que comezou e trate a suspensión e a reconexión como casos separados.
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 read | What it establishes | Where it misleads |
|---|---|---|
| Connection state changes to active | A session started now | Does not carry the gateway's own session identifier |
| Duration reported at disconnect | Total service time for that session | Arrives too late for any advance notice |
| Interim usage update | Time accounted up to that update | Staleness equals the update interval |
| Local timestamp taken at activation | Age of your observation | Resets 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.