Hvorfor en 23-timers VPN-påmindelse udløses for den forkerte session
En 23-timers meddelelse bør følge én session, ikke kontoen. Fastgør timeren til den forbindelse, der startede, og behandl dvale og genopkobling som separate tilfælde.
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 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 |
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.