O aviso apareceu vinte minutos depois de conectar. O contador abaixo vinha rodando desde a manhã anterior, ou desde a última autenticação da conta, e nada no alerta dizia qual. Esse é o sintoma: um lembrete ligado a algo diferente da conexão à sua frente.

A correção não é um alerta melhor. É decidir qual relógio o requisito quer dizer, e depois amarrar o temporizador a um objeto que exista nesse relógio.

O que disparou e o que estava contando

Três fontes plausíveis produzem a mesma mensagem. Uma regra de calendário roda num horário local fixo e não sabe nada de túneis. Um contador no cliente acumula enquanto qualquer conexão está ativa e sobrevive às reconexões. Uma política de gateway expira a sessão no lado do servidor e envia um aviso primeiro.

Só as duas últimas tratam de uma sessão, e nem elas concordam. O contador do cliente mede o que o processo local observou; o gateway mede o que autenticou e contabilizou. Uma suspensão, uma mudança de rede ou um reinício do observador podem separar os dois por horas, e é por isso que o aviso e a expiração forçada se afastam.

Três relógios atrás de um requisito

Comece escrevendo a frase que você realmente quer. Avisar antes de o gateway encerrar esta conexão não é o mesmo requisito que lembrar depois de um dia de tempo conectado. Também não é o mesmo que relatar que esta sessão está no ar há 23 horas. Cada versão nomeia um evento diferente, e um componente diferente precisa responder a ele.

Depois verifique se os dados existem. Um carimbo de tempo local de início dá a idade da sessão sem dependência do servidor. Uma política de gateway dá a vida restante, mas só se o gateway a expuser. Um relatório de uso dá a duração depois do fato, e isso não pode conduzir um aviso antecipado.

Amarre o temporizador à sessão, não à conta

Escolha primeiro o objeto. Uma conta pode conter vários dispositivos e várias sessões simultâneas, então um lembrete atrelado ao nome de usuário não consegue dizer qual conexão atingiu a idade. Ate-o ao perfil mais aquela ativação, e cancele o aviso pendente quando a ativação terminar.

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

Essa tabela é um contrato para o seu próprio notificador, não uma descrição da API de retorno de chamada de qualquer cliente. O que o produto instalado documentar sobre o estado da conexão é a fonte à qual se atar; onde ele expõe apenas eventos de autenticação, diga isso em voz alta e aceite o comportamento mais grosseiro em vez de inferir uma sessão.

Teste com um limite curto

Nunca depure um temporizador de um dia com uma espera de um dia. Adicione um limite configurável, defina-o em trinta segundos e execute quatro transições em ordem: conectar, esperar, desconectar, reconectar. Cada transição deve produzir exatamente uma mudança de estado, e a reconexão deve agendar um novo prazo em vez de herdar o antigo.

# 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

Olhe os carimbos de tempo, não a redação. Um aviso que chega com o horário de início da sessão anterior amarrou o objeto errado, e um aviso que chega duas vezes para um prazo significa que a marca de enviado nunca foi persistida.

Suspensão, reconexão e entrega perdida

A suspensão quebra os dois projetos ingênuos. Uma contagem regressiva monotônica para enquanto a máquina dorme, um prazo de relógio de parede continua avançando, e um temporizador que dispara durante a suspensão é entregue tarde ou não é entregue. Decida qual comportamento o requisito precisa, depois suspenda a máquina além do limite e confirme.

A entrega merece o mesmo cuidado. Se o aviso não puder ser mostrado, coloque-o em fila, e verifique de novo se a sessão alvo ainda existe antes de mostrá-lo por fim; caso contrário, o usuário é avisado de uma conexão que já terminou. A desconexão forçada e a renovação de credenciais ficam fora deste caminho, porque um lembrete que muda em silêncio o destino da conexão é uma decisão de política vestida de aviso.

Artigos relacionados