Vous êtes sur la page 1sur 76

Voz sobre IP y Asterisk

Pablo Jorquera 2009

CAPITULO 1 Introduccin

Que es Asterisk? Asterisk es software. Exclusivamente software. Es software open source, desarrollado principalmente por la empresa americana DIGIUM. Liberado con la licencia GPL. Se ejecuta en PC estndar (arquitectura x86, x86_64, ppc) Bajo GNU/Linux, BSD o MacOSX. Soporta todas las funcionalidades de las centralitas tradicionales y muchas ms! Historia de Asterisk Asterisk, desarrollado por Mark Spencer y esponsorizado por Digium (creada para tal fin), comenz en 1999. La versin estable: Asterisk 1.2 fue publicada el 15 de Noviembre del 2005. En la actualidad es una solucin probada y robusta, tanto para empresas que lo utilizan de base de usuario como para proveedores o carriers Digium La empresa Digium, fundada por Mark Spencer, Administra y mantiene el cdigo fuente de Asterisk, y lo ofrece bajo dos licencias: GPL y licencia comercial. Vende Hardware de calidad creado especialmente para Asterisk Ofrece soporte tipo express profesional. Certificaciones dCAP (Digium Certified Asterisk Professional)

Telefona IP La telefona IP rene la transmisin de voz y de datos, lo que posibilita la utilizacin de las redes informticas para efectuar llamadas telefnicas. Adems, sta tecnologa al desarrollar una nica red encargada de cursar todo tipo de comunicacin, ya sea de voz, datos o video, se denomina red convergente o red multiservicios. La telefona IP surge como una alternativa a la telefona tradicional, brindando nuevos servicios al cliente y una serie de beneficios econmicos y tecnolgicos con caractersticas especiales como: 1- Interoperatividad con las redes telefnicas actuales: En el caso de TELMEX se disponen de dos tipos de Interconexin a la red de telefona pblica, desde una central telefnica IP y directamente desde una tradicional. 2- Calidad de Servicio Garantizada a travs de una red de alta velocidad: - En Telefona IP el concepto de calidad incluye aspectos como: - Red de alta disponibilidad que ofrece hasta de un 99,99% de recursos. - Calidad de voz garantizada (bajos indicadores de errores, de retardo, de eco, etc.). 3- Servicios de Valor Agregado: como el actual prepago, y nuevos servicios como la mensajera

ACD Call Center o Automatic Call Distribution Call Center El sistema de centralita IP Asterisk dispone de funcionalidades avanzadas que le permitirn implementar un potente sistema de gestin de llamadas IP o IP Contact Center. Entre las funcionalidades ms destacadas que ofrece Asterisk para dicha funcin podemos enumerar las siguientes:

ACD: Sistema de gestin de colas de llamada. Asterisk permite un nmero ilimitado de colas y agentes, con lo que el sistema crecer con su negocio. IVR: Operadora automtica sin limitaciones de opciones y funcionalidad. CTI: Existen conectores estndar (TAPI) para integrar su sistema CRM con la centralita, y tambin opciones para la integracin va HTML.

Grabacin de llamadas: las llamadas en una PBX Asterisk pueden grabarse de forma automtica o bien a criterio del operador o agente. Asimismo dispone de un sencillo interfaz para su audicin posterior.

Si las funcionalidades implementadas directamente por Asterisk no cubren los requerimientos de su centro de contactos, existen soluciones adicionales que le permitirn disponer de uno de los sistemas ms avanzados del mercado. Entre dichas funciones podemos encontrar software de cdigo abierto o bien software licenciado:

Queuemetrics: potente sistema de gestin y reporte de colas ACD. Vicidial: Sistema auto marcador, que le permitir gestionar eficazmente sus campaas. Gnudialer: Sistema con discado predictivo asistido y manual, y sirve para gestionar campaas. Nuevas funcionalidades Asterisk 1.6

Asterisk 1.6.0 Sin duda la relase ms esperada. Trae muchos cambios y nuevas funcionalidades, as que es importante consultar los ficheros CHANGES y UPGRADE. Otra de las novedades que trae Asterisk 1.6.0 adems de no soportar Zaptel en favor de DAHDI: el nuevo modelo de desarrollo. En Asterisk 1.4, se mantena un nico branch para toda la versin 1.4, por lo que no se aadan nuevas funcionalidades. Esto no haca posible la inclusin de nuevas funcionalidades hasta las major releases, por lo que tardaban demasiado en ver la luz. Con el nuevo modelo de desarrollo se crear un branch por cada release. Actualmente ya estn creados los branches para Asterisk 1.6.0 y Asterisk 1.6.1. Al contrario que en Asterisk 1.4, en Asterisk 1.6 s que se aadirn nuevas funcionalidades en Asterisk 1.6.1, Asterisk 1.6.2 y sucesivas versiones. Se espera que el tema del CallerID en las transferencias este solucionado en Asterisk 1.6.1, y que Asterisk 1.6.2 incluya soporte para IPv6.

DAHDI 2.0.0 DAHDI es el reemplazo de Zaptel ya que la marca Zaptel es propiedad de otra empresa dedicada a la venta de tarjetas minutos de telefona. DAHDI viene dividido en 2 paquetes, aunque es posible descargar uno que agrupa ambos: dhadi-linux y dahdi-tools.

Dahdi-linux contiene los mdulos del kernel para el manejo de las tarjetas de telefona, y dahdi-tools las herramientas que sustituyen a ztcfg, zttool, etc.

Esta separacin hace posible que si se detecta un bug en una aplicacin no sea necesario hacer una release que incluya los mdulos del kernel y vice versa. Pues por fin tenemos estas nuevas versiones disponibles, aunque obviamente no recomiendo actualizar a Asterisk 1.6.0 y DAHDI hoy.

Descarga, Compilacin e Instalacin de Asterisk 1.4

Instalacin S.O

Este captulo nos ayudara a preparar el sistema para la instalacin de Asterisk. Este funciona en muchas plataformas y sistemas operativos, mas nosotros elegimos mantener las cosas simples y permanecer en una nica plataforma y distribucin de Linux. Vamos usar la distribucin CentOS en este curso. Las instrucciones realizadas en este curso pueden funcionar con otras distribuciones, pero estas no han sido testeadas por nosotros.

Eleccin paquetes y dependencias necesarias para compilacin de asterisk.

Antiguamente existan algunos paquetes que eran necesarios para instalar Asterisk como el readline y readline-devel que no son necesarios hoy. No existe hardware especial tal como una placa de sonido y el nico paquete necesario es el propio Asterisk. Si usted estuviera usando hardware de Digium o ztdummy, usted va a precisar del paquete zaptel. El paquete zaptel es necesario para que algunas aplicaciones sean incluidas en tiempo de compilacin. Si usted escoge compilar Asterisk y no el zaptel, pero descubre que esta faltando una aplicacin relacionada al paquete zaptel (Como el Meetme()), usted tendr que compilar el zaptel y entonces ser necesario recompilar Asterisk para que la aplicacin sea incluida Para interfaces T1 y E1 el paquete libpri es necesario. Bison es necesario para compilar el Asterisk. Los paquetes de desarrollo ncurses y ncurses-development son necesarios si usted quisiera construir nuevas herramientas (Como el astman). Las bibliotecas zlib y zlib-devel son necesarias ahora para compilar. Esto se debe a la adhesin del protocolo DUNDi (Distributed Universal Number Discovery).

