manual asterisk avanzado

76
Voz sobre IP y Asterisk Pablo Jorquera 2009

Upload: rene-luna-arce

Post on 28-Nov-2015

947 views

Category:

Documents


12 download

TRANSCRIPT

Voz sobre IP y Asterisk

Pablo Jorquera 2009

CAPITULO 1 Introducción 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 estándar (arquitectura x86, x86_64, ppc)

Bajo GNU/Linux, BSD o MacOSX.

Soporta todas las funcionalidades de las centralitas tradicionales y muchas más!

Historia de Asterisk Asterisk, desarrollado por Mark Spencer y esponsorizado por

Digium (creada para tal fin), comenzó en 1999.

La versión estable: Asterisk 1.2 fue publicada el 15 de

Noviembre del 2005.

En la actualidad es una solución 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 código 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)

Telefonía IP La telefonía IP reúne la transmisión de voz y de datos, lo que posibilita la utilización de las

redes informáticas para efectuar llamadas telefónicas. Además, ésta tecnología al desarrollar

una única red encargada de cursar todo tipo de comunicación, ya sea de voz, datos o video,

se denomina red convergente o red multiservicios.

La telefonía IP surge como una alternativa a la telefonía tradicional, brindando nuevos

servicios al cliente y una serie de beneficios económicos y tecnológicos con características

especiales como:

1- Interoperatividad con las redes telefónicas actuales: En el caso de TELMEX se disponen

de dos tipos de Interconexión a la red de telefonía pública, desde una central telefónica IP y

directamente desde una tradicional.

2- Calidad de Servicio Garantizada a través de una red de alta velocidad:

- En Telefonía 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

mensajería

ACD Call Center o Automatic Call Distribution Call Center

El sistema de centralita IP Asterisk dispone de funcionalidades avanzadas que le permitirán implementar un potente sistema de gestión de llamadas IP o IP Contact Center.

Entre las funcionalidades más destacadas que ofrece Asterisk para dicha función podemos enumerar las siguientes:

• ACD: Sistema de gestión de colas de llamada. Asterisk permite un número ilimitado de colas y agentes, con lo que el sistema crecerá con su negocio.

• IVR: Operadora automática sin limitaciones de opciones y funcionalidad.

• CTI: Existen conectores estándar (TAPI) para integrar su sistema CRM con la centralita, y también opciones para la integración vía HTML.

• Grabación de llamadas: las llamadas en una PBX Asterisk pueden grabarse de forma automática o bien a criterio del operador o agente. Asimismo dispone de un sencillo interfaz para su audición posterior.

Si las funcionalidades implementadas directamente por Asterisk no cubren los requerimientos de su centro de contactos, existen soluciones adicionales que le permitirán disponer de uno de los sistemas más avanzados del mercado. Entre dichas funciones podemos encontrar software de código abierto o bien software licenciado:

• Queuemetrics: potente sistema de gestión y reporte de colas ACD.

• Vicidial: Sistema auto marcador, que le permitirá gestionar eficazmente sus campañas.

• Gnudialer: Sistema con discado predictivo asistido y manual, y sirve para gestionar campañas.

Nuevas funcionalidades Asterisk 1.6

Asterisk 1.6.0

Sin duda la reléase más 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 además de no soportar Zaptel en favor de DAHDI: el nuevo modelo de desarrollo. En Asterisk 1.4, se mantenía un único branch para toda la versión 1.4, por lo que no se añadían nuevas funcionalidades. Esto no hacía posible la inclusión 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 están 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 añadirán 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 telefonía.

DAHDI viene dividido en 2 paquetes, aunque es posible descargar uno que agrupa ambos: dhadi-linux y dahdi-tools.

Dahdi-linux contiene los módulos del kernel para el manejo de las tarjetas de telefonía, y dahdi-tools las herramientas que sustituyen a ztcfg, zttool, etc.

Esta separación hace posible que si se detecta un bug en una aplicación no sea necesario hacer una release que incluya los módulos 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, Compilación e Instalación de Asterisk 1.4

Instalación S.O Este capítulo nos ayudara a preparar el sistema para la instalación de Asterisk. Este

funciona en muchas plataformas y sistemas operativos, mas nosotros elegimos

mantener las cosas simples y permanecer en una única plataforma y distribución de

Linux. Vamos usar la distribución CentOS en este curso. Las instrucciones realizadas en

este curso pueden funcionar con otras distribuciones, pero estas no han sido testeadas por

nosotros.

Elección paquetes y dependencias necesarias para co mpilación de asterisk. Antiguamente existían 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 compilación. Si usted escoge

compilar Asterisk y no el zaptel, pero descubre que esta faltando una aplicación

relacionada al paquete zaptel (Como el Meetme()), usted tendrá que compilar el zaptel y

entonces será necesario recompilar Asterisk para que la aplicación 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 adhesión del protocolo DUNDi

(Distributed Universal Number Discovery).

Los paquetes necesitados para el sistema operativo Linux CentOS serán:

- Kernel sources y headers

- gcc y sus dependencias

