Blog ·
Un’etichetta che sopravvive al cambio di hostname
Un adesivo su un server è un documento pubblico. Che cosa ci mettiamo, perché il codice QR non contiene alcun URL e come una tabella di barre si verifica.
Di Provibr
Un adesivo su un server è un documento pubblico. Viaggia nel furgone di un corriere, viene letto dal personale di remote hands che lavora per un’azienda con cui non si è mai avuto un contratto, e alla fine la macchina viene dismessa e l’adesivo finisce in un cassone insieme allo chassis. Tutto ciò che vi è stampato sopra è, nell’arco di vita della macchina, pubblicato.
Quella sola osservazione decide quasi tutto di ciò che un’etichetta di datacenter dovrebbe contenere, ed esclude gran parte di quello che la gente ci mette sopra.
Che cosa c’è sopra, e che cosa no
Tre cose: un locator opaco, il numero di revisione di questa stampa, e di nuovo lo stesso locator in forma leggibile da una persona, raggruppato a quattro a quattro perché qualcuno possa digitarlo quando il codice non si lascia leggere.
Non ci sono sopra: il nome del cliente, l’organizzazione, il numero di serie, l’asset tag, il rack in cui la macchina vive adesso, l’hostname, un logo o un token di qualunque genere. Un’etichetta è un’identità, non una scheda.
Il rack è quello su cui si discute, perché scriverlo sull’adesivo è comodo fino alla prima volta che una macchina si sposta. Da lì in poi l’adesivo dichiara con sicurezza una posizione sbagliata, e una posizione sbagliata che sembra autorevole è peggio di nessuna posizione. Un livello più giù, è anche il motivo per cui una posizione nel rack non riceve alcun adesivo: una posizione U non è una cosa ma una coordinata, e smette di significare quello che significava nel momento in cui l’unità di partenza del rack viene corretta.
Perché il codice QR non contiene alcun URL
L’impostazione predefinita per qualunque cosa abbia un codice QR è codificare un collegamento. Noi codifichiamo il locator nudo, per tre motivi in ordine di peso.
Un adesivo sopravvive a un hostname. Un account che in seguito si sposta sul proprio dominio avrebbe altrimenti un migliaio di etichette stampate che puntano a un indirizzo che non lo serve più, e nessuno ristampa un migliaio di etichette.
Un URL dice più di quanto dica un locator. Nomina la piattaforma e, sul dominio del cliente stesso, nomina il cliente. È esattamente la categoria di informazioni di cui l’etichetta dovrebbe essere priva: un URL non è una scorciatoia, è un campo in più, ed è il campo con più spettatori.
E c’è esattamente un percorso di inserimento. La fotocamera di un telefono, uno scanner USB che digita dentro un campo e una persona che copia a mano producono tutti la stessa stringa nella stessa casella. Un URL creerebbe una quarta forma che solo la fotocamera produce, e una quarta forma è una quarta cosa da sbagliare.
Il locator non è un token al portatore
È la parte che rende sicuro tutto il resto. Avere il locator non porta a nulla.
Una scansione è una normale azione autenticata. Scatta il controllo dell’organizzazione, si verifica il permesso di lettura, la query è delimitata all’account, e solo allora il server dice se questo locator esiste qui. Un locator di un altro account produce esattamente la stessa risposta di uno inventato: sconosciuto. Uno revocato ottiene un rifiuto tutto suo, perché è un fatto diverso e chi tiene in mano l’adesivo merita di sapere quale dei due sia.
Non c’è nemmeno un prefisso di fornitore. Uno schema davanti permetterebbe al software di distinguere il nostro adesivo dal codice a barre che il produttore ha già incollato, e direbbe a chiunque trovi l’adesivo a quale piattaforma appartiene. La forma svolge quel compito in silenzio: un locator è di sedici caratteri da un alfabeto noto, e tutto ciò che non ha quella forma viene cercato come asset tag o come numero di serie, cosa di cui il flusso di scansione ha comunque bisogno per il codice a barre del produttore e per chi legge un numero sullo chassis.
Sedici caratteri, e perché sedici
L’alfabeto è il Crockford base32: le cifre e le lettere senza I, L, O e U. I e L si confondono con la cifra uno, O con zero; la U viene tolta dallo standard per evitare parolacce involontarie. Lo seguiamo perché in questo prodotto lo fanno già altri due codici, e due alfabeti sarebbero un bug in attesa del suo momento.
Sedici caratteri di un alfabeto di trentadue caratteri sono ottanta bit. La lunghezza non è stata scelta per l’indovinabilità, perché indovinare non porta a nulla: la ricerca è comunque autorizzata. È stata scelta per le collisioni. Ottanta bit rendono trascurabile un duplicato su milioni di etichette, così l’indice univoco sottostante non costringe mai a un nuovo tentativo che un utente noterebbe. Sedici è anche all’incirca la stringa più lunga che qualcuno copia in quattro gruppi da quattro senza sbagliare.
La normalizzazione gira su tutto ciò che entra: taglio degli spazi esterni, maiuscole, rimozione di spazi e trattini, poi I e L diventano uno e O diventa zero. Chi digita da un adesivo non deve sapere che quelle lettere sono assenti. La U di proposito non ha alcuna corrispondenza: nessuna cifra le somiglia, quindi una U è un vero errore di battitura e va in un rifiuto anziché in una sostituzione silenziosa.
Code 128, scritto a mano, e verificato anziché creduto
Il codice QR usa una libreria che era già nel lockfile per l’autenticazione a due fattori: nessuna dipendenza a runtime e un renderer che produce SVG senza toccare un canvas o un DOM. Riusarla è meglio che scrivere un secondo codificatore QR.
Per Code 128 qui un pacchetto simile non esisteva. I candidati che fanno il lavoro si trascinano dietro uno strato di disegno rivolto a un canvas o a un browser, che è l’unica cosa che un SVG reso dal server non deve avere, e sono di due ordini di grandezza più grandi della cosa in sé. Code 128 è piccolo: una tabella di pattern, un carattere di avvio, una somma di controllo modulo centotré e un carattere di stop. Sono un paio di centinaia di righe e nessuna catena di fornitura per una tabella che non cambia dal 1981.
Il problema di ricopiare a mano una tabella normativa da una specifica è che un errore fallisce in silenzio. L’SVG sembra perfetto, i test passano, e mesi dopo uno scanner in un datacenter legge un carattere diverso. Perciò la tabella è verificata da quattro invarianti indipendenti e da un decodificatore, tutti nel file di test:
- Centosei pattern oltre al carattere di stop, ciascuno di esattamente sei elementi la cui somma è di undici moduli.
- Parità pari nelle barre. Ogni carattere Code 128 ha una somma pari sulle sue tre barre; è la proprietà che uno scanner usa per capire in che verso sta leggendo, e vale per tutti e centosei. Una sola cifra sbagliata rompe questa o la somma qui sopra.
- Larghezze degli elementi fra uno e quattro, e tutti e centosei i pattern distinti.
- Il carattere di stop, l’unico pattern con sette elementi e tredici moduli.
- Un decodificatore nel test che rilegge le larghezze delle barre generate e deve ricostruire la stringa in ingresso, carattere di controllo compreso.
Una tabella che sopravvive a quattro invarianti indipendenti e a un viaggio di andata e ritorno non è «probabilmente giusta», e quella distinzione è l’intera ragione per cui si scrivono.
Siamo rimasti nel subset B anziché passare da uno all’altro in automatico. L’etichetta porta lettere maiuscole e cifre, che il subset B copre in un solo passaggio. Il subset C dimezzerebbe le coppie numeriche, ma un locator non è una sequenza numerica, quindi un passaggio automatico sarebbe un ramo che non scatta mai.
L’impaginazione del foglio è una conseguenza del codice a barre
Ventiquattro etichette per pagina A4, tre in orizzontale e otto in verticale. Quel numero non è una preferenza di progetto, è un’aritmetica che corre nella direzione opposta.
Un Code 128 di sedici caratteri è largo duecentoundici moduli: undici per l’avvio, undici per carattere, undici per il carattere di controllo e tredici per lo stop. Si aggiungano due quiet zone da dieci moduli e servono duecentotrentuno moduli in larghezza. Il limite pratico inferiore per uno scanner ordinario è un modulo da un quarto di millimetro, sotto il quale la lettura passa da affidabile a occasionale. Sono cinquantotto millimetri di codice a barre.
Quattro colonne su un A4 danno un’etichetta larga circa cinquantadue millimetri e un modulo vicino ai due decimi di millimetro: un foglio che sembra più ordinato e che in una corsia fredda non si legge. Tre per otto dà un’etichetta da settanta per trentasette millimetri, una larghezza utile di sessantaquattro e un modulo da 0,277 millimetri. Il conteggio discende dal codice e non il contrario. La pagina è deliberatamente piena, con il margine dentro ciascuna etichetta anziché attorno alla griglia, così che un driver di stampa non debba mai scalare nulla, e la scalatura è l’unica cosa che un codice a barre non tollera.
Quel limite inferiore è una costante nel sorgente anziché un commento, quindi un test misura rispetto a esso la larghezza del modulo dell’SVG reso. Una modifica di impaginazione che stringe troppo il codice a barre è un test rosso invece di una lamentela dalla corsia.
Un’etichetta attiva per oggetto
Le ristampe sono il caso ordinario, quindi l’invariante la porta il database e non il codice. Due indici univoci parziali, uno per le macchine e uno per i rack, che sono le uniche due cose che portano un’etichetta, ammettono al massimo un’etichetta non revocata. Senza di essi una ristampa che fallisce a metà lascia due adesivi validi su una macchina, e nessuno può dire quale sia quello vero. Una seconda coppia tiene la revisione univoca per oggetto, così una ristampa conta in avanti e non si ripete mai. Tre cifre sono il tetto: il numero deve restare leggibile, e mille ristampe di una macchina non sono un problema di etichettatura.
Che cosa metteremmo per iscritto
- Trattare l’adesivo come pubblicato, e decidere che cosa ci va sopra chiedendosi chi lo leggerà fra cinque anni.
- Codificare l’identificatore, non un collegamento. Sopravvive a un cambio di dominio, a un cambio di marchio e a un’acquisizione; un URL non sopravvive a nessuno dei tre.
- Rendere l’identificatore privo di valore per sé, così che un adesivo perso sia un problema di logistica e non di sicurezza.
- Verificare una tabella normativa con invarianti e un viaggio di andata e ritorno, perché quella classe di errori non fallisce mai ad alta voce.
- Ricavare l’impaginazione di stampa dal modulo leggibile più piccolo, e fissare quel limite come una costante che un test può misurare.
Per onestà sulla nostra posizione: il lavoro sul datacenter sta dietro un flag di rollout disattivato per impostazione predefinita, con sopra un’impostazione per organizzazione, quindi questa è la descrizione di un progetto e non un annuncio. Due cose sono esplicitamente non dimostrate. La matrice QR non è stata decodificata da un’implementazione indipendente, perché in questo repository non c’è alcun decodificatore. E nulla è stato stampato su carta e scansionato in una corsia, che è l’unica prova che conta davvero per un codice a barre. Lo stesso ragionamento su che cosa a un componente è consentito sapere compare anche altrove qui: le credenziali restano sull’host, e l’agente si connette sempre e solo verso l’esterno.
Dal lavoro sul datacenter di Provibr. Che cosa impedisce a due persone di assegnarsi la stessa unità rack sta in l’unico limite reale all’occupazione di un rack.