Los paquetes necesitados para el sistema operativo Linux CentOS sern: - Kernel sources y headers - gcc y sus dependencias - bison (necesario para los archivos de configuracin. - ncurses (necesario para la consola CLI) - openssl y openssl-dev o libssl-dev - Newt (para aplicaciones tal como zttool) - Lib y zlib-devel La recomendacin es que durante el proceso de instalacin del sistema operativo se debern seleccionar los siguientes paquetes: - Seccin Desarrollo: * Herramientas de Desarrollo (TODO) * Desarrollo de Software Anticuado (TODO) Como herramientas adicionales tambin se podr instalar: - Seccin Servidores: * Servidor Web * Servidor de Correo * Servidor de Bases de Datos (MySQL y/o Postgres)

Paquetes requeridos relacionados con Asterisk


La instalacin de Asterisk esta compuesta por como mnimo 4 paquetes bsicos que se necesitaran o no en su totalidad segn la necesidad especifica de nuestro proyecto, estos son: asterisk, zaptel, libpri y asterisk-addons. Cada uno de los paquetes tiene los siguientes contenidos: - Asterisk: Incluye el programa principal de asterisk. - Zaptel: Incluye los drivers para las tarjetas telefnicas Zaptel. - LibPri: Incluye las libreras PRI necesarias para conectarse al RTPC. - Asterisk-addons: Incluye mdulos adicionales a asterisk, como por ejemplo el modulo MySQL para conexin a bases de datos de este tipo.

El nico paquete estrictamente necesario es asterisk, ya que libpri solo se necesitara en caso de que vallamos a utilizar interfaces PRI y zaptel en caso de utilizar tarjetas ZAPTEL, en caso de requerir utilidades que necesiten fuente de temporizacin y no tengamos hardware Zaptel instalado, es requerido instalar el paquete zaptel activando por defecto el modulo ztdummy.

Descarga paquetes de Asterisk


La descarga de asterisk y sus libreras pueden realizarse en forma de archivos tar.gz, para descargar estos archivos los podemos encontrar en: http://ftp.digium.com/pub/ La nomenclatura de estos paquetes ser asterisk-version.tar.gz por ejemplo: Asterisk Zaptel Libpri Asterisk-a ddons asterisk-1.4.x.tar.gz zaptel-1.4.x.tar.gz libpri-1.4.x.tar.gz asterisk-addons-1.4.x. tar.gz

Esta descarga se puede realizar a travs de un navegador Web como cambien desde la lnea de comandos ejecutando el comando 'wget':
wget http://downloads.digium.com/pub/zaptel/releases/zaptel-1.4.x.tar.gz wget http://downloads.digium.com/pub/asterisk/releases/asterisk-1.4.x.tar.gz wget http://downloads.digium.com/pub/libpri/libpri-1.4.x.tar.gz wget http://downloads.digium.com/pub/asterisk/releases/asterisk-addons-1.4.x.tar.gz

Si fueron descargados los paquetes .tar.gz, estos se descomprimen ejecutando el comando 'tar' desde la lnea de comandos: tar -xvzf archivo-comprimido.tar.gz

Esto creara un directorio con el nombre y versin del paquete descomprimido y dentro estar el contenido del paquete.

Instalacin Asterisk 1.4


La instalacin de los paquetes de asterisk se debe realizar en el siguiente orden: 1ero .- zaptel 2do .- libpri 3ero .- asterisk 4to .-asterisk-addons

Compilacin e Instalacin Zaptel Para compilar e instalar el driver Zaptel se deben seguir los siguientes pasos como usuario 'root'. # cd /usr/src/ # wget http://downloads.digium.com/pub/zaptel/releases/zaptel-1.4.x.tar.gz # cd /usr/src/zaptel-1.4.x # ./configure # make # make install # make config Compilacin e Instalacin Libpri Para compilar e instalar Libpri se deben seguir los siguientes pasos como usuario 'root'. # cd /usr/src/ # wget http://downloads.digium.com/pub/libpri/libpri-1.4.x.tar.gz # cd /usr/src/libpri-1.4.x # make # make install

Compilacin e Instalacin Asterisk Para compilar e instalar Asterisk se deben seguir los siguientes pasos como usuario 'root'.

# cd /usr/src/ # wget http://downloads.digium.com/pub/asterisk/releases/asterisk-1.4.x.tar.gz # cd /usr/src/asterisk-1.4.x # ./configure


# # # # make make install make samples make config

Compilacin e Instalacin Asterisk-Adoons Para compilar e instalar Asterisk-Adoons se deben seguir los siguientes pasos como usuario 'root'. # cd /usr/src/ # wget http://downloads.digium.com/pub/asterisk/releases/asterisk-addons-1.4.x.tar.gz # cd /usr/src/asterisk-addons-1.4.x # ./configure # make # make install # make samples

Directorios Usados
A continuacin los archivos y directorios mas importantes creados en el proceso de instalacin. /etc/asterisk En este directorio se encuentran todos los archivos necesarios para configurar la gran cantidad de servicios que Asterisk provee.Revisaremos los mas importantes. asterisk.conf Configuraciones generales de la ubicacin de directorios de archivos de configuracin, Mdulos compilados, voicemails etc. En general es buena idea no modificar estas configuraciones, salvo casos especiales.

cdr.conf Configuraciones referentes al "Call Detail Record". Los CDR son sumamente importantes para las compaas telefnicas. Modificar datos en este archivo puede repercutir en la integridad de los CDR si no se esta seguro de lo que se hace. Si la instalacin es nicamente de prueba, o los CDR no son materia importante, no hay problema. codecs.conf A menos que utilices SPEEX, o quieras hacer cosas especiales con la forma en la que los codecs se comportan, es mejor no modificar este archivo.

extensions.conf Tal vez el archivo mas importante de Asterisk. En este archivo se toman las decisiones de ruteo de las llamadas. Mas adelante veremos la sintaxis de este archivo. features.conf Este archivo es tambin muy importante. Permite habilitar y configurar servicios genricos de un PBX como la transferencia asistida y monitoreo de llamadas. iax.conf Importante archivo para el funcionamiento del canal chan_iax que le permite a Asterisk interactuar con otros dispositivos IAX, incluyendo otros PBX Asterisk. logger.conf Que nivel de verbosidad deben tener los mensajes de log y a donde deben ser enviados. manager.conf Configuracin del importante servicio AMI (Asterisk Manager Interface) que permite conectarnos a un socket TCP y manejar el PBX. De cierta forma se encuentra relacionado con el archivo http.conf, que provee de una interfaces para programar aplicaciones con AJAX que se comuniquen directamente con AMI. modules.conf Archivo sumamente importante. Determina que mdulos sern cargados por Asterisk al iniciar. Es frecuente que cuando se instala asterisk por primera vez, no arranque debido a que no puede cargar un mdulo para el que no tenemos soporte. Esto se soluciona comentando la lnea del mdulo en este archivo.

sip.conf Anlogo del archivo iax.conf para el protocolo SIP zapata.conf Configuracin de los canales ZAP. Las configuraciones de este archivo deben coincidir con el hardware instalado y la configuracin del driverzaptel. voicemail.conf Configuracin de las casillas de voz creadas para los respectivos anexos. meetme.conf Configuracin de las salas de conferencias.

/var/log/asterisk En este directorio se encuentran los archivos de registro de las operaciones de Asterisk. Definamos cada uno de los archivos encontrados dentro de este directorio.

cdr.db Este archivo se encuentra disponible si se cuenta con el CDR handler para la base de datos SQLite. El archivo contiene la base de datos de los registros de las llamadas. event_log Registro de eventos sucedidos en el PBX. Full Creado con la intencin de contener todos los mensajes de debug del sistema. Messages Contiene un listado de los mensajes de warning, debug y dems niveles de logeo. queue_log Archivo utilizado principalmente por la aplicacin app_queue.

/var/lib/asterisk Directorio con archivos de audio, llaves RSA, scripts AGI (Asterisk Gateway Interface), base de datos astdb y archivos para el pequeo servidor HTTP para AJAM (Asynchronus Javascript Asterisk Manager). Aqu veremos una descripcin de cada uno de los directorios, ya que los archivos pueden ser irrelevantes. agi-bin/ Aqu se contienen programas en C, PHP, Python o cualquier otro lenguaje con el que se pretenda interactuar desde Asterisk. keys/ Directorio que contiene llaves RSA para la autenticacin de llamadas con el protocolo IAX2 Sounds/ Directorio con todos los sonidos que sern utilizados por aplicaciones como Playback() y Background () Para asegurarnos que el proceso de asterisk y zaptel inician de forma automtica con el arranque del servidor y en caso de reinicio del S.O completo y para el proceso de inicio o detencin de forma manual del servicio debemos ejecutarlos siguientes comandos en la interfaz de lnea de comandos: # service zaptel start # service asterisk start # chkconfig zaptel on # chkconfig asterisk on Para acceder al monitor del sistema o tambin conocido como 'CLI>' ejecutamos el siguiente Comando: # asterisk -r

Descarga, Compilacin e Instalacin de Asterisk 1.6

http://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-1.6.1.1.tar.gz http://downloads.asterisk.org/pub/telephony/dahdi-linux/releases/dahdi-linux2.1.0.4.tar.gz http://downloads.asterisk.org/pub/telephony/dahdi-tools/releases/dahdi-tools2.1.0.2.tar.gz http://downloads.asterisk.org/pub/telephony/libpri/releases/libpri-1.4.10.tar.gz http://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-addons1.6.1.0.tar.gz


Instalacin Libpri

tar -zxvf libpri-1.4.X.tar.gz cd libpri-1.4.X make make install


Instalacin DAHDI-LINUX

tar zxvf dahdi-linux-2.1.X.X.tar.gz cd dahdi-linux-2.1.0.4 make make install

Instalacin DAHDI-TOOLS

tar zxvf dahdi-tools-2.1.X.X.tar.gz cd dahdi-tools-2.1.0.2 ./configure make make install make config

Instalacin Asterisk-1.6 Tar zxvf asterisk-1.6.X.tar.gz

cd asterisk-1.6.1/ ./configure make make install make simples make config

Instalacin Asterisk-addons

tar -zxvf asterisk-addons-1.6-current.tar.gz cd asterisk-addons-1.6.0 ./configure make menuselect make make install make simples

Uso de DAHDI

La TE120P es una tarjeta de interfaz digital de alto rendimiento, es una interfaz telefnica capaz de interconectar sistemas tradicionales de la telefona con las tecnologas emergentes de Voz sobre IP. Usada junto con Asterisk, la TE120P puede usarse para proporcionar un amplio conjunto de servicios de PBX. La tarjeta TE120P es fcil de expandir, pudiendo configurarla como T1 (24 canales), E1 (32 canales), o J1 (24 canales).

Estas tarjetas debern ser alojadas en un slot PCI libre y en el se conectar la tarjeta.Una vez colocada la tarjeta en su puerto respectivo, debemos saber si es reconocida:

Luego tenemos los siguientes comandos: ns:~# dahdi_hardware Es para detectar el tipo de tarjeta de que estamos usando, al mismo ver si la reconoce. ns:~# dahdi_cfg v Es para verificar que el archivo de configuracin est correcto, y por consecuencia muestra los canales bien configurados. Este comando hace lo que hacia el ztcfg v tiempo para

Si usted utiliza Zaptel: Con esta opcin Asterisk 1.4.22 o superior, no traer por defecto zapata.conf por lo se tiene que crear tomando como base el archivo chan_dahdi.conf aunque Asterisk seguir buscando el archivo zapata.conf Est claro que de ahora en adelante, DAHDI va a tener que hacerse paso en medio de lo que queda de Zaptel, al final Zaptel ir perdiendo soporte. El cambio es irreversible y solo queda actualizarse y detectar los bug que pueda tener DAHDI, esperando que se vaya mejorando a medida que pasa el tiempo.

Configuracin de E1 con DAHDI Con esta opcin Asterisk 1.4.22 o superior, se deber configurar en /etc/dahdi/system.conf con una configuracin prcticamente igual a la del zaptel.conf y seguidamente /etc/asterisk/chan_dahdi.conf para definir los canales que Asterisk va a utilizar

system.conf

chan_dahdi.conf

Llamadas desde la PSTN hacia el servidor: ;extensions.conf ; Para el caso de numeracin 4834000 hasta 4834099 de GTD. [from-pstn] exten => _40XX,1,Dial(SIP/${EXTEN},20) exten => _40XX, 2, Hangup

Llamadas desde el servidor hacia la PSTN: ;extensions.conf [anexos] exten => _XXXXXXX,1,Dial(DAHDI/g1/${EXTEN},20) exten => _XXXXXXX,2,Hangup exten => _XXXXXXX,1,Dial(DAHDI/g1/${EXTEN},20) exten => _XXXXXXX,2,Hangup

Plan de Marcacin: Conceptos avanzados.

Directory: Accede a un servicio de directorio, apoyado en la informacin almacenada para la gestin de un contexto de Voicemail, en este caso el Apellido y Nombre de los usuarios. Con ello, se consigue que un usuario pueda acceder a la extensin "escribiendo el nombre" del usuario de la extensin a quien llama, de manera similar a como se dan de alta los nombres en una agenda de un mvil. SOLO FUNCIONA con aquellos usuarios que tengan activado el buzn de voz.

Parmetros: Contexto Voicemail ....Usar: voip-h323. Contexto de Llamada ....Contexto de Llamada donde se sita la regla de llamada a la extensin. Opciones ....Opciones: busca por el nombre. Por defecto busca por apellidos. Voicemail.conf 100 => 1234,John Doe,johndoe@example.com,,hidefromdir=yes Directory(vm-context[|dial-context[|options]]) - Ver. 1.4 Directory (vm-context[,dial-context,options]) - Ver.1.6 GotoIf: Permite un desvo del flujo de la llamada dentro de las reglas definidas para la misma extensin (ojo, no permite el salto directo a otro contexto o extensin). Adems con la particularidad de que se va a controlar el salto en funcin de la evaluacin de una expresin condicional. Esta expresin condicional se conforma como: ${VARIABLE} [Elemento Condicional] Valor/${Variable}. Teniendo en cuenta que hay que separar con un espacio en blanco los elementos.

Parmetros: Condicin ....Expresin Condicional que ser evaluada (separados por un espacio en blanco): ${VARIABLE} [Condicin] [${Variable} o Valor]. Regla de Salto True ....Nmero de la Regla a la que salta en caso de ser Verdadera la Expresin. Regla de Salto False ....Nmero de la Regla a la que salta en caso de ser Falsa la Expresin. GotoIf (condition?label1[:label2]) Extensions.conf exten => 206,1,GotoIf($["${CALLERID(num)}" = "303"]?dial1) exten => 206,n,GotoIf($["${CALLERID(num)}" != "304"]?moh:dial2) exten => 206,n(dial1),Dial(${SPHONE1},15,rt) exten => 206,n,Hangup() exten => 206,n(dial2),Dial(${PHONE2},15,rt) exten => 206,n,Hangup() exten => 206,n(moh),MusicOnHold(default) MYSQL: Ejecuta una sentencia MySQL (Connect Query Fetch Clear Disconnect), incluso almacena el resultado en variables que pueden ser accesibles en el DialPlan. Observar su sintaxis: Connect Conector Lista_Vbles (dbhost dbuser dbpass dbname) Query Resultado Conector Consulta (SELECT algo FROM Tabla WHERE sentencia_sin_espacios) Fetch Resultado Conector Lista_Vbles (vble1 vble2 ...) Clear Conector Disconnect Conector. Parmetros: Sentencia ....Una de las Siguientes: Connect Query Fetch Clear Disconnect. Resultado ....Vble en la que se almacena el resultado de la ejecucin de la sentencia SQL. (Para Connect,Query,Fetch). Conector ....Variable que seala dnde buscar los datos a Query/Fetch/Clear/Disconnect. Siempre es ${variable_resultado}. Consulta SQL/Lista V ....Consulta SQL (Sin entre comillas, y separando el espacio en blanco como " ") o Lista de Variables donde almacenar (Fetch) o dnde se almacenan los datos de conexin (Connect).

Extensin.conf exten => 960,1,Noop(${CALLERID(num):1}) exten => 960,n,MYSQL(Connect connid localhost dialplan system asterisk) exten => 960,n,MYSQL(Query resultid ${connid} 'SELECT ani FROM temp where ani like ${CALLERID(num):1}') exten => 960,n,MYSQL(Fetch fetchid ${resultid} AGIScript) exten => 960,n,GotoIf($[${AGIScript} = ${CALLERID(num):1}]?existe:no-existe) exten => 960,n,MYSQL(Clear ${resultid}) exten => 960,n,MYSQL(Disconnect ${connid}) exten => 960,n(existe),Noop(Numero ya existe ${CALLERID(num):1}) exten => 960,n,MYSQL(Clear ${resultid}) exten => 960,n,MYSQL(Disconnect ${connid}) exten => 960,n,Hangup() exten => 960,n(no-existe),Noop(${CALLERID(num)})

AddQueueMember: Aade a una Cola de Llamadas la extensin desde la que se llama, o el agente o extensin determinada por el parmetro Interface. Adems es posible "penalizar" la extensin con un nivel de prioridad.
Parmetros: Nombre Queue existe). Interface

