Pemberitahuan muncul dua puluh menit setelah menghubungkan. Penghitung di bawahnya telah berjalan sejak pagi sebelumnya, atau sejak akun terakhir kali mengautentikasi, dan tidak ada apa pun dalam peringatan yang menyebut yang mana. Itulah gejalanya: pengingat yang terikat pada sesuatu selain koneksi di depan Anda.

Perbaikannya bukan peringatan yang lebih baik. Perbaikannya adalah memutuskan jam mana yang dimaksud persyaratan, lalu mengikat timer ke objek yang ada pada jam itu.

Apa yang menyala, dan apa yang dihitungnya

Tiga sumber yang mungkin menghasilkan pesan yang sama. Aturan kalender berjalan pada waktu lokal tetap dan tidak tahu apa-apa tentang terowongan. Penghitung di klien menumpuk selama koneksi apa pun hidup dan bertahan dari sambung ulang. Kebijakan gateway membuat sesi kedaluwarsa di sisi server dan mengirim peringatan lebih dulu.

Hanya dua yang terakhir berbicara tentang sesi, dan keduanya pun tidak sepakat. Penghitung klien mengukur apa yang diamati proses lokal; gateway mengukur apa yang dia autentikasi dan akuntansi. Tidur, perubahan jaringan, atau mulai ulang pengamat dapat memisahkan keduanya hingga berjam-jam, dan itulah sebabnya peringatan dan kedaluwarsa yang dipaksakan saling menjauh.

Tiga jam di balik satu persyaratan

Mulailah dengan menuliskan kalimat yang benar-benar Anda inginkan. Memperingatkan sebelum gateway mengakhiri koneksi ini bukan persyaratan yang sama dengan mengingatkan setelah sehari waktu tersambung. Ini juga bukan hal yang sama dengan melaporkan bahwa sesi ini sudah hidup 23 jam. Setiap versi menyebut peristiwa yang berbeda, dan komponen yang berbeda harus menjawabnya.

Lalu periksa apakah datanya ada. Stempel waktu mulai lokal memberi Anda usia sesi tanpa ketergantungan pada server. Kebijakan gateway memberi Anda sisa masa hidup, tetapi hanya jika gateway mengeksposnya. Laporan penggunaan memberi Anda durasi setelah kejadian, dan itu tidak dapat menggerakkan pemberitahuan di muka.

Ikat timer ke sesi, bukan ke akun

Pilih objeknya lebih dulu. Akun dapat menampung beberapa perangkat dan beberapa sesi bersamaan, jadi pengingat yang dikunci pada nama pengguna tidak dapat mengatakan koneksi mana yang mencapai usia itu. Kunci pada profil ditambah aktivasi itu, dan batalkan pemberitahuan yang tertunda saat aktivasi berakhir.

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

Tabel itu adalah kontrak untuk pemberitahu Anda sendiri, bukan deskripsi API panggilan balik klien mana pun. Apa pun yang didokumentasikan produk terpasang tentang status koneksi adalah sumber yang harus diikat; di mana ia hanya mengekspos peristiwa autentikasi, katakan itu dengan lantang dan terima perilaku yang lebih kasar alih-alih menyimpulkan sesi.

Ujilah dengan ambang yang pendek

Jangan pernah men-debug timer sehari penuh dengan penantian sehari penuh. Tambahkan ambang yang dapat dikonfigurasi, setel ke tiga puluh detik, dan jalankan empat transisi secara berurutan: sambung, tunggu, putus, sambung ulang. Setiap transisi harus menghasilkan tepat satu perubahan status, dan sambung ulang harus menjadwalkan tenggat baru alih-alih mewarisi yang lama.

# 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

Perhatikan stempel waktunya, bukan kata-katanya. Pemberitahuan yang datang membawa waktu mulai sesi sebelumnya mengikat objek yang salah, dan pemberitahuan yang datang dua kali untuk satu tenggat berarti tanda terkirim tidak pernah disimpan.

Tidur, sambung ulang, dan pengiriman yang terlewat

Tidur mematahkan kedua desain naif. Hitung mundur monoton berhenti saat mesin tidur, tenggat berbasis jam dinding terus bergerak, dan timer yang menyala selama tidur dikirim terlambat atau tidak sama sekali. Putuskan perilaku mana yang dibutuhkan persyaratan Anda, lalu tidurkan mesin melewati ambang dan konfirmasikan.

Pengiriman pantas mendapat perhatian yang sama. Jika pemberitahuan tidak dapat ditampilkan, antrekan, dan periksa ulang bahwa sesi target masih ada sebelum akhirnya menampilkannya; jika tidak, pengguna diperingatkan tentang koneksi yang sudah berakhir. Pemutusan paksa dan pembaruan kredensial tetap di luar jalur ini, karena pengingat yang diam-diam mengubah nasib koneksi adalah keputusan kebijakan yang berpakaian pemberitahuan.

Artikel terkait