- bison (necesario para los archivos de configuración.

- ncurses (necesario para la consola CLI)

- openssl y openssl-dev o libssl-dev

- Newt (para aplicaciones tal como zttool)

- Lib y zlib-devel

La recomendación es que durante el proceso de instalación del sistema operativo se

deberán seleccionar los siguientes paquetes:

- Sección Desarrollo:

* Herramientas de Desarrollo (TODO)

* Desarrollo de Software Anticuado (TODO) Como herramientas adicionales también se

podrá instalar:

- Sección Servidores:

* Servidor Web

* Servidor de Correo

* Servidor de Bases de Datos (MySQL y/o Postgres)

Paquetes requeridos relacionados con Asterisk La instalación de Asterisk esta compuesta por como mínimo 4 paquetes básicos que se necesitaran o no en su totalidad según 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 telefónicas Zaptel.

- LibPri: Incluye las librerías PRI necesarias para conectarse al RTPC.

- Asterisk-addons: Incluye módulos adicionales a asterisk, como por ejemplo el modulo MySQL para conexión 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 temporización 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 librerías 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 asterisk-1.4.x.tar.gz

Zaptel zaptel-1.4.x.tar.gz

Libpri libpri-1.4.x.tar.gz

Asterisk-addons

asterisk-addons-1.4.x.tar.gz

Esta descarga se puede realizar a través de un navegador Web como cambien desde la

línea 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 línea de comandos:

tar -xvzf archivo-comprimido.tar.gz Esto creara un directorio con el nombre y versión del paquete descomprimido y dentro estará el contenido del paquete.

Instalación Asterisk 1.4 La instalación de los paquetes de asterisk se debe realizar en el siguiente orden: 1ero .- zaptel

2do .- libpri

3ero .- asterisk

4to .-asterisk-addons Compilación e Instalación 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

Compilación e Instalación 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

Compilación e Instalación 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 Compilación e Instalación 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 continuación los archivos y directorios mas importantes creados en el proceso de instalación. /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 ubicación de directorios de archivos de configuración,

Módulos 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 compañías telefónicas. 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 instalación 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 también muy importante. Permite habilitar y configurar servicios genéricos

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

Configuración 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 módulos serán cargados por Asterisk al

iniciar. Es frecuente que cuando se instala asterisk por primera vez, no arranque debido a que

no puede cargar un módulo para el que no tenemos soporte. Esto se soluciona comentando la

línea del módulo en este archivo.

sip.conf

Análogo del archivo iax.conf para el protocolo SIP

zapata.conf

Configuración de los canales ZAP. Las configuraciones de este archivo deben coincidir

con el hardware instalado y la configuración del driverzaptel. voicemail.conf

Configuración de las casillas de voz creadas para los respectivos anexos. meetme.conf

Configuración 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 intención de contener todos los mensajes de debug del sistema. Messages

Contiene un listado de los mensajes de warning, debug y demás niveles de logeo. queue_log

Archivo utilizado principalmente por la aplicación 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 pequeño servidor HTTP para

AJAM (Asynchronus Javascript Asterisk Manager). Aquí veremos una descripción

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 autenticación de llamadas con el protocolo IAX2 Sounds/

Directorio con todos los sonidos que serán utilizados por aplicaciones como Playback() y

Background () Para asegurarnos que el proceso de asterisk y zaptel inician de forma automática con

el arranque del servidor y en caso de reinicio del S.O completo y para el proceso de

inicio o detención de forma manual del servicio debemos ejecutarlos siguientes

comandos en la interfaz de línea de comandos: # service zaptel start # service asterisk start # chkconfig zaptel on # chkconfig asterisk on Para acceder al monitor del sistema o también conocido como 'CLI>' ejecutamos el siguiente

Comando: # asterisk -r

Descarga, Compilación e Instalación 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-linux-

2.1.0.4.tar.gz

http://downloads.asterisk.org/pub/telephony/dahdi-tools/releases/dahdi-tools-

2.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-addons-

1.6.1.0.tar.gz

Instalación Libpri

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

Instalación DAHDI-LINUX

tar –zxvf dahdi-linux-2.1.X.X.tar.gz

cd dahdi-linux-2.1.0.4

make

make install

Instalación 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

Instalación Asterisk-1.6

Tar –zxvf asterisk-1.6.X.tar.gz

cd asterisk-1.6.1/

./configure

make

make install

make simples

make config

Instalación 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

telefónica capaz de interconectar sistemas tradicionales de la telefonía con las

tecnologías 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 fácil de expandir,

pudiendo configurarla como T1 (24 canales), E1 (32 canales), o J1 (24

canales).

Estas tarjetas deberán 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 tiempo para ver si la reconoce.

ns:~# dahdi_cfg –v

Es para verificar que el archivo de configuración está correcto, y por consecuencia muestra los canales bien configurados. Este comando hace lo que hacia el ztcfg –v

Si usted utiliza Zaptel: Con esta opción 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.

Configuración de E1 con DAHDI

Con esta opción Asterisk 1.4.22 o superior, se deberá configurar en /etc/dahdi/system.conf con una configuración prácticamente 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 numeración 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 Marcación: Conceptos avanzados.

Directory: Accede a un servicio de directorio, apoyado en la información almacenada para la gestión 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 extensión "escribiendo el nombre" del usuario de la extensión a quien llama, de manera similar a como se dan de alta los nombres en una agenda de un móvil. SOLO FUNCIONA con aquellos usuarios que tengan activado el buzón de voz.

Parámetros: Contexto Voicemail ....Usar: voip-h323. Contexto de Llamada ....Contexto de Llamada donde se sitúa la regla de llamada a la extensión. Opciones ....Opciones: busca por el nombre. Por defecto busca por apellidos. Voicemail.conf 100 => 1234,John Doe,[email protected],,hidefromdir=yes Directory(vm-context[|dial-context[|options]]) - Ver. 1.4 Directory (vm-context[,dial-context,options]) - Ver.1.6

GotoIf: Permite un desvío del flujo de la llamada dentro de las reglas definidas para la misma extensión (ojo, no permite el salto directo a otro contexto o extensión). Además con la particularidad de que se va a controlar el salto en función de la evaluación de una expresión condicional. Esta expresión condicional se conforma como: ${VARIABLE} [Elemento Condicional] Valor/${Variable}. Teniendo en cuenta que hay que separar con un espacio en blanco los elementos.

Parámetros: Condición ....Expresión Condicional que será evaluada (separados por un espacio en blanco): ${VARIABLE} [Condición] [${Variable} o Valor]. Regla de Salto True ....Número de la Regla a la que salta en caso de ser Verdadera la Expresión. Regla de Salto False ....Número de la Regla a la que salta en caso de ser Falsa la Expresión. 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.

Parámetros: Sentencia ....Una de las Siguientes: Connect Query Fetch Clear Disconnect. Resultado ....Vble en la que se almacena el resultado de la ejecución de la sentencia SQL. (Para Connect,Query,Fetch). Conector ....Variable que señala dónde 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 dónde se almacenan los datos de conexión (Connect).

Extensión.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: Añade a una Cola de Llamadas la extensión desde la que se llama, o el agente o extensión determinada por el parámetro Interface. Además es posible "penalizar" la extensión con un nivel de prioridad. Parámetros: Nombre Queue ... Nombre de la cola de llamadas ( Verificar que existe). Interface ... Se puede especificar un interfa ce con el formato: Tecnología/recurso (o agent/identificador). Prioridad ... Penaliza la extensión con una p rioridad. Extensión.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 extensión desde dónde se llama, en caso de rellenar el campo Interface, se dará de baja lo especificado en ese parámetro.

Parámetros: 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 melodía o un mensaje mientras intenta detectar un digito que corresponda con una extensión.

Parámetros: Archivo ....Especifica el archivo que contiene la Melodía o Mensaje. Periodo ....Periodo de silencio en milisegundos (si sigue a un periodo de No Silencio salta a la extensión talk). Min. No-Silencio ....Mínimo periodo de No-Silencio en milisegundos. Max. No-Silencio ....Periodo de No-Silencio Máximo 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 reproducción de las fechas se realiza de acuerdo a un formato determinado.

Parámetros: Fecha y Hora ....Fecha y Hora expresada en formato "unixtime". Zona Horaria ....Zona horaria (revisar zonas horarias en Linux) . Formato Reproducción ....Formato de reproducción de la fecha (por defec to: ABdY "digits/at" IMp).

DeadAgi: Ejecuta un script o programa creado por el usuario, al colgar la llamada en curso. (Observar también la situación de contexto H hangup).

Parámetros: Script ....Nombre Script. Argumentos ....Argumentos que acompañan 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 (ext ensiones o bien usuarios que se loguean como agentes).

• Una estrategia sobre cómo manejar la cola y reparti r las llamadas entre los miembros

• Música que se reproduce durante la espera en la col a.

• Anuncios para miembros y emisores de llamadas.

Manejo de colas: Config

La configuración de las colas se define:

• Estáticamente: en el archivo queues.conf

• Dinámicamente: la configuración se almacena en una BD, “disponibilizando” los cambios sin necesidad de rea lizar un reload

La configuración de los agentes se define en el archivo agents.conf

Manejo de colas: agentes

• Los agentes atienden las llamadas de una cola espec ífica.

• Un agente debe realizar un login (llamando a una ex tensión especial que contiene la aplicación AgentLogin) indicando qu e está listo para tomar llamadas.

• Los miembros son aquellos canales disponibles que e stán activamente atendiendo la cola. Pueden ser tanto agentes como t ambién 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 h asta que alguno responda (configuración por defecto).

• roundrobin: hace sonar cada interfaz disponible por turnos.

• leastrecent: hace sonar la interfaz que fue menos r ecientemente llamada por esta cola.

• fewestcalls: hace sonar la interfaz con la menor ca ntidad de llamadas completas.

• random: hace sonar una interfaz al azar.

• rrmemory: igual que el round robin pero recuerda cu al fue el último teléfono que atendió una llamada y continúa 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 (vía la estrategia definida) a los agentes con el menor valor de penalidad. En el caso de estar todos ocupados, se continúa con la siguiente penalty y as í sucesivamente.

1. Ejemplo: sólo si la telefonista está ocupada, se de riva el llamado a la oficina.

• Priority: se le asigna una prioridad a cada llamada entrante, permitiendo situarla en un lugar más adelante de la cola (no siempre al final).

1. Ejemplo: las llamadas al nro. 110 tienen más priori dad que las del 111.

Manejo de colas: aplicaciones

Aplicaciones principales, utilizadas en extensions. conf:

• Queue: aplicación utilizada para encolar una lla mada (toma como parámetro las colas definidas en queue.conf).

• AddQueueMember: agrega dinámicamente un miembro a la cola.

• RemoveQueueMember: remueve dinámicamente un miembr o 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] ; nombre de la cola