... Nombre de la cola de llamadas (Verificar que

... Se puede especificar un interface con el formato:

Tecnologa/recurso (o agent/identificador). Prioridad ... Penaliza la extensin con una prioridad.

Extensin.conf

Agregar a la cola.
exten => 123,1,AddQueueMember(Cola de atencion SIP/${CALLERIDNUM}@internal) exten => 123,n,Playback(agent-loginok) exten => 123,n,Playback(vm-goodbye)

RemoveQueueMember: Nombre de la Cola de la que se desea dar de baja, como agente de ella. Si no se especifica nada, el sistema entiende que es desde la misma extensin desde dnde se llama, en caso de rellenar el campo Interface, se dar de baja lo especificado en ese parmetro.
Parmetros: Cola ....Nombre de la Cola. Interface ....Indica el interface que quiere darse de baja. Ejemplo: SIP/${CALLERIDNUM}.

Extensions.conf
exten => 124,1,RemoveQueueMember(Cola_atencion| SIP/${CALLERIDNUM}@internal) exten => 124,n,Playback(agent-loginok) exten => 124,n,Playback(vm-goodbye)

BackgroundDetect: Reproduce una meloda o un mensaje mientras intenta detectar un digito que corresponda con una extensin. Parmetros: Archivo ....Especifica el archivo que contiene la Meloda o Mensaje. Periodo ....Periodo de silencio en milisegundos (si sigue a un periodo de No Silencio salta a la extensin talk). Min. No-Silencio ....Mnimo periodo de No-Silencio en milisegundos. Max. No-Silencio ....Periodo de No-Silencio Mximo en milisegundos.

DateTime: Reproduce una fecha a partir de una dada en formato unixtime. El formato unixtime representa una fecha expresada en la cantidad de segundos desde el 1 de enero de 1970 hasta el momento expresado en la fecha. La reproduccin de las fechas se realiza de acuerdo a un formato determinado.

Parmetros: Fecha y Hora ....Fecha y Hora expresada en formato "unixtime". Zona Horaria ....Zona horaria (revisar zonas horarias en Linux). Formato Reproduccin ....Formato de reproduccin de la fecha (por defecto: ABdY "digits/at" IMp).

DeadAgi: Ejecuta un script o programa creado por el usuario, al colgar la llamada en curso. (Observar tambin la situacin de contexto H hangup).

Parmetros: Script ....Nombre Script. Argumentos ....Argumentos que acompaan la llamada al script.

EAGI: Ejecuta un script o programa creado por el usuario, con la particularidad de que EAGI permite controlar el flujo de audio.

Manejo de colas El sistema de colas en Asterisk se compone de


Llamadas entrantes que son ubicadas en una cola. Miembros que contestan las llamadas en la cola (extensiones o bien usuarios que se loguean como agentes). Una estrategia sobre cmo manejar la cola y repartir las llamadas entre los miembros Msica que se reproduce durante la espera en la cola. Anuncios para miembros y emisores de llamadas.

Manejo de colas: Config

La configuracin de las colas se define:

Estticamente: en el archivo queues.conf Dinmicamente: la configuracin se almacena en una BD, disponibilizando los cambios sin necesidad de realizar un reload

La configuracin de los agentes se define en el archivo agents.conf

Manejo de colas: agentes

Los agentes atienden las llamadas de una cola especfica.

Un agente debe realizar un login (llamando a una extensin especial que contiene la aplicacin AgentLogin) indicando que est listo para tomar llamadas.

Los miembros son aquellos canales disponibles que estn activamente atendiendo la cola. Pueden ser tanto agentes como tambin canales regulares (sip/juan).

Manejo de colas: estrategias

Las llamadas son distribuidas entre los miembros de una cola siguiendo alguna de las siguientes estrategias:

ringall: hace sonar todos los canales disponibles hasta que alguno responda (configuracin por defecto). roundrobin: hace sonar cada interfaz disponible por turnos. leastrecent: hace sonar la interfaz que fue menos recientemente llamada por esta cola. fewestcalls: hace sonar la interfaz con la menor cantidad de llamadas completas. random: hace sonar una interfaz al azar. rrmemory: igual que el round robin pero recuerda cual fue el ltimo telfono que atendi una llamada y contina con el siguiente.

Manejo de colas: penalties y priorities.

Penalty: se le asigna una penalidad a cada agente, de manera tal que primero se derivan las llamadas (va la estrategia definida) a los agentes con el menor valor de penalidad. En el caso de estar todos ocupados, se contina con la siguiente penalty y as sucesivamente. 1. Ejemplo: slo si la telefonista est ocupada, se deriva el llamado a la oficina.

Priority: se le asigna una prioridad a cada llamada entrante, permitiendo situarla en un lugar ms adelante de la cola (no siempre al final). 1. Ejemplo: las llamadas al nro. 110 tienen ms prioridad que las del 111.

Manejo de colas: aplicaciones

Aplicaciones principales, utilizadas en extensions.conf:

Queue: aplicacin utilizada para encolar una parmetro las colas definidas en queue.conf).

llamada (toma como

AddQueueMember: agrega dinmicamente un miembro a la cola. RemoveQueueMember: remueve dinmicamente un miembro de la cola. AgentLogin: login de un agente a una cola.

Manejo de colas: CLI

Comandos relacionados de la CLI: show agents: muestra los agentes. show queues: lista todas las colas. show queue: muestra datos de una cola en particular. queue add member: agrega un miembro a la cola. queue remove member: elimina un miembro de la cola.

Manejo de colas: ejemplo. queue.conf

[MyQueue] music=default strategy=ringall timeout=15 retry=5 wrapuptime=0 maxlen = 0 ;

; nombre de la cola ; msica que coloca antes que lo atiendan ; estrategia de ring ; tiempo mximo de ring a un miembro ; tiempo de espera hasta reintentar con otro miembro ; tiempo de espera luego de intentar con todos los miembros

announce-frequency = 0 ; cantidad de veces que sale el anuncio announce-holdtime = no ; member => Agent/1001,1 member => Agent/1002,1 member => Agent/1003,1 si dice el tiempo de espera aproximado

agents.conf

[agents] agent => 1001,1111,Juan agent => 1002,2222,Pedro agent => 1003,3333,Pablo

extensions.conf

Logueo de un agente que ya existe en la cola exten => 51,Set(LANGUAGE()=es) exten => 51,n,AgentLogin(,s)

Logueo de una extensin que no existe en la cola

exten => 123,1,AddQueueMember(Cola de atencin SIP/${CALLERIDNUM}@internal) exten => 123,n,Playback(agent-loginok) exten => 123,n,Playback(vm-goodbye)

Remover una extension de la cola.


exten => 124,1,RemoveQueueMember(Cola_atencion| SIP/${CALLERIDNUM}@internal) exten => 124,n,Playback(agent-loginok) exten => 124,n,Playback(vm-goodbye)

Envo de una llamada a la cola.

exten => 2020,1,Answer exten => 2020,3,Wait(2) exten => 2020,4,SetMusicOnHold(default) exten => 2020,5,Queue(MyQueue|r) exten => 2020,6,Hangup

Asterisk AstDB

Asterisk incorpora una BD tipo Berkley DB v2, en ella el propio Asterisk almacena diversos valores Como: - Registros SIP, IAX. - Informacin sobre colas.

Nosotros como desarrolladores y programadores de nuestro dialplan tambin podemos almacenar Informacin en ella y consultarla desde el mismo dialplan.

AstDB posee una organizacin referente a familias, y dentro de una familia se pueden tener diversas keys, y para cada key un solo valor. A continuacin un ejemplo de creacin de una DB asterisk.

[root@asterisk ~]# asterisk r asterisk*CLI> database put MIFAMILIA mikey 1234 Updated database successfully

asterisk*CLI> database show MIFAMILIA /MIFAMILIA/mikey : 1234

asterisk*CLI> database put MIFAMILIA mikey 4567 Updated database successfully

asterisk*CLI> database show MIFAMILIA

/MIFAMILIA/mikey

: 4567

La forma de manipular esta DB creada anteriormente eliminando el conteni do y asignndole otro es la siguiente:

[AstDB] exten => _XXXX,1,Set(valrespassadmin=${DB_DELETE(MIFAMILIA/mikey)}) exten => _XXXX,2,Set(DB(MIFAMILIA/mykey)=${EXTEN}) exten => _XXXX,3,Set(pass1=${DB(MIFAMILIA/mykey)}) exten => _XXXX,6,Hangup()

Configurar el desvo de llamada.

Veremos como configurar el desvo de llamada en Asterisk. Esta gua funciona con asterisk 1.4.X y asterisk 1.6.X. Esta configuracin es para que el numero a que se desvan las llamadas sea un fijo o celular y no una extensin interna de Asterisk. Para programar el desvo, la llamada tiene que ser efectuada desde una extensin interna de Asterisk. Claramente, lo pueden modificar segn sus exigencias.
[callfwd-add] exten => s,1,Answer() exten => s,n,Set(NUM=${CALLERID(num)}) el numero de la extensin que est llamando exten => s,n,Set(COUNT=1) variable COUNT ; contexto para programar el desvi de llamada ; contestamos la llamada ; asignamos a la variable NUM

; asignamos el valor 1 a la

exten => s,n(inicio),Playback(please-enter-the&telephone-number&for&your&callforwarding&astcc-followed-by-the-pound-key) ; La voz de asterisk nos dir que tenemos que digitar el numero al cual queremos desviar todas las llamadas exten => s,n,Read(forw,,15,,2,10) los guardar en la variable forw ; Asterisk leer los dgitos y

exten => s,n,Playback(call-forwarding) : La voz de asterisk dir que el desvo de la llamada ha sido configurado para el numero exten => s,n,Playback(has-been-set-to) exten => s,n,SayDigits(${forw}) los digitos de la variable forw ; Saydigits lee uno a uno

exten => s,n,Playback(if-this-is-correct-press&digits/1&if-this-is-notcorrect&digits/2) ; Si el numero que escuchamos es exacto presionamos 1 sino 2 exten => s,n,Read(sino,,1,,,5) respuesta y la guarda en la variable sino exten => s,n,GotoIf($["${sino}" = "1"]?setf:conta) a uno vamos a la etiqueta setf sino a conta exten => s,n(conta),Set(COUNT=$[${COUNT} + 1]) (que era 1) una unidad (el nuevo valor es 2) ; asterisk lee nuestra

; si sino es igual

; aadimos a la variable COUNT

exten => s,n,Gotoif($["${COUNT}" < "4"]?inicio:bye) ; si la variable COUNT es menor que 4 vamos a etiqueta inicio sino a la etiqueta bye. Esto sirve para permitir tres intentos de configuracin antes de colgar la llamada.

exten => s,n(setf),Set(DB(${NUM}/FORW)=${forw}) numero en la base de datos interna de Asterisk exten => s,n,Wait(1) exten => s,n(bye),Playback(goodbye) despedida exten => s,n,Hangup

; etiqueta setf, guardamos en

; esperamos un segundo ; Escucharemos un saludo de

; la llamada ser terminada

La base de datos interna de asterisk funciona de este modo: cada valor puede ser asignado a una familia/clave. En nuestro caso la familia es el numero de la extensin que ha programado el desvi de llamada (la variable NUM), la clave el la palabra FORW. Un ejemplo: desde nuestra consola una vez que tengamos programado el desvi de llamada

asterisk r

CLI> database show /4000/FORW

: 0991354111

Como pueden ver a la familia 4000 (la extensin que ha programado el desvo de llamada) clave FORW ha sido asignado el numero 0991354111. Cuando alguien llamar la extensin 4000 la llamada se desviar a este nmero

[callfwd-remove] exten => s,1,Answer exten => s,n,Set(NUM=${CALLERID(num)}) exten => s,n,Wait(1) exten => s,n,Set(forw=${DB_DELETE(${NUM}/FORW)}) exten => s,n,Playback(call-fwd-cancelled) exten => s,n,Playback(goodbye) exten => s,n,Hangup

Esta segunda parte del cdigo no hace nada ms que borrar, para la extensin que llama, el numero configurado para el desvi de las llamadas.

Ahora en nuestro contexto local en extensions.conf tenemos que aadir dos lneas ms:

exten => 71,1,Goto(callfwd-add,s,1) exten => 72,1,Goto(callfwd-remove,s,1)

Llamando la extension 72 iremos al contexto callfwd-remove, extensin s, prioridad 1, (el contexto para borrar el desvo de llamada)

Supongamos que tenemos configurado el desvo de llamada para la extensin 4000. Como lo vamos a usar en nuestro plan de llamadas (dialplan)?

[internal] exten => 71,1,Goto(callfwd-add,s,1) exten => 72,1,Goto(callfwd-remove,s,1) ;Envio a desvio de llamada ;Remover el desvio de llamada

exten => 4000,1,Answer() exten => 4000,2,Ringing()

; contestamos la llamada ;Enviamos Ring

exten => 4000,n,Set(NUM=${DB(${EXTEN}/FORW)}) ; Leemos la base de datos para ver si hay algn valor en la familia 4000/FORW y lo asignamos al variable NUM exten => 4000,n,GotoIf($["${NUM}" = ""]?normal:forw) ; si la variable NUM es vaca seguimos normalmente sino vamos a la etiqueta forw exten => 4000,n(normal),Dial(SIP/4000,30,tTwkKxX) ; llamamos la extensin 4000 exten => 4000,n,Hangup() ; terminamos la llamada

exten => 4000,n(forw),DIAL(DAHDI/g1/${NUM},60,rtTwkKxX) ; si el desvo es activo, usando nuestro proveedor de llamadas VoiP, marcamos el numero configurado para el desvo exten => 4000,n,Hangup() ; terminamos la llamada

Los comandos disponibles para la base de datos de asterisk:

CLI> help database database del database deltree database get database put database show database showkey Removes database key/value Removes database keytree/values Gets database value Adds/updates database value Shows database contents Shows database contents

Creo que es ms difcil explicarlo que configurarlo... :) Hagan sus pruebas y me cuentan

