Non so con cosa paragonare il provisioning. Forse a un gatto? Si può fare anche senza, ma con lui è un po' meglio. Soprattutto se funziona ))
Presentazione del problema:
- Voglio configurare i telefoni SIP in modo rapido, semplice e sicuro. Durante l'installazione del telefono e ancora di più durante la sua riconfigurazione.
- Molti fornitori hanno i propri formati di configurazione, i propri strumenti per generare configurazioni, i propri metodi di protezione delle configurazioni. E non ho voglia di occuparmi di ognuno di essi.
- Molte soluzioni di provisioning, a) sono orientate a un singolo fornitore o a un unico sistema telefonico, b) vengono implementate in modo piuttosto ingombrante, con un sacco di script, parametri, br-r...
A proposito del punto 3, faccio un commento sul fatto che ci sono ottimi sistemi di provisioning , , , dove sono disponibili modelli per telefoni di vari fornitori. Ci sono soluzioni commerciali dove puoi anche configurare nel modulo di provisioning i telefoni di diversi produttori, ad esempio, il sistema Yeastar.
Su Habr ci sono anche moltissime ricette su come configurare i dispositivi di vari fornitori: , . Ma come si dice, tutti i sistemi hanno un difetto fatale. Quindi costruiremo la nostra bicicletta.
il nostro formato
Come si dice in xkcd, se non vuoi occuparti di 14 formati — . Pertanto utilizziamo impostazioni comuni per qualsiasi telefono e creeremo il nostro formato di configurazione JSON.
Circa così:
{
"key": "sdgjdeu9443908",
"token": "590sfdsf8u984",
"model": "gxp1620",
"vendor": "grandstream",
"mac": "001565113af8",
"timezone_offset": "GMT+03",
"ntp_server": "pool.ntp.org",
"status": true,
"accounts": [
{
"name": "Mobilon",
"line": 1,
"sip_register": "sip.mobilonsip.ru",
"sip_name": "sip102",
"sip_user": "sip102",
"sip_password": "4321",
"sip_auth": "sip102"
}
]
}Dunque, in ogni telefono è necessario configurare l'ora locale e le linee SIP. Qui è tutto semplice. Puoi anche vedere altri esempi .
il tuo server di provisioning
Nei manuali del produttore di solito c'è un punto in cui si dice: prendi un csv, scrivi login-password-indirizzo MAC, usa il nostro script proprietario per generare i file, mettili sotto il server web Apache e andrà tutto bene.
Nel punto successivo del manuale si parla spesso di come sia possibile anche criptare il file di configurazione generato.
Ma questa è tutta classica. L'approccio moderno con smoothie e Twitter dice che bisogna creare un server web pronto, che non sarà potente come Apache, ma farà solo una piccola cosa. Formare e fornire configurazioni tramite un link.
Qui ci fermiamo e ricordiamo che quasi tutti i telefoni SIP ora possono ottenere configurazioni tramite http/https, quindi non consideriamo altre implementazioni (ftp, tftp, ftps). Inoltre, ogni telefono conosce il proprio indirizzo MAC. Pertanto, faremo due link: uno personale - per chiave del dispositivo, il secondo generale, che funziona con la combinazione token pubblico e indirizzo MAC.
Inoltre, non mi fermerò sul zero-config, cioè la configurazione del telefono "da zero", ossia lo colleghi alla rete ed esso funziona immediatamente. No, nel mio scenario, colleghi alla rete, fai una configurazione preliminare (configuri per ricevere la configurazione dal server di provisioning), e poi bevi un pinacolada e riconfiguri il telefono come necessario tramite il provisioning. Distribuire l'Option 66 è compito del server DHCP.
A proposito, sono davvero stanco di dire "provisioning", quindi la parola è stata abbreviata a "provision", non prendetevela, per favore.
E ancora: il nostro server di provisioning non ha UI, cioè interfaccia utente. Forse per ora, ma non sono sicuro, dato che non mi è necessario. Tuttavia, esiste un'API per salvare/rimuovere impostazioni, ottenere l'elenco dei fornitori supportati, modelli, tutto descritto secondo le specifiche Swagger.
Perché API e non UI? Poiché ho già il mio sistema telefonico, ho una fonte di credenziali, dove posso semplicemente prendere questi dati, comporre il json necessario e pubblicarlo sul server di provisioning. E il server di provisioning, in base alle regole indicate nel file json, fornirà al dispositivo corretto la sua configurazione o non la fornirà, se il dispositivo non è quello giusto, o non soddisfa i criteri indicati anche in questo json.