music=default ; música que coloca antes que lo at iendan

strategy=ringall ; estrategia de ring

timeout=15 ; tiempo máximo de ring a un miembro

retry=5 ; tiempo de espera hasta reintentar con otro miembro

wrapuptime=0 ; tiempo de espera luego de intentar con todos los miembros

maxlen = 0 ;

announce-frequency = 0 ; cantidad de veces que sale el anuncio

announce-holdtime = no ; si dice el tiempo de espe ra aproximado

member => Agent/1001,1

member => Agent/1002,1

member => Agent/1003,1

• 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 extensión que no existe en la cola

exten => 123,1,AddQueueMember(Cola de atención 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)

Envío 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 el la el propio Asterisk almacena diversos valores

Como:

- Registros SIP, IAX.

- Información sobre colas.

Nosotros como desarrolladores y programadores de nu estro dialplan también podemos almacenar Información en ella y consultarla desde el mismo dialplan.

AstDB posee una organización referente a familias, y dentro de una familia se pueden tener diversas keys, y para cada key un solo valor. A continuación un ejemplo de creación de una DB aster isk .

[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 contenido y asignándole otro es la siguiente:

[AstDB]

exten => _XXXX,1,Set(valrespassadmin=${DB_DELETE(MI FAMILIA/mikey)})

exten => _XXXX,2,Set(DB(MIFAMILIA/mykey)=${EXTEN})

exten => _XXXX,3,Set(pass1=${DB(MIFAMILIA/mykey)})

exten => _XXXX,6,Hangup()

Configurar el desvío de llamada.

Veremos como configurar el desvío de llamada en Ast erisk. Esta guía funciona con asterisk 1.4.X y asterisk 1.6.X.

Esta configuración es para que el numero a que se d esvían las llamadas sea un fijo o celular y no una extensión interna de Asterisk. Para programar el desvío, la llamada tiene que ser efect uada desde una extensión interna de Asterisk. Claramente, lo puede n modificar según sus exigencias.

[callfwd-add] ; contexto para programar el desvió de llamada

exten => s,1,Answer() ; contestamos la llamada

exten => s,n,Set(NUM=${CALLERID(num)}) ; asignamos a la variable NUM el numero de la extensión que está llamando

exten => s,n,Set(COUNT=1) ; asignamos el valor 1 a l a variable COUNT

exten => s,n(inicio),Playback(please-enter-the&telephone -number&for&your&call-forwarding&astcc-followed-by-the-pound-key) ; La v oz 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) ; Asterisk leerá lo s dígitos y los guardará en la variable forw

exten => s,n,Playback(call-forwarding) : La voz de as terisk dirá que el desvío de la llamada ha sido configurado par a el numero

exten => s,n,Playback(has-been-set-to)

exten => s,n,SayDigits(${forw}) ; Saydigits lee uno a uno los digitos de la variable forw

exten => s,n,Playback(if-this-is-correct-press&digits/1& if-this-is-not-correct&digits/2) ; Si el numero que escuchamos e s exacto presionamos 1 sino 2

exten => s,n,Read(sino,,1,,,5) ; asterisk lee nuestr a respuesta y la guarda en la variable sino

exten => s,n,GotoIf($["${sino}" = "1"]?setf:conta) ; s i sino es igual a uno vamos a la etiqueta setf sino a conta

exten => s,n(conta),Set(COUNT=$[${COUNT} + 1]) ; añadimo s a la variable COUNT (que era 1) una unidad (el nuevo valor es 2)

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