Funcion no molestar DND (Do not disturb)

Puede ser que en algn momento de nuestro da laboral no queremos ser molestados por las llamadas telefnicas. Al mismo tiempo, pero, queremos que quienes nos llaman tengan las posibilidad de dejarnos un mensaje en nuestro contestador. Para hacer todo eso podemos crear una macro en Asterisk que haga ese trabajo sucio.

Abrimos el archivo /etc/asterisk/extensions.conf

[macro-DND] exten => s,1,GotoIf(${DB_EXISTS(DND/${CALLERID(num)})}?disable-dnd,1) exten => s,n,Set(DB(DND/${CALLERID(num)})=1) exten => s,n,playback(do-not-disturb) exten => s,n,playback(activated) exten => s,n,hangup exten => disable-dnd,1,Set(DEL=${DB_DELETE(DND/${CALLERID(num)})}) exten => disable-dnd,n,playback(do-not-disturb) exten => disable-dnd,n,playback(de-activated) exten => disable-dnd,n,hangup

En la primera lnea controlamos si en la base de datos de Asterisk existe un valor asociado a la familia DND y nuestro numero de extensin (CALLERID). Si no existe lo creamos con la lnea 2 y le asignamos el valor 1. Luego usamos las voces de asterisk para anunciar que No disturbar ha sido activado. En el caso que el registro ya existe en la base de datos, el Gotoif nos llevar a la extensin disable-dnd, prioridad 1 donde borraremos el registro y anunciaremos que el No disturbar ha sido desactivado. En el mismo archivo dentro del contexto internal insertamos dos lneas ms

exten => 99,1,Macro(DND) exten => 99,n,Hangup

La primare enva el llamante a la macro con nombre DND (la que acabamos de explicar ms arriba). De esta forma podemos activar y desactivar el No disturbar llamando la extensin numero 99. Si el No disturbar est activado se desactivar de lo contrario se activar.

Ahora tenemos que decirle a Asterisk que para todas las llamadas entrantes haga este tipo de control.

Siempre en nuestro contexto internal aadimos las siguientes lneas

exten => _40XX,1,GotoIf(${DB_EXISTS(DND/${EXTEN})}?DND-ON) exten => _40XX,n,Dial(SIP/${EXTEN},20,t) exten => _40XX,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail) exten => _40XX,n(busy),Voicemail(${EXTEN}@default,b) exten => _40XX,n,hangup exten => _40XX,n(unavail),Voicemail(${EXTEN}@default,u) exten => _40XX,n,hangup exten => _40XX,n(DND-ON),Goto(${EXTEN},6)

Si el registro existe en la base de datos de asterisk (lnea 1) la llamada ser enviada a la extensin con etiqueta DND-ON, y de ah a la extensin _40XX prioridad 6. Esto significa que la llamada ser transferida al contestador y al llamante ser anunciado que la persona en la extensin XXXX no se encuentra disponible. Si el registro no existe se procesar la lnea dos y se llamar la extensin marcada. Luego segn est ocupada o en otra condicin, la llamada se enviar a la correspondiente parte del plan de llamadas.

FAX con IAXmodem y Hylafax

Vamos a empezar. Primero instalamos las libreras libtiff y libtool yum install libtiff libtiff-devel libtool

IAXmodem
IAXmodem es un modem software, escrito en C que utiliza un canal IAX (uno de los protocolos presentes en Asterisk) en lugar de una lnea telefnica y utiliza un DSP por software en lugar de un chip DSP (Digital Signal Processing). Descargamos las fuentes de iaxmodem: cd /usr/src wget http://switch.dl.sourceforge.net/sourceforge/iaxmodem/iaxmodem-1.2.0.tar.gz Descomprimimos el paquete tar -zxvf iaxmodem-1.2.0.tar.gz Entramos en la carpeta: cd iaxmodem-1.2.0 y compilamos: ./configure make

Copiamos el programa en la siguiente carpeta:

cp iaxmodem /usr/local/sbin

Creamos algunas carpetas indispensables para que IAXmodem funcione: mkdir /etc/iaxmodem mkdir /var/log/iaxmodem touch /var/log/iaxmodem/ttyIAX0 touch /var/log/iaxmodem/iaxmodem

Modificamos el archivo de configuracin predefinido presente con las fuentes:

vi iaxmodem-cfg.ttyIAX Esta es la configuracin con la cual funciona bien: device owner mode port refresh server peername secret cidname cidnumber codec /dev/ttyIAX uucp:uucp 660 4570 300 127.0.0.1 iaxmodem password VozToVoice XXXXXXXXXX ulaw

Esta configuracin es valida si tenemos instalado IAXmodem (ms que aconsejado) en el mismo computador donde est Asterisk. En el caso de dos computadores distintos tendrn que indicar en la lnea server la direccin IP del servidor Asterisk. Pongan su contrasea en secret y en cidname y cidnumber nombre y nmero telefnico que usar IAXmodem para presentarse a Asterisk. Podemos configurar cuantos IAXmodem queramos cambiando en la primera lnea el nombre del device y creando un archivo separado para cada uno. Ejemplo: ttyIAX2 ttyIAX3, etc

Guardamos las modificaciones y seguimos copiando el archivo en la carpeta /etc/iaxmodem que hemos creado:

cp iaxmodem-cfg.ttyIAX /etc/iaxmodem/ttyIAX

Ahora modificamos la configuracin de asterisk para insertar la nueva troncal IAX:

Vi /etc/asterisk/iax.conf [general] disallow=all allow=ulaw allow=g729 allow=gsm bindport=4569 bindaddr=0.0.0.0 language=es srvlookup=yes [iaxmodem] type=friend context=fax disallow=all allow=ulaw username=iaxmodem secret=password qualify=yes notransfer=yes host=dynamic

Guardamos las modificaciones y actualizamos la configuracin de asterisk entrando en la consola:: asterisk r Escribimos: CLI> iax2 relaod CLI> quit Ahora podemos hacer una prueba para ver si la conexin entre IAXmodem y Asterisk funciona: cd /usr/local/sbin ./iaxmodem ttyIAX Debera aparecer: [2009-06-08 [2009-06-08 [2009-06-08 [2009-06-08 [2009-06-08 [2009-06-08 [2009-06-08 [2009-06-08 [2009-06-08 [2009-06-08 [2009-06-08 [2009-06-08 [2009-06-08 [2009-06-08 12:03:39] 12:03:39] 12:03:39] 12:03:39] 12:03:39] 12:03:39] 12:03:39] 12:03:39] 12:03:39] 12:03:39] 12:03:39] 12:03:39] 12:03:39] 12:03:39] Modem started Setting device = '/dev/ttyIAX' Setting owner = 'uucp:uucp' Setting mode = '660' Setting port = 4570 Setting refresh = 300 Setting server = '127.0.0.1' Setting peername = 'iaxmodem' Setting secret = 'password' Setting cidname = 'VozToVoice Setting cidnumber = 'XXXXXXXXX' Setting codec = ulaw Opened pty, slave device: /dev/pts/4 Created /dev/ttyIAX symbolic link

Per pararlo presionamos CTRL-C [2009-06-08 12:03:45] Terminating on signal 2...

Antes de hacerlo controlamos que en la consola de Asterisk aparezca la conexin de IAXmodem (en otra ventana Terminal)

Listo. Ya tenemos parte del problema solucionado. Ahora instalamos el script presente en la carpeta de las fuentes de IAXmodem para que ste arranque al boot de Linux:

cd /usr/src/cd iaxmodem-1.2.0 mv iaxmodem.init.fedora /etc/init.d/iaxmodem Lo volvemos ejecutable: chmod +x /etc/init.d/iaxmodem Lo configuramos para el arranque automtico: chkconfig --add iaxmodem chkconfig iaxmodem on

lo ponemos a trabajar: /etc/init.d/iaxmodem start

Hylafax
Empecemos con Hylafax Antes que nada instalamos algunos paquetes (dependencias) requeridas por Hylafax: yum install ghostscript ghostscript-devel sharutils ghostscript-fonts En la pgina de Hylafax estn presentes los paquetes para las distintas distribuciones de Linux: Descargamos el paquete para Centos: wget http://yum.trixbox.org/centos/5/RPMS/hylafax-4.4.4-1rhel5.i386.rpm Lo instalamos: rpm -ivh hylafax-4.4.4-1rhel5.i386.rpm Aadimos el faxgetty al inittab (faxgetty es el programa que realmente contesta las llamadas) Vi /etc/inittab

Aadimos esta lnea: fax:2345:respawn:/usr/sbin/faxgetty ttyIAX

Guardamos los cambios y volvemos a arrancar inittab: init q Ahora podemos empezar con la configuracin de Hylafax (un poco larga pero necesaria). Presten particular atencin a las partes en negrita: faxsetup Update /var/spool/hylafax/status/any.info. HylaFAX configuration parameters are: [1] Init script starts faxq: [2] Init script starts hfaxd [3] Start old protocol: [4] Start paging protocol: Are these ok [yes]? Contestamos yes Modem support functions written to /var/spool/hylafax/etc/setup.modem. Configuration parameters written to /var/spool/hylafax/etc/setup.cache. No scheduler config file exists, creating one from scratch. Country code [1]? 57 Area code []? 1 Long distance dialing prefix [1]? 0 International dialing prefix [011]? 00 Dial string rules file (relative to /var/spool/hylafax) ["etc/dialrules"]? Tracing during normal server operation [1]? Default tracing during send and receive sessions [0xffffffff]? Continuation cover page (relative to /var/spool/hylafax) []? Timeout when converting PostScript documents (secs) [180]? Maximum number of concurrent jobs to a destination [1]? Define a group of modems []? Time of day restrictions for outbound jobs ["Any"]? Pathname of destination controls file (relative to /var/spool/hylafax) []? Timeout before purging a stale UUCP lock file (secs) [30]? Max number of pages to permit in an outbound job [0xffffffff]? Syslog facility name for ServerTracing messages [daemon]? yes yes no no

The non-default scheduler parameters are: CountryCode: AreaCode: LongDistancePrefix: InternationalPrefix: Are these ok [yes]? yes Creating new configuration file /var/spool/hylafax/etc/config... Restarting HylaFAX server processes. Should I restart the HylaFAX server processes [yes]? /etc/rc.d/init.d/hylafax start Starting HylaFAX queue manager (faxq): Starting HylaFAX server (hfaxd): Restarting HylaFAX modem manager (faxgetty): Do you want to run faxaddmodem to configure a modem [yes]? Serial port that modem is connected to []? ttyIAX [ [ [ OK OK OK ] ] ] 57 1 0 00

Ok, time to setup a configuration file for the modem. page config(5F) may be useful during this process.

The manual

Also be aware

