Lo stato quattro genera una notifica su un’API e significa altro su un’altra, e il codice non mostra alcuna differenza. Ogni valore di stato in NetworkManager appartiene a un’enumerazione con nome, e le enumerazioni non concordano su cosa significhi un dato numero. Copiare un intero da uno snippet funzionante in un altro callback non è quindi un trasferimento di comportamento; è una coincidenza in attesa di rompersi. Trova prima il tipo, e il numero diventa leggibile.

Un numero senza tipo è solo una voce

Qui contano due enumerazioni. Una descrive una connessione attiva in generale: sconosciuto, attivazione, attivo, disattivazione, disattivato. L’altra descrive specificamente una connessione VPN, e ha più fermate lungo il percorso, tra cui la preparazione, la configurazione della connessione, la configurazione IP e una richiesta di autenticazione prima che qualcosa venga attivato. La loro numerazione parte da zero in entrambi i casi e poi diverge, così il valore che significa disattivato nell’enumerazione generale finisce da qualche parte a metà della sequenza VPN. Nessuna delle due intestazioni è sbagliata; rispondono a domande diverse.

Usa la costante simbolica dall’intestazione o dal binding installato invece di un letterale. Il nome sopravvive a una rinumerazione; l’intero no.

Osserva una connessione, non la macchina

Parti dall’UUID del profilo che ti interessa e dall’oggetto della connessione attiva creato da quell’attivazione. Lo stato di un dispositivo, o lo stato di un altro tunnel, non è un sostituto, anche quando entrambi cambiano nello stesso momento. Mantieni l’identità dell’oggetto insieme all’osservazione, così un rapporto successivo può dire quale profilo l’ha prodotto. La macchina ha molti stati; la notifica riguarda uno di essi.

Poi decidi cosa deve significare la notifica. Una connessione che non ha mai raggiunto l’attivazione è un errore di configurazione, e una sessione che era attiva e poi è sparita è una perdita. Queste meritano parole diverse.

Di’ quale transizione stai segnalando

Memorizza lo stato precedente e confrontalo con quello nuovo, invece di testare il nuovo valore isolatamente. Una transizione verso uno stato fallito e una transizione fuori da uno stato attivato sono eventi diversi anche quando entrambe finiscono senza nulla di connesso. Registra accanto la stringa del motivo, perché spesso è l’unica parte su cui un utente può agire.

Una disconnessione intenzionale non è un guasto. Se la notifica non riesce a distinguerla, insegnerà alle persone a ignorarla.

Mantieni vivo l’osservatore

Il polling ripetuto non deve sollevare un altro avviso per uno stato che non è cambiato. Quella singola regola elimina la maggior parte del rumore che questi notificatori generano.

Gestisci anche il caso in cui il gestore si riavvia o l’oggetto osservato viene sostituito. Un osservatore legato a un’identità obsoleta tace esattamente nel momento in cui accade qualcosa di interessante, e il silenzio sembra salute. Riscopri l’oggetto attuale dopo un cambiamento nella presenza del gestore, e registra quando è avvenuta la riscoperta. Altrimenti il registro mostra un tunnel che ha semplicemente smesso di segnalare.

Consegna la notifica dove si trova l’utente

Un callback di sistema privilegiato non eredita il servizio di notifica di una sessione desktop. Un messaggio inviato da un gestore a livello root può svanire senza errore, il che produce un notificatore che funziona quando lo si prova a mano e mai in pratica. Consegna nella sessione che possiede il desktop, o lascia che il client del desktop stesso sollevi la notifica.

Preferisci la notifica esistente del client se copre già il caso, perché due notificatori per un evento sono un problema di supporto e non una ridondanza. Mantieni l’ora dell’evento, il profilo e il motivo nel registro di supporto, e lascia fuori password e profili completi. Ricorda cos’è la notifica: un rapporto su uno stato osservato, non un meccanismo di applicazione, perché bloccare il traffico mentre il tunnel è assente è una politica separata con la propria implementazione.

Articoli correlati