exten => s,n(setf),Set(DB(${NUM}/FORW)=${forw}) ; etiqu eta setf, guardamos en numero en la base de datos interna de Asterisk

exten => s,n,Wait(1) ; esperamos un segundo

exten => s,n(bye),Playback(goodbye) ; Escucharemos un saludo de despedida

exten => s,n,Hangup ; la llamada será terminada

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

asterisk –r

CLI> database show /4000/FORW : 0991354111

Como pueden ver a la familia 4000 (la extensión que ha programado el desvío de llamada) clave FORW ha sido asignado el n umero 0991354111. Cuando alguien llamará la extensión 4000 la llamada se desviará a este número

[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 código no hace nada más que borrar, para la extensión que llama, el numero configurado para el desvió de las llamadas.

Ahora en nuestro contexto local en extensions.conf tenemos que añadir dos líneas más:

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, extensión s, prioridad 1, (el contexto para borrar el desvío de llamada)

Supongamos que tenemos configurado el desvío de lla mada para la extensión 4000.

Como lo vamos a usar en nuestro plan de llamadas ( dialplan)?

[internal]

exten => 71,1,Goto(callfwd-add,s,1) ;Envio a desvio de llamada

exten => 72,1,Goto(callfwd-remove,s,1) ;Remover el desvi o de llamada

exten => 4000,1,Answer() ; contestamos la llamada

exten => 4000,2,Ringing() ;Enviamos Ring

exten => 4000,n,Set(NUM=${DB(${EXTEN}/FORW)}) ; Leemos l a base de datos para ver si hay algún valor en la familia 4000/FORW y lo asi gnamos al variable NUM

exten => 4000,n,GotoIf($["${NUM}" = ""]?normal:forw) ; si la variable NUM es vacía seguimos normalmente sino vamos a la e tiqueta forw

exten => 4000,n(normal),Dial(SIP/4000,30,tTwkKxX) ; llam amos la extensión 4000

exten => 4000,n,Hangup() ; terminamos la llamada

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

exten => 4000,n,Hangup() ; terminamos la llamada

Los comandos disponibles para la base de datos de a sterisk:

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

Creo que es más difícil explicarlo que configurarlo ... :)

Hagan sus pruebas y me cuentan

Funcion no molestar DND (Do not disturb)

Puede ser que en algún momento de nuestro día labor al no queremos ser molestados por las llamadas telefónicas. Al mismo tiempo, per o, queremos que quienes nos llaman tengan las posibilidad de dejarnos un mensaj e 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/${CA LLERID(num)})})

exten => disable-dnd,n,playback(do-not-disturb)

exten => disable-dnd,n,playback(de-activated)

exten => disable-dnd,n,hangup

En la primera línea controlamos si en la base de da tos de Asterisk existe un valor asociado a la familia DND y nuestro numero de extensión (CALLERID). Si no existe lo creamos con la línea 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 extensión disable-dnd, prioridad 1 donde borrare mos el registro y anunciaremos que el “No disturbar” ha sido desactivado.

En el mismo archivo dentro del contexto internal in sertamos dos líneas más

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

La primare envía el llamante a la macro con nombre DND (la que acabamos de explicar más arriba). De esta forma podemos activar y desactivar el “No disturbar” llamando la extensión 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 añadimos las s iguientes líneas

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}@defaul t,u)

exten => _40XX,n,hangup

exten => _40XX,n(DND-ON),Goto(${EXTEN},6)

Si el registro existe en la base de datos de asteri sk (línea 1) la llamada será enviada a la extensión con etiqueta DND-ON, y de ah í a la extensión _40XX prioridad 6. Esto significa que la llamada será tra nsferida al contestador y al llamante será anunciado que la persona en la extens ión XXXX no se encuentra disponible.

Si el registro no existe se procesará la línea dos y se llamará la extensión marcada. Luego según esté ocupada o en otra condici ón, la llamada se enviará a la correspondiente parte del plan de llamadas.

FAX con IAXmodem y Hylafax

Vamos a empezar. Primero instalamos las librerías l ibtiff y libtool

yum install libtiff libtiff-devel libtool

IAXmodem

IAXmodem es un modem software, escrito en C que uti liza un canal IAX (uno de los protocolos presentes en Asterisk) en lugar de una línea telefónica y utiliza un DSP por software en lugar de un chip DSP (Digital S ignal Processing).

Descargamos las fuentes de iaxmodem:

cd /usr/src

wget http://switch.dl.sourceforge.net/sourceforge/i axmodem/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 IA Xmodem funcione:

mkdir /etc/iaxmodem

mkdir /var/log/iaxmodem

touch /var/log/iaxmodem/ttyIAX0

touch /var/log/iaxmodem/iaxmodem

Modificamos el archivo de configuración predefinido presente con las fuentes:

vi iaxmodem-cfg.ttyIAX

Esta es la configuración con la cual funciona bien:

device /dev/ttyIAX

owner uucp:uucp

mode 660

port 4570

refresh 300

server 127.0.0.1

peername iaxmodem

secret password

cidname VozToVoice

cidnumber XXXXXXXXXX

codec ulaw

Esta configuración es valida si tenemos instalado I AXmodem (más que aconsejado) en el mismo computador donde está Asterisk. En el c aso de dos computadores distintos tendrán que indicar en la línea server la dirección IP del servidor Asterisk. Pongan su contraseña en secret y en cidna me y cidnumber nombre y número telefónico que usará IAXmodem para presentarse a As terisk.

Podemos configurar cuantos IAXmodem queramos cambia ndo en la primera línea el nombre del device y creando un archivo separado par a 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 configuración 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 conf iguración de asterisk entrando en la consola::

asterisk –r

Escribimos:

CLI> iax2 relaod

CLI> quit

Ahora podemos hacer una prueba para ver si la conex ión entre IAXmodem y Asterisk funciona:

cd /usr/local/sbin

./iaxmodem ttyIAX

Debería aparecer:

[2009-06-08 12:03:39] Modem started [2009-06-08 12:03:39] Setting device = '/dev/ttyIAX ' [2009-06-08 12:03:39] Setting owner = 'uucp:uucp' [2009-06-08 12:03:39] Setting mode = '660' [2009-06-08 12:03:39] Setting port = 4570 [2009-06-08 12:03:39] Setting refresh = 300 [2009-06-08 12:03:39] Setting server = '127.0.0.1' [2009-06-08 12:03:39] Setting peername = 'iaxmodem' [2009-06-08 12:03:39] Setting secret = 'password' [2009-06-08 12:03:39] Setting cidname = 'VozToVoice ’ [2009-06-08 12:03:39] Setting cidnumber = 'XXXXXXXX X' [2009-06-08 12:03:39] Setting codec = ulaw [2009-06-08 12:03:39] Opened pty, slave device: /de v/pts/4 [2009-06-08 12:03:39] 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 A sterisk aparezca la conexión de IAXmodem (en otra ventana Terminal)

Listo. Ya tenemos parte del “problema” solucionado.

Ahora instalamos el script presente en la carpeta d e 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 automático:

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 (depende ncias) requeridas por Hylafax:

yum install ghostscript ghostscript-devel sharutils ghostscript-fonts

En la página de Hylafax están presentes los paquet es 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

Añadimos el faxgetty al inittab (faxgetty es el pro grama que realmente contesta las llamadas)

Vi /etc/inittab

Añadimos esta línea:

fax:2345:respawn:/usr/sbin/faxgetty ttyIAX

Guardamos los cambios y volvemos a arrancar inittab :

init q

Ahora podemos empezar con la configuración de Hylaf ax (un poco larga pero necesaria). Presten particular atención a las parte s en negrita:

faxsetup

Update /var/spool/hylafax/status/any.info.

HylaFAX configuration parameters are:

[1] Init script starts faxq: yes

[2] Init script starts hfaxd yes

[3] Start old protocol: no

[4] Start paging protocol: no

Are these ok [yes]?

Contestamos yes

Modem support functions written to /var/spool/hylaf ax/etc/setup.modem.

Configuration parameters written to /var/spool/hyla fax/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/hyla fax) ["etc/dialrules"]?

Tracing during normal server operation [1]?

Default tracing during send and receive sessions [0 xffffffff]?

Continuation cover page (relative to /var/spool/hyl afax) []?

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 [0 xffffffff]?

Syslog facility name for ServerTracing messages [da emon]?

The non-default scheduler parameters are:

CountryCode: 57

AreaCode: 1

LongDistancePrefix: 0

InternationalPrefix: 00

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): [ OK ]

Starting HylaFAX server (hfaxd): [ OK ]

Restarting HylaFAX modem manager (faxgetty): [ OK ]

Do you want to run faxaddmodem to configure a modem [yes]?

Serial port that modem is connected to []? ttyIAX

Ok, time to setup a configuration file for the mode m. The manual

page config(5F) may be useful during this process. Also be aware

that at any time you can safely interrupt this proc edure.

Reading scheduler config file /var/spool/hylafax/et c/config.

No existing configuration, let's do this from scrat ch.

Country code [1]? 57

Area code [415]? 1

Phone number of fax modem [+1.999.555.1212]? +571XX XXXXXX

Local identification string (for TSI/CIG) ["Nothing Setup"]?

Long distance dialing prefix [1]? 0

International dialing prefix [011]? 00