that at any time you can safely interrupt this procedure. Reading scheduler config file /var/spool/hylafax/etc/config. No existing configuration, let's do this from scratch. Country code [1]? 57 Area code [415]? 1 Phone number of fax modem [+1.999.555.1212]? +571XXXXXXXX Local identification string (for TSI/CIG) ["NothingSetup"]? Long distance dialing prefix [1]? 0 International dialing prefix [011]? 00 Dial string rules file (relative to /var/spool/hylafax) [etc/dialrules]? Tracing during normal server operation [1]? Tracing during send and receive sessions [11]? Protection mode for received facsimile [0600]? Protection mode for session logs [0600]? Protection mode for ttyIAX [0600]?

Rings to wait before answering [1]? 2 Modem speaker volume [off]? Command line arguments to getty program ["-h %l dx_%s"]? Pathname of TSI access control list file (relative to /var/spool/hylafax) [""]? Pathname of Caller-ID access control list file (relative to /var/spool/hylafax) [""]? Tag line font file (relative to /var/spool/hylafax) [etc/lutRS18.pcf]? Tag line format string ["From %%l|%c|Page %%P of %%T"]? Time before purging a stale UUCP lock file (secs) [30]? Hold UUCP lockfile during inbound data calls [Yes]? Hold UUCP lockfile during inbound voice calls [Yes]? Percent good lines to accept during copy quality checking [95]? Max consecutive bad lines to accept during copy quality checking [5]? Max number of pages to accept in a received facsimile [25]? Syslog facility name for ServerTracing messages [daemon]? Set UID to 0 to manipulate CLOCAL [""]? Use available priority job scheduling mechanism [""]? CountryCode: AreaCode: FAXNumber: LongDistancePrefix: InternationalPrefix: DialStringRules: SessionTracing: RingsBeforeAnswer: SpeakerVolume: GettyArgs: LocalIdentifier: TagLineFont: TagLineFormat: MaxRecvPages: 57 1 +571XXXXXXXX 0 00 etc/dialrules 11 2 off "-h %l dx_%s" "NothingSetup" etc/lutRS18.pcf "From %%l|%c|Page %%P of %%T" 25

Are these ok [yes]? Now we are going to probe the tty port to figure out the type of modem that is attached. This takes a few seconds, so be patient.

Note that if you do not have the modem cabled to the port, or the modem is turned off, this may hang (just go and cable up the modem or turn it on, or whatever). Probing for best speed to talk to modem: 38400 OK. About fax classes: The difference between fax classes has to do with how HylaFAX interacts with the modem and the fax protocol features that are used when sending or receiving faxes. One class isn't inherently better than another;

however, one probably will suit a user's needs better than others. Class 1 relies on HylaFAX to perform the bulk of the fax protocol. Class 2 relies on the modem to perform the bulk of the fax protocol. Class 2.0 is similar to Class 2 but may include more features. Class 1.0 is similar to Class 1 but may add V.34-fax capability. Class 2.1 is similar to Class 2.0 but adds V.34-fax capability. HylaFAX generally will have more features when using Class 1/1.0 than when using most modems' Class 2 or Class 2.0 implementations. Generally

any problems encountered in Class 1/1.0 can be resolved by modifications to HylaFAX, but usually any problems encountered in Class 2/2.0/2.1 will require the modem manufacturer to resolve it. Use Class 1 unless you have a good reason not to. This modem looks to have support for Class 1 and 1.0. How should it be configured [1]? Hmm, this looks like a Class 1 modem. Product code (ATI0) is "spandsp". Other information (ATI3) is "www.soft-switch.org". DTE-DCE flow control scheme [default]? Modem manufacturer is "spandsp". Modem model is "IAXmodem".

Using prototype configuration file iaxmodem... The modem configuration parameters are: ModemResetCmds: Are these ok [yes]? Creating new configuration file /var/spool/hylafax/etc/config.ttyIAX... Done setting up the modem configuration. Checking /var/spool/hylafax/etc/config for consistency... ...some parameters are different. The non-default scheduler parameters are: CountryCode: AreaCode: LongDistancePrefix: InternationalPrefix: DialStringRules: Are these ok [yes]? Creating new configuration file /var/spool/hylafax/etc/config... ...saving current file as /var/spool/hylafax/etc/config.sav. Don't forget to run faxmodem(8C) (if you have a send-only environment) or configure init to run faxgetty on ttyIAX. Do you want to run faxaddmodem to configure another modem [yes]? no Looks like you have some faxgetty processes running (PIDs are): 13236 It is usually a good idea to restart these processes after running faxsetup; especially if have just installed new software. If these 57 1 0 00 etc/dialrules "ATH1\nAT+VCID=1"

processes are being started by init(8C) then sending each of them a QUIT message with the faxquit command should cause them to be restarted. Is it ok to send a QUIT command to each process [yes]?

/usr/sbin/faxquit ttyIAX

/etc/init.d/hylafax restart Shutting down HylaFAX queue manager (faxq): Shutting down HylaFAX server (hfaxd): Starting HylaFAX queue manager (faxq): Starting HylaFAX server (hfaxd): Restarting HylaFAX modem manager (faxgetty): [ [ [ [ [ OK OK OK OK OK ] ] ] ] ]

Todos los archivos de configuracin que se crearan a lo largo del proceso de seteo de Hylafax los encontraremos en la carpeta /var/spool/hylafax/etc y en cualquier momento (si tenemos problemas) lo podemos modificar.

Prueba

Editamos el archivo extensions.conf y agregamos lo siguiente.

[from-pstn] exten => s,1,Answer exten => s,2,Dial(IAX/iaxmodem)

He guardado los cambios y reiniciado Asterisk /etc/init.d/asterisk restart

FaxMaster el usuario predefinido que Hylafax usa para enviar el fax al correo electrnico. Si quieren pueden cambiarlo modificando el archivo FaxDispatch que encuentran en la carpeta /var/spool/hylafax/etc Si quieren recibir el mensaje con el texto en espaol siempre en el mismo archivo aaden esta lnea: TEMPLATE=es Para el envo de los faxes: Crear en extension.conf un contexto [fax] (El mismo que hemos configurado para la troncal iaxmodem en iax.conf) con las siguientes lneas: [fax] exten => _X.,1,Dial(ZAP/g0/${EXTEN}) exten => _X.,n,Hangup

Actualizan el dialplan: /etc/init.d/asterisk reload

Desde el terminal de Linux escriben:

sendfax -n -d <faxnumber> <file.txt>

Ejemplo: sendfax n d 4834000 /tmp/documento.pdf que es todo.

Instalar y configurar AvantFAX - FAX va WEB

En un precedente articulo hemos visto como configurar iaxmoden y hylafax asterisk 1.4 Si se acuerdan bien el envi de los faxes era algo incomodo que usar un comando desde el prompt de Linux. Afortunadamente instalando todo se resuelve. Avantfax es una aplicacin WEB para gestionar el envo recepcin de faxes que se apoya a Hylafax. Esto evita tener instalado un web para hylafax (tipo Winprint Hylafax) en cada computador.

