Los interfaces web sobre Asterisk tienen una gran ventaja, y es que automatizan muchas tareas tediosas y permiten una interacción más amigable con el “demonio” de Asterisk. Para los no iniciados pueden suponer una gran ayuda, pero a veces, pueden provocar que el proceso de aprendizaje natural de Asterisk, se vea distorsionado y mal enfocado.
En la lista de Asterisk-Es, ya hemos tenido unas cuantas conversaciones sobre las bondades de las interfaces web para Asterisk, aunque sigue habiendo firmes detractores de las mismas.
Pues bien, para aquellos que ven en estas herramientas elementos que facilitan la gestión diaria (sin entrar en complejas personalizaciones), va dedicado este pequeño post sobre cómo configurar FreePBX para que pueda usar A2Billing para la tarificación de ciertos destinos, pero sin perder el potencial y la flexibilidad de que disponemos sobre los usuarios SIP o IAX, al intentar usar A2Billing exclusivamente.
La idea principal es usar una ruta saliente que apunte a A2Billing al objeto de tarificar dicha salida, y sólo esa salida. El resto de rutas, incluidas las internas, siguen su funcionamiento normal a través de FreePBX. Emplear esta filosofía permite seguir disponiendo de manera sencilla de buzón de voz, desvío, transferencia, etc, etc…, cosa que A2Billing no integra o lo hace con dificultad.
Seguimos los siguientes pasos:
- Vamos a FreePBX y creamos un nuevo trunk –> Custom Trunk
- Se introducen las reglas de marcado sobre ese trunk según las necesidades específicas.
- En la zona donde pone “Custom Trunk String” ponemos A2B/$OUTNUM$
- Pulsamos en Submit y ya tenemos creado el trunk que enviará las llamadas a A2Billing.
- Nos vamos a las rutas de salida, Outbound Routes, y creamos la ruta que pretendemos tarificar. Por ejemplo, si queremos cobrar las llamadas internacionales, pues colocamos un 00. o algo equivalente.
- Es importante que tengamos seleccionado el parámetro Intra Company Route, al objeto de que se preserve nuestro número de extensión.
- El paso siguiente consiste en modificar el fichero extensions.conf y buscar el contexto [macro-dialout-trunk]. Si tenemos la versión 2.3.x no habrá problemas, pero si estamos usando la 2.4, resulta que han movido [macro-dialout-trunk] al fichero extensions_additional.conf (lo cual es una putada). Habrá que toquetear en este último caso, el contexto [macro-dialout-trunk-predial-hook], el cual no he tenido la ocasión de probar, aunque no debe presentar la mayor dificultad. Suponemos que tenemos la versión 2.3.x, y buscamos la siguiente línea
exten => s,n(skipoutnum),Dial(${pre_num:4}${the_num}${post_num},300,${DIAL_TRUNK_OPTIONS})
La anterior línea será borrada y sustituida por el texto siguiente
; Modificado para realizar llamadas hacia A2Billing a la vez que se mantiene la posibilidad de utilizar las reglas
; de marcado de FreePBX
; linea original: exten => s,n(skipoutnum),Dial(${pre_num:4}${the_num}${post_num},300,${DIAL_TRUNK_OPTIONS})
; funcion añadida:
exten => s,n(skipoutnum),GotoIf($["${pre_num}" = AMP:A2B/"]?a2bdial:skipoutnumnormal) ; Verifica que el trunk empiece por
; A2B y hace el Dial.
exten => s,n(a2bdial),DeadAGI(a2billing.php|1|${OUTNUM}) ; Hace el Dial usando A2Billing. Notese el parametro ${OUTNUM}.
exten => s,n,Goto(s-${DIALSTATUS},1)
exten => s,n(skipoutnumnormal),Dial(${pre_num:4}${the_num}${post_num},300,${DIAL_TRUNK_OPTIONS})
; fin de las modificaciones
- Salvar los cambios y hacer un reload de asterisk
- Editamos /var/lib/asterisk/agi-bin/a2billing.php y buscamos lo siguiente
if ($argc > 1 && is_numeric($argv[1]) && $argv[1] >= 0){
$idconfig = $argv[1];
}else{
$idconfig = 1;
}
Debermos añadir el siguiente código, justo inmediatamente después
if ($argc > 2 && is_numeric($argv[2]) && $argv[2] >= 0){ //Nuevo
$the_num = $argv[2]; //Nuevo
} //Nuevo
También modificaremos lo siguiente
$A2B->dnid = $agi->request['agi_dnid'];
sustituyéndolo por esto otro
// La linea original era: $A2B->dnid = $agi->request['agi_dnid'];
// Comprobamos si la llamada viene del contexto macro-dialout-trunk en freePBX
// y ponemos la variable dnid al valor deseado, el cual será pasado a A2Billing
if($agi->request['agi_context'] == "macro-dialout-trunk") //Nuevo
$A2B->dnid = $the_num; //Nuevo
else //Nuevo
$A2B->dnid = $agi->request['agi_dnid']; //Nuevo
// Fin de las modificaciones //Nuevo
- Salvamos el archivo a2billing.php
- Por último, nos cercioramos que tenemos en /etc/asterisk/a2billing.conf lo siguiente
use_dnid = YES
number_try = 1
cid_enable = YES
Si hemos realizado bien los pasos descritos, estaremos en disposición de autentificar a la extensión de FreePBX en A2Billing mediante su CID. Obviamente, habremos creado previamente, un Customer en A2Billing con crédito suficiente para llamar, con un CID coincidente con la extensión de FreePBX, un Call Plan, una RateCard, unas Rates y un trunk de salida…
Hay que recordar que si hacemos alguna actualización de FreePBX (módulo core o framework) es posible que se nos machaquen los cambios en el fichero extensions.conf. Por tal motivo, deberemos tener alguna copia de seguridad o bien, ingeniarselas para hacer las modificaciones en el archivo extensions_custom.conf.
Actualización:
Gracias al amigo RazaMetal, aquí os pongo un código muchíiiiiisimo más optimizado para obtener el mismo resultado de integración y sin tener que tocar nada de a2billing.
Básicamente, se debe hacer uso de “macro-dialout-trunk-predial-hook” que permite inyectar código antes de que freepbx use sus macros internas. En este caso, decimos que si se está usando un trunk de freepbx personalizado (por ejemplo, A2B/1), se vaya a un contexto “custom-freepbx-a2billing” donde pasar la llamada a tarificar a a2billing. En este caso, el 1 despues de la barra, es una indicación para a2billing, de forma que utilice [agiconf1] (se pueden crear otros patrones, en funcion de nuestro a2billing.conf)
El código a utilizar en extensions_custom.conf es:
[macro-dialout-trunk-predial-hook]
exten => s,1,GotoIf($["${OUT_${DIAL_TRUNK}:4:4}" = "A2B/"]?custom-freepbx-a2billing,${OUTNUM},1:2)
exten => s,2,MacroExit
[custom-freepbx-a2billing]
exten => _X.,1,DeadAGI(a2billing.php|${OUT_${DIAL_TRUNK}:8})
exten => _X.,n,Hangup()
De esta forma, toda llamada que use el trunk “A2B/1″ como ruta saliente, será enviado a a2billing para ser tarificada.