Dial string rules file (relative to /var/spool/hyla fax) [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 (rel ative 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 ch ecking [95]?

Max consecutive bad lines to accept during copy qua lity checking [5]?

Max number of pages to accept in a received facsimi le [25]?

Syslog facility name for ServerTracing messages [da emon]?

Set UID to 0 to manipulate CLOCAL [""]?

Use available priority job scheduling mechanism ["" ]?

CountryCode: 57

AreaCode: 1

FAXNumber: +571XXXXXXXX

LongDistancePrefix: 0

InternationalPrefix: 00

DialStringRules: etc/dialrules

SessionTracing: 11

RingsBeforeAnswer: 2

SpeakerVolume: off

GettyArgs: "-h %l dx_%s"

LocalIdentifier: "NothingSetup"

TagLineFont: etc/lutRS18.pcf

TagLineFormat: "From %%l|%c|Page %%P of %% T"

MaxRecvPages: 25

Are these ok [yes]?

Now we are going to probe the tty port to figure ou t the type

of modem that is attached. This takes a few second s, so be patient.

Note that if you do not have the modem cabled to th e port, or the

modem is turned off, this may hang (just go and cab le 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 h ow HylaFAX interacts

with the modem and the fax protocol features that a re used when sending

or receiving faxes. One class isn't inherently bet ter than another;

however, one probably will suit a user's needs bett er than others.

Class 1 relies on HylaFAX to perform the bulk of th e 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 mor e features.

Class 1.0 is similar to Class 1 but may add V.34-fa x capability.

Class 2.1 is similar to Class 2.0 but adds V.34-fax capability.

HylaFAX generally will have more features when usin g Class 1/1.0 than

when using most modems' Class 2 or Class 2.0 implem entations. Generally

any problems encountered in Class 1/1.0 can be reso lved 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: "ATH1\nAT+VCID=1"

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 consiste ncy...

...some parameters are different.

The non-default scheduler parameters are:

CountryCode: 57

AreaCode: 1

LongDistancePrefix: 0

InternationalPrefix: 00

DialStringRules: etc/dialrules

Are these ok [yes]?

Creating new configuration file /var/spool/hylafax/ etc/config...

...saving current file as /var/spool/hylafax/etc/co nfig.sav.

Don't forget to run faxmodem(8C) (if you have a sen d-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 processe s after running

faxsetup; especially if have just installed new sof tware. If these

processes are being started by init(8C) then sendin g 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 [ye s]?

/usr/sbin/faxquit ttyIAX

/etc/init.d/hylafax restart

Shutting down HylaFAX queue manager (faxq): [ OK ]

Shutting down HylaFAX server (hfaxd): [ OK ]

Starting HylaFAX queue manager (faxq): [ OK ]

Starting HylaFAX server (hfaxd): [ OK ]

Restarting HylaFAX modem manager (faxgetty): [ OK ]

Todos los archivos de configuración que se crearan a lo largo del proceso de seteo de Hylafax los encontraremos en la carpeta /v ar/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 p ara enviar el fax al correo electrónico. Si quieren pueden cambiarlo modificand o el archivo FaxDispatch que encuentran en la carpeta /var/spool/hylafax/etc

Si quieren recibir el mensaje con el texto en españ ol siempre en el mismo archivo añaden esta línea:

TEMPLATE=es

Para el envío 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 lí neas:

[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 vía WEB

En un precedente articulo hemos visto como configur ar iaxmoden y hylafax para asterisk 1.4 Si se acuerdan bien el envió de los fa xes era algo incomodo (había que usar un comando desde el prompt de Linux. Afort unadamente instalando Avantfax todo se resuelve. Avantfax es una aplicación WEB pa ra gestionar el envío y recepción de faxes que se apoya a Hylafax. Esto evi ta tener instalado un cliente web para hylafax (tipo Winprint Hylafax) en cada co mputador.

Desde cualquier parte del mundo podremos entrar en la página WEB de nuestro Avantfax y enviar nuestros faxes o revisar los faxe s recibidos. Gracias a la posibilidad de configurar distintos usuarios podemo s también definir, para cada uno de ellos, categorías y permisos de acceso a la parte hardware (los faxes) y al archivos de los faxes enviados/recibidos.

La configuración es bastante sencilla. De hecho la ultima versión de Avantfax viene con uno script de auto instalación para Cento s.

Vamos a empezar descargando el programa:

wget http://switch.dl.sourceforge.net/sourceforge/a vantfax/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 líneas en negrita:

# El nombre del dominio que usaremos para entrar a la pagina de administración de Avantfax

FAXDOMAIN=fax.miodominio.org

# La carpeta donde vamos a instalar avantax (accesi ble desde Apache)

INSTDIR=/var/www/html/avantfax

# La carpeta donde tenemos instalado Hylafax

HYLADIR=/usr

# La carpeta donde tenemos la configuración y los r egistros de Hylafax

SPOOL=/var/spool/hylafax

# Usuario, contraseña y nombre de la base de datos donde vamos a guardar las tablas y los datos de Avantfax

USER=avantfax PASS=contraseña DB=avantfax

# La contraseña del usuario root para MySQL (necesa ria para que lo script pueda crear la base de datos y las demás configuraciones en MySQL)

ROOTMYSQLPWD=contraseña

# Nombre de usuario y grupo que usa Apache (encuent ran estos datos en el archivo /etc/httpd/conf/httpd.conf

HTTPDUSER=apache HTTPDGROUP=apache

Guardamos los cambios y ya podemos arrancar el scri pt

./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/h tml/avantfax

Una vez terminado ya podemos entrar a la pagina de administración de Avantfax a la dirección que hemos indicado en la variable FAXDOMAIN

En el ejemplo presentado en esta guía seria:

http://fax.miodominio.org/admin

Si les aparece esta pagina:

Hay un problema con la base de datos. Tenemos que r evisar este archivo de configuración:

Vi /var/www/html/avantfax/includes/local_config.ph p

Y revisar bien estas líneas para que correspondan a la configuración de la base de datos MySQL que hemos definido en el archivo rh-prefs.txt :

define('AFDB_USER', 'avantfax'); // us ername define('AFDB_PASS', 'contraseña'); // password define('AFDB_NAME', 'avantfax'); // database name define('AFDB_ENGINE', 'mysql'); // database engine: mysql define('AFDB_HOST', 'localhost'); // database host

Guardamos los cambios y volvemos a entrar a la pági na web de Avantfax. Deberíamos encontrarnos con esta imagen:

Para entrar ponemos como username admin y como contraseña password. La primera vez que nos conectamos tendremos que cambiar la con traseña 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 están configurados con IAXmodem y directamente conectados a Asterisk. Cuando está entrando un fax aparecerá:

Discado automático

Archivos .call

• Se utilizan para iniciar llamadas desde una aplicac ión externa.

• Son archivos de texto que al copiarse en el directo rio /var/spool/asterisk/outgoing Asterisk notará su pre sencia e inmediatamente activará la extensión en la prioridad especificada en el archivo .call.

• Generalmente, se combinan con el programador de tar eas de Linux: el cron.

• Algunos ejemplos de uso son: soluciones de callback , despertador telefónico, anuncios automáticos.

Ejemplo:

En el siguiente ejemplo: se llama al 4844000 en el canal Zap/g1/ y envía la llamada al contexto [mensajes-salida], extensión 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 in terfaz estándar para que programas externos puedan controlar el plan de marc ación.

Generalmente, los scripts AGI se utilizan para real izar lógica avanzada, comunicarse con base de datos relacionales, etc.

Los lenguajes más comunes de programación de script s AGI son: PHP, Python y Perl, aunque se puede utilizar cualquier otro lenguaje.

El intercambio de información del script con Asteri sk se realiza vía los canales de comunicación: STDIN, STDOUT y STDERR.

Lee desde STDIN para obtener información.

Escribe en STDOUT para enviar información.

Escribe en STDERR para enviar información de debugg ing.

El script AGI envía comandos a Asterisk escribiendo en el STDOUT. Seguidamente Asterisk envía una respuesta por cada uno de ellos que es leída por el script

Algunos ejemplos de comandos son:

• ANSWER: atiende.

• HANGUP: cuelga.

• SAY [NUMBER | DIGITS | ALPHA | PHONETICS]: dice un número, dígito, caracter o una cadena fonéticamente.

• SET [CONTEXT | EXTENSION | PRIORITY]: establece un nuevo contexto, extensión o prioridad luego de finalizada la ejecuc ión de script.

• VERBOSE: imprime un mensaje en el log.

• WAIT FOR DIGIT: espera que se presione un dígito.

• [SET | GET] VARIABLE: asigna u obtiene el valor de una variable del plan de marcación.

El programa debe:

Tener derechos de ejecución y presentar un intérpr ete válido

Ej chmod 755 mi_cript.php

Ser localizado por defecto en /var/lib/asterisk/agi -bin

Cómo 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 números que se encuentran en el archivo que se le pasa como parámetro

#!/usr/bin/php –q

<?php

// Esta línea es para que que haga no mantenga en u n 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 d efinido anteriormente

$debug = true;

// Toma el nombre del archivo con los números a dic tar del primer parámetro

$archivo = $argv[1];

// Define la funcion read, que lee el input del STD IN

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 e n 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 d el mismo

// informando en el log del Asterisk la accion real izada

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 ex tensión 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 más sencillo de lo que parezca. Todo se basa en un programa en lenguaje PHP y el uso de la aplicación AGI de Asterisk ( Asterisk Gateway Interface). AGI es una interfaz que sirve para añadir funcionalidades a la centralita usando distintos lenguajes de programación (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.c onf para crear una nueva extensión que llamaremos para programar nuestro des pertador

Vi /etc/asterisk/extensions.conf

Añadimos las siguientes dos líneas en nuestro conte xto 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 extensión marcamos el numero 77 y s eguimos las instrucciones para programar nuestro despertador.

ASTERISK MANAGER API

- Permite a una aplicación cliente conectarse a una i nstancia de Asterisk vía TCP/IP y ejecutar comandos o leer eventos.

- Generalmente, se utiliza el puerto 5038.

- Utiliza un protocolo en modo texto que consiste en líneas de tipo "clave: valor".

- Conjunto de líneas: paquete.

PROTOCOLO

1) Se debe establecer una sesión con el manager ant es de ejecutar comandos.

2) Los paquetes pueden ser transmitidos en ambas di recciones.

3) El orden de las líneas dentro del paquete es ind istinto.

4) Las líneas se delimitan con CRLF y una línea en blanco (2 CRLF consecutivos) indica el final del paquete

TIPOS DE PAQUETE

El tipo de paquete está dado por las siguientes cla ves:

� Action: paquete originado en el cliente requiriendo llevar a cabo una acción particular. Contiene el nombre de la acción y los p arámetros de la misma.

� Response: la respuesta del Asterisk a la Acción requerida po r el cliente.

� Event: datos correspondientes a un evento generado dentro del núcleo de Asterisk o módulo.

AUTENTICACIÓN

� Las cuentas de usuario se configuran en /etc/asteri sk/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 c lave es "claveadmin" y sólo se permiten conexiones para este usuario vía localh ost. El resto de las líneas establecen permisos (r,w,r/w) para cada clase (syst em, call, etc.).

CONEXIÓN

� Enviar un mensaje con acción "Login", junto con el usuario y la clave como parámetros. Por Ej.:

Action: login

Username: admin

Secret: adminclave

Events: off

(La última línea indica que la conexión 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 parámetros adicionales (por ej, u n número a llamar o canal a desconectar).

� En el caso que la acción determine la ejecución de una entrada del plan de marcación, también 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: com mand,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 (pr ivilege: call,all)

� MailboxStatus: verifica el status del mailbox (privilege: call,al l)

� 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,al l)

� 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 envía:

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 documentación sobre el protocolo y la funcionali dad del manager está incompleta.

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

� Es recomendada la utilización de un Proxy (por, ej ProxyAstMan), para sistemas que hagan un uso intensivo del manager, comp pueden ser sistemas de monitoreo y campaña telefónica.

Asterisk con alta disponibilidad

� Este tipo de configuración se implementa en central es IP donde queremos brindar una alta disponibilidad. Inicialmente necesitamos dos servidores que tengan asterisk instalado. La herramienta a utilizar es heartbeat en su versió n 2.1.3, utilizaremos el heartbeat para sensar el servicio del asterisk en a mbos servidores, y si se cae alguno de ellos el otro tomara su lugar, como m aestro 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 serv idores el heartbeat.

yum –y install heartbeat Para este ejemplo el asterisk principal tiene el h ostname lcla.com y el backup lclabk.com Para todas las configuraciones necesitamos este pa rámetro así que asegúrense de poner el nombre de hostname la respuesta al com ando

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 l ocalhost 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 l ocalhost 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, copiemo s 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 configuración del hearbeat es seleccionando los demonios que queremos que esten en alta disponibilidad, para nos otros asterisk

vi /etc/ha.d/haresources Agreguemos la siguiente línea

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 comunicación de asterisk, ya sea con los anexos sip iax, u otra comunicación voip que realic e con asterisk. Finalmente debemos de copiar los archivos de config uración del heartbeat del maestro al esclavo scp -r /etc/ha.d/ [email protected]:/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 lo s archivos donde se declara el hostname, que son básicamente tres

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

Si tienes algún problema prueba reiniciando tus ser vidores, para que te tome bien el hostname. Si todo esta bien, entonces desde otra maquina prue ba haciendo ping a la ip virtual 192.168.254.200, y en el maestro deberás te ner 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 Mas k: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 fram e:0 TX packets:14789 errors:0 dropped:0 overruns:0 carr ier:0 collisions:0 txqueuelen:1000 RX bytes:2564095 (2.4 MiB) TX bytes:3349104 (3.1 Mi B) 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 Mas k: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 carri er: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 configuración, de esta manera al realizar algún cambio en la configuración del Asterisk principal, este replique en la configuración del Asterisk backup.

Podríamos hacerlo simplemente con un script que eje cute un scp periódicamente y copie los archivos del /etc/asterisk, pero esto no es muy eficiente. Puesto que podemos utilizar el rsync que es un programa que of rece transmisión eficiente de datos incrementales comprimidos y cifrados, el algo ritmo compara los checksum de manera eficiente, y cuando no encuentra coincidenci as, envía los cambios e información de cómo reensamblarlos, de esta forma s olo se copian los nuevos cambios.

El script que ejecuta el rsync, es necesario ponerl e el password, luego colocar el script en el crontab para que se ejecute periódi camente. [root@lcla ~]# cat /sbin/syncdata.bash

#!/usr/bin/expect -f spawn rsync -raz --progress --size-only /etc/asteri sk/ 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 rsync

[root@lcla ~]# rpm -q rsync

rsync-2.6.3-1

Ahora que tenemos alta disponibilidad del demonio d el Asterisk, la sincronización de los archivos de configuración entre la central p rincipal y la de backup. Ello nos sirve para un escenario donde solo necesitamos un Asterisk con configuración a mano. Sin embargo Freepbx entre otros software de administración, manejan algunas parámetros con base de datos, en el caso de realtime por ejemplo. Además el cdr podemos estar guardándolo en una base de dat os también. Por tanto necesitamos tener un backup de la base de datos en cuestión de la central principal en la de backup. Para esta labor vamos a utilizar replicación de base de datos en mysql. De esta manera, se replicaran lo s nuevos registros hechos en la base de datos de la central principal, en la cen tral de backup. Por ello para no generar incoherencias, debemos hac er un backup de la base de datos de la central principal y restaurarlo en la b ase de datos de la central de backup, antes de configurar la replicación.

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 sh ould 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 replicación para el esclavo en mysql.

mysql> grant replication slave on *.* to 'replicati on'@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 e n 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 ingresand o datos, en la base de datos principal y observar como estos se reflejan en la c entral de backup.

Registro de llamadas (CDR Call Detail Record)

• Asterisk permite llevar un control exhaustivo de to das las llamadas que se han realizado o recibido.

• Es interesante para control propio de facturación, independiente del proveedor (si no se es uno de ellos).

• Permite realizar estadísticas.

• Este control se denomina CDR: Call Detail Record.

El registro del CDR se escribe por defecto en el ar chivo

/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 módulo de MySQL, se utiliza cdr_mysql.conf

• Para confirmar el estado del CDR desde el CLI, se p uede ejecutar:

• CLI> cdr status

Asterisk genera un CDR (registro) para cada llamada .

• Algunos de los campos más importantes son:

1. accountcode: código de la cuenta a utilizar.

2. src: número del caller ID.

3. dst: extensión 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: duración de la llamada en segundos, desde que fue

9. discada hasta el corte.

10. billsec: duración de la llamada en segundos, desde que fue atendida hasta el corte.

11. disposition: estado de la llamada (atendida, no ate ntendida, 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 opensou rce para tarificación, control de cuentas y llamadas.

• Areski Stat v2: se trata de una aplicación para lis tar y realizar estadísticas de las llamadas realizas o enviadas.

• A2Billing: Se usa para tarificación prepago.

Creamos la base de datos en mysql

mysql -u root

mysql> create database asteriskcdrdb;

Creamos un usuario y le damos privilegios para aste riskcdrdb

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 v archar(80) NOT NULL default '', dst varchar(80) NOT NULL default '', dconte xt varchar(80) NOT NULL default '', channel varchar(80) NOT NULL default '' , dstchannel varchar(80) NOT NULL default '', lastapp varchar(80) NOT NU LL default '', lastdata varchar(80) NOT NULL default '', duration int(11) N OT NULL default '0', billsec int(11) NOT NULL default '0', disposition v archar(45) NOT NULL default '', amaflags int(11) NOT NULL default '0', acco untcode varchar(20) NOT NULL default '', uniqueid varchar(32) NOT NULL defa ult '', userfield varchar(255) NOT NULL default '' );

mysql> exit

Nos vamos al archivo de configuración

cd /etc/asterisk

Editamos el archivo de configuración 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 d el 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 recor ds since last restart.

Agregando el Unique ID

Cd /usr/src/asterisk-addons

Vi Makefile

Agregar la linea : ASTCFLAGS+=-DMYSQL_LOGUNIQUEID

Guardar los cambios

Editar el archivo cdr_addon_mysql.c

Agregar la siguiente definición.

#define MYSQL_LOGUNIQUEID

Asterisk - MP3 y música 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/m ohmp3

Una vez que tengamos nuestro Archivo MP3 en el serv idor tenemos que abrir el archivo de texto musiconhold.conf y añadir unas lín eas.

Vi /etc/asterisk/musiconhold.conf

y copiamos las líneas

[mp3] mode=files directory=/var/lib/asterisk/mohmp3 random=yes

Volvemos a la consola de Asterisk.

asterisk -r

Y desde la línea 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

Acuérdense que usando los archivos MP3 se usaran ba stantes 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 krb 5-devel libogg libselinux-devel libsepol-devel libxml2-devel libtiff-devel gm p php-pear php-pear-DB php-gd php-mysql php-pdo ncurses-devel audiofile-devel lib ogg-devel mysql-devel zlib-devel perl-DateManip sendmail-cf kernel-devel open ssl-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 as teriskuser@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/freep bx/SQL/cdr_mysql_table.sql mysqladmin create asterisk –p

mysql --user root -p asterisk < /usr/src/freepbx/SQ L/newinstall.sql

mysql -u root –p

GRANT ALL PRIVILEGES ON asteriskcdrdb.* TO asterisk user@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 aste risk

//Cambiar el usuario y grupo apache por usuario y grupo asterisk

vi +231 /etc/httpd/conf/httpd.conf o sed -i "s/U ser apache/User asterisk/" /etc/httpd/conf/httpd.conf

//Cambiar AllowOverride None a AllowOverride A ll

vi +329 /etc/httpd/conf/httpd.conf o sed -i "s/Gr oup apache/Group asterisk/" /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.lo cal

chkconfig httpd on

chkconfig mysqld on

10.Solucionar Problemas de Flash Operator Panel

wget http://www.asternic.org/files/op_panel-0.29.ta r.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 archi vo /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. Añadir 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 Priva da

vi /etc/asterisk/vm_email.inc

remove "Visit http://AMPWEBADDRESS/cgi-bin/vmail.cgi?action=login&mailbox=${VM_MAILBOX} to check your voicemail with a web browser.\n"

vi /etc/asterisk/vm_general.inc [email protected] ; El email desde do nde la notificacion pudo venir fromstring=DOMAIN PBX ; Nombre Real o em ail Sender 16.Configuracion para Music on Hold:

chown asterisk /var/lib/php/session/

sed -i "s|upload_max_filesize = 2M|upload_max_files ize = 20M|" /etc/php.ini

echo "LimitRequestBody 20000000" >> /etc/httpd/conf .d/php.conf

ln -s /var/lib/asterisk/moh /var/lib/asterisk/mohmp 3

17. Iniciar FreePBX

En consola amportal start

En el Explorador en http://IpDelServidor/admin

Asterisk REAL-TIME

Configuración de sip.conf

Al guardar los usuarios en MySQL les permite terner un refresco inmediato del usuario sin necesidad de recurrir a reiniciar o rec argar 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 conexión 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 creación de campos en la base de datos as terisk, 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 defau lt '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;a law', `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 creación de un usuario en la base de datos.

[300] host=dynamic secret=123 context=default allow=gsm allow=ulaw

name host secret context ipaddr port allow 300 dynamic 123 default 127.0.0.1 4569 gsm;ulaw

Configuración 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 host secret context ipaddr port regseconds foo dynamic bar default;local 127.0.0.1 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_TIMESTA MP 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/as terisk

No se olvide de cargar los módulos adecuados o cosa s extrañas van a suceder.

autoload=yes

Verificar que los módulos se encuentren subiendo de forma automática si no cargarlos manual.

load => res_config_mysql.so load => app_realtime.so load => func_realtime.so load => 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, 'mycontex t', '_574555XXXX', 1, 'Wait', '2'); INSERT INTO `extensions_table` VALUES (2, 'mycontex t', '_574555XXXX', 2, 'SayNumber', '102'); INSERT INTO `extensions_table` VALUES (3, 'mycontex t', '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', '@c ytel'); INSERT INTO `extensions` (`id`, `context`, `exten`, `priority`, `app`, `appdata`) VALUES (8, 'cytel', '_832.', '1', 'Dial', 'SIP/${EX TEN}@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