para (haba Avantfax y cliente

Desde cualquier parte del mundo podremos entrar en la pgina WEB de nuestro Avantfax y enviar nuestros faxes o revisar los faxes recibidos. Gracias a la posibilidad de configurar distintos usuarios podemos tambin definir, para cada uno de ellos, categoras y permisos de acceso a la parte hardware (los faxes) y al archivos de los faxes enviados/recibidos.

La configuracin es bastante sencilla. De hecho la ultima versin de Avantfax viene con uno script de auto instalacin para Centos.

Vamos a empezar descargando el programa:

wget http://switch.dl.sourceforge.net/sourceforge/avantfax/avantfax-3.1.6.tgz

Lo descomprimimos: tar xf avantfax-3.1.6.tgz

Entramos en la carpeta: cd avantfax-3.1.6 Y primero modificamos este archivo: vi rh-prefs.txt Tenemos que modificar las lneas en negrita: # El nombre del dominio que usaremos para entrar a la pagina de administracin de Avantfax

FAXDOMAIN=fax.miodominio.org # La carpeta donde vamos a instalar avantax (accesible desde Apache)

INSTDIR=/var/www/html/avantfax # La carpeta donde tenemos instalado Hylafax

HYLADIR=/usr # La carpeta donde tenemos la configuracin y los registros de Hylafax

SPOOL=/var/spool/hylafax # Usuario, contrasea y nombre de la base de datos donde vamos a guardar las tablas y los datos de Avantfax

USER=avantfax PASS=contrasea DB=avantfax # La contrasea del usuario root para MySQL (necesaria para que lo script pueda crear la base de datos y las dems configuraciones en MySQL)

ROOTMYSQLPWD=contrasea # Nombre de usuario y grupo que usa Apache (encuentran estos datos en el archivo /etc/httpd/conf/httpd.conf

HTTPDUSER=apache HTTPDGROUP=apache Guardamos los cambios y ya podemos arrancar el script ./rh-install.sh

Creamos el directorio publico para apache.

Mkdir p /var/www/html/avantfax

Copiamos el contenido. cp Rf /usr/src/avantfax-3.1.6/avantfax /var/www/html/avantfax

Una vez terminado ya podemos entrar a la pagina de administracin de Avantfax a la direccin que hemos indicado en la variable FAXDOMAIN En el ejemplo presentado en esta gua seria: http://fax.miodominio.org/admin

Si les aparece esta pagina:

Hay un problema con la base de datos. Tenemos que revisar este archivo de configuracin: Vi /var/www/html/avantfax/includes/local_config.php

Y revisar bien estas lneas para que correspondan a la configuracin de la base de datos MySQL que hemos definido en el archivo rh-prefs.txt: define('AFDB_USER', define('AFDB_PASS', define('AFDB_NAME', define('AFDB_ENGINE', define('AFDB_HOST', 'avantfax'); // username 'contrasea'); // password 'avantfax'); // database name 'mysql'); // database engine: mysql 'localhost'); // database host

Guardamos los cambios y volvemos a entrar a la pgina web de Avantfax. Deberamos encontrarnos con esta imagen:

Para entrar ponemos como username admin y como contrasea password. La primera vez que nos conectamos tendremos que cambiar la contrasea y, si queremos, rellenar un formulario con los datos personales. Una vez adentro este es el men que encontraremos

Como pueden ver todos mis faxes estn configurados con IAXmodem y directamente conectados a Asterisk. Cuando est entrando un fax aparecer:

Discado automtico

Archivos .call

Se utilizan para iniciar llamadas desde una aplicacin externa. Son archivos de texto que al copiarse en el directorio /var/spool/asterisk/outgoing Asterisk notar su presencia e inmediatamente activar la extensin en la prioridad especificada en el archivo .call. Generalmente, se combinan con el programador de tareas de Linux: el cron. Algunos ejemplos de uso son: soluciones de callback, despertador telefnico, anuncios automticos.

Ejemplo: En el siguiente ejemplo: se llama al 4844000 en el canal Zap/g1/ y enva la llamada al contexto [mensajes-salida], extensin 84, Prioridad 1: Archivo mensaje.call Channel: Zap/g1/43424444 MaxRetries: 2 RetryTime: 60 WaitTime: 30 Context: mensajes-salida Extension: 84 Priority: 1

extensions.conf [mensajes-salida] exten => 84,1,Playback(anuncio) exten => 84,2,Playback(vm-goodbye) exten => 84,3,Hangup

AGI

La AGI (o Asterisk Gateway Interface) provee una interfaz estndar para que programas externos puedan controlar el plan de marcacin. Generalmente, los scripts AGI se utilizan para realizar lgica avanzada, comunicarse con base de datos relacionales, etc. Los lenguajes ms comunes de programacin de scripts AGI son: PHP, Python y Perl, aunque se puede utilizar cualquier otro lenguaje. El intercambio de informacin del script con Asterisk se realiza va los canales de comunicacin: STDIN, STDOUT y STDERR. Lee desde STDIN para obtener informacin. Escribe en STDOUT para enviar informacin. Escribe en STDERR para enviar informacin de debugging. El script AGI enva comandos a Asterisk escribiendo en el STDOUT. Seguidamente Asterisk enva una respuesta por cada uno de ellos que es leda por el script Algunos ejemplos de comandos son: ANSWER: atiende. HANGUP: cuelga. SAY [NUMBER | DIGITS | ALPHA | PHONETICS]: dice un nmero, dgito, caracter o una cadena fonticamente. SET [CONTEXT | EXTENSION | PRIORITY]: establece un nuevo contexto, extensin o prioridad luego de finalizada la ejecucin de script. VERBOSE: imprime un mensaje en el log. WAIT FOR DIGIT: espera que se presione un dgito. [SET | GET] VARIABLE: asigna u obtiene el valor de una variable del plan de marcacin.

El programa debe: Tener derechos de ejecucin y presentar un Ej chmod 755 mi_cript.php Ser localizado por defecto en /var/lib/asterisk/agi-bin intrprete vlido

Cmo llamar al script desde el dialplan: exten => 123,1,Answer() exten => 123,2,AGI(mi_script.php|argumentos)

AGI: ejemplo en PHP

El siguiente script est escrito en PHP y dicta los nmeros que se encuentran en el archivo que se le pasa como parmetro

#!/usr/bin/php q <?php // Esta lnea es para que que haga no mantenga en un buffer el output ob_implicit_flush(true); set_time_limit(6); error_reporting(0);

// Se abren los diferentes archivos (STDIN, STDOUT y un archivo de log del AGI) $in = fopen("php://stdin","r"); $out = fopen("php://stdout","w"); $stdlog = fopen("/var/log/asterisk/my_agi.log", "w");

// Si debug es true, escribe en el archivo de log definido anteriormente $debug = true; // Toma el nombre del archivo con los nmeros a dictar del primer parmetro $archivo = $argv[1];

// Define la funcion read, que lee el input del STDIN function read() { global $in, $debug, $stdlog; $input = str_replace("\n", "", fgets($in, 4096)); if ($debug) fputs($stdlog, "read: $input\n"); return $input; }

// Define la funcion write, que escribe el output en el STDOUT function write($line) { global $debug, $stdlog, $out; if ($debug) fputs($stdlog, "write: $line\n"); fputs($out,$line."\n"); fflush($out); } // Lee el archivo que se paso como parametro $lines = file($archivo);

// Reproduce los digitos contenidos en cada linea del mismo // informando en el log del Asterisk la accion realizada foreach ($lines as $line) { $line=trim($line); for ($i=0;$i<strlen($line);$i++) { write("VERBOSE \"REPRODUCIENDO DIGITO $line[$i]\""); read(); write("SAY DIGITS $line[$i] \"\""); read(); sleep(1); } } // Se cierran todos los handlers de archivos fclose($in); fclose($out); fclose($stdlog); exit; ?>

Por ejemplo, si se quiere asociar el script a la extensin 200, se debe agregar al dialplan:

exten => 200,1,Answer(); exten => 200,2,AGI(dicta.php|/tmp/numeros.txt) exten => 200,3,Hangup()

Despertador para Asterisk

Configurar un despertador en asterisk para que nos llame a la hora que queremos es ms sencillo de lo que parezca. Todo se basa en un programa en lenguaje PHP y el uso de la aplicacin AGI de Asterisk (Asterisk Gateway Interface). AGI es una interfaz que sirve para aadir funcionalidades a la centralita usando distintos lenguajes de programacin (perl, php, c, etc...).

cd /usr/src wget http://qod.com/wakeup.2.0.tar Lo descomprimimos tar -xf wakeup.2.0.tar Entramos en la carpeta cd wakeup.2.0 Volvemos ejecutable el archivo wakeup.php chmod a+x wakeup.php Y lo copiamos en la carpeta agi-bin de asterisk cp wakeup.php /var/lib/asterisk/agi-bin/ Ahora tenemos que modificar el archivo extensions.conf para crear una nueva extensin que llamaremos para programar nuestro despertador Vi /etc/asterisk/extensions.conf

Aadimos las siguientes dos lneas en nuestro contexto local exten => 77,1,agi(wakeup.php) exten => 77,n,Hangup Guardamos el archivo y reiniciamos asterisk /etc/init.d/asterisk reload Ahora desde una extensin marcamos el numero 77 y seguimos las instrucciones para programar nuestro despertador.

ASTERISK MANAGER API

Permite a una aplicacin cliente conectarse a una instancia de Asterisk va TCP/IP y ejecutar comandos o leer eventos. Generalmente, se utiliza el puerto 5038. Utiliza un protocolo en modo texto que consiste en lneas de tipo "clave: valor". Conjunto de lneas: paquete.

PROTOCOLO 1) Se debe establecer una sesin con el manager antes de ejecutar comandos. 2) Los paquetes pueden ser transmitidos en ambas direcciones. 3) El orden de las lneas dentro del paquete es indistinto. 4) Las lneas se delimitan con CRLF y una lnea en blanco (2 CRLF consecutivos) indica el final del paquete

TIPOS DE PAQUETE El tipo de paquete est dado por las siguientes claves: Action: paquete originado en el cliente requiriendo llevar a cabo una accin particular. Contiene el nombre de la accin y los parmetros de la misma. Response: la respuesta del Asterisk a la Accin requerida por el cliente. Event: datos correspondientes a un evento generado dentro del ncleo de Asterisk o mdulo.

AUTENTICACIN

Las cuentas de usuario se configuran en /etc/asterisk/manager.conf. Por Ej.: [general] enabled=yes

[admin] secret = claveadmin deny=0.0.0.0/0.0.0.0 permit=127.0.0.1/255.255.255.0 read = system,call,log,verbose,command,agent,user write = system,call,log,verbose,command,agent,user

En este caso, "admin" es el nombre de usuario, la clave es "claveadmin" y slo se permiten conexiones para este usuario va localhost. El resto de las lneas establecen permisos (r,w,r/w) para cada clase (system, call, etc.).

CONEXIN

Enviar un mensaje con accin "Login", junto con el usuario y la clave como parmetros. Por Ej.:

Action: login Username: admin Secret: adminclave Events: off

(La ltima lnea indica que la conexin no recibir eventos por parte del Asterisk.)

Se recibir por parte del servidor

Asterisk Call Manager/1.0 Response: Success Message: Authentication accepted

O, en caso de error:

Asterisk Call Manager/1.0 Response: Error Message: Authentication failed

PAQUETES ACTION Se pueden proveer parmetros adicionales (por ej, un nmero a llamar o canal a desconectar). En el caso que la accin determine la ejecucin de una entrada del plan de marcacin, tambin se pueden proveer variables.

Formato: Action: <action type><CRLF> <Key 1>: <Value 1><CRLF> <Key 2>: <Value 2><CRLF> ... Variable: <Variable 1>=<Value 1><CRLF> Variable: <Variable 2>=<Value 2><CRLF> ... <CRLF>

Algunos ejemplos de acciones

Command: ejecuta un comando (por ej, reload) (privilege: command,all) Events: controla el flujo de los eventos Hangup: colgar canal (privilege: call,all) IAXpeers: lista los peers IAX (privilege: system,all) ListCommands: lista los comando disponibles del manager Logoff: logoff del manager MailboxCount: verifica la cantidad de mensajes en el mailbox (privilege: call,all) MailboxStatus: verifica el status del mailbox (privilege: call,all) Originate: origina llamada (privilege: call,all) ParkedCalls: lista las parked calls

Algunos ejemplos de acciones (cont.)

QueueAdd: agrega un miembro a la cola (privilege: agent,all) QueueRemove: remueve un miembro de la cola (privilege: agent,all) SIPpeers: lista los peers SIP (privilege: system,all) Status: Status (privilege: call,all)

ZapHangup: cuelga un canal Zap ZapTransfer: transfiere un canal Zap ZapShowChannels: muestras los canales Zap

(ser recomendable meternos con esto?)

EJEMPLO LLAMADA

El cliente enva: ACTION: Originate Channel: SIP/12345 Exten: 1234 Priority: 1 Context: default

El cliente recibe, en caso de xito: Event: Newchannel Channel: SIP/12345-ed8f State: Down CallerID: Uniqueid: 1124982019.19157

El cliente recibe, en caso de xito (cont):

Event: Newchannel Channel: SIP/12345-ed8f State: Ringing CallerID: Uniqueid: 1124982019.19157 Event: Newstate Channel: SIP/12345-ed8f State: Up CallerID: Uniqueid: 1124982019.19157

El cliente recibe, en caso de xito (cont): Event: Newexten Channel: SIP/12345-ed8f Context: default Extension: 1234 Priority: 1 Application: SetVar AppData: extension=1234 Uniqueid: 1124982019.19157

Response: Success Message: Originate successfully queued

El cliente recibe, en caso de error:

Event: Newexten Channel: OutgoingSpoolFailed Context: default Extension: failed Priority: 1 Application: SetVar AppData: extension=failed Uniqueid: 1124981514.58775

El cliente recibe, en caso de error (cont):

Event: Hangup Channel: OutgoingSpoolFailed Uniqueid: 1124981514.58775 Cause: 0

Response: Error Message: Originate failed

PROBLEMAS

La documentacin sobre el protocolo y la funcionalidad del manager est incompleta.

Tiene problemas con el manejo de varias conexiones a la vez ( > 5).

Es recomendada la utilizacin de un Proxy (por, ej ProxyAstMan), para sistemas que hagan un uso intensivo del manager, comp pueden ser sistemas de monitoreo y campaa telefnica.

Asterisk con alta disponibilidad

Este tipo de configuracin se implementa en centrales IP donde queremos brindar una alta disponibilidad. Inicialmente necesitamos dos servidores que tengan asterisk instalado. La herramienta a utilizar es heartbeat en su versin 2.1.3, utilizaremos el heartbeat para sensar el servicio del asterisk en ambos servidores, y si se cae alguno de ellos el otro tomara su lugar, como maestro y esclavo, si cae el maestro, el esclavo toma su lugar, y si se levanta el maestro nuevamente lleva el mando. Estamos usando Centos 4.7, instalamos en ambos servidores el heartbeat.

yum y install heartbeat Para este ejemplo el asterisk principal tiene el hostname lcla.com y el backup lclabk.com Para todas las configuraciones necesitamos este parmetro as que asegrense de poner el nombre de hostname la respuesta al comando

uname n

[root@lcla /]# uname n

lcla.com [root@lclabk /]# uname n

lclabk.com

Ahora debemos de modificar el archivo /etc/hosts de la siguiente forma, En lcla.com : [root@lclabk /]# cat /etc/hosts

127.0.0.1 lclabk.com lclabk localhost.localdomain localhost 192.168.254.204 lcla.com lcla 192.168.254.202 lclabk.com lclabk

En lcla backup .com

[root@lclabk /]# cat /etc/hosts

127.0.0.1 lclabk.com lclabk localhost.localdomain localhost 192.168.254.204 lcla.com lcla 192.168.254.202 lclabk.com lclabk

Notemos que el servidor maestro tiene la ip 192.168.254.204 y el esclavo la ip 192.168.254.202.

Ahora empezamos a configurar en el maestro, copiemos los siguientes archivos

cp /usr/share/doc/heartbeat-2.1.3/authkeys /etc/ha.d/ cp /usr/share/doc/heartbeat-2.1.3/ha.cf /etc/ha.d/ cp /usr/share/doc/heartbeat-2.1.3/haresources /etc/ha.d/ luego editamos el archivo vi /etc/ha.d/authkeys

auth 2 2 sha1 mipass Cambiamos los permisos en el archivo authkeys :

chmod 600 /etc/ha.d/authkeys Editemos el archivo ha.cf el cual es muy importante

vi /etc/ha.d/ha.cf Agreguemos las siguientes lineas: logfile /var/log/ha-log logfacility local0 keepalive 2 deadtime 30 initdead 120 bcast eth0 udpport 694 auto_failback on node lcla.com node lclabk.com

La parte final de la configuracin del hearbeat es seleccionando los demonios que queremos que esten en alta disponibilidad, para nosotros asterisk

vi /etc/ha.d/haresources Agreguemos la siguiente lnea

lcla.com IPaddr::192.168.254.200/24/eth0 asterisk Notemos que estamos poniendo la IP 192.168.254.200, esta nos servira como una ip virtual, que sera utilizada para la comunicacin de asterisk, ya sea con los anexos sip iax, u otra comunicacin voip que realice con asterisk. Finalmente debemos de copiar los archivos de configuracin del heartbeat del maestro al esclavo scp -r /etc/ha.d/ root@192.168.254.202:/etc/ y con ello ya tenemos listo. Para que siempre se inicie el heartbeat al prender el servidor agregamos en ambos chkconfig heartbeat on Reiniciamos el servicio en ambos servidores. service heartbeat restart Si no te tomaron bien los hostname, revisa todos los archivos donde se declara el hostname, que son bsicamente tres

/etc/hosts /etc/sysconfig/network /etc/sysconfig/network-scripts/ifcfg-eth0

Si tienes algn problema prueba reiniciando tus servidores, para que te tome bien el hostname.

Si todo esta bien, entonces desde otra maquina prueba haciendo ping a la ip virtual 192.168.254.200, y en el maestro debers tener ambas ip. [root@lcla /]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:7D:E2:3E inet addr:192.168.254.204 Bcast:192.168.254.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe7d:e23e/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:16653 errors:0 dropped:0 overruns:0 frame:0 TX packets:14789 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2564095 (2.4 MiB) TX bytes:3349104 (3.1 MiB) Interrupt:177 Base address:0x1400 eth0:0 Link encap:Ethernet HWaddr 00:0C:29:7D:E2:3E inet addr:192.168.254.200 Bcast:192.168.254.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:177 Base address:0x1400 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:1283 errors:0 dropped:0 overruns:0 frame:0 TX packets:1283 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:148184 (144.7 KiB) TX bytes:148184 (144.7 KiB)

Luego de lograr la alta disponibilidad del demonio del Asterisk, necesitamos sincronizar los archivos de configuracin, de esta manera al realizar algn cambio en la configuracin del Asterisk principal, este replique en la configuracin del Asterisk backup.

Podramos hacerlo simplemente con un script que ejecute un scp peridicamente y copie los archivos del /etc/asterisk, pero esto no es muy eficiente. Puesto que podemos utilizar el rsync que es un programa que ofrece transmisin eficiente de datos incrementales comprimidos y cifrados, el algoritmo compara los checksum de manera eficiente, y cuando no encuentra coincidencias, enva los cambios e informacin de cmo reensamblarlos, de esta forma solo se copian los nuevos cambios.

El script que ejecuta el rsync, es necesario ponerle el password, luego colocar el script en el crontab para que se ejecute peridicamente.

[root@lcla ~]# cat /sbin/syncdata.bash

#!/usr/bin/expect -f spawn rsync -raz --progress --size-only /etc/asterisk/ 192.168.254.202:/etc/asterisk/ match_max 100000 # Look for passwod prompt expect "*?assword:*" send -- "123456" # send blank line (\r) to make sure we get back to gui send -- "\r" expect eof

[root@lcla ~]# crontab e

*/1 * * * * /sbin/syncdata.bash Bueno todo esto se hace posible con el [root@lcla ~]# rpm -q rsync rsync

rsync-2.6.3-1

Ahora que tenemos alta disponibilidad del demonio del Asterisk, la sincronizacin de los archivos de configuracin entre la central principal y la de backup. Ello nos sirve para un escenario donde solo necesitamos un Asterisk con configuracin a mano. Sin embargo Freepbx entre otros software de administracin, manejan algunas parmetros con base de datos, en el caso de realtime por ejemplo. Adems el cdr podemos estar guardndolo en una base de datos tambin. Por tanto necesitamos tener un backup de la base de datos en cuestin de la central principal en la de backup. Para esta labor vamos a utilizar replicacin de base de datos en mysql. De esta manera, se replicaran los nuevos registros hechos en la base de datos de la central principal, en la central de backup. Por ello para no generar incoherencias, debemos hacer un backup de la base de datos de la central principal y restaurarlo en la base de datos de la central de backup, antes de configurar la replicacin.

Paso 1: Master: 192.168.254.204 Slave: 192.168.254.202 Paso 2: En el Master, realizar los cambios en el archivo my.cnf:

[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock old_passwords=1 log-bin binlog-do-db= # input the database which should be replicated binlog-ignore-db=mysql # input the database that should be ignored for replication binlog-ignore-db=test server-id=1 [mysql.server] user=mysql basedir=/var/lib

[mysqld_safe] err-log=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid

Paso 3:

En el master, crear una cuenta de replicacin para el esclavo en mysql.

mysql> grant replication slave on *.* to 'replication'@192.168.254.202 identified by 'slave';

luego reiniciar el servicio de mysql en el master. Paso 4:

Ahora editar el archivo my.cnf en el Slave:

[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock old_passwords=1 server-id=2 master-host = 192.168.254.204 master-user = replication master-password = slave master-port = 3306 [mysql.server] user=mysql basedir=/var/lib [mysqld_safe] err-log=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid

Paso 5:

Reiniciar el servicio de mysql en el slave y luego

mysql> start slave;

mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.254.204 Master_User: replica Master_Port: 3306 Connect_Retry: 60 Master_Log_File: MASTERMYSQL01-bin.000009 Read_Master_Log_Pos: 4 Relay_Log_File: MASTERMYSQL02-relay-bin.000015 Relay_Log_Pos: 3630 Relay_Master_Log_File: MASTERMYSQL01-bin.000009 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 4 Relay_Log_Space: 3630 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 1519187 1 row in set (0.00 sec) Slave_IO_Running y Slave_SQL_Running: deben estar en YES. Paso 6:

En el master:

mysql> show master status; +------------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------------+----------+--------------+------------------+ |MysqlMYSQL01-bin.000008 | 410 | asterisk | | +------------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)

Y ahora esta listo, debemos hacer pruebas ingresando datos, en la base de datos principal y observar como estos se reflejan en la central de backup.

Registro de llamadas (CDR Call Detail Record)


Asterisk permite llevar un control exhaustivo de todas las llamadas que se han realizado o recibido. Es interesante para control propio de facturacin, independiente del proveedor (si no se es uno de ellos). Permite realizar estadsticas. Este control se denomina CDR: Call Detail Record.

El registro del CDR se escribe por defecto en el archivo /var/log/asterisk/cdr-csv/Master.csv Existen extensiones al cdr: cdr_mysql por ejemplo, que permiten almacenar los registros en una base de datos. cdr_mysql est disponible en asterisk-addons El CDR se configura en el archivo cdr.conf, para el mdulo de MySQL, se utiliza cdr_mysql.conf Para confirmar el estado del CDR desde el CLI, se puede ejecutar: CLI> cdr status

Asterisk genera un CDR (registro) para cada llamada. Algunos de los campos ms importantes son: 1. accountcode: cdigo de la cuenta a utilizar. 2. src: nmero del caller ID. 3. dst: extensin destino. 4. dcontext: contexto destino. 5. start: comienzo de la llamada (fecha/hora). 6. answer: respuesta de la llamada (fecha/hora). 7. end: fin de la llamada (fecha/hora). 8. duration: duracin de la llamada en segundos, desde que fue 9. discada hasta el corte. 10. billsec: duracin de la llamada en segundos, desde que fue atendida hasta el corte. 11. disposition: estado de la llamada (atendida, no atentendida, ocupado, fallida).

Existen muchas aplicaciones que permite gestionar el CDR. Desarrollar una propia no es realmente muy complejo. Algunas aplicaciones open source son: Astbill: es una de las mejores aplicaciones opensource para tarificacin, control de cuentas y llamadas. Areski Stat v2: se trata de una aplicacin para listar y realizar estadsticas de las llamadas realizas o enviadas. A2Billing: Se usa para tarificacin prepago.

Creamos la base de datos en mysql mysql -u root mysql> create database asteriskcdrdb; Creamos un usuario y le damos privilegios para asteriskcdrdb mysql> grant all privileges on asteriskcdrdb.* to asteriskcdruser@localhost identified by '1234'; Ahora creamos la tabla mysql> use asteriskcdrdb; mysql> CREATE TABLE cdr (calldate datetime NOT NULL default '0000-00-00 00: 00:00', clid varchar(80) NOT NULL default '', src varchar(80) NOT NULL defa ult '', dst varchar(80) NOT NULL default '', dcontext varchar(80) NOT NULL default '', channel varchar(80) NOT NULL default '', dstchannel varchar(80) NOT NULL default '', lastapp varchar(80) NOT NULL default '', lastdata varchar(80) NOT NULL default '', duration int(11) NOT NULL default '0', billsec int(11) NOT NULL default '0', disposition varchar(45) NOT NULL defa ult '', amaflags int(11) NOT NULL default '0', accountcode varchar(20) NOT NULL default '', uniqueid varchar(32) NOT NULL default '', userfield varcha r(255) NOT NULL default '' ); mysql> exit Nos vamos al archivo de configuracin cd /etc/asterisk Editamos el archivo de configuracin cdr_mysql.conf vi cdr_mysql.conf [global] hostname=localhost dbname=asteriskcdrdb table=cdr password=1234 user=asteriskcdruser port=3306 sock=/tmp/mysql.sock userfield=1

Cargamos el Modulo Vi modules.conf

load => cdr_addon_mysql.so #lo agregamos al final del archivo Le damos reload al asterisk asterisk -r *CLI> reload *CLI> cdr mysql status Connected to asteriskcdr@localhost, port 3306 using table cdr for 1 days, 22 hours, 58 minutes, 55 seconds. Wrote 16587 records since last restart. Agregando el Unique ID Cd /usr/src/asterisk-addons Vi Makefile Agregar la linea : Guardar los cambios Editar el archivo cdr_addon_mysql.c Agregar la siguiente definicin. #define MYSQL_LOGUNIQUEID ASTCFLAGS+=-DMYSQL_LOGUNIQUEID

Asterisk - MP3 y msica en espera


Creamos una carpeta nueva mkdir /var/lib/asterisk/mohmp3 Ahora copiamos un archivo mp3 en la carpeta creada scp fichero.mp3 root@miodominio:/var/lib/asterisk/mohmp3 Una vez que tengamos nuestro Archivo MP3 en el servidor tenemos que abrir el archivo de texto musiconhold.conf y aadir unas lneas. Vi /etc/asterisk/musiconhold.conf y copiamos las lneas [mp3] mode=files directory=/var/lib/asterisk/mohmp3 random=yes Volvemos a la consola de Asterisk. asterisk -r Y desde la lnea de comando. *CLI> moh reload *CLI> moh show classes Aparecer algo parecido

Class: mp3 Mode: files Directory: /var/lib/asterisk/mohmp3 Use Count: 0 Class: default> Mode: files Directory: /var/lib/asterisk/moh Use Count: 0

Acurdense que usando los archivos MP3 se usaran bastantes recursos del servidor. Si queremos podemos bajar la frecuencia de sampling de los archivo MP3 con sox. Ejemplo sox fichero.mp3 -c 1 -r 8000 fichero1.mp3 -c 1 pasamos el archivo de estereo a mono (un canal) - r 8000 frecuencia de sampling de 44100 Hz a 8000 hz fichero1.mp3 - el resultado del sampling

Instalar FreePBX en CentOS

Instalar asterisk

Instalar libpri, zaptel, asterisk, asterisk-addons 2. Deshabilitar SeLinux

echo "selinux=disabled" > /etc/selinux/config

init 6 3.Instalar paquetes necesarios para FreePBX yum install e2fsprogs-devel keyutils-libs-devel krb5-devel libogg libselinuxdevel libsepol-devel libxml2-devel libtiff-devel gmp php-pear php-pear-DB php-gd php-mysql php-pdo ncurses-devel audiofile-devel libogg-devel mysql-devel zlibdevel perl-DateManip sendmail-cf kernel-devel openssl-devel httpd sox spandsp mpg123 4.Instalar lame

wget http://easynews.dl.sourceforge.net/sourceforge/lame/lame-3.97.tar.gz tar zxvf lame-3.97.tar.gz

cd lame-3.97 ./configure make make install

5.Descargar FreePBX wget http://mirror.freepbx.org/freepbx.tar.gz 6.Instalar BD para FreePBX (mysql sin password) cd /usr/src/freepbx mysqladmin create asterisk mysqladmin create asteriskcdrdb mysql asterisk < SQL/newinstall.sql mysql asteriskcdrdb < SQL/cdr_mysql_table.sql mysql GRANT ALL PRIVILEGES ON asteriskcdrdb.* TO asteriskuser@localhost IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON asterisk.* TO asteriskuser@localhost IDENTIFIED BY 'password';

flush privileges;

//Colocar una clave al usuario root de mysql

mysqladmin -u root password 'password' 7.Instalar BD para FreePBX (mysql con password)

mysqladmin create asteriskcdrdb p mysql --user root -p asteriskcdrdb < /usr/src/freepbx/SQL/cdr_mysql_table.sql mysqladmin create asterisk p mysql --user root -p asterisk < /usr/src/freepbx/SQL/newinstall.sql mysql -u root p GRANT ALL PRIVILEGES ON asteriskcdrdb.* TO asteriskuser@localhost IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON asterisk.* TO asteriskuser@localhost IDENTIFIED BY 'password'; flush privileges; 8.Cambios en el Sistema Linux useradd -c "Asterisk PBX" -d /var/lib/asterisk asterisk //Cambiar el usuario y grupo apache por vi +231 /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf o usuario y grupo asterisk sed -i "s/User apache/User asterisk/"

//Cambiar

AllowOverride None

AllowOverride All o sed -i "s/Group apache/Group asterisk/"

vi +329 /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf 9.Instalar FreePBX pear install db cd /usr/src/freepbx ./start_asterisk start

./install_amp --username=asterisk --password=password echo "/usr/local/sbin/amportal start" >> /etc/rc.local chkconfig httpd on chkconfig mysqld on

10.Solucionar Problemas de Flash Operator Panel wget http://www.asternic.org/files/op_panel-0.29.tar.gz tar xvfz op_panel-0.29.tar.gz cd op_panel-0.29 cp op_server.pl /var/www/html/panel/ cp flash/operator_panel.swf /var/www/html/panel/ //En el archivo op_server.cfg: [general] use_amportal_conf=1 //usuario y clave similar al registrado en el archivo /etc/asterisk/manager.conf manager_user=admin manager_secret=password 11. Solucionar Password de ARI: vi /var/www/html/recordings/includes/main.conf.php $ari_admin_password = "password"; 12. Configurar Sendmail: vi /etc/mail/sendmail.mc define(`SMART_HOST', `relay.DOMAIN.com)dnl MASQUERADE_AS(`pbx.DOMAIN.com')dnl FEATURE(`masquerade_envelope')dnl make -C /etc/mail

13. Editar sip_nat.conf para NAT: vi /etc/asterisk/sip_nat.conf localnet=192.168.1.0/255.255.255.0 externhost=pbx.DOMAIN.com externrefresh=10 fromdomain=DOMAIN.com externip=ipPublica nat=yes qualify=yes canreinvite=no 14. Aadir extra codecs a la configuracion: vi /etc/asterisk/sip_custom.conf allow=gsm allow=h261 allow=h263 allow=h263p videosupport=yes vi /etc/asterisk/iax_custom.conf allow=gsm allow=h261 allow=h263 allow=h263p videosupport=yes 15. Editar Configuracion de Correo: vi /etc/amportal.conf //Si la interface web de la PBX sera accedida desde internet o localmente. AMPWEBADDRESS=pbx.DOMAIN.com o IpPublica o ip Privada vi /etc/asterisk/vm_email.inc

remove "Visit http://AMPWEBADDRESS/cgibin/vmail.cgi?action=login&mailbox=${VM_MAILBOX} to check your voicemail with a web browser.\n" vi /etc/asterisk/vm_general.inc serveremail=pbx@DOMAIN.com ; El email desde donde la notificacion pudo venir fromstring=DOMAIN PBX ; Nombre Real o email Sender 16.Configuracion para Music on Hold: chown asterisk /var/lib/php/session/ sed -i "s|upload_max_filesize = 2M|upload_max_filesize = 20M|" /etc/php.ini echo "LimitRequestBody 20000000" >> /etc/httpd/conf.d/php.conf ln -s /var/lib/asterisk/moh /var/lib/asterisk/mohmp3

17. Iniciar FreePBX En consola amportal start

En el Explorador en http://IpDelServidor/admin

Asterisk REAL-TIME
Configuracin de sip.conf

Al guardar los usuarios en MySQL les permite terner un refresco inmediato del usuario sin necesidad de recurrir a reiniciar o recargar las configuraciones.

Editamos el archivo. Vi Extconfig.conf Agregamos las siguientes lineas. sipusers => mysql,general,sip_buddies sippeers => mysql,general,sip_buddies

Guardamos los cambios. Editamos el archivo para la conexin de la base de datos. Vi res_mysql.conf [general] dbhost = 127.0.0.1 dbname = asterisk dbuser = myuser dbpass = mypass dbport = 3306

Script de creacin de campos en la base de datos asterisk, tabla sip_buddies.

# # Table structure for table `sip_buddies` # CREATE TABLE `sip_buddies` ( `id` int(11) NOT NULL auto_increment, `name` varchar(80) NOT NULL default '', `host` varchar(31) NOT NULL default '', `nat` varchar(5) NOT NULL default 'no', `type` enum('user','peer','friend') NOT NULL default 'friend', `accountcode` varchar(20) default NULL, `amaflags` varchar(13) default NULL, `call-limit` smallint(5) unsigned default NULL, `callgroup` varchar(10) default NULL, `callerid` varchar(80) default NULL, `cancallforward` char(3) default 'yes', `canreinvite` char(3) default 'yes', `context` varchar(80) default NULL, `defaultip` varchar(15) default NULL, `dtmfmode` varchar(7) default NULL, `fromuser` varchar(80) default NULL,

`fromdomain` varchar(80) default NULL, `insecure` varchar(4) default NULL, `language` char(2) default NULL, `mailbox` varchar(50) default NULL, `md5secret` varchar(80) default NULL, `deny` varchar(95) default NULL, `permit` varchar(95) default NULL, `mask` varchar(95) default NULL, `musiconhold` varchar(100) default NULL, `pickupgroup` varchar(10) default NULL, `qualify` char(3) default NULL, `regexten` varchar(80) default NULL, `restrictcid` char(3) default NULL, `rtptimeout` char(3) default NULL, `rtpholdtimeout` char(3) default NULL, `secret` varchar(80) default NULL, `setvar` varchar(100) default NULL, `disallow` varchar(100) default 'all', `allow` varchar(100) default 'g729;ilbc;gsm;ulaw;alaw', `fullcontact` varchar(80) NOT NULL default '', `ipaddr` varchar(15) NOT NULL default '', `port` smallint(5) unsigned NOT NULL default '0', `regserver` varchar(100) default NULL, `regseconds` int(11) NOT NULL default '0', `lastms` int(11) NOT NULL default '0', `username` varchar(80) NOT NULL default '', `defaultuser` varchar(80) NOT NULL default '', `subscribecontext` varchar(80) default NULL, PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`), KEY `name_2` (`name`) ) ENGINE=MyISAM ROW_FORMAT=DYNAMIC;

Ejemplo de la creacin de un usuario en la base de datos. [300] host=dynamic secret=123 context=default allow=gsm allow=ulaw

name 300

host dynamic

secret 123

context default

ipaddr 127.0.0.1

port

allow 4569 gsm;ulaw

Configuracin iax.conf

Editamos Extconfig.conf Agregamos las siguientes lineas. iaxusers => mysql,asterisk,iax_buddies iaxpeers => mysql,asterisk,iax_buddies

Database Table

# # Table structure for table `iax_buddies` # CREATE TABLE iax_buddies ( name varchar(30) primary key NOT NULL, username varchar(30), type varchar(6) NOT NULL, secret varchar(50), md5secret varchar(32), dbsecret varchar(100), notransfer varchar(10), inkeys varchar(100), outkey varchar(100), auth varchar(100), accountcode varchar(100), amaflags varchar(100), callerid varchar(100), context varchar(100), defaultip varchar(15), host varchar(31) NOT NULL default 'dynamic', language char(5), mailbox varchar(50), deny varchar(95), permit varchar(95), qualify varchar(4), disallow varchar(100), allow varchar(100), ipaddr varchar(15), port integer default 0, regseconds integer default 0 ); CREATE UNIQUE INDEX iax_buddies_username_idx ON iax_buddies(username);

EJEMPLO DE UN USUARIO. [300] host=dynamic secret=123 context=default context=local

name foo

host dynamic

secret bar

context ipaddr default;local 127.0.0.1

port

regseconds 4569 1096954152

Asterisk RealTime Voicemail


Editamos voicemail.conf [general] searchcontexts=yes

Editamos Extconfig.conf voicemail => mysql,asterisk,voicemail_users

Database Table

# # Table structure for table `voicemail_users` #

Extended table structure - MYSQL

CREATE TABLE `voicemail_users` ( `uniqueid` int(11) NOT NULL auto_increment, `customer_id` varchar(11) NOT NULL default '0', `context` varchar(50) NOT NULL default '', `mailbox` varchar(11) NOT NULL default '0', `password` varchar(5) NOT NULL default '0', `fullname` varchar(150) NOT NULL default '', `email` varchar(50) NOT NULL default '', `pager` varchar(50) NOT NULL default '', `tz` varchar(10) NOT NULL default 'central', `attach` varchar(4) NOT NULL default 'yes', `saycid` varchar(4) NOT NULL default 'yes', `dialout` varchar(10) NOT NULL default '', `callback` varchar(10) NOT NULL default '', `review` varchar(4) NOT NULL default 'no', `operator` varchar(4) NOT NULL default 'no', `envelope` varchar(4) NOT NULL default 'no', `sayduration` varchar(4) NOT NULL default 'no', `saydurationm` tinyint(4) NOT NULL default '1', `sendvoicemail` varchar(4) NOT NULL default 'no', `delete` varchar(4) NOT NULL default 'no', `nextaftercmd` varchar(4) NOT NULL default 'yes', `forcename` varchar(4) NOT NULL default 'no', `forcegreetings` varchar(4) NOT NULL default 'no', `hidefromdir` varchar(4) NOT NULL default 'yes', `stamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP , PRIMARY KEY (`uniqueid`), KEY `mailbox_context` (`mailbox`,`context`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;

Asterisk RealTime Extensions

Editamos extconfig.conf

extensions => mysql,asterisk,extensions_table

Editamos el archive modules.conf ubicado en /etc/asterisk No se olvide de cargar los mdulos adecuados o cosas extraas van a suceder. autoload=yes Verificar que los mdulos se encuentren subiendo de forma automtica si no cargarlos manual. load load load load => => => => res_config_mysql.so app_realtime.so func_realtime.so pbx_realtime.so

Database Table

# # Table structure for table `extensions_table` # CREATE TABLE `extensions_table` ( `id` int(11) NOT NULL auto_increment, `context` varchar(20) NOT NULL default '', `exten` varchar(20) NOT NULL default '', `priority` tinyint(4) NOT NULL default '0', `app` varchar(20) NOT NULL default '', `appdata` varchar(128) NOT NULL default '', PRIMARY KEY (`context`,`exten`,`priority`), KEY `id` (`id`) ) TYPE=MyISAM; # # Dumping data for table `extensions_table` # INSERT INTO `extensions_table` VALUES (1, 'mycontext', '_574555XXXX', 1, 'Wait', '2'); INSERT INTO `extensions_table` VALUES (2, 'mycontext', '_574555XXXX', 2, 'SayNumber', '102'); INSERT INTO `extensions_table` VALUES (3, 'mycontext', '2815551212', 1, 'Playback', 'pbx-invalid'); Insertar ejemplos. INSERT INTO `extensions` (`id`, `context`, `exten`, `priority`, `app`, `appdata`) VALUES (5, 'cytel', '8322008630', '1', 'Dial', 'SIP/3044,30'); INSERT INTO `extensions` (`id`, `context`, `exten`, `priority`, `app`, `appdata`) VALUES (7, 'cytel', '80', '1', 'Voicemailmain', '@cytel'); INSERT INTO `extensions` (`id`, `context`, `exten`, `priority`, `app`, `appdata`) VALUES (8, 'cytel', '_832.', '1', 'Dial', 'SIP/${EXTEN}@66.88.74.85|30'); INSERT INTO `extensions` (`id`, `context`, `exten`, `priority`, `app`, `appdata`) VALUES (9, 'cytel', '_9X.', '1', 'Dial', 'IAX2/devasterisk:asterisk@asterisk-alpha/${EXTEN}@cytel-internal'); INSERT INTO `extensions` (`id`, `context`, `exten`, `priority`, `app`, `appdata`) VALUES (10, 'cytel', '3013', '1', 'Dial', 'SIP/3013|30'); INSERT INTO `extensions` (`id`, `context`, `exten`, `priority`, `app`, `appdata`) VALUES (11, 'cytel', '_3XXX', '1', 'Dial', 'IAX2/devasterisk:asterisk@asterisk-alpha/${EXTEN}@cytel-internal');

extensions.conf
[Internal]

switch => Realtime/mycontext@realtime_ext

Vous aimerez peut-être aussi