Meddelelsen dukkede op tyve minutter efter forbindelsen. Tælleren nedenunder havde kørt siden den foregående morgen, eller siden kontoen sidst autentificerede, og intet i advarslen sagde hvilken. Det er symptomet: en påmindelse bundet til noget andet end den forbindelse, der ligger foran dig.

Rettelsen er ikke en bedre advarsel. Det er at afgøre, hvilket ur kravet mener, og derefter binde timeren til et objekt, der findes i det ur.

Hvad blev udløst, og hvad talte det

Tre sandsynlige kilder giver den samme meddelelse. En kalenderregel kører på et fast lokalt tidspunkt og ved intet om tunneler. En tæller i klienten akkumulerer, mens en forbindelse er oppe, og overlever genopkoblinger. En gateway-politik udløber sessionen på serversiden og sender først en advarsel.

Kun de sidste to handler om en session, og selv de er uenige. Klienttælleren måler, hvad den lokale proces observerede; gatewayen måler, hvad den autentificerede og afregnede. Dvale, netværksskift eller genstart af observatøren kan skille de to med timer, og derfor driver advarslen og den håndhævede udløbsdato fra hinanden.

Tre ure bag ét krav

Begynd med at skrive den sætning, du faktisk vil have. At advare, før gatewayen afslutter denne forbindelse, er ikke det samme krav som at minde om det efter et døgns forbundet tid. Det er heller ikke det samme som at rapportere, at denne session har været oppe i 23 timer. Hver version navngiver en anden hændelse, og en anden komponent skal svare på den.

Kontroller derefter, om dataene findes. Et lokalt starttidsstempel giver dig sessionens alder uden afhængighed af serveren. En gateway-politik giver dig den resterende levetid, men kun hvis gatewayen udstiller den. En brugsrapport giver dig varigheden bagefter, og det kan ikke drive en forhåndsmeddelelse.

Fastgør timeren til sessionen, ikke kontoen

Vælg objektet først. En konto kan rumme flere enheder og flere samtidige sessioner, så en påmindelse bundet til brugernavnet kan ikke sige, hvilken forbindelse der nåede alderen. Bind den til profilen plus den aktivering, og annullér den ventende meddelelse, når aktiveringen slutter.

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

Den tabel er en kontrakt for din egen notifier, ikke en beskrivelse af nogen klients callback-API. Hvad det installerede produkt dokumenterer om forbindelsestilstand, er den kilde, du skal binde til; hvor det kun udstiller autentificeringshændelser, sig det højt og accepter den grovere adfærd i stedet for at udlede en session.

Test det med en kort tærskel

Fejlret aldrig en heldagstimer med en heldags ventetid. Tilføj en konfigurerbar tærskel, sæt den til tredive sekunder, og kør fire overgange i rækkefølge: forbind, vent, afbryd, genopkobl. Hver overgang bør give præcis én tilstandsændring, og genopkoblingen bør planlægge en ny frist i stedet for at arve den gamle.

# 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

Se på tidsstemplerne frem for ordlyden. En meddelelse, der ankommer med den forrige sessions starttid, bandt det forkerte objekt, og en meddelelse, der ankommer to gange for én frist, betyder, at sendt-flaget aldrig blev gemt.

Dvale, genopkobling og mistet levering

Dvale bryder begge naive designs. En monoton nedtælling stopper, mens maskinen sover, en deadline efter vægur fortsætter med at flytte sig, og en timer, der udløses under dvale, leveres sent eller slet ikke. Beslut, hvilken adfærd dit krav har brug for, og sæt derefter maskinen i dvale over tærsklen og bekræft det.

Levering fortjener samme omhu. Hvis meddelelsen ikke kan vises, sæt den i kø, og kontrollér igen, at målsessionen stadig findes, før du til sidst viser den; ellers advares brugeren om en forbindelse, der allerede er slut. Tvungen afbrydelse og fornyelse af legitimationsoplysninger holder sig uden for denne vej, fordi en påmindelse, der stille ændrer forbindelsens skæbne, er en politikbeslutning klædt ud som en meddelelse.

Relaterede artikler