Provisioning Telefoni Grandstream
In Asterisk, nelle versioni recenti (questa procedura è basata su Asterisk versione 16), è possibile fare il provisioning dei telefoni (limitato) direttamente basandosi sulle configurazioni di Asterisk e un template. Questo permette di ridurre il tempo di deployment e di avere di fatto un solo file di configurazione che descrive tutto quello che c'e` da sapere sulla configurazione degli interni e anche dei telefoni. Il setup è un pochino complicato, ma il risultato è valido, e soprattutto se avete molti telefoni è comodo.
Per ottenere il risultato voluto occorre:
- Gestire gli interni in Asterisk nel file users.conf, unico posto dove è possibile inserire dati per il provisioning, oltre che per la gestione delle impostazioni sip, iax (volendo) e della segreteria.
- Costruire un template di provisioning per i telefoni Grandstream, basandosi sulle informazioni reperibili sul loro sito (un esempio lo metto anche qui)
- Opzionalmente, poter inserire valori personalizzati nel server DHCP per permettere il provisioning direttamente, senza dover toccare nulla della config di un telefono nuovo. Non potendo, occorrerà indicare ai nuovi telefoni l' URL per il provisioning a mano, e poi faranno tutto da soli.
Nota: in Asterisk deve essere caricato il modulo res_phoneprov, che in Debian / Devuan c'è di default, quindi non occorre fare nulla.
Altra nota: io uso questa roba in rete locale. Su internet occorre pensare bene ai rischi di sicurezza. Uno che riesca a scaricare una config di un telefono tramite gli URL di provisioning ha accesso alle password...
Configurazione di Asterisk
In Asterisk occorre modificare divesi files:
/etc/asterisk/http.conf
; ; Asterisk Builtin mini-HTTP server ; ; Questa configurazione è monca, ci sono un sacco di funzioni ; non usate. Vedi la versione originale del file per capirle. ; [general] ; servername=Asterisk ; enabled=yes bindaddr=0.0.0.0 bindport=8080 ; si puo` anche usare la 80, forse si fa prima. ; se setto a "yes", asterirsk serve i filea dentro a /usr/share/asterisk/static-http/ ; con un url del tipo http://asterisk:8080/static/<nomefile> ; per esempio puo` servire per i firwmare. enablestatic=yes
/etc/asterisk/phoneprov.conf
[general] ; il profilo di default se non e` specificato diversamente in users.conf default_profile=gxp2130 ; profilo per telefono GXP2130 ; probabilmente funziona con molti altri telefoni, ma puo` avere senso farne diverse ; se si hanno telefoni molto diversi fra loro. ; il file "gxp2130.xml" e` il file di partenza che viene interpretato per sostituire le variabili. ; per fare funzionare tutto, va messo dentro a /usr/share/asterisk/phoneprov/ ; La directory va creata, se manca. il path e` quello di "Data Directory" che si puo` verificare ; con il comando "core show settings" ; a questo punto, andando all' URL http://asterisk:8080/phoneprov/cfg112233445566.xml ; si potra` vedere il file compilato con la sostituzione delle variabili. ; (ovviamente se e` configurato in users.conf) [gxp2130] mime_type => text/xml cfg${TOLOWER(${MAC})}.xml => gxp2130.xml ; firmware gxp2130 ; lo devo dichiarare come file statico altrimenti non lo vede ; lo devo mettere dentro a /usr/share/asterisk/phoneprov/ mime_type => application/octet-stream static_file => gxp2130fw.bin
/etc/asterisk/sip_notify.conf
; Grandstream reboot ; permette di forzare il reboot dei telefoni grandstream ; con il comando "sip notify grandstream-reboot <interno>" [grandstream-reboot] Event=>check-sync
/etc/asterisk/users.conf
[general] ; qui stanno i default validi per tutti fullname = New User userbase = 100 ; da dove iniziamo ad allocare gli interni hasvoicemail = no ; non ha la segreteria di default (se metto yes qui, poi ce l'hanno tutti e non posso fare override) ; vmsecret = 5656 ; password della segreteria hassip = yes hasiax = no hash323 = no hasmanager = no ; dare accesso a AMI o no? ;managerread = system,call,log,verbose,command,agent,user,config ;managerwrite = system,call,log,verbose,command,agent,user,config ; Il sistema di provisioning dei telefoni per funzionare richiede ; necessariamente questi parametri (per singolo interno, non generici!) ; Qui li metto solo per elencarli. Vanno messi negli interni. ; username = <numero interno> ; macaddress = 112233445566 ; autoprov = yes ; profile = gxp2130 ; vmexten = numero da chiamare per ascoltare la segreteria ; ; Opzioni generiche ; callwaiting = yes threewaycalling = yes callwaitingcallerid = yes transfer = yes canpark = yes cancallforward = yes callreturn = yes callgroup = 1 pickupgroup = 1 ; un interno di prova con la mailbox personale e senza provisioning del telefono [104] fullname = prova users username = 104 email = <indirizzo email ai quali ricevere i messaggi di segreteria> secret = <password del telefono> hasvoicemail = yes vmsecret = 1234 vmexten = *8010 hassip = yes context = interni subscribecontext = interni canreinvite = no host = dynamic ; necessario per consentire la registrazione da ip non fisso nat = auto_force_rport,auto_comedia ; per i telefoni dietro un nat qualify = yes ; un interno di prova con la mailbox generale (numero 1) e con un telefono con MAC address 112233445566 [105] fullname = prova secondo username = 105 secret = <password del telefono> hasvoicemail = no ; quindi non genera una casella email 105 mailbox = 1 ; ma usa la casella hardcoded nomero 1 vmexten = *8010 ; e quando premi il tasto della busta, chiama questo numero. hassip = yes context = interni_uscenti subscribecontext = interni canreinvite = no macaddress = 112233445566 autoprov = yes profile = gxp2130
Configurazione di un template per il telefono
Occorre ora creare una directory "phoneprov" dentro a /usr/share/asterisk (ovviamente Asterisk deve poter leggerne il contenuto) e poi ci metteremo dentro i files di template. Nel nostro esempio, il template è uno solo, e si chiama "gxp2130.xml".
Questo è un esempio di template nel file /usr/share/asterisk/phoneprov/gxp2130.xml
<?xml version="1.0" encoding="UTF-8" ?> <!--####################--> <!-- config per gxp2130 --> <!--####################--> <gs_provision version="1"> <config version="1"> <!--Config account e user (account 1)--> <!--# Account Active. 0 - No, 1 - Yes. Default is 1--> <P271>1</P271> <!--# Account Name--> <P270>${USERNAME}</P270> <!--# SIP Server--> <P47>${SERVER}:${SERVER_PORT}</P47> <!--# SIP outbound proxy--> <P48>${SERVER}:${SERVER_PORT}</P48> <!--# SIP User ID--> <P35>${USERNAME}</P35> <!--# SIP Authenticate ID--> <P36>${USERNAME}</P36> <!--# SIP Authenticate Password--> <P34>${SECRET}</P34> <!--# Name (Display Name, e.g., John Doe)--> <P3>${DISPLAY_NAME}</P3> <!--# voicemail extension (per il tasto "busta")--> <P33>${VOICEMAIL_EXTEN}</P33> <!--Firmware server--> <P192>${SERVER}:8080/phoneprov</P192> <P6767>1</P6767> <!--config server--> <P237>${SERVER}:8080/phoneprov</P237> <!-- Features varie --> <!-- Dial plan con aggiunta di **x+ --> <P290>{x+|*x+|*xx*x+|**x+}</P290> <!--Unregister On Reboot. 0 - No, 1 - Yes. Default is 0--> <P81>1</P81> <!--Enable Call Features. 0 - No, 1 - Yes. Default is 1--> <P191>1</P191> <!--Call Log. 0 - Log All, 1 - Log Incoming/Outgoing only, 2 - Disable Call Log.--> <P442>0</P442> <!--Allow Auto Answer by Call-Info. 0 - No, 1 - Yes. Default is 0--> <P298>1</P298> <!--Play warning tone for Auto Answer Intercom. 0 - No, 1 - Yes. Default is 0 --> <P26072>1</P26072> <!--Use # as Dial Key. 0 - No, 1 - Yes. Default is 1--> <P72>0</P72> <!--Preferred vocoder (in ordine dal primo in avanti)--> <!--metto PCMA prima e PCMU dopo, il default e` il contrario--> <P57>8</P57> <P58>0</P58> <!--Auto-Attended Transfer. 0 - No, 1 -Yes. Default is 0--> <P1376>1</P1376> <!-- Display, lingua, data/ora --> <!--# Enable weather update. 0 - No, 1 - Yes. Default is 1--> <P1402>0</P1402> <!--# Display Language. Default is auto--> <P1362>it</P1362> <!--# Screensaver. 0 - No, 1 - Yes. Default is 1--> <P2918>0</P2918> <!--# Backlight Brightness.--> <!--# Active. Default is 100.--> <P334>100</P334> <!--# Idle. Default is 60.--> <P335>10</P335> <!--# Disable Missed Call Backlight. 0 - No, 1 - Yes. Default is 0--> <P351>1</P351> <!--# NTP Server--> <P30>${SERVER}</P30> <!--# Time zone--> <!--# P64 = CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00 - GMT+01:00 (Paris, Vienna, Warsaw, Roma, Madrid, Prague, Berlin, Budapest, Amsterdam, Belgium)--> <P64>CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00</P64> <!--# Time Display Format. 0 - 12 Hour, 1 - 24 Hour--> <P122>1</P122> <!-- Associazione suonerie per interni e esterni --> <!--# Matching Incoming Caller ID. Matching Rule 1--> <P1488>uno</P1488> <!--# Matching Rule 1 Distinctive Ringtone--> <!--# 0 - system ring tone, 1 - custom ring tone 1, 2 - custom ring tone 2, 3 - custom ring tone 3. Default is 0.--> <P1489>1</P1489> <!--# Matching Incoming Caller ID. Matching Rule 2--> <P1490>due</P1490> <!--# Matching Rule 2 Distinctive Ringtone--> <!--# 0 - system ring tone, 1 - custom ring tone 1, 2 - custom ring tone 2, 3 - custom ring tone 3. Default is 0.--> <P1491>2</P1491> <!--# Matching Incoming Caller ID. Matching Rule 3--> <P1492>tre</P1492> <!--# Matching Rule 3 Distinctive Ringtone--> <!--# 0 - system ring tone, 1 - custom ring tone 1, 2 - custom ring tone 2, 3 - custom ring tone 3. Default is 0.--> <P1493>3</P1493> <!-- Configurazione multicast paging --> <!--# Priority 10--> <!--# Listening Address--> <P1587>224.1.1.1:6767</P1587> <!--# Label--> <P1588>Annuncio_generale</P1588> <!--## Programmable Keys/Physical Multi-Purpose Keys - GXP2130 only--> <!--tasto 1 (tipo tasto - account - nome - numero) --> <P323>1</P323> <P301>0</P301> <P302>Pippo</P302> <P303>101</P303> <!--tasto 2--> <P324>1</P324> <P304>0</P304> <P305>Pluito</P305> <P306>142</P306> <!--# 3--> <P325>1</P325> <P307>0</P307> <P308>Paperino</P308> <P309>143</P309> <!--# 4--> <P326>1</P326> <P310>0</P310> <P311>Paperone</P311> <P312>144</P312> <!--# 5--> <P327>1</P327> <P313>0</P313> <P314>Nonna Papera</P314> <P315>145</P315> <!--# 6--> <P328>1</P328> <P316>0</P316> <P317>QuiQuoQua</P317> <P318>146</P318> <!--#7--> <P329>1</P329> <P319>0</P319> <P320>Rockerduck</P320> <P321>147</P321> <!--#8 --> <P353>1</P353> <P354>0</P354> <P355>Topolino</P355> <P356>147</P356> </config> </gs_provision>
Collaudo
Ora, se dopo aver dato l'ennesimo reload ad asterisk, andiamo con un browser a http://<nome o ip del server>:8080/phoneprov/cfg112233445566.xml dovremmo vedere il template XML di qui sopra, con dentro però tutti i valori sostituiti nel template, in modo da essere personalizzato per il nostro interno di prova che ha questo mac address.
Una cosa PESSIMA di questo sistema è che non esiste alcun log del server http contenuto in Asterisk (se c'è, io non l'ho trovato) per cui se qualcosa non va, auguri a capire perché.
Configurazione dei telefoni
Ora dovremo solo dire ai telefoni dove si trova il server del provisioning. Per farlo, possiamo andare nella loro interfaccia web e indicare l' URL del "config server" come http://<nome o ip del server>:8080/phoneprov/ oppure possiamo andare sul server DHCP della LAN (quello da cui i telefoni prendono l' indirizzo ip) e definire una opzione speciale, che viene usata solo dai telefoni Grandstream, ove indicargli da dove fare il provisioning.
Configurazione del DHCP
Se non vogliamo configurare tutti i telefoni uno per uno come indicato sopra, dovremo aggiungere al nostro server DHCP l'opzione numero 66, ovvero "tftp-server-name" (anche se usiamo http), oppure in alternativa la 43, che pero` richiede un encoding più complesso.
Come farlo, dipende dal server DHCP che usate. Cosa metterci dentro, invece, è la stringa http://<nome o ip del server>:8080/phoneprov.