Ecco com'è nato questo microservizio di provisioning. Si chiama , il codice sorgente è disponibile su GitHub, c'è anche un , esempio di utilizzo di Docker. .
Caratteristiche chiave:
in ogni caso accesso limitato alla configurazione nel tempo, di default 10 minuti. Se desideri rendere di nuovo disponibile la configurazione, ripubblica la configurazione.
un formato per tutti i fornitori, tutta la personalizzazione è stata eliminata in sonata, invii un json standardizzato e configuri qualsiasi attrezzatura disponibile.
Tutte le configurazioni rilasciate ai dispositivi vengono registrate, tutti i punti problematici possono essere visualizzati nel registro e gli errori possono essere visti.
È possibile utilizzare un unico link comune con token; ogni telefono riceve la propria configurazione specificando l'indirizzo MAC. Oppure un link personale tramite la chiave.
L'API per la gestione (management) e il rilascio delle configurazioni ai telefoni (provisioning) è separata per porte.
Test. Per me era molto importante fissare il formato della configurazione rilasciata e coprire tutte le normali situazioni di rilascio della configurazione con test. Affinché funzioni tutto chiaramente.
Contro:
Per ora non viene utilizzata alcuna crittografia nel contesto di sonata. Cioè, naturalmente, puoi iniziare a usare https, posizionando ad esempio nginx davanti a sonata. Ma i metodi proprietari non sono ancora stati attivati. Perché? Il progetto è ancora giovane, ha appena rilasciato la sua prima centinaia di dispositivi. E, naturalmente, raccolgo idee e feedback. Inoltre, per rendere tutto sicuro, in modo che le configurazioni non possano essere sniffate nella rete, probabilmente vale la pena preoccuparsi di chiavi di crittografia, tls e simili, ma questo sarà un passo successivo.
Mancanza di interfaccia utente. Questo potrebbe essere un difetto significativo per l'utente finale, ma per l'amministratore di sistema è più importante una utility da console piuttosto che un'applicazione completa. Creare un'utility da console era nei piani, ma non sono sicuro se sia necessaria?
Qual è il risultato finale?
Un piccolo e semplice server web per il provisioning di diversi modelli di telefoni con API per la gestione.
Ancora una volta, come dovrebbe funzionare?
- Installiamo sonata.
- Formiamo la configurazione json e la pubblichiamo in sonata.
- Poi riceviamo da sonata il link per il provisioning.
- Poi indichiamo questo link nell'apparecchio telefonico.
- L'apparecchio scarica la configurazione.
Nell'uso successivo solo due passaggi:
- Formiamo la configurazione json e la pubblichiamo in sonata.
- L'apparecchio scarica la configurazione.
Quali telefoni vengono provisionati?
Fornitori Grandstream, Fanvil, Yealink. Le configurazioni all'interno del fornitore sono più o meno identiche, ma possono differire a seconda del firmware — potrebbe essere necessario testare ulteriormente.
Quali regole possono essere impostate?
Per tempo. Puoi specificare un orario fino al quale la configurazione sarà disponibile.
Per indirizzo MAC. Quando si rilascia la configurazione tramite link personale, verrà anche controllato l'indirizzo MAC del dispositivo.
Per IP. In base all'indirizzo IP da cui è stata effettuata la richiesta.
Come interagire con sonata?
Attraverso l'API, effettuando richieste http. L'API sarà disponibile nella vostra installazione. Poiché l'API supporta la specifica swagger, è possibile utilizzare per le richieste di test all'API.
Ok, ottimo. È una cosa interessante, come posso provare?
La cosa più semplice è eseguire un'immagine docker basata sul repository . Nel repository è presente una guida all'installazione.
А если знаю node.js?
Se hai esperienza nell'utilizzo di JavaScript, ti orienterai rapidamente su come funziona tutto qui.
Ci sarà uno sviluppo di sonata?
Ho raggiunto parzialmente i miei obiettivi. Lo sviluppo ulteriore è una questione dei miei compiti in merito all'automazione della configurazione dei telefoni. C'è anche la possibilità di espandere le configurazioni per impostare i tasti del telefono, aggiungere indirizzi per le rubriche, forse qualcos'altro, scrivete nei commenti.
Curriculum e ringraziamenti
Sarò felice di ricevere proposte/obiezioni/commenti e domande costruttive, poiché potrebbe esserci qualcosa di cui ho scritto in modo poco chiaro.
Esprimo anche la mia gratitudine a tutti i colleghi che hanno aiutato, consigliato, testato, fornito/regalato telefoni per i test. Davvero, molte persone con cui ho interagito, più o meno, sono coinvolte nel progetto, durante ‘e, nelle chat e nelle email. Grazie per le idee e i pensieri.
Fonte: habr.com
