Para una instalación que tenemos que hacer, todo con teléfonos SPA922,SPA942 y SPA962, hemos actualizado el sistema de provisionamiento de los PAP2 que publiqué hace tiempo.
Está hecho con la simplicidad como objetivo, y tratando de facilitar futuras instalaciones. Para esto utilizamos un sistema de plantillas en cascada, es decir, empezamos con una plantilla general, y vamos añadiendo personalizaciones, hasta llegar a la última, en la que prácticamente sólo hay que especificar el número de extensión (usuario) y la contraseña.
- {modelo}-default.cfg: Esta plantilla contiene los ajustes por defecto del modelo de teléfono. {modelo} se reemplaza por 922, 942, 962, etc. Más adelante os comento cómo generar este fichero.
- global.cfg: Aquí indicamos, como instaladores, las modificaciones a los ajustes por defecto. Por ejemplo, la regionalización, diccionarios de idiomas, etc. Así evitamos tocar la plantilla anterior, que puede variar con cada actualización del firmware.
- site.cfg: Ajustes para una instalación concreta, es decir, la IP del proxy, servidor NTP, Syslog, Zona horaria, etc.
- {modelo}-site.cfg: Ajustes más específicos para una instalación y modelo. Por ejemplo, para las actualizaciones de firmware, usando el Upgrade_Rule.
- {modelo}-{mac}.cfg: Finalmente la configuración de cada teléfono. Si el resto se ha hecho bien, solo queda indicar la extensión y contraseña.
El fichero de ajustes por defecto se genera a partir del xml que proporciona el teléfono en http://x.x.x.x/admin/spacfg.xml. Hay un script (xml2cfg) que “parsea” el xml, y lo convierte en pares de clave:valor.
Paso 1. Servidor DHCP
Los SPA9xx, cuando arrancan por primera vez (o después de un “factory reset”), buscan un servidor DHCP que les asigne una dirección IP. A continuación, intentan descargar desde el servidor, mediante TFTP, un fichero de configuración: spa922.cfg, spa942.cfg, etc, según el modelo.
En esta primera instancia, lo que haremos será redirigir el teléfono (mediante el parámetro Profile_Rule), a un script en PHP que genere la configuración definitiva. Además, forzaremos al teléfono a que descargue esta configuración lo antes posible (10 segundos, en lugar de 1 hora).
El fichero /tftpboot/spa922.cfg, por ejemplo, quedaría así:
<flat-profile>
<GPP_A ua="na">x.x.x.x</GPP_A>
<Profile_Rule ua="na">http://$A/provisioning/config.php?model=$PSN&mac=$MA</Profile_Rule>
<Resync_Periodic ua="na">10</Resync_Periodic>
<Resync_Error_Retry_Delay ua="na">10</Resync_Error_Retry_Delay>
<Resync_Fails_On_FNF ua="na">Yes</Resync_Fails_On_FNF>
</flat-profile>
Vemos que se dirige a un script (config.php), y que se le pasa como parámetro tanto el modelo como la MAC del teléfono.
Paso 2. El servidor Web
Todo el meollo está en el script config.php. Lo dejamos en /var/www/html/provisioning/, o donde más os guste. Al recibir una petición para un modelo y MAC concretas, leerá las plantillas de ajustes que correspondan, y generará una configuración completa para el teléfono.
Paso 3. Las plantillas de ajustes
Como las plantillas se leen en un orden concreto, y cada plantilla va sobreescribiendo los ajustes de la anterior, bastará con tener una configuración base, la que trae de fábrica el teléfono, y luego sobre esta, ir haciendo las modificaciones que precisemos.
Para generar esta plantilla base, podemos usar un pequeño script que incluyo:
$ cd /etc/provisioning/
$ wget http://ip.del.sp.a/admin/spacfg.xml
$ xml2cfg spa.cfg > 922-default.cfg
$ rm spacfg.xml
El resto de ficheros siguen el mismo formato, Clave:Valor. En el fichero global.cfg, por ejemplo, nosotros incluimos los ajustes de regionalización (frecuencia y cadencia de los tonos de línea, ocupado, etc), y otros ajustes comunes a todas las instalaciones que haremos.
Ejemplo de global.cfg: (Ajustes sacados de http://www.voipnovatos.es/item/2008/01/call-progress-tones-linksys-spa)
Dial_Tone:425@-10;10(*/0/1);
Outside_Dial_Tone: "425@-10;10(*/0/1);
Busy_Tone:425@-20;10(.2/.2/1);
Reorder_Tone:425@-10;10(0.2/0.2/1,0.2/0.2/1,0.2/0.6/1);
Off_Hook_Warning_Tone:425@-10;10(.25/.25/1);
Ring_Back_Tone:425@-10;10(1/4/1);
Call_Waiting_Tone:425@-20;10(0.175/0.175/1,0.0175/3.5/1);
Confirm_Tone:;
SIT1_Tone:950@-10,1400@-10,1800@-10;10(.33/0/1,.33/0/2,0.33/1/3);
SIT2_Tone:;
SIT3_Tone:;
SIT4_Tone:;
MWI_Dial_Tone:425@-10;10(1/0.1/1)" ;
Cfwd_Dial_Tone:425@-10;10(0.5/0.05/1)" ;
Holding_Tone:1400@-20;10(0.4/5/1)" ;
Conference_Tone:;
Secure_Call_Indication_Tone:;
Page_Tone:;
Ejemplo de site.cfg
Proxy_1_:x.x.x.y
Ejemplo de 922-AABBCCDDEE.cfg
Display_Name_1_:Julian
User_ID_1_:201
Password_1_:esunsecreto
Descargar el código
He montado un servidor SVN para éste y futuros proyectos, y para facilitar las mejoras (en forma de parches) que me enviéis ;). Se distribuye bajo licencia GPL:
$ svn co http://svn.julianmenendez.es/spa-provisioning/trunk spa-provisioning
Conclusión
Sé que hay muchas mejoras posibles, pero esto funciona, y al estar basado en plantillas de ajustes, realizar una instalación nueva solo requiere copiar los ficheros, ajustar el fichero site.cfg, y crear los diferentes ficheros de cada teléfono.
Como mejoras que me gustaría implementar, destacan:
- Generación estática de los ficheros de configuración. Después de hacer un “make”, por ejemplo, el script generaría los ficheros directamente en /tftboot/{model}-{mac}.cfg, de forma que sólo se requeriría un servidor TFTP.
- Interfaz web para gestionar las configuraciones
- Autoprovisioning. Detectar los nuevos teléfonos, y desde la interfaz web, poder rápidamente asignarles usuario/contraseña. Plug&Talk
Julián J. M.