Libro Asterisk 1.8.X v. 1.

0
Abril 2012

By

VozToVoice

www.voztovoice.org

Convenciones tipográficas.
Negrita = comandos que el usuario tiene que teclear en la consola de Linux NegritaCursiva: Lineas que hay que añadir/modificar en los archivos de configuración Nombreprograma = Indica el nombre de un programa o librería Cursiva: respuesta del servidor Linux a los comandos CLI> indica que estamos trabajando en la consola de Asterisk mysql> indica que estamos trabajando en el cliente MySQL

Si encuentran alguna incorrección o errata pueden escribir al autor: libro@voztovoice.org

i

Este documento se publica bajo la GNU Free Documentation License, versión 1.3 o sucesivas, publicadas por la Free Software Foundation. Está permitido copiar, distribuir y/o modificar este documento bajo los términos indicados en la licencia. Una copia integral de la licencia es presente en la apéndice H de este libro.

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.

Copyright (C)

2012-2016

Andrea Sannucci

ii

INDICE
Capitulo I - Instalación de Asterisk ….......................................................................................... 1 1.1 Preparación del VPS Linode 1.2 GRUB, Kernel-XEN y clave RSA 1.3 Utilidades, librerías, dependencias 1.4 Libpri 1.5 DAHDI 1.6 App_fax, GoogleTalk, LibiCAL y SRTP 1.7 Instalación de Asterisk 1 7 16 19 19 21 27

Capitulo II - Configuración inicial de Asterisk ......................................................................... 36 2.1 Instalar y configurar un cortafuego 2.2 Carpetas y archivos 2.3 asterisk.conf 2.4 modules.conf 2.5 Música en espera y MP3 2.6 Preparación del dialplan – extensions.conf 36 39 41 43 45 48

Capitulo III – Protocolo SIP y archivo sip.conf.......................................................................... 54 3.1 sip.conf 3.2 Directmedia 3.3 Contraseñas seguras 3.4 Ngrep 3.5 SoftPhone X-Lite y REGISTER 3.6 Softphone 3CX 3.7 Llamadas entre extensiones 3.8 SIP INVITE y CANCEL 56 69 70 71 72 77 79 80

Capitulo IV – Protocolo IAX2 – iax.conf ................................................................................. 84 4.1 iax.conf 4.2 Softphone Zoiper 84 89

Capitulo V - GoogleTalk – gtalk.conf jabber.conf................................................................... 95 5.1 jabber.conf y gtalk.conf 5.2 Google Voice 95 101 iii

5.3 Aplicación JabberSend 5.4 La función JABBER_RECEIVE

102 104

Capitulo VI - Asterisk y la red PSTN........................................................................................ 107 6.1 Tarjeta Digium TDM410 6.1.1 OSLEC 6.2 Tarjeta Digium TE120P 6.2.1 MFG/R2 – Openr2 6.4 Wanpipe 6.5 Linksys SPA3102 – Gateway FXO/FXS 108 112 116 117 122 124

Capitulo VII - Dialplan – Configuración avanzada.................................................................. 134 7.1 Las Variables 7.2 Pattern Matching 7.3 La aplicación Echo 7.4 El contexto Subscribe 7.5 Las Macro 7.6 Autenticar las Llamadas Salientes con la aplicación Authenticate 7.7 Limitar llamadas salientes: funciones GROUP y GROUP_COUNT 134 137 138 139 143 146 149

Capitulo VIII - IVR …................................................................................................................. 156 8.1 Grabación de las locuciones 8.2 Configuración numero geográfico 8.3 Creación del IVR 156 157 158

Capitulo IX - Funcionalidades avanzadas de Asterisk – features.conf ................................... 164 9.1 features.conf 9.2 Callgroup y Pickupgroup 9.3 Aplicación Dial y features.conf 164 172 174

Capitulo X - Asterisk y los calendarios ….................................................................................. 180 10.1 calendar.conf 10.2 CALENDAR_BUSY 10.3 CALENDAR_EVENT 10.4 CALENDAR_QUERY y CALENDAR_QUERY_RESULT 10.5 CALENDAR_WRITE 10.6 Enviar las notificaciones de los calendarios a números fijos/celulares 181 190 192 194 197 201

iv

Capitulo XI - CCSS (Call Completion Supplementary System) – Rellamada …................... 206 11.1 Configuración del CCSS 11.2 CCSS 1ª Prueba 11.3 CCSS 2ª Prueba 11.4 CCSS 3ª Prueba 206 208 209 210

Capitulo XII – Asterisk Realtime............................................................................................... 213 12.1 Realtime estático 12.2 Realtime dinámico 12.2.1 Extensiones SIP en Realtime 12.2.2 Extensiones IAX en Realtime 12.2.3 Dialplan en Realtime dinámico 213 220 220 228 233

Capitulo XIII – IVR avanzados – func_odbc.conf ........... ....................................................... 237 13.1 Empleados 13.2 Encuesta 237 242

Capitulo XIV - Buzón de voz – voicemail.conf........................................................................ 246 14.1 voicemail.conf 14.2 Mensajes de voz en una base de datos 14.3 Buzones de voz en una base de datos Capitulo XV - Las conferencias audio ................................................................................... 15.1 meetme.conf 15.2 Aplicación ConfBridge 15.3 Meetme en Realtime Dinámico 15.4 Aplicación Page 246 258 261 265 265 269 271 274

Capitulo XVI - Distribución automática de llamadas – Colas de espera …........................... 278 16.1 Los agentes 16.2 Las colas de espera – queue.conf 16.3 Agentes dinámicos 16.4 Estadísticas de las colas 16.5 Colas, agentes y estadísticas en Realtime dinámico 278 281 291 294 297

v

Capitulo XVII - Asterisk y los FAX …........................................................................................ 309 17.1 IAXmodem 17.2 Hylafax 17.3 Protocolo T38 17.3.1 Aplicación ReceiveFax 17.3.2 Applicación SendFax 309 313 328 332 334

Capitulo XVIII - Conexiones entre servidores Asterisk …....................................................... 339 18.1 Conectar dos servidores Asterisk con el protocolo SIP 18.2 Conectar dos servidores Asterisk con el protocolo IAX2 18.3 El protocolo DUNDi 18.4 Conectar dos servidores Asterisk con OpenVPN 18.5 Conectar dos Servidores Asterisk con TLS y SRTP Capitulo XIX – AMI y AGI …............................................................................................ 19.1 AMI (Asterisk Manager Interface) 19.2 AGI (Asterisk Gateway Interface) 19.3 Las variantes AGI 19.3.1 EAGI 19.3.2 FastAGI 19.3.3 Async AGI 339 343 345 356 374 382 382 391 397 397 398 400

Capitulo XX - Los registros en Asterisk …................................................................................. 405 20.1 CDR (Call Detail Record) 20.1.1 cdr.conf 20.1.2 cdr_manager.conf 20.1.3 CDR adaptive 20.2 CEL (Channel Event Logging) 20.3 Logger.conf 20.3.1 Debug 405 407 409 411 416 423 426

Capitulo XXI - Seguridad en Asterisk …................................................................................... 429 21.1 Reglas de oro 21.2 Fail2ban 429 429

Capitulo XXII - Monitorear Asterisk ….....................................................................................434

vi

22.1 Monit 22.2 SNMP 22.3 Nagios 22.3.1 NDOutils 22.4 Monitoreo calidad llamadas 22.4.1 Monitoreo calidad llamadas desde la consola de Asterisk 22.4.2 Monitoreo calidad llamadas con VoIPMonitor

434 439 442 453 455 455 456

Capitulo XXIII - Conectar un Softphone (Blink) de forma segura: SIP TLS y SRTP …...... 462 23.1 Creación de los certificados 23.2 Configuración Softphone Blink 462 466

Capitulo XXIV - Openfire y Asterisk …..................................................................................... 471 24.1 Instalación de Openfire 24.2 Instalar el Plugin SIPPhone en Openfire 24.3 El Plugin Asterisk-IM 24.4 Asterisk como cliente en Openfire 24.5 Conectar dos servidores Openfire 24.6 Openfire Connection Manager 471 479 483 487 490 494

Capitulo XXV - Asterisk y alta disponibilidad ......................................................................... 499 25.1 Replicación MySQL Master-Slave 25.2 Replicación MySQL Master-Master 25.3 DRBD - Raid1 vía TCP 25.4 Heartbeat 499 505 515 522

Capitulo XXVI - Asterisk GUI …............................................................................................. 529 Capitulo XXVII – FreePBX …................................................................................................... 535 Apéndice A – Instalar CentOS 5.8 en una maquina virtual con VirtualBox Apéndice B – Archivos de configuración Apéndice C – Licencia GNU FDL 542 564 582

vii

Introducción
Después de unos cuantos meses de trabajo, toma vida la primera versión del libro dedicado a la versión 1.8.X de Asterisk PBX. Como siempre pasa con los manuales, muchos dirán que no se abordaron algunos temas importantes, otros que la parte descriptiva es muy sucinta. La verdad, todos tienen razón. Iba a añadir una cuantos párrafos más pero pensé que podía dejarlo para “mañana”. Lo que si les puedo decir es que en la próxima versión estarán presentes estos termas: • • • Aplicación Chan_spy Aplicación GotoIfTime (para enrutar las llamadas entrantes según la fecha y la hora) El funcionamiento de la negociación de los codec audio a lo largo de una llamada

Siempre he sido una persona muy parca con las palabras y la escritura. No me gusta alargarme demasiado cuando escribo y no me gusta que las palabras sobren. Puede ser que en algunas partes del libro me he pasado un poco aplicando esta regla, pero para eso están las primera versiones de un manual. De ellas se aprende para mejorarlas. La que me gusta de este manual es que parte desde la instalación del sistema operativo (Linux CentOS 5.8) y acompaña quien lo lee hacia la instalación y configuración de Asterisk hasta armar una centralita completamente lista para las funciones básicas e intermedias. Todo esto probando cada nueva configuración como si se estuviera trabajando en un laboratorio de prueba. Quiero darles las gracias a los viejos y nuevos participantes a mis cursos a distancia que son los que me animaron y me animan a escribir y mejorar este libro. Es gracias a ellos que he ido aprendiendo cada día más y que me inspiran con sus preguntas a la hora de escribir.

viii

Capitulo I Instalación de Asterisk
Asterisk es el programa Open Source más reconocido para implementar una PBX. Para una lista completa de las funcionalidades brindadas, visiten la página de los desarrolladores. Entre ellas: • • • • • • • • • • Registro (Log) de llamadas Grabación de llamadas Desvío de llamadas Trasferencia de llamadas Conferencias audio Música en espera Gestión de colas (call center) Soporte para tarjetas y Gateway FXO, FXS, digitales y celulares IVR Buzón de voz

Este libro abarca la instalación de Asterisk en un VPS (Servidor Virtual Privado) remoto y es valida para cualquier Servidor Linux CentOS. Con el VPS remoto la ventaja es tener una PBX siempre activa, independiente de la banda ancha disponible en la casa/oficina y evita tener una computadora dedicada y siempre encendida. En este caso, considerando la relación calidad/precio, se ha optado por los VPS de la empresa Linode. Para aquellos que quieran trabajar con un servidor local, en la apéndice A es presente una guía para la instalación de CentOS en VirtualBox. 1.1 Preparación del VPS

Una vez adquirido el servidor Linode, desde la pagina de administración, se selecciona el enlace que aparece en la imagen que sigue:

Se escoge el centro de datos donde se quiere tener el servidor virtual remoto (en este caso Dallas):

En la nueva ventana que aparecerá se configurarán algunos parámetros (distribución Linux. Memoria disco. En la sección “Disk Images”. se crean dos nuevas particiones seleccionando el enlace “Create a new disk image”: 2 . swap y contraseña del usuario root. Terminada la configuración se presiona el botón “Rebuild”. Se deja una parte del espacio del disco duro para crear dos particiones que se utilizarán para la configuración de alta disponibilidad. Empezará el proceso de instalación y configuración del sistema operativo.

La primera: La segunda: Para añadir las dos particiones al perfil del VPS se selecciona el enlace que aparece en la siguiente imagen: 3 .

Una vez que el servidor esté corriendo. se puede acceder al servidor con el programa PuTTy (un cliente SSH): 4 .y en la sección “Block device Assignment”.0 (3. Por eso en el próximo párrafo se verá como instalar en el servidor la ultima versión disponible del Kernel-XEN.Ya se puede iniciar el servidor presionando el botón “Boot”. como indicado en la imagen que sigue.18-linode43).0. el Kernel que se instala es la versión “Latest 3. que aparece en el lado derecho de la pagina de administración de Linode. Como se puede ver en la imagen. se añaden las dos particiones como mostrado en la imagen: Se va al final de la pagina y se presiona el botón “Save Changes”. De esta versión no hay las fuentes disponibles y eso imposibilita la instalación de DAHDI.

donde aparecen todos los datos de configuración de la red: Se descarga el programa PuTTy para Windows desde esta pagina: http://the.exe Una vez descargado se ejecuta.Para conocer la dirección IP del servidor Linode.li/~sgtatham/putty/latest/x86/putty. Aparecerá la siguiente ventana: 5 .earth. se entra en la siguiente pagina.

Terminada la configuración se presiona el botón “Save” y luego el botón “Open” que aparece más abajo. 6 . El resultado será: La primera cosa que hay que hacer es actualizar el sistema: yum -y update y luego reiniciarlo: reboot Se esperan un par de minutos y se vuelve a entrar con el cliente PuTTy. en “Port” 22 y en “Saved Sessions” un nombre que identifique la conexión al VPS. Si se está utilizando Linux se abre una ventana terminal y para conectarse al servidor remoto se ejecuta el siguiente comando: ssh root@IPlinode en lugar de IPlinode se pone la dirección IP publica del servidor remoto.En “Host Name (or IP address) se pone la dirección IP del servidor Linode. Se abrirá una nueva ventana donde en “login as” hay que poner root y en “password” la contraseña que se ha escogido al momento de la instalación del sistema operativo.

1.12.el5xen) kernel /boot/vmlinuz-2.12.18-274.6.6.org/tmp/selinux-grub Como la versión del Kernel-XEN puede cambiar. antes de ejecutar el script.voztovoice.1.1. Primero se descarga y se ejecuta el script que sigue que se ocupará de la configuración de GRUB y de la instalación de Selinux: cd /usr/src wget http://www./selinux-grub Se puede averiguar que efectivamente se ha instalado el sistema de arranque GRUB con este comando: 7 .img Si las versiones son diferentes se modifican las lineas indicando la versión corriente.2 GRUB.6. Si son iguales. se cierra el archivo y se vuelve ejecutable: chmod +x selinux-grub y se inicia: .1.el5xen.18-274.el5xen root=/dev/xvda initrd /boot/initrd-2.18-274. Kernel-XEN y clave RSA En este párrafo se verá como instalar el sistema de arranque GRUB con la ultima versión disponible del Kernel-XEN y como volver más seguro el acceso al servidor remoto a través de la creación y configuración de SSH utilizando una clave RSA. se averigua cual es la ultima versión disponible del kernel-xen yum info kernel-xen y se compara con la que aparece en estas lineas del archivo selinux-grub: title CentOS (2.12.

ls /boot/grub/ Como el script instala dos servicios relacionados con el protocolo iSCSI que no se necesitan. se desabilitan: chkconfig iscsi off chkconfig iscsid off El paso a seguir es modificar la configuración del servidor Linode. Desde la pagina de administración se selecciona el enlace que aparece en la imagen: En la nueva pagina se modifican los parámetros como indicado en las dos siguientes imágenes: En Botton Settings – Kernel escogemos “pv-grub-x86_32 8 .

en la pagina de Linode se entra en el menú “Remote access” y luego se sigue el enlace “Launch Lish Ajax Console” che permite acceder al servidor desde una consola local. Se abrirá una nueva ventana y después de unos segundos aparecerá esta imagen: Para crear la clave RSA se descarga el programa PuTTygen: http://the. Se regresará a la pagina principal del servidor Linode y de ahí se reinicia: Para averiguar que efectivamente el sistema se reinicia utilizando el Kernel-XEN y el gestor de arranque GRUB.Casi al final de la pagina se modifican los dos parámetros indicados cambiado la opción de Yes a No.earth.exe Se ejecuta: 9 .li/~sgtatham/putty/latest/x86/puttygen. Para terminar se guardan los cambios presionando el botón “Save Changes”.

Para la creación de la clave se necesita generar una serie aleatoria de números y se hace moviendo el ratón en el cuadro que aparece bajo la linea “Key”: Hay que seguir moviendolo hasta que la barra que aparece no llegue al final de la linea.En “Number of bits in a generated key” se pone 2048 (se crea una clave de 2048 Byte) y luego se presiona el botón “Generate”. Terminada la 10 .

se presiona el botón derecho del ratón y se escoge en el menú “copiar”: 11 .operación se tendrá disponible la clave RSA (publica y privada): Se guarda la clave privada en una carpeta del ordenador local presionando el botón “Save private key”(en este caso se nombra claveprivada): Para continuar se selecciona todo el texto que aparece en la imagen que sigue.

se crea la carpeta ssh: mkdir .El texto copiado es la clave publica.ssh se entra en la carpeta: cd .ssh se crea el archivo authorized_keys que es donde el sistema operativo buscará las claves RSA publicas del sistema (en este caso para el usuario root): nano authorized_keys se pega el contenido copiado desde PuTTygen que debe quedar todo en la misma linea: 12 .ssh se permite el acceso a la carpeta creada solamente al usuario root: chmod 700 . Se accede nuevamente con PuTTy al servidor remoto y se sigue este procedimiento para utilizar la clave publica.

Se guarda el archivo hundiendo las teclas CTRL-X. Se asigna al archivo recién creado los permisos de lectura y escritura solamente al usuario root: chmod 600 /root/.ssh/authorized_keys Terminada esta operación se modifican algunos parámetros del servidor SSH para permitir el acceso al VPS solamente al usuario root si se autentica con la clave RSA; además, para aumentar la seguridad, se cambia el puerto predefinido para el acceso SSH (22 TCP), escogiendo otro (15000 TCP). Esto se hace modificando el archivo de configuración del servidor SSH: nano /etc/ssh/sshd_config Se buscan estas lineas (para buscar un texto con el editor nano hay que hundir la tecla CTRL junto a la tecla W): #Port 22 #RSAAuthentication yes PasswordAuthentication yes y se modifican para que queden: Port 15000 RSAAuthentication yes PasswordAuthentication no De esta forma se cambia el puerto predefinido para acceder al servidor remoto (de 22 a 15000), se activa el acceso con claves RSA y se desactiva la autentificación con nombre de usuario y contraseña. Se guardan los cambios y se reinicia el servidor SSH: /etc/init.d/sshd restart Se abre otra instancia del cliente SSH:

13

Se pone la IP del servidor Linode, come puerto el 15000 y se asigna un nuevo nombre a esta nueva conexión.

En la barra de la izquierda se busca el menú “SSH”, luego “Auth” y se presiona el botón “Browse”. Se busca la clave privada en la carpeta donde se ha guardado anteriormente y se selecciona. Se vuelve al menú Session (en la izquierda) y se guarda esta nueva configuración hundiendo el botón “Save”. Ahora hay dos sesiones disponibles en el cliente SSH: Linode y Linode2. Para acceder al servidor Linux se escoge la sesión Linode2, botón “Load” y luego botón “Open”. Debe aparecer esta ventana:

14

Una vez que se haya escrito el nombre de usuario root en “login as:”, automáticamente el cliente se conectará al servidor autenticándose con la clave RSA creada. Para terminar la configuración del VPS, se modifica la hora predefinida del servidor y, si se quieres, el idioma del sistema operativo: rm /etc/localtime rm: remove regular file `/etc/localtime'? Y En el caso de Colombia, se crea un enlace simbólico a la hora de Bogotá: ln -s /usr/share/zoneinfo/America/Bogota /etc/localtime se averigua que la hora sea exacta con el comando: date Para que la hora se actualice de manera automática se instala el servidor NTP (Network Time Protocol): yum install ntp Se configura para que se inicie automáticamente al arrancar el servidor Linux: chkconfig ntpd on y se inicia: service ntpd start Starting ntpd: Para modificar el idioma predefinido (ingles) y ponerlo en español (de Colombia): nano /etc/sysconfig/i18n se modifica esta linea: LANG="en_US.UTF-8" para que quede:

15

LANG="es_CO.iso88591" Para activar el nuevo idioma basta salir y volver a entrar al servidor con PuTTy. 1.3 Utilidades, librerías, dependencias Antes de la compilación de Asterisk, se instalarán una serie de librerías y dependencias que permitirán obtener la instalación de casi todos los módulos de la PBX. Se empieza con Vorbis que es una librería para la compresión/descompresión audio: yum install libvorbis libvorbis-devel vorbis-tools libogg libogg-devel se sigue con CURL que es un cliente que permite recibir o enviar archivos utilizando los protocolos HTTP, HTTPS, FTP, GOPHER, DICT, TELNET: yum install curl curl-devel libidn-devel se instalan todas las librerías y dependencias que se necesitan para compilar las fuentes: yum install gcc ncurses-devel make gcc-c++ libtermcap-devel zlib-devel libtool bison bison-devel yum install openssl-devel bzip2-devel wget newt-devel subversion flex gtk2-devel a seguir para crear y gestionar las bases de datos, MySQL: yum install mysql mysql-server mysql-devel UNIXODBC que es la implementación Linux de los API ODBC que permiten conectarse a muchos sistemas de gestión de base de datos (ej: MySQL): yum install unixODBC unixODBC-devel mysql-connector-odbc libtool-ltdl-devel Se instala FESTIVAL, que es un sistema de text to speech (disponible en español): yum install festival festival-devel Una vez terminada esta parte se empieza a instalar una serie de programas desde las fuentes; el primero es SPEEX que es un programa para la compresión audio específicamente diseñado para la voz. IMPORTANTE: Para todos los programas que se instalan desde las fuentes, antes de descargarlos, averiguar si hay una versión más reciente disponible. cd /usr/src wget http://downloads.xiph.org/releases/speex/speex-1.2rc1.tar.gz 16

tar -xf speex-1.2rc1.tar.gz cd speex-1.2rc1 ./configure --prefix=/usr make make install Se continua con LAME que es utiliza para codificar archivos audio en formato MP3: cd /usr/src wget http://ufpr.dl.sourceforge.net/sourceforge/lame/lame-3.99.5.tar.gz tar -xf lame-3.99.5.tar.gz cd lame-3.99.5 ./configure --prefix=/usr make make install LIBMAD que es un MPEG audio decodificador de alta calidad: cd /usr/src wget http://prdownloads.sourceforge.net/mad/libmad-0.15.1b.tar.gz tar -xf libmad-0.15.1b.tar.gz cd libmad-0.15.1b ./configure --prefix=/usr make make install WAVPACK es un compresor audio de alto rendimiento sin perdida de calidad: cd /usr/src wget http://www.wavpack.com/wavpack-4.60.1.tar.bz2 tar -xf wavpack-4.60.1.tar.bz2 cd wavpack-4.60.1

17

./configure --prefix=/usr make make install Se termina con SOX que es un programa que permite la manipulación de archivos audio y la posibilidad de pasarlos de un formato a otro: cd /usr/src wget http://downloads.sourceforge.net/project/sox/sox/14.4.0/sox-14.4.0.tar.gz tar -xf sox-14.4.0.tar.gz cd sox-14.4.0 ./configure -prefix=/usr Al finalizar el configure aparecerá esta tabla donde se encontrarán todos los formatos audio que se podrán manipular con SOX:

Se termina con la compilación e instalación: make make install

18

1.4 LIBPRI En el caso que se quiera instalar tarjetas digitales en el servidor Asterisk (E1, T1, ISDN), antes de instalar DAHDI, hay que instalar la librería libpri cd /usr/src wget http://downloads.asterisk.org/pub/telephony/libpri/libpri-1.4.12.tar.gz se descomprime: tar -xf libpri-1.4.12.tar.gz se entra en la carpeta: cd libpri-1.4.12 se compila y se instala: make make install 1.5 DAHDI El paquete DADHI (Digium Asterisk Hardware Device Interface) permite cargar los drivers y configurar distintos tipos de tarjetas en Asterisk (analógicas, digitales, RDSI/ISDN, cancelador de ECHO). Asterisk además se apoya en DAHDI para las conferencias audio (modulo app_meetme) y el trunking IAX2 (tema tratado en la configuración del archivo iax.conf). Se instala el paquete de desarrollo del Kernel-Xen: yum install kernel-xen-devel IMPORTANTE: La única diferencia con un sistema CentOS local o un servidor dedicado es que se instala el paquete estándar del Kernel: yum install kernel-devel Se continua con la ultima versión disponible de DAHDI-Linux: cd /usr/src wget http://downloads.asterisk.org/pub/telephony/dahdi-linux/dahdi-linux-current.tar.gz tar -xf dahdi-linux-current.tar.gz cd dahdi-linux-2.6.0 19

make make install Se termina con la ultima versión disponible de DAHDI-Tools: cd /usr/src wget http://downloads.asterisk.org/pub/telephony/dahdi-tools/dahdi-tools-current.tar.gz tar -xf dahdi-tools-current.tar.gz cd dahdi-tools-2.6.0 ./configure make menuselect en la ventana que aparece se seleccionan todos los módulos disponibles como indicado en la imagen que sigue:

Se guarda la configuración presionando la tecla tabulador hasta posicionarse sobre “Save & Exit”. Se termina con la compilación e instalación: make make install make config Ya se puede iniciar DAHDI: /etc/init.d/dahdi start Loading DAHDI hardware modules: wct4xxp: wcte12xp:

[ OK ] [ OK ] 20

wct1xxp: wcte11xp: wctdm24xxp: wcfxo: wctdm: wcb4xxp: wctc4xxp: xpp_usb:

[ OK ] [ OK ] [ OK ] [ OK ] [ OK ] [ OK ] [ OK ] [ OK ]

No hardware timing source found in /proc/dahdi, loading dahdi_dummy Running dahdi_cfg: [ OK ] 1.6 App_fax, GoogleTalk, LibiCAL y SRTP En este párrafo se verá como instalar SpanDSP, un procesador de señales digitales que en Asterisk permite la instalación del modulo res_fax para la recepción y envío de FAX, y IKSEMEL que permite implementar el protocolo XMPP en Asterisk y de esta forma conectarse a GoogleTalk y/o a cualquier servidor de tipo XMPP (otro ejemplo es Openfire): Para SpanDSP se necesita instalar primero las librerías libtiff y libxml2: yum install libtiff libtiff-devel libxml2 libxml2-devel se continua con SpanDSP: cd /usr/src wget http://www.soft-switch.org/downloads/spandsp/spandsp-0.0.6pre20.tgz tar -xf spandsp-0.0.6pre20.tgz cd spandsp-0.0.6 ./configure --prefix=/usr make make install El protocolo XMPP permite conexione seguras entre cliente y servidor utilizando el protocolo TLS; para ese efecto se instala, antes de IKSEMEL, las relativas librerías: yum install gnutls gnutls-devel gnutls-utils se continua con IKSEMEL: cd /usr/src

21

wget http://iksemel.googlecode.com/files/iksemel-1.4.tar.gz tar -xf iksemel-1.4.tar.gz cd iksemel-1.4 ./configure --prefix=/usr make antes de la instalación se ejecuta un test para averiguar que la compilación haya tenido éxito: make check PASS: tst-ikstack PASS: tst-iks PASS: tst-sax PASS: tst-dom PASS: tst-sha PASS: tst-md5 PASS: tst-filter PASS: tst-jid ================== All 8 tests passed ================== Ya que todo está bien, se puede instalar: make install Antes de la instalación de Asterisk, se termina la preparación del sistema con unos programas más. Primero un servidor de correo electrónico, SENDMAIL: yum install sendmail sendmail-devel sendmail-cf Se configura para que arranque en automático: chkconfig sendmail on Al alquilar el servidor Linode, cada usuario tiene asignado un sub-dominio que se puede utilizar para la configuración del sistema. Este dato aparece en la pagina de administración de Linode, bajo el menú “Remote Access”

22

En este caso el sub-dominio asignado es li371-235.members.linode.com. Ese nombre se pone en la configuración de red del servidor de la siguiente forma: nano /etc/sysconfig/network al final del archivo se añade la siguiente linea: HOSTNAME=li371-235.members.linode.com Se guardan los cambios y se reinicia el servicio de red: service network restart El sub-dominio se utilizará también para el envío de los correos electrónicos. Por defecto el servidor de correo electrónico escucha solamente en la puerto TCP 25 local. Para que sea alcanzable también desde remoto hay que abrir el archivo de configuración de Sendmail: nano /etc/mail/sendmail.mc buscar esta linea: DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl y modificarla como sigue: DAEMON_OPTIONS(`Port=smtp,, Name=MTA')dnl se guardan los cambios y se vuelve a compilar la configuración de Sendmail: make -C /etc/mail

23

se reinicia el servidor de correo: /etc/init.d/sendmail restart para hacer la prueba de conexión al servidor de correo electrónico desde remoto, se abre una ventana terminal en Windows y se escribe: C:\> telnet -a IPLinode 25 En lugar de IPLinode se pone la IP del servidor Linode. El resultado:

OpenLDAP es la versión open source del protocolo Lightweight Directory Access. Normalmente se utiliza para crear un directorio de usuarios que puede ser consultado y/o modificado desde remoto. Muchos programas implementan la posibilidad de conectarse a un servidor OpenLDAP y Asterisk, desde la versión 1.6.X, presenta esta posibilidad: yum install compat-openldap openldap openldap-clients openldap-devel openldap-servers SNMP es el Protocolo Simple de Administración de Red y sirve para controlar y monitorear el desempeño del servidor Linux. En Asterisk permite monitorear, entre otras cosas, los canales y las llamadas. Se utilizará junto a NAGIOS para controlar el servidor Asterisk y enviar avisos cuando se verifique algún tipo de problema: yum install net-snmp net-snmp-devel net-snmp-libs net-snmp-utils En Asterisk existe la posibilidad de guardar los registros de las llamadas en un servidor RADIUS a través de un cliente RADIUS que hay que instalar. En este caso se instala desde las fuentes: cd /usr/src wget http://download.berlios.de/radiusclient-ng/radiusclient-ng-0.5.6.tar.gz tar -xf radiusclient-ng-0.5.6.tar.gz cd radiusclient-ng-0.5.6 ./configure --prefix=/usr make make install

24

En este caso se instala desde las fuentes.2.gz cd lua-5. Al terminar la instalación de Asterisk se encontrará un archivo de ejemplo en la carpeta /etc/asterisk.sourceforge.0.2.48 .gz cd libical-0./configure --prefix=/usr 25 .tar.tar.net/project/freeassociation/libical/libical-0.org/ftp/lua-5.0.gz tar -xf lua-5.gz tar -xf libical-0.lua.2.0 Se modifica el archivo Makefile para que el programa se instale por defecto en la carpeta /usr: nano Makefile se modifica esta linea: INSTALL_TOP= /usr/local para que quede: INSTALL_TOP= /usr Se guardan los cambios.8.tar.X. Primero LIBICAL que permite la implementación del protocolo iCalendar (RFC5546) en Asterisk a través del modulo res_calendar: cd /usr/src wget http://downloads. se compila e instala: make linux make install Para terminar se compilan los paquetes que permiten utilizar las nuevas funcionalidades de Asterisk 1.48.tar.Se continua la preparación del servidor con la instalación del lenguaje de programación LUA que permite escribir el dialplan (o plan de marcado) utilizando este lenguaje.48.48/libical-0. Primero unas dependencias: yum install readline-devel luego el programa: cd /usr/src wget http://www.

/configure --prefix=/usr make make install Por ultimo la librería LIBSRTP que permite implementar en Asterisk el cifrado del flujo media a través del protocolo SRTP (RFC3711): cd /usr/src wget http://downloads./rtpw Se continua con el test: make runtest 26 .29.sh cambiar esta linea: RTPW=rtpw para que quede: RTPW=.org/neon/neon-0.6.4.sourceforge.4.tgz tar -xf srtp-1.make make install Luego NEON que es una librería que permite la implementación del protocolo WebDAV en Asterisk: cd /usr/src wget http://webdav.gz tar -xf neon-0.29. hay que modificar una linea en el archivo que ejecuta el test: nano test/rtpw_test.tar.tgz cd srtp .4.4.net/project/srtp/srtp/1.6.gz cd neon-0.6 .tar.4./configure --prefix=/usr CFLAGS=-fPIC make Antes de lanzar el make runtest. para que tenga éxito.29.4/srtp-1.

/configure make menuselect Desde la versión 1.8.X está presente un nuevo menú “Channel Event Logging” que como se verá más adelante.0 .8.X disponible: cd /usr/src wget http://downloads.make install 1.X lo que antes era un paquete a parte (asterisk-addons) ahora es presente en el paquete principal de Asterisk. Como se puede notar.8. Se descarga la ultima versión 1.0. se inicia con la instalación de Asterisk.asterisk.11.11.tar. Se entra en el menú “Add-ons” y se activan los paquetes que siguen: En Asterisk 1.gz cd asterisk-1. los módulos relacionados con MySQL (menos res_mysql) son “deprecated” y en las versiones futuras de Asterisk serán eliminados.8.0.8.7 Instalación de Asterisk Terminada la preparación del servidor.org/pub/telephony/asterisk/asterisk-1.gz tar -xf asterisk-1.11.tar.8. permite complementar el CDR (call detail record) con nuevas informaciones relacionadas con las llamadas: 27 .

En “Resource modules” se controla que los módulos relacionados con las funciones calendario y cifrado del flujo media estén activados: Se seleccionan todos los módulos en el menú “Utilities” y “AGI Samples”: En “Core Sound Packages” se seleccionan todos los paquetes disponibles: 28 .

En “Music On Hold File Packages” se hace lo mismo: Como se hace lo mismo en “Extra Sound Packages”: 29 .

Se guarda la configuración presionando la tecla tabulador hasta posicionarse sobre “Save & Exit”. Se termina con la compilación e instalación: make Si a lo largo de la compilación aparece este error: make[1]: *** [format_mp3.o] Error 1 make: *** [addons] Error 2 se continua con: contrib/scripts/get_mp3_source.sh y luego otra vez el make: make se instala Asterisk: make install se instalan los archivos de configuración predefinidos: make samples 30 .

/etc/init. Success! Cleaning up.. Success! Disallow root login remotely? [Y/n] y . 31 .. skipping. successfully used password. Remove anonymous users? [Y/n] y .. Change the root password? [Y/n] n ..se configura el script de arranque de Asterisk: make config Terminada la instalación.. Success! Remove test database and access to it? [Y/n] y .Dropping test database. Reload privilege tables now? [Y/n] y . moving on...... se procede a la configuración de MySQL para crear la base de datos y la tabla donde se guardarán los registros de las llamadas...d/mysqld start se configura para que arranque en automático: chkconfig mysqld on y se crea una contraseña para el usuario root de MySQL (sesamo): IMPORTANTE: para un sistema en producción utilizar siempre contraseñas fuertes mysqladmin -u root password sesamo Para asegurar el servidor MySQL se ejecuta el programa: mysql_secure_installation Se contestan las preguntas somo sigue: Enter current password for root (enter for none): sesamo OK...

src varchar(80) NOT NULL default ''. duration int(11) NOT NULL default '0'. linkedid varchar(80) NOT NULL default ''. peeraccount varchar(20) NOT NULL default ''. dst varchar(80) NOT NULL default ''.All done! If you've completed all of the above steps. 32 . lastapp varchar(80) NOT NULL default ''. Se entra en el cliente de MySQL: mysql -u root -psesamo se crea la base de datos asteriskcdr: mysql> create database asteriskcdr. Thanks for using MySQL! Se reinicia el servidor MySQL: service mysqld restart Se crea la base de datos para guardar los registros de las llamadas. amaflags int(11) NOT NULL default '0'. calldate datetime NOT NULL default '0000-00-00 00:00:00'. your MySQL installation should now be secure. KEY callerid (clid) ). accountcode varchar(20) NOT NULL default ''. clid varchar(80) NOT NULL default ''. dcontext varchar(80) NOT NULL default ''. disposition varchar(45) NOT NULL default ''. uniqueid varchar(32) NOT NULL default ''. se selecciona: mysql> use asteriskcdr se crea la tabla cdr (copiando y pegando las lineas que siguen): mysql> CREATE TABLE cdr ( id bigint(20) NOT NULL auto_increment. lastdata varchar(80) NOT NULL default ''. billsec int(11) NOT NULL default '0'. userfield varchar(255) NOT NULL default ''. dstchannel varchar(80) NOT NULL default ''. channel varchar(80) NOT NULL default ''. PRIMARY KEY (`id`).

* TO 'asterisk'@'localhost' IDENTIFIED BY 'sesamo'. se configura en el archivo cdr_mysql. desde remoto: mysql> GRANT ALL PRIVILEGES ON asteriskcdr. desde local mysql> GRANT ALL PRIVILEGES ON asteriskcdr.sock Los datos: 33 . se actualizan los permisos: mysql> flush privileges. Se renombra el predefinido: mv /etc/asterisk/cdr_mysql.conf.conf.conf se añaden las siguientes lineas: [global] hostname=localhost dbname=asteriskcdr table=cdr password=sesamo user=asterisk port=3306 sock=/var/lib/mysql/mysql.Con la versión 1.8 de Asterisk se han añadido dos nuevos campos a la tabla CDR: • • linkedid peeraccount que permiten tener informaciones más detalladas de cada llamada.* TO 'asterisk'@'%' IDENTIFIED BY 'sesamo'. se sale del cliente: mysql> quit En Asterisk la conexión a la base de datos y la tabla de los registros de las llamadas.old se crea uno nuevo: nano /etc/asterisk/cdr_mysql. Se otorgan los permisos de acceso a la base de datos creada al usuario asterisk.conf /etc/asterisk/cdr_mysql.

.1. [global] – etiqueta inicial del bloque hostname . 3.. Se sale de la consola: CLI> quit Executing last minute cleanups 34 .d/asterisk start se averigua que esté corriendo: /etc/init. 4. port 3306 using table cdr for 59 seconds. Wrote 0 records since last restart.nombre de la tabla password .contraseña del usuario que tiene los permisos para acceder a la base de datos user . 8. 6.nombre de dominio o IP del servidor MySQL dbname .nombre del usuario que tiene los permisos para acceder a la base de datos port – puerto donde MySQL recibirá las conexiones (predefinido 3306) sock – archivo que se crea cuando se inicia MySQL y que se necesita indicar para una correcta conexión Se guardan los cambios y se inicia Asterisk: /etc/init.nombre de la base de datos table . se entra en la consola: asterisk -rvvvvvvvvvvvvvvvv se controla que la conexión a la base de datos esté activa: CLI> cdr mysql status Connected to asteriskcdr@localhost. 5.d/asterisk status asterisk (pid 2403) is running. 7. 2.

.

Para eso se utilizan tres tipos de tablas: • la tabla filter donde pasan todos los paquetes en entrada y salida.Capitulo II Configuración inicial de Asterisk 2.255. Configurar una DMZ en el router y luego gestionar los puertos directamente con Iptables en el servidor Linux Para instalar iptables: yum install iptables Iptables se encarga de gestionar todos los paquetes que entren y salgan del servidor Linux.0. todas las reglas se aplicarán a la tabla filter: Se acepta todo el trafico en entrada direccionado a la interfaz lookpack iptables -A INPUT -i lo -j ACCEPT Se rechaza (REJECT) todo el trafico entrante direccionado a las IP 127. Si Asterisk se encuentra instalado en un computador local conectado a Internet a través de un router hay dos opciones: • • Abrir los puertos desde la pagina de administración del router.1 Instalar y configurar un cortafuegos Para proteger el servidor Linux de accesos no autorizados hay que instalar un firewall (cortafuegos) y abrir los puertos que Asterisk necesita para aceptar conexiones externas.0/127.255 menos los paquetes para la interfaz -lo .0. La tabla filter acepta tres tipos de opciones (cadenas) • INPUT para los paquetes en entrada • OUTPUT para los paquetes en salida • FORWARD para redireccionar los paquetes la tabla NAT se utiliza para rescribir las direcciones o los puertos de los paquetes la tabla MANGLE se utiliza para modificar algunos parámetros de los paquetes (un ejemplo es marcar los paquetes para que sean procesados y enviados con una prioridad más alta) • • Las reglas se definen una por linea y serán procesadas por iptables siguiendo la misma secuencia. Cuando no se especifica diversamente. Esta es la parte más delicada de la configuración del servidor porque es donde se definen los puertos y los servicios que son accesibles desde Internet.255. En el caso del VPS Linode se instalará y Configurará IPtables.

iptables -A OUTPUT -j ACCEPT Se deja pasar todo el trafico en entrada para el protocolo SSH (puerto 15000 TCP) iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 15000 -j ACCEPT Se deja pasar todo el trafico en entrada destinado al puerto udp 4569 (protocolo IAX2) iptables -A INPUT -p udp --dport 4569 -j ACCEPT Se deja pasar todo el trafico en entrada destinado al puerto udp 5060 (protocolo SIP) iptables -A INPUT -p udp --dport 5060 -j ACCEPT Se deja pasar todo el trafico en entrada destinado al puerto tcp 5060 (protocolo SIP sobre TCP) iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 5060 -j ACCEPT Se deja pasar todo el trafico en entrada destinado a los puertos udp que van de 10000 a 20000 (protocolo RTP) iptables -A INPUT -p udp --dport 10000:20000 -j ACCEPT Se dejan pasar las solicitudes de ping iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT A este punto. o relacionados con conexiones establecidas.0. iptables -A INPUT -j REJECT iptables -A FORWARD -j REJECT Se averigua el estado de las reglas definidas con el comando: iptables -L Aparecerá: 37 .iptables -A INPUT -i ! lo -d 127.0/8 -j REJECT Se aceptan todos los paquetes en entrada de conexiones ya establecidas. se bloquea todo el trafico restante.0. Véase protocolo TCP iptables -A INPUT -m state --state ESTABLISHED. ya que se han definido los puertos base que se necesitan abiertos.RELATED -j ACCEPT Se dejan pasar todos los paquetes salientes.

0.anywhere anywhere ACCEPT udp -. del flujo audio/video) Se renombra el archivo predefinido: mv /etc/asterisk/rtp.conf /etc/asterisk/rtp.0.Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -.anywhere anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT all -.anywhere anywhere ACCEPT tcp -.anywhere anywhere ACCEPT udp -.ESTABLISHED state NEW tcp dpt:hydap udp dpt:iax udp dpt:sip state NEW tcp dpt:sip udp dpts:ndmp:dnp icmp echo-request reject-with icmp-port-unreachable reject-with icmp-port-unreachable [ OK ] Para terminar hay que configurar Asterisk para que use los puertos UDP desde 10000 hasta 20000 para el protocolo RTP (es el que se encarga.anywhere anywhere REJECT all -.conf 38 .conf. una vez establecida la conexión entre dos canales.anywhere anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -.anywhere anywhere ACCEPT udp -.anywhere anywhere Para guardar los cambios: service iptables save Saving firewall rules to /etc/sysconfig/iptables: Se inicia el servicio: service iptables start Para iniciar iptables automáticamente: chkconfig iptables on reject-with icmp-port-unreachable state RELATED.0/8 ACCEPT all -.anywhere anywhere ACCEPT tcp -.anywhere anywhere REJECT all -.old Se crea uno nuevo: nano /etc/asterisk/rtp.anywhere anywhere ACCEPT icmp -.anywhere 127.

/usr/lib/asterisk/modules Contiene todos los módulos compilados y utilizables en Asterisk. /etc/asterisk Contiene todos los archivos de configuración de Asterisk.d/asterisk reload 2.2 Carpetas y archivos Al terminar la instalación de Asterisk unas cuantas carpetas nuevas serán creadas.Se copian las siguientes lineas: [general] rtpstart=10000 rtpend=20000 rtpchecksums=no dtmftimeout=3000 rtcpinterval=5000 strictrtp=yes Los datos: • • • • • • • [general] – etiqueta inicial del archivo de configuración rtpstart – puerto inicial para el trafico RTP rtpend – puerto final para el trafico RTP rtpchecksums – Activar o no la suma de verificación en los paquetes del trafico RTP dtmftimeout – la cantidad de tiempo (en mili segundos) que un tono DTMF sin marcador de fin tiene los permisos para continuar en el trafico RTP mili segundos entre los reportes del protocolo RTCP (protocolo che se utiliza para controlar el trafico RTP strictrtp – Lo paquetes que no proceden del mismo flujo RTP utilizado en la conexión serán eliminados Se guardan los cambios efectuados y se recarga la configuración de Asterisk: /etc/init. /var/lib/asterisk Que a su vez contiene las siguientes carpetas: agi-bin/ 39 .

monitor/ Si se graba una llamada. images/ Donde las aplicaciones irán a buscar las imágenes cuando se comuniquen con teléfonos que soportan esta función.txt en la carpeta 40 . keys/ Claves publicas y privadas que Asterisk necesita para autenticarse con otros servidores o servicios (Ej: DUNDi). outgoing/ Donde hay que mover los archivo de llamadas (call files). Véase el archivo callfiles. firmware/ Donde se guardan los firmware de las tarjetas en uso.donde se guardan los script AGI. /var/spool/asterisk Que contiene: dictate/ Donde se guardarán los archivos audio creados con la aplicación Dictate(). sounds/ Contiene todas las locuciones que se pueden utilizar en el plan de marcado (dialplan). meetme/ Donde se guardarán las grabaciones de las conferencias. esta es la carpeta donde se guardarán los archivos audio. licences/ Las licencias de uso que se han adquirido (Ej: para el codec audio g729). moh/ La música en espera que viene con la instalación de Asterisk (no mp3).

mensajes.conf. De revisar cuando se tengan problemas con Asterisk. buzón de voz). voicemail/ Donde se guardarán los archivos audio de los mensajes de voz dejados en el buzón de voz y los mensajes audio personalizados de cada usuario. llamadas y eventos).doc de las fuentes de Asterisk para una explicación del funcionamiento de estos archivos. AGI. /var/log/asterisk Donde se guardarán todos los registros de Asterisk (errores. system/ Carpeta para archivos temporales creados por la aplicación System(). Realtime). /var/run/asterisk Contiene la ID del proceso de Asterisk cuando esté corriendo. 2. [directories](!) astetcdir => /etc/asterisk astmoddir => /usr/lib/asterisk/modules astvarlibdir => /var/lib/asterisk astdbdir => /var/lib/asterisk astkeydir => /var/lib/asterisk astdatadir => /var/lib/asterisk astagidir => /var/lib/asterisk/agi-bin astspooldir => /var/spool/asterisk astrundir => /var/run/asterisk 41 .conf En el archivo asterisk. que se encuentra en la carpeta /etc/asterisk. Se divide en cuatro bloques: • • • • un bloque donde se definen las carpetas de trabajo de Asterisk un bloque donde se definen distintas opciones un bloque donde se definen los permisos para el socket de Asterisk un bloque donde se define el tipo de comportamiento que debe tener Asterisk para determinadas aplicaciones (dialplan.3 asterisk. tmp/ Carpeta donde se guardan los archivos temporales creados por algunas aplicaciones (Ej. se puede modificar la configuración general de Asterisk.

languageprefix = yes .runuser = asterisk .transmit_silence_during_record = yes .quiet = yes .sendfullybooted = yes .verbose = 3 .lightbackground = yes .console = yes .maxfiles = 1000 .rungroup = asterisk .internal_timing = yes .dumpcore = yes .initcrypto = yes .cache_record_files = yes .timestamp = yes .record_cache_dir = /tmp .execincludes = yes .documentation_language = en_US .nocolor = yes .9 .nofork = yes .transcode_via_sln = yes . se pone maxcalls = 30 y se quita el punto y coma delante de la linea 42 .highpriority = ye .debug = 3 . se quita el punto y coma de la linea nocolors=yes Si el sistema donde está instalado Asterisk no puede cursar más de 30 llamadas.hideconnect = yes El Bloque [options] permite modificar algunas opciones de Asterisk. Algunos ejemplos: • • si se quiere quitar los colores en la consola de Asterisk.maxcalls = 10 .minmemfree = 1 . [options] .autosystemname = yes .astlogdir => /var/log/asterisk El Bloque [directories] es donde se pueden cambiar las carpetas de configuración de Asterisk.systemname = my_system_name .dontwarn = yes . Por defecto todas las opciones están comentadas (no aplican).alwaysfork = yes .transmit_silence = yes .maxload = 0. El valor (!) después de la etiqueta [directories] indica que el bloque esta comentado (no será leído por Asterisk).

se quita el punto y coma delante de maxload = 0. En las versiones anteriores a la 1.ctl El Bloque [files] es donde se definen permisos.4 app_set=1. usuarios y nombre del socket de Asterisk.astctlpermissions = 0660 . Si se abre este archivo.6 app_set=1. el AGI y el Realtime (temas que serán abordados en lo próximos capítulos). [compat] pbx_realtime=1.9 de la CPU del servidor.4 res_agi=1. Este comportamiento se debe a la configuración predefinida del archivo modules.[files] . todos los módulos serán cargados. .6 res_agi=1.astctl = asterisk.astctlowner = root . en cada servidor Asterisk hay que configurar el parámetro systemname con un valor que identifique el servidor Asterisk. Para que esto sea posible.9 si en lugar del usuario y grupo root.• • • si se quiere que al alcanzar un consumo del 0.8 y 1.6 hay que sostituir el pipe con una coma. se quiere que el sistema arranque con usuario y grupo asterisk (que hay que crear) se quita el punto y coma delante de runuser = asterisk y rungroup = asterisk si se utiliza un servidor dedicado para la base de datos y todos los registros de llamadas de distintos servidores Asterisk se guardan en ese servidor. Por defecto cuando se inicia Asterisk. no se curse más llamadas.4 modules.conf. Otra forma de cargar los 43 . Si se quiere que Asterisk interprete correctamente los pipe hay que modificar las tres lineas de la siguiente forma: [compat] pbx_realtime=1. todos los módulos se guardan en la carpeta /usr/lib/asterisk/modules.4 2. se separaban con un pipe | Desde la versión 1. después de la etiqueta [modules] se encontrará el parámetro: autoload=yes que significa que todos los módulos compilados se cargarán al iniciar Asterisk.6 El Bloque [compat] es donde se puede cambiar el comportamiento de Asterisk para el dialplan.conf Cuando se compila Asterisk. no hay forma de saber de cual servidor es un determinado registro. De esta forma en los registros de llamadas se podrá saber en cual PBX se originó la llamada.astctlgroup = apache .6 cuando se definían las opciones de una aplicación.

Si no se va a utilizar este protocolo. en el caso de los módulos relacionados con ODBC.so chan_bridge. Es muy probable que a lo largo de la configuración de Asterisk. Se abre el archivo modules. es mejor desactivarlo en el archivo modules.so chan_iax2.so chan_mgcp. Un ejemplo puede ser el canal Skinny que se utiliza en los teléfonos de marca CISCO. no se necesitará utilizar algunos módulos y es una buena practica desactivarlos de forma que no se carguen al iniciar Asterisk.so chan_oss. Como se verá más adelante.conf y al final se añade la siguiente linea: noload => chan_skinny. Este parámetro se utiliza para cargar un modulo antes de todos los demás.conf: nano /etc/asterisk/modules.so Description Use Count Local Proxy Channel (Note: used internal 0 Inter Asterisk eXchange (Ver 2) 0 Session Initiation Protocol (SIP) 0 DAHDI Telephony Driver w/PRI 0 OSS Console Channel Driver 0 Listen to the audio of an active channel 0 Bridge Interaction Channel 0 Dump Info About The Calling Channel 0 Media Gateway Control Protocol (MGCP) 0 Gtalk Channel Driver 0 UNISTIM Protocol (USTM) 0 44 . hay que utilizar este parámetro para cargarlos antes de todos los demás.so chan_gtalk.so app_dumpchan.so chan_unistim.so app_chanspy.so Se guardan los cambios y se reinicia Asterisk: service asterisk restart Se entra en la consola de Asterisk: asterisk -rvvvvvvvvvvvvvv y con el comando: CLI> module show like chan se verán todos los canales disponibles: Module chan_local. En el mismo archivo encontramos el parámetro preload. En este modo se reduce la memoria y los recursos utilizados por la PBX. Esto se hace utilizando el parámetro noload.conf.so chan_dahdi.módulos podría ser poner ese parámetro en no y luego en el mismo archivo utilizar el parámetro load para cargar los módulos uno a uno.so chan_sip.

2.c:7144 config_load: Configuring skinny from skinny.so => (Skinny Client Control Protocol (Skinny)) El modulo cargado de esta forma quedará activo hasta el siguiente reinicio de Asterisk. Primero se crea la carpeta donde guardar los archivos MP3: mkdir /var/lib/asterisk/mohmp3 Ahora se descarga un archivo mp3 en la carpeta creada.0:2000 == Registered channel type 'Skinny' (Skinny Client Control Protocol (Skinny)) == Manager registered action SKINNYdevices == Manager registered action SKINNYshowdevice == Manager registered action SKINNYlines == Manager registered action SKINNYshowline Loaded chan_skinny.chan_agent.conf': == Found == Skinny listening on 0.so Linux Telephony API Support 0 17 modules loaded El canal chan_skinny no aparece porque se ha configurado para que no se cargue. se utiliza el comando: CLI> module load chan_skinny.0.5 Música en espera y MP3 Una de las funcionalidades de Asterisk es la música en espera. En muchos servicios de asistencia al cliente es típico escucharla mientras se espera que algún operador nos atienda.conf == Parsing '/etc/asterisk/skinny. En este párrafo se mostrará la configuración de la música en espera con archivos MP3.so Redirects a given channel to a dialplan 0 app_chanisavail.so Jingle Channel Driver 0 app_channelredirect.voztovoice.0.mp3 45 .mp3 Informaciones sobre el archivo: sox --i fresas. cd /var/lib/asterisk/mohmp3 wget http://www. Si en un determinado momento se quiere cargar un modulo que ha sido configurado para no cargarse al iniciar Asterisk.so Channel information dialplan functions 0 chan_jingle.so [Dec 9 11:09:18] NOTICE[3054]: chan_skinny.so Check channel availability 0 chan_phone.org/tmp/fresas.so Agent Proxy Channel 0 func_channel.

Se modifica de la siguiente manera: nano /etc/asterisk/musiconhold. Aparecerá: Class: default localhosMode: files 46 . CLI> moh show classes Para ver las clases de música en espera configuradas.conf.conf Se añaden las siguientes líneas al final del archivo: [mp3] mode=files directory=/var/lib/asterisk/mohmp3 random=yes • • • • [mp3] – Nombre de la nueva clase de música en espera mode= files – la nueva clase utilizará archivos audio directory=/var/lib/asterisk/mohmp3 – los archivos se encontrarán en la carpeta indicada en el parametro directory random=yes – los archivos audio se utilizarán de forma aleatoria Se accede a la consola de Asterisk: asterisk -rvvvvvvvvvvvvv Se escribe: CLI> moh reload para recargar la configuración de la música en espera. el paso que sigue es configurar el archivo musiconhold.Terminada la descarga del fichero MP3.

archivo1.el resultado del sampling. Esto porque los archivo MP3 tendrán que ser convertidos en el formato audio requerido por el canal que está accediendo al servicio. -r 22050 frecuencia de sampling de 44100 H/z a 22050 Hz. Considerando que los teléfonos IP no tienen un sistema de audio de alta calidad se puede bajar la frecuencia de sampling de los archivos MP3 sin perder en calidad del audio escuchado.localhosDirectory: /var/lib/asterisk/moh Class: mp3 Mode: files Directory: /var/lib/asterisk/mohmp3 CLI> quit Usando archivos MP3 para la música de espera hay que tener en cuenta que el sistema necesitará utilizar bastante recursos de la CPU.mp3 • • • -c 1 pasamos el archivo de estéreo a mono (un canal).mp3 . Usando la opción -V aparecerá en la pantalla todo el proceso: 47 . El programa que permite este tipo de operación es el mismo SOX. sox fresas.mp3 -V -r 22050 -c 1 fresas1.

En el caso de Asterisk.conf El archivo de configuración de Asterisk extensions. En este párrafo se presentará la configuración base del archivo para luego enriquecerlo a lo largo del libro.mp3 rm: remove regular file `fresas. Este archivo se divide en tres bloques: • • • Parte general Parte dedicada a las variables globales el dialplan 48 . Una pequeña paréntesis.mp3'? Y Para probar la nueva configuración se necesita crear una extensión en el archivo extensions.d/asterisk restart Para luego averiguar que efectivamente el archivo mp3 esté presente en la lista de archivos para la musica en espera [mp3] asterisk -rvvvvvvvvvvvvvvv CLI> moh show files Class: default File: /var/lib/asterisk/moh/macroform-the_simplicity File: /var/lib/asterisk/moh/manolo_camp-morning_coffee File: /var/lib/asterisk/moh/macroform-robot_dity File: /var/lib/asterisk/moh/reno_project-system File: /var/lib/asterisk/moh/macroform-cold_day Class: mp3 File: /var/lib/asterisk/mohmp3/fresas1 2. Más adelante se verá como se crea un contexto y dentro del contexto las extensiones y las prioridades. Para que Asterisk sepa come enrutarlas se definen contextos. Todas las llamadas entrantes y salientes se procesan en este archivo.conf es donde se define el dialplan de la centralita.Se borra el archivo original: rm fresas. IMPORTANTE: cada vez que se modifican o añaden nuevos archivos en la carpeta hay que recargar la configuración de la música en espera o reiniciar Asterisk: /etc/init. extensiones y prioridades. En el lenguaje común.6 Preparación del dialplan – extensions. la extensión es una serie de números o letras que definen un bloque del dialplan dentro del cual se ejecutan aplicaciones o funciones de la PBX. la extensión es el numero de teléfono interno de una oficina o de un determinado servicio con el que se quiere comunicar.conf (el dialplan o plan de marcado) que se verá más adelante.

el valor asociado al parámetro. se asocia a la variable 1000 un valor. se sale del dialplan. Un primero ejemplo: [internas] se define el contexto internas 49 . las variables globales serán reajustadas y asociadas nuevamente desde esta etiqueta empieza la definición de las variables globales. En este caso SIP/1000 se asocia a la variable JUST el valor SIP/justvoip se asocia a IAX2/marko la variable marko el valor writeprotect autofallthrough extenpatternmatchnew clearglobalvars [globals] 1000 JUST marko Terminada la configuración general y globals se empieza a construir el dialplan. Al final del modulo. las variables globales mantendrán su valor definido yes=si se recarga el dialplan. no=si se recarga el dialplan. Para iniciar se crearan dos contexto: internas y externas. la configuración completa del archivo. si writeprotect=yes no se perderán los comentarios y se desactiva el comando “dialplan save” yes=si una llamada. De esta forma se podrá controlar quienes tienen acceso y a que. por cualquier motivo. la llamada será terminada yes=mejora la velocidad de elaboración del dialplan para contextos con un numero elevado de extensiones.En la columna descripción. en negrita. yes=el modulo pbx_config no actualiza automáticamente el dialplan si writeprotect=no y static=yes y se guarda la configuración del dialplan con el comando “dialplan save” se perderán todos los comentarios presentes en el archivo. Parámetro [general] static Descripción etiqueta que da inicio a la parte general no=cuando se modifica una extensión en el dialplan el modulo pbx_config reescribirá este archivo y se perderán todos los comentarios presentes. Cada contexto se compone de extensiones y cada extensión de prioridades. En uno se definirá la parte accesible a todas las extensiones y en el otro la parte dedicada a las llamadas salientes.

Playback(hello-world) la extensión es la misma.n.1.n.2. Con este primer ejemplo ya se puede empezar a entender como funciona el dialplan.1. Desde la versión 1.Hangup la extensión es siempre la misma.60) same => n. Desde una extensión conectada a Asterisk se marca 123 y si esa extensión tiene acceso al contexto internas. En este caso Answer contesta la llamada La segunda linea: exten => 123.MusicOnHold(mp3.Playback(hello-world) same => n.2.exten => 123. luego la segunda y por ultimo la tercera.Answer same => n. 123 es la extensión. 1 es la prioridad y Answer es la aplicación que se utilizará.Answer el comando exten => es para definir una extensión.3.1.Playback(hello-world) exten => 123. Las prioridades indican el orden en que se procesa el dialplan para una determinada extensión.Answer exten => 123. Otra forma de escribir esta parte del dialplan es: exten => 123.Answer same => n. Asterisk contestará la llamada (Answer) ejecutará la aplicación 50 . la prioridad es la numero 2 y en este caso la aplicación es Playback cuya función es enviar el audio de una locución al canal que está llamando La tercera linea: exten => 123. se ejecutará la primera linea.X de Asterisk hay una forma mucho más sencilla de escribir el dialplan y es la que se utilizará en este libro: exten => 123.Hangup La n de la segunda y tercera linea está por “next” y añade una prioridad a la que la precede.Hangup Ahora se configura otra extensión que permite escuchar la música de espera MP3 creada en el párrafo 2.6.1. la prioridad es la numero 3 y la aplicación es Hangup que lo que hace es terminar la llamada.Hangup Marcando la extensión 200.5: exten => 200.

Hangup exten => 200. Pasados los 60 segundos. En el dialplan se pueden definir contextos que incluyen otros contextos.conf.1. De esta forma si un determinado contexto incluye a otro.1. La segunda opción (60) define el tiempo.60) same => n. la llamada terminará (Hangup).conf /etc/asterisk/extensions.Answer same => n.conf y se copian las siguientes lineas: [general] static=yes writeprotect=yse autofallthrough=yse extenpatternmatchnew=yse clearglobalvars=no [globals] 1000=SIP/1000 JUST=SIP/justvoip marko=IAX2/marko [internas] exten => 123.Playback(hello-world) same => n.Hangup [externas] include => internas 51 . que se escuchará la música.MusicOnHold que permite escuchar la música de espera de una clase configurada en el archivo musiconhold. Se renombra el archivo predefinido: mv /etc/asterisk/extensions. en segundos.Answer same => n.conf (es este caso la clase mp3).MusicOnHold(mp3.old se crea uno nuevo: nano /etc/asterisk/extensions. Por ahora se definen dos de esta forma: [externas] include => internas [locales] include => internas Con estos primeros datos se construye el dialplan. ese contexto tendrá acceso a las extensiones presentes en el contexto incluido.

dialplan set extenpatternmatch Use the New extension pattern matching algorithm. Playback(helloworld) [pbx_config] 3. dialplan set global Set global dialplan variable dialplan show chanvar Show channel variables dialplan show globals Show global dialplan variables 52 [pbx_config] . =Para una lista de comandos disponibles: CLI> help dialplan dialplan add extension Add new extension into context dialplan add ignorepat Add new ignore pattern dialplan add include Include context in other context dialplan debug Show fast extension pattern matching data structures dialplan reload Reload extensions and *only* extensions dialplan remove extension Remove a specified extension dialplan remove ignorepat Remove ignore pattern from context dialplan remove include Remove a specified include from context dialplan save Save current dialplan into a file dialplan set chanvar Set a channel variable dialplan set extenpatternmatch Use the Old extension pattern matching algorithm. =Para ver el contexto internas: CLI> dialplan show internas [ Context 'internas' created by 'pbx_config' ] '123' => 1. Hangup() [pbx_config] '200' => 1. MusicOnHold(mp3.[locales] include => internas Se guarda la configuración y se recarga el dialplan desde la consola de Asterisk: asterisk -rvvvvvvvvvvvvv CLI> dialplan reload Para ver el dialplan externas: CLI> dialplan show externas [ Context 'externas' created by 'pbx_config' ] Include => 'internas' -= 0 extensions (0 priorities) in 1 context. Answer() [pbx_config] 2.60) [pbx_config] 3. Hangup() [pbx_config] -= 2 extensions (6 priorities) in 1 context. Answer() [pbx_config] 2.

dialplan show Show dialplan 53 .

.

él mismo se encargará de establecer llamadas entre usuarios que están utilizando diferentes protocolos. Como Asterisk implementa distintos tipos de protocolos (SIP. IAX2. En Asterisk. estos serán tomados desde la parte general del archivo.conf es donde se definen las extensiones SIP. todo lo relacionado con el protocolo SIP. El archivo sip.conf está estructurado en tres bloques: • Una parte general donde se define la configuración global del protocolo SIP. Dentro del protocolo SIP existen los métodos. en general. los mensajes que se envían son una mezcla entre el protocolo HTTP (Hypertext Transfer Protocol) y el protocolo SMTP (Simple Mail Transfer Protocol). que representan las distintas solicitudes que un dispositivo puede enviar a otro. Un usuario (o User Agent como definido en el protocolo SIP) enviará todas sus peticiones a Asterisk que se encargará de procesarlas y de esta forma permitir establecer sesiones media. Un bloque central donde se configura el registro a los proveedores VoIP y/o otros servidores Asterisk Una parte final donde se configuran las extensiones internas. el archivo sip. Desde un punto de vista del funcionamiento.Capitulo III Protocolo SIP y el archivo sip. si no se definen algunos parámetros.conf El protocolo SIP es un protocolo de señalización que permite: • • • • • localizar un usuario contactar un usuario para determinar su voluntad de establecer una sesión Negociación de los media (audio/video) que se utilizarán a lo largo de la sesión Modificar una sesión establecida Terminar una sesión establecida Este protocolo ha sido definido por la IETF (The Internet Engineering Task Force) que es la entidad que se encarga de definir los estándar para la red Internet. En ese documento se explica como deben funcionar programas y/o dispositivos que quieran implementar el protocolo SIP. Al momento de configurar una extensión o una troncal. H323). los proveedores SIP y. Un ejemplo son los codecs audio. • • Hay que pensar en Asterisk como un conmutador que quizás algún día hemos visto en la recepción de . las troncales y las conexiones a otros servidores Asterisk. Los seis métodos principales del protocolo SIP son: • • • • • • REGISTER INVITE BYE ACK CANCEL OPTIONS Asterisk PBX es un B2BUA (back-to-back user agent) y su función es la de hacer de “intermediario” entre los usuarios. En este caso el documento que define el protocolo SIP es el RFC (Request for Comments) 3261.

15 NETMASK=255. desvío de llamadas. Gateway PSTN.conf lo más real posible. se podrán enrutar las llamadas a teléfonos fijos y/o celulares.168. Con las extensiones configuradas se podrán llamar entre ellas.un Hotel o una empresa.181.255.128.0 En IPADDR hay que poner la IP local creada en su VPS Linode. y aprovechar los típicos servicios de una PBX como llamada en espera. Normalmente se utiliza para la creación de una red local entre distintos VPS que estén en el mismo Datacenter. buzón de voz. se activará esta IP local. llamada a tres. utilizar proveedores SIP. Asterisk tiene las mismas funcionalidades. contestador automático. Para volver la configuración del sip. etc. Para hacerlo se entra en la pagina de administración del VPS y en la pestaña “Remote Access” se escoge el enlace evidenciado en la imagen que sigue: Aparecerá la dirección IP local: Se anota el valor y se configura una nueva tarjeta de red virtual: nano /etc/sysconfig/network-scripts/ifcfg-eth0:1 Se añaden estas lineas: DEVICE=eth0:1 BOOTPROTO=none ONBOOT=yes IPADDR=192. Se guardan las modificaciones y se reinicia la red del servidor: service network restart Con el comando: ifconfig 56 . En los VPS Linode hay la posibilidad de activar una dirección IP local.

es posible hundir un botón para transferirla a otra extensión.1 sip.8 de Asterisk o que han habido cambios en su configuración. Se deja comentado Es la dirección IP y el puerto donde Asterisk se pondrá a la escucha para las señalización SIP utilizando el protocolo UDP. a lo largo de una llamada.0.8. significa que es una nueva funcionalidad añadida con la versión 1. Asterisk soporta el protocolo IPv6 es posible configurar cuatro escenarios distintos: 1.Asterisk aceptará conexiones solamente si enviadas a la dirección IPv6 indicada 3.0 – Asterisk aceptará conexiones en todas las direcciones IPv4 presentes en el servidor Linux 57 context allowtransfer realm *udpbindaddr . Posibles opciones: No y Yes si al servidor es asociado un dominio registrado.0.conf La configuración que sigue abarca los parámetros más importantes del sip. 0. Parámetro [general] allowguest Descripción etiqueta que introduce la parte general de la configuración No = no se permiten llamadas entrantes (INVITE) de usuarios no autenticados (aumenta la seguridad de Asterisk) Yes = se permiten llamadas entrantes (INVITE de usuarios no autenticados default = el contexto donde llegarán las llamadas no autenticadas si allowguest=yes En casi todos los teléfonos SIP. cada línea de la tabla viene acompañada por una breve explicación Si es presente un asterisco antes del nombre del parámetro. la configuración completa del archivo. Como desde la versión 1. Este parámetro define si Asterisk aceptará este tipo de solicitudes.veremos la nueva tarjeta de red configurada: 3.168. se puede definir este parámetro para que la autentificación se haga utilizando ese nombre de dominio (digest authentication RFC2617). 192.conf. 2600:3c00::f03c:91ff:fedf:a455 .0 – Asterisk aceptará conexiones solamente si enviadas a la dirección IPv4 indicada 2.1. Al final de la tabla. En negrita la opción que se utilizará para cada parámetro.

En el caso de Linode será IPv6 Como se va a trabajar con Ipv4. En el caso que no lo haga.0. cuando la extensión registrada recibe un nuevo mensaje en el buzón de voz. Este parámetro indica cada cuantos segundos las suscripción tendrá que ser renovada. para que Asterisk escuche en todas las direcciones IPv4 puerto 5060 (el predefinido) el Valor es: 0. Valor. Si no lo hace antes del tiempo indicado.0:560 Representa el números de segundos que tiene a disposición un cliente para registrarse utilizando el protocolo TCP. Con este parámetro se limita el numero de veces que se puede reenviar. Valor: Yes Tiempo máximo.6 es posible configurar Asterisk para que permita la señalización SIP sobre el protocolo TCP Valor yes Es la dirección IP y el puerto donde Asterisk se pondrá a la escucha para las señalización SIP utilizando el protocolo TCP. permitido para REGISTER y SUBSCRIBE entrantes.0. envía el tiempo de duración de su registro. 70 58 tcpauthtimeout tcpauthlimit srvlookup maxexpiry minexpiry defaultexpiry mwiexpiry maxforwards . Valor: 30 Numero máximo de conexiones no autenticadas permitidas utilizando el protocolo TCP. En este caso se configurará para que escuche en todas las direcciones Ipv4 puerto 5060.Parámetro Descripción 4. Valor: 120 La mayoría de los teléfonos SIP. Asterisk hace esta búsqueda limitándose al primer valor encontrado.Asterisk aceptará conexiones en todas las direcciones IPv4 y IPv6 dando prioridad a la primera IP que encuentra. :: . Valor: 60 Cuando un cliente se registra a Asterisk. Valor: 0. en segundos. Se utiliza también para evitar que se creen bucles. lo señalan a través de un icono en la pantalla o un indicador luminoso. permitido para REGISTER y SUBSCRIBE entrantes. sera desconectado. en segundos.0:5060 tcpenable *tcpbindaddr Desde la versión 1. Asterisk considerará que el registro durará el tiempo indicado en este parámetro expresado en segundos. Valor:100 Permite hacer búsquedas de registros DNS SRV basadas en los nombres de dominio para llamadas SIP salientes del tipo: SIP/usuario@dominio.0. Esto porque se “suscribe” a este tipo de servicio en el servidor Asterisk. Valor 3600 Tiempo mínimo.0. Como para el protocolo UDP es posible utilizar cuatro escenarios distintos para indicar IP y puerto de escucha. Valor 3600 Cada vez que un “mensaje” Sip se envía puede atravesar distintos servidores antes de llegar al destinatario.

Valor 60 Asterisk contesta a un INVITE entrante con un solo codec audio en lugar de enviar toda la lista de codecs configurados. Tendrá cobro a partir de este momento".X es posible configurar más de un “contexto” de parqueo. Pueden ser indicados uno por linea o en la misma linea separados por una coma: allow=alaw allow=ulaw o allow=alaw. Este parámetro es muy útil para las transferencias atendida de las llamadas entre extensiones Valor: yes En algunos casos.6. Valor es (Español) Como se verá más adelante cada “mensaje” SIP se compone de diferentes lineas. permite parquear una llamada. Un ejemplo es cuando llamamos un numero celular (en Colombia) y si nadie contesta escuchamos la voz que dice "Sistema correo de voz.Parámetro qualifyfreq Descripción Cada cuantos segundos enviar un paquete OPTIONS a la extensión registrada en Asterisk. El método OPTIONS del protocolo SIP se utiliza también para conocer los métodos disponible en un determinado cliente. Si colgamos. Esto permite saber si la extensión misma es alcanzable.ulaw ulaw: se utiliza en Estados Unidos. Cada linea se llama HEADER o cabecera. Esto permite que el llamante envíe el flujo audio con el codec que se ha establecido. Europa. en este parámetro se indica el predefinido. Este parámetro define se entre los distintos HEADER se envía también el Remote-Party-ID. Valor: yes En Asterisk es posible enviar audio aunque la llamada no ha sido contestada. Valor: no all – Se desactivan todos los codec audio y video Se indican los codec audio y video utilizables. Valor: default el idioma predefinido para las locuciones . entre sus funcionalidades. la única forma de actualizar los datos de una sesión es enviando un SIP UPDATE. África y América Latina clase de música de espera predefinida – default Clase de música de espera cuando un canal de tipo peer se pone en espera – default Asterisk. no pagamos nada porque la llamada realmente no 59 *preferred_codec_only disallow allow mohinterpret mohsuggest parkinglot language sendrpid rpid_update prematuremedia . Como desde la versión 1. Canadá y Australia alaw = se utiliza en Asia. Con este parámetro se activa o desactiva.

Este comportamiento se obtiene poniendo como valor no useragent Asterisk se presentará con este nombre al momento de comunicarse con otros servidores o proveedores SIP. Durante el Early Media. Serían los tonos que se generan cuando se hunden las teclas del teléfono. la llamada será terminada 0=no envía un paquete UDP utilizando el protocolo RPT para mantener abierto el NAT yes=permite suscribirse al estado de una extensión subscribe=Este parámetro define el contexto que se utilizará 60 sdpsession sdpowner dtmfmode videosupport maxcallbitrate callevents authfailureevents alwaysauthreject use_q850_reason rtptimeout rtpholdtimeout rtpkeepalive allowsubscribe subscribecontext . Inband no funciona con el codec audio G729 no=no se activa el soporte para video llamadas yes=se activa el soporte para video llamadas Banda máxima utilizable para video llamadas (predefinida 384 kb/s) yes=cuando el estado de una extensión cambia. Valor: VozToVoice v. 1. Esta serie de códigos.0 Personalizar asterisk asterisk protocolo para el envío de los DTMF (Dual-Tone MultiFrequency). es utilizado por algunos Gateway para mejorar la compatibilidad con el protocolo SIP 60=si en una llamada establecida no hay flujo audio por 60 segundos la llamada será terminada 300=si en una llamada en espera no hay flujo audio por 300 segundos. Con inband los tonos se envían en el flujo audio (protocolo RTP). en lugar de enviar el verdadero motivo del rechazo contestará siempre con un 401 Unauthorized no permitiendo dar pistas a los que están intentando acceder al sistema Yes Permite el envío de los códigos Q850 en el Header Reason que normalmente se utiliza para conocer el motivo porque una llamada SIP ha sido terminada. Esta funcionalidad se llama "Early Media". Valor: rfc2833 Otro valor bastante común es inband. el Asterisk Manager Interface (AMI) genera el correspondiente evento yes=el AMI generará un evento cuando una peer no se pueda autenticar con la PBX yes=cuando un INVITE o un REGISTER es rechazado por Asterisk. los tonos DTMF no funcionan y no se pueden utilizar.Parámetro Descripción ha sido contestada.

maxdatagram=400 Permite diferenciar el tratamiento de las llamadas entrantes según sea un fax o una llamada de voz.externrefresh *nat . Ejemplo 96.8.121. En el VPS Linode se deja comentado Define el tipo de comportamiento que debe tener Asterisk al conectarse con otras extensiones/dispositivos. En el VPS Linode se pone la IP del servidor. En el caso del VPS Linode se pone la dirección IP local creada (personalizar con la IP local de su VPS) Ejemplo: 192. Este parámetro junto a las funciones GROUP y GROUP_COUNT permite limitar el numero de llamadas simultaneas que una extensión puede hacer.0 Si Asterisk está instalado detrás de un NAT. Si no se posee un nombre de dominio. Los distintos valores son: no = usa el parámetro rport (RFC3581) solamente si el cliente remoto lo requiere 61 *t38pt_udptl faxdetect localnet externaddr . El nuevo modulo se llama res_fax que sustituye el viejo app_fax ahora “deprecated” Valor: yes.168.128. se puede utilizar el servicio de dyndns.128.Parámetro notifyringing notifyhold callcounter Descripción para permitir a las extensiones acceder al estado de otras. la aplicación para enviar y recibir fax ha sido reescrita totalmente. yes=Notifica si la extensión está timbrando yes= Notifica si la extensión está en espera yes=cuenta el numero de canales utilizados por una extensión. Los valores permitidos son: • yes = Habilita la detección de FAX T30 y T38 • no = dehabilitado • cng = Habilita la detección de FAX T30 • t38 = Habilita la detección de FAX T38 En el caso que Asterisk esté instalado en una red local que se encuentra detrás de un NAT.0/255.135 Personalizar Si la dirección IP publica es dinámica o está asociada a un nombre de dominio. hay que indicar el rango de direcciones IP de la red local. Desde la versión 1. En el VPS Linode se deja comentado Cada cuantos segundos actualizar la asociación dirección IP – nombre de dominio.126.X.externhost . en lugar de externaddr se utiliza este parámetro. con este parámetro se indica la dirección IP publica de la red. Permite el uso del protocolo T38 (fax sobre IP).255.fec.

tenemos que añadir al final de la linea el numero. los intentos serán infinitos. el tiempo de registro y el nombre de usuario. se puede definir en este parámetro. Valor yes Con esta linea empieza el segundo bloque del archivo sip.provider1. El flujo directo solo es posible cuando las extensiones no se encuentran detrás de un NAT Si se quiere que el trafico RTP (audio/video) viaje sobre una IP distinta a la de la señalización SIP. este parámetro representa el numero de segundos que Asterisk esperará antes de volver a intentar registrarse. comedia = usa el parámetro rport solamente si requerido por el dispositivo remoto directmedia no=no se permite el flujo media directo (protocolo RPT) entre las extensiones. Valor no este parámetro también aplica cuando las extensiones están configuradas en una base de datos.Parámetro Descripción force_rport = impone siempre el uso del parámetro rport yes = impone siempre el uso del parámetro rport y envía el flujo audio/video por el mismo puerto utilizado por el dispositivo remoto.com/1234 Si Asterisk pierde el registro.provider1.media_address rtcachefriends rtupdate register => registertimeout registerattempts . la contraseña sesamo y el dominio sip. Este numero puede ser arbitrario siempre y cuando los proveedores SIP no especifiquen diversamente: • register => fulano:contraseña@sip. Valor 10 62 . Si queremos que las llamadas entre a una extensión definida.com Para el registro con el proveedor el username será fulano. normalmente proveedores SIP o otro servidores Asterisk. Se deja comentado Este parámetro aplica cuando las extensiones están configuradas en una base de datos (se verá más adelante).com. Si ponemos 0.com:5061 En los dos casos las llamadas entrantes llegaran a la extensión s y al contexto que se define en la configuración de la extensión.provider1. el puerto. Valor 20 este parámetro representa el numero de intentos que Asterisk hará para registrarse.provider1.conf y se utiliza para registrarse a servidores externos. en la base de datos se guardará la dirección IP. El parámetro se deja comentado y a seguir se presentan algunos ejemplos: • register => fulano:sesamo@sip. Cuando una de estas extensiones se registre a Asteirsk. Si el proveedor usa un puerto que no es el 5060 hay que especificarlo al final de la línea de esta forma: • register => fulano:sesamo@sip.

Valor: 1234:password@mysipprovider. En el caso del VPS Linode todas las extensiones se conectarán detrás de un NAT (router banda ancha y/o otro tipo de conexión Internet). 63 secret qualify mailbox host dtmfmode context .Parámetro mwi => Descripción Desde la versión 1. Valor Yes Si este parámetro es configurado. Personalizar Valor predefinido: pbx909090 Este parámetro se utiliza para mantener activa la conexión de una extensión que se conecta al servidor Asterisk detrás de una NAT.com/1234 La ultima parte es dedicada a la configuración de las extensiones. En caso contrario se pone la dirección IP Protocolo para los tonos DTMF Valor rfc2833 El contexto a que tendrá acceso la extensión.2. Valor 1000 es=esta extensión utilizará las locuciones en español friend=es un user y peer al mismo tiempo • user: una extensión que se autentica al servidor Asterisk usando el campo From para hacer llamadas. • peer una extensión que se autentica para las llamadas entrantes utilizando la dirección IP y el puerto La contraseña para la extensión. Para subscribirse en la configuración de la extensión se indicará: mailbox=1234@SIP_Remote.X se puede subscribir el estado de un buzón de voz de un servidor remoto. Parámetro [1000] accountcode language type Descripción Numero de la extensión Código que aparecerá en el registro de llamadas para esta extensión. éste controlará si hay mensajes de voz pendientes y en caso positivo se lo comunicará usando MWI = Message Waiting Indicator. En este ejemplo el buzón 1234 y contexto SIP_remote. que es una señal audio o vídeo que puede ser recibida por la mayoría de los teléfonos IP o Softphone Valor 1000@default Si la extensión se conecta remotamente con un IP dinámico se pone dynamic.6. cuando la extensión se conecte al servidor Asterisk.

es decir la posibilidad de capturar la llamada de una extensión que está timbrando. Luego por cada una de ellas. Para crear un template la primera linea debe tener esta sintaxis: 64 . valor Fulano <1000> Personalizar estos dos parámetros definen una de las funcionalidades avanzadas de Asterisk. están detrás de un NAT. Valor 1 para ambos all=se deshabilita todos los codec (audio/video) alaw=se habilita el codec audio alaw g722=se habilita el codec audio g722 g729=se habilita el codec audio g729 h263=se habilita el codec video H263 disallow allow allow allow allow Se configura una segunda extensión: [1001] type=friend accountcode=1001 language=es secret=pbx9091 qualify=yes mailbox=1001@default host=dynamic dtmfmode=rfc2833 context=externas directmedia=no callerid=zutano <1001> callgroup=1 pickupgroup=1 disallow=all allow=alaw allow=g722 allow=g729 allow=h263 Cuando se deben configurar muchas extensiones. el valor es no el nombre y el numero que identifica la extensión cuando llama. como es el caso de una VPS Linode.Valor externas como se ha creado en el dialplan directmedia callerid callgroup pickupgroup Si las extensiones. se pueden crear templates (plantillas) donde se definen todos los parámetros compartidos por todas las extensiones. se configuran solamente los parámetros que la diferencian de las demás. desde otra extensión.

justvoip. Mucho proveedores lo exigen para autenticar las llamadas nombre de usuario.justvoip.com=dominio del proveedor SIP sip. (!) es las sintaxis que indica que se trata de un template. se pasa a la troncal SIP utilizando el proveedor JustVoIP: Parámetro [justvoip] type host fromdomain Descripción nombre que se le asigna a la troncal la troncal es de tipo peer sip. Luego se añaden todas las lineas comunes a todas las extensiones: type=friend language=es qualify=yes host=dynamic dtmfmode=rfc2833 context=locales directmedia=no callgroup=1 pickupgroup=1 disallow=all allow=alaw allow=g722 allow=g729 allow=h263 Ahora para configurar una nueva extensión se puede utilizar ese template de la siguiente forma: [1002](int-locales) accountcode=1002 secret=pbx9092 mailbox=1002@default callerid=Mengano <1002> Terminada la configuración de las extensiones.[int-locales](!) [int-locales] es la descripción del template (en este ejemplo se utilizará para configurar todas las extensiones que tienen acceso solo a llamadas locales).com=Este parámetro permite definir el nombre de dominio que aparecerá en la campo From: de la cabecera SIP. Este parámetro permite definir el nombre de usuario que aparecerá en el campo 65 fromuser .

conf predefinido y se crea uno nuevo: mv /etc/asterisk/sip. defaultuser secret qualify dtmfmode context el mismo valor del parametro fromuser la contraseña.conf.conf Se pegan las lineas que siguen: [general] allowguest=no context=default allowtransfer=yes .tld udpbindaddr=0.0:5060 tcpenable=yes tcpbindaddr=0.conf.From de la cabecera SIP.old nano /etc/asterisk/sip.realm=mydomain.conf /etc/asterisk/sip.0.0. Antes que nada se renombra el archivo sip.0:5060 tcpauthtimeout=30 tcpauthlimit=100 srvlookup=yes maxexpiry=3600 minexpiry=60 defaultexpiry=120 mwiexpiry=3600 maxforwards=70 66 . yes rfc2833 from-justvoip=el contexto donde llegarán las llamadas si se utiliza el proveedor también para las llamadas entrantes no es no=no hay NAT entre el servidor Asterisk y el proveedor SIP all alaw g729 directmedia language nat disallow allow allow Ahora se puede copiar toda la configuración en el archivo sip.0.0. Muchos proveedores lo exigen para autenticar las llamadas.

org .register => fulano:contraseña@sip.0 rtcachefriends=no rtupdate=yes .0.maxdatagram=400 faxdetect=yes localnet= externaddr= .provider1.provider1.register => fulano:sesamo@sip.com/1234 registertimeout=20 registerattempts=10 67 .com:5061 .externrefresh=180 nat=force_rport directmedia=no . 1.fec.dyndns.media_address=0.externhost=prueba.0.com .register => fulano:sesamo@sip.qualifyfreq=60 preferred_codec_only=no disallow=all allow=ulaw allow=alaw mohinterpret=default mohsuggest=default parkinglot=default language=es sendrpid=ye rpid_update=yes prematuremedia=no useragent=VozToVoice v.0 sdpsession=asterisk sdpowner=asterisk dtmfmode=rfc2833 videosupport=yes maxcallbitrate=384 callevents=yes authfailureevents=yes alwaysauthreject=yes use_q850_reason=yes rtptimeout=60 rtpholdtimeout=300 rtpkeepalive=0 allowsubscribe=yes subscribecontext=subscribe notifyringing=yes notifyhold=yes callcounter=yes t38pt_udptl=yes.provider1.

.mwi => 1234:password@mysipprovider.com/1234 [1000] accountcode=1000 language=es type=friend secret=pbx9090 qualify=yes mailbox=1000@default host=dynamic dtmfmode=rfc2833 context=externas directmedia=no callerid=callerid=Fulano <1000> callgroup=1 pickupgroup=1 disallow=all allow=alaw allow=g722 allow=g729 allow=h263 [1001] type=friend accountcode=1001 language=es secret=pbx9091 qualify=yes mailbox=1001@default host=dynamic dtmfmode=rfc2833 context=externas directmedia=no callerid=zutano <1001> callgroup=1 pickupgroup=1 disallow=all allow=alaw allow=g722 allow=g729 allow=h263 [int-locales](!) type=friend language=es qualify=yes host=dynamic 68 .

hay que personalizar los parámetros localnet y externaddr en el bloque general.com fromdomain=sip.com fromuser= defaultuser= secret= qualify=yes dtmfmode=rfc2833 context=from-justvoip directmedia=no language=es nat=no disallow=all allow=alaw allow=g729 Antes de guardar los cambios.dtmfmode=rfc2833 context=locales directmedia=no callgroup=1 pickupgroup=1 disallow=all allow=alaw allow=g722 allow=g729 allow=h263 [1002](int-locales) accountcode=1002 secret=pbx9092 mailbox=1002@default callerid=Mengano <1002> [justvoip] type=peer host=sip. Cada vez que se modifica la configuración del sip. en el bloque del proveedor SIP Justvoip se ponen los datos de usuario y contraseña creados al momento de la creación de la cuenta con el proveedor.justvoip. Se entra en la consola de Asterisk: asterisk -rvvvvvvvvvv Se escribe el comando: CLI> sip reload Para ver los peer configurados: 69 .justvoip.conf hay que recargarla.

169. 0 offline] Para ver los users configurados: CLI> sip show users Username Secret 1000 pbx9090 1001 pbx9091 1002 pbx9092 Accountcode Def.2 Directmedia Como se ha dicho anteriormente. este parámetro permite definir si el flujo audio es directo entre los 70 .CLI> sip show peers Name/username Host Dyn Nat ACL Port Status 1000 (Unspecified) D N 5060 UNKNOWN 1001 (Unspecified) D N 5060 UNKNOWN 1002 (Unspecified) D N 5060 UNKNOWN justvoip/pbx2020 77.129 5060 OK (160 ms) 4 sip peers [Monitored: 1 online.72.Context ACL NAT 1000 phones No Always 1001 phones No Always 1002 phones No Always Para una lista de los comandos disponibles para el protocolo SIP en Asterisk: CLI> help sip sip notify Send a notify packet to a SIP peer sip prune realtime [peer|all] Prune cached Realtime users/peers sip qualify peer Send an OPTIONS packet to a peer sip reload Reload SIP configuration sip set debug {on|off|ip|peer} Enable/Disable SIP debugging sip set history {on|off} Enable/Disable SIP history sip show {channels|subscriptio List active SIP channels or subscriptions sip show channelstats List statistics for active SIP channels sip show channel Show detailed SIP channel info sip show domains List our local SIP domains sip show history Show SIP dialog history sip show inuse List all inuse/limits sip show mwi Show MWI subscriptions sip show objects List all SIP object allocations sip show peers List defined SIP peers sip show peer Show details on specific SIP peer sip show registry List SIP registration status sip show sched Present a report on the status of the sched queue sip show settings Show SIP global settings sip show tcp List TCP Connections sip show users List defined SIP users sip show user Show details on specific SIP user sip unregister Unregister (force expiration) a SIP peer from the registry 3. 3 offline Unmonitored: 0 online.

Para poder entender un poco mejor este comportamiento. mientras que el flujo media va directo de una extensión a otra. no se podrán utilizar funcionalidades avanzadas configuradas en Asterisk que utilizan los tonos para ser activadas.dispositivos o pasa por Asterisk que se encarga de enrutarlo de una extensión a otra. Si alguien lograra entrar en el servidor Linux.3 Contraseñas seguras En el archivo sip. El trafico SIP y RTP pasa completamente por Asterisk. Un típico ejemplo es cuando se instala el servidor Asterisk dentro de una red local y los teléfonos SIP están conectados en la misma red. 3. como los tonos viajan en el flujo audio y Asterisk no recibe ese flujo. podría conocer todas las contraseñas de las 71 .conf el parámetro dtmfmode=inband. En el caso que directmedia= yes el gráfico cambiaría de la siguiente forma: SIP SIP RPT La señalización SIP sigue pasando por Asterisk. La ventaja es que de esta forma se ahorran recursos del servidor Linux. Este escenario funciona solamente si las extensiones no están detrás de un NAT. Si en el sip. se puede ver el gráfico que sigue: SIP RPT RPT SIP En este escenario directmedia=no. con solo abrir el archivo.conf las contraseñas de las extensiones aparecen en texto plano.

45 se compila y se instala: . 3. Para cifrarla la sintaxis es: echo -n "<extensión>:<realm>:<secret>" | md5sum Como el parámetro real presente en la parte general del sip. se instala en el servidor Linux el programa NGREP que permite capturar cualquier tipo de paquete que entre o salga del sistema: cd /usr/src primero se instalan unas dependencias: yum install libpcap-devel luego se descarga el paquete: wget http://downloads.45/ngrep-1. el valor predefinido es asterisk. pues el comando sería: echo -n "1000:asterisk:pbx9090" | md5sum cuyo resultado será: 5b09185bfc9148923c47cdf60c3a1681 Para utilizar la contraseña cifrada en la configuración de una extensión.bz2 se entra en la carpeta creada cd ngrep-1.4 Ngrep Como se quiere tener la traza de los mensajes SIP entre Asterisk y las extensiones.net/project/ngrep/ngrep/1. en el sip. Para evitar esto y volver más seguro el sistema.conf se ha dejado comentado.extensiones.bz2 se descomprime: tar -xf ngrep-1./configure --prefix=/usr make make install 72 .conf en el bloque de la extensión se quita el parámetro secret y se añade el parámetro md5secret asignándole el valor creado.tar.45.45.tar.sourceforge. es posible cifrarlas con el algoritmo MD5. Tomamos como ejemplo la primera extensión cuya contraseña es pbx9090.

Se descarga.3. puede ser utilizado para las pruebas presentes en este libro. Primero se configura la cuenta 1000 creada en Asterisk: Account name: una descripción de la cuenta UserID: el numero de la extensión Domain: la dirección IP o el nombre de dominio del servidor Asterisk (la IP del VPS Linode) 73 . se instala y se inicia.5 SoftPhone X-Lite y REGISTER X-lite es un softphone gratuito desarrollado por la empresa CounterPath que a pesar de sus limitaciones.

Este será el numero que hay que marcar para entrar al buzón de voz y que se configurará posteriormente en el dialplan.Password: la contraseña de la extensión 1000 (pbx9090) Display name: el numero de la extensión Authorization name: el numero de la extensión En la pestaña Voicemail: Se selecciona la casilla “check for voicemail” y en “Number to dial for checking voicemail” se pone 97. 74 .

como la extensión está detrás de un NAT. Si la conexión es contra un servidor local. lograr atravesar el NAT. hay que seleccionar la casilla “None (use local IP address). Interactive Connectivity Establishment es un protocolo (RFC5245) que permite a los dispositivos que lo utilizan. se selecciona la casilla “Auto-detect firewall trasversal method using ICE. 75 .En Topology.

y rport. Se regresa a la consola Linux y se hunden las teclas CTRL-C para terminar la captura de paquetes por parte de Ngrep. Antes de presionar el botón Ok para guardar la configuración.En Advanced se configura cada cuantos segundos X-lite volverá a registrarse a Asterisk (3600). Después de unos segundos el softphone debería estar registrado a Asterisk. Ahora se abre el archivo register: nano /tmp/register 76 . se vuelve a la consola de Linux y se escribe el siguiente comando: ngrep 1000 -W byline port 5060 > /tmp/register De esta forma se capturan todos los paquetes enviados y recibidos por la extensión 1000 y se guardan en el archivo register. Se vuelve al X-Lite y se presiona el botón OK. Como el softphone se encuentra detrás de un NAT. Si la conexión es a un servidor local se pueden desactivar las dos casillas. se selecciona “Send SIP keep-alives para mantener la conexión abierta.

Asterisk Ahora el X-Llite está registrado y Asterisk puede localizarlo en el caso entre una llamada para la extensión 1000.126. Se recomienda la lectura del RFC3261 para entender como funciona la señalización SIP.121. En la consola de Asterisk aparecerá la extensión conectada: asterisk -rvvvvvvvvvvvvvvvvv CLI> sip show peers Name/username Host Dyn Nat ACL Port Status 1000/1000 190. Claramente todavía no hay ninguno (ultima parte del mensaje NOTIFY enviado por Asterisk): Messages-Waiting: no.Asterisk En el mensaje 401 Unauthorized. De hecho el método REGISTER del protocolo SIP sirve para esto. Todo este bloque está relacionado con el buzón de voz de la extensión 1000 y es el que permite a la misma extensión suscribirse a Asterisk para recibir notificaciones cuando sea presente un nuevo mensaje en el buzón de voz.234. Message-Account: sip:asterisk@96.Asterisk X-Lite <-----------------NOTIFY---------------. le enviará un NOTIFY para que el softphone sepa si hay mensajes en el buzón de voz. Si se continua a mirar el archivo register se notará que aparece otro bloque que utiliza el método SUBSCRIBE (RFC4235).54 D N 10527 OK (135 ms) 77 . X-Lite responde enviando una nueva petición de REGISTER añadiendo los datos de autentificación X-Lite ------------------Register---------------> Asterisk X-Lite <------------------200 Ok---------------. Asterisk indica a X-Lite que se requiere una autentificación basada en el protocolo http digest y envía los datos necesarios para que el softphone pueda autenticarse de esta forma. Voice-Message: 0/0 (0/0). La secuencia es: X-Lite ------------------Subscribe-------------> Asterisk X-Lite <-------401 Unauthorized-------------.Asterisk X-Lite ------------------Subscribe-------------> Asterisk X-Lite <------------------200 Ok---------------.Encontraremos esta secuencia: X-Lite ------------------Register---------------> Asterisk X-Lite <-------401 Unauthorized-------------.Asterisk X-Lite ------------------200 Ok-----------------> Asterisk Una vez que Asterisk acepte el SUBSCRIBE enviado por X-Lite.255.135.

En este caso 3CX. en la pantalla que sigue.Otra forma de ver los mensajes SIP es activar el sip debug en Asterisk. se instala y se inicia: Se presiona el botón evidenciado y.54:10527 CLI> sip set debug peer justvoip SIP Debugging Enabled for IP: 77.72.255. Se descarga.6 Softphone 3CX Se instalará un segundo softphone para las pruebas. Se puede hacer de forma general: CLI> sip set debug on SIP Debugging re-enabled o solamente para una extensión/troncal especifica: CLI> sip set debug peer 1000 SIP Debugging Enabled for IP: 190.169. se selecciona el icono Conexión: 78 .234.129:5060 3.

234.En la nueva ventana se presiona el botón New y se configura la extensión 1001: Terminada la configuración se presiona el botón OK y nuevamente OK. La extensión se registrará a Asterisk: CLI> sip show peers Name/username Host Dyn Nat ACL Port Status 1000/1000 190.255.54 D N 10527 OK (134 ms) 79 .

2 se explicará cosa son y como se utilizan los Pattern-matching.timeout[.1.. Para poder utilizar el proveedor para las llamadas salientes.234. resource es ${EXTEN} y timeout es 30 segundos.Dial(SIP/justvoip/${EXTEN}. nano /etc/asterisk/extensions. La variable $ {EXTEN} es una variable de canal (los distintos tipos de variables se presentarán en el párrafo 7. Si nadie contesta dentro de 30 segundos la llamada terminará (Hangup).]][.1) y contendrá el numero marcado.. 1 es la prioridad y Dial es la aplicación que se utiliza para iniciar una llamada. De esta formas si marcamos 1000 1001 o 1002 todas las llamadas entrarán en esta parte del dialplan. después del contexto internas se crea el contexto internacio y se añaden las siguientes lineas: [internacio] exten => _00. en la consola de Asterisk aparecerá: NOTICE[29214]: chan_sip.54 D N 10870 OK (220 ms) 3.1001/1001 190.1.Hangup Como se quiere que solamente las extensiones configuradas con el contexto externas tengan acceso a este contexto se añade esta linea al contexto externas: include => internacio para que el bloque quede: [externas] 80 .Hangup En la primera linea.. El proveedor Justvoip requiere que la sintaxis para marcar cualquier numero sea: 00 + código país + numero.URL]]]) En este caso Technology es SIP.255.30) same => n.options[.7 Llamadas entre extensiones Si desde la extensión 1000 se llama la extensión 1001. después del comando exten => la “_” indica que se está utilizando un Patternmatching.c:20785 handle_request_invite: Call from '1000' to extension '1001' rejected because extension not found in context 'externas' Esto porque no se ha configurado todavía el Dialplan para permitir las llamadas entre las extensiones. En el párrafo 7. La sintaxis es: Dial(Technology/Resource[&Technology2/Resource2[&.conf y al final del contexto internas se añaden las siguientes lineas: exten => _100[0-2].Dial(SIP/${EXTEN}.30) same => n. En este ejemplo [0-2] significa que la cuarta cifra puede ser uno 0 un 1 o un 2.

En la ventana terminal del servidor se escribe: ngrep 1000 -W byline port 5060 > /tmp/invite Luego desde la extensión 1000 se llama la extensión 1001. asterisk -rvvvvvvvvvvvvvvv CLI> dialplan reload Ahora desde la extensión 1000 se marca el numero 1001.include => internas include => internacio Se guardan los cambios y se recarga el dialplan. es INVITE. Se vuelve a la ventana terminal y se termina la captura de los paquetes con CTRLC En el archivo invite estará presente esta secuencia: X-Lite ----------------INVITE---1001-----> <-------401 Unauthorized--------------------------ACK------------------> ----------------INVITE---1001-----> <------------100 Trying-------------------------INVITE 1000--------> <--------180 Ringing-------------<------------180 Ringing------------81 Asterisk 3CX .30") in new stack y en el teléfono 3CX: 3. El resultado en la consola de Asterisk será: Executing [1000@externas:1] Dial("SIP/1000-00000001". Para ver como funciona se hará la traza de una llamada con ngrep. "SIP/1000. Se contesta la llamada y después de unos segundos se cuelga.8 SIP INVITE y CANCEL El método SIP que se utiliza para iniciar una sesión media.

Asterisk contesta diciendo que para aceptar el INVITE. Asterisk envía el BYE al X-Lite que contesta con un 200 OK. Asterisk envía el 200 OK a X-Lite y cuando este confirma la recepción del mensaje con un ACK inicia la sesión media (en este caso solo audio) entre las dos extensiones. Asterisk contesta con un Trying (probando) y envía el INVITE al 3CX que contesta con un 180 Ringing (timbrando). esta es la secuencia: X-Lite ----------------INVITE---1001-----> <-------401 Unauthorized--------------------------ACK------------------> ----------------INVITE---1001-----> <------------100 Trying-------------------------INVITE 1000--------> <--------180 Ringing-------------<------------180 Ringing----------------------------BYE-------------------> <--------------200 OK----------------<-------487 Request Terminated--------------------ACK-----------------> --------------CANCEL-----------> 82 Asterisk 3CX . X-Lite tiene que autenticarse. Se vuelve a la ventana terminal y se termina la captura de los paquetes con CTRL-C. Asterisk devuelve el 180 Ringing a X-Lite.<------------200 OK--------------------------------ACK---------------> <---------------200 OK--------------------------------ACK------------------> Sesion Media <----------------BYE-------------------------------200 OK-------------> <----------------BYE-----------------------------------200 OK-------------------> El X-LIte envía un INVITE para la extensión 1001 a Asterisk. Analizando el archivo cancel. Cuando la extensión 1001 cuelga se genera un BYE que es recibido por Asterisk que contesta con un 200 OK. X-Lite contesta con ACK confirmando que ha recibido la respuesta de Asterisk. Una segunda prueba es que la extensión 1000 cuelgue antes que la extensión 1001 conteste. Cuando la extensión 1001 contesta la llamada genera un 200 OK y Asterisk un ACK confirmando que ha recibido el 200 OK. A partir de este momento termina realmente la llamada. luego envía otro INVITE con sus datos de autentificación. En la ventana terminal de linux se escribe: ngrep 1000 -W byline port 5060 > /tmp/cancel Luego desde la extensión 1000 se llama la extensión 1001 y después de unos segundos se cuelga.

desde la extensión 1002 no funcionará ya que esa extensión no tiene acceso al contexto internacio: NOTICE[10455]: chan_sip. un numero internacional (por ejemplo la linea de atención al cliente de Avianca): 005714013434 Si se intenta marcar el mismo numero.487 Request Terminated------------------ACK----------------> Ahora para probar el proveedor SIP se marca.<-------------200 OK-------------<----. como se verá más adelante. '1002' to extension De esta forma podemos controlar las extensiones que tienen acceso a las llamadas salientes.c:20785 handle_request_invite: Call from '005714013434' rejected because extension not found in context 'locales'. desde la extensión 1000. 83 .

.

de esta forma. reduciendo de hecho. como el sip. De hecho IAX2 utiliza el puerto estándar 4569 UDP para la señalización y el transporte de la sesión media. Al final del modulo. el ancho de banda necesario.0. que permite utilizar un único “trunk” para distintos flujos media.conf Este archivo. quien empezó a escribir el código de Asterisk PBX y actual gerente de la empresa Digium.conf El protocolo IAX (ahora IAX2) ha sido desarrollado por Mark Spencer. A pesar de haber sido aceptado por la IETF y haberse vuelto un estándar de hecho (RFC5456) son muy pocos los proveedores que ofrecen este tipo de conexión y los teléfonos que lo soportan. Con este parámetro se configura un nochecksums delayreject amaflags . Una funcionalidad interesante de este protocolo y que quizás puede ser útil implementar en una instalación de Asterisk.0 no=no se realiza la suma de verificación de los paquetes UDP yes=mejora la seguridad contra “brute force password attacks” retrasando el envío de los rechazos de autentificación Automated Message Accounting.1 iax. DAHDI tiene que ser instalado porque es la fuente de sincronización que IAX2 necesita para funcionar en esta modalidad.0 Asterisk escuchará en todas la direcciones IP presentes en el servidor Linux.CAPITULO IV Protocolo IAX2 – iax. Para que el trunking sea utilizable en Asterisk. Este parámetro va configurado antes del bindaddr. Si se indica 0. toda la configuración del archivo. 4. eliminando.0. Valor 4569 Es la dirección IP y el puerto donde Asterisk se pondrá a la escucha para las señalización IAX2 utilizando el protocolo UDP. La idea detrás de IAX era crear un protocolo que pudiera utilizar el mismo puerto para la señalización y la sesión media.0. los problemas relacionados con el NAT que padece el protocolo SIP. Valor: 0. es la del trunking.conf. Parámetro [general] bindport bindaddr Descripción Esta etiqueta define el inicio de la parte general de la configuración del protocolo IAX2 El puerto UDP usado por este protocolo.0. se divide en tres bloques: • • • Una parte general donde se configuran los parámetros del protocolo Un bloque central donde se configuran los registros a proveedores IAX2 o otro servidores Asterisk Un bloque final dedicado a la configuración de las extensiones En la columna descripción aparecerá en negrita el valor del parámetro.

ulaw 60=tiempo mínimo de espiración del registro de las troncales IAX2 60=tiempo máximo de espiración del registro de las troncales IAX2 yes=se habilita el cifrado de la señalización y del flujo media no=no se fuerza el uso del cifrado define el tamaño máximo de los datos (bytes) que pueden pasar por una troncal IAX2 cuando se configura el parámetro trunk=yes. 86 language mohinterpret mohsuggest bandwidth disallow allow minregexpire maxregexpire encryption forceencryption trunkmaxsize trunkmtu autokill codecpriority . Valor: documentation srvlookup yes=Permite hacer búsquedas de registros DNS SRV basadas en los nombres de dominio para llamadas SIP salientes del tipo: IAX2/usuario@dominio. Este campo se puede personalizar en cada extensión. es=el idioma predefinido para las locuciones clase de música de espera predefinida – default Clase de música de espera cuando un canal de tipo peer se pone en espera – default Con este parámetro se define el ancho de banda disponible para las llamadas y en base a este se escogerán los codecs audio a utilizar entre los configurados. Con 128000 bytes pasarán por la troncal 800 llamadas con codec alaw y paquetes audio de 20ms cuando el trafico que pasa por una troncal IAX2 es bastante alto. medium. Configurando este parámetro con el valor 1240.Parámetro Descripción campo del CDR (call data records) univoco para todas las llamadas. hay la posibilidad que se verifique una mala calidad del audio. Este parámetro acepta como valores: low. Pueden ser indicados uno por linea o en la misma linea separados por una coma: allow=alaw allow=ulaw o allow=alaw. si los paquetes UDP los fragmenta el sistema operativo Linux. mejorando la calidad del audio en las conversaciones yes=si no se recibe un ACK después de una NEW enviado dentro de 2000ms. significa que será el mismo Asterisk el que se encargará de fragmentar los paquetes audio más grandes de 1240 byte. se anula la solicitud Controla quien tiene la prioridad en la negociación de los codec audio. para evitar que el servidor Asterisk se estanque. high all – Se desactivan todos los codec audio y video Se indican los codec audio y video utilizables.

Parametro [marko] type host Descripción Nombre de la extensión friend Puede ser peer y user Si la extensión se conecta remotamente con un IP dinámico se pone dynamic.0/0. permite parquear una llamada. en este parámetro se indica el predefinido. Cuando una de estas extensiones se registre a Asteirsk. Valor no este parámetro también aplica cuando las extensiones están configuradas en una base de datos.linux-support.net Registro con nombre.0. en la base de datos se guardará la dirección IP. Como la mayoría de los teléfonos IAX no la soportan se indica que es opcional para todas las direcciones IP.0. contraseña y dominio • register => joe@remotehost:5656 Registo con nombre. En caso contrario se pone la dirección IP 87 . Por ahora se configurará solamente una extensión. el puerto.Parámetro Puede ser: • caller • host • disabel rtcachefriends rtupdate Descripción Este parámetro aplica cuando las extensiones están configuradas en una base de datos (se verá más adelante).0.0.net Registro con nombre usuario. 0.6. Como desde la versión 1.X es posible configurar más de un “contexto” de parqueo. dominio y puerto remoto (sin contraseña) • register => marko:[key]@tormenta. Valor: default En septiembre del 2009 hubo una actualización del protocolo IAX2 para mejorar la seguridad. Más adelante se verá como configurar una troncal y utilizar IAX2 para el envío de FAX utilizando IAXmodem y Hylafax. clave RSA (key) y dominio parkinglot calltokenoptional requirecalltoken register => En en tercero y ultimo bloque se configuran las troncales/extensiones IAX2. Valor yes Asterisk. entre sus funcionalidades.linux-support.0 auto=se requiere el calltoken solo si el teléfono lo soporta El segundo bloque empieza con las lineas de register. Algunos ejemplos: • register => marko:secretpass@tormenta. el tiempo de registro y el nombre de usuario. Este parámetro con el que sigue hace referencia a esa nueva implementación.

Valor Yes marko Véase parte general. éste controlará si hay mensajes de voz pendientes y en caso positivo se lo comunicará usando MWI = Message Waiting Indicator. se renombra el predefinido y se crea uno nuevo: mv /etc/asterisk/iax.conf /etc/asterisk/iax.0 nochecksums=no delayreject=yes amaflags=documentation srvlookup=yes language=es mohinterpret=default mohsuggest=defautl bandwidth=high disallow=all allow=alaw allow=alaw minregexpire=60 maxregexpire=60 encryption=yes forceencryption=no 88 .Parametro secret context mailbox Descripción La contraseña para la extensión.0. que es una señal audio o vídeo que puede ser recibida por la mayoría de los teléfonos IP o Softphone Valor 1234@default Este parámetro se utiliza para mantener activa la conexión de una extensión que se conecta al servidor Asterisk detrás de una NAT.old nano /etc/asterisk/iax.conf.0. cuando la extensión se conecte al servidor Asterisk. Valor predefinido: pbx9094 El contexto a que tendrá acceso la extensión.conf. Valor externas Si este parámetro es configurado. Valor auto qualify callerid requirecalltoken Para crear el archivo de configuración de iax.conf Se copian las siguientes lineas: [general] bindport=4569 bindaddr=0.

register => marko:[key]@tormenta.trunkmaxsize=128000 trunkmtu=1240 autokill=yes codecpriority=host rtcachefriends=no rtupdate=yes parkinglot=default calltokenoptional=0.linux-support.0 requirecalltoken=auto .net .0.0.register => joe@remotehost:5656 .net [marko] type=friend host=dynamic secret=pbx9094 context=externas mailbox=1234@default qualify=yes callerid=marko requirecalltoken=auto Se guardan los cambios y se actualiza la configuración de IAX2: asterisk -rvvvvvvvvvvvvvvv CLI> iax2 reload Para ver la configuración de la extensión recién creada: CLI> IAX2 show peer marko * Name : marko Secret : <Set> Context : externas Parking lot : Mailbox : 1234@default Dynamic : Yes Callnum limit: 0 Calltoken req: Auto Trunk : No Encryption : (aes128.linux-support.0.0/0.keyrotate) Callerid : "marko" <> Expire : -1 ACL : No 89 .0.register => marko:secretpass@tormenta.

se utilizará el softphone Zoiper.conf. every 10000ms when UNREACHABLE (sample smoothing Off) Para una lista de los comandos disponibles para el protocolo IAX2: CLI> help IAX2 4. Una vez instalado se escoge el menú Settings -> Preferences en la ventana que aparece se elige "Create New IAX account" 90 . Se descarga y se instala.0.0.Addr->IP : (Unspecified) Port 0 Defaddr->IP : 0.0 Port 4569 Username : Codecs : 0x8 (alaw) Codec Order : (alaw) Status : UNKNOWN Qualify : every 60000ms when OK.2 Softphone Zoiper Para conectarse a la extensión recién creada en el archivo iax.

Luego el botón OK que aparece al fondo de la ventana. También en la consola de Asterisk el usuario aparecerá registrado: CLI> IAX2 show peers Name/Username Host Mask Port Status 91 . Se entra nuevamente en el Menú "Settings -> Preferences": Se escoge el usuario marko: En alto a la derecha.se pone el nombre de la cuenta (marko) y se hunde el botón OK: Se ponen los datos come definidos en el archivo di configuración iax. aparecerá la voz "Registered".conf y se hunde el botón Register.

Se averigua que la extensión esté conectada: asterisk -rvvvvvvvvvvvvvvv CLI> sip show peers Name/username Host Dyn Nat ACL Port Status 1000/1000 190. 0 unmonitored] CLI> quit (E) OK (127 ms) Ya que en Zoiper se pueden configurar también extensiones SIP.72.254.255 26599 1 iax2 peers [1 online.254.marko 190.169.254.129 5060 OK (161 ms) 4 sip peers [Monitored: 4 online.129.133 D N 27174 OK (125 ms) 1001/1001 190.133 D N 27256 OK (250 ms) 1002/1002 190. se configura la extensión 1002: Se presiona el botón o ok y en la nueva ventana se ponen los datos de conexión: Se presiona el botón register y el botón ok que aparece al fondo de la pagina.255.129.129.254.255. 0 offline] CLI> quit 92 .133 (D) 255.129.133 D N 5060 OK (137 ms) justvoip/pbx2020 77. 0 offline. 0 offline Unmonitored: 0 online.

A partir de este momento, todas las extensiones SIP y IAX2 están conectadas al servidor Asterisk. Los iconos de los tres softphone:

Ahora la pregunta: ¿Cómo se configura el dialplan para que se pueda llamar el usuario marko ya que la extensión no es un numero sino un nombre? Se hace de la siguiente manera: nano /etc/asterisk/extensions.conf al final del contexto internas se añade: exten => 1234,1,Dial(IAX2/marko,30) same => n,Hangup Se guardan los datos y se recarga el dialplan asterisk -rvvvvvvvvvvvv CLI> dialplan reload Ahora desde la extensión 1000 se marca 1234. El resultado en la consola de Asterisk: Executing [1234@externas:1] Dial("SIP/1000-00000007", "IAX2/marko,30") in new stack El resultado en Zoiper:

De esta forma se ha hecho la prueba de una llamada entre dos teléfonos con distintos protocolos.

93

CAPITULO V GoogleTalk – gtalk.conf jabber.conf
Como se ha visto a lo largo de la instalación de Asterisk, la centralita soporta el protocolo XMMP que permite conectarla a servidores que utilizan ese protocolo. En Asterisk el modulo relacionado es el res_jabber.so. Para ver si efectivamente este modulo ha sido compilado y instalado correctamente, se entra en la consola de Asterisk: asterisk -rvvvvvvvvvvvvvvvvvvv Primero se controla que el modulo exista: CLI> module show like res_jabber Module Description Use Count res_jabber.so AJI - Asterisk Jabber Interface 0 1 modules loaded luego se quita y se vuelve a cargar para controlar eventuales errores: CLI> module unload res_jabber.so == Unregistered application 'JabberSend' == Unregistered application 'JabberSendGroup' == Unregistered application 'JabberStatus' == Unregistered application 'JabberJoin' == Unregistered application 'JabberLeave' == Manager unregistered action JabberSend == Unregistered custom function JABBER_STATUS == Unregistered custom function JABBER_RECEIVE > JABBER: Disconnecting CLI> module load res_jabber.so == Parsing '/etc/asterisk/jabber.conf': == Found == Manager registered action JabberSend == Registered application 'JabberSend' == Registered application 'JabberSendGroup' == Registered application 'JabberStatus' == Registered application 'JabberJoin' == Registered application 'JabberLeave' == Registered custom function 'JABBER_STATUS' == Registered custom function 'JABBER_RECEIVE' Loaded res_jabber.so => (AJI - Asterisk Jabber Interface) Al cargar un modulo aparecen las aplicaciones y las funciones que ese modulo activa.

Se sale de la consola: CLI> quit Para la configuración de un usuario GoogleTalk en Asterisk además del modulo res_jabber.so, hay que configurar el modulo chan_gtalk que es el que permite llamadas de este tipo: • • • Asterisk → GoogleTalk GoogleTalk → Asterisk Asterisk → GoogleVoice

Esto significa que se podrán recibir llamadas de usuarios GoogleTalk en Asterisk y luego, a través de la configuración del dialplan, enrutarlas a cualquier extensión configurada en la PBX. Siempre configurando adecuadamente el dialplan será posible, desde una extensión, llamar usuarios GoogleTalk y efectuar llamadas utilizando el servicio GoogleVoice. Para la configuración se aconseja crear una nueva cuenta en Google. 5.1 jabber.conf y gtalk.conf Se empieza con el archivo de configuración jabber.conf. Como siempre en la columna descripción, en negrita, aparecen los valores que hay que configurar. Al final de las tablas, la configuración de los dos archivos. Parámetro [general] debug autoprune Descripción etiqueta que define el inicio de la parte general no=no se activa el debug en la consola de Asterisk yes=se activa el debug en la consola de Asterisk yes=elimina automáticamente los usuario de la lista de amigos no=no elimina automáticamente los usuarios de la lista de amigos yes=si un usuario añade el usuario configurado en este archivo a su lista de amigos, Asterisk automáticamente lo añadirá a la lista de amigos no=no lo añade automáticamente A partir de la versión 1.8 de Asterisk es posible monitorear el estado de las extensiones remotas utilizando el protocolo XMPP. Este parámetro indica si se habilita el soporte para la especificación XEP-048 del protocolo XMPP. Se deja comentado Este parámetro especifica si los nodos para el monitoreo de las extensiones remotas se crean en automático o no. Se deja comentado.

autoregister

;collection_nodes=yes

;pubsub_autocreate=yes

96

;auth_policy=accept=yes

La especificación XEP-048 se basa en un sistema de suscripciones que los usuarios activan para recibir actualizaciones. Con este parámetro en yes las suscripciones de los usuarios se aceptan en automático. Se deja comentado A partir de esta etiqueta, la configuración del usuario GoogleTalk. Suponiendo que el usuario creado es campus.voztovoice@gmail.com, en la etiqueta se pone el nombre de usuario. Personalizar con el nombre del usuario google creado. puede ser client o component dominio del servidor GoogleTalk. Valor: talk.google.com

[campus.voztovoice]

type serverhost

;pubsub_node=pubsub.dominio.com Nombre del nodo para publicar los eventos para la configuración del monitoreo de extensiones remotas. Se deja comentado username secret port usetls usesasl El nombre del usuario creado en Google. En este ejemplo campus.voztovoice@gmail.com. Personalizar la contraseña asociada al usuario creado en Google. Personalizar 5222 Es el puerto que utiliza GoogleTalk para aceptar conexiones yes=se activa el protocolo TLS. De esta forma todos los paquetes intercambiados entre cliente y servidor serán cifrados yes=se activa el protocolo sasl. Sasl es un protocolo de autentificación y autorización que permite la negociación de protocolos de cifrado entre cliente y servidor. si se quiere añadir un amigo a la lista de amigos directamente desde la configuración del archivo se indica en este parámetro. Si los amigos que se quieren añadir son distintos, se pone una linea con este parámetro para cada amigo. Para este ejemplo se pone voztovoicenet@gmail.com en esta linea. Se especifica si esta conexión se utilizará o no para la generación de eventos en la configuración del monitoreo de las extensiones remotas. Se deja comentado Mensaje de estado que aparecerá junto al nombre de usuario. Valor: Asterisk Server 100=tiempo máximo para la entrega de un mensaje (en segundos)

buddy

;distribute_events=yes

statusmessage timeout

Terminada la configuración del archivo jabber.conf, se continua con el archivo gtalk.conf. En la columna descripción, en negrita, aparecen los valores que hay que configurar.

97

Parámetro [general] context bindaddr

Desc inicia la parte general del archivo contexto del dialplan donde entrarán las llamadas de los usuarios GoogleTalk. Valor: google-in dirección ip para la escucha de peticiones GoogleTalk. Se configura para que escuche en todas las direcciones presentes en el servidor. Valor: 0.0.0.0 A partir de la versión 1.8 de Asterisk se ha añadido este parámetro, que permite definir la IP publica del servidor. Se pone la IP de Linode no=no se permiten llamadas de usuarios GoogleTalk que no estén en la lista de amigos yes=se permiten a partir de esta etiqueta empieza la configuración para los usuarios huéspedes (que no están en la lista de amigos). all=se desactivan todos los codec audio alaw=se activa el codec audio alaw google-in=nombre del contexto del dialplan donde llegarán las llamadas de usuarios huéspedes se pone la etiqueta definida en el jabber.conf para el usuario GoogleTalk configurado en Asterisk. en este ejemplo es campus.voztovoice. Personalizar a partir de esta linea, se definen todos los amigos que se quiere tener en la lista. Para un ejemplo real el usuario es voztovoicenet. nombre del usuario: voztovoicenet@gmail.com all=se desactivan todos los codec audio alaw=se activa el codec audio alaw se pone la etiqueta definida en el jabber.conf para el usuario GoogleTalk configurado en Asterisk. en este ejemplo es campus.voztovoice. Personalizar el contexto del dialplan donde llegarán las llamadas del usuario google-in

externip

allowguest

[guest]

disallow allow context connection

[voztovoicenet]

username disallow allow connection

context

Una vez definidos todos los parámetros de jabber.conf y gtalk.conf, se crean los respectivos archivos. Primero se renombran los predefinidos: mv /etc/asterisk/jabber.conf /etc/asterisk/jabber.conf.old 98

mv /etc/asterisk/gtalk.conf /etc/asterisk/gtalk.conf.old Luego se crea el archivo jabber.conf: nano /etc/asterisk/jabber.conf se pegan las siguientes lineas: [general] debug=yes autoprune=no autoregister=yes ;collection_nodes=yes ;pubsub_autocreate=yes ;pubsub_autocreate=yes [campus.voztovoice] type=client serverhost=talk.google.com ;pubsub_node=pubsub.dominio.com username=campus.voztovoice@gmail.com secret=password port=5222 usetls=yes usesasl=yes buddy=voztovoicenet@gmail.com ;distribute_events=yes statusmessage=Asterisk Server timeout=100 IMPORTANTE: antes de guardar la configuración, hay que personalizar los parámetros username, secret y la etiqueta [campus.voztovoice], con los datos de su cuenta Google. Se pasa al archivo gtalk.conf nano /etc/asterisk/gtalk.conf [general] context=google-in bindaddr=0.0.0.0 externip=IPasterisk allowguest=yes

99

[guest] disallow=all allow=alaw context=google-in connection=campus.voztovoice [voztovoicenet] username=voztovoicenet@gmail.com disallow=all allow=alaw connection=campus.voztovoice context=google-in IMPORTANTE: antes de guardar la configuración, hay que personalizar el parámetro connection con la etiqueta inicial de la configuración del usuario GoogleTalk en el archivo jabber.conf (en este ejemplo campus.voztovoice) y el parámetro externip. Terminada la configuración de los dos archivos se entra en la consola de Asterisk y se recargan los dos módulos; primero res_jabber.so y luego chan_gtalk.so: asterisk -rvvvvvvvvvvvvv CLI> module unload res_jabber.so CLI> module unload chan_gtalk.so CLI> module load res_jabber.so CLI> module load chan_gtalk.so Después de algunos segundos, el usuario debería estar conectado: CLI> jabber show connections Jabber Users and their status: User: campus.voztovoice@gmail.com ---Number of users: 1

- Connected

Para ver la lista de amigos conectados (voztovoicenet@gmail.com) CLI> jabber show buddies Jabber buddy lists Client: campus.voztovoice@gmail.com Buddy: voztovoicenet@gmail.com Resource: talk5D9E1034 node: http://www.asterisk.org/xmpp/client/caps version: asterisk-xmpp 100

Jingle capable: yes Status: 1 Priority: 10 Para una lista de comandos disponibles en los dos módulos CLI> help jabber jabber create collection Creates a PubSub node collection. jabber create leaf Creates a PubSub leaf node jabber delete node Deletes a PubSub node jabber list nodes Lists PubSub nodes jabber purge nodes Purges PubSub nodes jabber reload Reload Jabber configuration jabber set debug {on|off} Enable/Disable Jabber debug jabber show buddies Show buddy lists of our clients jabber show connections Show state of clients and components jabber test Shows roster, but is generally used for mog's debugging. CLI> help gtalk gtalk show channels Show GoogleTalk channels Por ultimo si se entra en GoogleTalk con otro nombre de usuario y se añade a la lista de amigos el usuario configurado en Asterisk (en este ejemplo campus.voztovoice@gmail.com), el resultado será:

El icono del teléfono que aparece, indica que se puede tener una conversación audio con ese usuario. Ahora se pasa al dialplan. Como contexto para las llamadas entrantes de usuarios GoogleTalk, se ha definido google-in. Este contexto va creado en el dialplan: nano /etc/asterisk/extensions.conf Después del bloque internas se añaden estas lineas. [google-in] exten => s,1,NoOp( Call from Gtalk ) same => n,Dial(SIP/1000,30) same => n,Hangup() Todas las llamadas que entren desde GoogleTalk se desvían a la extensión 1000. Si dentro de treinta segundos la extensión 1000 no contesta, la llamadas terminará Para las llamadas salientes se pone al final del contexto internas:

101

exten => _[a-z].,1,Dial(gtalk/campus.voztovoice/${EXTEN},30) same => n,Hangup Una explicación de las dos lineas: Se dice a Asterisk de llamar a través del canal gtalk, usando la conexión campus.voztovoice que es la etiqueta que inicia el bloque de configuración del usuario campus.voztovoice@gmail.com. Con _[a-z]. se puede marcar a cualquier usuario GoogleTalk cuyo nombre empieza con una letra del alfabeto (de a a z). Si después de 30 segundos, nadie contesta, se termina la llamada. Para que esto funcione, hay que añadir un bloque nuevo en el archivo gtalk.conf para cada nuevo usuario siguiendo las mismas pautas utilizadas para configurar el usuario voztovoicenet@gmail.com. En el caso que se quiera llamar un usuario no configurado en gtalk.conf, hay que añadirlo de esta forma en el dialplan (contexto internas): exten => 10000,1,Dial(gtalk/campus.voztovoice/fulano@gmail.com,30) same => n,Hangup suponiendo que fulano@gmail.com es el usuario que se quiera llamar. Se guardan los cambios. Otra forma de actualizar el dialplan sin entrar en la consola de Asterisk es: asterisk -rx "dialplan reload" Dialplan reloaded. Se puede hacer una primera prueba llamando el usuario voztovoicenet@gmail.com desde el X-LIte Se marca de esta manera:

Se presiona el botón “Call”. El resultado:

Para llamar al usuario fulano@gmail.com se marcará la extensión 10000 desde X-Lite. Como nota utilizando el cliente GoogleTalk en un celular Android, es posible efectuar llamadas al usuario configurado en Asterisk pero no es posible (hasta el momento) recibirlas. 5.2 Google Voice Google Voice es el servicio de Google que permite efectuar llamadas a cualquier parte del mundo. Esta 102

funcionalidad es disponible en la pagina personal de la cuenta Google:

Desde la versión 1.8.X de Asterisk, es posible efectuar llamadas utilizando una cuenta Google Voice. Para llamar, por ejemplo, a Estados Unidos, la sintaxis es +1 más el numero a llamar. En el contexto internacio del dialplan: nano /etc/asterisk/extensions.conf se añade: exten => _1XXXXXXXXXX,1,Dial(gtalk/campus.voztovoice/+${EXTEN}@voice.google.com) same => n,Hangup Como se puede ver el + se pone delante de la variable ${EXTEN} ( +${EXTEN}). De esta forma no hace falta marcarlo. Para las llamadas a cualquier otro país la sintaxis es + código país numero. En el mismo contexto internacio se añade: exten => _NNXX.,1,Dial(gtalk/campus.voztovoice/+${EXTEN}@voice.google.com) same => n,Hangup 5.3 Aplicación JabberSend Una aplicación que se activa con el modulo res_jabber.conf es “JabberSend” que permite enviar mensajes instantáneos a usuarios GoogleTalk. La sintaxis de la aplicación es: 103

JabberSend(Jabber,JID,Message) Un ejemplo. Cada vez que una extensión llame la extensión de la música en espera, queremos enviar un mensaje a un usuario GoogleTalk para que se entere. Se modifica el dialplan: nano /etc/asterisk/extensions.conf se cambia este bloque: exten => 200,1,Answer same => n,MusicOnHold(mp3,60) same => n,Hangup para que quede: exten => 200,1,Answer same => n,Jabbersend(campus.voztovoice,voztovoicenet@gmail.com,Estamos escuchando MP3) same => n,MusicOnHold(mp3,60) same => n,Hangup Cambiar “campus.voztovoice” con la etiqueta que define el usuario configurado en el archivo jabber.conf; cambiar el usuario voztovoicenet@gmail.com con el usuario Gmail al que se quiere enviar el mensaje. Se guardan los cambios y se recarga el dialplan: asterisk -rx "dialplan reload" Desde la extensión 1000 se marca la extensión 200. El resultado:

5.4 La función JABBER_RECEIVE La función JABBER_RECEIVE ha sido añadida en la versión 1.8 de Asterisk. Esta función permite interactuar con un usuario Google Talk a través del envío y recepción de mensajes de textos. Para el envío de mensajes de texto se utiliza la aplicación SendText que permite, cuando un canal ya está conectado, enviar texto a ese canal.

104

Set(nombre=${JABBER_RECEIVE(campus.${CALLERID(name)}.1.Como te llamas?) same => n.La sintaxis de la función es: asterisk -rvvvvvvvvvvvvvv CLI> core show function JABBER_RECEIVE JABBER_RECEIVE(account.Set(CALLERID(name)=${nombre}) same => n.Dial(SIP/1000.NoOp( Call from Gtalk ) same => n. es enviar un mensaje de texto a un usuario Google Talk para pedirle su nombre y luego almacenar su respuesta en una variable. para que se vea como funciona.Wait(2) same => n.30) same => n.1.voztovoice.30) same => n. en segundos.conf este bloque: [google-in] exten => s.20)}) same => n.jid[.SendText(Espera un momento mientras te comunicamos con un operador) same => n.voztovoice) jid. bienvenido en VozToVoice) same => n. que tendrá el usuario Google Talk para escribir una respuesta Un ejemplo sencillo. es el tiempo.NoOp( Call from Gtalk ) same => n. se modifica el dialplan: nano /etc/asterisk/extensions.Hangup() La variable ${CALLERID(name)} contendrá el nombre del usuario Google Talk.Dial(SIP/1000. es el nombre del usuario Google Talk con el que se quiere interactuar timeout.Hangup() para que quede: [google-in] exten => s.conf (en este caso campus. Se guardan los cambios y se recarga el dialplan: asterisk -rx "dialplan reload" 105 .SendText(Hola ${nombre}.timeout]) • • • account.SendText(Hola. Para efectuar la prueba. es la etiqueta definida para el usuario Google Talk configurado en el archivo jabber.

En la ventana de chat de Google Talk: En el X-Lite: Aparecerá como callerid. Posibles aplicaciones de esta función: • • • Brindar a los usuarios Google Talk. el nombre que el usuario ha digitado en la ventana de chat de Google Talk. se llama el usuario configurado en Asterisk. Este es un ejemplo muy sencillo.Ahora desde un usuario GoogleTalk. 106 . lo ponga en comunicación con un determinado departamento de la empresa Solicitar al usuario Google Talk dos números a llamar y luego desde Asterisk comunicarlos entre ellos. la posibilidad de crear una extensión en Asterisk digitando todos los parámetros relacionados crear un IVR textual que permita al usuario GoogleTalk escoger una opción que. por ejemplo.

.

realizar y recibir llamadas de teléfono. J1. que también se pueden denominar primarios. FXS (Foreign Exchange Station) es un dispositivo de computador que permite conectar éste a un teléfono analógico. J1 en Japón. Los dispositivos Mixtos FXO/FXS combinan los dos tipos de conexiones según las necesidades del adquirente. En la T1 los canales 0 y 24 son reservados para la señalización. Brasil y Argentina). E1 en Europa y gran parte de latino américa. T1. Estos dispositivos pueden ser de distintos tipos: • • • • • • Tarjetas o Gateway FXO Tarjetas o Gateway FXS Tarjetas o Gateway mixtos (FXO-FXS) Tarjetas o Gateway BRI (ISDN) Tarjetas o Gateway PRI (primarios E1. sean FXO o FXS.. T1. Un ejemplo de dispositivo FXO/FXS es la tarjeta Digium TDM410 que permite instalar un total de 4 módulos. En la E1 los canales de señalización son los 0 y 16. J1) Tarjetas o Gateway GSM/UMTS FXO (Foreign Exchange Office) es un dispositivo de computador que permite conectar éste a la RTB. La diversa nomenclatura de estas lineas está relacionada con los países donde se usan. Los dispositivos E1. son lineas digitales que según el tipo brindan de 23 (T1) o 30 (E1) canales de voz. Las lineas ISDN están compuestas por dos canales audio (de 64Kbit/s cada uno) y un canal (D) para la señalización con la central telefónica (de 16 Kbit/s). En este capitulo se verá como instalar las siguientes tarjetas: • • Digium TDM410 con 4 puertos FXO Digium TE120 (E1) y los siguientes programas: • • • OSLEC para la cancelación de eco El driver Wanpipe para tarjetas Sangoma La librería open2r para la señalización de primarios que se utiliza en algunos países de latino américa (entre ellos México. y mediante un software especial.CAPITULO VI Asterisk y la red PSTN Asterisk puede ser conectado a la red telefónica tradicional a través de tarjetas telefónica o Gateway. T1 son la lineas disponibles en Estados Unidos. . Los dispositivos BRI (Basic rate interface) permiten conectar una linea ISDN (Integrated Services Digital Network) al servidor Asterisk.

Apagar el computador Desconectar el cable de alimentación Abrir el chasis del Computador Insertar la tarjeta en una ranura PCI disponible Volver a poner el chasis del computador Conectar el cable de alimentación al computador Conectar las lineas telefónicas a los puertos FXO de la tarjeta a través de un normal cable telefónico 8.conf 109 .6.0 0200:d161:8005 Ahora se puede configurar. 6. 3. 7. Antes de iniciar con la configuración se para Asterisk y luego DAHDI: /etc/init.1 Tarjeta Digium TDM410 La tarjeta Digium TDM410 puede hospedar 4 módulos de tipo FXO y FXS. 5.d/asterisk stop /etc/init. Los pasos a seguir son: 1. Encender el computador Normalmente CentOS reconoce automáticamente la nueva tarjeta instalada y le asigna un IRQ para que pueda comunicar con el procesador del computador.d/dahdi stop El primer archivo que hay que modificar es el /etc/dahdi/system. En este caso se instalará con 4 módulos FXO para cuatro lineas telefónicas analógicas. 2. Se comprueba que la tarjeta ha sido reconocida: lspci -n debe aparecer: 0000:01:00. 4.

ocupado. Los países cuya configuración está disponibles son: • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • Estados Unidos (us) Australia (au) Francia (fr) Holanda (nl) Inglaterra (uk) Finlandia (fi) España (es) Japon (jp) Noruega (no) Austria (at) Nueva Zelanda (nz) Italia (it) Grecia (gr) Taiwan (tw) Chile (cl) Suecia (se) Bélgica (be) Singapur (sg) Israel (il) Brasil (br) Hungría (hu) Lituania (lt) Polonia (pl) Sudáfrica (za) Portugal (pt) Estonia (ee) México (mx) India (in) Alemania (de) Suiza (ch) Dinamarca (dk) Republica Checa (cz) China (ch) Argentina (ar) Malasia (my) Tailandia (th) Bulgaria (bg) Venezuela (ve) Filipinas (ph) 110 . entre otras cosas.En ese archivo se define..). la zona geográfica donde se va a utilizar la tarjeta. Esto sirve para la generación de los tonos de la linea (timbrando. etc. congestión.

"425/250. IMPORTANTE: El contenido de la linea DAHDI_TONE_SHUTTER tiene que estar en el mismo renglón.!425/100. "425" }. . { DAHDI_TONE_DIALRECALL.zone = 46. 111 .0/250. . "!425/100.0 nano zonedata.0/250.tones = { /* References: http://www.mfr1_level = -7.!0/100.ringcadence = { 1500. .!0/10.c al final del archivo. 4000 }. { DAHDI_TONE_STUTTER.0/4500" }.425/350. . "425/1000. .0/1000" }.country = "co". { DAHDI_TONE_RECORDTONE.0/250" }. .itu. }. "400+450/300.description = "Colombia".mfr2_level = -8.int/ITU-T/inr/forms/files/tones-0203. "1400/500.425/650.!425/100.!0/100.!425/100. }. . { DAHDI_TONE_INFO.!0/100.dtmf_high_level = -9. { DAHDI_TONE_RINGTONE.!1400/330.pdf */ { DAHDI_TONE_DIALTONE.dtmf_low_level = -11. "425" }.0/250" }.6.425" }.!425/100.! 425/100. "!950/330.!0/100.!1800/330.!0/100.zone = -1 } se añaden las siguientes lineas: { .• • • • • • Rusia (ru) Turquía (tr) Panamá (pa) Macao China (mo) Costa Rica (cr) Emiratos Árabes (ae) Para Colombia esta configuración no está presente y para activarla hay que modificar un archivo de la fuentes de dahdi-tools: cd /usr/src/dahdi-tools-2. { DAHDI_TONE_CONGESTION.0/15000" }. { DAHDI_TONE_CALLWAIT. . "425/100.!0/100.0/6000" }. antes de esta linea: { . { DAHDI_TONE_BUSY.

Predefinida es mg2: echocanceller = mg2.conf Se añaden las primeras dos lineas relacionadas con la zona geográfica: loadzone = co defaultzone = co Se define el tipo de señalización (fxsks para FXO y fxoks para FXS).old y se crea uno nuevo: nano /etc/dahdi/system.conf /etc/dahdi/system.3.2. en este caso se configuran 4 modulos FXO: fxsks=1-4 que se puede escribir también: fxsks=1.1-4 Se guardan los cambios.conf.4 para terminar se define la cancelación de eco./configure make manuselect make make install make config se renombra el archivo predefinido: mv /etc/dahdi/system. Para mejorar la cancelación de eco se instala OSLEC 112 .Se guardan los cambios y se vuelve a compilar dahdi-tools: make distclean .1-4 El archivo final será: loadzone = co defaultzone = co fxsks=1-4 echocanceller = mg2.

org/campus/pbx05/linux-2.6.. más fastidioso el eco.6.28/drivers/staging/echo /usr/src/dahdi-linux-2.6. ¿Por qué OSLEC logra solucionar con mayor eficacia los problemas de eco? Porque a pesar que sea un cancelador de eco de 32ms. Las librerías DAHDI vienen con un cancelador de eco software que a veces no logra solucionar este tipo de problema.6.0/drivers/dahdi/Kbuild echo 'obj-m += echo.o|obj-m += dahdi_echocan_oslec. Más alto el tiempo de retraso.voztovoice. OSLEC ha sido desarrollado por David Rowe.0/drivers/staging cp -fR /usr/src/linux-2.6.6. las compañías telefónicas no aplican ningún tipo de cancelación de eco y es propio en estos casos que los 32ms de OSLEC son suficientes para cancelar el eco de manera satisfactoria.tar.6.28.28 wget http://www.1. Cuando las llamadas son locales o de larga distancia.tar. OSLEC está disponible en la fuentes del Kernel a partir de la versión 2.6.bz2 se descomprimen: tar -xf linux-2. actúa justo en los casos en que se produce este tipo de retraso.0/drivers/dahdi/Kbuild sed -i "s|#obj-m += .o' > /usr/src/dahdi-linux-2. En estos casos la mejor solución es instalar el cancelador de eco OSLEC.bz2 Se preparan las fuentes de DAHDI para la compilación de OSLEC: mkdir /usr/src/dahdi-linux-2.0/drivers/staging sed -i "s|#obj-m += dahdi_echocan_oslec.1 OSLEC El eco es generado por la reflexión del audio trasmitido que se devuelve a quien lo ha originado con un retraso que puede variar de algunos mili segundos a centenares de mili segundos.6.o|" /usr/src/dahdilinux-2.28.28 Para instalarlo se siguen estos pasos: cd /usr/src se descargan las fuentes del Kernel 2. Cuando las llamadas son internacionales y el eco producido considerable (centenares de ms)./staging/echo/|obj-m += ./staging/echo/|" /usr/src/dahdi-linux2. son las mismas compañías telefónicas que normalmente se encargan (a nivel de centrales) de eliminar el eco que se produce.0/drivers/staging/echo/Kbuild 113 ..6. un ingeniero electrónico australiano.

conf.0 make distclean make make install DAHDI-Tools: cd /usr/src/dahdi-tools-2.0 make distclean .1-4 Para terminar la configuración de la tarjeta hay que modificar el archivo chan_dahdi.conf Se añaden las siguientes lineas: [trunkgroups] [channels] language=es 114 .conf se renombra el predefinido: mv /etc/asterisk/chan_dahdi.old y se crea uno nuevo: nano /etc/asterisk/chan_dahdi.conf se cambia esta linea echocanceller=mg2.6.conf nano /etc/dahdi/system.6.1-4 para que quede: echocanceller=oslec./configure make menuselect make make install make config Se modifica el system.Ahora se recompilan DAHDI-linux y DAHDI-tools: cd /usr/src/dahdi-linux-2.conf /etc/asterisk/chan_dahdi.

2.context=from-pstn overlapdial=yes signalling=fxs_ks toneduration=100 usecallerid=yes cidsignalling=v23 cidstart=polarity hidecallerid=no callwaiting=yes callwaitingcallerid=yes threewaycalling=yes transfer=yes canpark=yes cancallforward=yes callreturn=yes echocancel=yes relaxdtmf=yes rxgain=2.5.1 OSLEC 115 . En este caso los cuatro canales FXO pertenecen todos al grupo 1 Reiniciamos primero DAHDI y luego Asterisk /etc/init.0 callerid = asreceived amaflags=documentation accountcode=pstn busydetect=yes busycount=6 mohinterpret=default mohsuggest=default group=1 channel => 1-4 En el bloque channels se configuran los parámetros validos para todos los canales.d/dahdi start /etc/init.4.d/asterisk start Se controla que efectivamente la cancelación de echo configurada sea OSLEC: dahdi_cfg -vvv DAHDI Tools Version .1 DAHDI Version: Echo Canceller(s): Configuration 2. A partir de la linea channel => se configuran los canales.0.0 txgain=3.

45) same => n.Hangup R1= Usa las líneas del grupo X de Mayor a menor pero de manera aleatoria Se usará este ultimo bloque.1.conf al final del contexto internas se pone: 116 .Dial(DAHDI/G1/${EXTEN:1}.45) same => n. Se entra en la consola de Asterisk: asterisk -rvvvvvvvvvvvvvvvvv se mira la configuración del canal 1: CLI> dahdi show channel 1 Se sale de la consola: CLI> quit Si se decide utilizar las 4 lineas telefónicas para las llamadas locales y nacionales hay cuatro forma de escribir el dialplan (para Colombia).====================== El en servidor Linode.45) same => n.Dial(DAHDI/R1/${EXTEN:1}.Hangup G1= Usa las líneas del grupo X de Mayor a menor exten => _9[12456789]XXXXXXX!.1Dial(DAHDI/g1/${EXTEN:1}. nano /etc/asterisk/extensions. exten => _9[12456789]XXXXXXX!.Hangup g1= Usa las líneas del grupo X de menor a Mayor exten => _9[12456789]XXXXXXX!.Dial(DAHDI/r1/${EXTEN:1}.1. se recibirán solamente una serie de errores ya que la tarjeta no está realmente instalada.45) same => n. Se antepone el numero 9 para indicar que marcando 9 más el numero de destino se está saliendo por las lineas analógicas.Hangup r1= Usa las líneas del grupo X de menor a Mayor pero de manera aleatoria exten => _9[12456789]XXXXXXX!. Este dialplan no se utilizará para llamadas a celulares.1.

Hangup El contexto from-pstn es el que se ha definido en el archivo chan_dahdi. Apagar el computador 117 .n. E1 o J1.45) exten => s.conf Se recarga el dialplan: asterisk -rvvvvvvvvvvvvv CLI> dialplan reload se sale de la consola: CLI> quit 6.1.exten => _9[12456789]XXXXXXX!.2 Tarjeta Digium TE120P La tarjeta TE120P es una tarjeta con una conexión T1.45) same => n.Dial(SIP/1000.Dial(DAHDI/R1/${EXTEN:1}.1.Hangup Para llamadas entrantes después del contexto google-in: [from-pstn] exten => s. El tipo de conexión se configura a través de un jumper presente en la tarjeta: Los pasos a seguir son: 1.

3.gz se entra en la carpeta: cd openr2-1. se utiliza la señalización MFG/R2 para que DAHDI la pueda implementar hay que instalar la librería Openr2: se descarga: cd /usr/src wget http://openr2.2.3.tar.0 make distclean .com/files/openr2-1. 5. 7. Desconectar el cable de alimentación Abrir el chasis del Computador Insertar la tarjeta en una ranura PCI disponible Volver a poner el chasis del computador Conectar el cable de alimentación al computador Conectar el cable RJ45 de la linea E1 a la tarjeta Encender el computador Se paran los servicios Asterisk y DAHDI: service asterisk stop service dahdi stop 6. 6. 4./configure make 118 .1.googlecode.2.8.1./configure --prefix=/usr make make install Luego hay que volver a compilar Asterisk: cd /usr/src/asterisk-1.11.gz se descomprime: tar -xf openr2-1.3.3. 8.Openr2 Como en algunos países de latino américa.1 MFG/R2 .1 y se compila: .tar.

app_mysql.so app_saycountpl.so.so | grep openr2 libopenr2.so res_config_mysql.so WARNING WARNING WARNING no hay problema ya que esos módulos se han anteriormente compilado con la misma versión de Asterisk. Please ensure that these modules are compatible with this version before attempting to run Asterisk.3 => /usr/lib/libopenr2. located at /usr/lib/asterisk/modules contains modules that were not installed by this version of Asterisk.3 (0x004bf000) Para ver las distintas versiones de la señalización MFG/R2 soportadas por la librería: r2test -l Variant Code Country AR Argentina BR Brazil CN China CZ Czech Republic CO Colombia EC Ecuador ID Indonesia ITU International Telecommunication Union MX Mexico PH Philippines VE Venezuela 119 .so.so format_mp3. make config Para averiguar que la librería ha sido englobada en el el modulo chan_dahdi.so: ldd channels/chan_dahdi.make install Si aparece este WARNING (advertencia): WARNING WARNING WARNING Your Asterisk modules directory.so cdr_mysql.

<Timing>.1-15.0.crc4 o span => 1.<Line Build Out>. Posibles valores: 0 = la fuente la genera la misma tarjeta 1 = la fuente es remota Line Build Out: 0 predefinido Framing: en las lineas E1 puede ser CAS (Channel Associated Signaling) o CSS (Common Channel Signaling ) Coding: puede ser AMI o HBD3.17-31 se termina con: loadzone = co defaultzone = co Por ultimo se configura el chan_dahdi. Algunos ejemplos podrían ser: span => 1.<Coding>[.Terminada la instalación de la librería se averigua si la tarjeta ha sido reconocida por CentOS: lspci -n el resultado debe ser: 0000:01:00.0. En algunos casos al final de la linea se pone CRC4 para el control de los paquetes.<Framing>.0.hdb3.0 0200: ISDN controller: Unknown device d161:0120 Cuando se configura una linea E1 la sintaxis en el archivo system.cas. En este caso 1 Timing: determina la fuente de sincronización para la tarjeta.0.hdb3 Luego se configuran los canales: bchan = 1-15.conf es: span => <Number>.17-31 dchan = 16 bchan son los canales audio y dchan el canal para la señalización.Yellow] Number: el puerto donde está conectado el cable de la linea E1. y la cancelación de eco: echocanceller => oslec.css. Estos datos normalmente los facilita el proveedor de la linea.conf 120 .

1.0 txgain=3.cas.17-31 Para la señalización MFC/R2 sería: system.hdb3 cas=1-15:1101 dchan=16 cas=17-31:1101 loadzone = co 121 .0.0 immediate=no context=from-pstn group=1 switchtype=euroisdn signaling=pri_cpe channel => 1-15.conf span=1. Lo más común es: switchtype=euroisdn signaling=pri_cpe Un ejemplo de archivo de configuración es: [trunkgroups] [channels] usecallerid=yes hidecallerid=no callwaiting=yes usecallingpres=yes callwaitingcallerid=yes threewaycalling=yes transfer=yes canpark=yes cancallforward=yes callreturn=yes echocancel=yes echocancelwhenbridged=yes relaxdtmf=yes rxgain=2.los dos valores más importantes son: switchtype signaling que también facilita el proveedor.

17-31 Terminada la configuración se reinician los servicios: service dahdi start service asterisk start y se averigua en la consola si todos los canales están configurados: CLI> dahdi show channels 122 .defaultzone = co chan_dahdi.conf [trunkgroups] [channels] usecallerid=yes hidecallerid=no callwaiting=yes usecallingpres=yes callwaitingcallerid=yes threewaycalling=yes transfer=yes canpark=yes cancallforward=yes callreturn=yes echocancel=yes echocancelwhenbridged=yes relaxdtmf=yes rxgain=2.0 txgain=3.0 immediate=no context=from-pstn group=1 signalling = mfcr2 mfcr2_variant = co mfcr2_get_ani_first = no mfcr2_max_ani = 10 mfcr2_max_dnis = 4 mfcr2_category = national_subscriber mfcr2_mfback_timeout = -1 mfcr2_metering_pulse_timeout = -1 mfcr2_logdir = log mfcr2_logging = all channel => 1-15.

6. 4.sangoma.23 y se instala: . 8. 3. Primero se instala la tarjeta: Los pasos a seguir son: 1.3 Wanpipe Se termina esta parte del capitulo con la instalación del driver Wanpipe necesario para tarjetas SANGOMA.23.tgz se descomprime: tar -xf wanpipe-3.5.tgz se entra en la carpeta: cd wanpipe-3.5. 7.6. Apagar el computador Desconectar el cable de alimentación Abrir el chasis del Computador Insertar la tarjeta en una ranura PCI disponible Volver a poner el chasis del computador Conectar el cable de alimentación al computador Conectar el cable RJ45 de la linea E1 a la tarjeta Encender el computador se para Asterisk y DAHDI: service asterisk stop service dahdi stop Se descarga el driver: cd /usr/src wget ftp://ftp. 2.com/linux/current_wanpipe/wanpipe-3. 5./Setup dahdi se escribe y y se continua con envío: 123 .5.23.

se selecciona 1 más envío. Luego se inicia wanpipe: wanrouter start DAHDI service dahdi start Asterisk: service asterisk start Para terminar se personalizan los parámetros creados por wancfg.conf mv /etc/asterisk/chan_dahdi.conf. Al terminar este párrafo.old /etc/dahdi/system. se vuelven a poner los archivos predefinidos: mv /etc/dahdi/system. y para volver a la configuración anterior. Al finalizar aparecerá: Ahora se ejecuta: wancfg_dahdi que creará todos los datos de configuración para la tarjeta instalada. Empieza la compilación del driver y de las utilidades.conf y se reinician los dos servicios: service dahdi start 124 .conf.old /etc/asterisk/chan_dahdi.

168. En Line se conecta el cable del teléfono que viene de la línea telefónica. así que lo primero que hay que hacer es activarla. Por defecto el SPA3102 no permite conectarse a la pagina de administración desde remoto. Para finalizar. en Internet se conecta un cable de red que luego se conecta al Router. En Ethernet se conecta un cable de red que luego se conectará al toma de red del computador. La configuración que sigue abarca solamente la parte FXO ya que todas las llamadas entrantes se contestarán desde una extensión SIP. una linea FXS y cada linea se puede configurar como si fuera una extensión SIP. Se abre una pestaña nueva del navegador y se pone la siguiente dirección: http://192.1 Aparecerá la pagina de administración del SPA3102: 125 .0.service asterisk start 6.4 Linksys SPA3102 – Gateway FXO/FXS El SPA3102 es un Gateway que soporta una linea FXO.

100. Ya se puede desconectar el cable del puerto Ethernet del ATA y volver a conectar el computador al router. Esto se hace en la pestaña Voice y luego System: Se presiona el botón Submit All Changes. se pueden descargar desde esta pagina. Se da click en el enlace “advanced” y luego en la pestaña “Wan Setup”.10 se actualiza.Se averigua la versión del Firmware instalada y la dirección IP asignada por el Router. En este caso 192. Entre los nuevo iconos: Se da click dos veces. Se activa la conexión desde remoto: Para guardar cada cambio.1. Ahora se puede acceder al SPA3102 indicando la dirección IP asignada por el Router.100 El segundo paso es configurar una clave para el administrador y una para el usuario.168. al final de la pagina se presiona el botón “Submit All Changes”. Los firware para el SPA3102. Aparecerá: 126 . Se descomprime el archivo en el escritorio del computador. Si la versión del firmware no es la 5.

Se continua con el botón “OK”: 127 .Para aceptar la advertencia se presiona el botón “Continue”: Se pone la dirección IP local del SPA3102 y la del computador donde se ha descargado el Firmware.

Cuando termine. Se va a la pestaña Voice y luego en PSTN Line donde se configura solamente la parte que interesa: 128 . La operación tarda unos minutos.Se pone el usuario admin y la clave que se acaba de crear. Se presiona el botón “OK”: Se revisan todos los datos y para iniciar la actualización se presiona el botón “Upgrade”. se vuelve a entrar en la pagina de administración del ATA y se configura la cuenta SIP para la línea FXO.

De esta forma se envía a Asterisk solamente un paquete UDP vacío como hacen la mayoría de los teléfonos SIP: Proxy = dirección IP o nombre de dominio del servidor Asterisk remoto Register = yes Display Name = poner el numero de teléfono de la línea telefónica (por ejemplo) UserID = el nombre de la extensión que luego se configurará en Asterisk Use Auth ID =yes Auth ID = lo mismo que User ID 129 . Se puede dejar la linea en blanco.Line Enable = yes NAT Keep Alive Enable = yes (si el Asterisk es remoto y el ATA se encuentra detrás de un NAT) NAT Keep Alive Msg = viene por defecto con la opción $NOTIFY que envía un paquete de tipo SIP NOTYFY para tener abierta la conexión.

Todas las llamadas entrantes se enrutan a la extensión s de Asterisk: En la configuración del Gateway VoIP –> PSTN se pone: VoIP-To-PSTN Gateway Enable =yes VoIP Caller Auth Method = none (ninguna autentificación) One Stage Dialing = yes Line 1 VoIP Caller DP = para las llamadas salientes se utilizará el dialplan 1 En la configuración del Gateway PSTN – > VoIP se pone: PSTN-To-VoIP Gateway Enable =yes PSTN Calles Auth Method = none (de esta forma cuando el ATA conteste no solicitará ningún PIN para acceder al Gateway VoIP) PSTN Ring Thru Line 1 = no (ya que no se va a conectar un teléfono analógico al ATA) PSTN Caller Default DP = 2 (Para este Gateway se utilizará el diaplan 2) 130 .Como codec predefinido se activa alaw y como segundo G729: Se definen dos Dialplan: El primero para las llamadas salientes y el segundo para las llamadas entrantes.

Ahora el ATA intentará conectarse a Asterisk sin éxito ya que la extensión no ha sido creada. Se abre el archivo sip. para muchos países. Se termina presionando el botón “Submit All Changes”. aparecen en la guía de administrador del SPA3102.Cuando entre una llamada desde la red PSTN el Gateway VoIP del ATA contestará después de 2 segundos y pasará la llamada también a las extensión s de Asterisk: Detect Polarity Reversal = no (para Colombia) Detect PSTN Long silence = yes (si no hay flujo audio del lado PSTN por 30 segundos (parámetro que sigue) la llamada terminará PSTN Long Silence Duration = 30 Detect VoIP Long Silence = yes Lo mismo para lado VoIP VoIP Long Silence Duration = 30 Detect Disconnect Tone = Yes Disconnect Tone = el valor de su país. Esto valores.conf y al final del archivo. se añade el siguiente bloque: nano /etc/asterisk/sip.conf [spa3102] type=friend secret=password qualify=yes nat=yes host=dynamic directmedia=no 131 .

.Busy(3) same => n. En cuanto el ATA conteste.1. se configura el contexto from-spa3102 (como definido en la configuración de la extensión en el sip.Dial(SIP/spa3102. se le envía los dígitos del numero a marcar quitando el 8 (opción D de la aplicación Dial).conf para las llamadas salientes al final del contexto internas se pone: exten => _8.conf) y se pone: 132 . debería aparecer): El dialplan: nano /etc/asterisk/extensions. después del contexto google-in.context=from-spa3102 dtmfmode=rfc2833 language=es callerid=LineaTel <NumTel> allowtransfer=yes allowsubscribe=yes subscribecontext=subscribe callcounter=yes disallow=all allow=alaw allow=g729 Se guardan los cambios y se recarga la configuración SIP: asterisk -rx "sip reload" Después de unos segundos en la pagina del SPA3102 (Menú Voice. todas las llamadas pasarán para el SPA3102.D(${EXTEN:1})) same => n. Para las llamadas entrantes.Hangup De esta forma marcando 8 + el numero a llamar. pestaña Info.45.

Dial(SIP/1000) same => n.NoOp same => n. Claramente la llamada entrante se puede enviar a un IVR o configurar para que timbre más de una extensión. La llamada saldrá por el SPA3102.Hangup De esta forma cuando alguien llamará el numero de la línea telefónica.[from-spa3102] exten => s. después de dos segundos empezará a timbrar también la extensión 1000. Otra prueba: se marca desde un celular al numero de la línea telefónica y se espera que empiece a timbrar la extensión 1000.1. Se guardan los cambios y se recarga el dialplan: asterisk –rvvvvvvvvvvvvvvv CLI> dialplan reload Ahora desde cualquier teléfono SIP conectado a Asterisk se marca un numero anteponiendo el 8. 133 .

.

En Asterisk existen tres tipos de variables: • • • variables globales variables de canal variables de ambiente Las variables globales son aquellas cuyo valor no cambia a lo largo del dialplan. simplificar su construcción y añadirle una lógica más comprensible. Si se retoma el bloque de dialplan: exten => 1234. hay que aclarar algunos conceptos claves.1. se ha explicado la división del dialplan en contextos.Dial(IAX2/marko. esta parte puede ser escrita también de la siguiente forma: exten => 1234. En el párrafo 2.6.CAPITULO VII Dialplan – Configuración avanzada Para poder entender mejor como funciona y como se construye un dialplan en Asterisk. En la preparación del dialplan se ha visto el bloque dedicado a las variables globales y se han configurado tres. En esta parte se ilustrarán: • • • • • • • • las variables los pattern matching la aplicación ECHO el contexto subscribe las Macro la aplicación Authenticate Limitar llamadas salientes Enrutamiento llamadas entrantes según fecha hora 7.Hangup Cuando se utiliza una variable en el dialplan la sintaxis es: carácter dolar $ seguido por el nombre de la . ¿Cual es su función en el dialplan? En este caso simplificarlo. Se utilizan mucho en matemática y su función en Asterisk es reducir la complexidad del dialplan.Hangup que se ha creado para llamar la extensión IAX2 marko.1 Las variables Una variable es un objeto al que se asocia un valor.1. extensiones y prioridades.30) same => n.30) same => n. entre ellas: marko=IAX2/marko De esta forma se asocia al nombre de variable marko el valor IAX2/marko.Dial(${marko}.

es decir que hay diferencia si se escriben en mayúsculas y minúsculas. Las variables son case sensitive. Un ejemplo: Set(numero=1) Para toda la duración de la llamada el valor de la variable ${numero} será 1. Para verla en acción se abre el archivo del dialplan: nano /etc/asterisk/extensions.1.Playback(hello-world) same => n. utilizar nombres en minúsculo para diferenciarlas de las variables generadas por Asterisk.conf se modifica este bloque: exten => 123.1. cuando se crean variables. Hay muchas variables predefinidas que se crean durante una llamada. Algunas aplicaciones y funciones de Asterisk al ejecutarse generan variables. Para crearlas se utiliza la aplicación Set.Playback(hello-world) same => n.Answer same => n. Las variables de canal tienen validez solamente para la llamada corriente. el valor asociado a la variable volverá a ser nulo.1. como.Hangup Se guardan las modificaciones y se recarga el dialplan: asterisk -rvvvvvvvvvvvvvvv CLI> dialplan reload 136 . se utiliza la aplicación Dumpchan. En el caso de la variable ${marko} que está escrita toda en minúsculo. por ejemplo. Todas las variables generadas son en mayúsculo. no es lo mismo si en el dialplan se pone: exten => 1234.Hangup La variable ${MARKO} estará totalmente vacía. Este tipo de variables se utilizan mucho en el dialplan para modificar valores del canal y/o para guardar algunos datos de las llamadas para luego utilizarlos. A lo largo de la construcción del dialplan se presentarán distintos ejemplos. Es una buena practica.Hangup para que quede: exten => 123. Para saber cuales son y que valor tienen en un determinado canal.variable entre dos llaves {}. la que ya se ha visto ${EXTEN}.30) same => n. Cuando la llamada termine.Answer same => n.Dial(${MARKO}.Dumpchan same => n.

SIPDOMAIN=96. Esta variable tiene la siguiente sintaxis ${EXTEN:x:y) donde x es la posición inicial e y el numero de dígitos que se 137 .253.1 CallerIDNum= 1000 CallerIDName= callerid=Fulano DNIDDigits= 123 RDNIS= (N/A) Parkinglot= Language= es State= Up (6) Rings= 0 NativeFormat= 0x8 (alaw) WriteFormat= 0x8 (alaw) ReadFormat= 0x8 (alaw) RawWriteFormat= 0x8 (alaw) RawReadFormat= 0x8 (alaw) 1stFileDescriptor= 29 Framesin= 1 Framesout= 0 TimetoHangup= 0 ElapsedTime= 0h0m0s Context= externas Extension= 123 Priority= 2 CallGroup= 1 PickupGroup= 1 Application= DumpChan Data= (Empty) Blocking_in= (Not Blocking) Variables: SIPCALLID=YzBkYjQ1MjYyOWYxMzllYjU5Y2RhNmM3MDM3MjFkYTU. Una variable muy peculiar es la variable ${EXTEN}.135 SIPURI=sip:1000@190.121.Ahora desde la extensión 1000 se marca el numero 123. El resultado en la consola de Asterisk será: Dumping Info For Channel: SIP/1000-00000001: =========================================================== Info: Name= SIP/1000-00000001 Type= SIP UniqueID= 1318352043. que contiene el numero marcado.173.215:15480 CLI> quit Para una lista completa de las variables predefinidas se puede consultar la Wiki de Asterisk.126.

"") in new stack No todas las variables de ambiente se pueden leer desde Asterisk.UTF-8") in new stack Executing [50@externas:2] NoOp("SIP/1000-0000000b".Set(PBX=${ENV(LANG)}) same => n. "PBX=en_US. para probarla en el dialplan: nano /etc/asterisk/extensions. asterisk -rvvvvvvvvvvvvvv CLI> dialplan reload Desde la extensión 1000 se marca el numero 50.UTF-8") in new stack Executing [50@externas:3] Hangup("SIP/1000-0000000b". 7. "Idioma Servidor en_US.Hangup Se guardan los cambios y se recarga el dialplan.conf en el contexto internas se ánade este bloque: exten => 50. Un ejemplo: Set(PBX=${ENV(LANG)}) En este ejemplo a la variable PBX estará asociado el idioma configurado en el servidor Linux. Para crearlas se utiliza la aplicación SET y la función ENV.Noop(Idioma Servidor ${PBX}) same => n.1.2 Pattern Matching 138 .quieren extraer: Tomando como numero de partida 57300200: ${EXTEN:1} devolverá 7300200 ${EXTEN:1:4} devolverá 7300 ${EXTEN:2:6} devolverá 300200 ${EXTEN:5:3} devolverá 200 Las variables de ambiente se utilizan para leer la variables del sistema (Linux). En la consola de Asterisk: Executing [50@externas:1] Set("SIP/1000-0000000b".

El dialplan se construye de modo que todos los posibles números marcados puedan ser “interceptados” por Asterisk.6-8] . ! puede ser un numero de 0 a 9 puede ser un numero de 1 a 9 puede ser un numero de 2 a 9 puede ser un numero de 1 a 4 o de 6 a 8 (punto) puede ser uno o más caracteres puede ser cero o más caracteres.1. Si se quiere crear una extensión donde entren todas las llamadas a los celulares de Colombia (prefijo 3) con el proveedor Justvoip. Estos caracteres se ponen en lugar de uno o más dígitos. Cuando se pone un pattern matching en la creación de una extensión. por ejemplo. el numero de extensiones configuradas en Asterisk van desde 1000 hasta 1099 el dialplan para las llamadas entre extensiones sería: exten => _10XX. Para configurarla se modifica el dialplan: nano /etc/asterisk/extensions. la primera linea sería: exten => _00573XXXXXXXXX. indica que lo que sigue puede ser compuesto de uno o más dígitos.1. Para este tipo de situaciones.conf y en el contexto internas se añade el siguiente bloque: exten => 150. Sería absurdo indicar todos los números de teléfono de Colombia porque un usuario podría marcar uno de ellos.1. que permiten crear extensiones en el dialplan que “intercepten” los números marcados. siempre hay que anteponer el guion abajo _ Si.1.Dial(SIP/${EXTEN}) 7.Dial(SIP/justvoip/${EXTEN}) El punto después del 00573.. Puede ser útil para revisar eventuales retrasos y o problemas en la calidad del audio. La lista es la siguiente: • • • • • • X Z N [1-4.3 La aplicación Echo La aplicación Echo se utiliza para medir el tiempo de retorno de la voz.Dial(SIP/justvoip/${EXTEN}) Si no se conoce exactamente de cuantos dígitos está compuesto un numero de celular la misma linea cambiaría de la siguiente forma: exten => _00573.Answer 139 . Algunos ejemplos. se utilizan los Pattern Marching o patrones de llamada.

Se abre el archivo: nano /etc/asterisk/extensions.1001 y 1002 y la extensión IAX2 marko.IAX2/marko es decir utilizando los Pattern Marching.IAX2/marko La prioridad Hint es una prioridad especial que permite monitorear el estado de las extensiones.conf se ha hablado de la posibilidad de monitorear el estado de una extensión y en la parte general del archivo se han configurados los siguientes parámetros para activar esta funcionalidad: callcounter=yes allowsubscribe=yes subscribecontext=subscribe notifyringing=yes notifyhold=yes Ahora para que el sistema funcione.hint.Playback(demo-echotest) same => n. 7.conf y después del contexto internas se añade el siguiente bloque: [subscribe] exten => 1000.hint.hint. en el dialplan hay que configurar el contexto subscribe.hint.same => n.SIP/1001 exten => 1002.4 El contexto Subscribe A lo largo de la configuración del archivo sip.hint.Hangup Se guardan los cambios y se recarga el dialplan: asterisk -rx "dialplan reload" Desde cualquier extensión registrada a Asterisk se marca el numero 150 y se hace la prueba. Se guardan los 140 . En este caso se utilizará la primera forma.SIP/1000 exten => 1001.Playback(demo-echodone) same => n.hint. Otra forma de escribir el bloque es: [subscribe] exten => _100[0-2]. En este caso las extensiones SIP 1000.Echo same => n.SIP/100[0-2] exten => marko.SIP/1002 exten => marko.

cambios y se recarga el dialplan: asterisk -rvvvvvvvvvvvvvvvvvv CLI> dialplan reload Con el comando: CLI> core show hints -= Registered Asterisk Dial Plan Hints =1000@subscribe : SIP/1000 1001@subscribe : SIP/1001 1002@subscribe : SIP/1002 marko@subscribe : IAX2/marko State:Idle Watchers 0 State:Unavailable Watchers 0 State:Unavailable Watchers 0 State:Unavailable Watchers 0 Se verán los hints configurados y en la ultima columna cuantas extensiones se han subscrito al estado de las demás (en este caso ninguna). Antes de presionar el botón “OK” para terminar la operación. en la ventana del terminal se sale de la consola de Asterisk: CLI> quit y se inicia la captura de los paquetes SIP: ngrep 1000 -W byline port 5060 > /tmp/subscribe Se vuelve al Xlite y se presiona el botón OK. Ahora se abre el Xlite configurado como extensión 1000 y se presiona el icono evidenciado: En la nueva ventana: Al lado de la casilla “Softphone” se escribe 1001 y luego se presiona el botón Add. Se vuelve a la ventana terminal y se termina la captura de 141 .

La secuencia de los paquetes será: X-Lite ------------------Subscribe---------------> Asterisk X-Lite <-------401 Unauthorized-------------.Asterisk X-Lite -------------------200 OK----------------> Asterisk Y en el NOTIFY final. En el archivo notify se encontrará la siguiente secuencia: Asterisk --------NOTIFY--------------> Xlite Asterisk <--------200 OK-------------.126.0" encoding="ISO-8859-1"?> <presence xmlns="urn:ietf:params:xml:ns:pidf" xmlns:pp="urn:ietf:params:xml:ns:pidf:person" xmlns:es="urn:ietf:params:xml:ns:pidf:rpid:status:rpid-status" xmlns:ep="urn:ietf:params:xml:ns:pidf:rpid:rpid-person" entity="sip:1000@96.135"> <pp:person><status> <ep:activities><ep:away/></ep:activities> </status></pp:person> <note>Not online</note> <tuple id="1001"> <contact priority="1">sip:1001@96.Asterisk X-Lite ------------------Subscribe---------------> Asterisk X-Lite <-------------------200 Ok---------------.135</contact> <status><basic>closed</basic></status> </tuple> </presence> Asterisk está comunicando a la extensión 1000 que la extensión 1001 no está en linea (Not online) Se capturan nuevamente los paquetes con el comando: ngrep 1000 -W byline port 5060 > /tmp/notify Se abre el softphone 3CX configurado como extensión 1001 y una vez que esté registrado a Asterisk se termina la captura de los paquetes.121.Asterisk X-Lite <-----------------NOTIFY---------------.126.los paquetes SIP.0" encoding="ISO-8859-1"?> <presence xmlns="urn:ietf:params:xml:ns:pidf" xmlns:pp="urn:ietf:params:xml:ns:pidf:person" xmlns:es="urn:ietf:params:xml:ns:pidf:rpid:status:rpid-status" 142 . estará anexa esta parte: <?xml version="1.121.Xlite La parte final del paquete de Notify enviado por Asterisk a la extensión 1000 será: <?xml version="1.

126.xmlns:ep="urn:ietf:params:xml:ns:pidf:rpid:rpid-person" entity="sip:1000@96. El resultado será: Desde la extensión 1001 se marca el numero 150 (test de echo).135</contact> <status><basic>open</basic></status> </tuple> </presence> Asterisk estará comunicando a la extensión 1000 que la extensión 1001 está en linea ya que la extensión 1000 ha subscrito el estado de esa extensión. En el Xlite aparecerá: 143 . Se abre Zoiper (configurado con las cuentas SIP 1002 y IAX2 marko) y en el Xlite se subscribe el estado de ambas.121.135"> <pp:person><status> </status></pp:person> <note>Ready</note> <tuple id="1001"> <contact priority="1">sip:1001@96.126.121. Si se vuelve a la consola de Asterisk: asterisk -rvvvvvvvvvvvvvvv CLI> core show hints -= Registered Asterisk Dial Plan Hints =1000@subscribe : SIP/1000 1001@subscribe : SIP/1001 1002@subscribe : SIP/1002 marko@subscribe : IAX2/marko State:Idle Watchers 0 State:Idle Watchers 1 State:Unavailable Watchers 0 State:Unavailable Watchers 0 En la columna Watchers de la extensión 1001 hay un 1 que indica que hay una extensión que está monitoreando su estado.

${ARG2}.Por ultimo. 7. desde la extensión 1002 se llama la extensión 1001: La misma cosa se puede hacer en los Teléfonos SIP de mesa que soportan los BLF (Busy Lamp Field). Arguments become ${ARG1}. jumping to the 's' extension of that context and executing each step. 144 . etc in the macro context. ${MACRO_CONTEXT} and ${MACRO_PRIORITY} respectively. La sintaxis de la aplicación Macro: asterisk -rvvvvvvvvvvvv CLI> core show application Macro -= Info about application 'Macro' =[Synopsis] Macro Implementation. If you Goto out of the Macro context. and priority are stored in ${MACRO_EXTEN }. then returning when the steps end. [Description] Executes a macro using the context macro-<name>. context.5 Las Macro Si en el dialplan algunas acciones se repiten a menudo. The calling extension. Asterisk brinda la posibilidad de crear una Macro que permite simplificar este tipo de operaciones. the Macro will terminate and control will be returned at the location of the Goto.

${ARG2}.). Macro will attempt to continue at priority MACRO_OFFSET + N + 1 if such a step exists. [Syntax] Macro(name[. and a fixed per-thread memory stack allowance. macros are limited to 7 levels of nesting (macro calling macro calling macro... envíe la llamada a una determinada parte del dialplan..arg1[. that you use the Gosub application (now allows arguments like a Macro) with explict Return() calls instead.argumentoN) ArgumentoN es un valor o una variable que se pasa a la macro al momento de llamarla desde el plan de llamadas. Please use the 'Read' application in order to read DTMF from a channel currently executing a macro. argumento1.If ${MACRO_OFFSET} is set at termination.argumento2. It may be possible that stack-intensive applications in deeply nested macros could cause asterisk to crash earlier than this limit. ${ARGN) son las variables que contienen los argumentos que se han enviado a la Macro.]]]) [Arguments] name The name of the macro El comando seria: Macro(nombre_de_la_macro. Primero hay que salir de la consola y modificar el plan de llamadas: CLI> quit nano /etc/asterisk/extensions. La aplicación macro crea las siguientes variables de canal: • • • • ${MACRO_EXTEN} contendrá el numero marcado ${MACRO_CONTEXT} contendrá el contexto de donde se ha llamado la Macro ${MACRO_PRIORITY} contendrá la prioridad de la línea de donde se ha llamado la Macro ${ARG1}. It is advised that if you need to deeply nest macro calls. WARNING!!!: Use of the application 'WaitExten' within a macro will not function as expected. and N + 1 otherwise. WARNING!!!: Because of the way Macro is implemented (it executes the priorities contained within it via sub-engine). Para empezar a utilizar la aplicación Macro se creará una muy sencilla que antes de marcar una extensión controle su estado y.conf Al final del archivo se añaden estas líneas: 145 .arg2[. en base a éste. etc.

prioridad + 1 de donde se llamó. sino ve a otra prioridad indicada (falso). se modifica el bloque configurado para las llamadas entre extensiones.1.n.[macro-disponible] exten => s.Gotoif($["${estado}" = "NOT_INUSE"]?5) exten => s. el dialplan continua con la prioridad que sigue.El canal está timbrando y en uso ONHOLD .El canal está timbrando RINGINGUSE .30) same => n.Hangup Para que quede: exten => _100[0-2].El canal no está disponible (no está registrado a Asterisk) RINGING . Si la segunda prioridad no se especifica. Para insertar la Macro en el dialplan creado.1.Busy exten => s.1.Hangup exten => s.Dial(SIP/${EXTEN}. Los posibles valores son: • • • • • • • • • UNKNOWN – El canal es valido pero su estado no es conocido NOT_INUSE .El canal está ocupado INVALID .El canal está en uso BUSY .No se está usando INUSE .Macro(disponible) same => n.MacroExit Una explicación de las aplicaciones y funciones nuevas que aparecen en las lineas de la Macro: La función DEVICE_STATE: controla si una extensión está disponible y retorna un valor que se asignará a la variable “estado”. La aplicación Busy: si la extensión no se encuentra libre se envía al llamante una señal de ocupado La aplicación MacroExit: sale de la macro y vuelve al mismo contexto.El canal no es valido UNAVAILABLE . exten => _100[0-2].n.Hangup Se guardan los cambios y se actualiza el plan de llamadas: 146 .n.Set(estado=${DEVICE_STATE(SIP/${MACRO_EXTEN})}) exten => s.45) same => n.El canal está en espera La aplicación Gotoif: literalmente es: ve a la prioridad indicada si se presenta una determinada condición (verdadero).n.Dial(SIP/${EXTEN}. extensión.

c:22147 handle_request_invite: Call from '1002' (186. Para conocer la sintaxis de la aplicación: asterisk -rvvvvvvvvvvvvvv 147 .s. "") in new stack Como el estado de la extensión 1001 es “UNAVAILABLE” (en negrita) se procesa la prioridad 3 (el Busy) y se termina la llamada. 7. pues la extensión 1002 no puede efectuar llamadas salientes utilizando el proveedor SIP Justvoip. "estado=NOT_INUSE") in new stack Executing [s@macro-disponible:2] GotoIf("SIP/1000-00000011". a la extensión 1002 se ha asociado el contexto locales. Algunas extensiones tienen acceso a la lineas salientes y otras no.195. "") in new stack Executing [1001@externas:2] Dial("SIP/1000-00000011". tengan que autenticarse.81:10000) to extension '00573126814740' rejected because extension not found in context 'locales'.112. "SIP/1001. Otra forma de configurar Asterisk es que las extensiones que no tienen acceso a las lineas salientes. Para comprobarlo.asterisk -rvvvvvvvvvvvvvvv CLI> dialplan reload Ahora se marca desde la extensión 1000 la extensión 1001 (ambas conectadas a Asteirsk) y se controla lo que aparece en la consola de Asterisk: Executing [1001@externas:1] Macro("SIP/1000-00000011".5) Executing [s@macro-disponible:5] MacroExit("SIP/1000-00000011". el resultado será: [Feb 2 10:29:18] NOTICE[31745]: chan_sip.conf.45") in new stack Se cierra el 3CX Softphone (extensión 1001) y se marca otra vez desde la extensión 1000 la extensión 1001: Executing [1001@externas:1] Macro("SIP/1000-00000013". Este tipo de configuración se hará utilizando la aplicación Authenticate. "1?5") in new stack Goto (macro-disponible. "disponible") in new stack Executing [s@macro-disponible:1] Set("SIP/1000-00000011". Este es un caso típico en la configuración de Asterisk. Ese contexto no tiene acceso al contexto internacio. De esta forma hay un control sobre la llamadas salientes y se puede tener un registro de los usuarios que han utilizado el servicio. "disponible") in new stack Executing [s@macro-disponible:1] Set("SIP/1000-00000013". si se marca el numero 00573126814740 desde las extensión 1002. para tenerlo. "estado= UNAVAILABLE") in new stack Executing [s@macro-disponible:2] GotoIf("SIP/1000-00000013". "0?5") in new stack Executing [s@macro-disponible:3] Busy("SIP/1000-00000013".6 Autenticar las Llamadas Salientes con la aplicación Authenticate Al momento de crear las extensiones en el archivo sip.

En este caso se cifrarán. Ahora se crea un nuevo contexto al cual tenga acceso la extensión 1002. prompt Override the agent-pass prompt file.options[.maxdigits[.no limit .wait for the user press the '#' key. When one of the passwords is matched. Las contraseñas se pueden escribir en claro o cifradas con MD5.prompt]]]) [Arguments] password Password the user should know options a: Set the channels' account code to the password that is entered d: Interpret the given path as database key. the channel will have its account code set to the corresponding account code in the file. Stops reading after maxdigits have been entered (without requiring the user to press the '#' key).CLI> core show application authenticate [Syntax] Authenticate(password[. r: Remove the database key upon successful entry (valid with 'd' only) maxdigits maximum acceptable number of digits. Defaults to 0 . La opción password puede contener un valor o referirse a un archivo de texto que contenga una lista de nombres con las respectivas contraseñas separada por el carácter “:”. listed one per line in the file. su valor cifrado será: echo -n "4488" | md5sum c4819d06b0ca810d38506453cfaae9d8 Luego se crea el archivo de texto con el nombre del usuario de la extensión y la respectiva contraseña cifrada: nano /tmp/pin. Se llamará este contexto “auten” 148 . Si el PIN para la extensión 1002 (Mengano) es 4488.txt se añade la siguiente linea: Mengano:c4819d06b0ca810d38506453cfaae9d8 Se guardan los cambios. not a literal file m: Interpret the given path as a file which contains a list of account codes and password hashes delimited with ':'.

conf después del contexto internas se añade el siguiente bloque: [auten] exten => _00. El ultimo parámetro indica que los dígitos del PIN son 4 evitando de tener que utilizar la tecla numero para terminar el envío de los dígitos. En el contexto locales se añade el contexto auten para que la extensión 1002 tenga acceso al bloque recién creado (en negrita los cambios): [locales] include => internas include => auten Se guardan los cambios y se recarga el dialplan: asterisk -rvvvvvvvvvv CLI> dialplan reload Desde la extensión 1002 se marca el numero 005714013434. Se sale de la consola de Asterisk: CLI> quit Para averiguar que efectivamente la llamada ha sido cargada a la cuenta del usuario Mengano se entra en el cliente MySQL: 149 .txt.nano /etc/asterisk/extensions. se ingresará la contraseña 4488. La Opción a define que en el registro de las llamadas el campo Accountcode contendrá el nombre del usuario independientemente de la extensión que haya utilizado para efectuar la llamada La opción m define que el archivo de texto contendrá las contraseñas cifradas con MD5.am.4) same => n..NoOP same => n.1.Dial(SIP/justvoip/${EXTEN}) same => n. el dialplan pasará a la línea que sigue donde se iniciará la llamada. Cuando Asterisk lo pide.Hangup Los parámetros utilizados en la aplicación Authenticate: • • El primero define la carpeta y el nombre del archivo que contiene las contraseñas. • • Si la contraseña digitada está en el archivo de texto creado.Authenticate(/tmp/pin. Empezará la llamada al numero marcado.

es posible limitar el numero de canales utilizados en las llamadas entrantes y salientes.channel. Un ejemplo practico. este parámetro ha sido marcado como “deprecated”.conf.7 Limitar llamadas salientes: funciones GROUP y GROUP_COUNT Hasta la versión 1.X si se quería limitar el numero de llamadas salientes/entrantes para una extensión. Si se quiere conocer en cualquier momento los canales utilizados por cada extensión/troncal 150 .6. A partir de la versión 1.dst.accountcode from cdr where accountcode='Mengano'. Lo que hay que hacer es construir un dialplan donde si una extensión intenta sacar la tercera llamada simultanea.billsec.4.8.mysql -u root -psesamo Se selecciona la base de datos asteriskcdr (donde se ha creado la tabal CDR): mysql> use asteriskcdr y se hace una consulta en la tabal CDR (que contiene todos los registros de las llamadas): mysql> select src. El resultado será: +------+--------------+-------------------+---------+-------------+ | src | dst | channel | billsec | accountcode +------+--------------+-------------------+---------+-------------+ | 1002 | 005714013434 | SIP/1002-00000014 | 15 | Mengano +------+--------------+-------------------+---------+-------------+ 1 row in set (0. En su lugar se han introducido dos funciones: • • GROUP GROUP_COUNT A través de estas dos funciones.X. Se quiere limitar a 2 el numero de llamadas salientes para cada extensión configurada y al mismo tiempo se quieres limitar a 2 las llamadas salientes por la troncal Justvoip. se le avise al usuario que no hay más canales disponibles para las llamadas salientes. se le avise que no puede y al mismo tiempo si los 2 canales de la troncal se están utilizando.00 sec) Se sale del cliente MySQL: mysql> quit 7. se utilizaba el parámetro call-limit que había que añadir en la configuración de la extensión en el sip. esto quiere decir que no se recomienda su uso en las nuevas versiones.X de Asterisk y por consecuencia en la versión 1.

NoOp(Hay ${extsal} llamadas desde la extension ${CALLERID(num)} y ${trunksal} con el proveedor Justvoip) same => n.Set(GROUP(voip)=justvoip) same => n.Dial(SIP/justvoip/${EXTEN}.30) same => n.Dial(SIP/justvoip/${EXTEN}) same => n.1. Retomando el dialplan hasta ahora creado..Playback(all-outgoing-lines-unavailable) same => n.Set(trunksal=${GROUP_COUNT(justvoip@voip)}) same => n.configurada en Asterisk.NoOp same => n.Hangup Una explicación del dialplan creado: • • En la segunda linea se se asigna al grupo voip la troncal justvoip En la tercera linea se asigna al grupo salida la variable ${CALLERID(num)} que contiene el 151 .. Se abre el archivo del dialplan: nano /etc/asterisk/extensions.Set(GROUP(salida)=${CALLERID(num)}) same => n.Hangup Para que queden: exten => _00X. se va a aplicar la regla definida a las llamadas salientes.Hangup same => n(busy).Set(extsal=${GROUP_COUNT(${CALLERID(num)}@salida)}) same => n. el comando es: asterisk -rvvvvvvvvvvvvvvvvv CLI> sip show inuse * Peer name In use 1000 0/0/0 1001 0/0/0 1002 0/0/0 justvoip 0/0/0 Limit 2147483647 2147483647 2147483647 2147483647 Bajo la columna In use.Gotoif($[${extsal} > 2 | ${trunksal} > 2]?busy) same => n.1.conf En el contexto internacio se modifican estas lineas: exten => _00. los significados de las tres columnas (de la izquierda a la derecha) son: • • • Canales in uso Canales timbrando Canales en espera Bajo la columna Limit se puede notar que prácticamente no existe ningún limite.

El operador lógico | está en lugar de la palabra inglés OR. "GROUP(salida)=1001") in new stack -. "extsal=1") in new stack -.Executing [005714013434@externas:2] Set("SIP/1001-00000020".• • • • • numero de la extensión que está llamando En la cuarta linea se aumenta de una unidad el valor del grupo voip y se asigna el nuevo valor a la variable trunksal En la quinta linea se aumenta de una unidad el valor del grupo salida y se asigna el nuevo valor a la variable extsal En la sexta linea se envía el valor de las llamadas totales de las extensiones y de la troncal a la consola de Asterisk En la séptima linea se define este comportamiento. Si las llamadas desde las extensiones son mayores a dos o las llamadas de la troncal son mayores a dos.Executing [005714013434@externas:4] Set("SIP/1000-00000022". "GROUP(voip)=justvoip") in new stack -.Executing [005714013434@externas:2] Set("SIP/1000-00000022". " Hay 1 llamadas desde la extension 1001 y 1 con el proveedor Justvoip") in new stack -. ir a la etiqueta (busy). En la consola de Asterisk aparecerá: Primera llamda == Extension Changed 1001[subscribe] new state InUse for Notify User 1000 -. "") in new stack -.Called SIP/justvoip/005714013434 -. "extsal=1") in new stack 152 . "SIP/justvoip/005714013434") in new stack Segunda Llamada == Using UDPTL CoS mark 5 == Using SIP RTP CoS mark 5 -. sino seguir con el dialplan.Executing [005714013434@externas:5] Set("SIP/1001-00000020". Ahora para hacer una primera prueba.Executing [005714013434@externas:1] NoOp("SIP/1000-00000022". "trunksal=2") in new stack -.Executing [005714013434@externas:6] NoOp("SIP/1001-00000020". "trunksal=1") in new stack -.Executing [005714013434@externas:3] Set("SIP/1000-00000022". desde la extensión 1001 (el softphone 3CX) se marca el numero 005714013434 y al mismo tiempo desde la extensión 1000 se marca dos veces al mismo numero. "") in new stack -.Executing [005714013434@externas:4] Set("SIP/1001-00000020".Executing [005714013434@externas:7] GotoIf("SIP/1001-00000020". se comunica a la extensión que no hay lineas disponibles para las llamadas salientes.Executing [005714013434@externas:5] Set("SIP/1000-00000022". En la linea que empieza con la etiqueta busy.Executing [005714013434@externas:1] NoOp("SIP/1001-00000020". "GROUP(salida)=1000") in new stack -.Executing [005714013434@externas:3] Set("SIP/1001-00000020". "0?busy") in new stack -Executing [005714013434@externas:8] Dial("SIP/1001-00000020".SIP/justvoip-00000021 is making progress passing it to SIP/1001-00000020 == Using UDPTL CoS mark 5 == Using SIP RTP CoS mark 5 -. "GROUP(voip)=justvoip") in new stack -.

ulaw' (language 'es') [Feb 6 11:52:16] NOTICE[3578]: channel. "0?busy") in new stack -Executing [005714013434@externas:8] Dial("SIP/1000-00000022".10) -.Executing [005714013434@externas:3] Set("SIP/1000-00000024".Executing [005714013434@externas:5] Set("SIP/1000-00000024".005714013434.SIP/justvoip-00000023 is making progress passing it to SIP/1000-00000022 -.Executing [005714013434@externas:10] Playback("SIP/1000-00000024".Executing [005714013434@externas:7] GotoIf("SIP/1000-00000024". "") in new stack Con el comando sip show inuse. " Hay 1 llamadas desde la extension 1000 y 2 con el proveedor Justvoip") in new stack -. "1?busy") in new stack -.Executing [005714013434@externas:6] NoOp("SIP/1000-00000024". aparecerá: CLI> sip show inuse * Peer name In use 1000 1/0/0 1001 1/0/0 1002 0/0/0 justvoip 2/0/0 Limit 2147483647 2147483647 2147483647 2147483647 Cuando la extensión 1000 intenta sacar la tercera llamada.<SIP/1000-00000024> Playing 'all-outgoing-lines-unavailable. "trunksal=3") in new stack -. " Hay 2 llamadas desde la extension 1000 y 3 con el proveedor Justvoip") in new stack -.Executing [005714013434@externas:4] Set("SIP/1000-00000024".c:4148 __ast_read: Dropping incompatible voice frame on SIP/1000-00000024 of format alaw since our native format has changed to 0x4 (ulaw) -. "SIP/justvoip/005714013434") in new stack Tercera Llamada == Using UDPTL CoS mark 5 == Using SIP RTP CoS mark 5 -.Executing [005714013434@externas:11] Hangup("SIP/1000-00000024". "") in new stack -. 153 .Called SIP/justvoip/005714013434 -.Started music on hold. a lo largo de la segunda llamada.-. "extsal=2") in new stack -.SIP/justvoip-00000021 answered SIP/1001-00000020 == Using UDPTL CoS mark 5 == Using SIP RTP CoS mark 5 -.SIP/justvoip-00000023 answered SIP/1000-00000022 -.Executing [005714013434@externas:2] Set("SIP/1000-00000024". class 'default'. " all-outgoing-linesunavailable") in new stack -.Executing [005714013434@externas:6] NoOp("SIP/1000-00000022". "GROUP(salida)=1000") in new stack -. on SIP/justvoip-00000023 -. el Gotoif es verdadero y el dialplan sigue desde la prioridad con la etiqueta busy anunciando que no hay más linea salientes disponibles.Executing [005714013434@externas:7] GotoIf("SIP/1000-00000022". "GROUP(voip)=justvoip") in new stack -.Executing [005714013434@externas:1] NoOp("SIP/1000-00000024".Goto (externas.

154 .

.

Hangup() • • • Línea 1: contesta la llamada Línea 2: espera 2 segundos Línea 3: Graba el archivo audio en la carpeta /tmp con nombre promptXX donde XX son los últimos dos dígitos de la extensión que se ha marcado desde el Softphone. Para implementarla hay que modificar el dialplan.waw Línea 4: espera 2 segundos Línea 5: devuelve el archivo recién grabado Línea 6: espera 2 segundos Línea 7: cuelga la llamada • • • • . Ejemplo: Si se llama la extensión 6650 el archivo audio tendrá el nombre prompt50.Wait(2) same => n. en general. devolver los resultados y. Consiste en un central telefónica (en este caso Asterisk) que es capaz de recibir una llamada e interactuar con el usuario a través de grabaciones de voz y el reconocimiento de respuestas a través del uso de las teclas del teléfono. Algunos ejemplos: el menú que se escucha cuando se llama un centro de atención al cliente.Wait(2) same => n. interactuar de forma activa con el usuario.Record(/tmp/prompt${EXTEN:2}:wav) same => n. que se traduce del inglés como Respuesta de Voz Interactiva. 8.Wait(2) same => n.conf En el contexto internas se pone el siguiente bloque: exten => _66XX.1. la contestadora automática permite navegar entre menús vocales permitiendo elegir entre distintos menús hasta llegar a la información que se está buscando En este capitulo se presentará la configuración de una contestadora automática.CAPITULO VIII IVR IVR es la sigla de Interactive Voice Response.Answer() same => n.Playback(/tmp/prompt${EXTEN:2}) same => n. En el lenguaje técnico habría que diferenciar dos tipos de sistemas: • • El IVR permite hacer consulta a base de datos.1 Grabación de las locuciones En Asterisk con la aplicación Record se pueden grabar archivos audios para luego utilizarlos en la creación de un IVR. los bancos que permiten hacer consultas o pagos a través de un menú vocal. nano /etc/asterisk/extensions.

ulaw 157 . for sales office.wav .wav) a la carpeta creada cd /tmp mv prompt* /var/lib/asterisk/sounds/custom El formato audio de las locuciones es Wav.wav prompt02. se termina con 6603 y se graba la tercera.Si la grabación no es satisfactoria. se vuelve a grabar marcando el mismo numero.“for echo test press 1. press 3” Desde la extensión 1000 se marca 6601 y se graba la primera frase.wav . para español marque dos” prompt02. esto para que Asterisk no tenga que decodificar y codificar las locuciones a otro formato audio según el codec configurado en el teléfono IP o softphone de quien está llamando. el comando será: CLI> file convert custom/prompt01.wav . IMPORTANTE: para terminar la grabación hay que presionar la tecla numero # Se actualiza el dialplan: asterisk -rvvvvvvvvvvvvvvvv CLI> dialplan reload CLI> quit Esta solución permite grabar hasta 99 archivos audio. para la oficina de ventas marque 3” prompt03. A veces es útil y aconsejable crear las mismas locuciones en otros formatos audio. Una vez terminadas las grabaciones se crea un nueva carpeta: mkdir /var/lib/asterisk/sounds/custom y se mueven los tres archivos (prompt01. Para crear las locuciones en otros formatos audio hay un comando disponible en la consola de Asterisk: asterisk -rvvvvvvvvvvvvvvvv Asterisk de manera predefinida busca las locuciones en la carpeta /var/lib/asterisk/sounds. Este proceso se llama transcoding y utiliza bastantes recursos del servidor.“for english press one. para escuchar la música en espera marque 2.wav custom/prompt01.wav y prompt03. Como han sido copiadas en la carpeta custom. La nueva grabación remplazará la vieja. for music on hold press 2. Para el ejemplo a seguir hay que grabar tres archivos de audio que contengan las siguientes frases: • • • prompt01.“para efectuar un test de eco marque 1. luego 6602 y se graba la segunda.

76>. Otra cosa que el proveedor permite.c:20701 handle_request_invite: Sending fake auth rejection for device "6620016037" <sip:6620016037@46. Para una idea de como funciona y de como se configuran los números geográficos. Esto normalmente se hace desde el panel de control que cada cliente tiene a disposición.conf al final del archivo se añade: 158 . Esta lista de IP hay que incluirla en el sip. Estas direcciones están configuradas en un archivo que se descargará: cd /etc/asterisk wget http://www.conf aprovechando el comando include: nano sip. El resultado en la consola de Asterisk será: NOTICE[7577]: chan_sip. facilita siempre el rango de IP de donde ella envía los INVITE para las llamadas entrantes.209.19. al momento de configurarlo.conf sino las llamadas no serán autenticadas pues serán rechazadas. Desde la extensión 1000 se marca el numero.wav custom/prompt01.voztovoice.tag=as4dbd19b8 Asterisk no puede autenticar el INVITE en entrada Para solucionar el problema hay que añadir en el sip. es configurar el “Mapping”. la empresa que lo vende.2 Configuración numero geográfico Cuando se adquiere un numero geográfico.alaw para el formato alaw.org/tmp/didvoztovoice Ahora se incluye el archivo didvoztovoice en el sip. El el caso que se adquiera un numero geográfico. en “Ingresar Nombre Dominio o Dirección IP “ se pone la dirección IP del servidor y en “Usuario o Extensión” la letra s. es decir definir que dirección SIP o numero de teléfono hay que llamar cuando entre una llamada al numero geográfico.conf de Asterisk todas las direcciones IP de donde puede llegar una llamada.De esta forma se convierte la locución al formato audio ulaw CLI> file convert custom/prompt01. Con ese numero ya se puede hacer una primera prueba. puede visitar la pagina de la empresa VozToVoice. La sintaxis es 00 + código país + numero geográfico. Para conocer la sinopsis del comando record: CLI> core show application record CLI> quit 8.

se entra en la consola de Asterisk y se recarga la configuración SIP: asterisk -rvvvvvvvvvvvvvvvvvv CLI> sip reload Segunda prueba: se marca nuevamente el numero se mira que pasa en la consola de Asterisk: NOTICE[7577]: chan_sip.BackGround(custom/prompt01) exten => s.Wait(1) exten => s. nano /etc/asterisk/IVR se copian los tres bloques que siguen: [IVR] exten => s.3.Playback(invalid) exten => i.goto(IVR1.1.s.1.5.1.78' to extension 's' rejected because extension not found in context 'from-voztovoice' Ya la llamada no viene rechazada sino que no se puede enviar a ninguna parte del dialplan porque no Asterisk no encuentra el contexto from-voztooice.3. Más adelante se creará ese contexto 8.Set(CHANNEL(language)=en) exten => s.WaitExten() exten => 1.1) exten => i.Set(TIMEOUT(response)=10) exten => s.Set(TIMEOUT(digit)=7) exten => s.2.goto(IVR2.4.BackGround(custom/prompt03) 159 .goto(IVR.s.c:20785 handle_request_invite: Call from '46.19.Hangup exten => t.4.3.Goto(IVR.1) exten => 2.Set(CHANNEL(language)=es) exten => s.Hangup [IVR1] exten => s. Para hacerlo se crea un nuevo archivo que luego se incluirá en el dialplan.3 Creación del IVR Con la locuciones grabadas.6.2) exten => i.1.Set(TIMEOUT(response)=10) exten => s. ya se puede configurar el IVR.s.1.2) exten => h.s.1. Se guardan los cambios.2.209.#include didvoztovoice El comando #include toma un archivo de texto y lo engloba en la configuración.1.2.Set(TIMEOUT(digit)=7) exten => s.

1.1) exten => i.Goto(internas. va (goto) al contexto IVR2.Playback(pls-wait-connect-call) exten => 3.1.4.1) – si el llamante presiona 2.Hangup [IVR2] exten => s.Espera que el llamante presione una tecla 1.Set(TIMEOUT(response)=10) exten => s.2.Hangup Se guardan los cambios. prioridad 1 2.100.1.2. WaitExten() . extensión s. extensión s.1.WaitExten() exten => 1.Playback(invalid) exten => i.goto(IVR2.2.3.MusicOnHold exten => 3.goto(IVR2.2.hangup exten => t.1.Set(TIMEOUT(digit)=7) exten => s.s.goto(IVR1.1.s.exten => s.goto(IVR1.Goto(IVR2.hangup exten => t.100.1.1) exten => i.1) exten => i.1. prioridad 1 160 .1.Playback(pls-wait-connect-call) exten => 3.MusicOnHold exten => 3.1) exten => i.Goto(internas.Echo() exten => 2.Echo() exten => 2. Una explicación de las nueva funciones y aplicaciones que aparecen en el IVR: • • • • • • • • Wait(1) – Espera un segundo Set(CHANNEL(language)=es) – Se pone como idioma predefinido para las locuciones el español Set(TIMEOUT(digit)=7) – numero de segundos máximo (7) entre el primer dígito y los siguientes Set(TIMEOUT(response)=10) – numero de segundos que el sistema esperará para que el llamante presione una tecla del teléfono.2.1) – si el llamante presiona 1 va (goto) al contexto IVR1.Set(CHANNEL(language)=es) exten => s.1) exten => h.5.Playback(demo-echotest) exten => 1.1.2.Playback(demo-echotest) exten => 1.s.1.1.1.1) exten => h.3.WaitExten() exten => 1.5.BackGround(custom/prompt02) exten => s.Goto(IVR1.1.s. BackGround(custom/prompt01) – presenta la locución prompt01 y al mismo tiempo se pone a la escucha de los dígitos que pueda presionar el llamante.3.2.s.s.1.Playback(invalid) exten => i.

dígitos errados. extensión 100.Playback(invalid) – si la tecla presionada no es valida (ni 1 ni 2) comunica el error i.2) – y devuelve el llamante al contexto IVR.1.conf en el contexto internas se añade el siguiente bloque: exten => 100. Para que todas las llamadas externas sean atendidas por el IVR. extensión s.Noop same => n.Wait(1) same => n.Hangup from-didvoztovoice es el contexto donde llegarán las llamadas al numero geográficos (configurado para cada troncal IP presente en el archivo didvoztovoice).goto(IVR.2) – si dentro de 10 segundos (TIMEOUT(response)).1.s. se añade este bloque: [from-didvoztovoice] exten => s.1. el llamante no presiona ninguna tecla. la llamada se enviará al contexto internas. vuelve a presentar el menú inicial h.1. La extensión t se utiliza cuando la función TIMEOUT está presente en el dialplan La extensión h se utiliza para añadir nuevas lineas de dialplan cuando se cuelga la llamada El segundo bloque del IVR es bastante parecido y envía el llamante a la extensión que haya digitado.Hangup Lo que se hará es marcar a las extensiones 1000.Dial(SIP/1000&SIP/1001&SIP/1002.30) same => n.Answer same => n. al final del archivo se añade esta linea 161 .Answer same => n.Goto(IVR.• • • • i.Goto(IVR.Goto(IVR. La parte interesante es que si se digita el numero tres. se ejecuta la extensión h La extensión i se utiliza para capturar dentro del dialplan.1) y para incluir el archivo IVR al dialplan.s.1. prioridad 2 (presenta nuevamente el menú inicial) t. prioridad 1 Como esa extensión todavía no existe.2) same => n. Este tipo de configuración se llama Ring Group. hay que crearla: nano /etc/asterisk/extensions. Para probar el IVR en local se añaden estas lineas en el contexto internas: exten => 75.Hangup – si el llamante cuelga. 1001 y 1002 simultáneamente hasta que una de las tres conteste la llamada.1. antes del contexto internas.s.2.s.

se marca la extensión 75 para probar el IVR desde local. en el caso que no se marque ninguna.) un IVR que permita marcar directamente una extensión o. las posibilidades son prácticamente infinitas. Ejemplos: • • • un IVR que gestione colas de espera diferenciadas por departamento (ventas. Al momento de crear un IVR. envíe la llamada a una operadora. etc.#include IVR Se guardan los cambios y desde la consola de Asterisk: asterisk -rvvvvvvvvvvvvvv CLI> dialplan reload Ahora desde la extensión 1000. asistencia técnica. un IVR que avise el llamante que las oficinas están cerradas y que envíe la llamada al buzón de voz 162 . compras.

.

1 features. Puede ser: • parked (canal parqueado) • caller (quien llama un canal parqueado) • both (ambos) Activa o desactiva la secuencia de tonos para transferir la llamada cuando es una llamada parqueada. En ese caso hay que crear el contexto en el dialplan Locución que se enviará al canal parqueado cuando alguien lo llama o cuando se activa/desactiva la grabación de la llamada Valor beep Define a quien hay que enviar el courtesytone. Pasado ese tiempo la llamada se transfiere a la extensión definida en el próximo parámetro. la configuración completa del archivo.conf El archivo features.conf es donde se configuran las funcionalidades avanzadas de Asterisk que luego se pueden utilizar a lo largo de una llamada.CAPITULO IX Funcionalidades avanzadas de Asterisk – features.conf A seguir la tabla con los parámetros del archivo y la descripción. Puede ser: • callee (llamado) • caller (llamante) parkingtime => comebacktoorigin courtesytone parkedplay parkedcalltransfers . Estas son: • • • • Parqueo de las llamadas Transferencia ciega y asistida Captura de las llamadas (Pickup) Grabación de las llamadas 9. Con yes se crean de forma automática Numero de segundos que quedará parqueada una llamadas. extensión s. Al final de tabla. prioridad 1. En negrita la opción que se utilizará para cada parámetro. Valor 45 yes = la llamada parqueada se transfiere a la extensión que la parqueó. Parámetro [general] parkext => parkpos => parkinghints Descripción Inicia la parte general del archivo 700 = numero de extensión donde transferir una llamada para parquearla 701-709 = numero de extensiones reservadas para parquear las llamadas no = las prioridades Hint para monitorear el estado de las extensiones dedicadas al parqueo hay que configurarlas manualmente en el dialplan. Con no se envía al contexto parkedcallstimeout..

Puede ser: • callee (llamado) • caller (llamante) • both (ambos) • no (no permitido) Activa o desactiva la secuencia de tonos para grabar una llamada cuando es una llamada parqueada. Valor beep La locución que avisará que la transferencia de llamada no ha tenido éxito.Parámetro • • parkedcallreparking both (ambos) no (no permitido) Descripción Activa o desactiva la secuencia de tonos para parquear la llamada cuando es una llamada parqueada. Puede ser: • callee (llamado) • caller (llamante) • both (ambos) • no (no permitido) Activa o desactiva la secuencia de tonos para terminar una llamada cuando es una llamada parqueada. Puede ser: • callee (llamado) • caller (llamante) • both (ambos) • no (no permitido) La clase de música en espera que escuchará el canal que ha sido parqueado. Valor default Numero de segundos de espera entre los dígitos cuando se está transfiriendo una llamada. Depende de la configuración de los parámetros callgroup y pickupgroup de cada extensión. Valor 5 La locución que avisará que la transferencia de llamada asistida ha tenido éxito. Valor beeperr Tiempo máximo de espera entre los dígitos para activar las funcionalidades definidas después de la etiqueta [featuremap] (en mili segundos) Valor 2000 Tiempo máximo disponible para contestar una transferencia asistida 165 parkedcallhangup parkedcallrecording parkedmusicclass transferdigittimeout => xfersound xferfailsound pickupexten pickupsound pickupfailsound featuredigittimeout atxfernoanswertimeout . Valor *8 La locución que avisará que la captura de llamada ha tenido éxito. Valor beep La locución que avisará que la captura de llamada no ha tenido éxito. Valor beeperr Secuencia de tonos para capturar la llamada de una extensión que está timbrando.

MOH_Class]] [applicationmap] 166 . Se dejan las cuatro lineas comentadas. Asterisk devuelve la llamada a quien la estaba transfiriendo. el numero de las extensiones reservadas y como se van utilizando las extensiones.context => empresa2 . Valor 10 Numero de veces que se intentará devolver una llamada transferida a quien la transfirió sin éxito. se pone el nombre del contexto presente en la linea que sigue. parámetro parkinglot. La etiqueta define el nuevo bloque y los tres parámetros que siguen el contexto. en la configuración de la extensión en el sip. Un ejemplo es si quiere diferenciar las llamadas parqueadas por el departamento de ventas.<Application> [.conf.Parámetro (en segundos). Valor no Numero de segundos de espera antes de intentar nuevamente devolver la llamada (si atxferdropcall = no).findslot => next [featuremap] blindxfer => disconnect => automon => atxfer => parkcall => automixmon => A partir de esta etiqueta empieza la configuración de las funcionalidades # = tecla para activar la transferencia ciega *0 = secuencia de dígitos para terminar una llamada *1 = secuencia de dígitos para iniciar la grabación de la llamada (en dos archivos audio.parkpos => 801-810 . Si está en yes la llamada no se devuelve y se considera terminada. atxferloopdelay atxfercallbackretries . de las llamadas parqueadas por el departamento de compras. Para asignar una extensión a un determinado “slot” de parqueo. Valor 2 Se puede crear más de un bloque de extensiones para parquear las llamadas. Valor 15 atxferdropcall Descripción Si quien transfiere una llamada con el método “asistido” cuelga antes que la llamada sea transferida completamente.<AppArguments>[. uno para cada canal) *2 = secuencia de dígitos para activar la transferencia asistida *7 = secuencia de dígitos para parquear una llamada (se puede usar esta secuencia o #700) *3 = secuencia de dígitos para iniciar la grabación de una llamada (en un único archivo audio donde se mezclarán los dos canales audio) A partir de esta etiqueta se pueden configurar funcionalidades personalizadas. La sintaxis es: <FeatureName> => <DTMF_sequence>.[parkinglot_empresa2] .<ActivateOn>[/<ActivatedBy>].

ActivateOn: aquí se define para quien activar la funcionalidad. Application: La aplicación que se va a ejecutar. • Ahora se crea el archivo de configuración features. MOH_Class: la clase de música en espera que escuchará el canal libre mientras se ejecuta la funcionalidad en el otro canal. DTMF_sequence: la secuencia de dígitos para activar la funcionalidad. Los valores son self y peer.tt-monkeys. Se escuchará timbrar la extensión y una vez que el interlocutor conteste. se podrá hablar con él (por ejemplo para anunciar la llamada que se va a transferir). el otro escuchará la locución tt-monkeys mientras el canal que activó la funcionalidad.conf /etc/asterisk/features. Las opciones son: caller (llamante). Con self la funcionalidad se activa para quien la activa. Se presiona la secuencia *2 y luego el numero de la extensión donde se quiere transferir la llamada. both (ambos). ActivatedBy: Este parámetro define quien tiene acceso a la funcionalidad.Playback. • • • • test1 => *9. La llamada será transferida y el el canal de quien la transfirió será colgado atxfer: A lo largo de una conversación se quiere transferir la llamada a otra extensión.conf. AppArguments: Las opciones asociadas a la aplicación.old se crea uno nuevo nano /etc/asterisk/features. Solamente cuando se colgará la llamada será efectivamente transferida.conf y se copian las lineas que siguen: [general] parkext => 700 parkpos => 701-709 167 . Hay que presionar la tecla # y luego el numero de la extensión. con peer para el otro canal. callee (llamado). escuchará la música en espera Antes de crear el archivo una pequeña explicación de la diferencia entre transferencia ciega y transferencia asistida: • blinxfer: A lo largo de una conversación se quiere transferir la llamada a otra extensión.Parámetro • • • Descripción FeatureName: El nombre de la funcionalidad.conf. Se renombra el predefinido: mv /etc/asterisk/features.peer.default = Digitando la secuencia *9 desde un canal.

findslot => next [featuremap] blindxfer => # disconnect => *0 automon => *1 atxfer => *2 parkcall => *7 automixmon => *3 [applicationmap] test1 => *9.Playback.parkinghints=no parkingtime => 45 comebacktoorigin=yes courtesytone=beep parkedplay=boht parkedcalltransfers=caller parkedcallreparking=caller parkedcallhangup=caller parkedcallrecording=caller parkedmusicclass=default transferdigittimeout => 5 xfersound=beep xferfailsound=beeperr pickupexten=*8 pickupsound=beep pickupfailsound=beeperr featuredigittimeout=2000 atxfernoanswertimeout=15 atxferdropcall=no atxferloopdelay=10 atxfercallbackretries=2 .conf [general] static=yes writeprotect=yse 168 .[parkinglot_empresa2] .default Se guardan los cambios. Para volver disponibles estas funcionalidades hay que modificar el plan de llamadas.peer.tt-monkeys.context => empresa2 . En negrita aparecen las modificaciones: nano /etc/asterisk/extensions. Se va a recoger la configuración del archivo así como se dejó en el modulo anterior.parkpos => 801-810 .

Playback(demo-echotest) same => n.MusicOnHold(mp3.Answer same => n.Dial(SIP/${EXTEN}.Wait(1) same => n.1.Jabbersend(campus.60) same => n.s.Hangup [internas] exten => 50.Answer same => n.1.Hangup exten => 123.2) exten => 100.Echo same => n.Answer same => n.Hangup exten => 200.Noop same => n.Playback(hello-world) same => n.Answer same => n.45) same => n.voztovoice.Hangup exten => _100[0-2].Answer same => n.1.1.Hangup 169 .autofallthrough=yse extenpatternmatchnew=yse clearglobalvars=no [globals] 1000=SIP/1000 JUST=SIP/justvoip marko=IAX2/marko DYNAMIC_FEATURES=test1#blindxfer#automon#disconnect#atxfer#parkcall#automixmon [from-didvoztovoice] exten => s.Noop(Idioma Servidor ${PBX}) same => n.com.Dial(SIP/1000&SIP/1001&SIP/1002.1.Playback(demo-echodone) same => n.Set(PBX=${ENV(LANG)}) same => n.Macro(disponible) same => n.1.Hangup exten => 75.1.Hangup exten => 150.Goto(IVR.1.voztovoicenet@gmail.Goto(IVR.Dumpchan same => n.2) same => n.Estamos escuchando MP3) same => n.s.30) same => n.

1.Busy(3) same => n.hint.1.Answer() same => n.1.Hangup [subscribe] exten => 1000.Dial(IAX2/marko.Hangup exten => _9[12456789]XXXXXXX!.Dial(gtalk/campus.hint.exten => 1234.hint.IAX2/marko exten => 701.Dial(gtalk/campus.hint.SIP/1001 exten => 1002.hint.hint.Dial(DAHDI/R1/${EXTEN:1}.Dial(SIP/spa3102.D(${EXTEN:1})) same => n.Playback(/tmp/prompt${EXTEN:2}) same => n.am.hint.Record(/tmp/prompt${EXTEN:2}:wav) same => n.1.hint..hint.1.park:709@parkedcalls [google-in] 170 .Hangup exten => 10000.park:706@parkedcalls exten => 707.Wait(2) same => n.park:701@parkedcalls exten => 702.Wait(2) same => n.com.hint.park:702@parkedcalls exten => 703.1.Hangup exten => _66XX.30) same => n.4) same => n.Hangup exten => _8.park:707@parkedcalls exten => 708.Hangup [auten] exten => _00.park:705@parkedcalls exten => 706.hint..park:708@parkedcalls exten => 709.Hangup() exten => _[a-z].park:703@parkedcalls exten => 704.NoOP same => n.45.45) same => n..park:704@parkedcalls exten => 705.SIP/1000 exten => 1001.30) same => n.30) same => n.1.voztovoice/${EXTEN}.Dial(SIP/justvoip/${EXTEN}) same => n.SIP/1002 exten => marko.hint.txt.Authenticate(/tmp/pin.voztovoice/fulano@gmail.hint.Wait(2) same => n.

1.com) same => n.1.Dial(gtalk/campus.Set(trunksal=${GROUP_COUNT(justvoip@voip)}) same => n.Hangup [externas] include => internas include => internacio include => parkedcalls [locales] include => internas include => auten 171 .voztovoice/+${EXTEN}@voice.1.voztovoice..Hangup exten => _NNXX..Hangup same => n(busy).Hangup exten => _1XXXXXXXXXX.Playback(all-outgoing-lines-unavailable) same => n. bienvenido en VozToVoice) same => n.SendText(Hola ${nombre}.1.1.Dial(SIP/1000.45) exten => s.n.google.Set(extsal=${GROUP_COUNT(${CALLERID(num)}@salida)}) same => n.Set(CALLERID(name)=${nombre}) same => n.Hangup [from-pstn] exten => s.com) same => n.NoOp same => n.NoOp( Call from Gtalk ) same => n.Gotoif($[${extsal} > 2 | ${trunksal} > 2]?busy) same => n.Hangup() [from-spa3102] exten => s.NoOp same => n.exten => s.20)}) same => n.Dial(gtalk/campus.google.Hangup [internacio] exten => _00X.1.Wait(2) same => n.Dial(SIP/1000.voztovoice/+${EXTEN}@voice.SendText(Espera un momento mientras te comunicamos con un operador) same => n.30) same => n.NoOp(Hay ${extsal} llamadas desde la extension ${CALLERID(num)} y ${trunksal} con el proveedor Justvoip) same => n.Set(GROUP(salida)=${CALLERID(num)}) same => n.Como te llamas?) same => n.Dial(SIP/1000) same => n.SendText(Hola.${CALLERID(name)}.Dial(SIP/justvoip/${EXTEN}) same => n.Set(GROUP(voip)=justvoip) same => n.Set(nombre=${JABBER_RECEIVE(campus.

Busy exten => s. además de tener acceso al contexto internas y internacio.n. tendrán acceso al contexto parkedcalls es decir podrán llamar una extensión parqueada.------Pickup *8 *8 Blind Transfer # # Attended Transfer *2 One Touch Monitor *1 Disconnect Call * *0 Park Call *7 172 .include => parkedcalls [macro-disponible] exten => s.conf sean activas hay que definir la variable DYNAMIC_FEAUTURES y añadirle todas las funcionalidades que se han configurado. Después de la etiqueta [subscribe] se han añadido nueve líneas para poder monitorear el estado de las extensiones utilizadas para parquear las llamadas.n.Hangup exten => s.d/asterisk restart Desde la consola de Asterisk podemos ver las funcionalidades activadas. Para terminar en las etiquetas [externas] y [locales] se ha añadido el contexto parkedcalls.1.Gotoif($["${estado}" = "NOT_INUSE"]?5) exten => s. Lo mismo para las extensiones que tienen acceso al contexto [locales]. Hay tres aplicaciones relacionadas con el parqueo de llamadas que se pueden utilizar en el dialplan: • • • Park ParkAndAnnounce ParkedCall Se guardan los cambios y se reinicia Asterisk: /etc/init.MacroExit #include IVR Para que las funcionalidades configuradas en features. asterisk -rvvvvvvvvvvvv CLI> features show Builtin Feature Default Current --------------------. Todas las extensiones que tengan acceso al contexto externas.Set(estado=${DEVICE_STATE(SIP/${MACRO_EXTEN})}) exten => s.n. De esta forma siempre se podrá saber cuantas llamadas están parqueadas (en los teléfonos IP software y hardware que soportan esta funcionalidad).n.

Una configuración un poco más compleja podría ser: Extensiones ventas: 1000 .3001 .1002 Extensiones soporte: 2000 .1001 .conf y es *8.2002 Extensiones compras: 3000 .3002 Extensión oficina dirección: 4000 173 .One Touch MixMonitor *3 Dynamic Feature Default Current --------------------.2 Callgroup y Pickupgroup En todas las extensiones SIP configuradas se han definido los siguientes parámetros: callgroup=1 pickupgroup=1 ¿Qué significa? Significa que todas las extensiones pertenecen al grupo de llamadas 1 y pueden capturar las llamadas del grupo de llamadas 1. La secuencia de dígitos para capturar una llamada se acaba de configurar el el archivo features.2001 .------test1 no def *9 Feature Groups: --------------(none) Call parking (Parking lot: default) -----------Parking extension : 700 Parking context : parkedcalls Parked call extensions: 701-709 9.

2.3 La extensión 4000. Para que esto sea posible.El escenario es que cada trabajador de cada departamento pueda capturar las llamadas de los teléfonos del departamento en que trabaja y que desde la oficina de dirección se pueda capturar las llamadas de cualquier extensión de cualquier departamento.2. con el parámetro pickupgroup configurado con 1. en la configuración de cada extensión se pone: [1000] callgroup=1 pickupgroup=1 [1001] callgroup=1 pickupgroup=1 [1002] callgroup=1 pickupgroup=1 [2000] callgroup=2 pickupgroup=2 [2001] callgroup=2 pickupgroup=2 [2002] callgroup=2 pickupgroup=2 [3000] callgroup=3 pickupgroup=3 [3001] callgroup=3 pickupgroup=3 [3000] callgroup=3 pickupgroup=3 [4000] callgroup=4 pickupgroup=1.3 podrá capturar las llamadas de 174 .

conf En este párrafo se ilustrará como integrar en el dialplan las funcionalidades configuradas en el archivo features.Hangup Para configurar las funcionalidades definidas en el archivo features.1002 grupo 2 – 2000.45) same => n. Asterisk procesará la línea siguiente del dialplan. es decir: • • • grupo 1 – 1000.Hangup En este caso si desde un SoftPhone o IP Phone conectados a la centralita se marca el numero 0057300100000.45) same => n..1001. IAX2) resource: el recurso utilizado para hacer la llamada o el numero de extensión a llamar timeout: define los segundos dentro de los cuales la llamada tiene que ser contestada options: son las opciones que podemos añadir a la aplicación URL: para enviar una dirección Web a la extensión llamada (si el teléfono soporta la funcionalida) Algunos ejemplos: exten => 1000.conf se tendrá que utilizar unas 175 .Dial(SIP/justvoip/00573001000000. En el caso de proveedores que utilicen el protocolo IAX2 sería: exten => 00573001000000.. es decir terminará la llamada.conf utilizando la aplicación Dial. Esperará una respuesta por 45 segundos y si nadie contesta terminará la llamada.3 Aplicación Dial y features. Si la extensión 1000 no contesta dentro de los treinta segundos.Hangup Si se marca la extensión 1000 Asterisk llamará dicha extensión usando el protocolo SIP.URL]): • • • • • • Dial: el nombre de la aplicación que nos permite efectuar una llamada Technology: el protocolo o la tecnología usada para efectuar la llamada (ej: SIP.][. Como tecnología se ha indicado SIP porque justvoip usa solo este tipo de protocolo.3001.timeout][. exten => 00573001000000.1..3002 9...Dial(SIP/1000. Asterisk llamará dicho numero usando un proveedor VoIP (en este caso especifico Justvoip).1.1.2002 grupo 3 – 3000. La sintaxis de la aplicación Dial: Dial(Technology/resource[&Tech2/resource2.Dial(IAX2/justvoip/00573001000000.las extensiones que perteneces a uno de los grupos configurados.options][.45) same => n.2001. esperará 30 segundos.

conf. exten => 100X.conf.opciones de la aplicación Dial.conf.tT) • • t: permite al llamado transferir la llamada presionando la secuencia de dígitos definida en features.conf T: permite al llamante transferir la llamada presionando la secuencia de dígitos definida en features.1.Dial(SIP/${EXTEN}.conf exten => 100X.1.conf K: permite al llamante parquear la llamada presionando la secuencia de dígitos definida en features. Asterisk.conf exten => 100X. La diferencia con las opciones w y W es que en este caso los dos canales (llamante y llamado) se grabaran en un único archivo audio • Si se quiere.conf H: permite al llamante colgar la llamada presionando la secuencia de dígitos definida en features.Dial(SIP/ ${EXTEN}.45.45. activar todas estas opciones a la vez.Dial(SIP/${EXTEN}.wW) • • w: permite al llamado empezar la grabación de la llamada presionando la secuencia de dígitos definida en features.Dial(SIP/${EXTEN}.45.1. la aplicación Dial aparecerá de esta forma: exten => _100X.45. creará dos archivos audio.kK) • • k: permite al llamado parquear la llamada presionando la secuencia de dígitos definida en features.1.hHkKtTwWxX) 176 .1. uno por cada canal. La diferencia con las opciones w y W es que en este caso los dos canales (llamante y llamado) se grabaran en un único archivo audio X: permite al llamante empezar la grabación de la llamada presionando la secuencia de dígitos definida en features.conf exten => 100X.Dial(SIP/${EXTEN}. creará dos archivos audio.45.1. en este caso. Asterisk.hH) Las opciones presentes: • • h: permite al llamado colgar la llamada presionando la secuencia de dígitos definida en features. por ejemplo. exten => 100X.xX) • x: permite al llamado empezar la grabación de la llamada presionando la secuencia de dígitos definida en features.Dial(SIP/${EXTEN}.conf. uno por cada canal W: permite al llamante empezar la grabación de la llamada presionando la secuencia de dígitos definida en features. en este caso.45.

Hangup Se actualiza el dialplan: asterisk -rvvvvvvvvvvvvv CLI> dialplan reload En el X-Lite se añaden todas las extensiones reservadas para el parqueo de las llamadas.hHkKtTwWxX) same => n. El resultado será: 177 . El resultado tienes que ser: Ahora desde la extensión 1001 se marca la extensión 1002 y cuando esta conteste se parquea la llamada (con la secuencia de dígitos *7 o #700). (en negrita los cambios): nano /etc/asterisk/extensions.45.Macro(disponible) same => n. Para terminar se modifica el dialplan para incluir estas funcionalidades en las llamadas entre extensiones.1.A seguir se presentarán algunos registros como aparecen en la consola de Asterisk al activar o desactivar las funcionalidades descritas.conf exten => _100[0-2].Dial(SIP/${EXTEN}.

User hit '*3' to stop recording call.User hit '*3' to record call. filename: auto-1318460210-1001-1002 == Begin MixMonitor Recording SIP/1002-0000000a -. se activa la grabación de la llamada digitando *3. Otra prueba que se puede hacer es grabar la llamada utilizando la secuencia de dígitos *3 para tener un solo archivo audio de toda la conversación. Desde el X-Lite. Desde la extensión 1001 se marca nuevamente a las 1002 y cuando esta conteste.wav 178 . presionando el botón derecho del ratón sobre la linea de la extensión 701 se podrá llamar la extensión parqueada es decir la extensión 1002. En la consola de Asterisk aparecerá: -.<SIP/1001-00000009> Playing 'beep.La extensión 1002 esta parqueada en la extensión 701.1 root root 233964 Oct 12 17:57 auto-1318460210-1001-1002.ulaw' (language 'es') -.<SIP/1001-00000009> Playing 'beep. == MixMonitor close filestream == End MixMonitor Recording SIP/1002-0000000a Se sale de la consola de Asterisk: CLI> quit Se averigua que se haya creado el archivo: ls -l /var/spool/asterisk/monitor/ -rw-r--r-.ulaw' (language 'es') Digitando nuevamente la secuencia *3 terminará la grabación de la llamada: -.

la llamada será capturada por la extensión 1000 que podrá hablar con la extensión 1001. Si todo funciona bien. 179 . se llama desde la extensión 1001 a la extensión 1002 y cuando ésta timbre. desde la extensión 1000 (X-Lite) se digita *8.Para probar la captura de llamada.

.

ics file integration 0 res_calendar_exchange. hay que compilar las siguientes dos librerías: • • Neon libical Al momento de ejecutar.X. Esta nueva funcionalidad ha sido incluida desde la versión 1. desde la carpeta de las fuentes de Asterisk. Para el formato de los datos se apoya a iCalendar.so Asterisk MS Exchange Web Service Calenda 0 res_calendar_icalendar.so Asterisk CalDAV Calendar Integration 0 res_calendar_ews. Los formatos soportados son: • • iCalendar: es un estándar Internet (RFC5546) que ha sido utilizado por primera vez por Apple con su aplicación iCal CalDAV: es un estándar Internet (RFC4791) que permite a un cliente acceder a la información de eventos programados presentes en un servidor.so Asterisk MS Exchange Calendar Integratio 0 Para que estén activados en Asterisk. Actualmente es utilizado por muchas aplicaciones. • • Esto significa que Asterisk.so Asterisk Calendar integration 1 res_calendar_caldav. Los módulos que se encargan de esta integración son: asterisk -rvvvvvvvvvvvvv CLI> module show like res_calendar Module Description Use Count res_calendar. Yahoo! Calendar y Thunderbird de Mozilla Fundation.Capitulo X Asterisk y los calendarios Asterisk puede ser integrado con distintos formatos de calendarios. el comando make menuselect.8. puede interactuar con estos formatos de Calendario. Es una extensión del estándar Internet WebDAV (RCF 4918). MS Exchange: utilizado por Microsoft Exchange 2003 Ms Exchange Web Services: utilizado por Exchange 2007 y superiores. Google Calendar. entre ellas.so Asterisk iCalendar . oportunamente configurado. Zimbra. se averigua que los módulos estén habilitados: .

Valor: 180 (3 horas) Este parámetro anula cualquiera notificación configurada para un evento y la cambia por el valor indicado en minutos. Valor 10 Cuando falten los N minutos definidos en el parámetro autoreminder.com/calendar/dav/username@gmail. Suponiendo que este calendario es asociado a la extensión 1000.google. extensión definida • ejecutar una aplicación y definir sus parámetros. Valor: 10 Por cada consulta extraer los eventos que tendrán lugar en los próximos N minutos. se simulará la conexión al calendario de Google. Al final de la tabla. Para crear un entorno real.10. Parámetro [campusvoztovoice] type Descripción Etiqueta que permite identificar el calendario que se está configurando. nombre del contexto: calendario 182 este ejemplo: url user secret refresh timeframe autoreminder channel context .com/events/ Personalizar username@gmail con su cuenta de Google Nombre usuario gmail.1 calendar. En el caso de GoogleCalendar la sintaxis es: https://www. Personalizar Puede ser: • iCal • caldav • exchange (Microsoft Exhange 2003) • ews ( Microsoft Exchange 2007 y superiores) Para Google Calendar el tipo es caldav La URL para conectarse al calendario. A partir de los próximos parámetros podemos definir dos comportamientos distintos cuando la extensión 1000 conteste la llamada: • enviar la llamada a un contexto. A seguir la tabla con los parámetros de configuración. es posible enviar una llamada a la extensión indicada en este parámetro. la opción que se utilizará para cada parámetro. que se puede activar utilizando una cuenta Gmail registrada.conf y se encuentra en la carpeta /etc/asterisk. La sintaxis es: Tecnología/numero. En negrita. se pone SIP/1000.conf El archivo para la configuración de los calendarios es calendar.com Personalizar la contraseña del usuario Google Cada cuantos minutos consultar el Calendario de Google para actualizar los datos en Asterisk. la configuración completa del archivo.voztovoice@gmail. En campus. En este archivo se puede configurar más de un calendario y cada uno será identificado por una etiqueta inicial. Este valor tiene que ser mayor del parámetro refresh.

com/calendar/dav/username@gmail. Valor 45 Con estos parámetros se configura el primer calendario. En este ejemplo se han creado tres: 183 .Parámetro extension app appdata waittime numero de extensión: cal Descripción aplicación a ejecutar cuando la extensión conteste: Playback opciones para la aplicación: demo-congrats este ultimo parámetro define el tiempo (en segundos) que tendrá la extensión 1000 para contestar la llamada.com/events/ user=campus.conf [campusvoztovoice] type=caldav url=https://www.appdata=demo-conrats IMPORTANTE: Personalizar los datos de la etiqueta inicial.old y se crea uno nuevo: nano /etc/asterisk/calendar. se utilizarán los dos parámetros context/extension. Primero se crea una copia del archivo predefinido: mv /etc/asterisk/calendar. el parámetro url. Se guardan los cambios Ahora se entra en la pagina del calendario de Google y se van añadiendo una serie de eventos para el día en que se está configurando este modulo.conf /etc/asterisk/calendar. Como configuración predefinida.conf. el parámetro user y el parámetro secret con los datos de su cuenta Google.com secret=password refresh=10 timeframe=180 autoreminder=10 channel=SIP/1000 context=calendario extension=cal waittime=45 .google. cuando la extensión 1000 conteste.app= Playback .voztovoice@gmail.

conf. ¿Por qué? Primero se descarta que sea un problema de la configuración de los datos en el archivo calendar.conf.com/calendar/dav/campus.so Si aparece esta advertencia: [Feb 7 16:20:09] WARNING[27477]: res_calendar_caldav.voztovoice@gmail. Se abre una ventana del navegador y se pega la url que aparece en el archivo calendar.Se entra en la consola de Asterisk: asterisk -rvvvvvvvvvvvvvvvvvvvv Se recarga el modulo calendario: CLI> module reload res_calendar.google.c:157 caldav_request: Unknown response to CalDAV calendar campusvoztovoice. En este caso: https://www.voztovoice@gmail.com/events/: Could not read status line: connection was closed by server significa que la configuración no está funcionando. request REPORT to /calendar/dav/campus.com/events/ Aparecerá: 184 .

esto quiere decir que se basa en una conexión segura y que la librería que permite la conexión CalDAV (neon) debe implementar el protocolo SSL.6 y se lanza nuevamente un configure: . Esto significa que los datos de configuración del archivo calendar. ¿Será que Neon no se ha compilado con el soporte SSL? Se entra en la carpeta de las fuentes de neon: cd /usr/src/neon-0./configure Cuando el comando termine: Por defecto neon no se compila con el soporte SSL. Si se mira el parametro url del archivo. Se termina presionando el botón “Iniciar sesión”. Si la conexión tiene éxito aparecerá una ventana de descarga que pedirá de guardar un archivo de texto: El archivo descargado contendrá todos los datos del calendario. se notará que empieza con https.conf son correctos.Se pone el nombre de usuario de Google y la contraseña. pues para solucionar el problema hay que volver a compilar neon y luego Asterisk: 185 .29.

Primero se para el servicio: service asterisk stop Se entra en la carpeta de las fuentes: cd /usr/src/asterisk-1. Se termina la compilación e instalación: make make install Ahora hay que volver a compilar Asterisk.0 se borra la compilación anterior: make distclean se vuelve a compilar: .8.11./configure Se necesita volver a entrar en la interfaz gráfica para seleccionar los módulos Add-ons ya que por defecto no están seleccionados: make menuselect 186 .make distclean ./configure --prefix=/usr --with-ssl=openssl Ahora si se compiló con el soporte SSL.

Modificar campusvoztovoice con el nombre de su calendario. 187 .so Si no aparecen errores y/o advertencias significa que esta vez la conexión al calendario de Google ha tenido éxito y se debería poder ver algunos eventos programados. CLI> calendar show calendars Con este comando aparecerá la lista de calendarios configurados y el estados de cada uno: Calendar Type Status ---------------campusvoztovoice caldav free Con este comando: CLI> calendar show calendar campusvoztovoice se pueden ver los eventos programados en los próximos 180 minutos (parámetro timeframe=180). se inicia nuevamente Asterisk: service asterisk start Se entra en la consola y se recarga nuevamente el modulo Calendario: asterisk -rvvvvvvvvvvvvv CLI> module reload res_calendar. Si no aparecen es porque todavía Asterisk no ha actualizado la información ya que lo hace cada 10 minutos (parametro refresh=10).Se guardan los cambios y se vuelve a compilar: make make install Terminada esta operación.

Ahora para que la llamada llegue a la extensión 1000 hay que crear el contexto calendario y la extensión cal (como configurado en el archivo calendar. los requisitos son: • • • Paquete Perl Paquete perl-libwww sox 188 .conf). Para que el AGI funcione. Aunque la parte de los AGI se verá de manera más detallada en el ultimo modulo del curso. Lefteris Zafiris. ¿Cómo se construye el dialplan para que la extensión 1000 pueda saber que cita está para iniciar?. El evento programado a las 11 no aparece porque el modulo está configurado para que lea los eventos de los próximos 180 minutos. Hay que instalar un sistema de texto a voz que lea un texto y lo transforme en audio. en este caso se implementará esta solución. ha desarrolado un AGI que se conecta al sistema de texto a voz de Google y transforma un texto en audio.Aparece el evento de las 7:30 y el evento de las 9:30.

4.13.5.agi. compila e instala mpg123: cd /usr/src wget http://downloads.13.13.agi /var/lib/asterisk/agi-bin/ chmod +x /var/lib/asterisk/agi-bin/googletts.5.tar.NoOp(Llamada desde el calendario) same => n.bz2 tar -xf mpg123-1.sourceforge.tar.Agi(googletts.4. Por eso se copia el AGI en esa carpeta y se vuelve ejecutable: cp googletts."${CALENDAR_EVENT(summary)}. se instalan los paquetes de perl: yum install perl perl-libwww-perl se descarga.5 Por defecto Asterisk busca los AGI en la carpeta /var/lib/asterisk/agi-bin.agi Por ultimo se modifica el dialplan: nano /etc/asterisk/extensions.org/campus/pbx18/asterisk-googletts-0.tar.4 .net/project/mpg123/mpg123/1.• • mpg123 el servidor donde está instalado Asterisk debe tener acceso a Internet Como sox ya está instalado.gz Se descomprime: tar -xf asterisk-googletts-0.".4/mpg123-1./configure --prefix=/usr make make install Ya se puede descargar el archivo que contiene el AGI: cd /usr/src wget http://www.1.es) 189 .conf y antes del contexto internas se crea el nuevo contexto: [calendario] exten => cal.13.tar.bz2 cd mpg123-1.gz Se entra en la carpeta creada: cd asterisk-googletts-0.voztovoice.

". hay que transformarla en el formato de hora y minutos a través de la función STRFTIME Se recarga el dialplan: asterisk -rx "dialplan reload" 10 minutos antes del inicio del evento.Wait(1) same => n.Hangup En la segunda y tercera linea se inicia el AGI y se leen las variables $ {CALENDAR_EVENT(summary)} y ${CALENDAR_EVENT(start)} que contienen el titulo del evento y la hora de inicio respectivamente. Como la hora se lee en el formato EPOCH.%H:%M)}.Agi(googletts. le anunciará el tipo de evento y la hora en que va a iniciar.Playback(goodbye) same => n.same => n.. Asterisk llamará la extensión 1000 y cuando esta conteste."a las ${STRFTIME(${CALENDAR_EVENT(start)}.es) same => n. La llamada llegará siempre con este CALLERID: Cuando el evento iniciará en el calendario aparecerá el estado ocupado: asterisk -rvvvvvvvvvvvvvv CLI> calendar show calendars Calendar Type Status ---------------campusvoztovoice caldav busy Esto es así siempre y cuando en la configuración del evento en el Calendario se haya configurado la opción: Para saber que tipo de informaciones se pueden conocer acerca de un evento programado el comando 190 .agi.

The priority of the event calendar .The text description of the event organizer .2 CALENDAR_BUSY Es una función que permite consultar un calendario para ver si su estado es libre o ocupado.The organizer of the event location .The name of the calendar associated with the event uid . 1=TENTATIVE.The categories of the event priority . Para conocer todas las funciones disponibles en Asterisk para trabajar con los calendarios: CLI> core show function calendar + tecla tabulador CALENDAR_BUSY CALENDAR_EVENT CALENDAR_QUERY_RESULT CALENDAR_WRITE 10. the event data may be accessed with this function.The end time of the event busystate .The busy state of the event 0=FREE.es: asterisk -rvvvvvvvvvvvvvv CLI> core show function CALENDAR_EVENT -= Info about function 'CALENDAR_EVENT' =[Synopsis] Get calendar event notification data from a notification call. Un ejemplo: el calendario 191 CALENDAR_QUERY . [Syntax] CALENDAR_EVENT(field) [Arguments] field summary .The location of the eventt categories . [Description] Whenever a calendar event notification call is made.The start time of the event end .The VEVENT SUMMARY property or Exchange event 'subject' description . Este tipo de respuesta se puede utilizar en el dialplan asociando el calendario a una determinada extensión y en base al estado del calendario procesar la llamada de diferentes formas. 2=BUSY Todos los parámetros bajo la etiqueta [Arguments] se pueden extraer del calendario y utilizar en el dialplan.The unique identifier for this event start .

45.GotoIf($[${MACRO_EXTEN} = 1000]?calendario) same => n. Si el estado del calendario es ocupado. Asterisk devuelve el valor 1.hHkKtTwWxX) same => n.Macro(disponible) same => n.Dial(SIP/${EXTEN}.MacroExit same => n(calendario).Noop(${MACRO_EXTEN}) same => n.Hangup para que quede: exten => _100[0-2]. antes de esta linea: #include IVR se añade la nueva macro: [macro-calendario] exten => s.MacroExit same => n(ocupado). Si resulta ocupado.1. Si es así continua desde la etiqueta calendario donde revisa si el calendario asociado a la extensión 1000 (en este caso campusvoztovoice) resulta libre o ocupado. Se guardan los cambios y se recarga el dialplan: asterisk -rvvvvvvvvvvvvvvvvvvvvv 192 .Noop(Estado = ${estado}) same => n.Dial(SIP/${EXTEN}. extensión.Macro(calendario) same => n. se le anuncia al llamante (con el AGI de google) que la extensión se encuentra ocupada y que llame más tarde). si resulta libre Asterisk devuelve el valor 0).Gotoif($[${estado} = 1]?ocupado) same => n."la extensión se encuentra ocupada.Agi(googletts.conf se modifica este bloque: exten => _100[0-2]. prioridad +1 de donde la Macro se ha llamado.Set(estado=${CALENDAR_BUSY(campusvoztovoice)}) same => n.1.Hangup y al final del archivo. sino se pasa la llamada a la extensión 1000. llame mas tarde.hHkKtTwWxX) same => n.configurado en Asterisk está asociado a la extensión 1000.1. Si el resultado es 0 se sale de la Macro y se vuelve al contexto.agi. Se abre el dialplan nano /etc/asterisk/extensions. se anuncia al llamante de llamar más tarde.es) same => n.Macro(disponible) same => n. Gracias".Hangup Esta nueva macro controla primero si la extensión que se está llamando es la 1000.45. En el caso que el resultado sea 1.

"disponible") in new stack -. "googletts. se debería escuchar el anuncio que la extensión se encuentra ocupada.Goto (macro-calendario.CLI> dialplan reload se averigua el estado del calendario: CLI> calendar show calendars Calendar Type Status ---------------campusvoztovoice caldav busy Como en este caso resulta el ocupado. "") in new stack -. returning 0 -. "1?ocupado") in new stack -.es") in new stack -.8) -. llame mas tarde.Executing [s@macro-calendario:1] NoOp("SIP/1001-0000000f".agi.Executing [s@macro-disponible:1] Set("SIP/1001-0000000f".agi -.Executing [1000@externas:1] Macro("SIP/1001-0000000f".agi completed. description – La descripción del evento organizer – El organizador del evento location – Sitio donde tiene lugar el evento 193 .Executing [s@macro-calendario:4] Set("SIP/1001-0000000f".Executing [1000@externas:2] Macro("SIP/1001-0000000f".s. "calendario") in new stack -.s. Más en detalle: • • • • summary – El titulo del evento.s. "") in new stack 10. "1?5") in new stack -. "1000") in new stack -. "Estado = 1") in new stack -.Executing [s@macro-disponible:2] GotoIf("SIP/1001-0000000f". "estado=NOT_INUSE") in new stack -."la extension se encuentra ocupada.Launched AGI Script /var/lib/asterisk/agi-bin/googletts.5) -.Executing [s@macro-calendario:9] Hangup("SIP/1001-0000000f".Executing [s@macro-calendario:2] GotoIf("SIP/1001-0000000f".Executing [s@macro-calendario:8] AGI("SIP/1001-0000000f". si desde la extensión 1001 se marca a la extensión 1000.Executing [s@macro-calendario:6] GotoIf("SIP/1001-0000000f". Gracias".3 CALENDAR_EVENT Como ya se ha visto más arriba.4) -. "estado=1") in new stack -. esta función permite extraer todas las informaciones relacionadas con un evento.Goto (macro-disponible.<SIP/1001-0000000f>AGI Script googletts.Executing [s@macro-disponible:5] MacroExit("SIP/1001-0000000f". El resultado de la llamada en la consola: Extension Changed 1001[subscribe] new state InUse for Notify User 1000 -. "1?calendario") in new stack -.Playing '/tmp/80eb1469553d3ab98b95661fbf6a2f1c' (escape_digits=) (sample_offset 0) -.Executing [s@macro-calendario:5] NoOp("SIP/1001-0000000f".Goto (macro-calendario.

En Google calendar sería: ¿Parece complicado? La verdad no. Un ejemplo es configurar un evento de Conferencia y en la casilla lugar indicar un numero de cuarto de conferencia. se pueden construir diferentes bloques de dialplan.• • • • • • • categories – Categoría del evento priority – Prioridad asignada al evento calendar – Nombre del calendario asociado con el evento uid – numero único que identifica el evento start – Fecha y hora de inicio de un evento end – Fecha y hora en que termina el evento busystate – El estado configurado para el evento Con estos datos. En en dialplan: 194 . Lo importante es que cada persona que tiene o quiere participar a la conferencia ponga en su calendario personal la misma información en los campos Titulo y lugar.

Hangup same => n(conf).%H:%M)}."a las ${STRFTIME(${CALENDAR_EVENT(start)}.1."${CALENDAR_EVENT(description)}".Wait(1) same => n.Agi(googletts.es) same => n. En la linea con la etiqueta conf se utiliza el AGI de texto a voz de Google y se le anuncia a la extensión la descripción del evento..".agi. La lógica de la linea funciona de la siguiente manera: Si la variable ${CALENDAR_EVENT(location)} no está vacía “y” (el carácter &) la variable $ {CALENDAR_EVENT(summary) contiene el valor Conferencia ir a la etiqueta conf sino continuar con la linea que sigue. Se profundizará el tema de las conferencias en el Capitulo XV.". En la linea siguiente se utiliza la aplicación ConfBridge para crear una conferencia dinámica cuyo numero es el que aparece en el campo lugar (location) del calendario y se envía la extensión a esa conferencia.es) same => n. desde la consola de Asterisk: 195 .es) same => n.NoOp(Llamada desde el calendario) same => n.Wait(1) same => n."${CALENDAR_EVENT(summary)} a las ${STRFTIME($ {CALENDAR_EVENT(start)}..1.Agi(googletts.agi. Si la variable está vacía devuelve 1 sino 0.4 CALENDAR_QUERY y CALENDAR_QUERY_RESULT Esta dos funciones sirven para hacer consultas en los calendarios configurados en Asterisk y sacar los datos de interés.".agi.Agi(googletts.Hangup En la linea dos se utiliza la función ISNULL que permite averiguar si una variable está vacía.%H:%M)}.NoOp(Llamada desde el calendario) same => n."${CALENDAR_EVENT(summary)}.Confbridge(${CALENDAR_EVENT(location)}.agi.Playback(goodbye) same => n. 10.conf Se modifica este bloque: [calendario] exten => cal.Playback(goodbye) same => n.nano /etc/asterisk/extensions.Gotoif($[${ISNULL(${CALENDAR_EVENT(location)})} = 0 & "$ {CALENDAR_EVENT(summary)}" = "Conferencia"]?conf) same => n.cM(default)) same => n.Agi(googletts. Para saber que datos se pueden extraer.Hangup Para que quede: [calendario] exten => cal.es) same => n.

field[. con esta opción se define a que evento hace referencia el campo que se quiere extraer Para ver como funcionan.entry]) • • • id – el valor obtenido con la función CALENDAR_QUERY field – El campos que se quiere extraer de un determinado evento entry – en el caso que la función CALENDAR_QUERY haya almacenado en su id más de un evento.asterisk -rvvvvvvvvvvvvvv CLI> core show function CALENDAR_QUERY_RESULT • • • • • • • • • • • • getnum – numero de eventos que tendrán lugar en el rango de tiempo indicado en la consulta (en este caso 180 minutos) summary – Titulo del evento description – Descripción del evento organizer – Organizador del evento location – Lugar del evento categories – Categoría del evento priority – Prioridad del evento calendar – Nombre del calendario uid – Numero que identifica univocamente el evento start – Hora de inicio del evento end – Hora en que termina el evento busystate – El estado del calendario La sintaxis de la función es: CALENDAR_QUERY_RESULT(id. se crean dos nuevos eventos: Se averigua que los eventos aparecen en Asterisk: 196 .

se añade a la variable ${EPOCH} el valor 10800 segundos que corresponden a 180 minutos.$ {num})}.Agi(googletts."a las ${STRFTIME(${CALENDAR_QUERY_RESULT(${id}.Perfecto! Ahora se crea el dialplan para hacer una consulta al calendario: nano /etc/asterisk/extensions.Agi(googletts.summary.Set(numeve=${CALENDAR_QUERY_RESULT(${id}.getnum)}) same => n.es) same => n. es decir los eventos 197 • .Set(fin=$[${EPOCH}+10800]) same => n.es) same => n.conf Linea 3 – se asigna a la variable id el resultado de la consulta en el calendario campusvoztovoice indicando la ora de inicio y la hora final de la consulta.Hangup • Linea 2 – Como en la configuración de los calendarios se ha puesto como limite de consulta los 180 minutos.Endwhile same => n.Noop(Consulta en el calendario) same => n.agi.conf En el contexto internas se añade este bloque: exten => 51.start.%H:%M)}". No se puede hacer consultas más allá de este tiempo sin cambiar la configuración del parámetro timeframe en calendar.Set(numeve=$[${numeve}-1]) same => n..While($[${numeve} > 0]) same => n.${num})}".${EPOCH}."${CALENDAR_QUERY_RESULT(${id}.1.Set(id=${CALENDAR_QUERY(campusvoztovoice.agi.${fin})}) same => n.Set(num=1) same => n.Set(num=$[${num}+1]) same => n.

• • • • • •

• •

que tendrán lugar en lo próximos 180 minutos Linea 4 – se asigna a la variable numeve el numero de eventos que tendrán lugar en los próximos 180 minutos Linea 5 – se asigna a la variable num el valor 1 Linea 6 – la aplicación While se usa para crear un ciclo y este ciclo se ejecutará hasta que la variable ${numeve} sea mayor a 0 Linea 7 – con el AGI del TTS de Google se anuncia el titulo del evento (summary) de la entrada cuyo numero es el contenido en la variable ${num} Linea 8 - con el AGI del TTS de Google se anuncia la hora (start) de la entrada cuyo numero es el contenido en la variable ${num} Linea 9 – se asigna a la variable ${numeve} el valor de la misma variable menos 1. Ejemplo: si el calendario contiene dos eventos en los próximos 180 minutos, la variable ${numeve} contiene el valor 2. Después de esta linea contendrá el valor 1 Linea 10 – Se asigna a la variable ${num} el valor de la variable ${num} + 1. Como inicialmente la variable contenía el valor 1, después de esta linea contendrá el valor 2 Llinea 11 – Con la aplicación EndWhile se cierra el ciclo y el dialplan vuelve a la linea con la aplicación While. Ahora, como la variable ${numeve} es todavía mayor que 0, el ciclo se repite y se leerá el titulo y la hora del segundo evento.

La siguiente vez que se vuelve a la aplicación While, la variable ${numeve} contendrá el valor cero pues se saldrá del ciclo “While - Endwhile” y se ejecutará la linea que sigue la aplicación EndWhile, es decir same => n,Hangup De esta forma si llegando a la oficina, se quiere conocer los eventos programados en las próximas 3 horas, basta marcar la extensión 51. Claramente cada persona de la empresa puede tener su calendario personal. 10.5 CALENDAR_WRITE Con la función CALENDAR_WRITE, es posible crear nuevos eventos en el calendario desde Asterisk. En este ejemplo se mostrará como grabar las llamadas salientes con el proveedor Justvoip en un calendario. Para este ejemplo se utilizará un nuevo calendario. Desde la pagina de administración del calendario principal, se entra en la pagina de configuración y se crea un nuevo calendario:

198

Se presiona el botón “Crear un calendario nuevo” y en la nueva pagina se rellenas los campos:

Se concluye la creación presionando el botón “Crear calendario”. Se entra en la configuración del nuevo calendario y se anota el siguiente dato:

Con el valor del ID del nuevo calendario se configura Asterisk: nano /etc/asterisk/calendar.conf al final del archivo se añade: [llamadas] type=caldav
url=https://www.google.com/calendar/dav/gkcb6avik25hne6tg10d20sf1k@group.calendar.google.com/events/

user=campus.voztovoice@gmail.com secret=password refresh=10 timeframe=180 autoreminder=10 channel=SIP/1000 context=calendario extension=cal waittime=45 199

IMPORTANTE: Personalizar los datos de la etiqueta inicial, el parámetro url, el parámetro user y el parámetro secret con los datos de su cuenta Google. Se guardan los cambios y se entra en la consola de Asterisk: asterisk -rvvvvvvvvvvvvvvvvvvv Se recarga el modulo: CLI> module reload res_calendar.so Si no aparecen errores y/o advertencias, todo debería estar bien configurado. Con el comando: CLI> calendar show calendars Calendar Type Status ---------------campusvoztovoice caldav free llamadas caldav free Se puede comprobar que efectivamente los dos calendarios están conectados. Los datos de las llamadas que se guardarán en el calendario son: • • • • extensión que ha iniciado la llamada IP de la extensión numero marcado Fecha de la llamada

Para implementar está solución se abre el dialplan: nano /etc/asterisk/extensions.conf se modifica este bloque: [internacio] exten => _00X.,1,NoOp same => n,Set(GROUP(voip)=justvoip) same => n,Set(GROUP(salida)=${CALLERID(num)}) same => n,Set(trunksal=${GROUP_COUNT(justvoip@voip)}) same => n,Set(extsal=${GROUP_COUNT(${CALLERID(num)}@salida)}) same => n,NoOp(Hay ${extsal} llamadas desde la extension ${CALLERID(num)} y ${trunksal} con el proveedor Justvoip) same => n,Gotoif($[${extsal} > 2 | ${trunksal} > 2]?busy) same => n,Dial(SIP/justvoip/${EXTEN}) same => n,Hangup 200

same => n(busy),Playback(all-outgoing-lines-unavailable) same => n,Hangup Para que quede: [internacio] exten => _00X.,1,NoOp same => n,Set(CALENDAR_WRITE(llamadas,summary,description,location,start)=Llamada de $ {CALLERID(num)} a ${EXTEN},Llamada desde la extension ${CALLERID(num)} al numero $ {EXTEN},IP = ${CHANNEL(peerip)},${EPOCH}) same => n,Set(GROUP(voip)=justvoip) same => n,Set(GROUP(salida)=${CALLERID(num)}) same => n,Set(trunksal=${GROUP_COUNT(justvoip@voip)}) same => n,Set(extsal=${GROUP_COUNT(${CALLERID(num)}@salida)}) same => n,NoOp(Hay ${extsal} llamadas desde la extension ${CALLERID(num)} y ${trunksal} con el proveedor Justvoip) same => n,Gotoif($[${extsal} > 2 | ${trunksal} > 2]?busy) same => n,Dial(SIP/justvoip/${EXTEN}) same => n,Hangup same => n(busy),Playback(all-outgoing-lines-unavailable) same => n,Hangup Se ha añadido la linea 2 (en amarillo). El contenido de esa linea tiene que quedar en la mismo renglón. Con esa linea se le dice a Asterisk que guarde en el calendario “llamadas” los campos: • • • • summary description location start

En la segunda parte de la linea se le asigna a cada campo un valor y más en detalle: • • • • Summary = Llamada de ${CALLERID(num)} a ${EXTEN} Description = Llamada desde la extension ${CALLERID(num)} al numero ${EXTEN} Location = IP = ${CHANNEL(peerip)} Start = ${EPOCH}

Las variables presentes: • • • • ${CALLERID(num)} – Contiene el numero de la extensión que ha llamado ${EXTEN} – Contiene el numero marcado ${CHANNEL(peerip)} = Contiene la IP de donde la extensión ha iniciado la llamada ${EPOCH} = Contiene la fecha de inicio de la llamada en formato EPOCH que es el requerido por Google Calendar

El resultado en Google Calendar será: 201

Si tenemos sincronizado el calendario en un sistema Android:

Claramente este es ejemplo muy sencillo. Se puede elaborar más para sacar más datos de la llamada. Otro ejemplo para utilizar esta función podría ser programar una conferencia a través de un IVR indicando las extensiones que deben participar y guardar los datos en el Calendario. 10.6 Enviar las notificaciones de los calendarios a números fijos/celulares En la configuración que se ha visto hasta el momento, es posible asociar el calendario a una extensión y llamar la extensión configurada para notificarle el comienzo de un evento. Una forma más elaborada de configurar el calendario y de consecuencia el dialplan, es modificar el CALLERID antes de marcar a la extensión y en el caso que no conteste, desviar la llamada a un numero fijo/celular. Para este tipo de configuración se utilizará el chan_local.

202

Primero se modifica la configuración del calendario: nano /etc/asterisk/calendar.conf Se modifica esta linea: channel=SIP/1000 para que quede: Local/6500@internas Se guardan los cambios. De esta forma cuando se acerca un evento y Asterisk envía la notificación, llamará el canal Local, extensión 6000, contexto internas; esa extensión hay que crearla en el dialplan: nano /etc/asterisk/extensions.conf En el contesto internas se añaden las siguientes lineas: exten => 6500,1,Set(CALLERID(name)=Calendario) same => n,Set(CALLERID(num)=CampusVozToVoice) same => n,Dial(SIP/1000,15) same => n,Gotoif($[${DIALSTATUS} = ANSWER)]?contestada) same => n,Dial(SIP/justvoip/0057XXXXXXXXXX) same => n,hangup same => n(contestada),Hangup • • • • • En la primera linea se asigna al la variable CALLERID(name) la palabra Calendario En la segunda linea se asigna a la variable CALLERID(num) el nombre del calendario (en este caso CampusVozToVoice) En la tercera linea se marca a la extensión 1000 por 15 segundos Si la extensión contesta (GotoIF verdadero), se va a la etiqueta (contestada) y se termina la llamada Si la extensión no contesta dentro de 15 segundos, se marca al un numero fijo o celular.

Se guardan los cambios y se crea un nuevo evento en el calendario para probar la configuración. Se reinicia Asterisk: service asterisk restart Se espera la llamada del calendario. Primero timbrará la extensión 1000:

203

Si no se contesta dentro de 15 segundos, la llamada se enviará al numero fijo/celular configurado:

En este caso el CALLERID no es el que se ha configurado en el dialplan ya que su envío/recepción depende del Proveedor VoIP utilizado.

204

Capitulo XI CCSS (Call Completion Supplementary System) – Rellamada
El CCSS es una nueva funcionalidad de Asterisk 1.8.X que permite solicitar el servicio de rellamada cuando el llamado no ha contestado y/o su extensión se encuentra ocupada. El sistema se basa en el Internet Draft “draft-ietf-bliss-call-completion-04”. Un Internet Draft es una propuesta de estandarización presentada a la IETF (Internet Engineering Task Force) para que sea analizada y, si el caso, aprobada y transformada en un RFC (Request for Comment), es decir, un estándar de hecho. En este caso los desarrolladores de Asterisk han optado por implementar un sistema que todavía no es un estándar de hecho. Esto explica porque muchas veces no hay interoperabilidad entre dispositivos SIP de distintos productores aunque, supuestamente, todos utilizan el protocolo SIP. Actualmente la única PBX que utiliza este Draft es Asterisk y no hay sofphone ni teléfonos SIP que lo implementen. Es por este motivo que al momento de configurar esta funcionalidad, se podrá utilizar su configuración nativa solamente entre servidores Asterisk (desde la versión 1.8.X). Para su utilizo entre Asterisk y los teléfonos SIP o softphone hay que optar por su configuración genérica que realmente no se basa en el Draft mencionado, sino en un sub-sistema que se apoya a la función DEVICE_STATE. ¿Cómo funciona el sistema? El sistema aplica a llamadas no contestadas CCNR (Call Completion on No Response) o cuando la extensión llamada se encuentra ocupada CCBR (Call Completion on Busy Subscriber) y solamente para canales SIP. Si se utiliza el agente genérico para solicitar la rellamada, habrá que utilizar la aplicación CallCompletion. Si se utiliza el agente nativo, el mismo productor del dispositivo que implementa el Draft, indicará como activarla. Normalmente es a través de una tecla del teléfono o presionando un botón ya programado para esta función. Un ejemplo. La extensión 1000 llama la extensión 1001. Si la extensión 1001 no contesta, la extensión 1000 tendrá un tiempo predefinido para solicitar una rellamada. La solicitud se hace utilizando la aplicación CallCompletion en el dialplan. Una vez solicitada la rellamada, se activará un temporizador que definirá por cuanto tiempo la solicitud quedará activa. Si dentro de este tiempo la extensión 1001 efectúa una llamada, Asterisk la considerará nuevamente activa y en cuanto termine la llamada, marcará primero la extensión 1000 y luego la extensión 1001. Si la rellamada tiene éxito, la solicitud sera eliminada. Si la rellamada no tiene éxito (la extensión 1001 no contesta nuevamente o está hablando), habrá que solicitar una nueva rellamada. En cualquier momento se puede anular una solicitud de rellamada utilizando la aplicación CallCompletionCancel en el dialplan. 11.1 Configuración del CCSS ¿Cómo se configura el sistema de rellamada en Asterisk? Primero hay que configurar el archivo ccss.conf. En este archivo se define un único parámetro que es el numero máximo de solicitudes que pueden estar activas en la PBX. Los demás datos que se encuentran el el archivo son para la configuración de las extensiones.

Se renombra el archivo predefinido: mv /etc/asterisk/ccss.conf /etc/asterisk/ccss.conf.old Se crea uno nuevo: nano /etc/asterisk/ccss.conf y se pone, después de la etiqueta general, el parámetro cc_max_requests: [general[ cc_max_request=20 De esta forma se limita a veinte el numero máximo de solicitudes activas en el sistema. Se guardan los cambios. Ahora la parte de las extensiones, donde se pueden configurar una serie de parámetros. Los parámetros que no se configuran, tomarán como valor el predefinido: Parámetro cc_offer_timer Descripción Tiempo máximo, en segundos, para solicitar una rellamada cuando una llamada no ha tenido éxito. Valor 20 Tiempo de vida, en segundos, de una solicitud de rellamada cuando le extensión llamada estaba ocupada. Valor 4800 Tiempo de vida, en segundos, de una solicitud de rellamada cuando la extensión llamada no ha contestado. Valor 7200 Cuando la extensión que ha solicitado la rellamada, recibe la llamada del sistema tendrá el numero de segundos indicados en este parámetro para contestar. Si no lo hace la rellamada será anulada. Valor: 20 Este parámetro describe el tipo de comportamiento de Asterisk cuando se comunicará con el llamante para una rellamada. Puede ser: • never: deshabilita la posibilidad de solicitar una rellamada para el llamante • generic: cuando no se utiliza el Draft sino el sub-sistema basado en el 207

ccbs_available_timer

ccnr_available_timer

cc_recall_timer

cc_agent_policy

DEVICE_STATE native: cuando se utiliza el Draft para el sistema de rellamada (el teléfono del llamante lo soporta)

cc_monitor_policy

Este parámetro describe el tipo de comportamiento de Asterisk cuando se comunicará con el llamado para una rellamada. Puede ser: • never: deshabilita la posibilidad de recibir una rellamada • generic: activará el monitorep del llamado utilizando el sub-sistema basado en el DEVICE_STATE • native: cuando se utiliza el Draft para el sistema de rellamada (el teléfono del llamado lo soporta) • always: cuando no se sabe si el teléfono soporta el Draft. De esta forma Asterisk intentará utilizar el sistema nativo y si no funciona, el genérico Limita el numero de rellamadas activas para el llamante. Si cc_agent_policy=generic, este valor no será tomado en consideración. Valor: 5 Limita el numero de rellamadas que un dispositivo puede aceptar. Valor: 5

cc_max_agents

cc_max_monitors = 5

Para poder hacer una prueba se configurará en las extensiones 1000,1001 y 1002 solamente dos parámetros: • • cc_agent_policy=generic cc_monitor_policy=generic

Se abre el archivo sip.conf nano /etc/asterisk/sip.conf y al final del bloque de configuración de cada extensión se pone: cc_agent_policy=generic cc_monitor_policy=generic Se guardan los cambios. Como se va a utilizar el sistema genérico, en el dialplan hay que configurar una extensión para la aplicación CallCompletion y otra para la aplicación CallCompletionCancel

208

nano /etc/asterisk/extensions.conf en el contexto internas se añaden las siguientes lineas: exten => *30,1,CallCompletionRequest same => n,Agi(googletts.agi,"Rellamada activada",es) same => n,Hangup exten => *31,1,CallCompletionCancel same => n,Agi(googletts.agi,"Rellamada anulada",es) same => n,Hangup Se guardan los cambios y se recarga toda la configuración de Asterisk: service asterisk reload 11.2 CCSS 1ª Prueba Desde la extensión 1000 se llama la extensión 1001. Cuando esta esté timbrando, se rechaza la llamada:

A partir de ese momento, la extensión 1000 tendrá 20 segundos para solicitar la rellamada. Se puede ver, desde la consola de Asterisk, que la rellamada ha sido ofrecida por la extensión 1000 CLI> cc report status

Ahora para solicitarla desde la extensión 1000 se marca *30. CLI> cc report status

209

Siendo el tipo de solicitud CCNR, tendrá un tiempo de vigencia de 7200 segundo (dos horas), como indicado en ccnr_available_timer como valor predefinido. Para que la rellamada se efectúe, el sistema esperará que la extensión 1001 haga una llamada y de esta forma saber que ya está activa nuevamente. Para averiguarlo, desde la extensión 1001 se marca 150 (test de echo) y después de unos segundos de cuelga. Casi en seguida entrará una llamada a la extensión 1000:

Como se puede ver el CallerID es la misma extensión 1000 y esto indica que se trata de una rellamada. Cuando la extensión 1000 contesta se pueden presentar dos escenarios: • • la extensión 1001 no contesta nuevamente. La rellamada corriente se anula y la extensión 1001 ofrece nuevamente a la extensión 1000 la posibilidad de solicitar una rellamada. la extensión 1001 contesta. La rellamada solicitada se anula.

La extensión 1000 tiene 20 segundos para contestar la llamada entrante (valor predefinido del parámetro cc_recall_timer). Si no lo hace, la rellamada se considerará terminada. 11.3 CCSS 2ª Prueba Desde la extensión 1000 se llama la extensión 1001. La extensión 1001 rechaza la llamada. La extensión 1000 solicita la rellamada marcando *30. Después de unos minutos, decide que ya no la necesita. Marcando *31 la anula. Las distintas secuencias desde la consola de Asterisk:

210

Si la solicitud de CC es anulada, no se puede solicitar nuevamente. 11.4 CCSS 3ª Prueba Desde la extensión 1000 se llama la extensión 1001. La extensión 1001 contesta la llamada. Cuando la conversación termine, la extensión 1000, a pesar que la extensión 1001 ha contestado, podrá solicitar una rellamada. Este tipo de comportamiento tiene su lógica ya que el hecho que la llamada ha sido contestada, no significa que el llamante ha podido hablar con el llamado (como en este caso). Esto porque si en el dialplan se configura que si la extensión 1001 no contesta dentro de un tiempo, la llamada se pasa a un buzón de voz o a un IVR, realmente la extensión 1000 no ha podido hablar con la extensión 1001. Si se mira la consola, efectivamente la rellamada se está ofreciendo:

211

Consejos: 1. El sistema de rellamada consuma bastante recursos del sistema. Para limitar este consumo es buena practica: • configurar el parámetro cc_max_requests con un valor bajo • configurar el parámetro cc_offer_time con un valor bajo • En el sip.conf, por cada extensión, configurar el parámetro cc_agent_policy con never y activar el agente desde el dialplan utilizando la función CALLCOMPLETETION. Para el bloque de las llamadas entre extensiones seria algo como: exten => _100[0-2],1,Macro(disponible) same => n,Macro(calendario) same => n,Set(CALLCOMPLETION(cc_agent_policy)=generic) same => n,Dial(SIP/${EXTEN},45,hHkKtTwWxX) same => n,Hangup 2. la rellamada nativa funciona solamente si el paquete libxml2-devel ha sido instalado en el servidor Linux antes de compilar Asterisk. Esto porque el Draft se basa en un sistema de SUBSCRIBE, NOTIFY y PUBLISH donde el cuerpo del paquete SIP contiene la información en ese formato (XML).

212

Capitulo XII Asterisk Realtime
ARA (The Asterisk Realtime Architecture) es un método para almacenar los archivos de configuración de Asterisk y/o objetos en una base de datos. Existen dos tipos de Realtime: • • Estático Dinámico

12.1 Realtime estático Con el Realtime estático es posible guardar los archivos de configuración de Asterisk en una base de datos. Se dice estático porque cuando se hagan cambios en la base de datos, hay que recargar la configuración de Asterisk. Si las configuraciones se guardan en la base de datos, ya no se podrán utilizar los archivos de texto, es decir que si por ejemplo, se guarda la configuración del dialplan en Realtime estático, la PBX no leerá el archivo extensions.conf. El archivo donde se configura el Realtime estático es extconfig.conf y la sintaxis es: file.conf => driver,database[,table] • • • • file.conf: archivo de configuración que se quiere guardar en la base de datos driver: que motor de base de datos se va a utilizar (MySQL, ODBC, Postgres, SQLite3) database: el nombre de la base de datos table: el nombre de la tabla en la base de datos

Los únicos archivos de configuración que no se pueden guardar con el Realtime estático son: • • • asterisk.conf logger.conf extconfig.conf

Otros tres archivos se pueden guardar en la base de datos solamente si el modulo del motor que se va a utilizar se carga en el modules.conf antes de los demás módulos. Esto se hace con la declaración preload. Como se va a utilizar ODBC, la modifica que hay que hacer es: nano /etc/asterisk/modules.conf se buscan estas dos lineas: ;preload => res_odbc.so ;preload => res_config_odbc.so y se modifican para que queden:

preload => res_odbc.so preload => res_config_odbc.so Los dos módulos (que se utilizan para el Realtime con ODBC), se cargarán antes de los demás módulos y de esta formas se podrán guardar en Realtime también estos archivos: • • • manager.conf cdr.conf rtp.conf

¿Cual es el procedimiento para configurar el Realtime estático en Asterisk con ODBC? 1. 2. 3. 4. 5. Se crea una nueva base de datos Se crea la tabla para el Realtime estático Se configurar el conector ODBC Se configura el archivo de configuración de Asterisk res_odbc.conf Se configura el archivo extconfig.conf

Visto gráficamente sería:

Se inicia creado una nueva base de datos: mysql -u root -psesamo mysql> create database asterisk; Se otorgan los permisos de acceso a la base de datos creada al usuario asterisk, desde local: 215

mysql> GRANT ALL PRIVILEGES ON asterisk.* TO 'asterisk'@'localhost' IDENTIFIED BY 'sesamo'; desde remoto: mysql> GRANT ALL PRIVILEGES ON asterisk.* TO 'asterisk'@'%' IDENTIFIED BY 'sesamo'; se crea la tabla para el Realtime estático: mysql> use asterisk mysql> CREATE TABLE `ast_config` ( `id` int(11) NOT NULL auto_increment, `cat_metric` int(11) NOT NULL default '0', `var_metric` int(11) NOT NULL default '0', `filename` varchar(128) NOT NULL default '', `category` varchar(128) NOT NULL default 'default', `var_name` varchar(128) NOT NULL default '', `var_val` varchar(128) NOT NULL default '', `commented` int(11) NOT NULL default '0', PRIMARY KEY (`id`), KEY `filename_comment` (`filename`,`commented`) ); El nombre de la tabla es totalmente arbitrario y se puede personalizar para volverlo más amigable. Una explicación de los parámetros que aparecen en la tabla: • • • • • • • • ID – es un numero progresivo que se crea automáticamente cat_metric – el peso de la categoría o bloque dentro del archivo. Un valor bajo significa que la categoría aparecerá más arriba en el archivo de configuración var_metric – el peso de un objeto o parámetro dentro de la categoría. Un valor bajo significa que el objeto aparecerá más arriba en la categoría filename – el nombre del archivo de configuración de Asterisk que se quiere guardar en la base de datos category – la categoría o bloque del archivo de configuración var_name – el nombre del objeto o del parámetro que se está configurando var_val – el valor del objeto o parámetro commented – si es cualquier valor diferente a cero, la entrada en la base de datos aparecerá como comentada.

Para entender mejor como funciona, se guardará el archivo musiconhold.conf en Realtime estático. mysql> INSERT INTO ast_config (cat_metric,var_metric,filename,category,var_name,var_val) VALUES ('0','0','musiconhold.conf','default','mode','files'); 216

En el segundo se configuran las base de datos.'musiconhold.'mp3'.'yes').var_metric.'2'.var_val) VALUES ('1'.'directory'. Con esta segunda linea se define que la carpeta que contiene los archivos audio para la clase default es /var/lib/asterisk/moh mysql> INSERT INTO ast_config (cat_metric.ini odbc.'mp3'.var_val) VALUES ('1'.'yes').ini 217 .var_name.var_val) VALUES ('0'.'/var/lib/asterisk/moh'). Con esta segunda linea se define que la carpeta que contiene los archivos audio para la clase mp3 es /var/lib/asterisk/mohmp3 mysql> INSERT INTO ast_config (cat_metric.filename.var_val) VALUES ('1'.'default'.'1'.category.filename.'directory'.'/var/lib/asterisk/mohmp3').'mp3'.ini En el primero se configuran las conexiones ODBC → librerías base de datos.filename.'files'). mysql> INSERT INTO ast_config (cat_metric.'1'.var_name.var_name.category.'musiconhold.'mode'. Se repiten las tres lineas para la música de espera MP3 (como se había configurado en el párrafo 2. mysql> INSERT INTO ast_config (cat_metric.category.'random'.filename.'random'.var_metric.'musiconhold.'2'.'musiconhold.conf'.'default'.filename.var_name. Para iniciar se borra el archivo predefinido odbcinst. En la ultima linea se define que los archivos audio de la música de espera de la clase default se reproducirán aleatoriamente.conf'.'0'. se configura el conector ODBC.5): mysql> INSERT INTO ast_config (cat_metric.conf'.var_metric.category. Como se puede notar en esta primera linea el cat_metric es 1 e indica que estamos creando un segundo bloque en el archivo de configuración.var_name. En la ultima linea se define que los archivos audio de la música de espera de la clase mp3 se reproducirán aleatoriamente.'musiconhold.var_metric. Esto se hace en dos archivos de configuración: • • odbcinst.var_metric.Con esta primera linea se crea la clase default y se define que el modo es files. Se sale del cliente MySQL: mysql> quit Creada la base de datos y la tabla.conf'.var_val) VALUES ('0'.category.conf'.

Para probar la conexión entre ODBC y la base de datos asterisk se usa el comando: isql asterisk asterisk sesamo • • asterisk – etiqueta que da inicio al bloque configurado en odbc.so FileUsage = 1 Para una versión 64 bit de CentOS sería: [MySQL] Description = ODBC para MySQL Driver = /usr/lib64/libmyodbc3.rm /etc/odbcinst.ini y para ODBC → MySQL se ponen las siguientes lineas: [MySQL] Description = ODBC para MySQL Driver = /usr/lib/libmyodbc3.so Setup = /usr/lib/libodbcmyS.ini asterisk – nombre del usuario que tiene acceso a la base de datos creada 218 .ini se copian las siguientes lineas que crean una conexión a la base de datos MySQL asterisk: [asterisk] Description = MySQL Asterisk Driver = MySQL Database = asterisk Server = localhost User = asterisk Password = sesamo Port = 3306 Option = 3 Se guardan los cambios.so Setup = /usr/lib64/libodbcmyS.ini nano /etc/odbc.ini se crea uno nuevo: nano /etc/odbcinst.so FileUsage = 1 Se continua con odbc.

ini Se guardan los cambios y se modifica el ultimo archivo: nano /etc/asterisk/extconfig.conf /etc/asterisk/res_odbc.ast_config 219 .asterisk.conf después de esta linea: .• sesamo – la contraseña del usuario asterisk creado en MySQL El resultado: +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ La conexión entre ODBC y la base de datos MySQL asterisk funciona perfectamente.conf.old nano /etc/asterisk/res_odbc.conf. El valor asterisk es el que se ha configurado en el bloque que se acaba de crear en el archivo odbc.conf Se copian las siguientes lineas: [ENV] [asterisk] enabled => yes dsn => asterisk username => asterisk password => sesamo pre-connect => yes sanitysql => select 1 idlecheck => 3600 connect_timeout => 10 La linea más importante es dsn => asterisk. Se renombra el archivo predefinido y se crea uno nuevo: mv /etc/asterisk/res_odbc.conf => sqlite. Para salir: SQL> quit El siguiente paso es configurar res_odbc.extensions.

conf.conf /etc/asterisk/musiconhold.ini res_odbc.conf extconfig. El nombre asterisk que aparece en la linea se refiere al nombre de la etiqueta con que inicia la configuración de la conexión en res_odbc.conf Ahora que se ha configurado la música de espera en Realtime se renombra el archivo de texto: mv /etc/asterisk/musiconhold. Gráficamente: odbc.conf => odbc.conf.asterisk.se pone: musiconhold.old Se reinicia Asterisk: service asterisk restart Se entra en la consola: asterisk -rvvvvvvvvvvvvvv se averigua que la conexión en Realtime esté activa (desde el lado Asterisk): CLI> odbc show all ODBC DSN Settings ----------------Name: asterisk DSN: asterisk Last connection attempt: 1969-12-31 19:00:00 Pooled: No 220 .ast_config Se guardan los cambios.

buzones de voz. es la creación de la tabla donde almacenar los parámetros de las extensiones SIP. Desde la extensión 1000 se marca el numero 200 para probar la música de espera MP3 en Realtime. Una tabla base debe contener por lo menos estos parámetro: • • • • • • • • • • • • • type name secret context host ipaddr port regseconds defaultuser fulcontact regserver useragent lastms 221 .2 Realtime Dinamico El Realtime dinámico permite guardar objetos en una base de datos. Ejemplo: se pueden configurar las extensiones en el sip. Estos objetos pueden ser: extensiones. etc. colas de espera.Connected: Yes se mira la configuración de la música de espera: CLI> moh show classes Class: default Mode: files Directory: /var/lib/asterisk/moh Class: mp3 Mode: files Directory: /var/lib/asterisk/mohmp3 Parece que todo está bien. Asterisk actualizará la configuración en tiempo real. A diferencia del Realtime estático. Algunos campos de la tabla son opcionales mientras otros son obligatorios.1 Extensiones SIP en Realtime La parte más complicada de la configuración de SIP en Realtime. Cuando se hace un cambio en la base de datos.conf y al mismo tiempo en la base de datos.2. 12. agentes. 12. Al recargar la configuración SIP. los objetos creados en la base de datos “conviven” con los presentes en los archivos de configuración. funcionarán ambas.

175.Para crear una tabla más completa.38 EC mode : FEC T. : subscribe Language : es Accountcode : 1000 AMA flags : Unknown Transfer mode: open CallingPres : Presentation Allowed. Not Screened Callgroup : 1 Pickupgroup : 1 Mailbox : 1000@default VM Extension : asterisk LastMsgsSent : 32767/65535 Call limit : 2147483647 Dynamic : Yes Callerid : "callerid=Fulano" <1000> MaxCallBR : 384 kbps Expire : 2917 Insecure : no Nat : Always ACL : No T.38 MaxDtgrm: 400 DirectMedia : No PromiscRedir : No User=Phone : No Video Support: Yes Text Support : No Ign SDP ver : No Trust RPID : No Send RPID : Yes Subscriptions: Yes Overlap dial : Yes Forward Loop : Yes DTMFmode : rfc2833 Timer T1 : 500 Timer B : 32000 ToHost : Addr->IP : 190.38 support : Yes T.156 Port 22840 222 .Cont.253. se puede tomar como referencia el resultado de este comando: CLI> sip show peer 1000 * Name : 1000 Secret : <Set> MD5Secret : <Not set> Remote Secret: <Not set> Context : externas Subscr.

CLI> quit Para empezar se crea la tabla en la base de datos asterisk: mysql -u root -psesamo mysql> use asterisk mysql> CREATE TABLE `sipexten` ( `name` varchar(40) NOT NULL default ' '.Defaddr->IP : 0. `secret` varchar(40) default NULL. `fromuser` varchar(40) default NULL. `md5secret` varchar(40) default NULL.rinstance=3201f90c0a78b7d0 Qualify Freq : 60000 ms Sess-Timers : Accept Sess-Refresh : uas Sess-Expires : 1800 secs Min-Sess : 90 secs Parkinglot : Todos los parámetros que aparecen en la lista. Contact : sip:1000@190.156:22840. `type` varchar(10) NOT NULL default ' '. `mailbox` varchar(20) default NULL. `cid_number` varchar(40) default NULL.ulaw:20.253.0. se pueden configurar en la tabla.0.175. `callingpres` varchar(20) default NULL. `vmexten` varchar(20) default NULL. `usereqphone` varchar(10) default NULL. : UDP Allowed. Username: 1000 SIP Options : replaces replace Codecs : 0x8010c (ulaw|alaw|g729|h263) Codec Order : (alaw:20.g729:20) Auto-Framing : No 100 on REG : Yes Status : OK (129 ms) Useragent : Reg.Transp. `callerid` varchar(40) default NULL. `defaultuser` varchar(40) default NULL. `subscribemwi` varchar(10) default NULL. `fromdomain` varchar(40) default NULL.Trsp : UDP Def.0 Port 5060 Prim. `auth` varchar(10) default NULL. `remotesecret` varchar(40) default NULL. `language` varchar(10) default NULL. 223 .

`context` varchar(40) NOT NULL default ' '. `amaflags` varchar(20) default NULL. `ipaddr` varchar(45) NOT NULL default ' '. `port` int(6) NOT NULL default '0'.01 sec) Se sale del cliente MySQL mysql> quit Bye En este caso como la base de datos es la misma del Realtime estático. `qualify` varchar(15) default NULL.ini. `fullcontact` varchar(60) default NULL. `lastms` int(11) NOT NULL default '-1'. `useragent` varchar(40) default NULL. `pickupgroup` varchar(20) default NULL. `maxcallbitrate` varchar(15) default NULL. `accountcode` varchar(20) default NULL. `insecure` varchar(20) default NULL.0'. 0 rows affected (0. `callgroup` varchar(20) default NULL. `Deny` varchar(31) default ''. `autoframing` varchar(10) default NULL. KEY `host` (`host`. ni el res_odbc.conf nano /etc/asterisk/extconfig. `regserver` varchar(20) default NULL. `regexten` varchar(20) default NULL.`port`). `nat` varchar(3) NOT NULL. `host` varchar(40) default 'dynamic'. El único archivo que hay que modificar es el extconfig. `allowtransfer` varchar(20) default NULL.0. `allow` varchar(20) default NULL. `Directmedia` varchar(3) default 'no'. KEY `ipaddr` (`ipaddr`. `setvar` varchar(200) default NULL. `outboundproxy` varchar(40) default NULL.ini. `rtptimeout` varchar(15) default NULL. `Permit` varchar(31) default NULL. no hay que modificar ni el odbc. `subscribecontext` varchar(40) default NULL.conf 224 . `regseconds` int(11) NOT NULL default '0'.`port`) ). Query OK. `rtpholdtimeout` varchar(15) default NULL.0. PRIMARY KEY (`name`). `disallow` varchar(20) default 'all'. `defaultip` varchar(20) NOT NULL default '0. `rtpkeepalive` varchar(15) default NULL.

.580/webmin-1.sipexten Se guardan los cambios y se actualiza la configuración de Asterisk: /etc/init. Antes de entrar en la pagina de administración de Webmin hay que abrir el puerto 10000 en el firewall: nano /etc/sysconfig/iptables Después de esta linea: -A INPUT -p udp -m udp --dport 10000:20000 -j ACCEPT se pone: # Webmin -A INPUT -p tcp -m state --state NEW -m tcp --dport 10000 -j ACCEPT 225 .d/asterisk reload Ahora se puede configurar la primera extensión SIP en Realtime. ########################################### [100%] Operating system is CentOS Linux 1:webmin ########################################### [100%] Webmin install complete.sippeers => odbc.asterisk para que queden: sippeers => odbc.asterisk.noarch.rpm y se instala rpm -ivh webmin-1. se pueden utilizar distintos programas.570-1.. entre otros: webmin e phpadmin.580-1.noarch.sourceforge. Para volver más sencillo el trabajo con las bases de datos.noarch. Se instalan unas dependencias (para conexiones seguras): yum install perl-Net-SSLeay Se descarga el paquete: cd /usr/src wget http://downloads.rpm: Header V3 DSA signature: NOKEY.580-1. En este caso se ha optado por Webmin.rpm warning: webmin-1. key ID 11f63c51 Preparing.Se modifican esta linea: .net/project/webadmin/webmin/1.

Se guardan los cambios y se reinicia iptables: service iptables restart Ahora desde un navegador Web se pone la dirección para entrar en Webmin. Se puede empezar a crear la primera extensión en Realtime: 226 . en la derecha se escoge el menú “Servers” y luego “MySQL Database Server”: En Login se pone root (el usuario MySQL) y como contraseña sesamo: Se selecciona la base de datos Asterisk y luego la tabla Sipexten. Al fondo de la nueva pagina se presiona el botón “View Data” y luego “Add Row”. Si es un servidor Linode se pone el nombre de dominio del Linode sino la IP: https://IPservidor:10000 En Username se pone root y en Password la contraseña del usuario root de Linux. En la pagina que aparece.

227 .

228 .

2 Extensiones IAX en Realtime La configuración de las extensiones IAX en realtime es bastante similar a la que se ha mostrado para las extensiones SIP. 12.2.conf y conocer su estado hay que modificar dos parámetros: • • qualify=yes en la configuración de la extensión rtcachefriends=yes en la parte general del archivo sip. Si desde la consola de Asterisk se escribe el comando: asterisk -rvvvvvvvvvvvv CLI> sip show peers la nueva extensión configurada no aparecerá. Primero hay que crear la tabla 229 .conf Se recarga la configuració sip: CLI> sip reload y se mira si aparece: CLI> sip show peers like 1004 En la columna Realtime aparece “Cached RT” que significa que la extensión está configurada en Realtime y que se activó el parámetro rtcachefriends. Para ver la configuración de la nueva extensión hay que utilizar el siguiente comando: CLI> sip show peer 1004 load Para la parte user: CLI> sip show user 1004 load Se configura el X-lite para conectarse a la extensión 1004.Al terminar se presiona el botón "Save". En la consola de Asterisk aparecerá: Si se quiere ver el estado de la extensión en la consola de Asterisk como si fuera configurada en el archivo sip. Desde la extensión 1004 se marca 123 para probarla.

`qualifyfreqnotok` varchar(10) NULL. `allow` varchar(40) NULL. `sendani` varchar(10) NULL. `port` int(5) NULL. `host` varchar(40) NULL default 'dynamic'. `mask` varchar(20) NULL. `dbsecret` varchar(40) NULL. `cid_number` varchar(40) NULL. `mailbox` varchar(40) NULL. `inkeys` varchar(40) NULL. `language` varchar(10) NULL. `outkey` varchar(40) NULL. `codecpriority` varchar(40) NULL. `callerid` varchar(100) NULL. `mohsuggest` varchar(20) NULL. `transfer` varchar(10) NULL. `auth` varchar(20) NULL. `encryption` varchar(20) NULL. `mohinterpret` varchar(20) NULL. `secret` varchar(40) NULL. `forcejitterbuffer` varchar(3) NULL. `ipaddr` varchar(20) NULL. 230 . `regcontext` varchar(40) NULL. `qualifyfreqok` varchar(10) NULL. `jitterbuffer` varchar(3) NULL. `trunk` varchar(3) NULL. `disallow` varchar(40) NULL. `accountcode` varchar(20) NULL. `qualify` varchar(10) NULL. `fullname` varchar(40) NULL. `qualifysmoothing` varchar(10) NULL.mysql -u root -psesamo mysql> use asterisk mysql> CREATE TABLE `iaxexten` ( `name` varchar(40) NOT NULL default ''. `requirecalltoken` varchar(4) NULL. `type` varchar(10) NOT NULL default 'friend'. `context` varchar(40) NULL. `sourceaddress` varchar(20) NULL. `defaultip` varchar(20) NULL. `maxauthreq` varchar(5) NULL. `regexten` varchar(40) NULL. `regseconds` int(11) NULL. `username` varchar(40) NULL.

asterisk.asterisk . INDEX ipaddr (ipaddr.conf se cambian estas dos lineas: .conf: nano /etc/asterisk/extconfig.iaxusers => odbc. `adsi` varchar(10) NULL. `setvar` varchar(200) NULL. mysql> quit Luego se modifica el archivo extconfig. INDEX host (host.iaxexten se guarda la configuración y se crea una extensión IAX en Realtime desde Webmin entrando en la tabla iaxexten: 231 .`timezone` varchar(20) NULL.asterisk. INDEX name (name.asterisk para que queden: iaxusers => odbc. port) ). PRIMARY KEY (`name`). port). ipaddr. host). port). INDEX name2 (name. `amaflags` varchar(20) NULL.iaxpeers => odbc.iaxexten iaxpeers => odbc.

232 .

conf: nano /etc/asterisk/iax.Al terminar se presiona el botón “Save”. Como para el protocolo SIP se cambia el parámetro rtcachefriends en el iax.conf rtcachefriends=no para que quede: rtcachefriends=yes Se guarda la configuración y se actualiza Asterisk: service asterisk reload En el cliente Zoiper se configura el usuario marko2 y se mira en la consola de Asterisk si está registrado: asterisk -rvvvvvvvvvvvvvv CLI> iax2 show peers Para terminar hay que modificar el dialplan para que se pueda marcar a la extensiones creadas en Realtime: 233 .

hint.Dial(SIP/${EXTEN}. está el dialplan.Macro(disponible) same => n.Dial(IAX2/marko2.Macro(calendario) same => n.CLI> quit nano /etc/asterisk/extensions.conf Se modifica este bloque: exten => _100[0-2].Hangup para terminar en el contexto subscribe se añade: exten => 1004.hint.1.3 Dialplan en Realtime dinamico Entre los objetos que se pueden guardar en Realtime dinámico.SIP/1004 exten => marko2.2.Macro(disponible) same => n.30) same => n.hHkKtTwWxX) same => n.Hangup siempre en el contexto internas se pone: exten => 1235.1.Dial(SIP/${EXTEN}.1.4].hHkKtTwWxX) same => n. Para iniciar se crea la tabla para guardar el dialplan en la base de datos: mysql -u root -psesamo mysql> use asterisk mysql> CREATE TABLE `dialplan` ( 234 . Esta puede ser una optima solución cuando se quieren compartir partes de dialplan entre distintos servidores Asterisk o cuando se quiere tener el motor de la base de datos en otro servidor.45.Hangup para que quede: exten => _100[0-2.IAX2/marko2 Se guarda los cambios y se recarga el dialplan: asterisk -rx "dialplan reload" 10.Macro(calendario) same => n.45. De esta forma se pueden crear distintos dialplan para distintos servidores Asterisk conectados en Realtime a la base de datos.

priority.priority. mysql> INSERT INTO dialplan (context.conf Se busca esta linea: .'Playback'. `priority` tinyint(4) NOT NULL default '0'. `context` varchar(20) NOT NULL default ''. el resultado será: mysql> select * from dialplan. `app` varchar(20) NOT NULL default ''.dialplan 235 .`id` int(11) NOT NULL auto_increment.asterisk y se modifica para que quede: extensions => odbc.exten. `exten` varchar(20) NOT NULL default ''.`exten`.'1'.app. mysql> INSERT INTO dialplan (context.asterisk.'0').'70'.'Hangup'.'3'.exten. Se sale del cliente MySQL y se modifica el archivo extconfig.app.'demo-congrats').exten.'2'.appdata) VALUES ('test'.app.`priority`). `appdata` varchar(128) NOT NULL default ''. PRIMARY KEY (`context`.extensions => odbc.'Answer'. KEY `id` (`id`) ).priority.conf: mysql> quit nano /etc/asterisk/extconfig.'70'.appdata) VALUES ('test'.appdata) VALUES ('test'.'70'. ahora se crea una extensión muy sencilla en la tabla: mysql> INSERT INTO dialplan (context.'0').

236 .conf Antes del contexto internas se añade este bloque que configura Asterisk para que busque el contexto test en la base de datos: [test] switch => Realtime y se añade las lineas en negrita en los dos bloques que siguen: [externas] include => internas include => internacio include => parkedcalls include => test [locales] include => internas include => auten include => parkedcalls include => test De esta forma las extensiones que tengan acceso al contexto externas o locales. Se guardan los cambios y se reinicia Asterisk: service asterisk restart Desde la extensión 1000 se marca el numero 70 y se prueba el nuevo contexto creado en Realtime.Se guardan los cambios y se pasa al dialplan nano /etc/asterisk/extensions. tendrán acceso también al contexto test.

.

'1237'). nombre Se crea la tabla en la base de datos Asterisk: mysql -u root -psesamo mysql> use asterisk mysql> CREATE TABLE `empleados` ( `id` int(11) NOT NULL auto_increment.'1235').('perengano'. PRIMARY KEY (`nombre`).'1234'). .matricula) VALUES ('fulano'. Al mismo tiempo es posible actualizar o modificar entradas de la base de datos. se ilustrarán dos diferentes escenarios: • • Buscar el nombre de un empleado en base a su numero de matricula Guardar los resultados de una encuesta telefónica en una base de datos 13.conf La función func_odbc permite hacer consultas en base de datos directamente desde el dialplan.Capitulo XIII IVR avanzados – func_odbc. numero de matricula 2. `matricula` int(4) NOT NULL. el resultado: mysql> select * from empleados. El archivo que se utiliza para este tipo de configuración es el func_odbc. ('zutano'.'1236').1 Empleados La tabla de los empleados contendrá solamente dos campos: 1. En este modulo. KEY `id` (`id`) ). `nombre` varchar(20) NOT NULL.conf.('mengano'. Se añaden a la tablas cuatro empleados: mysql> INSERT INTO empleados (nombre.

so => (Simple Festival Interface) CLI> quit Festival viene con el inglés como idioma predefinido.conf /etc/asterisk/func_odbc.conf': == Found == Registered application 'Festival' Loaded app_festival. Primero se renombra el predefinido: mv /etc/asterisk/func_odbc.so CLI> module load app_festival.ini para la base de datos asterisk readsql=SELECT nombre FROM empleados WHERE matricula='${SQL_ESC(${ARG1})}' – la sentencia SQL para hacer consultas en la base de datos asterisk (en este caso la tabla empleados) Para interactuar con el usuario que llame para consultar la base de datos. en este caso Festival.so == Parsing '/etc/asterisk/festival.conf.conf. Lo único que hace falta es configurarlo.conf y se copian las siguientes lineas: [Empleados] dsn=asterisk readsql=SELECT nombre FROM empleados WHERE matricula='${SQL_ESC(${ARG1})}' • • • [Empleados] – El nombre de la función que se está creando dsn – el nombre de la etiqueta definida al inicio del bloque configurado en el archivo odbc. En Asterisk hay un modulo dedicado a la conexión con un servidor Festival.Ahora se crea el archivo func_odbc. Para configurarlo para el español se siguen estos 239 .old se crea el nuevo nano /etc/asterisk/func_odbc. Primero se averigua si le modulo está compilado y funcionando: asterisk -rvvvvvvvvvvvvvvv CLI> module unload app_festival. se utilizará otro sistema de TTS (text to Speech).

synth (eval (list 'Utterance 'Text string))))) (utt.rescale wholeutt 5) (utt.zip unzip festival-spanish.scm se añaden estas líneas antes de la ultima linea del archivo .conf.voztovoice.org/tmp/festival-spanish." (let ((wholeutt (utt. This function name may be added to the server safe functions.conf /etc/asterisk/festival.pasos: cd /usr/share/festival/voices wget http://www.d/asterisk reload Para arrancar el servidor Festival en automático: nano /etc/rc.resample wholeutt 8000) (utt.local 240 .wave. This function is specifically designed for use in server mode so a single function call may synthesize the string.(language__spanish) (set! voice_default 'voice_el_diphone) (define (tts_textasterisk string mode) "(tts_textasterisk STRING MODE) Apply tts to STRING.conf estas son la líneas que hay que añadir: [general] host=localhost port=1314 festivalcommand=(tts_textasterisk "%s" 'file)(quit)\n Se guardan las modificaciones. Se actualiza la configuración de Asterisk: /etc/init.send.old nano /etc/asterisk/festival.client wholeutt))) Se guardan los cambios y se modifica el archivo de configuración de festival en Asterisk: mv /etc/asterisk/festival.wave.zip Ahora se modifica el archivo de configuración de festival nano /usr/share/festival/festival.wave.

Wait(2) same => n.Answer same => n.Answer() same => n.0 0./festival_server. CLI> quit Terminada la configuración y la prueba de Festival se construye el dialplan para hacer consultas a la tabla empleados: nano /etc/asterisk/extensions.beep.Festival(Asterisk y Festival trabajan junto.al final del archivo se añade esta linea: /usr/bin/festival_server > /dev/null & Se inicia el servidor festival.conf en el contexto internas se pone: exten => 660.Hangup() Se actualiza el dialplan desde la consola asterisk -rvvvvvvvvvvvvvvvvv CLI> dialplan reload Desde la extensión 1000 se marca la extensión 650 para escuchar la frase que se acaba de configurar en el dialplan. /usr/bin/festival_server > /dev/null & Se controla que esté corriendo: ps aux | grep festival root 24071 0.1.1.) same => n.1 4028 688 pts/1 S+ 13:36 0:00 grep festival Se modifica el Dialplan para crear una extensión que permita hacer una prueba del servidor Festival: nano /etc/asterisk/extensions.4 3.Festival(Por favor ingrese los 4 digitos de la matricula del empleado.4) 241 .6 23464 19324 pts/1 S 13:36 0:00 festival --server .Read(EMPNUM. Chevere!!!) same => n.2 4600 1096 pts/1 S 13:36 0:00 /bin/sh /usr/bin/festival_server root 24077 0.conf en el contexto internas se pone: exten => 650.scm root 24081 0.0 0.

Desde la lógica de MySQL sería: select nombre from empleados where matricula='$ {EMPNUM}'. se anuncia al llamante el nombre del empleado Linea10 – se termina la llamada • • • • • Se guardan los cambios y se recarga el dialplan: asterisk -rvvvvvvvvvvvvvvvvvvvvvvvv CLI> dialplan reload Desde la extensión 1000 se marca 660 y se hacen diferentes pruebas. "2") in new stack -. "Por favor ingrese los 4 digitos de la matricula del empleado. "EMPNUM.Executing [660@externas:4] Read("SIP/1000-00000010".Executing [660@externas:6] GotoIf("SIP/1000-00000010".") in new stack == Parsing '/etc/asterisk/festival. "EMPNAME=fulano") in new stack -.9) 242 .) same => n. Hasta luego.Hangup Una explicación de las lineas: • • • • • Linea1 – se contesta la llamada Linea2 – se esperan dos segundos Linea3 – Se usa Festival para leer el texto y enviarlo como audio Linea 4 – Con la aplicación Read se espera que el llamante digite 4 números y se guardan en la variable EMPNUM Linea 5 – Se hace la consulta en la tabla Empleados como configurado en el archivo func_odbc.4") in new stack -.Executing [660@externas:2] Wait("SIP/1000-00000010".GotoIf($[${EXISTS(${EMPNAME})}]?nombre) same => n. Linea6 – Si la consulta devuelve un valor se va a la etiqueta (nombre).beep.660. -.Executing [660@externas:5] Set("SIP/1000-00000010". si la consulta no devuelve ningún valor se continua en el dialplan (la función EXIST permite averiguar si una determinada variable contiene un valor o está vacía) Linea7 – En el caso la consulta no haya tenido éxito. se anuncia al llamante que no se ha encontrado ningún empleado que tenga ese numero de matricula Linea8 – se termina la llamada Linea9 – Si la consulta ha tenido éxito.) same => n.<SIP/1000-00000010> Playing 'beep. En la consola: Executing [660@externas:1] Answer("SIP/1000-00000010".Accepting a maximum of 4 digits.Festival(El nombre del empleado es ${EMPNAME}. "") in new stack -.same => n.Festival(Ningun empleado encontrado.Goto (externas.alaw' (language 'es') -.Set(EMPNAME=${ODBC_Empleados(${EMPNUM})}) same => n. "1?nombre") in new stack -.User entered '1234' -.Hangup same => n(nombre).conf': == Found -. Hasta luego.Executing [660@externas:3] Festival("SIP/1000-00000010".

"") in new stack == Spawn extension (externas.2 Encuesta Se quiere suministrar una encuesta a los clientes de la empresa para medir el grado de satisfacción de los mismos.resp3. `resp4` int(1) default NULL.Executing [660@externas:9] Festival("SIP/1000-00000010".-. Los pasos a seguir son: • • • crear la tabla para la encuesta crear un nuevo bloque en el archivo func_odbc.conf al final del archivo se añade el siguiente bloque: [Encuesta] dsn=asterisk writesql=insert into encuesta (Fecha.resp1.") in new stack == Parsing '/etc/asterisk/festival. `resp2` int(1) default NULL."$ 243 . PRIMARY KEY (`id`) ). 10) exited non-zero on 'SIP/1000-00000010' 13. se utilizará Festival.conf crear un nuevo bloque de dialplan Se inicia creando la tabla: mysql -u root -psesamo mysql> use asterisk mysql> CREATE TABLE `encuesta` ( `id` bigint(20) NOT NULL auto_increment.resp2. Las preguntas se pueden pregrabar o.conf': == Found -. `fecha` datetime default NULL. 660.Executing [660@externas:10] Hangup("SIP/1000-00000010". La encuesta está compuesta por 4 preguntas.resp4) values ("${SQL_ESC(${VAL1})}". `resp3` int(1) default NULL. se sale del cliente mysql: mysql> quit se abre el archivo func_odbc. `resp1` int(1) default NULL. "El nombre del empleado es fulano. como en este caso. Hasta luego.conf nano /etc/asterisk/func_odbc.

${var1}.Hangup y después del contexto internas se pone el siguiente bloque: [encuesta] exten => s. Para ver los resultados: mysql -u root -psesamo mysql> use asterisk 244 .Goto(encuesta.Wait(2) same => n.Read(var2.s..1.1.... Para terminar se modifica el dialplan: nano /etc/asterisk/extensions."${SQL_ESC(${VAL3})}"...1.10) same => n.conf en el contexto internas se pone: exten => 670.Read(var4.Festival(Pregunta uno) same => n. Se guardan los dígitos en 4 variables distintas y al terminar la encuesta se guardan los resultados en la tabla encuesta a través de la función ODBC_Encuesta que se acaba de crear en el archivo func_odbc.${var4}) same => n.1.Festival(Pregunta dos) same => n.conf.10) same => n.. Se repite la operación 3-4 veces. Se guardan las modificaciones y se actualiza Asterisk: service asterisk reload Desde unas de las extensiones conectadas a Asterisk se marca el 670 y se contestan las preguntas..1."${SQL_ESC(${VAL4})}"..{SQL_ESC(${VAL2})}".Hangup El bloque de dialplan es bastante comprensible.1.Read(var3.Playback(thank-you-cooperation) same => n. Se presentan las cuatros preguntas.Set(ODBC_Encuesta()=${STRFTIME(${EPOCH}."${SQL_ESC($ {VAL5})}") IMPORTANTE: El contenido de la sentencia writesql tiene que estar en la misma linea.%y%m%d%H%M%S)}.${var3}.Answer same => n.Read(var1.Festival(Pregunta tres) same => n.${var2}.10) same => n.10) same => n.Festival(Pregunta cuatro) same => n.1) same => n.

Los resultados aparecen ordenados por ID y fecha. 245 .mysql> select * from encuesta.

.

Si se recibe una llamada y no se contesta o la línea está ocupada. Valor 100 Numero máximo de segundos que puede durar un mensaje de voz. Valor buzondevoz@dominio.com Personalizar yes = se anexa al correo electrónico el archivo audio que contiene el mensaje de voz.1 voicemail. crear distintos grupos de buzones de voz (distintas empresa) y configurar distintas zonas horarias. la configuración completa del archivo. Anexo al correo electrónico es posible enviar el mensaje de voz en distintos formatos audio. Valor 500 Numero mínimo de segundos para que un mensaje de voz sea reconocido como tal y enviado al buzón de voz del destinatario. A través de la configuración de este archivo es posible. Valor 3000 Descripción attach maxmsg maxsecs minsecs maxgreet skipms .conf es donde se configura todo lo relacionado con el buzón de voz.linode. 14. Numero máximo de mensajes de voz guardados para cada buzón de voz. en segundos. Se expresa en mili segundos. Un ejemplo para Linode: buzondevoz@li370-135.com. del mensaje de bienvenida que cada propietario de un buzón de voz puede grabar para presentarse. Al final de la tabla. se puede usar el teclado numérico del teléfono para adelantar o devolver el mensaje.Capitulo XIV Buzón de voz – voicemail. Valor 5 Duración máxima. entrará en función el buzón de voz.conf Como por lo demás archivos de configuración. Valor 180 Cuando se escuchan los mensaje de voz. en la tabla a seguir se indicarán los parámetros que se van a configurar con una breve descripción.conf En el archivo voicemail. Parámetro [general] format serveremail Inicia la parte general Los formatos audio en que se grabará cada mensaje de voz. Valor wav49|gsm|wav Correo electrónico del remitente en la notificaciones de la presencia de un nuevo mensaje de voz. grabará el mensaje de voz dejado por quien llama y enviará una notificación por correo electrónico al llamado.members. siempre y cuando se configure el dialplan oportunamente. En negrita los valores de cada parámetro. además.

se mueven a la carpeta OLD (viejos) en automático. es posible ejecutar un script externo. Valor no si se quiere ejecutar una aplicación cada vez que llega un nuevo mensaje de voz. Valor 4 Tienes que ser un valor menor del parámetro minsecs El numero indicado en este parámetro indica el nivel de ruido y sirve para definir que se considera silencio. Más bajo el número. Valor Buzón de Voz yes = los mensajes de voz que se reciben se pueden reenviar a otros usuarios/extensiones del servidor Asterisk. si el parámetro anterior se ha configurado. mailbox y nueva contraseña se pasarán al script. Valor ISO-8859-1 yes = quita la sigla [PBX] en el asunto de los correos electrónicos Nombre del remitente del los correos electrónicos. se termina la grabación. También se pueden dejar directamente mensajes de voz a otros buzones. este no será tomado en cuenta. las variables contexto.odbcstorage .externpassnotify=/usr/bin/myapp directoryintro charset pbxskip fromstring usedirectory . Valor 3 yes = una vez escuchados los nuevos mensajes de voz. si se configura en no. Se deja comentado Cada vez que se cambie la contraseña de un buzón de voz y se configure el nombre de un script en este parámetro.externnotify=/usr/bin/myapp . Se deja comentado cada vez que se cambie la contraseña de un buzón de voz. Se explicará más adelante. Este parámetro permite buscar en el directorio la persona a la que se quiere dejar o reenviar el mensaje de voz Se pueden guardar los mensajes de voz en un base de datos 248 silencethreshold maxlogins moveheard forward_urgent_auto . Valor 128 Numero máximo de intentos para marcar la clave asociada al buzón de voz personal.Parámetro maxsilence Descripción Si mientras se deja un mensaje en el buzón de voz hay un silencio mayor al numero de segundos indicados en este parámetro.externpass=/usr/bin/myapp . más sensible al ruido. hay que definirla en este parámetro. La locución de introducción de la aplicación directory. Valor dir-intro El estándar ISO para los correo electrónicos que se enviarán para notificar la llegada de un nuevo mensaje de voz. hay que hacerlo desde el menú del buzón de voz yes = cada mensaje de voz reenviado se considerará urgente.

Tiene que estar todo en la misma linea. En este parámetro se define el nombre de la base de datos. Valor wav yes = antes de escuchar el mensaje de voz se anuncia el CallerID del llamante nombre del contexto del dialplan donde buscar el contexto de los buzones de voz para anunciar en lugar del numero de extensión el nombre de la persona que dejó el mensaje. Valor. Valor: mensajes (se deja comentado) Asunto del correo electrónico de notificación. Gracias!\n\n\t\t\t\t. Desde la versión 1.iso88591 yes = se envían los nuevos mensajes de voz anexos al correo electrónico de notificación. Nuevo mensaje de voz ${VM_MSGNUM} en el buzon de voz $ {VM_MAILBOX} Contenido del correo electrónico. se escoge él que se utilizará para anexar el audio al correo electrónico.odbctable emailsubject El nombre de la tabla de la base de datos donde guardar los mensaje de voz. de los tres formatos audio en que se grabarán los mensaje de voz (definidos en el parámetro format). Valor /usr/sbin/sendmail -t zona horaria predefinida para indicar fecha y hora de llegada del mensaje de voz. Valor asterisk (se deja comentado) . Valor %A. Valor: Estimando ${VM_NAME}:\n\n\t le estamos enviando este correo para avisarle que ha recibido un nuevo mensaje de voz de ${VM_DUR} segundos (numero $ {VM_MSGNUM})\n\n buzon de voz ${VM_MAILBOX} del numero ${VM_CALLERID}. Valor central A partir de este parámetro inicia la configuración avanzada del archivo. Se pone el mismo valor configurado para el idioma del sistema operativo: es_CO.Parámetro Descripción usando el conector ODBC. %d %B %Y at %H:%M:%S comando Linux para enviar el correo electrónico.\n\n Llame su buzon de voz para escucharlo. En este caso se utiliza Sendmail. Valor internas yes = anuncia la duración del mensaje de voz define la duración mínima del mensaje de voz para que sea 249 emailbody emaildateformat mailcmd tz locale attach attachfmt saycid cidinternalcontexts sayduration saydurationm . el ${VM_DATE}.Tu Buzon de Voz\n Nombre empresa Formato de la hora y fecha del correo electrónico.8 de Asterisk es posible configurar el idioma para el formato de la fecha que aparece en el mensaje de notificación.

grabar su nombre la primera vez que acceda.conf . Se deja comentado yes = antes de reproducir un mensaje de voz. yes = el usuario no aparecerá en el directorio yes = recuerda al usuario que el mensaje de bienvenida que está usando es temporal hasta que no grabe uno personalizado. A partir de la versión 1. Valor 2 nombre del contexto del dialplan para efectuar llamadas salientes desde el menú del buzón de voz (opción 4 del menú avanzado).X de Asterisk es posible definir donde se guardarán las contraseñas para cada buzón de voz.Se guardarán en este archivo 250 sendvoicemail . Valor 0. Valor yes Nombre del contexto del dialplan para poder llamar el remitente del mensaje de voz.) no = no se borra el mensaje de voz una vez que se ha enviado anexo al correo electrónico de notificación. Valor externas Permitir o no enviar el mensaje de voz a otra extensión (opción 5 del menú avanzado).callback=fromvm :exitcontext=fromvm review . Se deja comentado Nombre del contexto donde enviar el llamante si presiona una tecla antes de dejar un mensaje.8.Parámetro dialout Descripción anunciado (en minutos). se anuncian todos los datos del mensaje mismo (fecha. Posibles valores: – voicemail. Se deja comentado yes = Permite al llamante escuchar el mensaje de voz que ha grabado antes de enviarlo permite al llamante presionar la tecla 0 para hablar con un operador mientras se encuentra en el buzón de voz. CLI. etc. Para que funcione se necesita que SOX sea instalado en el servidor. Un usuario se considera nuevo si la contraseña del buzón de voz coincide con el numero de extensión no = obliga un nuevo usuario a grabar un mensaje de bienvenida para su buzón de voz no = el usuario aparecerá en el directorio. hora.0 yes = en el caso de más de un mensaje de voz presente en el buzón de voz.operador=yes envelope delete volgain nextaftercmd forcename forcegreeting hidefromdir tempgreetwarn passwordlocation . permite pasar al mensaje siguiente sin presionar las teclas 7 o 9 (borrar/guardar el mensaje respectivamente) yes = obliga cada usuario con un buzón de voz configurado. permite subir el volumen de grabación de los mensajes de voz.

Parámetro – Descripción spooldir – la contraseñas se guardarán en un archivo de texto (secret. De esta forma el propietario de cada buzón de voz. presionando 4 del primero mensaje ir al ultimo. Lo mismo pasará con el correo electrónico de notificación.vm-newpassword=custom_sound dejan comentadas .conf) que hay que crear en la carpeta /var/spool/asterisk/voicemail/contexto/usuario donde contexto es el nombre del contexto al que pertenece el buzón de voz y usuario es el numero del buzón de voz de la extensión messagewrap yes = Mientras se están escuchando los mensajes de voz. Siguen algunos ejemplos America/New_York|'vm-received' Q 'digits/at' IMp America/Chicago|'vm-received' Q 'digits/at' IMp Europe/Copenhagen|'vm-received' a d b 'digits/at' HM America/Bogota|'vm-received' aebY 'digits/at' HM 251 eastern central european colombia . permite. Valor 4 minpassword .vm-mismatch=custom_sound . Se . define una longitud mínima para la contraseña del buzón de voz (en numero de cifras).vm-password=custom_sound estos parámetros permiten personalizar las locuciones. presionando 6 desde el ultimo mensaje escuchado volver al primero. escuchará la fecha y la hora en que se dejó el mensaje de voz según el país en que se encuentre.vm-reenterpassword=custom_sound .vm-invalid-password=custom_sound . menos las ya configuradas) 50 = numero máximo de mensajes de voz permitidos en la carpeta de borrados a partir de esta etiqueta se configuran las distintas zona horarias que se podrán configurar para cada buzón de voz.vm-pls-try-again=custom_sound listen-control-forward-key listen-control-reverse listen-control-pause-key listen-control-restart-key listen-control-stop-key backupdeleted [zonemessages] # = tecla para el avance rápido del mensaje * = tecla para rebobinar el mensaje 0 = tecla numérica para poner en pausa/reanudar el mensaje 2 = tecla numérica para volver a escuchar el mensaje desde el inicio 13456789 = teclas numéricas para terminar la escucha de un mensaje de voz (todas.vm-passchanged=custom_sound .

com.com attach=yes maxmsg=100 maxsecs=500 minsecs=5 maxgreet=180 skipms=3000 maxsilence=4 252 .marko2.marko.fulano@gmail.. Se renombra el predefinido: mv /etc/asterisk/voicemail. correo electrónico y zona horaria presentes en el archivo.tz=colombia 1001. Ese el el contexto que hay que configurar en el voicemail.com. van personalizados.tz=central 1000 => 1001 => 1002 => 1234 => 1235 => IMPORTANTE: Todos los datos (nombre. correo pager.com. Después del contexto. se le pedirá de cambiar la contraseña y configurar su buzón de voz.old se crea uno nuevo: nano /etc/asterisk/voicemail. correo electrónico.tz=european 1234..linode.conf.tz=colombia 1002.conf y la etiqueta lo define. Como la contraseña es igual al numero de extensión.fulano@gmail.com.zutano@gmail. uno por linea.. la primera vez que el usuario entre en su buzón de voz.fulano de tal.tz=mexico 1235.conf se copian las siguientes lineas: [general] format=wav49|gsm|wav serveremail=buzondevoz@li370-135..fulano de pascual.. nombre apellido.opciones 1000.members. De esta forma se han definidos los buzones de voz para todas las extensiones configuradas en Asterisk meno la 1004.zutano pelado. En el configuración de las extensiones en el sip.fulano@gmail.conf /etc/asterisk/voicemail.conf para el parámetro mailbox se ha puesto como valor “default”.Parámetro mexico [default] Descripción America/Mexico_City|'vm-received' aebY 'digits/at' HM a partir de esta etiqueta se configuran los contextos para los buzones de voz. Ahora se puede crear el archivo.fulano@gmail.com. siguiendo la sintaxis: Numero extensión => contraseña. se configuran todos los buzones de voz.

operador=yes envelope=yes delete=no volgain=0.0 nextaftercmd=yes forcename=yes forcegreeting=no hidefromdir=no 253 .iso88591 attach=yes attachfmt=wav saycid=yes cidinternalcontexts=internas sayduration=yes saydurationm=2 dialout=externas sendvoicemail=yes .externnotify=/usr/bin/myapp .Tu Buzon de Voz\n Nombre empresa .odbctable=mensajes emailsubject=Nuevo mensaje de voz ${VM_MSGNUM} en el buzon de voz ${VM_MAILBOX} emailbody=Estimando ${VM_NAME}:\n\n\t le estamos enviando este correo para avisarle que ha recibido un nuevo mensaje de voz de ${VM_DUR} segundos (numero ${VM_MSGNUM})\n\n buzon de voz $ {VM_MAILBOX} del numero ${VM_CALLERID}. %d %B %Y at %H:%M:%S mailcmd=/usr/sbin/sendmail -t tz=central locale=es_CO.externpass=/usr/bin/myapp . todo el texto del parametro "emailbody" tiene que estar en la misma linea emaildateformat=%A.\n\n Llame su buzon de voz para escucharlo.odbcstorage=asterisk .externpassnotify=/usr/bin/myapp directoryintro=dir-intro charset=ISO-8859-1 pbxskip=yes fromstring=Buzon de Voz usedirectory=yes .callback=fromvm :exitcontext=fromvm review=yes . el ${VM_DATE}. Gracias!\n\n\t\t\t\t.silencethreshold=128 maxlogins=3 moveheard=yes forward_urgent_auto=no .

vm-password=custom_sound . B or b or h Month name (January.. with 00 pronounced as "o'clock" . Supported values: .Y Year ..vm-pls-try-again=custom_sound listen-control-forward-key=# listen-control-reverse=* listen-control-pause-key=0 listen-control-restart-key=2 listen-control-stop-key=13456789 backupdeleted=50 [zonemessages] . weekday. Sunday. required) . P or p AM or PM . 12 hour clock . "yesterday". personalizar nombres. thirty-first) . 'filename' filename of a soundfile (single ticks around the filename .R 24 hour time. 24 hour clock (single digit hours NOT preceded by "oh") .) .tz=colombia 254 . including minute eastern=America/New_York|'vm-received' Q 'digits/at' IMp central=America/Chicago|'vm-received' Q 'digits/at' IMp european=Europe/Copenhagen|'vm-received' a d b 'digits/at' HM colombia=America/Bogota|'vm-received' aebY 'digits/at' HM mexico=America/Bogota|'vm-received' aebY 'digits/at' HM [default] ..) ..fulano de tal.. .Q "today".k Hour.vm-mismatch=custom_sound .tempgreetwarn=yes passwordlocation=voicemail.vm-invalid-password=custom_sound .. .conf messagewrap=yes minpassword=4 . . 24 hour clock (single digit hours preceded by "oh") .N Minute..vm-passchanged=custom_sound . I or l Hour. ${VAR} variable substitution .. second.vm-reenterpassword=custom_sound .vm-newpassword=custom_sound .com. correos electrónicos y zona horaria 1000 => 1000.H Hour. "yesterday" or ABdY .M Minute. A or a Day of week (Saturday.q "" (for today). February. (*note: not standard strftime value) . with 00 pronounced as "hundred" (US military time) .fulano@gmail. apellidos. d or e numeric day of month (first. (*note: not standard strftime value) . or ABdY .

com.fulano@gmail. Como esta parte es igual para todas las extensiones.fulano de pascual. Se abre el archivo del dialplan: nano /etc/asterisk/extensions.com.tz=central IMPORTANTE: personalizar el parámetro serveremail con su nombre de dominio y los parámetros nombre.com.conf 255 . hay que modificar el dialplan.tz=mexico 1235 => 1235.marko2.fulano@gmail..tz=colombia 1002 => 1002.conf: asterisk -rvvvvvvvvvvvvvvvv CLI> voicemail reload Para ver los usuarios configurados y los mensajes de voz presentes: CLI> voicemail show users Context Mbox User Zone NewMsg default general New User 0 default 1000 fulano de tal colombia 0 default 1001 fulano de pascual colombia 0 default 1002 zutano de tal european 0 default 1234 marko mexico 0 default 1235 marko2 central 0 Para ver la zonas horarias configuradas: CLI> voicemail show zones Zone Timezone Message Format mexico America/Bogota 'vm-received' aebY 'digits/at' HM colombia America/Bogota 'vm-received' aebY 'digits/at' HM european Europe/Copenhagen 'vm-received' a d b 'digits/at' HM central America/Chicago 'vm-received' Q 'digits/at' IMp eastern America/New_York 'vm-received' Q 'digits/at' IMp Se sale la consola: CLI> quit Para que una llamada si no es contestada o si la extensión está ocupada se envíe al buzón de voz.zutano@gmail.marko.1001 => 1001... se creará una Macro.fulano@gmail.tz=european 1234 => 1234.com..zutano pelado. correo electrónico y zona horaria de cada buzón de voz. Se guardan los cambios y se recarga la configuración del voicemail.

1.Dial(IAX2/marko.Macro(voicemail) same => n.Dial(SIP/${EXTEN}.Hangup • • • Linea1 – contesta la llamada Linea2 – envía la llamada al buzón de voz del llamante (CALLERID(num) y al contexto default (configurado en voicemail.VoiceMailMain(${CALLERID(num)}@default) same => n.e) same => n.4].Dial(IAX2/marko.1.hHkKtTwWxX) same => n.Dial(SIP/${EXTEN}.30) same => n.Hangup exten => 1234.1.Hangup Para buscar un usuario en el directorio: exten => 99.1.1.Directory(default.Dial(IAX2/marko2.45.1.30) same => n.Dial(IAX2/marko2.conf) Linea2 – cuelga la llamada Para entrar al buzón de voz general y luego digitar numero de buzón y contraseña: exten => 98.4].Macro(calendario) same => n.30) same => n.Hangup se modifica estos tres bloques para que queden: exten => _100[0-2.30) same => n.Macro(disponible) same => n.Hangup exten => 1235.Macro(voicemail) same => n.Hangup para que queden: exten => _100[0-2.Hangup exten => 1235.Hangup exten => 1234.internas.1.hHkKtTwWxX) same => n.VoicemailMain same => n.Primero se añade la parte para llamar el buzón de voz en el contexto internas: exten => 97.Macro(voicemail) 256 .Answer same => n.1.45.1.

se podrá llamar directamente desde esta aplicación.Hangup Luego al final del archivo se crea la macro: [macro-voicemail] exten => s. la llamada se transferirá al buzón de voz anunciando al llamante que la extensión está hablando. si el valor es BUSY. Como ultima prueba.1.Hangup La aplicación dial genera la variable DIALSTATUS que contiene uno de los siguientes valores: • • • • • • • • CHANUNAVAIL CONGESTION NOANSWER BUSY ANSWER CANCEL DONTCALL TORTURE En base al valor se enviará la llamada a un determinado punto de la macro.Hangup exten => s-CANCEL.same => n.. En la interfaz de X-Lite (extension 1000).b) same => n. Si el apellido existe.Goto(s-${DIALSTATUS}. En el directorio se busca una persona digitando en el teclado del teléfono las primeras tres letras del apellido.Hangup exten => _s-.conf) de la extensión 1002. por ejemplo.Congestion same => n. La extensión 1001 será transferida al buzón de voz de la extensión 1000 donde se dejará un mensaje.1) exten => s-BUSY.Voicemail(${MACRO_EXTEN}@default.1.1. Terminada esta operación se marca desde la extensión 1000 el numero 99 para probar el directorio. desde la extensión 1001 se marca la extensión 1000 y no se contesta la llamada.1.Voicemail(${MACRO_EXTEN}@default.u) same => n. Se guardan los cambios y se recarga el dialplan: asterisk -rvvvvvvvvvvvvvvv CLI> dialplan reload La primera operación es la de configurar el buzón de voz de la extensión 1000. aparecerá: 257 .Hangup exten => s-CONGESTION.1. Hacer la prueba marcando el apellido (como configurado en el voicemail. Desde esa extensión se marca el numero 97 y se siguen los pasos indicados por las locuciones.

La parte evidenciada indica que hay un mensaje en el buzón de voz de la extensión 1000. y con el correo electrónico recibido: El anexo es el archivo audio con el mensaje de voz. Se puede escuchar el mensaje llamando también el numero 97. Los tres archivos audio (en los tres formatos definidos en voicemail. Se puede comprobar también desde la consola: CLI> voicemail show users Context Mbox User Zone NewMsg default general New User central 0 default 1000 fulano de tal colombia 1 default 1001 fulano de pascual colombia 0 default 1002 zutano pelado european 0 default 1234 marko mexico 0 default 1235 marko2 central 0 7 voicemail users configured.conf) se encontrarán en la carpeta: 258 .

/var/spool/asterisk/voicemail/default/1000/INBOX/ -rw-r--r-. hay que volver a seleccionar los 259 .txt contiene toda la información relacionada con el mensaje de voz: .gsm -rw-rw-rw.0 make distclean ./configure make menuselect Cuando se recompila Asterisk. Message Information file .1 root root 16895 Oct 19 20:37 msg0000.wav -rw-r--r-. Para que funcione.WAV El archivo msg0000.2 Mensajes de voz en una base de datos Los mensaje de voz.1 root root 17127 Oct 19 20:37 msg0000. .11. [message] origmailbox=1000 context=macro-voicemail macrocontext=locales exten=s-BUSY priority=1 callerchan=SIP/1002-00000032 callerid="Mengano" <1002> origdate=Thu Oct 20 01:37:07 AM UTC 2011 origtime=1319074627 category= flag= duration=10 14. pueden guardarse en una base de datos.txt -rw-r--r-. como ya se ha visto anteriormente. hay que volver a compilar Asterisk con el soporte ODBC para el buzón de voz.8.1 root root 271 Oct 19 20:37 msg0000. Esto permite implementar aplicaciones que desde la Web permitan escuchar los mensajes de voz y revisar todos los datos de los mismos. Se entra en la carpeta de las fuentes de Asterisk y se siguen estos pasos: cd /usr/src/asterisk-1. ademas de guardarse en la carpeta indicada en el párrafo anterior.ls .1 root root 166124 Oct 19 20:37 msg0000. Esta configuración se basa en el conector ODBC y una base de datos (en este caso MySQL).

hay que crear la tabla. se para el servicio: service asterisk stop Luego se instala: make install Ahora.conf modificar estas dos lineas: . En algunos casos los datos de las tablas se encuentran en la carpeta contrib/realtime/mysql de las fuentes de Asterisk como es para los mensajes de voz. mysql -u root -psesamo asterisk < contrib/realtime/mysql/voicemail_messages.odbctable=mensajes 260 .odbcstorage=asterisk .conf: nano /etc/asterisk/voicemail.sql Creada la tabla hay que modificar dos parámetros en el archivo voicemail. para guardar los mensaje de voz en la base de datos.modulos Add-ons: Luego en el menú “Voicemail Build Options” seleccionar “ODBC_STORAGE”: Se guardan los cambios y se compila Asterisk: make Antes de instalar nuevamente los modulo de Asterisk.

so == Parsing '/etc/asterisk/voicemail.para que queden: odbcstorage=asterisk odbctable=voicemail_messages Se guardan los cambios y se inicia Asterisk: service asterisk start Se entra en la consola de Asterisk y se averigua que el modulo esté funcionando con ODBC Storage: asterisk -rvvvvvvvvvvvvvvvvvv CLI> module unload app_voicemail.conf': == Found == Parsing '/etc/asterisk/users.00 sec) Perfecto!! 261 . +--------------------------------------------------+--------+-----------------+-----------------+ | dir | msgnum | context | callerid | +--------------------------------------------------+--------+-----------------+-----------------+ | /var/spool/asterisk/voicemail/default/1000/INBOX | 0 | macro-voicemail | "zutano" <1001> | +--------------------------------------------------+--------+-----------------+-----------------+ 1 row in set (0. desde la extensión 1001 o 1002 se llama la extensión 1000 y se deja un mensaje en el buzón de voz.conf': == Found == Registered application 'VoiceMail' == Registered application 'VoiceMailMain' == Registered application 'MailboxExists' == Registered application 'VMAuthenticate' == Registered application 'VMSayName' == Registered custom function 'MAILBOX_EXISTS' == Manager registered action VoicemailUsersList Loaded app_voicemail.so => (Comedian Mail (Voicemail System) with ODBC Storage) Por lo que aparece en negrita parece que si. Para averiguar que el mensaje ha sido guardado en la tabla: mysql -u root -psesamo mysql> use asterisk mysql> select dir. Para probarlo.callerid from voicemail_messages.context.so Loaded app_voicemail.so CLI> module load app_voicemail.msgnum.

8. Los pasos a seguir son: • • • crear la tabla en la base de datos configurar el realtime dinámico reiniciar asterisk Como para la tabla de los mensajes de voz.conf Se modifica esta linea: .asterisk.3 Buzones de voz en una base de datos Además de los mensajes de voz.. es que esto permite modificar los valores directamente desde la base de datos o desde una aplicación Web que trabaje con la base de datos.asterisk para que quede: voicemail => odbc.voicemail Se guardan los cambios y se reinicia Asterisk: service asterisk restart Ahora se configura el buzón de voz de la extensión 1004 (la configurada en SIP realtime) en la tabla a través de webmin: 262 .voicemail => odbc. también los buzones de voz se pueden guardar en una base de datos.0/contrib/realtime/mysql/ mysql -u root -psesamo asterisk < voicemail. En este caso se utilizará el Realtime dinámico. La ventaja. como ya se ha dicho anteriormente.14.sql Creada la tabla se configura el realtime dinámico: nano /etc/asterisk/extconfig.11. se utilizará la tabla presente en las fuentes de Asterisk: cd /usr/src/asterisk-1.

En la tabla aparecen todas las opciones que se pueden configurar para un buzón de voz. Se termina 263 .

presionando el botón “Save” y desde la extensión 1004 se marca el 97 para probar la configuración. Si todo funciona. 264 . ya se ha terminado con la configuración de los buzones de voz.

.

Capitulo XV Las conferencias audio Cuarta parte . Valor 32 Este parámetro va configurado en yes solamente si se usan las conferencias en realtime (ARA).6. En caso contrario hay que dejarlo en no Si las conferencias están configuradas en Realtime este parámetro actualiza la tabla cada vez que un usuario entre o salga de la conferencia.conf En Asterisk una funcionalidad bastante interesante es la de las conferencias audio. Esto permite sincronizar el audio de los distintos participantes y evitar retrasos. Confbridge ha sido añadida a Asteirks a partir de la versión 1. Este parámetro se utiliza para definir si un usuario puede o no entrar en la conferencia si e ésta no ha empezado. se presentan los parámetros con una breve descripción. En negrita los valores que se asignarán.X y no necesita DAHDI para funcionar. Valor yes Hay una conferencia programada a las 8 de la mañana.conf Como para los demás archivos de configuración de Asterisk. La configuración de meetme se hace a partir de un archivo dedicado mientras las conferencias creadas con Confbridge no necesitan configuración previa.1. meetme no funciona. 300 es el número de schedule logmembercount fuzzystart . pero implementa menos funciones y no es posible configurarla en Realtime dinámico. Meetme se apoya a DAHDI para generar la sincronización de los canales audios presentes en la conferencia creando una canal pseudo-DAHDI para cada conferencia. existen dos aplicaciones: • • meetme confbridge La primera es la más conocida y ha sido implementada en Asterisk desde las primeras versiones. Sin DAHDI instalado.Las conferencias audio – meetme. Para utilizar esta funcionalidad. 15. Al final de la tabla el archivo completo. Puede ser un valor entre 2 y 32. Parámetro [general] audiobuffers Descripción Inicia la parte general de configuración Numero de paquetes audio de 20ms que serán guardados en un buffer de memoria cuando pertenecen a canales que no son DADHI.1 meetme.

si entra cuando falta menos de una hora recibirá este aviso.conf [general] audiobuffers=32 schedule=no logmembercount=yes fuzzystart=300 earlyalert=3600 endalert=120 267 . Si entra más de una hora antes se le anunciará que la conferencia no existe. Con el valor en 3600. Si el usuario entra a la 7:55 será aceptado porque puede entrar hasta 5 minutos (300 segundos) antes del comienzo de la conferencia.1234. Valor 120 a partir de esta etiqueta inicia la configuración de las conferencias. Ejemplo. La sintaxis es: conf => confno[. a los usuario se les presentará un aviso.conf.pin][.Parámetro Descripción segundos.1234 conf => 3502. Si entra a las 7:50 será rechazado.adminpin] Se configura la primera sala de conferencia sin PIN de usuario y PIN de administrador Se configura la segunda sala de conferencia con PIN de usuario 1234 y sin PIN de administrador Se configura una tercera sala de conferencia con PIN de usuario 1234 y PIN de administrador 5678 endalert [rooms] conf => 3500 conf => 3501. Funciona solamente en Realtime earlyalert Este valor (siempre en segundos) define si al usuario que intenta entrar en una conferencia programada le será anunciado o no que la conferencia todavía no ha empezado.conf /etc/asterisk/meetme.5678 Se renombra el archivo predefinido: mv /etc/asterisk/meetme.old y se crea uno nuevo con los parámetros indicados en la tabla: nano /etc/asterisk/meetme. Cuando falten los segundos indicados en este parámetro para que termine una conferencia programada.

CLI> quit Ahora se modifica el dialplan para utilizar las conferencias.Hangup Llamando la extensión 3500. nano /etc/asterisk/extensions.Meetme(${EXTEN}.1.1234.[rooms] conf => 3500 conf => 3501.so se revisa la sintaxis de la aplicación meetme: CLI> core show application meetme Como se puede ver hay muchos parámetros y opciones que se pueden configurar.1234 conf => 3502.scM(default)) same => n. la segunda para administrarla.conf después del contexto internas se añade un nuevo contexto: [conferencias] exten => _350[012].conf) Las tres opciones: • s . la tercera es para controlar un canal de la conferencia y la tercera para conocer el numero de usuarios presentes en una conferencia.5678 Se guardan los cambios y se entra en la consola de Asterisk: asterisk -rvvvvvvvvvvvvvvvvvvvv se recarga el modulo app_meetme CLI> module reload app_meetme.3501 o 3502 se entrará en el cuarto de conferencia (como configurado en meetme. La primera es para entrar en una conferencia. Hay otras aplicaciones relacionadas con las conferencias: CLI> core show application meetme (más la tecla tabulador) MeetMe MeetMeAdmin MeetMeChannelAdmin MeetMeCount Las aplicaciones disponibles son cuatro.Con esta opción se activa el menú del cuarto de conferencias para usuarios y 268 .

Esto se hace con una Macro.1.Hangup y al final del archivo se añade la Macro: [macro-meetme] exten => s.Gotoif($[${count} > ${confmax}]?llena) same => n. Marcando la tecla asterisco se escuchará el menú c . En el contexto conferencias se pone: exten => 3520.MeetMeCount(${MACRO_EXTEN}.count) same => n. para que las extensiones tengan acceso al contexto conferencias hay que añadir la linea en negrita al contexto externas y locales: 269 .Hangup same => n(llena).D) same => n.Cuando en el cuarto de conferencia está solamente una persona.Macro(meetme) same => n.Al entrar en un cuarto de conferencia se le anunciará al usuario el número de personas presentes M(default) . Si en lugar de la opción D se pone la opción d no se necesitará definir un PIN para el cuarto de conferencia.DM(default)) same => n. Para terminar la configuración del dialplan.Set(confmax=10) same => n.1. si es menor el usuario podrá entrar al cuarto de conferencias.• • administradores. Con la primera línea de la macro se controla con la aplicación MeetmeCount cuantos usuarios están en la conferencia 3520 y se asocia ese valor a la variable count.Meetme(.Hangup Primero no se indica el número del cuarto de conferencias y se usa la opción D que permite definir la extensión 3510 como cuarto de la conferencia y un PIN para entrar.1. A seguir un ejemplo que se va a añadir al dialplan en el contexto conferencias: exten => 3510. Primero se asocia a la variable confmax el numero 10 (el numero máximo de participantes permitidos en la conferencia) y luego se llama la macro meetme. Si el numero contenido en la variable count es mayor al numero contenido en la variable confmax (10) se va a la línea con la etiqueta (llena) donde se comunicará que la conferencia no es valida y se colgará la llamada. El PIN de la conferencia será el que será digitado por la primera persona que entre en la conferencia.MeetMe(${MACRO_EXTEN}. ésta escuchara la música de espera de la clase default” Existe la posibilidad de crear cuartos de conferencias de forma dinámica (sin tener que configurarlos en el archivo meetme. Otro ejemplo que se puede añadir al dialplan es crear una conferencia y definir como numero máximo de participantes 10.conf).Hangup Una explicación.Playback(conf-invalid) same => n.

15.alaw' (language 'es') -.conf. Para sacar un usuario de la conferencia: CLI> meetme kick 3500 1 == Setting global variable 'MEETMEADMINSTATUS' to 'OK' -.Executing [3500@externas:2] Hangup("SIP/1000-00000003".2 Aplicación ConfBridge 270 .[externas] include => internas include => internacio include => parkedcalls include => test include => conferencias [locales] include => internas include => auten include => parkedcalls include => test include => conferencias Se guardan los cambios y se actualiza el dialplan: asterisk -rvvvvvvvvvvvv CLI> dialplan reload Ahora desde las extensiones 1000 y 1001 se marca el numero 3500 para entrar en la primera conferencia configurada en el archivo meetme. Para ver las extensiones presentes en la conferencia: CLI> meetme list 3500 User #: 01 1000 callerid=Fulano Channel: SIP/1000-00000003 (unmonitored) 00:02:45 User #: 02 1001 zutano Channel: SIP/1001-00000007 (unmonitored) 00:00:53 2 users in that conference. "") in new stack Quedará: CLI> meetme list 3500 User #: 02 1002 Mengano 1 user in that conference. Channel: SIP/1002-00000005 (unmonitored) 00:04:09 Para probar la Macro desde la extensión 1000 se marca 3520.<SIP/1000-00000003> Playing 'conf-kicked.

options]) [Arguments] confno The conference number options a: Set admin mode.Para conocer la sintaxis de la aplicación ConfBridge: CLI> core show application ConfBridge -= Info about application 'ConfBridge' =[Synopsis] Conference bridge application. These can be unique to the caller. c: Announce user(s) count on joining a conference. or 'default'. A: Set marked mode. M[(class)]: Enable music on hold when the conference has a single caller. The user can exit the conference by hangup only. specify a musiconhold class to use. Optionally. [Syntax] ConfBridge([confno][. it will use the channel's currently set music class. The join sound can be set using the 'CONFBRIDGE_JOIN_SOUND' variable and the leave sound can be set using the 'CONFBRIDGE_LEAVE_SOUND' variable. q: Quiet mode (don't play enter/leave sounds). NOTE: This application will not automatically answer the channel. If one is not provided. w: Wait until the marked user enters the conference. 1: Do not play message when first person enters s: Present menu (user or admin) when '*' is received (send to menu). 271 . m: Set initially muted. [Description] Enters the user into a specified conference bridge.

Lo primero es crear la tabla en la base de datos Asterisk: mysql -u root -psesamo mysql> use asterisk mysql> CREATE TABLE `meetme` ( `confno` char(80) NOT NULL default '0'. `opts` char(100) default NULL. desde la consola de Asterisk.3 Meetme en Realtime Dinámico Como se ha comentado anteriormente.[See Also] Not available Como esta aplicación no contesta automáticamente el canal. con ConfBridge no se puede.Mcs) same => n. `members` int(11) NOT NULL default '0'. 272 .conf En el contexto conferencias se añade: exten => 3530. A diferencia de meetme.ConfBridge(3530.1. controlar los participantes presentes. `pin` char(20) default NULL. `adminpin` char(20) default NULL. para configurarla en el dialplan hay que iniciar el bloque con un Answer: CLI> quit nano /etc/asterisk/extensions. es posible configurar las conferencias en Realtime dinámico. `endtime` datetime default NULL. 15. ni hacer otros tipos de operaciones.Answer same => n. `starttime` datetime NOT NULL default '0000-00-00 00:00:00'.Hangup Se guardan los cambios y se actualiza el dialplan: asterisk -rvvvvvvvvvvvvvvv CLI> dialplan reload Ahora desde la extensión 1000 se marca el numero 3530. `adminopts` char(100) default NULL.

conf nano /etc/asterisk/extconfig.meetme => mysql.`starttime`) ). hay que descargarlas: cd /tmp wget http://www.conf schedule= no se cambia a: schedule=yes Se guardan los cambios y se recarga toda la configuración de Asterisk: service asterisk reload Como algunas locuciones para las conferencias programadas no existen en la instalación estándar de Asterisk.conf para permitir la creación de conferencias programadas en Realtime: nano /etc/asterisk/meetme.tar y moverlas en la carpeta de la locuciones en ingles: mv *.general y se modifica para que quede: meetme => odbc. mysql> quit Creada la tabla. PRIMARY KEY (`confno`.org/tmp/confprompts.wav /var/lib/asterisk/sounds/en 273 .voztovoice.tar descomprimir el paquete: tar -xf confprompts.`maxusers` int(11) NOT NULL default '0'.conf se busca esta linea: .meetme Se guardan los cambios y se modifica el parámetro schedule del archivo meetme.asterisk. se modifica el archivo extconfig.

Ahora para la prueba se configuran dos conferencias a través de Webmin. La segunda: Las opciones que aparecen en las dos conferencias para los usuarios: • • c – anuncia los usuarios presentes en la conferencia I – obliga al usuario que entra a la conferencia a grabar su nombre 274 . La idea es crear una que inicie dentro de 50 minutos y otra que inicie dentro de 5 minutos y que las dos duren una hora. Se guardan los datos presionando el botón Save.

Para terminar hay que añadir las dos conferencias en el dialplan nano /etc/asterisk/extensions.options[.Meetme(${EXTEN}) same => n.• s – se activa la tecla “*” para entrar en un menú que permite modificar algunos parámetros personales (volumen de la conferencia. etcétera). en el segundo. como faltan menos de 5 minutos para que empiece.4 Aplicación Page La aplicación Page se utiliza para crear conferencias instantáneas llamando un grupo de extensiones simultáneamente.1. 15. Dependiendo del tipo de opciones configuradas.conf en el contexto conferencias se añade el siguiente bloque: exten => _500[01].]][. el llamante no escuchará un beep r – se grabará la conferencia en un archivo audio 275 . La única diferencia con las opciones del administrador es la opción a que activa el modo administrador.Hangup Se guardan los cambios y se actualiza la configuración asterisk -rvvvvvvvvvvvvvvvvvv CLI> dialplan reload Ahora se hace una prueba llamando primero la conferencia 5000 y luego la 5001.. volumen del micrófono..timeout]]) y las opciones disponibles: • • • • d – audio en ambas direcciones i – no se tomarán en cuenta intentos de transferir la llamada q – modo silencioso. se podrán crear distintos tipos de escenarios: • • • solamente quien ha iniciado la llamada podrá hablar todas las extensiones podrán hablar como sistema de intercomunicación para comunicar breves mensajes a la persona llamada (el teléfono del destinatario abrirá la linea en automático) La sintaxis de la aplicación es: Page(Technology/Resource[&Technology2/Resource2[&. En el primer caso un anuncio avisará que la conferencia no ha empezado. 300 segundos). deja entrar el usuario (como configurado en el parámetro fuzzystart.

Page(SIP/1001&SIP/1002. por ejemplo. Una variación de este bloque es: exten => 502.answer-after=0) Cisco SPA .Hangup Una vez que las dos extensiones contesten.Page(SIP/1001. Utilizar Page como sistema de intercomunicación puede ser muy útil.d) same => n.• • • s – solo se intentará incluir en las conferencias las extensiones cuyo estado sea “NOT_INUSE” A(x) – envía un anuncio a todos los participantes de la conferencia.1. en una empresa donde se quiera comunicar a todos los empleados un anuncio.Page(SIP/1001&SIP/1002) same => n.SIPAddHeader (P-Auto-answer: normal) same => n.answer-after=0) Yealink .1. Algunos ejemplos: • • • • • Aastra . En este caso se conecta a Asterisk una ATA tipo el PA1 de SNOM.SIPAddHeader (P-Auto-answer: normal) Ahora in una hipotética oficina donde el gerente quiera hacer una anuncio a la secretaria y ambos están utilizando teléfonos Yealink cuya extensiones son 1000 para el gerente y 1001 para la secretaria.i) same => hangup 276 . que a su vez se puede conectar a un sistema de amplificación audio.com\. x es el nombre del archivo audio que contiene la locución n – no envía un anuncio a todos los participantes de la conferencia.SIPAddHeader(Alert-Info: info=alert-autoanswer) Polycom . Llamando la extensión asociada al PA1. Dependiendo de la marca hay que enviar una cabecera especifica en el INVITE para que el teléfono mismo la reconozca y conteste la llamada en automático activando el parlante (alta voz) del teléfono.1.SIPAddHeader(Call-Info:\.SIPAddHeader(Call-Info: sip:domain. Implica que A(x) sea presente Una prima forma de probar la aplicación es: exten => 501. el dialplan sería: exten => 503. El mismo sistema se utiliza con los teléfonos SIP. este contestará la llamada en automático y el anuncio será difundido por el sistema de parlantes conectados al ATA.Hangup En este caso todas las extensiones tendrán el micrófono activado.SIPAddHeader(Alert-Info: Ring Answer) Snom . Las cabeceras se añaden a través de la aplicación Sipaddheader de Asterisk Estas cabeceras cambian según la marca de los telefonos. solamente la 1000 tendrá activado el audio.

1. Para terminar este párrafo se modifica el dialplan: nano /etc/asterisk/extensions. 277 .conf y en el contexto conferencias se añaden los dos bloques que siguen: exten => 501.Hangup exten => 502.Page(SIP/1001&SIP/1002.1.El gerente marca 503 y hace el anuncio a la secretaria cuyo teléfono habrá contestado en automático activando el parlante.Page(SIP/1001&SIP/1002) same => n.d) same => n.Hangup Se guardan los cambios y se actualiza el dialplan: asterisk -rvvvvvvvvvvvv CLI> dialplan reload Desde la extensión 1000 se marca primero el numero 501 y luego el 502.

.

Quizás este es el servicio más importante y estratégico para una empresa. Parámetro [general] multiplelogin [agents] maxlogintries autologoff Descripción etiqueta que da inicio a la parte general del archivo Define si está permitido a una extensión conectarse como agente múltiple. definiendo algunas variables y parámetros.Capitulo XVI Distribución automática de llamadas – Colas de espera Cuando se llama un centro de atención al cliente.conf se configuran las colas (pueden ser una o más). se está adentro de un sistema de distribución automática de las llamadas.conf • queues. En la tabla que sigue los distintos parámetros con una breve descripción. será desconectado de la cola. Cuando uno de los operadores que atienden las llamadas está libre. los agentes que atenderán las colas. A lo largo de la espera. En base a su calidad y el tiempo promedio de espera. En el queues. Valor 3 Numero de segundos que un agente tiene para contestar una llamada entrante.1 Los Agentes Para configurar los agentes que atenderán las llamadas entrantes a las distintas colas hay que modificar el archivo agents. ¿Cómo funciona? Cada llamada que llega se pone en una cola de espera respetando la prioridad con que ha llegado. Al final del la tabla el archivo completo de configuración. Valor no A partir de esta etiqueta inicia la configuración de los agentes Numero de intentos permitidos a un agente para autenticarse. los agentes miembros de cada cola y que tipo de estrategia se utilizará para enrutar las llamadas en la cola. 16. ¿Cómo se configura en Asterisk la gestión de las colas? A través de dos archivos: • agents. la llamada sera transferida a ese operador. los clientes estarán evaluando la misma empresa. el tiempo estimado de espera y un largo etcétera).conf En el primero se configuran. En negrita el valor asociado a cada parámetro. según la configuración. Valor 15 yes = si la extensión desde la cual el agente se autologoffunavail .conf. el llamante escuchará distintos anuncios (que posición tiene en la cola. Si no contesta dentro de ese tiempo. sin saberlo.

Ejemplo http://www. Valor wav el prefijo del nombre del los archivos grabados.group recordagentcalls recordformat . No usar grabar o no las llamadas de los agentes.urlprefix .1234. Valor no (no tiene que presionarla) # yes = permite al agente terminar una llamada presionando la tecla configurada en el próximo parámetro * Numero de mili segundos que Asterisk esperará antes de volver a llamar un agente que acaba de atender una llamada. Valor no obsoleto.agentpassword.savecallsin custom_beep agent 280 . Si se deja comentado será la predefinida (vm-goodbye) Actualizar o no el CDR con el nombre del agente. Valor beep Ahora se configuran los agentes. de la llegada de una llamada. Se deja comentado Avisa al agente que está conectado permanentemente a la cola.goodbye=vm-goodbye updatecdr . Puede ser una URL. Las sintaxis es: agent => agentid.org/calls.name Valor: 2000.Parámetro Descripción conecta se vuelve no disponible.Fulano acceptdtmf endcall enddtmf wrapuptime musiconhold . Valor default locución que el agente escuchará al terminar una llamada. Se deja comentado De manera predefinida las llamadas grabadas se guardan en la carpeta: /var/spool/asterisk/monitor Si se quiere personalizar la carpeta se indica en este parámetro.voztovoice. Valor 5000 Música de espera predefinida para el agente. Valor no Formato audio de las llamadas grabadas. automáticamente el agente será desconectado de la cola ackcall Para atender una llamada un agente tiene que presionar la tecla configurada en el próximo parámetro.

1236.conf.so 281 . Se entra en la consola de Asterisk y se recarga el modulo chan_agent.1236 Mengano Se guardan los cambios.Fulano agent => 2001.savecallsin=/home/calls custom_beep=beep agent => 2000.so: asterisk -rvvvvvvvvvvvvvv CLI> module reload chan_agent.org/calls .group recordagentcalls=no recordformat=wav .1235.goodbye=vm-goodbye updatecdr=yes .1234.1235.Zutano agent => 2002.urlprefix=http://dominio.Zutano Descripción 2002.old se crea uno nuevo: nano /etc/asterisk/agents.conf y se añaden los parámetros de la tabla: [general] multiplelogin=no [agents] maxlogintries=3 autologoff=15 autologoffunavail=yes ackcall=no acceptdtmf=# endcall=yes enddtmf=* wrapuptime=5000 musiconhold=default .conf /etc/asterisk/agents.Parámetro agent agent Se renombra el archivo predefinido: mv /etc/asterisk/agents.Mengano 2001.

Es hora de configurar las colas. puedan utilizar el teléfono para otro tipo de actividad.2 Las colas de espera – queue. CLI> agent show 2000 (Fulano) logged in on SIP/1000-00000001 is idle (musiconhold is 'default') 2001 (Zutano) not logged in (musiconhold is 'default') 2002 (Mengano) not logged in (musiconhold is 'default') 3 agents configured [1 online . 3 offline] CLI> quit Para que los agentes puedan autenticarse y atender las colas de que son miembros. Es poco productivo tener una agente conectado permanentemente a una cola además utilizando parte de la banda disponible. Es mucho más lógico conectar los agentes de forma dinámica y que mientras esperen las llamadas de los clientes. se añade el siguiente bloque: exten => _200[012]. y cuando el sistema lo pide. asterisk -rvvvvvvvvvvvvvvvvvvvv CLI> dialplan reload Ahora desde la extensión 1000 se marca el numero 2000.Hangup Se guardan los cambios y se actualiza el dialplan. esperando de atender los clientes.conf 282 . Una vez autenticado.Agentlogin(${EXTEN}) same => n. se ingresa la clave del agente 2000 (1234) seguida por la tecla numero #. 16. se utiliza en el dialplan la aplicación Agentlogin: nano /etc/asterisk/extensions. Esta parte se verá en el ultimo párrafo de este capitulo. 2 offline] Este sistema de conectar los agentes a las colas se ha vuelto un poco obsoleto para perqueños CallCenter y se está optando más para aplicaciones que permiten añadir a las colas de espera agentes dinámicos.1.Para ver la lista de los agentes configurados: CLI> agent show 2000 (Fulano) not logged in (musiconhold is 'default') 2001 (Zutano) not logged in (musiconhold is 'default') 2002 (Mengano) not logged in (musiconhold is 'default') 3 agents configured [0 online .conf en el contexto internas. el agente empezará a escuchar la música de espera predefinida.

Valor yes con esta etiqueta se define la primera cola de espera La música de espera para los clientes en la cola. Parámetro [general] persistentmembers Descripción Etiqueta que define la parte general del archivo yes = se guardan los datos de los miembros de la cola activos en la base de datos interna de Asterisk. Al final de la tabla el archivo completo. Si se reinicia la PBX los miembros serán reasignados a las colas correspondientes. Valor yes el tipo de aplicación utilizada para grabar las conversaciones de una cola. En negrita el valor asociado a cada parámetro. Este comportamiento no tiene en cuenta que pueden haber muchos agentes disponibles que podrían atender los clientes sin esperar que llegarán a ser los primeros de la cola de espera. Con este parámetro se define otro tipo de comportamiento. antes de atender una llamada. De esta forma se reducen considerablemente los tiempos de espera. Cuando el usuario que está de primero en la cola viene atendido el segundo se vuelve primero e será atendido por el primer agente disponible. con este parámetro se define si ese tiempo va respetado entre las distintas colas de que el agente es miembro. Hay unos cuantos usuarios esperando por ser atendidos por los agentes. Valor no Si un agente hace parte de más de una cola y se ha definido su tiempo de descanso entre una llamada y otra (el parámetro wraptime). Valor default Este parámetro permite crear un anuncio para que los agentes que pertenecen a más de una cola sepan. de que cola proviene el cliente.conf se configuran las distintas colas de espera. Valido solamente para agentes dinámicos Normalmente una cola funciona de la siguiente manera. Se deja comentado autofill monitor-type updatecdr shared_lastcall [ventas] musiclass .En el archivo queues. Los clientes serán atendidos de manera paralela hasta que haya agentes disponibles. En la tabla que sigue los distintos parámetros con una breve descripción.announce=queue-ventas 283 . Puede ser Mixmonitor o monitor Actualiza o no el valor del campo dstchannel del CDR (el registro de las llamadas) con el nombre del agente.

Si son agentes dinámicos según el orden con que se han registrado a la cola • Wrandom: asigna la llamada aleatoriamente usando una métrica basada en penalidades. Valor: 15 numero de segundos de espera antes de llamar otro 284 servicelevel context timeout retry . • Ringall: Llama todos los agentes disponibles a la vez hasta que uno conteste. En base al numero de segundos configurados en este parámetro. El segundo es el tiempo máximo que timbrará la extensión de un agente antes de considerarlo no disponible y pasar al siguiente.Parámetro strategy Descripción En este parámetro se define la lógica con que se enrutarán las llamadas de una cola a los agentes: • Leastrecent: Asigna la siguiente llamada al agente que más tiempo lleva sin atender una llamada. • Linear: Llama los agentes siguiendo el orden definido en este archivo de configuración. el cliente saldrá de la cola y se ejecutara la siguiente prioridad presente en el dialplan. Valor ventas-exit En la cola se pueden configurar dos distintos tipos de tiempos de espera. • Random: Asigna la siguiente llamada aleatoriamente a cualquier agente disponible. Uno a nivel de aplicación (dialplan) define el tiempo máximo que un cliente podrá quedar en la cola. Parámetro utilizado para la estadísticas de la cola. Este primer parámetro define por cuantos segundos timbrará la extensión del agente. • RRMemory: Distribuye las llamadas “por turnos” entre los agentes disponibles y “recuerda” el último agente al que intentó llamar. • Fewestcalls: Asigna la siguiente llamada al agente que menos llamadas ha atendido. en los reportes aparecerá el numero de llamadas contestadas dentro del tiempo definido. Valor 120 Si el cliente en la cola antes de ser atendido presiona una tecla del teléfono será enviado al contexto definido en este parámetro y a la prioridad correspondiente al dígito que ha marcado. Pasado ese tiempo sin ser atendido. Este parámetro y los siguientes dos se utilizan para definir que tipo de tiempo de espera tendrá prioridad.

Valor: 4 timeoutpriority En este parámetro se define si se toma en consideración el tiempo de espera definido a nivel de aplicación o a nivel de archivo de configuración. Valor app (aplicación) El peso de la cola. Valor yes yes = lo agentes que no atenderán una llamada serán puestos en pausa Numero máximo de personas que pueden estar esperando en la cola. Si hay agentes que atienden más de una cola. Valor 90 Para evitar que cada vez que la posición y/o el tiempo estimado de espera de un cliente cambie se le presente un anuncio.conf) yes = otra serie de variables serán creadas justo antes de conectar un miembro de la cola con un cliente (véase archivo predefinido queues. Más alto el valor.membermacro=macro announce-frequency min-announce-frequency . este parámetro define un tiempo (en segundos) que se esperará antes de comunicarle su 285 weight wrapuptime autofill autopause maxlen setinterfacevar setqueueentryvar setqueuevar . Valor 0 Tiempo de descanso de un agente entre una llamada y otra (en segundos) Valor 15 El mismo parámetro de la parte general del archivo se puede configurar por cada cola separadamente. Valor 50 Si se pone 0 no se fijará ningún limite yes = una serie de variables serán creadas justo antes de conectar un miembro de la cola con un cliente (véase archivo predefinido queues. Se deja comentado Cada cuanto segundos anunciar al cliente en la cola su posición y tiempo estimado de espera. las colas con peso más alto serán atendidas con prioridad respecto a las colas con peso más bajo.Parámetro Descripción agente si el primero no ha contestado dentro de los 15 segundos definidos en el parámetro anterior.conf) Antes de conectar el agente con el cliente se puede ejecutar la macro indicada en este parámetro. más prioridad tendrá la cola.conf) yes = otra serie de variables relacionadas con la cola serán creadas justo antes de conectar un miembro de la cola con un cliente (véase archivo predefinido queues.

queue-seconds=queue-seconds . no.anuncio2 en este parámetro se definen los anuncios periódicos personalizados separados por una coma. Puede ser yes. Valor 20 A partir de esta linea se pueden personalizar las locuciones predefinidas de la cola de espera.periodic-announce=queue-periodicannounce .queue-thankyou=queue-thankyou . se le anunciará que hay más de “valor del próximo parámetro” clientes esperando en la cola • limit – solo los clientes con una posición en la cola de espera menor o igual al valor del parámetro que sigue. .periodic-announce-frequency=60 Descripción nueva posición/tiempo estimado.queue-minute=queue-minute . Valores: • yes – si • no – no se le anuncia • more .queue-callswaiting=queue-callswaiting .queue-holdtime=queue-holdtime . u once (una sola vez) Anuncia al cliente su posición en la cola.periodic-announce=anuncio1.queue-reporthold=queue-reporthold . Se deja 286 .queue-thereare=queue-thereare . Valor 15 Cada cuantos segundos presentar un anuncio personalizado al cliente en la cola de espera.random-periodic-announce=no announce-holdtime announce-position announce-position-limit announce-round-seconds .si la posición del cliente en la cola de espera es más alta del numero especificado en el próximo parámetro. Se deja comentado Los anuncios pueden ser presentados según un orden aleatorio? Se deja comentado anunciar junto a la posición en la cola el tiempo estimado de espera. escucharán el anuncio de su posición en la cola de espera 5 Con este parámetro se redondea los minutos y los segundos de espera anunciados al cliente.queue-youarenext=queue-youarenext .Parámetro .queue-minutes=queue-minutes .

Aquí se define si un cliente puede o no entrar a una cola de espera si no hay agentes disponibles. Los distintos valores que se pueden utilizar.Parámetro comentado .unknown 287 .un agente es considerado no disponible si está en su tiempo de descanso (wraptime) después de haber atendido una llamada Valor: paused.monitor-format=gsm|wav|wav49 Descripción formatos audio en que se grabarán las conversaciones de la cola de espera (si se deja comentado. separados por una coma. son: • paused – un agente es considerado no disponible si está en pausa • penalty – un agente es considerado no disponible si el valor de su penalidad es menor al valor asociado a la variable QUEUE_MAX_PENALTY • inuse – un agente es considerado no disponible si el estado de su extensión es INUSE • ringing – un agente es considerado no disponible si su extensión está timbrando • unavailable .un agente es considerado no disponible si el estado de su extensión es UNAVAILABLE • invalid . no se grabaran) Se define la aplicación para grabar la conversaciones. el cliente será sacado de la cola.invalid. si todos los agentes se vuelven no disponibles.un agente es considerado no disponible si el estado de su extensión es INVALID • unknown – un agente es considerado no disponible si el estado de su extensión es UNKNOWN • wrapup .unavailable.unavailable. Puede ser monitor y mixmonitor Este parámetro con el que sigue.invalid. Valor paused. son los más importantes en la configuración de la cola.unknown monitor-type joinempty leavewhenempty este parámetro aplica a los clientes que ya están en la cola de espera y en base a los valores indicados.

conf se añaden las siguientes lineas: [general] persistentmembers=yes autofill=yes monitor-type=mixmonitor updatecdr=no 288 . Se deja comentado a partir de esta linea se definen los miembros de la cola. Valor 5 yes = el tiempo de espera para que un agente conteste una llamada se resetea si el estado de la extensión es BUSY o CONGESTION en el archivo queuerules. en este parámetro se define el nombre. el cliente esperará ese tiempo antes de ser conectado con un agente. La sintaxis es: member => tecnología/extensión.Parámetro .penalidad. En el caso que se haya configurado un escenario para esta cola.defaultrule=myrule member => Agent/2000 member => Agent/2001 member => Agent/2002 Ahora se guardan los valores de la tabla en el archivo de configuración de las colas.eventmemberstatus = yes reportholdtime ringinuse memberdelay Descripción Estos dos parámetros configurados en yes.old Se crea uno nuevo: nano /etc/asterisk/queues.extensión Se ponen los tres agentes configurados en el archivo agent.conf timeoutrestart .conf se configuran distintos escenarios para manejar las colas con el sistema de penalidades. De esta forma aunque hayan agentes disponibles.conf /etc/asterisk/queues.nombre.eventwhencalled = yes . generan una serie de eventos relacionados con la cola en el AMI de Asterisk yes = Se anuncia al agente. cuanto tiempo el cliente ha esperado en la cola no = no se envían las llamadas a agentes cuyo estado de la extensión es INUSE tiempo en segundos que el sistema esperará antes de conectar el agente con el cliente. antes de contestar la llamada. Se renombra el predefinido: mv /etc/asterisk/queues.conf.

queue-minute=queue-minute .unknown .queue-minutes=queue-minutes .invalid.anuncio2 .random-periodic-announce=no announce-holdtime=once announce-position=more announce-position-limit=5 announce-round-seconds=30 .invalid.announce=queue-ventas strategy=ringall servicelevel=120 context=ventas-exit timeout=15 retry=4 timeoutpriority=app weight=0 wrapuptime=15 autofill=yes autopause=yes maxlen=50 setinterfacevar=yes setqueueentryvar=yes setqueuevar=yes .queue-reporthold=queue-reporthold .monitor-format=gsm|wav|wav49 monitor-type=mixmonitor joinempty=paused.shared_lastcall=yes [ventas] musicclass=default .queue-thereare=queue-thereare .queue-holdtime=queue-holdtime .eventwhencalled = yes .queue-callswaiting=queue-callswaiting .queue-youarenext=queue-youarenext .queue-seconds=queue-seconds .eventmemberstatus = yes reportholdtime=yes ringinuse=no memberdelay=5 289 .periodic-announce-frequency=60 .unknown leavewhenempty=paused.unavailable.unavailable.queue-thankyou=queue-thankyou .membermacro=macro announce-frequency=90 min-announce-frequency=15 .periodic-announce=anuncio1.

Hangup Con la opción R. Los comandos asociados a la aplicación queue: CLI> help queue queue add member Add a channel to a specified queue queue reload {parameters|membe Reload queues.so CLI> queue show ventas ventas has 0 calls (max 50) in 'ringall' strategy (0s holdtime.defaultrule=myrule member => Agent/2000 member => Agent/2001 member => Agent/2002 Se guardan los cambios y se recarga el modulo de la aplicación de las colas en espera: asterisk -rvvvvvvvvvvvvvvvvvvvvv CLI> module reload app_queue.conf CLI> quit Se sale de la consola y se pasa al dialplan: nano /etc/asterisk/extensions. W:0.conf en el contexto internas se ponen las siguientes lineas exten => 3000. A:0. 0s talktime).8. queue rules.R) same => n. C:0.Queue(ventas.1. SL:0. members. or parameters queue remove member Removes a channel from a specified queue queue reset stats Reset statistics for a queue queue set penalty Set penalty for a channel of a specified queue queue show Show status of a specified queue queue {pause|unpause} member Pause or unpause a queue member queue show rules Show the rules defined in queuerules.X de Asterisk.Answer same => n. introducida con la versión 1.0% within 120s Members: Agent/2002 (Unavailable) has taken no calls yet Agent/2000 (Unavailable) has taken no calls yet Agent/2001 (Unavailable) has taken no calls yet No Callers Con queue show ventas se muestran los datos de las colas.timeoutrestart=yes . cuando la llamada es enviada a un 290 .

W:0. C:0. A:0.0% within 120s Members: Agent/2002 (Unavailable) has taken no calls yet Agent/2000 (Not in use) has taken 1 calls (last was 27 secs ago) Agent/2001 (Unavailable) has taken no calls yet No Callers 291 . Desde la extensión 1001 se marca el numero 3000. SL:0. W:0. W:0. C:1.0% within 120s Members: Agent/2002 (Unavailable) has taken no calls yet Agent/2000 (Not in use) has taken no calls yet Agent/2001 (Unavailable) has taken no calls yet No Callers El agente 2000 está disponible. Se guardan los cambios y se recarga el dialplan: asterisk -rx "dialplan reload" Desde la extensión 1000 conectada a Asterisk. A:0. Ahora desde la extensión 1000 se marca el numero 2000 (para conectarse como agente a las colas de espera). Una vez conectado se entra a la consola de Asterisk: asterisk -rvvvvvvvvvvvvvvv CLI> queue show ventas ventas has 0 calls (max 50) in 'ringall' strategy (0s holdtime.agente. Como no hay agentes disponibles la llamada terminará. dejará de enviar la musca de espera al cliente y en su lugar el cliente escuchará el tono de timbrado. 0s talktime). SL:100.0% within 120s Members: Agent/2002 (Unavailable) has taken no calls yet Agent/2000 (Busy) has taken no calls yet Agent/2001 (Unavailable) has taken no calls yet No Callers y al terminar la llamada: CLI> queue show ventas ventas has 0 calls (max 50) in 'ringall' strategy (0s holdtime. el estado de la cola de espera será: CLI> queue show ventas ventas has 0 calls (max 50) in 'ringall' strategy (0s holdtime. A:0. 0s talktime). se marca la extensión 3000. Cuando el agente (la extensión 1000) reciba la llamada del cliente (la extensión 1001). 28s talktime). C:0. SL:0.

Como se ha visto. "ventas") in new stack [Oct 21 16:58:49] WARNING[15270]: app_queue. Executing [3001@externas:1] Answer("SIP/1000-00000017".Answer same => n. contexto internas. la llamada será enviada al buzón de voz. Se puede crear otro escenario de este tipo: nano /etc/asterisk/extensions. "") in new stack Executing [3001@externas:2] Queue("SIP/1000-00000017". "1000@default") in new stack Como no hay agentes disponibles. En el caso de una pequeña empresa que quiera tener un pequeño call center y no quiera que los empleados estén todo el tiempo conectados como agentes sino que puedan desarrollar su normal actividad y al mismo tiempo atender las llamadas de la cola.1. En el plan de llamadas. si no hay agentes disponibles no se deja entrar el cliente a la cola. Estas dos aplicaciones son: • AddQueueMember • RemoveQueueMember ¿Cual es la diferencia con la aplicación Agentlogin? La aplicación Agentlogin es pensada para call center de grandes dimensiones. 16. Como se ha dicho el llamante se envía a la prioridad que sigue.c:5160 queue_exec: Unable to join queue 'ventas' Executing [3001@externas:3] VoiceMail("SIP/1000-00000017". la aplicación addQueueMember es mucho más funcional.3 Agentes dinámicos En Asterisk hay dos aplicaciones para añadir y quitar un miembro de una cola.conf en el contexto internas se pone exten => 3001. se añaden estos dos bloques: 292 . Se guardan los cambios y se recarga el dialplan.Voicemail(1000@default) same => n.Queue(ventas) same => n.Hangup De esta forma el llamante tendrá la oportunidad de dejar un mensaje en el buzón de voz. asterisk -rvvvvvvvvvvvv CLI> dialplan reload Desde la extensión 1000 se marca el 3001 (sin agentes conectados).

el agente será considerado como no disponible. después del “descanso” volver a atender la cola.Hangup Con el primer bloque las extensiones se añaden a la cola ventas.SIP/${CALLERID(num)}) same => n.1.1.SIP/1000.Hangup exten => *73.Hangup exten => *71.1.0. Hay que acordarse que cuando un agente se pone en pausa. por como se ha configurado la cola.Playback(beep) same => n.0.nano /etc/asterisk/extensions. si se reinicia Asterisk. Se guardan los cambios y se recarga el plan de llamadas: asterisk -rvvvvvvvvvvvvv CLI> dialplan reload Ahora desde la extensión 1000 se llama el numero *70 y se mira lo que aparece en la base de datos de Asterisk: CLI> database show /Queue/PersistentMembers/ventas CLI> quit Como en el archivos de las colas de espera se ha configurado el parámetro persistentmembers=yes.SIP/${CALLERID(num)}) same => n. los datos del agente deben permanecer en la base de datos. Hay dos aplicaciones más que permiten a los agentes dinámicos ponerse en pausa y no atender las llamadas para luego.Hangup Todos los datos de las conexiones de los agentes dinámicos se guardan en la base de datos interna de Asterisk.SIP/${CALLERID(num)}) same => n.conf exten => *70. Estas dos aplicaciones se pueden añadir al plan de llamadas de la siguiente forma: exten => *72.Addqueuemember(ventas.SIP/1000 . con el segundo se quitan.Playback(agent-loginok) same => n.1.UnpauseQueueMember(ventas.SIP/${CALLERID(num)}) same => n.PauseQueueMember(ventas.Playback(agent-loggedoff) same => n.Playback(beep) same => n. service asterisk restart 293 : SIP/1000.Removequeuemember(ventas.

0% within 120s Members: Agent/2002 (Unavailable) has taken no calls yet Agent/2000 (Unavailable) has taken no calls yet Agent/2001 (Unavailable) has taken no calls yet SIP/1000 (dynamic) (Not in use) has taken no calls yet No Callers Terminada la prueba se quita la extensión 1000 de la cola de espera llamando desde esa extensión el numero: *71 Se averigua en la base de datos de Asterisk que efectivamente el agente ya no está registrado: CLI> database show Ya no aparece la linea: /Queue/PersistentMembers/ventas : SIP/1000. se pone en pausa marcando el numero *72 Si se mira el estado de la cola: CLI> queue show ventas ventas has 0 calls (max 50) in 'ringall' strategy (2s holdtime.SIP/1000. SL:100.SIP/1000 294 .0. Para probarlo desde la extensión 1001 se marca el numero 3001. SL:100. W:0. El resultado: CLI> queue show ventas ventas has 0 calls (max 50) in 'ringall' strategy (2s holdtime. A:0.asterisk -rvvvvvvvvvvvvvvvvvvvvvvv CLI> database show /Queue/PersistentMembers/ventas : SIP/1000. Para volver activo desde la extensión 1000 se marca el numero *73.SIP/1000. A:0. W:0. 2s talktime).0. C:1. C:1. 2s talktime).0.SIP/1000 El agente no se ha borrado de la cola de espera. Como el agente dinámico quiere almorzar.0% within 120s Members: Agent/2002 (Unavailable) has taken no calls yet Agent/2000 (Unavailable) has taken no calls yet Agent/2001 (Unavailable) has taken no calls yet SIP/1000 (dynamic) (paused) (Not in use) has taken no calls yet No Callers Se podrá comprobar que efectivamente el agente dinámico está en pausa.0.

el nombre de la cola a la que se registró el agente y la extensión con la que se registró.16. En el caso que el evento no incluya todos los campos. en lugar de los datos aparecerá el valor NONE.4 Estadísticas de las colas Por defecto todas las estadísticas de las colas se guardan en el archivo predefinido queue_log presente en la carpeta /var/log/asterisk. La mayoría de los programas que permiten obtener gráficos de estas estadísticas. Junto al evento aparecerá la variable UNIQUEID de la llamada. Junto al evento aparecerá la variable UNIQUEID de la llamada. Los eventos que se pueden presentar son: • ABANDON: cuando un cliente abandona la cola sin ser atendido. Junto al evento aparecerá la variable 295 . El numero del agente y el canal utilizado para el registro. se pueden citar los dos más reconocidos (el primero con una versión Lite gratuita disponible y el segundo comercial) • • Asternic Call Center Stats QueueMetrics ¿Cómo se interpretan los datos presentes en este archivo? Cada linea del archivo puede contener hasta 10 campos distintos separados por un pipe | Estos son: • • • • • • fecha y hora en formado EPOCH identificador único de la llamada nombre de la cola nombre del agente evento que se ha presentado campos de datos (hasta 5) que contienen los valores devueltos por los eventos de la cola. la posición que tenía al momento de entrar en la cola y el tiempo que esperó antes de colgar. Junto al evento aparecerá el nombre de la cola. Entre ellos.3|NONE|Agent/2000|AGENTLOGIN|SIP/1000-00000003 • AGENTLOGOFF: cuando un agente se desconecta. la posición que tenía el cliente cuando abandonó la cola.7|ventas|SIP/1000|ADDMEMBER| • AGENTDUMP: el agente ha rechazado la llamada mientra el cliente estaba escuchando el anuncio de la cola AGENTLOGIN: cuando un agente se conecta utilizando la aplicación Agentlogin. • Ejemplo: 1323691008|1323691008. leen ese archivo. • Ejemplo: 1323689794|1323689785. ADDMEMBER: cuando se añade un agente dinámico a la cola.

el tiempo que esperó el cliente antes de ser atendido.UNIQUEID de la llamada. y el tiempo que timbró la extensión del agente. la extensión del agente. el tiempo que ha esperado el cliente antes de ser atendido. posición inicial y final del cliente en la cola. Ejemplo: 1323695800|1323694274. la URLsi aplica y el CALLERID del cliente. Ejemplo: 1323531449|NONE|NONE|NONE|CONFIGRELOAD| • CONNECT: cuando un cliente es atendido por un agente. el nombre de cola. el nombre de la cola.2|ventas|SIP/1000|COMPLETECALLER|16|27|1 • CONFIGRELOAD: cuando se recarga la configuración de Asterisk. la extensión del agente.4|ventas|Agent/2000|COMPLETEAGENT|9|50|1 • COMPLETECALLER: cuando un cliente atendido por un agente cuelga la llamada. la variable UNIQUEID. Junto al evento aparecerá . el numero de la tecla presionada (en este caso 8). el canal utilizado cuando se registró y el tiempo en segundos que ha quedado conectado.4|ventas|Agent/2000|CONNECT|9|1323690653. Ejemplo: 1323689825|1323689785. la duración de la llamada y la posición que tenía el cliente al entrar en la cola.5|0 • ENTERQUEUE: cuando un cliente entra en la cola. Ejemplo: 1323690653|1323690653. Junto al evento aparecerá. el nombre de la cola. Junto al evento aparecerá la variable UNIQUEID. el UNIQUEID de la llamada entre cliente y agente. el nombre de la cola.4|ventas|NONE|ENTERQUEUE||1001 • EXITEMPTY: cuando un cliente viene desconectado de la cola porque no hay agentes disponibles. el nombre de la cola. Ejemplo: 1323710320|1323710281. el UNIQUEID de la llamada. la extensión del agente que ha atendido el cliente. y el tiempo que ha esperado en la cola antes de ser desconectado. 296 . la duración de la llamada y la posición inicial que tenía el cliente al entrar en la cola. Junto al evento aparecerá. Ejemplo: 1323690662|1323690653. y la posición del cliente en la cola antes de presionar la tecla. Ejemplo: 1323690712|1323690653. Junto al evento aparecerá el UNIQUEID de la llamada. el tiempo que esperó el cliente antes de ser atendido.3|NONE|Agent/2000|AGENTLOGOFF|SIP/1000-00000003|31 • COMPLETEAGENT: cuando un agente que ha atendido una llamada cuelga. el UNIQUEID de la llamada del cliente. el nombre de la cola. Junto al evento aparecerá el UNIQUEID de la llamada. el numero del agente.17|ventas|NONE|EXITEMPTY|1|1|38 • EXITWITHKEY: el cliente mientras esperaba en la cola ha presionado una tecla.

el numero de la extensión donde ha sido transferida la llamada.34|ventas|SIP/1000|TRANSFER|1002|externas|12|24|1 • UNPAUSE: cuando un agente vuelve a conectarse a la cola utilizando la aplicación UnpauseQueueMember. el tiempo de duración de la llamada entes de la transferencia y la posición del cliente al entrar en la cola. Junto al evento aparecerá el UNIQUEID de la llamada. el nombre de la cola y la extensión del agente. TRANSFER: cuando el cliente.Ejemplo: 1323710850|1323710844. y el tiempo que éste ha esperado antes de ser desconectado PAUSE: cuando un agente se pone en pausa utilizando la aplicación PauseQueueMember de Asterisk. 297 . Junto al evento aparecerá el nombre de la cola y la extensión del agente.31|ventas|SIP/1000|RINGNOANSWER|45000 • SYSCOMPAT: la llamada ha sido contestada por un agente pero ha terminado porque los dos canales (cliente y agente) no eran compatibles. aparecerá también el valor Auto-Pause • Ejemplo1: 1323712960|NONE|ventas|SIP/1000|PAUSE| Ejemplo2: 1323710541|NONE|ventas|SIP/1000|PAUSE|Auto-Pause • QUEUESTART: cuando Asterisk ha sido reiniciado Ejemplo: 1323447241|NONE|NONE|NONE|QUEUESTART| • REMOVEMEMBER: cuando una agente se desconecta de la cola con la aplicación Removequeuemember. ha sido transferido a otra extensión. Junto al evento aparecerá el nombre de la cola y la extensión del agente. el nombre de la cola. Junto al evento aparecerá el UNIQUEID de la llamada. atendido por un agente. el tiempo que ha esperado el cliente en la cola. Junto al evento aparecerá el UNIQUEID de la llamada. la posición final y inicial del cliente en la cola. Junto al evento aparecerá el UNIQUEID de la llamada. • Ejemplo: 1323712663|1323712627. el nombre de la cola. ningún agente lo ha atendido. la extensión del agente que ha atendido la llamada.23|ventas|NONE|EXITWITHKEY|8|1 • EXITWITHTIMEOUT: el cliente ha sido desconectado de la cola porque después del tiempo máximo permitido de espera. Si el agente ha sido desconectado de la cola porque no ha atendido una llamada antes del tiempo configurado. la extensión del agente que no ha contestado la llamada y el tiempo (en milisegundos) que ha timbrado la extensión del agente: • Ejemplo: 1323711528|1323711480. el nombre de la cola. RINGNOANSWER: cuando la extensión de un agente timbra y al agente no contesta dentro del tiempo configurado. el contexto utilizado para la transferencia.

los buzones de voz. `announce` varchar(128) default NULL. aunque el único obligatorio es el nombre de la cola misma. `autopause` varchar(128) default NULL. se entra en MySQL mysql -u root -psesamo se escoge la base de datos asterisk: mysql> use asterisk se crea la tabla para las colas: mysql> CREATE TABLE `queue_table` ( `name` varchar(128) NOT NULL. hay que crear tres tablas distintas. `setinterfacevar` varchar(3) default NULL. En esta tabla se pueden configurar todos los valores presentes para la definición de la cola. `weight` int(11) default NULL.16. una para cada tipo de objectos que se guardarán. `strategy` varchar(128) default NULL.5 Colas. `setqueuevar` varchar(3) default NULL. `penaltymemberslimit` int(11) default NULL. las conferencias. también para las colas es posible trabajar en Realtime. `timeoutpriority` varchar(128) default NULL. `autofill` varchar(128) default NULL. En este caso se puede guardar en Realtime: • • • la configuración de las colas los agentes las estadísticas de la cola Como queda claro por lo arriba mencionado. `announce-frequency` int(11) default NULL. `timeout` int(11) default NULL. `servicelevel` int(11) default NULL. `membermacro` varchar(128) default NULL. `musiconhold` varchar(128) default NULL. agentes y estadísticas en Realtime dinámico Como para las extensiones. `maxlen` int(11) default NULL. 298 . `context` varchar(128) default NULL. `wrapuptime` int(11) default NULL. `setqueueentryvar` varchar(3) default NULL. `retry` int(11) default NULL. Se inicia con la configuración de las colas.

`defaultrule` varchar(128) default NULL. interface) ). `eventwhencalled` varchar(128) default NULL. queue_name varchar(128). `announce-position` varchar(3) default NULL. `queue-thereare` varchar(128) default NULL. `announce-holdtime` varchar(4) default NULL. `queue-seconds` varchar(128) default NULL. membername varchar(40). interface varchar(128). Se crea la tabla para los agentes de las colas: mysql> CREATE TABLE queue_member_table ( uniqueid INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT. paused INT(11). `random-periodic-announce` varchar(3) default NULL. `periodic-announce-frequency` int(11) default NULL. `queue-minutes` varchar(128) default NULL.`min-announce-frequency` int(11) default NULL. `monitor-type` varchar(128) default NULL. `memberdelay` int(11) default NULL. y por ultimo se crea la tabla para guardar las estadísticas de las colas: mysql> CREATE TABLE queue_log ( 299 . `periodic-announce` varchar(512) default NULL. `ringinuse` varchar(3) default NULL. `queue-callswaiting` varchar(128) default NULL. `queue-reporthold` varchar(128) default NULL. `monitor-format` varchar(128) default NULL. `announce-round-seconds` int(11) default NULL. `reportholdtime` varchar(128) default NULL. `queue-thankyou` varchar(128) default NULL. `joinempty` varchar(128) default NULL. `queue-holdtime` varchar(128) default NULL. `eventmemberstatus` varchar(128) default NULL. PRIMARY KEY (`name`) ). `relative-periodic-announce` varchar(3) default NULL. `timeoutrestart` varchar(128) default NULL. `leavewhenempty` varchar(128) default NULL. `queue-minute` varchar(128) default NULL. `announce-position-limit` int(11) default NULL. `queue-youarenext` varchar(128) default NULL. UNIQUE KEY queue_interface (queue_name. penalty INT(11).

index qname (queuename.data3 from queue_log.asterisk.time datetime.queue_table queue_members => odbc.genera para que queden: queues => odbc. Se sale de MySQL y se modifica el archivo del realtime: mysql> quit nano /etc/asterisk/extconfig. event char(20).event. queuename char(50).asterisk. data3 char(50).queue_log Se guardan los cambios y se reinicia Asterisk: service asterisk restart Ahora para probar el log de las colas en realtime.queues => odbc.conf se modifican estas tres lineas: . data2 char(50). index bydate (time).data2. El resultado: 300 .queue_member_table queue_log => odbc. desde la extensión 1000 se marca *70 para conectarse a la cola ventas como agente dinámico y luego desde las demás extensiones se marca el 3001.agent. data4 char(50). callid char(50). El resultado en la base de datos: mysql -u root -psesamo mysql> use asterisk mysql> select time.asterisk . data5 char(50).asterisk. agent char(50).queue_members => odbc.time) ). data1 char(50).queue_log => mysql.asterisk .queuename.data1.

Se sale del cliente MySQL: mysql> quit Como segunda prueba se crea otra cola en realtime. Desde Webmin se entra a la tabla queue_table y se rellenan los campos: 301 .

302 .

303 .

C:0. Desde el Webmin se pasa a la tabla queue_member_table y se añaden dos agentes a la cola creada: 304 . W:1. 0s talktime). A:0. Se vuelve a la consola de Asterisk donde aparecerá la nueva cola: CLI> queue show compras compras has 0 calls (max 50) in 'ringall' strategy (0s holdtime.0% within 120s No Members No Callers que todavía no tienes agentes configurados. SL:0.Se guarda la configuración presionando el botón “Save”.

0s talktime). C:0. A:1.Se vuelve nuevamente a la consola de Asterisk: CLI> queue show compras compras has 0 calls (max 50) in 'ringall' strategy (0s holdtime. 0s talktime). C:0.0% within 120s Members: Fulamo (Agent/2000) (realtime) (Not in use) has taken no calls yet Sutano (Agent/2001) (realtime) (Unavailable) has taken no calls yet No Callers ventas has 0 calls (max 50) in 'ringall' strategy (14s holdtime. SL:0. W:1. Una vez conectado en la consola de Asterisk: CLI> queue show compras has 0 calls (max 50) in 'ringall' strategy (0s holdtime. C:4. SL:0. A:0. A:0. 10s talktime). W:1. SL:100.0% within 120s Members: Fulamo (Agent/2000) (realtime) (Unavailable) has taken no calls yet Sutano (Agent/2001) (realtime) (Unavailable) has taken no calls yet No Callers Para terminar si desde la extensión 1000 se marca 2000 para conectarse como agente 2000. W:0.0% within 120s Members: Agent/2002 (Unavailable) has taken no calls yet 305 .

Agent/2000 (Not in use) has taken no calls yet Agent/2001 (Unavailable) has taken no calls yet SIP/1000 (dynamic) (In use) has taken 4 calls (last was 9443 secs ago) No Callers El agente estará conectado a las dos colas creadas (en negrita). 306 .

.

gz Se entra en la carpeta: cd iaxmodem-1.X. Estos dos módulos se apoyan en las librerías SpanDSP y permiten la recepción y envío de FAX a través de dos protocolos: T30 (audio) y T38 (FoIP – Fax over IP).0 Se compila: .tar.8.2.2.Capitulo XVII Asterisk y los FAX Hasta la versión 1.tar.2. A partir de la versión 1.net/sourceforge/iaxmodem/iaxmodem-1. Asterisk soportaba la recepción y trasmisión de FAX a través del modulo app_fax.0.1 IAXmodem IAXmodem es un módem software. Se descargan las fuentes de IAXmodem: cd /usr/src wget http://switch. En este capitulo se presentará primero una solución basada en la combinación del programa IAXmodem con el servidor de FAX Hylafax.6.2.0. 17.gz Se descomprime el archivo tar -xf iaxmodem-1. para luego abordar el tema del protocolo T38.dl.sourceforge./configure make Se copia el programa compilado en la siguiente carpeta: cp iaxmodem /usr/local/sbin Como se van a crear dos módem IAX2. se crean algunas carpetas y archivos para el correcto funcionamiento de IAXmodem: .X hay dos nuevos módulos: • • res_fax res_fax_spandsp La idea detrás de este cambio es mejorar el soporte del protocolo T38 en Asterisk. escrito en lenguaje C que utiliza un canal IAX2 en lugar de una línea telefónica y un DSP software (SpanDSP) en lugar de un chip DSP (Digital Signal Processing).

mkdir /etc/iaxmodem mkdir /var/log/iaxmodem touch /var/log/iaxmodem/ttyIAX1 touch /var/log/iaxmodem/ttyIAX2 touch /var/log/iaxmodem/iaxmodem En la carpeta de las fuentes de IAXmodem hay un archivo de configuración predefinido para la creación de un módem IAX. Se configura el primero cd /etc/iaxmodem nano ttyIAX1 La lineas son: device /dev/ttyIAX1 owner uucp:uucp mode 660 port 4570 refresh 60 server 127. Esta configuración es valida si IAXmodem está instalado en el mismo servidor donde se instaló Asterisk. en port el puerto y en peername el nombre de la troncal. IMPORTANTE: en la linea codec hay que indicar un codec audio que no utilice algoritmos de compresión. Esto porque el protocolo T30 funciona solamente con canales audio no comprimidos.1 peername iaxmodem1 secret pbx5050 cidname VozToVoice cidnumber XXXXXXXXXX codec alaw Se guardan los cambios. Se pone la contraseña en secret y en cidname y cidnumber nombre y numero telefónico que usará IAXmodem para presentarse a Asterisk. En el caso de dos servidores distintos hay que indicar en la línea server la dirección IP del servidor Asterisk. Se puede tomar como referencia para la creación de los dos módem IAX que se utilizarán para la recepción y envío de FAX con Asterisk.0. Para el segundo IAXmodem la configuración será: nano ttyIAX2 309 .0. Para configurar distintos IAXmodem hay que modificar en la primera línea el nombre del device.

Ahora hay que modificar la configuración de Asterisk para añadir las dos extensiones IAX (iaxmodem1 y iaxmodem2) en el archivo iax.conf Al final del archivo se añaden los dos bloques que siguen: [iaxmodem1] type=friend context=fax disallow=all allow=alaw username=iaxmodem1 secret=pbx5050 qualify=yes notransfer=yes host=dynamic requirecalltoken=auto [iaxmodem2] type=friend context=fax disallow=all allow=alaw username=iaxmodem2 secret=pbx5051 qualify=yes notransfer=yes host=dynamic requirecalltoken=auto Se guardan los cambios y se actualiza la configuración de IAX2 en Asterisk 310 .conf nano /etc/asterisk/iax.1 peername iaxmodem2 secret pbx5051 cidname VozToVoice cidnumber XXXXXXXXXX codec alaw Se guardan los cambios.device /dev/ttyIAX2 owner uucp:uucp mode 660 port 4571 refresh 60 server 127.0.0.

0.d/iaxmodem se vuelve ejecutable: chmod +x /etc/init.0 mv iaxmodem.1' [2011-10-24 09:44:37] Setting peername = 'iaxmodem1' [2011-10-24 09:44:37] Setting secret = 'pbx5050' [2011-10-24 09:44:37] Setting cidname = 'VozToVoice' [2011-10-24 09:44:37] Setting cidnumber = 'XXXXXXXX' [2011-10-24 09:44:37] Setting codec = ulaw [2011-10-24 09:44:37] Opened pty. slave device: /dev/pts/4 [2011-10-24 09:44:37] Created /dev/ttyIAX1 symbolic link Ignoring unknown information element 'Unknown IE' (54) of length 0 [2011-10-24 09:44:37] Registration completed successfully.asterisk -rvvvvvvvvvvvvvvvvvvv CLI> iax2 reload Se abre otra ventana terminal o se crea otra sesión de PuTTy y se hace una prueba para ver si la conexión entre IAXmodem y Asterisk funciona: cd /usr/local/sbin ./iaxmodem ttyIAX1 debe aparecer: [2011-10-24 09:44:37] Modem started [2011-10-24 09:44:37] Setting device = '/dev/ttyIAX1' [2011-10-24 09:44:37] Setting owner = 'uucp:uucp' [2011-10-24 09:44:37] Setting mode = '660' [2011-10-24 09:44:37] Setting port = 4570 [2011-10-24 09:44:37] Setting refresh = 60 [2011-10-24 09:44:37] Setting server = '127.0.d/iaxmodem 311 .fedora /etc/init.2. Se controla que en la consola de Asterisk aparezca la conexión de IAXmodem (volviendo a la otra ventana Terminal abierta): Para iniciar IAXmodem en automático se instala el script presente en la carpeta de las fuentes de IAXmodem: cd /usr/src/iaxmodem-1.init.

255 4570 (E) OK (1 ms) iaxmodem2/iaxmo 127.255.rpm wget ftp://ftp.255 4571 (E) OK (3 ms) 4 iax2 peers [3 online.253.1 (D) 255.0.rpm Se instalan: rpm -ivh hylafax*.5/hylafax-server-6. se puede continuar con la instalación y configuración de Hylafax.255.255.0. 17.e se configura para el inicio automático: chkconfig --add iaxmodem chkconfig iaxmodem on Se inicia el programa: /etc/init. las dos extensiones deben estar registradas: CLI> iax2 show peers Name/Username Host Mask Port Status marko (Unspecified) (D) 255.5/hylafax-client-6. 0 unmonitored] Ahora que IAXmodem ha sido instalado y configurado.255.0.255.206 (D) 255.i386.rpm 312 . 1 offline. Un cliente (FAX) se conecta al servidor (Hylafax) y a través de el envía el FAX Hay que empezar instalando algunas (dependencias) requeridas por Hylafax: yum install ghostscript ghostscript-devel sharutils ghostscript-fonts En la pagina de Hylafax están presentes los paquetes para las distintas distribuciones de Linux: Se descargan los paquetes para CentOS 5 (cliente y servidor): cd /usr/src wget ftp://ftp.org/binary/linux/redhat/6.hylafax.0.1 (D) 255.d/iaxmodem start Volviendo a la consola de Asterisk.0.255 13269 (E) OK (102 ms) iaxmodem1/iaxmo 127.162.org/binary/linux/redhat/6.0.5-1rhel5.255.5-1rhel5.255.2 Hylafax Hylafax es un servidor FAX diseñado para sistemas Linux que se basa en un sistema cliente-servidor.0.255.hylafax.i386.0.255 0 (E) UNKNOWN marko2/marko2 190.

creating one from scratch. Hay que indicar los parámetros como aparecen personalizando el numero de teléfono y el prefijo del país.info. HylaFAX configuration parameters are: [1] Init script starts faxq: [2] Init script starts hfaxd [3] Start paging protocol: Are these ok [yes]? yes yes yes no Se contesta yes. Configuration parameters written to /var/spool/hylafax/etc/setup. No scheduler config file exists. Country code [1]? 57 Area code []? 5 Long distance dialing prefix [1]? 0 International dialing prefix [011]? 00 Dial string rules file (relative to /var/spool/hylafax) ["etc/dialrules"]? Tracing during normal server operation [1]? Default tracing during send and receive sessions [0xffffffff]? Continuation cover page (relative to /var/spool/hylafax) []? Timeout when converting PostScript documents (secs) [180]? Maximum number of concurrent jobs to a destination [1]? Define a group of modems []? Time of day restrictions for outbound jobs ["Any"]? Timeout before purging a stale UUCP lock file (secs) [30]? Max number of pages to permit in an outbound job [0xffffffff]? Syslog facility name for ServerTracing messages [daemon]? The non-default scheduler parameters are: CountryCode: 57 AreaCode: 5 LongDistancePrefix: 0 InternationalPrefix: 00 313 .cache. Luego inicia la configuración de Hylafax. Modem support functions written to /var/spool/hylafax/etc/setup. En negrita los datos que se van insertando desde el teclado.El paso a seguir es la configuración de de Hylafax.modem. Esto se hace a través de la utilidad faxsetup: faxsetup Should an entry be added for the FaxMaster to /etc/aliases [yes]? no Update /var/spool/hylafax/status/any.

No existing configuration..1212]? +5753850962 Local identification string (for TSI/CIG) ["NothingSetup"]? CursoAsterisk Long distance dialing prefix [1]? 0 International dialing prefix [011]? 00 Dial string rules file (relative to /var/spool/hylafax) [etc/dialrules]? Tracing during normal server operation [1]? Tracing during send and receive sessions [11]? Protection mode for received facsimile [0600]? Protection mode for session logs [0600]? Protection mode for ttyIAX1 [0600]? Rings to wait before answering [1]? 2 Modem speaker volume [off]? Command line arguments to getty program ["-h %l dx_%s"]? Pathname of TSI access control list file (relative to /var/spool/hylafax) [""]? Pathname of Caller-ID access control list file (relative to /var/spool/hylafax) [""]? 314 . Reading scheduler config file /var/spool/hylafax/etc/config. Restarting HylaFAX server processes.d/hylafax start Starting HylaFAX queue manager (faxq): [ OK ] Starting HylaFAX server (hfaxd): [ OK ] Restarting HylaFAX modem manager (faxgetty): [ OK ] You do not appear to have any modems configured for use. Country code [57]? Area code [5]? Phone number of fax modem [+1. The manual page config(5F) may be useful during this process. Also be aware that at any time you can safely interrupt this procedure. Modems are configured for use with HylaFAX with the faxaddmodem(8C) command..Are these ok [yes]? yes Creating new configuration file /var/spool/hylafax/etc/config.555.d/init. Should I restart the HylaFAX server processes [yes]? yes /etc/rc. time to setup a configuration file for the modem. let's do this from scratch. Desde la linea que sigue se configura el primer FAX (ttyIAX1) Do you want to run faxaddmodem to configure a modem [yes]? yes Serial port that modem is connected to []? ttyIAX1 Ok.999.

About fax classes: The difference between fax classes has to do with how HylaFAX interacts with the modem and the fax protocol features that are used when sending or receiving faxes.Tag line font file (relative to /var/spool/hylafax) [etc/lutRS18.pcf]? Tag line format string ["From %%l|%c|Page %%P of %%T"]? Time before purging a stale UUCP lock file (secs) [30]? Hold UUCP lockfile during inbound data calls [Yes]? Hold UUCP lockfile during inbound voice calls [Yes]? Percent good lines to accept during copy quality checking [95]? Max consecutive bad lines to accept during copy quality checking [5]? Max number of pages to accept in a received facsimile [25]? Syslog facility name for ServerTracing messages [daemon]? Set UID to 0 to manipulate CLOCAL [""]? Use available priority job scheduling mechanism [""]? The non-default server configuration parameters are: CountryCode: 57 AreaCode: 5 FAXNumber: +5753850962 LongDistancePrefix: 0 InternationalPrefix: 00 DialStringRules: etc/dialrules SessionTracing: 11 RingsBeforeAnswer: 2 SpeakerVolume: off GettyArgs: "-h %l dx_%s" LocalIdentifier: CursoAsterisk TagLineFont: etc/lutRS18. so be patient. Probing for best speed to talk to modem: 38400 OK. or whatever). 315 . this may hang (just go and cable up the modem or turn it on. however. One class isn't inherently better than another. Note that if you do not have the modem cabled to the port.pcf TagLineFormat: "From %%l|%c|Page %%P of %%T" MaxRecvPages: 25 Are these ok [yes]? yes Now we are going to probe the tty port to figure out the type of modem that is attached. one probably will suit a user's needs better than others. or the modem is turned off. This takes a few seconds.

. Product code (ATI0) is "spandsp".1 is similar to Class 2.Class 1 relies on HylaFAX to perform the bulk of the fax protocol.0]? Hmm. but usually any problems encountered in Class 2/2. so we will have to fill in the appropriate parameters by hand.34-fax capability. If you prefer to use your favorite editor instead of this script you should fill things in here as best you can and then edit the configuration file "/var/spool/hylafax/etc/config. Generally any problems encountered in Class 1/1.0 modem. You will need the manual for how to program your modem to do this task. Other information (ATI3) is "www.0 than when using most modems' Class 2 or Class 2. Note that modem commands must be specified exactly as they are to be sent to the modem. Command to enter Class 1 [AT+FCLASS=1. There is no prototype configuration file for your modem. How should it be configured [1. This modem looks to have support for Class 1.0 but adds V. In case you are uncertain of the meaning of a configuration parameter you should consult the config(5F) manual page for an explanation.34-fax capability. Note also that quote marks (") will not be displayed and will automatically be deleted.1 will require the modem manufacturer to resolve it. Modem model is "Unknown".0 and 1.soft-switch. You can use this facility to supply null parameters as "". this looks like a Class 1. Finally. Class 2.org".0 is similar to Class 2 but may include more features. HylaFAX generally will have more features when using Class 1/1..0 can be resolved by modifications to HylaFAX. Using prototype configuration file class1.0]? 316 .0.0/2. Use Class 1 unless you have a good reason not to. DTE-DCE flow control scheme [default]? Modem manufacturer is "Unknown".0 implementations. beware that the set of parameters is long. Class 1.0 is similar to Class 1 but may add V. Class 2. Class 2 relies on the modem to perform the bulk of the fax protocol.ttyIAX1" after completing this procedure.

No existing configuration. Terminada la configuración del primer módem.. let's do this from scratch. el servidor Hyalafax preguntará si se quiere instalar otro.0 Class1PPMWaitCmd: AT+FTS=7 Class1TCFWaitCmd: AT+FTS=7 Class1EOPWaitCmd: AT+FTS=9 Class1FrameOverhead: 4 Class1RecvAbortOK: 200 Class1RecvIdentTimer: 40000 Class1SwitchingCmd: AT+FRS=7 Class1TCFMaxNonZero: 10 Class1TCFMinRun: 1000 Are these ok [yes]? yes Creating new configuration file /var/spool/hylafax/etc/config.saving current file as /var/spool/hylafax/etc/config... Reading scheduler config file /var/spool/hylafax/etc/config. Don't forget to run faxmodem(8C) (if you have a send-only environment) or configure init to run faxgetty on ttyIAX1. Also be aware that at any time you can safely interrupt this procedure.999. time to setup a configuration file for the modem.Command to stop and wait prior to sending PPM [AT+FTS=7]? Command to stop and wait prior to sending TCF [AT+FTS=7]? Command to stop and wait prior to sending EOP [AT+FTS=9]? Extra bytes in a received HDLC frame [4]? Maximum time to wait for OK after aborting a receive (ms) [200]? Maximum wait for initial identification frame (ms) [40000]? Command to ensure silence after receiving HDLC and before sending [AT+FRS=7]? The modem configuration parameters are: Class1Cmd: AT+FCLASS=1. Se contesta con yes y se configura el segundo módem (ttyIAX2) Do you want to run faxaddmodem to configure another modem [yes]? yes Serial port that modem is connected to []? ttyIAX2 Ok.sav. The manual page config(5F) may be useful during this process.1212]? +5753850962 317 . Country code [57]? Area code [5]? Phone number of fax modem [+1.555. ..

pcf TagLineFormat: "From %%l|%c|Page %%P of %%T" MaxRecvPages: 25 Are these ok [yes]? yes Now we are going to probe the tty port to figure out the type 318 .pcf]? Tag line format string ["From %%l|%c|Page %%P of %%T"]? Time before purging a stale UUCP lock file (secs) [30]? Hold UUCP lockfile during inbound data calls [Yes]? Hold UUCP lockfile during inbound voice calls [Yes]? Percent good lines to accept during copy quality checking [95]? Max consecutive bad lines to accept during copy quality checking [5]? Max number of pages to accept in a received facsimile [25]? Syslog facility name for ServerTracing messages [daemon]? Set UID to 0 to manipulate CLOCAL [""]? Use available priority job scheduling mechanism [""]? The non-default server configuration parameters are: CountryCode: 57 AreaCode: 5 FAXNumber: +5753850962 LongDistancePrefix: 0 InternationalPrefix: 00 DialStringRules: etc/dialrules SessionTracing: 11 RingsBeforeAnswer: 2 SpeakerVolume: off GettyArgs: "-h %l dx_%s" LocalIdentifier: CursoAsterisk TagLineFont: etc/lutRS18.Local identification string (for TSI/CIG) ["NothingSetup"]? CursoAsterisk Long distance dialing prefix [1]? 0 International dialing prefix [011]? 00 Dial string rules file (relative to /var/spool/hylafax) [etc/dialrules]? Tracing during normal server operation [1]? Tracing during send and receive sessions [11]? Protection mode for received facsimile [0600]? Protection mode for session logs [0600]? Protection mode for ttyIAX2 [0600]? Rings to wait before answering [1]? 2 Modem speaker volume [off]? Command line arguments to getty program ["-h %l dx_%s"]? Pathname of TSI access control list file (relative to /var/spool/hylafax) [""]? Pathname of Caller-ID access control list file (relative to /var/spool/hylafax) [""]? Tag line font file (relative to /var/spool/hylafax) [etc/lutRS18.

HylaFAX generally will have more features when using Class 1/1. One class isn't inherently better than another. This modem looks to have support for Class 1. Class 2. Product code (ATI0) is "spandsp".0 can be resolved by modifications to HylaFAX. Modem model is "Unknown". Class 2 relies on the modem to perform the bulk of the fax protocol. DTE-DCE flow control scheme [default]? Modem manufacturer is "Unknown". Class 1 relies on HylaFAX to perform the bulk of the fax protocol. but usually any problems encountered in Class 2/2. so we will have to fill in the appropriate parameters by hand. There is no prototype configuration file for your modem.0 modem. one probably will suit a user's needs better than others. Other information (ATI3) is "www.0.0/2. This takes a few seconds. this looks like a Class 1.. 319 . however..0]? Hmm. Generally any problems encountered in Class 1/1.0 implementations.34-fax capability. so be patient. or whatever).of modem that is attached.34-fax capability.0 and 1. How should it be configured [1.org". Using prototype configuration file class1.0 is similar to Class 2 but may include more features. this may hang (just go and cable up the modem or turn it on. Probing for best speed to talk to modem: 38400 OK. or the modem is turned off. Note that if you do not have the modem cabled to the port.0 but adds V. In case you are uncertain of the meaning of a configuration parameter you should consult the config(5F) manual page for an explanation. Class 2.soft-switch. Class 1.0 than when using most modems' Class 2 or Class 2.1 is similar to Class 2. About fax classes: The difference between fax classes has to do with how HylaFAX interacts with the modem and the fax protocol features that are used when sending or receiving faxes. Use Class 1 unless you have a good reason not to.0 is similar to Class 1 but may add V.1 will require the modem manufacturer to resolve it. You will need the manual for how to program your modem to do this task.

0 Class1PPMWaitCmd: AT+FTS=7 Class1TCFWaitCmd: AT+FTS=7 Class1EOPWaitCmd: AT+FTS=9 Class1FrameOverhead: 4 Class1RecvAbortOK: 200 Class1RecvIdentTimer: 40000 Class1SwitchingCmd: AT+FRS=7 Class1TCFMaxNonZero: 10 Class1TCFMinRun: 1000 Are these ok [yes]? yes Creating new configuration file /var/spool/hylafax/etc/config... beware that the set of parameters is long. Don't forget to run faxmodem(8C) (if you have a send-only environment) or configure init to run faxgetty on ttyIAX2... Done setting up the modem configuration. leaving existing file unchanged. Finally.ttyIAX2 for faxgetty. Creating fifo /var/spool/hylafax/FIFO.everything looks ok.ttyIAX2" after completing this procedure. Command to enter Class 1 [AT+FCLASS=1. Note also that quote marks (") will not be displayed and will automatically be deleted.. .0]? Command to stop and wait prior to sending PPM [AT+FTS=7]? Command to stop and wait prior to sending TCF [AT+FTS=7]? Command to stop and wait prior to sending EOP [AT+FTS=9]? Extra bytes in a received HDLC frame [4]? Maximum time to wait for OK after aborting a receive (ms) [200]? Maximum wait for initial identification frame (ms) [40000]? Command to ensure silence after receiving HDLC and before sending [AT+FRS=7]? The modem configuration parameters are: Class1Cmd: AT+FCLASS=1. done. 320 .Note that modem commands must be specified exactly as they are to be sent to the modem. If you prefer to use your favorite editor instead of this script you should fill things in here as best you can and then edit the configuration file "/var/spool/hylafax/etc/config. Checking /var/spool/hylafax/etc/config for consistency.ttyIAX2. You can use this facility to supply null parameters as ""....

This means that you must use the faxmodem program to inform the new faxq process about the modems you want to have scheduled by HylaFAX. Ahora se configura faxgetty en el archivo inittab de forma que la utilidad se inicie al arrancar el servidor Linux: nano /etc/inittab después de esta linea: #6:2345:respawn:/sbin/mingetty tty6 se pone: fax1:2345:respawn:/usr/sbin/faxgetty ttyIAX1 fax2:2345:respawn:/usr/sbin/faxgetty ttyIAX2 Se guardan los cambios y se recarga la configuración de inittab: init q Se averigua que faxgetty este corriendo para los dos FAX: ps aux | grep ttyIAX 321 . Beware that if you have modems that require non-default capabilities specified to faxmodem then you should read faxmodem(8C) manual page and do this work yourself (since this script is not intelligent enough to automatically figure out the modem capabilities and supply the appropriate arguments). El servidor de FAX avisará que para que las llamadas sean contestadas en automático hay que configurar faxgetty (la utilidad que se encarga de esta tarea) y si se quiere iniciar faxmodem para los dos FAX configurados (se contesta yes): You do not appear to be using faxgetty to notify the HylaFAX scheduler about new modems and/or their status. Should I run faxmodem for each configured modem [yes]? yes /usr/sbin/faxmodem ttyIAX1 /usr/sbin/faxmodem ttyIAX2 Done verifying system setup.Hylafax preguntará si se quiere configurar otro módem: Do you want to run faxaddmodem to configure another modem [yes]? no Se contesta no. La configuración de los dos módem ha terminado.

se añade un pequeño retraso en la configuración de los módem de forma que si se pierde la conexión.ttyIAX2 al final del archivo se añade esta linea: Class1SwitchingCmd: "<delay:7>" Para recibir una notificación si el fax ha sido enviado hay que modificar el archivo de configuración de Hylafax (la recibirá el usuario root): nano /etc/hylafax/hyla.conf 322 .Se reinicia Hylafax /etc/init.com: Running Modem ttyIAX2 (+5753850962): Running and idle Modem ttyIAX1 (+5753850962): Running and idle Para mejorar la recepción y envío de los FAX.linode.ttyIAX1 al final del archivo se añade esta linea: Class1SwitchingCmd: "<delay:7>" Lo mismo se hace con el módem ttyIAX2: nano /var/spool/hylafax/etc/config.members.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 ] Shutting down HylaFAX queue manager (faxq): [ OK ] Todos los archivos de configuración que se crearán a lo largo del proceso de configuración de Hylafax se guardaran en las carpeta /var/spool/hylafax/etc y /etc/hylafax Para controlar el estado de Hylafax y de los FAX configurados se usa este comando: faxstat El resultado es: HylaFAX scheduler on li370-135. se intentará reajustarla: nano /var/spool/hylafax/etc/config.

d/hylafax restart Por ultimo se indica que todos los mensajes de correo electrónico para el usuario Faxmaster se envíen al usuario root: nano /etc/aliases después de esta linea: support: postmaster se pone: FaxMaster: root Se guardan los cambios y se recarga la configuración: newaliases Prueba envío. Para el envío de los FAX se crea en extension.conf un contesto [fax] (El mismo que se ha configurado para las dos extensiones iaxmodem en iax.si cambia esta linea: #Notify: Done para que quede Notify: Done Para recibir los FAX entrantes a una dirección de correo electrónico externa al servidor: nano /var/spool/hylafax/etc/FaxDispatch se cambia esta linea: SENDTO=FaxMaster para que quede (personalizar la dirección de correo electrónico): SENDTO=fulano@gmail.com Se reinicia Hylafax: /etc/init. con las siguientes líneas: 323 .conf) antes del contexto internas.

8.1. si existe. En la parte general del archivo sip.1. esto significa que si el sistema detecta que la llamada está llegando desde un FAX. En este caso con el módem ttyIAX1 se enviará el FAX y con el módem ttyIAX2 se recibirá. sino se llamará la extensión 1000. Se guardan los cambios y actualiza el dialplan: /etc/init.X Nombre Apellido Se guardan los cambios.hangup El flujo del dialplan es: se contesta la llamada entrante.txt 324 .1.conf.Wait(6) same => n.txt y se pone: Libro Asterisk 1. el segundo es para probar el fax en local.Hangup exten => 1234.txt> Se crea el archivo de texto que se enviará: nano /tmp/pruebafax. prioridad 1 donde se contestará con el modem FAX iaxmodem2. Hay que tener en cuenta que cuanto se trabaja con pura lineas VoIP el envío y la recepción de los FAX no siempre funciona bien. se esperan 4 segundos para permitir a Asterisk reconocer si la llamada procede de un fax.Dial(SIP/1000.. automáticamente “saltará”. Por eso se hace esta prueba.45) exten => fax.Answer same => n.Dial(IAX2/iaxmodem2) same => n. sendfax -h ttyIAX1@localhost -n -d numerolocal /tmp/pruebafax. Para probarlo.hangup El primer bloque es para enviar FAX a números externos. se ha configurado el parámetro faxdetect en yes.1.Dial(SIP/justvoip/${EXTEN}) same => n. Si procede de un fax se va a la extensión fax.d/asterisk reload Para enviar un fax con el cliente Hylafax la sintaxis es: sendfax -h modem -n -d <faxnumber> <file.nano /etc/asterisk/extensions.conf [fax] exten => _X.Dial(IAX2/iaxmodem2) same => n. a la extensión fax. en el mismo contexto fax se añade otro bloque: exten => 1235.

txt request id is 1 (group id 1) for host localhost (1 file) Se puede controlar el estado del envío con el siguiente comando: faxstat -s HylaFAX scheduler on li374-112.ps Default options: -f Courier -1 -p 11bp -o 0 Se ha producido un error al convertir el documento.txt'" es porque hay un problema con los fonts de Ghostscrpt.members. Si sale este error: Usage: /usr/sbin/textfmt [-1] [-2] [-B] [-c] [-D] [-f fontname] [-F fontdir(s)] [-m N] [-o #] [-p #] [-r] [-U] [-Ml=#. Se guardan los cambios y se vuelve a enviar el fax: sendfax -h ttyIAX1@localhost -n -d 1234 /tmp/pruebafax.t=#.GS y se modifica la linea 92: /Courier-Bold Para que quede: /Courier-Bold (n022004l.b=#] [-V #] files.. Para solucionarlo se abre el siguiente archivo: nano /usr/share/ghostscript/8. el comando fue "/usr/sbin/textfmt -B -f CourierBold -Ml=0.txt En lugar de “numerolocal” se pone el numero definido en el contexto [fax] para la prueba en local.Utilizando el numero local sería: sendfax -h ttyIAX1@localhost -n -d 1234 /tmp/pruebafax.pfa) . /NimbusMonL-Bold .70/Resource/Init/Fontmap.com: Running Modem ttyIAX2 (+5753850962): Running and idle Modem ttyIAX1 (+5753850962): Initializing server JID Pri S Owner Number Pages Dials TTS Status 1 127 R root 1234 0:1 0:12 Se entra en la consola de Asterisk y se mira que aparece: asterisk -rvvvvvvvvvvvvv cuando termine la llamada se sale de la consola: 325 ..4in -p 11 -s default >'/tmp//sndfaxlBau98' <'/tmp/pruebafax.r=#.linode. >out.

members.linode.CLI> quit y se controla que ha pasado: faxstat -s HylaFAX scheduler on li374-112.com: Running Modem ttyIAX2 (+5753850962): Running and idle Modem ttyIAX1 (+5753850962): Running and idle En este caso el fax se ha enviado con éxito ya que los dos FAX configurados están disponibles. ¿Cómo puedo comprobarlo? Abriendo el correo del usuario root (desde terminal o webmin): y comprobando que el fax enviado ha llegado al correo electrónico definido a lo largo de la configuración de Hylafax: 326 .

3 Protocolo T38 Se pone una hoja en la “maquina”.Abriendo el PDF: Si se quiere usar un cliente con interfaz gráfica para el envío de fax. una buena solución es YajHFC (Yet another Java HylaFAX Client) que siendo escrito completamente en JAVA funciona con cualquier sistema operativo. Esta sencilla operación es la que se hace cuando se quiere enviar un FAX. 17. Todo lo 327 . En el caso que se utilice un cliente remoto en el cortafuegos hay que abrir el puerto 4559 TCP (usado por Hylafax) y los puertos desde el 30000 hasta el 65000 TCP para los datos. se marca el numero de teléfono de destino y se espera que salga un OK por algún lado. Otra solución más elaborada es AvantFAX.

Este Gateway se encarga de transformar el FAX en el formato requerido para ser enviado a través de la red Internet.30 En 1998 la misma organización define un nuevo protocolo que permite recibir y enviar fax usando una red a paquetes (Internet).38? Quizás la imagen que sigue ayuda para entender: El FAX está conectado a la línea telefónica y también a un Gateway con soporte T.38 se encarga de “decodificar” los paquetes que lleguen para luego pasar el resultado al fax de destinación. Un Gateway T. La sigla de este protocolo es T. Las dos maquinas FAX negocian todos los pasajes y para hacerlo utilizan un protocolo. Ese protocolo ha sido definido por la “International Telecommunication Union” y tomó como sigla T.38 clásico funciona como se muestra en la imagen que sigue: 328 .38.38. En el lado opuesto otro Gateway T. ¿Cómo funciona el protocolo T.que pasa en el “mientras” es totalmente transparente.

El paquete UDPTL está encapsulado en un paquete UDP (protocolo de trasporte) que a su vez está encapsulado en un paquete IP (protocolo que permite al paquete llegar a destinación).8. En el caso de Asterisk el único protocolo de trasporte permitido es UDPTL que funciona de la siguiente forma: Cada paquete UDPTL contiene encapsulado el paquete IFP (que contiene los datos del fax que se está enviando y un sistema de corrección de errores – FEC [forward error correction]). es decir que no está “en el medio” a 329 . Para repetir los paquetes perdidos y controlar que lleguen en el justo orden hay disponibles dos sistemas: • • Con el primero se repite el ultimo paquete enviado como FEC para el paquete que se está enviando Con el segundo se crea un paquete de paridad para un numero determinado de paquetes IFP y se incluye esta información en el paquete UDPTL corriente.38 negociar el protocolo de trasporte.X soporta el protocolo T. TCP o RTP.30 vienen analizados y manipulados para luego ser transformados en paquetes (IFP).38 solamente como pasarela. Será tarea de los Gateway T. Los paquetes se pueden enviar usando tres protocolos de transporte: UDPTL.Los datos del FAX T. Asterisk 1.

which is a FAX technology agnostic module that utilizes FAX technology resource modules to complete a FAX transmission.38 que se hagan cargo de la tarea de enviar/recibir el fax. Session arguments can be set by the FAXOPT function and to check results of the ReceiveFax() application. A un lado y al otro de la trasmisión deberán estar dos Gateway T. [Syntax] ReceiveFAX(filename[.lo largo del envío del fax.conf).options]) [Arguments] options d: Enable FAX debugging. s: Send progress Manager events (overrides statusevents setting in res_fax.38 capable channels. [Description] This application is provided by res_fax. f: Allow audio fallback FAX transfer on T. [Description] This application is provided by res_fax. Desde la consola: asterisk -rvvvvvvvvvvvvvvvv Se controla la sintaxis de las dos aplicaciones contenidas en el modulo app_fax CLI> core show application ReceiveFax -= Info about application 'ReceiveFAX' =[Synopsis] Receive a FAX and save as a TIFF/F file. 330 . Session arguments can be set by the FAXOPT function and to check results of the SendFax() application. CLI> core show application SendFax -= Info about application 'SendFAX' =[Synopsis] Sends a specified TIFF/F file as a FAX. En Asterisk el envío y recepción de faxes es posible a través de la librería SpanDSP y el modulo res_fax. which is a FAX technology agnostic module that utilizes FAX technology resource modules to complete a FAX transmission.

38 en Asterisk hay que modificar este archivo: mv /etc/asterisk/udptl.conf Se pone: [general] udptlstart=4000 udptlend=4099 udptlchecksums=yes udptlfecentries = 3 udptlfecspan = 3 use_even_ports = no Se guardan los cambios y se vuelve a arrancar Asterisk: /etc/init.d/asterisk restart 17.38 reinvite on the channel if the remote end does not..3.con.options]) [Arguments] filename2 TIFF file to send as a FAX. options d: Enable FAX debugging. z: Initiate a T.38..[Syntax] SendFAX([filename2[&.conf /etc/asterisk/udptl. En Voip-info aparece una lista (aunque no muy actualizada).1 Aplicación ReceiveFax Para el test que se va a ejecutar hay que modificar el dialplan: nano /etc/asterisk/extensions. s: Send progress Manager events (overrides statusevents setting in res_fax. Algunos ATA comercializados soportan el protocolo T.conf).]][. f: Allow audio fallback FAX transfer on T.old nano /etc/asterisk/udptl.38 capable channels. Para el soporte T.conf 331 .

Answer same => n. FAXERROR ${FAXERROR}) same => n.30 Changing from phase T30_PHASE_E to T30_PHASE_CALL_FINISHED 332 . Como se ha activado la opción de debug (d).30 Changing from state 2 to 32 [Mar 23 07:18:03] FAX[11707]: res_fax.warning.hangup Para que quede: exten => 1234.Noop(FAXSTATUS ${FAXSTATUS}.1.warning.Receivefax(/tmp/${UNIQUEID}.df) same => n.conf se modifica esta linea: console => notice. state 2 [Mar 23 07:18:03] FAX[11707]: res_fax. nano /etc/asterisk/logger.tif.c:655 ast_fax_log: FLOW T.error. Las ultimas lineas: [Mar 23 07:18:03] FAX[11707]: res_fax.error para que quede: console => notice. para ver los datos en la consola de Asterisk hay que modificar el archivo logger. Se abordará la configuración del archivo de forma más detallada en el capitulo 20.fax Se guardan los cambios y se actualiza la configuración de Asterisk: service asterisk reload Se envía el mismo archivo txt utilizado anteriormente: sendfax -h ttyIAX1@localhost -n -d 1234 /tmp/pruebafax.1.1.c:655 ast_fax_log: FLOW T.c:655 ast_fax_log: FLOW T.se modifica este bloque: exten => 1234.Dial(IAX2/iaxmodem2) same => n.Hangup Se guardan los cambios.Hangup exten => h.txt entran en la consola de Asterisk y miran los resultados del envío: asterisk -rvvvvvvvvvvvvvvvvv Encontraremos todo el debug de la recepción del fax con el protocolo T30.30 Send complete in phase T30_PHASE_E.conf que es donde se configuran los distintos registros de Asterisk.

el identificativo del llamante 333 . "FAXSTATUS SUCCESS.0. FAXERROR ") in new stack -.c:655 ast_fax_log: FLOW FAX Set tx type 9 [Mar 23 07:18:03] FAX[11707]: res_fax. 1234. En el escenario que se va a presentar se llamará el numero de destino usando el chan_local.c:655 ast_fax_log: FLOW FAX FAX exchange complete -. Se entra en la carpeta /tmp y se mira si efectivamente está presente un archivo tiff: ls /tmp 1332505066.Executing [h@fax:2] Hangup("IAX2/iaxmodem1-3347".3. Un callfile es un archivo de texto donde se definen unas cuantas acciones que Asterisk ejecuta.c:655 ast_fax_log: FLOW FAX Set rx type 9 [Mar 23 07:18:03] FAX[11707]: res_fax. "") in new stack == Spawn extension (fax. se ha recibido con éxito.el canal que se va a usar para efectuar la llamada y el numero a llamar. Asterisk controla periódicamente esta carpeta a través del modulo pbx_spool. Para solucionar este problema hay que hacer uso de un callfile. En este caso se llamará la extensión 1234. pasar el procesamiento del dialplan a esa extensión.[Mar 23 07:18:03] FAX[11707]: res_fax. "") in new stack El fax. El canal Local es un pseudo canal que permite llamar una extensión y un determinado contexto y. una vez preparado se mueve (no se copia) en la carpeta /var/spool/asterisk/outgoing. cuando la extensión conteste. contexto fax que es donde se ha configurado la aplicación para recibir los FAX. Callerid: "FAX" .c:655 ast_fax_log: FLOW FAX FAX exchange complete [Mar 23 07:18:03] FAX[11707]: res_fax. la aplicación para enviar FAX en Asterisk es SendFax.Executing [h@fax:1] NoOp("IAX2/iaxmodem1-3347".]][. Una vez que el destinatario conteste se enviará el archivo Ttiff (la aplicación SendFax solo acepta archivos tiff).2 Applicación SendFax Como se ha visto en el párrafo 17.tif 17. 3) exited non-zero on 'IAX2/iaxmodem1-3347' -.options]) El problema es que con esta aplicación no se puede llamar directamente un FAX en cuanto no hay posibilidad de indicar el numero a marcar. El callfile que se va a utilizar: Channel: Local/1234@fax ..so y si hay un archivo de este tipo lo procesa. como indica la parte en negrita..Executing [1234@fax:3] Hangup("IAX2/iaxmodem1-3347".3. La sintaxis es muy sencilla: SendFAX([filename2[&.

tif . en el registro de las llamadas (CDR) se contabilizará la llamada a la extensión 1000 Application: SendFax .dz Ahora se mueve el archivo en la carpeta /var/spool/asteisk/outgoning mv enviofax /var/spool/asterisk/outgoing Se entra en la consola de Asterisk: asterisk -rvvvvvvvvvvvvvvv Mar 23 07:26:51] FAX[11883]: res_fax.30 Changing from phase T30_PHASE_E to T30_PHASE_CALL_FINISHED [Mar 23 07:26:51] FAX[11883]: res_fax.c:655 ast_fax_log: FLOW T.c:655 ast_fax_log: FLOW FAX Set rx type 9 334 .c:655 ast_fax_log: FLOW T.30 Changing from state 2 to 32 [Mar 23 07:26:51] FAX[11883]: res_fax.WaitTime: 30 .c:655 ast_fax_log: FLOW T.10.30 Send complete in phase T30_PHASE_E. una vez que el destinatario conteste se ejecuta la aplicación sendfax Data: /tmp/1329843102.el nombre del archivo que se enviará (cambiar el nombre con el que hay en la carpeta /tmp) El resultado del archivo sin los comentarios será: cd /tmp nano enviofax Channel: Local/1234@fax Callerid: "FAX" WaitTime: 30 Maxretries:3 RetryTime: 300 Account: 1000 Application: SendFax Data: /tmp/1332505066.tif. state 2 [Mar 23 07:26:51] FAX[11883]: res_fax.Se espera un respuesta por 30 segundos Maxretries:3 :se intentará llamar el numero tres veces RetryTime: 300 .0. entre un intento y otro se esperarán 300 segundos Account: 1000 .

0.Channel 'SIP/justvoip-00000001' sending FAX: -.38 mode [Mar 23 07:33:58] NOTICE[11945]: pbx_spool.dz mv enviofax /var/spool/asterisk/outgoing El resultado en la consola de Asterisk (la parte en negrita): -.c:655 ast_fax_log: FLOW FAX FAX exchange complete -. 335 .tif.c:2225 sendfax_exec: error initializing channel 'SIP/justvoip-00000001' in T. 3) exited non-zero on 'Local/1234@fax-ee6a.0. uncomment one of the following lines. hay que utilizar un proveedor VoIP que lo soporte.[Mar 23 07:26:51] FAX[11883]: res_fax.conf.0.2". 1234.38 negotiation failed./tmp/1332505066.2".c:655 ast_fax_log: FLOW FAX Set tx type 9 [Mar 23 07:26:51] FAX[11883]: res_fax.0. Si se quiere probar el envío con el protocolo T38.Executing [h@fax:1] NoOp("Local/1234@fax-ee6a. "FAXSTATUS SUCCESS.2".2' -.c:655 ast_fax_log: FLOW FAX FAX exchange complete [Mar 23 07:26:51] FAX[11883]: res_fax.tif. > Launching SendFax(/tmp/1332505066.tif [Mar 23 07:33:58] WARNING[11945]: res_fax. FAXERROR ") in new stack -. cosa que no hace Justvoip como se puede ver con esta prueba: nano enviofax Channel: SIP/justvoip/003907331870494 Callerid: "FAX" WaitTime: 30 Maxretries:3 RetryTime: 300 Account: 1000 Application: SendFax Data: /tmp/1332505066. "") in new stack == Spawn extension (fax.Executing [1234@fax:3] Hangup("Local/1234@fax-ee6a. [Mar 23 07:33:58] ERROR[11945]: res_fax. "") in new stack Esto significa que el fax se ha enviado con éxito utilizando el protocolo T30. En la configuración del chan_dahdi.tif. For fax detection.Executing [h@fax:2] Hangup("Local/1234@fax-ee6a.Attempting call on SIP/justvoip/003907331875163 for application SendFax(/tmp/1332505066. The default is *OFF* .d) on SIP/justvoip-00000001 -.c:1996 sendfax_t38_init: Audio FAX not allowed on channel 'SIP/justvoip-00000001' and T.d) (Retry 1) == Using SIP RTP CoS mark 5 > Channel SIP/justvoip-00000001 was answered. aborting.c:366 attempt_thread: Call completed to SIP/justvoip/003907331875163 El discurso cambia si para recibir FAX se utilizan las normales lineas telefónicas. hay unos parámetro relacionados con los FAX: . La calidad es mucho mejor.

faxdetect=both .faxbuffers=>6. 336 .full De esta forma. . buffer policy. When this configuration . salientes o desactivar la opción. after a fax tone is detected.faxdetect=no .faxdetect=outgoing . call is torn down.. option is used. The sample below will result in 6 buffers and a full . one could use 'faxbuffers' to configure the DAHDI . The faxbuffer policy is reverted after the . When 'faxdetect' is used. . para cada canal se puede definir si tiene que reconocer los FAX en las llamadas entrantes.faxdetect=incoming . transmit buffer policy. the faxbuffer policy will be used for the life of the call . The default is *OFF*.

.

Al final del archivo: [serverB] type=friend remotesecret=pass2 context=internas qualify=yes host=dynamic language=es disallow=all allow=gsm allow=ulaw allow=alaw . A y B. Las extensiones del servidor A son de 4 cifras y empiezan por 1. en el servidor B son de 4 cifras y empiezan por el mismo numero 1. Servidor A nano /etc/asterisk/sip. Además.Capitulo XVIII Conexiones entre servidores Asterisk Este capitulo es dedicado a la conexiones entre servidores Asterisk.conf En el bloque register se añade: register => serverA:pass1@IPserverB/serverB En lugar del IPserverB se pone la dirección IP del servidor B. desde la otra sede se podrán sacar las llamadas utilizando esos Gateway/Tarjetas. y se quiere conectarlos entre ellos utilizando el protocolo SIP para llamar desde A las extensiones de B y desde B las extensiones de A. Un escenario típico de este tipo de configuración es cuando una empresa tiene sedes en distintos lugares y quiere que las extensiones de una sede puedan comunicarse con las extensiones de la otra.1 Conectar dos servidores Asterisk con el protocolo SIP Hay dos servidores Asterisk. si en una de las sedes están instalados Gateway/Tarjetas FXO. Se presentarán cinco tipos de conexiones: • • • • • Conexiones SIP con nombre de usuario y contraseña Conexiones IAX2 con autentificación sobre IP Conexiones distribuidas con el protocolo DUNDi Conexiones sobre OpenVPN Conexiones SIP con protocolo SIP TLS y audio cifrado (SRTP) 18.

IMPORTANTE: cuando se conectan dos servidores Asterisk entre ellos.conf En el bloque register se añade:: register => serverB:pass2@IPserverA/serverA al final del archivo: [serverA] type=friend remotesecret=pass1 context=internas host=dynamic language=es qualify=yes disallow=all allow=gsm allow=ulaw allow=alaw Ahora que los dos servidores están configurados hay que reiniciarlos. Con las líneas que están después de la etiqueta [serverB] se define una extensión SIP que será aquella usada por el servidor B para conectarse al servidor A. En los dos se escribe el comando: /etc/init.164. Si se quiere que el servidor B tenga acceso solamente a un determinado contexto.196. 26 Oct 2011 10:17:54 339 . si no existe.X de Asterisk) Se guardan los cambios y se pasa al servidor B.Con la línea de register. en la configuración de la extensión ya no se utiliza el parámetro secret sino el parámetro remotesecret (esto desde la versión 1.d/asterisk restart Desde la consola se averigua que haya conexión entre los dos servidores: asterisk -rvvvvvvvvvvvvvv para el servidor A: CLI> sip show registry 69. se crea ese contexto en el dialplan.73:5060 N serverA 105 Registered Wed. Servidor B nano /etc/asterisk/sip.1.6. el servidor B tendrá acceso a todo el dialplan definido en ese contexto. se conecta el servidor serverA al servidor serverB. se modifica la linea context poniendo un nombre de contexto y. Con contexto=internas.

1.conf En el contexto internas (para las llamadas a extensiones del servidor B) se añade: exten => _*1XXX.164.121.196.CLI> sip show peers serverB/serverA 69.73 para el servidor B: CLI> sip show registry 96. 26 Oct 2011 10:18:42 CLI> sip show peers serverA/serverB 96.NoOp() same => n. Servidor A nano /etc/asterisk/extensions.30) same => n.135:5060 N D N 5060 OK (1 ms) serverB 105 Registered 5060 OK (2 ms) Wed.30) same => n.121.conf En el contexto internas (para las llamadas a extensiones del servidor A) se añade: exten => _*1XXX.Dial(SIP/serverB/${EXTEN:1}. Para diferenciarlas de las llamadas entre las extensiones locales del servidor A se añade un * delante de las cuatro cifras a marcar.126.126.Dial(SIP/serverA/${EXTEN:1}. Ejemplo: para marcar a la extensión 1000 del servidor B.135 D Ahora lo único que hace falta es modificar el archivo extensions. Se actualiza la configuración en los dos servidores: asterisk -rvvvvvvvvvvvvvvv 340 .NoOp() same => n. hay que digitar el siguiente numero: *1000 Servidor B nano /etc/asterisk/extensions.Hangup() Con estas líneas se configura Asterisk para que todas las llamadas con destino las extensiones cuyo numero empiece por 1 y sean de 4 cifras sean redirigidas hacia el servidor B.1. Para diferenciarlas de las llamadas entre las extensiones locales del servidor A se añade un * delante de las cuatro cifras a marcar.conf de ambos servidores.Hangup() Con estas líneas se configura Asterisk para que todas las llamadas con destino las extensiones cuyo numero empiece por 1 y sean de 4 cifras sean redirigidas hacia el servidor B.

Para solucionar el problema.Hangup() Servidor B nano /etc/asterisk/extensions.conf modificar estas lineas: exten => _*1XXX.247>.Dial(SIP/serverB/${EXTEN:1}. Set(CALLERID(num)=serverA) same => n.144.NoOp() same => n. digest has <serverA> [2011-01-25 22:42:24] NOTICE[14692]: chan_sip.1.Hangup() para que quede: exten => _*1XXX.1.30) same => n.30) same => n.CLI> dialplan reload Prueba Desde la extensión 1000 del servidor A se marca *1000 para llamar la extensión 1000 del servidor B y se mira lo que pasa en la consola de Asterisk del servidor B: [2011-01-25 22:42:24] WARNING[14692]: chan_sip.Dial(SIP/serverB/${EXTEN:1}.1.c:12849 check_auth: username mismatch.conf modificar este bloque exten => _*1XXX. ¿Porqué pasa eso? Porque el servidor B piensa que la llamada esté llegando desde la extensión 1000 local y no logra distinguir entre extensión 1000 local y extensión 1000 remota. hay que modificar el plan de llamadas en ambos servidores.c:20212 handle_request_invite: Failed to authenticate device "Fulano" <sip:1000@178.79. have <1000>.NoOp() same => n. Servidor A nano /etc/asterisk/extensions.30) same => n.tag=as2e5f74a9 La llamada no funciona.Hangup() 341 .Dial(SIP/serverA/${EXTEN:1}.

Suponiendo que la direcciones IP publicas sean: Servidor A: IP: 96.49. llamada trunking. "SIP/serverB/1000. hay un notable ahorro de banda. Este tipo de configuración se necesita solamente si las extensiones de los dos servidores Asterisk tienen los mismos números asignados.216 nome trunk: serverb Extensiones: 1000-1001-1002 Servidor A Si abre el archivo iax.Dial(SIP/serverA/${EXTEN:1}.2 Conectar dos servidores Asterisk con el protocolo IAX2 En este párrafo se ilustrará como conectar dos servidor Asterisk a través del protocolo IAX2 y la autentificación con dirección IP. La ventaja de IAX2 está en su característica. no hace falta modificar el CALLERID antes de marcar.30") in new stack == Using SIP RTP CoS mark 5 == Using SIP VRTP CoS mark 6 == Using UDPTL CoS mark 5 -.1.126. En la consola de Asterisk del servidor A aparecerá: Executing [*1000@externas:1] Set("SIP/1000-00000004".para que queden: exten => _*1XXX. "CALLERID(num)=serverA") in new stack -.conf 342 . Esta conexión se implementará utilizando las direcciones IP publicas de los Servidores. que utiliza el mismo trunk para el envío del audio de todas las llamadas. Set(CALLERID(num)=serverB) same => n.30) same => n.112 nome trunk: servera Extensiones: 1000-1001-1002 Servidor B: IP: 66.228. En el caso de servidores Asterisk con números de extensiones distintos.conf nano /etc/asterisk/iax.Called serverB/1000 -. 18.SIP/serverB-00000005 is ringing La llamada funciona.Executing [*1000@externas:2] Dial("SIP/1000-00000004".125.Hangup() Se actualiza el dialplan en ambos servidores y se intenta llamar nuevamente desde el servidor A el numero *1000. De esta forma cuando hay un numero considerable de llamadas que estén pasando por la troncal IAX2.

126.126.255.conf se añaden las lineas: [servera] type=friend host=96.255 4569 (T) (E) OK (1 ms) CLI> quit En el dialplan se crea un nuevo bloque que permita llamar de un servidor a otro: 343 . Servidorr B nano /etc/asterisk/iax.216 trunk=yes context=internas qualify=yes Es importante destacar que la IP que se define es la del servidor B.49.al final del archivo se añaden las siguientes lineas: [serverb] type=friend host=66.228.112 trunk=yes context=internas qualify=yes Se actualiza la configuración en ambos servidores: asterisk -rvvvvvvvvv CLI> iax2 reload Se averigua que haya conexión entre los servidores (servidor A): CLI> iax2 show peers serverb 66.255.112 (S) 255.255.228.255.125.49. además se utilizará en la configuración la funcionalidad del trunkink IAX2 El mismo procedimiento se ejecuta en el servidor B.125.255 4569 (T) (E) OK (1 ms) Servidor B: CLI> iax2 show peers servera 96.216 (S) 255.

112 (format alaw) -.Dial(IAX2/servera/${EXTEN:2}) same => n.conf se añaden las siguientes lineas en el contexto internas: exten => _*1100X.Dial(IAX2/serverb/${EXTEN:2}) same => n.Hangup se actualiza el dialplan: asterisk -rx "dialplan reload" Ahora se pueden efectuar las pruebas.1. la solución más funcional es el protocolo DUNDi.125.Format for call is alaw -.3 El protocolo DUNDi Cuando hay que conectar un numero considerable de servidores Asterisk y compartir las rutas y las extensiones configuradas en cada uno de ellos. En la consola Asterisk del servidor A aparecerá: -. Desde la extensión 1000 del servidor A.Called IAX2/servera/1000 -.IAX2/servera-17542 answered SIP/1000-00000000 18. "IAX2/servera/1000") in new stack -. DUNDi (Distributed Universal Number Discovery) es un protocolo que permite buscar y compartir dialplan entre servidores Asterisk.conf se añaden las siguientes lineas en el contexto internas: exten => _*1100X. sino que los servidores pueden asumir uno u otro rol según el contexto.Hangup se actualiza el dialplan: asterisk -rx "dialplan reload" Servidor B nano /etc/asterisk/extensions. Esto por medio de una red Peer-to-peer (punto-a-punto) en la cual no existen roles fijos de clientes y servidores.Executing [*11000@externas:1] Dial("SIP/1000-00000000".Servidor A nano /etc/asterisk/extensions.Call accepted by 96. 344 . se marca el numero *11000 y se averigua en la consola de Asterisk que la llamada sea cursada correctamente al servidor B..1.126.

168. Es en este archivo que se definen los parámetros de conexión entre los servidores Asterisk y los contextos que se van a compartir. SIP o H323).129.conf. con un poco de practica se irán aclarando las ideas y los conceptos claves.A lo largo de la configuración se puede decidir si compartir contextos ya configurados en el Dialplan o crear contextos nuevos definiendo las extensiones que se volverán disponibles a los demás servidores. 345 .142 usuario: server1 Extensiones: 1000-1001-1002 MAC Tarjeta de red: F2:3C:91:DF:5B:3E Servidor B: IP: 192. Hay que abrirlo en el cortafuego de los servidores donde se va a utilizar DUNDi: nano /etc/sysconfig/iptables antes de esta linea: -A INPUT -p udp -m udp --dport 4569 -j ACCEPT se pone: # DUNDi -A INPUT -p udp -m udp --dport 4520 -j ACCEPT Se guardan los cambios y se reinicia Iptables: service iptables restart En el escenario que se presenta en este párrafo hay dos servidores Asterisk con estas características: Servidor A: IP: 192.. En el mismo archivo se define el tipo de protocolo que los dos servidores usarán para efectuar y recibir llamadas(puede ser IAX2.182.168. Aunque la configuración y puesta en marcha pueda parecer algo complicado.236 usuario: server2 Extensiones: 1000-1001-1002 MAC Tarjeta de red: FE:FD:45:A4:C4:49 Los dos servidores están en la misma LAN pero pueden estar ubicados en cualquier punto de la red Internet. El puerto predefino para el protocolo DUNDi es el 4520 UDP. El protocolo DUNDi se configura en el archivo dundi.

Con 0. organization=EmpresaA locality=Santa Marta stateprov=Magdalena country=Colombia email=admin@servidorA.0. Valor dundi yes = mantiene un registro de las ultimas solicitudes efectuadas con los tiempos de respuesta de cada una. Servidor A En la tabla que sigue se indican los parámetros que se configuran en el archivo dundi. Valor 32 yes = si no se recibe una respuesta dentro de 2000 ms. que rotará de manera automática y que se guardará en la base de datos interna de Asterisk.conf. Las sintaxis de un contexto es: 346 cachetime ttl autokill secretpath storehistory [mappings] . Valor 3600 Time to Live es un numero que representa el tiempo de vida de la solicitud. se anulará la solicitud. con el nombre definido en este parámetro. el resultado se guardará por el tiempo definido en este parámetro (en segundos) en la base de datos interna de Asterisk del servidor que envió la solicitud.Terminada la configuración de dundi.com phone=+57XXXXXXXXXX bindaddr port entityid Dirección IP que se quiere utilizar con el protocolo DUNDi. Esto permite evitar que las solicitudes queden abiertas por un tiempo indeterminado El modulo pbx_dundi crea una clave.0.0 todas las direcciones IP disponibles en el servidor Linux Puerto para las conexiones DUNDi (4520 predefinido) El MAC address de la tarjeta de red utilizada para las conexiones DUNDi. se modifica el dialplan para definir cuales son las rutas o contextos que se quiere compartir. De esta forma es posible averiguar cuales son los nodos lentos dentro de la red DUNDi a partir de esta etiqueta se definen los contextos que se va a compartir con los demás servidores Asterisk. Parámetro [general] Descripción inicia la configuración general del archivo department=EmpresaA En estos parámetros se indican los datos de la empresa. Más alto el numero más nodos se alcanzará a consultar. Personalizar con el valor real. en negrita el valor de cada parámetro.conf con una breve descripción para cada uno de ellos. En la columna descripción. Un ejemplo: F2:3C:91:DF:5B:3E Cuando se envía un solicitud para conocer la disponibilidad de una ruta y se encuentra una disponible.

Parámetro Descripción dundi_context => local_context.es la variable que contiene la clave que el modulo DUNDi crea en automático y que se usará para autenticar el usuario server1 192.la tecnología usada (protocolo) para las llamadas server1 .168. Si son extensiones locales se pone 0.129. nopartial – no se harán búsquedas por números incompletos • • • servera => servera-local.conf ${SECRET} .0.server1:${SECRET}@192.dirección IP del Servidor A (personalizar) 347 • .el contexto DUNDi que se va a compartir servera-local . el Servidor A utilizará esa destinación para recibir la llamada. mobile – el numero es un celular 6. Simplificando: se crea un user en el iax.tech.usuario que se configurará en el el archivo iax.dest[. Al momento de hacer una solicitud si para el mismo numero requerido existen distintas rutas.el contexto DUNDi que se quiere compartir con los demás nodos de la red DUNDi local_context – el contexto local definido en el dialplan donde se configuran las rutas o extensiones que se quieren compartir weight – el peso que se asigna a las rutas que se comparten. si son rutas por las cuales no hay una conexión directa o de alta calidad se pone un numero más alto.weight. se escogerá la ruta con menor peso tech – protocolo usado para la conexión entre servidores Asterisk (se usará IAX2) dest – cuando se hace una solicitud desde el servidor B y se encuentra una ruta en el Servidor A. nocomunsolicit – llamadas comerciales no solicitadas no son permitidas en esta ruta 3.IAX2.conf del servidor Asterisk A y dest representa los paramentos para conectarse a ese user options – son las distintas opciones que se pueden añadir a cada contexto DUNDi: 1.129.142 .142/${NUMBER} El que aparece arriba es el contexto que se va a definir: • • • • • servera => . residential – el numero es de una residencia 4.168. nounsolicited – llamadas de cualquier tipo que no sean solicitadas no son permitidas en esta ruta 2. commercial – el numero es de una empresa 5.el contexto definido en el dialplan que contendrá todas las rutas que se van a compartir IAX2 .options]] • • • dundi_context .

old se crea uno nuevo: nano /etc/asterisk/dundi.236 inkey = server2 outkey = server1 include = all permit = servera qualify = yes • • FE:FD:45:A4:C4:49: MAC address de la tarjeta de red del Servidor Asterisk B con el que se crea la conexión (personalizar) model: puede ser: 1.conf.168. Primero se renombra el predefinido: mv /etc/asterisk/dundi.Parámetro • Descripción ${NUMBER}: la variable que contendrá el numero que ha sido solicitado Para terminar con la configuración del archivo dundi. outbound: solo efectúa solicitudes pero no las recibe 3.182. symmetric: recibe y efectúa solicitudes • host: direccion IP o nombre de dominio del servidor Asterisk B • inkey: clave RSA usada para autenticarse con el servidor Asterisk B • outkey: clave RSA usada por el Servidor Asterisk B para autenticarse con el Servidor Asterisk A include: incluye esta conexión para todas las solicitudes efectuadas en el Servidor Asterisk A permit: se definen los contextos DUNDi a los que tendrá acceso este nodo qualify: se controlará periódicamente que la conexión con el nodo esté activa • • • Se crea el archivo dundi. inbound: recibe solamente solicitudes 2.conf /etc/asterisk/dundi.conf se definen los servidores Asterisk con los que se va a tener una conexión directa: [FE:FD:45:A4:C4:49] model = symmetric host = 192.conf.conf y se copian los datos de configuración: [general] department=EmpresaA organization=EmpresaA locality=Santa Marta stateprov=Magdalena 348 .

182. The resulting files will need to be moved to /var/lib/asterisk/keys if you want to use them. 349 .country=Colombia email=admin@servidorA. and any private keys (.server1:${SECRET}@192. Please enter the same code each time. el mac address de la tarjeta del servidor B contenido entre corchetes y la dirección ip local del servidor B en host Se guardan los cambios y se crea la clave RSA para autenticar el Servidor Asterisk B.168.142/${NUMBER} [F2:3C:91:96:EC:A3] model = symmetric host = 192.0.com phone=+57XXXXXXXXXX bindaddr=0. Para crear la clave se usará una utilidad que viene con la instalación de Asterisk.129.168.IAX2. or with the 'init keys' command once Asterisk is running. Primero se entra en la carpeta donde se guardarán las claves: cd /var/lib/asterisk/keys Se crea la clave: astgenkey -n server1 This script generates an RSA private and public key pair in PEM format for use by Asterisk.0 port=4520 entityid=F2:3C:91:DF:5B:3E cachetime=3600 ttl=32 autokill=yes secretpath=dundi storehistory=yes [mappings] servera => servera-local. la dirección IP local presente bajo la etiqueta [mappings].0.key files) will need to be initialized at runtime either by running Asterisk with the '-i' option.236 inkey = server2 outkey = server1 include = all permit = servera qualify = yes IMPORTANTE: Personalizar los siguientes parámetros: entityid.0. You will be asked to enter a passcode for your key multiple times.

++++++ . 1024 bit long modulus .... Ahora se puede añadir el usuario server1 al archivo iax.conf Antes del contexto internas se define el contexto servera-local y se incluyen las rutas/extensiones que se quiere compartir con el servidor B [servera-local] exten => 20.. uno contiene la clave publica y uno la clave privada..236:/var/lib/asterisk/keys Personalizar la dirección IP local del servidor B..pub Private key: server1.pub root@192..Playback(hello-world) 350 .++++++ e is 65537 (0x10001) writing RSA key Key creation successful. La publica se copia en el Servidor Asterisk B: scp server1.Press ENTER to continue or ^C to cancel.key Se crearán dos archivos...conf Se añaden las siguientes lineas al final del archivo: [server1] type=user dbsecret=dundi/secret context=servera-local qualify=yes disallow=all allow=ulaw allow=alaw Importante definir el parámetro context con el valor del contexto que se ha definido en nuestra ruta (servera-local) El ultimo archivo que hay que modificar es el dialplan: nano /etc/asterisk/extensions.. Public key: server1..182.168.n..Answer() exten => 20.conf nano /etc/asterisk/iax.....1. Generating SSL key 'server1': Generating RSA private key..

n. El nombre serverb es el contexto DUNDi que luego se creará en el archivo dundi.old nano /etc/asterisk/dundi. la configuración del servidor B será: [general] department=EmpresaB organization=EmpresaB locality=Santa Marta stateprov=Magdalena country=Colombia email=admin@servidorB.conf /etc/asterisk/dundi.conf del Servidor Asterisk B Añadimos el contexto dundi-remoto a la lista de contextos disponibles para la extensiones configuradas en el Servidor Asterisk A (en negrita los cambios): [externas] include => internas include => internacio include => parkedcalls include => test include => conferencias include => dundi-remoto [locales] include => internas include => auten include => parkedcalls include => test include => conferencias include => dundi-remoto Se guardan los cambios y se continúa con la configuración del Servidor Asterisk B Servidor B mv /etc/asterisk/dundi.exten => 20.Hangup() Para las solicitudes remotas se crea otro contexto: [dundi-remoto] switch => DUNDi/serverb De esta forma cuando se marca un numero y ese numero no está presente en ningún contexto del dialplan. Asterisk consultará el servidor remoto con que tiene una conexión DUNDi.conf Con los oportunos cambios.conf.com 351 .

236/${NUMBER} [F2:3C:91:DF:5B:3E] model = symmetric host = 192.el mac address de la tarjeta del servidor B contenido entre corchetes y la dirección ip local del servidor B en host Se crea la clave RSA para el servidor B: cd /var/lib/asterisk/keys astgenkey -n server2 This script generates an RSA private and public key pair in PEM format for use by Asterisk..key files) will need to be initialized at runtime either by running Asterisk with the '-i' option.phone=+57XXXXXXXX bindaddr=0. Please enter the same code each time.0 port=4520 entityid=F2:3C:91:96:EC:A3 cachetime=3600 ttl=32 autokill=yes secretpath=dundi storehistory=yes [mappings] serverb => serverb-local.. Generating SSL key 'server2': Generating RSA private key.0.++++++ 352 .129.. 1024 bit long modulus .182. The resulting files will need to be moved to /var/lib/asterisk/keys if you want to use them.168.168. Press ENTER to continue or ^C to cancel.0.0....... la dirección IP local presente bajo la etiqueta [mappings]. or with the 'init keys' command once Asterisk is running.IAX2.server2:${SECRET}@192... and any private keys (. You will be asked to enter a passcode for your key multiple times.142 inkey = server1 outkey = server2 include = all permit = serverb qualify = yes IMPORTANTE: Personalizar los siguientes parámetros: entityid.

.key Se copia la clave publica en el Servidor Asterisk A scp server2...1..Playback(hello-world) exten => 40.n.....129... Se crea el usuario IAX2 nano /etc/asterisk/iax.pub Private key: server2..168.....Hangup() [dundi-remoto] switch => DUNDi/servera Se incluye el contexto dundi-remoto de forma que sea accesible a las extensiones: [externas] include => internas include => internacio include => parkedcalls include => test include => conferencias include => dundi-remoto [locales] 353 .pub root@192..n..conf [serverb-local] exten => 40...++++++ e is 65537 (0x10001) writing RSA key Key creation successful....conf [server2] type=user qualify=yes dbsecret=dundi/secret context=serverb-local disallow=all allow=ulaw allow=alaw Para terminar se modifica el plan de llamadas: nano /etc/asterisk/extensions..142:/var/lib/asterisk/keys Personalizar la dirección IP local del servidor A.Answer() exten => 40.. Public key: server2...

354 .168. 0 offline.236 (S) 4520 Symmetric Unavail OK (1 ms) 1 dundi peers [1 online. 0 unmonitored] Con el comando: CLI> database show /dundi/secret : qotQe+Vp1B2G7S9yoizlPA==.3obGb1QtvkUeciZs7rH5CA== /dundi/secretexpiry : 1259212403 aparecerá la clave creada por el modulo pbx_dundi y el tiempo que falta para que caduque.d/asterisk restart Se entra en la consola del servidor Asterisk A: asterisk -rvvvvvvvvvvvv se mira la lista de comandos disponibles para DUNDi CLI> help dundi dundi flush [stats] Flush DUNDi cache dundi lookup Lookup a number in DUNDi dundi precache Precache a number in DUNDi dundi query Query a DUNDi EID dundi set debug {on|off} Enable/Disable DUNDi debugging dundi show entityid Display Global Entity ID dundi show mappings Show DUNDi mappings dundi show peers [registered|i Show defined DUNDi peers dundi show peer Show info on a specific DUNDi peer dundi show precache Show DUNDi precache dundi show requests Show DUNDi requests dundi show trans Show active DUNDi transactions dundi store history {on|off} Enable/Disable DUNDi historic records Se controla que haya conexión entre los dos servidores: CLI> dundi show peers EID Host Port Model AvgTime Status f2:3c:91:96:ec:a3 192.182.include => internas include => auten include => parkedcalls include => test include => conferencias include => dundi-remoto Una vez terminada la configuración del Servidor Asterisk B en ambos se reinicia la PBX: /etc/init.

Por este motivo.168. 0 IAX2/server1:7+9kTsdabHhfGCokZ+x2Cg==@192. en algunos casos. A pesar de la nueva implementación.4 Conectar dos servidores Asterisk con OpenVPN Desde la versión 1.Ahora se puede hacer la primera consulta para controlar que efectivamente las rutas se están compartiendo: CLI> dundi lookup 40@serverb 1. Como se ha podido ver.248/20 (EXISTS|CANMATCH) from f2:3c:91:df:5b:3e. las potencialidades del protocolo DUNDi son realmente grandes.conf del servidor Asterisk B. Este párrafo es una pequeña guía para que se pueda empezar a implementarlas. En este párrafo se verá como instalar y configurar OpenVPN en dos servidores Asterisk y como crear una conexión VPN entre los dos.182.8. DUNDi lookup completed in 3 ms Se hace otra solicitud de prueba desde el Servidor Asterisk B CLI> dundi lookup 20@servera 1. 0 IAX2/server2:kGYzcabppQ577UVIWc6eGQ==@192. En el comando ademas de la extensión va indicado el contexto como se ha definido en el bloque mappings del dundi.168. todavía hay muchos problemas de compatibilidad entre Asterisk y las distintas marcas/modelos de teléfonos actualmente en el mercado. expires in 3600 s DUNDi lookup completed in 7 ms Para terminar las pruebas se conecta un softphone al servidor Asterisk B y se intenta llamar la extensión 20 (que es presente en el servidor Asterisk A).X es posible cifrar la señalización SIP y el flujo media. Servidor A Primero se instala LZO. puede ser más funcional crear una red VPN entre servidores Linux y luego utilizarla para configurar troncales en Asterisk. luego desde una extensión del servidor A se marca el numero 40. expires in 3600 s DUNDi lookup completed in 45 ms En el servidor Asterisk B las extensión compartidas es la 40 y efectivamente enviando la solicitud. la respuesta es que la extensión existe.142.236/40 (EXISTS|CANMATCH) from f2:3c:91:96:ec:a3. Si se envía una solicitud para una ruta que no existe la respuesta será: CLI> dundi lookup 20@serverb DUNDi lookup returned no results. una librería de compresión datos requerida por OpenVPN: 355 . 18.

gz cd lzo-2./configure make make install Se prepara el servidor Linux para crear las distintas claves (CA.06.openvpn.06. servidor.org/community/releases/openvpn-2.tar.2.tar./configure --prefix=/usr make make install Ahora se puede instalar la ultima versión disponible de OpenVPN: cd /usr/src se descarga: wget http://swupdate.cd /usr/src Se descarga: wget http://www. cliente): cd easy-rsa/2.gz Se descomprime y se instala: tar -xf lzo-2.2.tar.2.2.2 se compila: .06 .gz se descomprime: tar -xf openvpn-2.0 Se crea la carpeta donde se guardarán las distintas claves: mkdir /usr/local/sbin/keys nano vars 356 .gz se entra en la carpeta creada: cd openvpn-2.tar.oberhumer.2.com/opensource/lzo/download/lzo-2.

members.Se modifican las líneas que siguen. Esto datos serán los predefinidos que se usaran al momento de la generación de las claves.++++++ .com Name [changeme]:voztovoice Email Address [admin@voztovoice.++++++ writing new private key to 'ca. ----Country Name (2 letter code) [CO]: State or Province Name (full name) [Magdalena]: Locality Name (eg.. city) [SantaMarta]: Organization Name (eg. the field will be left blank. section) [changeme]:PBXA Common Name (eg./vars IMPORTANTE: entre el primer punto y el segundo hay un espacio . your name or your server's hostname) [changeme]:li44-242... company) [VozToVoice]: Organizational Unit Name (eg. There are quite a few fields but you can leave some blank For some fields there will be a default value.linode...org Se guardan los cambios y se prepara el programa para la generación de las claves: . Personalizar los datos de los parametros que siguen: export KEY_DIR=/usr/local/sbin/keys export KEY_COUNTRY="CO" export KEY_PROVINCE="MAG" export KEY_CITY="SantaMarta" export KEY_ORG="VozToVoice" export KEY_EMAIL="admin@voztovoice.org]: En “Common Name” se pone el nombre de dominio de Linode o del servidor Linux que se está 357 .org" export KEY_EMAIL=admin@voztovoice. If you enter '.key' ----You are about to be asked to enter information that will be incorporated into your certificate request.. .'./build-ca Generating a 1024 bit RSA private key ./clean-all Ahora se puede empezar a generar las claves empezando con la CA (Certificate Authority): . What you are about to enter is what is called a Distinguished Name or a DN.

org]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /root/openvpn-2..org' Certificate is to be certified until Dec 10 14:16:09 2021 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified..++++++ writing new private key to 'server...com Name [changeme]:voztovoice Email Address [admin@voztovoice....linode.. company) [VozToVoice]: Organizational Unit Name (eg... There are quite a few fields but you can leave some blank For some fields there will be a default value... section) [changeme]:PBXA Common Name (eg.key' ----You are about to be asked to enter information that will be incorporated into your certificate request... Se continua con la clave del servidor: . What you are about to enter is what is called a Distinguished Name or a DN. your name or your server's hostname) [server]:li44-242.../build-key-server server Generating a 1024 bit RSA private key . city) [SantaMarta]: Organization Name (eg.'.com' name :PRINTABLE:'voztovoice' emailAddress :IA5STRING:'admin@voztovoice.linode. commit? [y/n]y Write out database with 1 new entries 358 .utilizando..0/openssl-0.members.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'CO' stateOrProvinceName :PRINTABLE:'Magdalena' localityName :PRINTABLE:'SantaMarta' organizationName :PRINTABLE:'VozToVoice' organizationalUnitName:PRINTABLE:'PBXA' commonName :PRINTABLE:'li44-242.++++++ ... If you enter '..1/easy-rsa/2.8.2. ----Country Name (2 letter code) [CO]: State or Province Name (full name) [Magdalena]: Locality Name (eg. the field will be left blank..9.....members..

.........key' ----You are about to be asked to enter information that will be incorporated into your certificate request...com' name :PRINTABLE:'voztovoice' emailAddress :IA5STRING:'admin@voztovoice.... If you enter '.2..linode.. ----Country Name (2 letter code) [CO]: State or Province Name (full name) [Magdalena]: Locality Name (eg.... There are quite a few fields but you can leave some blank For some fields there will be a default value.....'.......org' Certificate is to be certified until Dec 10 14:19:20 2021 GMT (3650 days) Sign the certificate? [y/n]:y 359 .++++++ writing new private key to 'clienteb.0/openssl-0......9..... section) [changeme]:PBXA Common Name (eg.++++++ .members...linode.com Name [changeme]:voztovoice Email Address [admin@voztovoice./build-key clienteb Generating a 1024 bit RSA private key .......Data Base Updated Para terminar se crea una clave para el cliente (el servidor Asterisk B): . company) [VozToVoice]: Organizational Unit Name (eg. city) [SantaMarta]: Organization Name (eg.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'CO' stateOrProvinceName :PRINTABLE:'Magdalena' localityName :PRINTABLE:'SantaMarta' organizationName :PRINTABLE:'VozToVoice' organizationalUnitName:PRINTABLE:'PBXA' commonName :PRINTABLE:'li44-242.1/easy-rsa/2....members. the field will be left blank..8.... your name or your server's hostname) [clienteb]:li44-242.org]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /root/openvpn-2. What you are about to enter is what is called a Distinguished Name or a DN.

49.49.49. 1024 bit long safe prime. se crean otras claves cliente.d/init.228.2. generator 2 This is going to take a long time OpenVPN utiliza como puerto predefinido el 1194 (puede ser UDP o TCP según la configuración).init /etc/rc. Hay que abrirlo en Iptables solamente para la IP del servidor B.1 out of 1 certificate requests certified./build-dh Generating DH parameters.216 --dport 1194 -j ACCEPT -A INPUT -p udp -m udp -s 66.216 --dport 1194 -j ACCEPT Se guardan los cambios y se reinicia iptables: service iptables restart Lo siguiente es instalar el script de arranque presente en las fuentes de OpenVPN: cd /usr/src/openvpn-2. commit? [y/n]y Write out database with 1 new entries Data Base Updated Si se tiene planeado utilizar la conexión para conectar telefonos IP y/o Softphone. Suponiendo que la IP del servidor B es 66.216. se añaden las siguientes lineas en la configuración: nano /etc/sysconfig/iptables después de esta linea: -A INPUT -p tcp -m state --state NEW -m tcp --dport 15000 -j ACCEPT se pone: # OpenVPN -A INPUT -p tcp -m state --state NEW -m tcp -s 66.2/sample-scripts/ cp openvpn. Se termina con la generación del parámetro Diffie Hellman .228.228.d/openvpn chkconfig --add openvpn chkconfig openvpn on Se crea la carpeta donde se guardarán los archivos de configuración de OpenVPN: mkdir /etc/openvpn Se crea el archivo de configuración para el servidor: 360 .

key dh /usr/local/sbin/keys/dh1024.0 255.8.html#examples Se guardan los cambios y se inicia OpenVPN /etc/init.0.net/index.conf Se copian las siguientes lineas: port 1194 proto udp dev tun ca /usr/local/sbin/keys/ca.d/openvpn start En la configuración de red del servidor aparecerá un nuevo dispositivo: ifconfig Servidor B 361 .crt cert /usr/local/sbin/keys/server.cd /etc/openvpn nano server.txt keepalive 10 120 comp-lzo max-clients 30 persist-key persist-tun log openvpn.crt key /usr/local/sbin/keys/server.log verb 3 management localhost 7505 Para más informaciones sobre estos parámetros: http://openvpn.log log-append openvpn.0 ifconfig-pool-persist ipp.255.pem server 10.php/open-source/documentation/howto.255.

06.2.2 se compila: .Se sigue el mismo procedimiento para el servidor B: cd /usr/src Se descarga: wget http://www.gz se entra en la carpeta creada: cd openvpn-2.06.0 Se crea la carpeta donde se guardarán las distintas claves: mkdir /usr/local/sbin/keys nano vars 362 .gz se descomprime: tar -xf openvpn-2.tar. cliente): cd easy-rsa/2.2./configure make make install Se prepara el servidor Linux para crear las distintas claves (CA.06 ./configure –prefix=/usr make make install Ahora se puede instalar la ultima versión disponible de OpenVPN: cd /usr/src se descarga: wget http://swupdate.tar. servidor.gz cd lzo-2.com/opensource/lzo/download/lzo-2.gz Se descomprime y se instala: tar -xf lzo-2.openvpn.tar.2.2.org/community/releases/openvpn-2.2.tar.oberhumer.

/clean-all Ahora se puede empezar a generar las claves empezando con la CA (Certificate Authority): . your name or your server's hostname) [changeme]:li212-33.++++++ .members. There are quite a few fields but you can leave some blank For some fields there will be a default value. section) [changeme]:PBXB Common Name (eg.key' ----You are about to be asked to enter information that will be incorporated into your certificate request. If you enter '. the field will be left blank.linode.'. What you are about to enter is what is called a Distinguished Name or a DN. company) [VozToVoice]: Organizational Unit Name (eg. .com Name [changeme]:voztovoice Email Address [admin@voztovoice./build-ca Generating a 1024 bit RSA private key .com Se guardan los cambios y se prepara el programa para la generación de las claves: ..com" export KEY_EMAIL=admin@voztovoice.Se modifican las líneas que siguen. city) [SantaMarta]: Organization Name (eg. Esto datos serán los que se usaran como predefinidos al momento de la generación de las claves. Personalizar los datos desde la segunda linea en adelante: export KEY_DIR=/usr/local/sbin/keys export KEY_COUNTRY="CO" export KEY_PROVINCE="MAG" export KEY_CITY="SantaMarta" export KEY_ORG="VozToVoice" export KEY_EMAIL="admin@voztovoice.++++++ writing new private key to 'ca. ----Country Name (2 letter code) [CO]: State or Province Name (full name) [Magdalena]: Locality Name (eg../vars IMPORTANTE: entre el primer punto y el segundo hay un espacio .org]: 363 ..

com ' name :PRINTABLE:'voztovoice' emailAddress :IA5STRING:'admin@voztovoice.. If you enter '. your name or your server's hostname) [server]:li212-33.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'CO' stateOrProvinceName :PRINTABLE:'Magdalena' localityName :PRINTABLE:'SantaMarta' organizationName :PRINTABLE:'VozToVoice' organizationalUnitName:PRINTABLE:'PBXB' commonName :PRINTABLE:'li212-33. the field will be left blank.9.En “Common Name” se pone el nombre de dominio de Linode o del servidor Linux que se está utilizando.linode.org' Certificate is to be certified until Dec 10 15:13:18 2021 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified. What you are about to enter is what is called a Distinguished Name or a DN. section) [changeme]:PBXB Common Name (eg.1/easy-rsa/2.linode. Se continua con la clave del servidor: . ----Country Name (2 letter code) [CO]: State or Province Name (full name) [Magdalena]: Locality Name (eg.com Name [changeme]:voztovoice Email Address [admin@voztovoice. city) [SantaMarta]: Organization Name (eg.key' ----You are about to be asked to enter information that will be incorporated into your certificate request.org]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /usr/src/openvpn-2. commit? [y/n]y 364 .2.members. There are quite a few fields but you can leave some blank For some fields there will be a default value. company) [VozToVoice]: Organizational Unit Name (eg.++++++ ./build-key-server server Generating a 1024 bit RSA private key .++++++ writing new private key to 'server.'.0/openssl-0.members.8.

.../build-key clientea Generating a 1024 bit RSA private key .1/easy-rsa/2...com Name [changeme]:voztovoice Email Address [admin@voztovoice. section) [changeme]:PBXB Common Name (eg.key' ----You are about to be asked to enter information that will be incorporated into your certificate request.linode.org' Certificate is to be certified until Dec 10 15:15:37 2021 GMT (3650 days) Sign the certificate? [y/n]:y 365 .++++++ .members.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'CO' stateOrProvinceName :PRINTABLE:'Magdalena' localityName :PRINTABLE:'SantaMarta' organizationName :PRINTABLE:'VozToVoice' organizationalUnitName:PRINTABLE:'PBXB' commonName :PRINTABLE:'li212-33..9.org]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /usr/src/openvpn-2. What you are about to enter is what is called a Distinguished Name or a DN. your name or your server's hostname) [clientea]:li212-33.++++++ writing new private key to 'clientea..linode.'.0/openssl-0.8... ----Country Name (2 letter code) [CO]: State or Province Name (full name) [Magdalena]: Locality Name (eg.2.. If you enter '. the field will be left blank. city) [SantaMarta]: Organization Name (eg. company) [VozToVoice]: Organizational Unit Name (eg.Write out database with 1 new entries Data Base Updated Para terminar se crea una clave para el cliente (el servidor Asterisk B): .com ' name :PRINTABLE:'voztovoice' emailAddress :IA5STRING:'admin@voztovoice. There are quite a few fields but you can leave some blank For some fields there will be a default value...members.

1 out of 1 certificate requests certified. commit? [y/n]y Write out database with 1 new entries Data Base Updated Se termina con la generación del parámetro Diffie Hellman .d/init.178 --dport 1194 -j ACCEPT Se guardan los cambios y se reinicia iptables: service iptables restart Lo siguiente es instalar el script de arranque presente en las fuentes de OpenVPN: cd /usr/src/openvpn-2./build-dh Generating DH parameters.164.201.164. 1024 bit long safe prime.d/openvpn chkconfig --add openvpn chkconfig openvpn on Se crea la carpeta donde se guardarán los archivos de configuración de OpenVPN: mkdir /etc/openvpn Se crea el archivo de configuración para el servidor: cd /etc/openvpn nano server.2. se abren los puertos en iptables para la IP del servidor A nano /etc/sysconfig/iptables # OpenVPN -A INPUT -p tcp -m state --state NEW -m tcp -s 69. generator 2 This is going to take a long time Como para el servidor A.201.2/sample-scripts/ cp openvpn.conf Se copian las siguientes lineas: port 1194 proto udp 366 .178 --dport 1194 -j ACCEPT -A INPUT -p udp -m udp -s 69.init /etc/rc.

key • La claves se copian en la carpeta /etc/openvpn del servidor B.d/openvpn start En la configuración de red del servidor aparecerá un nuevo dispositivo: ifconfig Ahora que los dos servidores están configurados.0 255.log verb 3 management localhost 7505 Se guardan los cambios.crt • clienteb. La diferencia con el archivo del Servidor A es que se utiliza otro rango de IP local. Se inicia OpenVPN /etc/init. Para eso hay que copiar las siguientes claves de un servidor a otro: Servidor A → Servidor B: • ca.10. hay que crear una conexión cliente en cada uno.key dh /usr/local/sbin/keys/dh1024.txt keepalive 10 120 comp-lzo max-clients 30 persist-key persist-tun log openvpn.255.0 ifconfig-pool-persist ipp.0. Servidor B → Servidor A: 367 .crt • clienteb.pem server 10.dev tun ca /usr/local/sbin/keys/ca.255.crt key /usr/local/sbin/keys/server.crt cert /usr/local/sbin/keys/server.log log-append openvpn.

crt key /etc/openvpn/clientea. Se guardan los cambios y se reinicia OpenVPN: service openvpn restart Si todo ha salido bien.key comp-lzo verb 3 ns-cert-type server route-method exe route-delay 2 En la linea 4 se pone la dirección IP del servidor B y el puerto (1194).crt clientea.key La claves se copian en la carpeta /etc/openvpn del servidor A.conf se copian las siguientes lineas: client dev tun proto udp remote 66. tendremos un nuevo dispositivo de red: 368 .crt clientea.216 1194 resolv-retry infinite nobind persist-key persist-tun ca /etc/openvpn/ca.228.crt cert /etc/openvpn/clientea. Ahora en el servidor A se crea el archivo de configuración cliente para conectarse al servidor B: cd /etc/openvpn nano client.49.• • • ca.

125.0.126.10.Para que las llamadas puedan ser enrutadas correctamente por Asterisk.crt cert /etc/openvpn/clienteb.0/255.255.255.255.conf: nano /etc/asterisk/sip.0.0 localnet=10. hay que añadir estas dos nuevas redes en la configuración del sip.crt key /etc/openvpn/clienteb.conf Después del primer parámetro localnet se añade: localnet=10.conf se copian las siguientes lineas: client dev tun proto udp remote 96.255.0 Se recarga la configuración SIP: asterisk -rx "sip reload" Se sigue el mismo procedimiento para el servidor B: cd /etc/openvpn nano client.8.key comp-lzo verb 3 ns-cert-type server 369 .0/255.112 1194 resolv-retry infinite nobind persist-key persist-tun ca /etc/openvpn/ca.

se crea una nueva troncal SIP entre los dos.255. Esta vez utilizando la autentificación por IP.0.0/255.10.conf Después del primer parámetro localnet se añade: localnet=10.route-method exe route-delay 2 Se guardan los cambios y se reinicia OpenVPN: service openvpn restart Si todo ha salido bien. Para crear la troncal podemos utilizar o el rango de IP 10. tendremos un nuevo dispositivo de red: Para que las llamadas puedan ser enrutadas correctamente por Asterisk.8.1 Servidor A nano /etc/asterisk/sip.conf al final del archivo se pone: [serverbvpn] 370 .255.0.255.1 o el rango de IP 10.0 Se recarga la configuración SIP: asterisk -rx "sip reload" Una vez terminada la configuración y la conexión OpenVPN entre los dos servidores.0.conf: nano /etc/asterisk/sip.255.8.0 localnet=10. hay que añadir estas dos nuevas redes en la configuración del sip.0.10.0/255.

1 disallow=all allow=g729 allow=alaw language=es qualify=yes dtmfmode = rfc2833 Se recarga la configuración SIP en ambos servidores: asterisk -rx "sip reload" Se entra en la consola de ambos servidores y se averigua que la conexión este funcionando: asterisk -rvvvvvvvvvv Servidor A: CLI> sip show peers like serverbvpn Name/username Host Dyn Nat ACL Port Status Realtime serverbvpn 10.0.type=peer context=vpn host=10. 0 offline Unmonitored: 0 online.0.conf al final del archivo se pone: [serveravpn] type=peer context=vpn host=10. Servidor B nano /etc/asterisk/sip.8.8.0. Se guarda los cambios y se pasa al servidor B. 0 offline] Servidor B: 371 .8.6 N 5060 OK (2 ms) 1 sip peers [Monitored: 1 online.6 disallow=all allow=g729 allow=alaw language=es qualify=yes dtmfmode = rfc2833 Importante destacar la dirección IP VPN del servidor B en el parámetro host y el contexto (vpn).

conf antes del contexto internas.1.Playback(demo-congrats) same => n. 0 offline] Perfecto!! Para probar las llamadas entre los servidores.Hangup y en el contexto internas se pone: exten => 70.Dial(SIP/serverbvpn/${EXTEN}) same => n.1. se crea el nuevo contexto vpn y se añaden las siguientes lineas: [vpn] exten => 70. Como para la prueba con la conexión entre servidores Asterisk con el protocolo SIP. se crea el nuevo contexto vpn y se añaden las siguientes lineas: [vpn] exten => 70.conf antes del contexto internas.hangup 372 .Playback(demo-congrats) same => n.0.hangup Servidor B nano /etc/asterisk/extensions. 0 offline Unmonitored: 0 online.Hangup y en el contexto internas se pone: exten => 70. se modifica el dialplan acordándose que el contexto que se ha definido en la troncal es vpn.Set(CALLERID(num)=openvpnb) same => n.Set(CALLERID(num)=openvpna) same => n. En el caso de servidores con números de extensiones distintas. utilizando la red OpenVPN.Dial(SIP/serveravpn/${EXTEN}) same => n.CLI> sip show peers like serveravpn Name/username Host Dyn Nat ACL Port Status Realtime serveravpn 10.1.8.1.Answer same => n.1 N 5060 OK (2 ms) 1 sip peers [Monitored: 1 online.Answer same => n. no hace falta añadir la linea donde se modifica el CALLERID Servidor A nano /etc/asterisk/extensions. hay que “engañar” Asterisk para que acepte la llamada ya que las extensiones configuradas en los dos servidores son las mismas.

5 Conectar dos Servidores Asterisk con TLS y SRTP En esta parte se verá como configurar una conexión SIP entre dos servidores Asterisk y utilizar el protocolo TLS para la señalización SIP y el cifrado media con el protocolo SRTP.....8. se hace una prueba marcando desde la extensión 1000 del servidor A la extensión 70. 18... En la consola de Asterisk de servidor A debería aparecer: Executing [70@externas:1] NoOp("SIP/1000-00000045".0/contrib/scripts ........Executing [70@externas:3] NoOp("SIP/1000-00000045"..11.. Primero hay que crear los certificados para el servidor A y el servidor B.. Desde el servidor A: mkdir /etc/asterisk/keys Primero se crea el certificado CA y el certificado para el servidorA: cd /usr/src/asterisk-1....++ e is 65537 (0x10001) 373 . Esto se hace con una utilidad presente en las fuentes de Asterisk.SIP/serverbvpn-00000046 answered SIP/1000-00000045 La comodidad de tener las dos redes VPN es que se pueden configurar otros clientes OpenVPN en los computadores donde tenemos instalados los SoftPhone o los teléfonos que soportan este protocolo (ejemplo Yealink desde el modelo T26 para arriba)..linode..cfg' You can use this config file to create additional certs without re-entering the information for the fields in the certificate Creating certs/ca. "CALLERID(num)=openvpna") in new stack -...++ ...key Generating RSA private key...com -o serverA No config file specified..Se guardan los cambios en ambos servidores y se recarga el dialplan asterisk -rx "dialplan reload" Para terminar.members./ast_tls_cert -d certs -C li374-112..... "SIP/serverbvpn/70") in new stack == Using SIP RTP CoS mark 5 == Using SIP VRTP CoS mark 6 == Using UDPTL CoS mark 5 -..Executing [70@externas:4] Dial("SIP/1000-00000045". creating 'certs/tmp....Called serverbvpn/70 -..... 4096 bit long modulus . "openvpna") in new stack -. "") in new stack Executing [70@externas:2] Set("SIP/1000-00000045"......

........... creating 'certs/tmp.Enter pass phrase for certs/ca.....cfg' You can use this config file to create additional certs without re-entering the information for the fields in the certificate Creating certs/ca......crt Signature ok subject=/CN=li374-112.key Generating RSA private key..../ast_tls_cert -d certs -C li291-216.++++++ .......crt Signature ok subject=/CN=li291-216....linode.. 4096 bit long modulus ........... 1024 bit long modulus ..................key: Verifying ..........................................com -o serverB No config file specified............. 1024 bit long modulus ........ ..........Enter pass phrase for certs/ca...............................crt Enter pass phrase for certs/ca..........pem En la opción -C se pone el nombre de dominio del servidor y cuando el script lo pide se ingresa una contraseña (por ejemplo servera) Luego se crea el certificado para el servidorB .key: Creating certs/serverA....++++++ ...++ e is 65537 (0x10001) Enter pass phrase for certs/ca..........Enter pass phrase for certs/ca.linode..++++++ e is 65537 (0x10001) Creating signing request Creating certs/serverA.....crt Enter pass phrase for certs/ca.............++++++ e is 65537 (0x10001) Creating signing request Creating certs/serverB.....com/O=Asterisk Getting CA Private Key 374 ................key: Combining key and crt into certs/serverA.members...........key: Verifying ........key Generating RSA private key...key Generating RSA private key.++ ............members......key: Creating certs/ca.....linode..........key: Creating certs/serverB............key: Creating certs/ca........................com/O=Asterisk Getting CA Private Key Enter pass phrase for certs/ca...members..........

crt /etc/asterisk/keys/ cp serverA.pem Cuando el script pide la contraseña.112 tlscertfile=/etc/asterisk/keys/serverA.conf para activar el protocolo TLS y se crea la troncal para el servidorB con autentificación sobre IP: nano /etc/asterisk/sip.key: Combining key and crt into certs/serverB.228.126.125.pem /etc/asterisk/keys/ Para terminar se modifica la configuración del archivo sip.crt tlscapath=/etc/asterisk/keys tlsdontverifyserver=yes en tlsbindaddr se pone la dirección IP del servidorA al final del archivo se configura la troncal para el servidorB [serverbtls] type=peer context=from-tls host=66.pem tlscafile=/etc/asterisk/keys/ca.Enter pass phrase for certs/ca.conf al final de la parte general se pone: tlsenable=yes tlsbindaddr=96.216 disallow=all allow=alaw language=es qualify=yes transport=tls encryption=yes Los parámetros importantes: • context: nombre del contexto donde entrarán las llamadas del servidoB 375 . se pone la misma que se ha utilizado para crear las claves del servidorA (servera) Ahora se copian los siguientes archivos en la carpeta /etc/asterisk/keys del servidorA: cd certs cp ca.49.

si el valor es 0.• • • host: la dirección IP del servidorB transport: de define como trasporte de la señalización SIP el protocolo TLS encryption: se activa el cifrado del flujo media (protocolo SRTP) El protocolo TLS en Asterisk.216 --dport 5061 -j ACCEPT Se guardan los cambios y se reinicia iptables: service iptables restart En el dialplan se crea el nuevo contexto antes del contexto internas: nano /etc/asterisk/extensions. SRTP = ${CHANNEL(secure_media)}) same => n. exten => 71.Dial(SIP/serverbtls/${EXTEN}) same => n. Si el valor es 1 significa que se están utilizando.49.hangup Servidor B Se crea la carpeta para los certificados: 376 .conf [from-tls] exten => 71. En el contexto internas se añade.1.Hangup Con la segunda linea se lee la variable CHANNEL para el cifrado de la señalización y del flujo media. significa que no están activos en el canal en uso. Hay que abrirlo en el firewall para la IP del servidorB nano /etc/sysconfig/iptables después de esta linea: -A INPUT -p tcp -m state --state NEW -m tcp --dport 5060 -j ACCEPT se pone: -A INPUT -p tcp -m state --state NEW -m tcp -s 66.228.Playback(tt-monkeys) same => n.Set(CALLERID(num)=serveratls) same => n.Answer same => n.Noop(TLS = ${CHANNEL(secure_signaling)}.1. utiliza el puerto predefinido 5061 TCP.

216 Se abre el archivos sip.126.216:/etc/asterisk/keys scp serverB.49.125.49.49.125.112 disallow=all allow=alaw language=es qualify=yes transport=tls encryption=yes Se abre el puerto 5061 TCP en el firewall para la IP del servidorA nano /etc/sysconfig/iptables después de esta linea: -A INPUT -p tcp -m state --state NEW -m tcp --dport 5060 -j ACCEPT se pone: -A INPUT -p tcp -m state --state NEW -m tcp -s 96.228.228.228.conf y al final de la parte general se pone: tlsenable=yes tlsbindaddr=66.112 --dport 5061 -j ACCEPT 377 .pem root@66.crt root@66.mkdir /etc/asterisk/keys Se vuelve al servidor A y se copian las dos claves: scp ca.216 tlscertfile=/etc/asterisk/keys/serverB. Al final del archivo se configura la troncal para el servidorA: [serveratls] type=peer context=from-tls host=96.228.crt tlscapath=/etc/asterisk/keys tlsdontverifyserver=yes en tlsbindaddr se pone la dirección IP del servidorB.49.126.conf: nano /etc/asterisk/sip.216:/etc/asterisk/keys Esto suponiendo que la IP publica del servidorB sea 66.pem tlscafile=/etc/asterisk/keys/ca.

Se guardan los cambios y se reinicia iptables: service iptables restart Se pasa al dialplan: nano /etc/asterisk/extensions.hangup Se guardan los cambios y se recarga la configuración de ambos servidores: service asterisk reload Se averigua en el servidorA que el servidorB esté conectado: asterisk -rvvvvvvvvvvvvvvv CLI> sip show peers serverbtls 66.228. "SIP/serverbtls/71") in new stack 378 .conf Antes del contexto internas se pone: [from-tls] exten => 71.Answer same => n.Dial(SIP/serveratls/${EXTEN}) same => n.Playback(tt-monkeys) same => n.Noop(TLS = ${CHANNEL(secure_signaling)}.112 N 5061 OK (2 ms) N 5061 OK (1 ms) Ahora desde la extensión 1000 del servidorA se marca el numero 71 y se mira que pasa en la consola de ambos servidores: Servidor A: Executing [71@externas:1] Set("SIP/1000-00000022".1.Executing [71@externas:2] Dial("SIP/1000-00000022".216 Se hace la misma operación en el servidorB: CLI> sip show peers serveratls 96.125.49.1. "CALLERID(num)=serveratls") in new stack -.Set(CALLERID(num)=serverbtls) same => n.126. SRTP = ${CHANNEL(secure_media)}) same => n.Hangup En el contexto internas se pone: exten => 71.

"") in new stack -.Servidor B: Executing [71@from-tls:1] Answer("SIP/serveratls-00000015".Executing [71@from-tls:2] NoOp("SIP/serveratls-00000015".ulaw' (language 'es') -. SRTP = 1") in new stack -. "TLS = 1.<SIP/serveratls-00000015> Playing 'tt-monkeys. 379 . "tt-monkeys") in new stack -. Esto quiere decir que la señalización y el flojo media serán cifrados.Executing [71@from-tls:3] Playback("SIP/serveratls-00000015".Executing [71@from-tls:4] Hangup("SIP/serveratls-00000015". Otra forma de averiguarlo es activar con Ngrep la captura en el puerto 5061 en uno de los dos servidores: ngrep -W byline port 5061 Aparecerán puros bloques cifrados. "") in new stack Como se puede ver en la consola del servidorB la llamada que llega tiene activado el protocolo TLS (1) y el protocolo SRTP(1).

.

pem .0. se puede utilizar un socket TCP (puerto predefinido 5038) o el protocolo HTTP (puerto predefinido 8088).tlsprivatekey=/tmp/private. En negrita los valores de cada parámetro. el archivo http. Es posible activarlo y desactivarlo en cualquier momento desde la displayconnects timestampevents . Este parámetro define si por un usuario configurado en este archivo se aceptan una o más conexiones simultaneas. Los parámetros presentes son parecidos a la configuración del protocolo TLS en el archivo sip.tlscertfile=/tmp/asterisk.0. Valor yes yes – En la consola de Asterisk cada vez que un usuario configurado en el manager. Este tipo de configuración es aconsejado en el caso que se permita el acceso a la interfaz desde remoto. De deja comentado no – no se activa el debug de la AMI de forma predefinida.var3 debug .1 AMI (Asterisk Manager Interface) AMI (Asterisk Manager Interface) es una interfaz de monitoreo y gestión que interactúa con la PBX recibiendo eventos y/o enviando acciones que el sistema ejecutará.conf.0 todas las direcciones IP presentes en el servidor Es posible configurar la AMI para que utilice el protocolo TLS. En la tabla a seguir se indicarán los parámetros que se van a configurar con una breve descripción.conf.var2. Valor 0.0.tlsbindport=5039 .conf se conecte o se desconecte aparecerá una linea que lo notificará. Se dejan comentados.0 . El AMI se configura en el archivo de configuración manager.tlsenable=no . Parámetro [general] enabled webenabled port bindaddr .channelvars = var1.Capitulo XIX AMI y AGI 19.tlsbindaddr=0.conf y en el caso que se quiera utilizar también el protocolo HTTP.0.pem allowmultiplelogin Descripción Etiqueta que indica el inicio de la configuración general del archivo yes – Se activa el acceso a la AMI yes = se activa el acceso a la AMI vía HTTP 5038 – el puerto predefinido para la conexión a la AMI de Asterisk vía TCP Dirección IP donde la AMI aceptará conexiones. yes – añade una fecha en formato EPOCH para cada evento permite configurar unas variables que aparecerán cada vez que se genere un evento relacionado con un canal. Para conectarse a la AMI como cliente. Al final de la tabla. la configuración completa del archivo.

255.0. Valor en mili segundos que esperará Asterisk para enviar los datos al cliente conectado a la AMI. que tiene un cliente para autenticarse.0. Valor 0. Valor 60 define el numero máximo de sesiones simultaneas no autenticadas que aceptará la AMI. Valor: 100 382 httptimeout [admin] secret deny permit . Para esta configuración de prueba el valor es sesamo con este parámetro se define un rango de IP que no podrán acceder a la AMI de Asterisk con las credenciales del usuario configurado.eventfilter=Event: Newchannel . si el nombre del evento empieza con un punto exclamativo. se filtrará y no será enviado al cliente conectado a la AMI de Asterisk Se dejan comentadas.0.0/0. el tiempo máximo de vida del cookie http generado por la AMI 2.0.255. Valor: 20 define tres condiciones: 1. tiempo que la AMI esperará antes de cerrar la sesión con un cliente después de haber enviado una respuesta a la solicitud recibida Valor: 60 a partir de esta etiqueta se define el primer usuario que tendrá acceso a la AMI de Asterisk. si el nombre del evento no empieza con un punto exclamativo.1/255.0. Valor 127.255 En este caso solamente desde local. La contraseña que el usuario utilizará para conectarse a la AMI de Asterisk. Se utiliza en el caso que el cliente pierda la conexión con la AMI.0 (todas) con este parámetro se define un rango de IP que tendrán acceso a la AMI de Asterisk con las credenciales del usuario configurado. El parámetro eventfilter permite filtrar los eventos que recibirá el usuario una vez que esté conectado a la AMI de Asterisk. El valor entre corchetes es el nombre del usuario. Para los eventos se pueden crear dos tipos de configuraciones: 1.Parámetro consola de Asterisk authtimeout authlimit Descripción es el tiempo.0. expresado en segundos. el tiempo que esperará el servidor web de la AMI al recibir una acción de tipo “waitevent” antes de cerrar la solicitud 3. el tipo de evento se enviará 2. Utilizar siempre contraseñas fuertes.eventfilter=!Channel: DAHDI* writetimeout .

conf permite al usuario recibir eventos cuando se modifica una variable o se crea una nueva extensión en el dialplan Solo escritura Solo lectura dialplan originate Permite al usuario crear una nueva llamada utilizando la acción Originate de la AMI 383 . falta definir los permisos que el mismo usuario tendrá al conectarse con la AMI de Asterisk. crear canales en la PBX call agent permite al usuario acceder a todos los datos Permite al usuario enviar acciones para relacionados con las colas de espera y los gestionar y monitorear el estado de las agentes colas y los agentes Recibe eventos relacionados con las extensiones y los usuarios Jabber (XMPP) Solo escritura Permite generar eventos relacionados con las extensiones configuradas Permite al usuario leer. actualizar y recargar los archivos de configuración de Asterisk Permite al usuario ejecutar comandos de la consola de Asterisk Solo lectura permite al usuario ejecutar acciones para recibir estadísticas y reportes del sistema user config command DTMF reporting cdr Solo escritura permite al usuario recibir los eventos relacionados con los tonos permite al usuario recibir reportes de la calidad de las llamadas permite al usuario recibir eventos Solo lectura relacionados con el registro de las llamadas según la configuración del archivo cdr_manager. etc) Permite al usuario modificar. recargar la configuración. Estos permisos son de dos tipos: • • lectura escritura En la tabla que sigue la lista completa y el significado de cada uno de ellos: Parámetro all system Read El usuario puede leer todos los eventos de la AMI El usuario recibe todos los eventos relacionados con el funcionamiento de la PBX Permite al usuario recibir informaciones relacionadas con los canales de la PBX Write El usuario tiene acceso a todas las acciones de la AMI El usuario puede enviar acciones de sistema (reiniciar la PBX.Una vez configurado el usuario.

tlsenable=no .tlsbindport=5039 .conf.0 .0.0.conf y se copian las siguientes lineas: [general] enabled=yes webenabled=yes port=5038 bindaddr=0.0.conf.pem allowmultiplelogin=yes displayconnects=yes timestampevents=yes .0.var3 debug=no authtimeout=60 authlimit=20 httptimeout=60 [admin] secret=sesamo deny=0.agi permite al usuario recibir eventos generados por la ejecución de un AGI permite al usuario recibir eventos relacionados con el sistema CCSS (rellamada) permite al usuario recibir eventos relacionados con AOC (advice of charge) es decir el costo de la llamada corriente Más Informaciones en la wiki de Asterisk Permite al usuario generar acciones para la gestión de los canales creados por un AGI en modo asíncrono Solo lectura cc aoc permite al usuario generar un mensaje AOC para una determinada llamada.0.0.tlscertfile=/tmp/asterisk.0.tlsbindaddr=0.0/0.255 .tlsprivatekey=/tmp/private.255.pem .channelvars = var1.255. Se renombra el predefinido: mv /etc/asterisk/manager.var2.old se crea uno nuevo: nano /etc/asterisk/manager.0. Ahora se puede crear el archivo manager.conf /etc/asterisk/manager.eventfilter=Event: Newchannel 384 .0 .0 permit=127.1/255.0.0.

agent.agi.agi.command. enable.cdr. Con el comando: CLI> manager show commands aparecerá una lista de todos los comandos que se pueden utilizar desde la AMI de Asterisk..user.agent. disable debugging of the manager code manager show command Show a manager interface command manager show commands List manager interface commands manager show connected List connected manager interface users manager show eventq List manager interface queued events manager show settings Show manager global settings manager show users List configured manager users manager show user Display information on a specific manager user Primero se recarga la configuración: CLI> manager reload luego se controla que el usuario configurado aparezca:: CLI> manager show users username -------admin ------------------1 manager users configured. se ponen todos los valores posibles. Por cada comando. Para conocer la sintaxis: CLI> manager show command Login 385 . El usuario admin está presente.reporting.cc.dialplan.eventfilter=!Channel: DAHDI* writetimeout=100 read=system. aparecen los privilegios que se necesitan para ejecutarlo.aoc En las dos lineas read y write.dtmf.config.reporting.call. Entre ellos está el comando Login que permite conectarse a la AMI de Asterisk y es el que se utilizará para hacer la primera prueba. en la columna Privilege.aoc write=system. Se guardan los cambios y se entra en la consola de Asterisk: asterisk -rvvvvvvvvvvvvvvvvv Los comandos relacionados con la AMI de Asterisk: CLI> help manager manager reload Reload manager configurations manager set debug [on|off] Show.call.user.otiginate.

[Syntax] Action: Login [ActionID:] <value> Username: <value> [Secret:] <value> [Synopsis] Login Manager. Escape character is '^]'..0.1.0. Secret Secret to login with as specified in manager. Will be returned. Connected to localhost.. Después de la ultima linea la 386 . Username Username to login with as specified in manager.1 Action: Login Username: admin Secret: sesamo Events: Off Después de cada linea. Asterisk Call Manager/1. [See Also] Not available Para conectarse a la AMI de Asterisk se utilizará el programa Telnet. Se abre otra consola de Linux y se instala telnet: yum install telnet Se inicia el programa: telnet y se crea la conexión a la AMI de Asterisk: telnet> o localhost 5038 Trying 127. [Description] Login Manager. [Arguments] ActionID ActionID for this transaction.conf.conf. para pasar a la siguiente se presiona la tecla envío.

0..1 Otra prueba que se se puede hacer es ver la configuración de la extensión 1000 telnet telnet> o localhost 5038 Trying 127.1 Action: Login Username: admin Secret: sesamo Events: On Response: Success Message: Authentication accepted Event: FullyBooted Privilege: system. Asterisk Call Manager/1.all Status: Fully Booted En este caso.0.tecla envío se presiona dos veces. El resultado será: Response: Success Message: Authentication accepted Para salir de la AMI: Action: Logoff Response: Goodbye Message: Thanks for all the fish. Luego se ejecuta la acción para ver la configuración de la extensión 1000 Action: SIPshowpeer Peer: 1000 387 . Connection closed by foreign host. se activa la recepción de todos los eventos generados por la AMI.0. con Events:On.0.1 == Manager 'admin' logged off from 127.0..1. Connected to localhost.0. Escape character is '^]'. En la consola de Asterisk aparecerá: == Manager 'admin' logged on from 127.

Response: Success Channeltype: SIP ObjectName: 1000 ChanObjectType: peer SecretExist: Y RemoteSecretExist: N MD5SecretExist: N Context: externas Language: es Accountcode: 1000 AMAflags: Unknown CID-CallingPres: Presentation Allowed.38MaxDtgrm: 400 SIP-Sess-Timers: Accept SIP-Sess-Refresh: uas SIP-Sess-Expires: 1800 SIP-Sess-Min: 90 SIP-RTP-Engine: asterisk SIP-Encryption: N SIP-DTMFmode: rfc2833 ToHost: Address-IP: (null) Address-Port: 0 388 . Not Screened Callgroup: 1 Pickupgroup: 1 MOHSuggest: default VoiceMailbox: 1000@default TransferMode: open LastMsgsSent: -1 Maxforwards: 0 Call-limit: 2 Busy-level: 0 MaxCallBR: 384 kbps Dynamic: Y Callerid: "callerid=Fulano" <1000> RegExpire: -1 seconds SIP-AuthInsecure: no SIP-Forcerport: Y ACL: N SIP-CanReinvite: N SIP-DirectMedia: N SIP-PromiscRedir: N SIP-UserPhone: N SIP-VideoSupport: Y SIP-TextSupport: N SIP-T.38EC: FEC SIP-T.38Support: Y SIP-T.

Una ultima prueba es conectarse a la AMI y mirar cuales eventos se generan a lo largo de una llamada entre la extensión 1000 y la extensión 1001: telnet localhost 5038 Trying 127. 389 ..rinstance=c25bb0cf558f37bb QualifyFreq: 60000 ms Parkinglot: SIP-Use-Reason-Header: Y Action: Logoff Connection closed by foreign host. Escape character is '^]'.ulaw. Ya se puede salir de la AMI: Action:Logoff Response: Goodbye Message: Thanks for all the fish.g729 Status: UNKNOWN SIP-Useragent: X-Lite 4 release 4.Default-addr-IP: (null) Default-addr-port: 0 Default-Username: 1000 Codecs: 0x8010c (ulaw|alaw|g729|h263) CodecOrder: alaw.0..0.67.all Status: Fully Booted Una vez conectado a la AMI desde la extensión 1000 se llama la extensión 1001 y se mira lo que aparece en la consola de Linux. además aparecerán los eventos relacionados con el CCSS.1. Asterisk Call Manager/1.11:13642.1 stamp 63214 Reg-Contact: sip:1000@190.1 Action: Login Username: admin Secret: sesamo Events: On Response: Success Message: Authentication accepted Event: FullyBooted Privilege: system. Se verán toda una serie de informaciones relacionadas con la llamada.234. Connected to localhost.

también para el AGI es posible conocer los comandos disponibles desde la consola de Asterisk: asterisk -rvvvvvvvvvvvvvvv y se escribe: CLI> help agi agi dump html Dumps a list of AGI commands in HTML format agi exec Add AGI command to a channel in Async AGI agi set debug [on|off] Enable/Disable AGI debugging agi show commands [topic] List AGI commands or specific help Para una lista de los comandos que se pueden utilizar en un AGI: CLI> agi show commands ¿Cómo Funciona? La comunicación entre Asterisk y el AGI se apoya a los “files descriptors” del sistema operativo Linux que permiten una comunicación entre el Kernel y la aplicación que quiere acceder a un determinado archivo/programa.2 AGI (Asterisk Gateway Interface) El Asterisk Gateway Interface (AGI) permite desarrollar aplicaciones externas que pueden interactuar con Asterisk. PHP. Ruby que simplifican su escritura. Python. Normalmente se hace escribiendo código en distintos lenguajes de programación. Como para la AMI. En Linux. Claramente utilizar la AMI de esta forma es poco practico. espiar una llamada. es posible interactuar con la AMI de Asterisk vía HTTP. De hecho existen muchas librerías que simplifican está operación: Entre ellas: • • • • • PHP: PHPagi Python: Starpy Perl: Asterisk-perl Java: Asterisk-java Ruby: Adhearsion Como se ha dicho al inicio de este párrafo. desde script bash hasta script en Ruby. Entre ellas hay que citar la GUI para Asterisk de Digium. De hecho hay soluciones que utilizan este tipo de conexión. Estas aplicaciones pueden estar escritas en distintos lenguajes de programación y de hecho existen librerías en Perl. ver la actividad de una cola. Los tres estándar que se utilizan son: 390 . y FOP2 (Flash Operator Panel 2) que es un sistema que permite monitorear las actividad de las llamadas de Asterisk y al mismo tiempo efectuar algunas acciones entre las cuales: transferir una llamada.Connection closed by foreign host. cuya instalación se explicará en el capitulo XXVI. 19.

20.tgz Se descomprime: tar -xf phpagi-2. primero se instala php: yum install php-* luego de descarga la librería: cd /usr/src wget http://downloads.20/phpagi-2. se utilizarán la librería PHPAGI y PHP.• • • STDIN STDOUT STDERR Visto de forma gráfica: Esto permite. como ya se ha dicho.php /var/lib/asterisk/agi-bin 391 .20 y se copian las dos librerías para AGI en la carpeta de agi-bin de Asterisk: cp phpagi. Para los ejemplos a seguir.20.tgz se entra en la carpeta creada: cd phpagi-2. escribir el AGI utilizando prácticamente cualquier lenguaje de programación.net/project/phpagi/phpagi/2. Para PHPAGI.php /var/lib/asterisk/agi-bin cp phpagi-asmanager.sourceforge.

nano /etc/asterisk/phpagi. se indica la ubicación del archivo text2wave.com tempdir=/var/spool/asterisk/tmp/ [asmanager] server=localhost port=5038 username=admin secret=sesamo [fastagi] setuid=true basedir=/var/lib/asterisk/agi-bin/ [festival] text2wave=/usr/bin/text2wave El primer bloque del archivo es dedicado al la configuración de PHPAGI para la ejecución de script AGI. En en segundo bloque [asmanager].conf se copian las siguientes lineas: [phpagi] debug=false error_handler=true admin=fulano@gmail. para utilizar Festival como sistema de texto a voz.linode.php 392 .se vuelven los archivos ejecutables: chmod 755 /var/lib/asterisk/agi-bin/phpagi. se configura los datos de acceso a la AMI de Asterisk para el usuario admin anteriormente creado. Se guardan los cambios y se crea el primer AGI: nano /var/lib/asterisk/agi-bin/pruebaudio.php chmod 755 /var/lib/asterisk/agi-bin PHPAGI se apoya a un archivo de configuración que hay que crear en la carpeta /etc/asterisk.members. El tercer bloque es para la configuración de FastAGI (cuando se ejecutan los script AGI sobre una conexión TCP) Por ultimo.com hostname=li374-112.

Executing [250@externas:1] AGI("SIP/1000-00000050". 1) exited non-zero on 'SIP/1000-00000050' Si se activa el debug agi: CLI> agi set debug on 393 . ?> Se vuelve ejecutable el archivo: chmod +x /var/lib/asterisk/agi-bin/pruebaudio.Playing 'demo-congrats' (escape_digits=) (sample_offset 0) -. $agi-> answer().php") in new stack -.php completed.Launched AGI Script /var/lib/asterisk/agi-bin/pruebaudio.php -. $agi = new AGI().Agi(pruebaudio.Hangup Se guardan los cambios. "pruebaudio. 250. se entra en la consola de Asterisk y se recarga el dialplan: asterisk -rvvvvvvvvvvvv CLI> dialplan reload la sintaxis de la aplicación AGI: CLI> core show application agi [Syntax] AGI(command[.<SIP/1000-00000050>AGI Script pruebaudio.php').arg2[. returning 4 == Spawn extension (externas.conf en el contexto internas se añade: exten => 250.php Se modifica el dialplan para añadir el AGI: nano /etc/asterisk/extensions. error_reporting(E_ALL)..1. En la consola aparecerá: -. $agi-> stream_file('demo-congrats'). $agi-> hangup()...php) same => n.]]]) Desde la extensión 1000 se marca el numero 250.#!/usr/bin/php -q <?php require('phpagi.arg1[.

php") in new stack -.81 <SIP/1000-00000051>AGI Tx >> agi_version: 1.Launched AGI Script /var/lib/asterisk/agi-bin/pruebaudio.php completed. 394 .php <SIP/1000-00000051>AGI Tx >> agi_channel: SIP/1000-00000051 <SIP/1000-00000051>AGI Tx >> agi_language: es <SIP/1000-00000051>AGI Tx >> agi_type: SIP <SIP/1000-00000051>AGI Tx >> agi_uniqueid: 1331227067. returning 4 == Spawn extension (externas.php <SIP/1000-00000051>AGI Tx >> agi_request: pruebaudio. $agi = new AGI(). Otro ejemplo podría ser devolver al llamante su CallerID nano /var/lib/asterisk/agi-bin/callerid.0 <SIP/1000-00000051>AGI Tx >> agi_accountcode: 1000 <SIP/1000-00000051>AGI Tx >> agi_threadid: -1229980784 <SIP/1000-00000051>AGI Tx >> <SIP/1000-00000051>AGI Rx << ANSWER <SIP/1000-00000051>AGI Tx >> 200 result=0 <SIP/1000-00000051>AGI Rx << STREAM FILE demo-congrats "" 0 -.8.Playing 'demo-congrats' (escape_digits=) (sample_offset 0) <SIP/1000-00000051>AGI Tx >> 200 result=0 endpos=313776 <SIP/1000-00000051>AGI Rx << HANGUP <SIP/1000-00000051>AGI Tx >> 200 result=1 -. 250.php #!/usr/bin/php -q <?php require('phpagi.<SIP/1000-00000051>AGI Script pruebaudio. 1) exited non-zero on 'SIP/1000-00000051' Asterisk. antes de procesar el agi. envía todas las variables relacionadas con el canal.php').2 <SIP/1000-00000051>AGI Tx >> agi_callerid: 1000 <SIP/1000-00000051>AGI Tx >> agi_calleridname: callerid=Fulano <SIP/1000-00000051>AGI Tx >> agi_callingpres: 0 <SIP/1000-00000051>AGI Tx >> agi_callingani2: 0 <SIP/1000-00000051>AGI Tx >> agi_callington: 0 <SIP/1000-00000051>AGI Tx >> agi_callingtns: 0 <SIP/1000-00000051>AGI Tx >> agi_dnid: 250 <SIP/1000-00000051>AGI Tx >> agi_rdnis: unknown <SIP/1000-00000051>AGI Tx >> agi_context: externas <SIP/1000-00000051>AGI Tx >> agi_extension: 250 <SIP/1000-00000051>AGI Tx >> agi_priority: 1 <SIP/1000-00000051>AGI Tx >> agi_enhanced: 0.El resultado será: -.8. $agi-> answer(). error_reporting(E_ALL).Executing [250@externas:1] AGI("SIP/1000-00000051". "pruebaudio.

$agi->text2wav("Hola extension $callerid").php) same => n.Hangup asterisk -rvvvvvvvvvvvv CLI> dialplan reload Desde la extensión 1000 se marca 251.Agi(callerid.1.$callerid = $agi->request['agi_callerid']. $agi-> hangup().0.tar Se descomprime: tar -xf wakeup.php: chmod +x wakeup.conf exten => 251.php se copia en la carpeta agi-bin de asterisk: cp wakeup.0. ?> chmod +x /var/lib/asterisk/agi-bin/callerid.php /var/lib/asterisk/agi-bin/ Terminada esta primera parte se modifica el Dialplan para crear una nueva extensión que se usará para programar el despertador nano /etc/asterisk/extensions.conf Se añaden las siguientes dos líneas en el contexto internas: 395 .voztovoice. El ultimo ejemplo es un despertador que no utiliza la librería PHPAGI sino PHP “puro”: cd /usr/src wget http://www.2.php nano /etc/asterisk/extensions.tar Se entra en la carpeta: cd wakeup.0 Se vuelve ejecutable el archivo wakeup.2.org/tmp/wakeup.2.

6. Esta aplicación desde la versión 1.agi(wakeup. Cuando llega la llamada del despertador. utiliza un file descriptor para la creación de un flujo audio procedente del canal que ha llamado la aplicación.3 Las variantes AGI Ademas de la aplicación AGI que se acaba de ilustrar.exten => 77.X de Asterisk existía también la aplicación DeadAGI que normalmente se utilizaba en un canal que había sido terminado. Algunos datos: CLI> core show application EAGI 396 .4. en el softphone aparecerá: 19.3.1 EAGI La gran diferencia entre AGI y EAGI es que el segundo. Estas son: • • • EAGI FastAGI Async AGI Hasta la versión 1.X es “deprecated” y va sustituida con la normal aplicación AGI 19.php) same=> n.1.Set(CHANNEL(language)=es) same => n. Una vez programado si desde la misma extensión se marca otra vez la extensión 77 se tendrá la opción de poder modificar la hora del despertador. existen una variantes que se utilizan en algunos escenarios muy específicos.Hangup Se guarda el archivo y se recarga el dialplan: asterisk -rvvvvvvvvvvv CLI> dialplan reload Ahora desde un extensión 1000 se marca el numero 77 y se siguen las instrucciones para programar el despertador. ademas de comunicarse con Asterisk a través de STDIN y STDOUT.

El control sobre el canal se hace vía TCP y no requiere iniciar un nuevo proceso por cada llamada.2 FastAGI FastAGI trabaja sobre una conexión TCP que se realiza con un servidor FastAGI.-= Info about application 'EAGI' =[Synopsis] Executes an EAGI compliant application. read DTMF digits.]]]) [Arguments] Not available [See Also] AGI(). in the case of a net script.0'.. even upon hangup until the AGI application signals a desire to stop (either by exiting or.3.arg1[. [Description] Using 'EAGI' provides enhanced AGI. Use the CLI command 'agi show commands' to list available agi commands.. with incoming audio available out of band on file descriptor 3. etc. A locally executed AGI script will receive SIGHUP on hangup from the channel except when using DeadAGI. As of '1. Executes an Asterisk Gateway Interface compliant program on a channel.. A fast AGI server will correspondingly receive a HANGUP inline with the command dialog. This application sets the following channel variable upon completion: ${AGISTATUS}: The status of the attempt to the run the AGI script text string.arg2[. Dialplan execution will continue normally. play audio. by communicating with the AGI protocol on *stdin* and *stdout*. AGI allows Asterisk to launch external programs written in any language to control a telephony channel. La sintaxis es: AGI(agi://IPservidorFastAGI:puerto) El puerto predefinido es el 4573 397 .6. by closing the connection). this channel will not stop dialplan execution on hangup inside of this application. DeadAGI() 19. Both of theses signals may be disabled by setting the ${AGISIGHUP} channel variable to 'no' before executing the AGI application. one of: SUCCESS FAILURE NOTFOUND HANGUP [Syntax] EAGI(command[.

8.Noop same => n.11. Aparecerá: Consola Asterisk: -.Executing [253@externas:2] AGI("SIP/1000-00000011". 3) exited non-zero on 'SIP/1000-00000011' Consola del servidor FastAgi: AGI Environment Dump from 59836 --.0.callingani2 = 0 -.8.conf En el contexto internas se añade el siguiente bloque: exten => 252.callingpres = 0 -. "") in new stack == Spawn extension (externas.Executing [253@externas:1] NoOp("SIP/1000-00000011".<SIP/1000-00000011>AGI Script agi://127.En las fuentes de Asterisk es presente un servidor FastAGI para hacer una prueba.callingtns = 0 -. returning 0 -.0.1:4573) same => n.1:4573") in new stack -.0.Executing [253@externas:3] Hangup("SIP/1000-00000011".Hangup Se guardan los cambios y se recarga el dialplan: asterisk -rvvvvvvvvvvvvv CLI> dialplan reload Se cambian los permisos del servidor FastAGI: chmod 755 /usr/src/asterisk-1.0.1:4573 completed.0/agi/fastagi-test y se inicia: /usr/src/asterisk-1.callerid = 1000 -. Primero se modifica el dialplan: nano /etc/asterisk/extensions. "agi://127.1.AGI(agi://127. 253.11. "") in new stack -.callington = 0 398 .0/agi/fastagi-test Desde la extensión 1000 se marca el numero 252.0.0.calleridname = callerid=Fulano -.accountcode = 1000 -.

0.PASS (0) 4.dnid = 253 -.enhanced = 0. Testing 'record'. 19.priority = 2 -.conf.language = es -.PASS (0) 6a.version = 1.request = agi://127.1:4573 -.3. Testing 'sendtext'. cosa que se hizo cuando se configuró el usuario admin en el manager.conf deber tener los permisos de lectura y escritura para el parámetro agi.threadid = -1224852592 -. De esta forma es posible abrir un canal y luego desde la AMI enviar los comandos al canal abierto..rdnis = unknown -.PASS (0) 6.PASS (0) 5. 0 failed ================================================== Un “framework” que utiliza FastAGI es Adhearsion.network = yes -.8.. Testing 'saynumber'. Para probar la funcionalidad de modifica el dialplan: nano /etc/asterisk/extensions.conf y se añade el bloque que sigue: 399 . Testing 'sendfile'.extension = 253 -..channel = SIP/1000-00000011 -..context = externas -.2 1.8. el usuario configurado en el manager.PASS (0) ================== Complete ====================== 7 tests completed...0...type = SIP -..0 -.PASS (0) 2. Desde el punto de vista del dialplan la sintaxis es muy sencilla: AGI(agi:async) Para poder enviar las acciones AGI a la AMI de Asterisk.. 7 passed. Testing 'record' playback.21 -..uniqueid = 1331242231..3 Async AGI Async AGI permite el envío de los comandos a través de la AMI de Asterisk..-. Testing 'sendimage'. Testing 'waitdtmf'..PASS (0) 3.

0.1..AGI(agi:async) same => n.Hangup Se guardan los cambios y se recarga el dialplan: asterisk -rvvvvvvvvvvvv CLI> dialplan reload Antes de marcar la extensión 253.1.1 Se autentica el usuario admin: Action:login Username:admin Secret:sesamo Events:off Response: Success Message: Authentication accepted Se ejecuta la primera acción agi para contestar el canal (el numero de canal aparece en la consola de Asterisk): Action:Agi Channel:SIP/1000-00000017 Command:Answer Response: Success Message: Added AGI command to queue Se envía la música de espera al canal: Action:Agi Channel:SIP/1000-00000017 Command:Exec startmusiconhold Response: Success Message: Added AGI command to queue 400 .0. Escape character is '^]'. se abre otra ventana terminal y se crea una conexión manual a la AMI de Asterisk: telnet localhost 5038 Trying 127.exten => 253.Noop same => n. Asterisk Call Manager/1. Connected to localhost..

"agi:async") in new stack <SIP/1000-00000017>AGI Tx >> agi_request: async <SIP/1000-00000017>AGI Tx >> agi_channel: SIP/1000-00000017 <SIP/1000-00000017>AGI Tx >> agi_language: es <SIP/1000-00000017>AGI Tx >> agi_type: SIP <SIP/1000-00000017>AGI Tx >> agi_uniqueid: 1331246894.Se para la música de espera en el canal: Action:Agi Channel:SIP/1000-00000017 Command:Exec stopmusiconhold Response: Success Message: Added AGI command to queue Se termina la llamada: Action:Agi Channel:SIP/1000-00000017 Command:hangup Response: Success Message: Added AGI command to queue En la consola de Asterisk aparecerá: -.0 <SIP/1000-00000017>AGI Tx >> agi_accountcode: 1000 <SIP/1000-00000017>AGI Tx >> agi_threadid: -1225098352 <SIP/1000-00000017>AGI Tx >> <SIP/1000-00000017>AGI Tx >> 200 result=0 -.AGI Script Executing Application: (startmusiconhold) Options: () 401 .Executing [254@externas:1] NoOp("SIP/1000-00000017".8. "") in new stack -.8.2 <SIP/1000-00000017>AGI Tx >> agi_callerid: 1000 <SIP/1000-00000017>AGI Tx >> agi_calleridname: callerid=Fulano <SIP/1000-00000017>AGI Tx >> agi_callingpres: 0 <SIP/1000-00000017>AGI Tx >> agi_callingani2: 0 <SIP/1000-00000017>AGI Tx >> agi_callington: 0 <SIP/1000-00000017>AGI Tx >> agi_callingtns: 0 <SIP/1000-00000017>AGI Tx >> agi_dnid: 254 <SIP/1000-00000017>AGI Tx >> agi_rdnis: unknown <SIP/1000-00000017>AGI Tx >> agi_context: externas <SIP/1000-00000017>AGI Tx >> agi_extension: 254 <SIP/1000-00000017>AGI Tx >> agi_priority: 2 <SIP/1000-00000017>AGI Tx >> agi_enhanced: 0.Executing [254@externas:2] AGI("SIP/1000-00000017".27 <SIP/1000-00000017>AGI Tx >> agi_version: 1.

Started music on hold. class 'default'.Stopped music on hold on SIP/1000-00000017 <SIP/1000-00000017>AGI Tx >> 200 result=0 <SIP/1000-00000017>AGI Tx >> 200 result=1 == Spawn extension (externas. 254.AGI Script Executing Application: (stopmusiconhold) Options: () -.-. on SIP/1000-00000017 <SIP/1000-00000017>AGI Tx >> 200 result=0 -. 2) exited non-zero on 'SIP/1000-00000017' 402 .

.

Útil para hacerle seguimiento a la . enviada a una cola.1 CDR (Call Detail Record) En el párrafo 1.Capitulo XX Los registros en Asterisk Asterisk guarda toda una serie de registros relacionados con su actividad en distintos archivos. se verán los siguientes datos: En orden: • • • • • • • • • • • • • • • • • • id: numero progresivo que identifica cada entrada de la tabla calldate: fecha y hora de la llamada clid: callerID del llamante src: numero de la extensión que ha iniciado la llamada dst: numero de la extensión de destino dcontext: contexto que se ha utilizado channel: nombre del canal de quien ha originado la llamada dstchannel: nombre del canal de destino lastapp: aplicación utilizada lastdata: opciones de la aplicación utilizadas duration: duración total de la llamada billsec: duración de la llamada después de que ha sido contestada disposition: resultado de la aplicación ejecutada (en este caso BUSY) amaflags: parámetro utilizado para la facturación de la llamada accountcode: numero de cuenta para facturación de la llamada peeraccount: cuenta del usuario (lado peer) uniqueid: numero único que identifica la llamada linkedid: numero único que identifica la llamada y que mantiene el mismo valor en el caso la llamada sea transferida.conf 20. parqueada. Una parte están relacionados con las llamadas y otra parte con el funcionamiento de la PBX. En este capitulo se hablará de: • • • CDR (Call Detail Record) CEL (Channel Event Logging) Logger.7 se ha visto como crear una base de datos MySQL y una tabla (cdr) para guardar los registros de las llamadas. Mirando una entrada en la tabla CDR. etc..

• llamada userfield: campo personalizable por el usuario. después de esta linea: exten => _00X..Set(CDR(userfield)=${CHANNEL(peerip)}) Con esta linea se asocia al campo userfield del CDR.NoOp se añade: same => n. Los mismos datos se guardan también en distintos archivos CSV presentes en la la carpeta /var/log/asterisk.1. Se abre el dialplan: nano /etc/asterisk/extensions. entre ellos “peerip”. Una primera cosa que se puede hacer es utilizar el campo userfield para guardar la IP de donde se originó la llamada.conf y en el contexto internacio. la IP del canal que está originando la llamada. Terminada la llamada se vuelve a Webmin y se mira la ultima entrada de la tabla CDR. ls -l /var/log/asterisk total 192 drwxr-xr-x 2 root root 4096 Mar 22 11:42 cdr-csv drwxr-xr-x 2 root root 4096 Mar 20 10:11 cdr-custom 405 .y algunas sub-carpetas (en negrita). Para esta configuración se utiliza la función CHANNEL que permite leer muchos datos de un determinado canal. En el campo userfield aparecerá la IP de donde se originó la llamada: Este tipo de solución puede ser muy útil para conocer en cualquier momento de donde las extensiones están originando sus llamadas y de esta forma monitorear si se están presentando ataques exitosos a la PBX. Se guardan los cambios y se recarga el dialplan: asterisk -rvvvvvvvvvvvvv CLI> dialplan reload Ahora desde la extensión 1000 se llama un numero de teléfono fijo/celular.

drwxr-xr-x 2 root root 4096 Mar 20 10:11 cel-custom -rw-r--r-. Ejemplo: cuando desde una extensión se marca a un grupo de extensiones.csv -rw-r--r-. total 72 -rw-r--r-.csv.1 root root 2022 Mar 22 17:35 queue_log La carpeta cdr-csv contiene el archivo Master.1 cdr. Con yes el calculo tendrá en cuenta los micro segundos. En la tabla que sigue los distintos parámetros con una descripción.csv -rw-r--r-.conf Lo que se guarda y como se guardan los datos en el CDR depende de la configuración del archivo cdr. En negrita el valor asignado a cada parámetro. Asterisk para determinar la duración de una llamada hace un calculo entre los segundos totales de la llamada menos los segundos desde que la llamada ha sido contestada. Ejemplo: segundos de la llamada 20. redondea a los números enteros.1 root root 1059 Mar 22 17:45 1002.csv -rw-r--r-.csv -rw-r--r-. y un archivo por cada extensión/cuenta.1 root root 32149 Mar 24 11:10 Master. que contiene la lista de todas las llamadas efectuadas.1 root root 149285 Mar 23 15:27 messages -rw-r--r-. no = reporta todas las llamadas incluyendo la no contestadas siempre y cuando el destino sea un solo numero/extensión no = los datos se guardan en el CDR cuando ambos canales se hayan terminado.1 root root 24576 Mar 23 15:21 master.db -rw-r--r-.1 root root 1113 Mar 23 16:26 marko2. yes = se guardan antes de la extensión h (si presente).csv -rw-r--r-.1 root root 8055 Mar 22 17:44 1001.111111 redondeado = 11 406 endbeforehexten initiatedseconds .csv 20.222222 – segundos desde que se contestó 10.111111 = tiempo de conversación 10.1. Parámetro [general] enable unanswered Descripción Etiqueta que indica el inicio de la parte general de la configuración yes = se habilita el registro CDR yes = reporta todas las llamadas no contestadas con múltiples destinos y una sola origen.conf. Ejemplo: segundos de la llamada 20 – segundos desde que se contestó 10 = tiempo de conversación 10 Esto porque a pesar que guarde los datos en micro segundos.1 root root 261 Mar 21 11:09 Mengano.1 root root 18847 Mar 24 11:10 1000.

se deja comentado. estos se guardarán en los distintos archivos/base de datos.scheduleronly=no . Se deja comentado. cuando en el buffer de memoria se alcancen 100 registros. Se deja comentado. Utilizar con cuidado. este parámetro se pone igual a no.old se crea uno nuevo: nano /etc/asterisk/cdr.conf /etc/asterisk/cdr.time=300 .conf y se copial las lineas que siguen: [general] enable=yes unanswered=no 407 . yes = los datos se guardan en un buffer de memoria y se escriben solamente cuando se alcance el numero o el tiempo definidos en el próximos dos parámetros. Si la PBX va en error o el proceso se termina. . Para un valor inferior a 10 se pone igual a yes. Valor: yes batch no = los datos se guardan en el CDR cada vez que una llamada termine.conf. los datos en el buffer se perderán. la PBX antes de cerrarse guardará los registros CDR presentes en el buffer de memoria En este bloque se define como se guardarán los registros CDR en los archivos csv.size=100 . Este parámetro tiene prioridad sobre el parámetro size. si el parámetro size es mayor que 10.safeshutdown=yes [csv] usegmtime loguniqueid loguserfield accountlogs Se renombra el archivo predefinido: mv /etc/asterisk/cdr. cada cuantos segundos guardar los registros del CDR presentes en el buffer de memoria.Parámetro Descripción Esto resuelve el desenlace que a veces se encuentra entre la duración de la llamada presente en el CDR y la duración que factura el proveedor VoIP. no = no se guarda la hora en GMT sino en el huso horario configurado en el servidor yes = en el archivo csv se guarda el campo uniqueID yes = en el archivo csv se guarda el campo userfield yes = se creará un archivo para cada accountcode configurado en Asterisk. yes = si se para Asterisk.

en la configuración del los usuarios en el manager. Para volverla disponible.1.conf. en la AMI de Asterisk.2 cdr_manager.scheduleronly=no . se abre el siguiente archivo: 408 . los eventos relacionados con los registros CDR.size=100 .1.endbeforehexten=no initiatedseconds=yes batch=no . hay el parámetro “cdr” que permite recibir. Por defecto esta funcionalidad no está activada.safeshutdown=yes [csv] usegmtime=no loguniqueid=yes loguserfield=yes accountlogs=yes Se guardan los cambios y se recarga la configuración de Asterisk: service asterisk reload Se entra en la consola de Asterisk: asterisk -rvvvvvvvvvvvvvvvvvvv y se revisa la configuración con el comando: CLI> cdr show status Call Detail Record (CDR) settings ---------------------------------Logging: Enabled Mode: Simple Log unanswered calls: No * Registered Backends ------------------mysql csv cdr_sqlite3_custom cdr-custom Adaptive ODBC 20. entre los permisos que se pueden configurar.time=300 .conf Como se ha visto en el parrafo 19.

so Si se controla el estado del CDR se notará que la nueva funcionalidad está activada (en negrita): CLI> cdr show status Call Detail Record (CDR) settings ---------------------------------Logging: Enabled Mode: Simple Log unanswered calls: No * Registered Backends ------------------cdr_manager mysql csv cdr_sqlite3_custom cdr-custom Adaptive ODBC Se puede hacer una prueba entrando en la AMI de asterisk: telnet localhost 5038 autenticándose: Action:Login Username:admin Secret:sesamo y efectuando una llamada desde la extensión 1000 a la extensión 1001.nano /etc/asterisk/cdr_manager. en la AMI aparecerá: 409 .conf y se modifica esta linea: enabled=no para que quede: enabled=yes Se guardan los cambios y se reinicia el modulo desde la consola de Asterisk: CLI> module reload cdr_manager. Al terminar la llamada. entre los distintos eventos.

dst varchar(80) NOT NULL default ''.937863 AccountCode: 1000 Source: 1000 Destination: 1001 DestinationContext: externas CallerID: "callerid=Fulano" <1000> Channel: SIP/1000-00000008 DestinationChannel: SIP/1001-00000009 LastApplication: Dial LastData: SIP/1001.45.10 UserField: 20. calldate datetime NOT NULL default '0000-00-00 00:00:00'.all Timestamp: 1332542079. src varchar(80) NOT NULL default ''. dcontext varchar(80) NOT NULL default ''.8 ha sido etiquetado como “deprecated”. Para obviar este problema.Event: Cdr Privilege: cdr. lastdata varchar(80) NOT NULL default ''. primero se crea una segunda tabla en la base de datos asteriskcdr: mysql -u root -psesamo mysql> use asteriskcdr mysql> CREATE TABLE cdr2 ( id bigint(20) NOT NULL auto_increment. clid varchar(80) NOT NULL default ''. dstchannel varchar(80) NOT NULL default ''. una solución es utilizar el modulo cdr_adaptive_odbc que permite utilizar el conector ODBC para conectarse a una tabla de una base de datos y guardar los registros de las llamadas. pronto ese modulo no estará disponible para la instalación. channel varchar(80) NOT NULL default ''. Para probarlo.hHkKtTwWxX StartTime: 2012-03-23 17:34:26 AnswerTime: 2012-03-23 17:34:29 EndTime: 2012-03-23 17:34:39 Duration: 13 BillableSeconds: 11 Disposition: ANSWERED AMAFlags: DOCUMENTATION UniqueID: 1332542066. lastapp varchar(80) NOT NULL default ''.3 CDR adaptive Como el modulo cdr-mysql en la ultima versión de la rama 1. 410 .1.

duration int(11) NOT NULL default '0'. userfield varchar(255) NOT NULL default ''.ini Al final del archivo se añaden las siguientes lineas: [asteriskcdr] Description = MySQL AsteriskCDR Driver = MySQL Database = asteriskcdr Server = localhost User = asterisk Password = sesamo Port = 3306 Option = 3 Se pasa al archivo res_odbc: nano /etc/asterisk/res_odbc. uniqueid varchar(32) NOT NULL default ''. disposition varchar(45) NOT NULL default ''. se copian las siguientes lineas: [asteriskcdr] enabled => yes dsn => asteriskcdr username => asterisk password => sesamo pre-connect => yes sanitysql => select 1 idlecheck => 3600 connect_timeout => 10 411 .conf y al final del archivo. KEY callerid (clid) ). linkedid varchar(80) NOT NULL default ''. accountcode varchar(20) NOT NULL default ''. PRIMARY KEY (`id`). amaflags int(11) NOT NULL default '0'. billsec int(11) NOT NULL default '0'. Se sale del cliente MySQL y se configura el odbc. peeraccount varchar(20) NOT NULL default ''.ini: mysql> quit nano /etc/odbc.

conf': == Found [Mar 27 15:40:32] NOTICE[11036]: res_odbc.conf.conf table=cdr2: la tabla MySQL donde se guardarán los datos alias start => calldate: en cdr_adaptive hay tres campos donde se guardan diferentes momentos de la llamada: cuando inicia.c:1511 odbc_obj_connect: res_odbc: Connected to asterisk [asterisk] [Mar 27 15:40:32] NOTICE[11036]: res_odbc.conf y se copian las siguientes lineas: [cdr2] connection=asteriskcdr table=cdr2 alias start => calldate • • • • [cdr2]: un nombre que se le asigna a la conexión connection=asteriskcdr: en este parámetro hay que poner la etiqueta que define el bloque creado en res_odbc.c:1511 odbc_obj_connect: res_odbc: Connected to asteriskcdr [asteriskcdr] [Mar 27 15:40:32] NOTICE[11036]: res_odbc.c:902 load_odbc_config: Registered ODBC class 'asterisk' dsn->[asterisk] [Mar 27 15:40:32] NOTICE[11036]: res_odbc.conf Reloading module 'res_odbc.Por ultimo se configura el archivo cdr_adaptive_odbc.conf /etc/asterisk/cdr_adaptive_odbc. answer y end.c:902 load_odbc_config: Registered ODBC class 'asteriskcdr' dsn->[asteriskcdr] 412 .c:1481 odbc_obj_connect: Connecting asterisk [Mar 27 15:40:32] NOTICE[11036]: res_odbc.c:1481 odbc_obj_connect: Connecting asteriskcdr [Mar 27 15:40:32] NOTICE[11036]: res_odbc.old se crea uno nuevo: nano /etc/asterisk/cdr_adaptive_odbc. cuando se contesta y cuando se termina.so' (ODBC resource) == Parsing '/etc/asterisk/res_odbc. Los nombres de estos campos son respectivamente start. Se guardan los cambios y se entra en la consola de Asterisk: asterisk -rvvvvvvvvvvvvvvvvv se recarga el moudlo res_odbc y luego el modulo cdr adaptive: CLI> module reload res_odbc. Esto se hace indicando un alias y definiendo que el campo calldate contendrá el valor del campo start de cdr_adaptive (cuando la llamada inicia). Por este motivo para que este campo contenga un valor hay que escoger unos de los tres que crea cdr_adaptive.conf mv /etc/asterisk/cdr_adaptive_odbc. El campo calldate no existe.

amaflag s.12.0) > Found lastdata column with type 12 with len 80. and numlen (0.dcontext. octetlen 80.disposition. and numlen (0. octetlen 10. and numlen (0.'SIP/1000-0000000f'.'SIP/100100000010'. and numlen (0. octetlen 80.0) > Found lastapp column with type 12 with len 80. and numlen (0. and numlen (0.'13328813 57.0) > Found src column with type 12 with len 80. En la tabla: La misma entrada estará en la tabla CDR.'1332881357. and numlen (0. octetlen 80. and numlen (0.uniqueid.17')] Que indica que los datos de la llamada se han guardado en la tabla CDR2. octetlen 32. and numlen (0.3.channel.0) > Found duration column with type 4 with len 10.17'. octetlen 10.billsec.dst. and numlen (0.CLI> module reload cdr_adaptive_odbc. en la consola de Asterisk aparecerá: [INSERT INTO cdr2 (calldate.0) Ahora se puede efectuar una primera prueba.'ANSWERED'. octetlen 19.0) > Found amaflags column with type 4 with len 10. octetlen 255.'Dial'.10) -. and numlen (0. and numlen (0.0) > Found dstchannel column with type 12 with len 80. octetlen 45.Found adaptive CDR table cdr2@asteriskcdr. octetlen 10.45. and numlen (0.0) > Found linkedid column with type 12 with len 80. octetlen 80.0) > Found channel column with type 12 with len 80. octetlen 80.0) > Found peeraccount column with type 12 with len 20.10) > Found clid column with type 12 with len 80.0) > Found userfield column with type 12 with len 255. and numlen (0.clid.linkedid) VALUES ({ ts '2012-03-27 15:49:17' }.conf': == Found -.'1001'.src.Found alias start for column calldate in cdr2@asteriskcdr > Found calldate column with type 93 with len 19. octetlen 80.0) > Found dcontext column with type 12 with len 80.duration.10. and numlen (0. octetlen 19.so' (Adaptive ODBC CDR backend) == Parsing '/etc/asterisk/cdr_adaptive_odbc.hHkKtTwWxX'.lastdata.0) > Found uniqueid column with type 12 with len 32. Al terminar la llamada.10) > Found accountcode column with type 12 with len 20. > Found id column with type -5 with len 19. octetlen 20. octetlen 80. octetlen 80.accountcode. and numlen (0. octetlen 80. Desde la extensión 1000 se marca a la extensión 1001.so Reloading module 'cdr_adaptive_odbc.'1000'.10) > Found billsec column with type 4 with len 10.'1000'. and numlen (0.dstchannel.'"callerid=Fulano" <1000>'. and numlen (0.10) > Found disposition column with type 12 with len 45.'SIP/1001. octetlen 20.0) > Found dst column with type 12 with len 80.'externas'. Otra cosa que se puede hacer con el modulo CDR Adaptive 413 .lastapp. and numlen (0.

clid varchar(80) NOT NULL default ''. duration int(11) NOT NULL default '0'. mysql -u root -psesamo mysql> use asteriskcdr mysql> CREATE TABLE cdr3 ( id bigint(20) NOT NULL auto_increment. amaflags int(11) NOT NULL default '0'. channel varchar(80) NOT NULL default ''.es filtrar los datos que se van a guardar en la tabla. src varchar(80) NOT NULL default ''. Se sale del cliente MySQL: mysql> quit Luego se modifica el archivo cdr_adaptive_odbc. dcontext varchar(80) NOT NULL default ''. dstchannel varchar(80) NOT NULL default ''. calldate datetime NOT NULL default '0000-00-00 00:00:00'. disposition varchar(45) NOT NULL default ''.conf: nano /etc/asterisk/cdr_adaptive_odbc. billsec int(11) NOT NULL default '0'. dst varchar(80) NOT NULL default ''. accountcode varchar(20) NOT NULL default ''. lastapp varchar(80) NOT NULL default ''. lastdata varchar(80) NOT NULL default ''. uniqueid varchar(32) NOT NULL default ''. userfield varchar(255) NOT NULL default ''. peeraccount varchar(20) NOT NULL default ''.conf Al final del archivo se añade el siguiente bloque: [cdr3] connection=asteriskcdr table=cdr3 alias start => calldate filter src => 1000 414 . PRIMARY KEY (`id`). En el ejemplo que sigue se guardarán en una nueva tabla solamente las llamadas originadas por la extensión 1000. linkedid varchar(80) NOT NULL default ''. KEY callerid (clid) ).

duration. Esto porque su lógica se basa en tres eventos principales: • • • inicio de la llamada duración de la conversación finalización de la llamada El tiempo que se facturará es la diferencia entre la duración total de la llamada y el duración de la conversación.'ANSWERED'. tiene unas cuantas limitaciones.8.• filter src => 1000: en la tabla se guardarán solamente los registros de las llamadas originadas por la extensión 1000 Se guardan los cambios y se entra en la consola de Asterisk: asterisk -rvvvvvvvvvvvvvvvvvvv En este caso se recarga solamente el modulo CDR adaptive: CLI> module reload cdr_adaptive_odbc.23')] Los datos de la llamada se guardarán en la tabla CDR3 20.dst.3.channel.src.'1000'. Si ahora desde la extensión 1000 se llama la extensión 1001: [INSERT INTO cdr3 (calldate. Algunos ejemplos: • • transferencia de la llamada a otra extensión transferencia de la llamada a una conferencia 415 .'SIP/100100000016'. Cancelling this CDR.uniqueid.45.'"callerid=Fulano" <1000>'.lastapp. es muy complicado tener una traza de todos los eventos que se pueden presentar a lo largo de la llamada.clid.lastdata.11.'externas'.'1000'.linkedid) VALUES ({ ts '2012-03-27 16:01:52' }. la llamada no se guardará en la tabla CDR3.accountcode.hHkKtTwWxX'. El problema es que con este tipo de lógica.'1332882112.'1001'.billsec.dstchannel.'SIP/1001.23'.so Con la consola abierta desde la extensión 1001 se llama la extensión 1000. Como el campo src tiene como valor 1001 y el filtro se ha creado para el valor 1000.dcontext.2 CEL (Channel Event Logging) Aunque parezca que el CDR responda a todas las necesidades de los administradores de la PBX.disposition.'Dial'. Al finalizar la llamada en la consola aparecerá: > CDR column 'src' with value '1001' does not match filter of '1000'.'133288211 2.amaflag s.'SIP/1000-00000015'.

dificultan una correcta facturación y seguimiento de llamada. Si se indica “all” se recibirán los eventos de todas las aplicaciones.meetme En este parámetro se indica una lista de eventos. sin embargo la combinación de los dos permite un control y monitoreo de las llamadas muchos más detallado y completo.8 de Asterisk se ha añadido un nueva funcionalidad: el CEL (Channel Event Logging). Parámetro [general] enable apps Descripción inicia la parte general de la configuración del archivo yes = se activa el registro de los eventos del modulo CEL en este parámetro se especifica la lista de las aplicaciones por las cuales se quiere recibir los eventos.• • parqueo y/o captura de la llamada por otra extensión ejecución de un AGI a lo largo de la llamada. En este párrafo se ilustrará la configuración del modulo y como guardar los eventos en una tabla de una base de datos utilizando el conector ODBC. separados por una coma.conf. Utilizar con cuidado ya que puede afectar el rendimiento de la PBX Valor: dial. El CEL a diferencia del CDR. Es por eso que desde la versión 1.park. De esta forma es posible tener un registro mucho más detallado de las llamadas. basa su lógica sobre el canal de la llamada y va guardando todos los eventos que se van generando en ese canal. de los que se quieres tener traza Estos son: • ALL: todos • CHAN_START: fecha en que se ha creado el canal • CHAN_END: fecha en que el canal se ha terminado • ANSWER: fecha en que el canal ha sido contestado • HANGUP: fecha en que se ha presentado un Hangup (cierre del canal) • CONF_ENTER: fecha en que un canal ha sido enviado a una conferencia audio • CONF_EXIT: fecha en que un canal ha salido de una conferencia audio • CONF_START: fecha en que el primer usuario ha entrado a una conferencia • CONF_END: fecha en que el ultimo usuario presente ha dejado una conferencia audio (y posiblemente apagado todas las luces :) • APP_START: fecha en que la aplicación se ha iniciado • APP_END: fecha en que la aplicación ha terminado • PARK_START: fecha en que el canal ha sido parqueado events 416 .queue. Lo primero es configurar el archivo cel. no sustituye el CDR. El CEL. Todos estos tipos de eventos. en su desarrollo actual. En la tabla que sigue los distintos parámetros con una descripción. En negrita el valor asignado a cada parámetro.

se puede crear el archivo de configuración para CEL.old se crea uno nuevo: nano /etc/asterisk/cel. Valor: %F %T a partir de esta etiqueta inicia la configuración de CEL para la AMI de Asterisk yes = se activa el envío de los eventos a la AMI de Asterisk Con estos datos.conf /etc/asterisk/cel.meetme events=all dateformat=%F %T [manager] 417 .queue. Se renombra el predefinido: mv /etc/asterisk/cel.Parámetro • Descripción PARK_END: fecha en que el canal ha sido sacado del “slot” de parqueo • BRIDGE_START: fecha en que el canal ha sido conectado con otro canal • BRIDGE_END: fecha en que ha terminado la conexión con otro canal • 3WAY_START: fecha en que ha iniciado una conferencia a 3 (normalmente con una transferencia asistida) • 3WAY_END: fecha en que una conferencia a 3 ha sido terminada • BLINDTRANSFER: fecha en que ha iniciado una transferencia ciega • ATTENDEDTRANSFER: fecha en que ha iniciado una transferencia asistida • TRANSFER: fecha en que se ha iniciado una transferencia • HOOKFLASH: fecha en que se ha iniciado un “descolgado relampago” en un canal DAHDI (normalmente utilizado para contestar llamadas en espera o para activar la conferencia a 3) • USER_DEFINED: evento personalizado que se puede enviar desde el dialpla a través de la aplicación CELGenUserEvent Para esta prueba se recibirán todos los eventos. Valor: All dateformat [manager] enabled El formato de la fecha presente por cada evento.conf.park.conf y se añaden las siguientes lineas: [general] enable=yes apps=dial.

cid_rdnis VARCHAR( 80 ) NOT NULL . peeraccount VARCHAR( 20 ) NOT NULL . accountcode VARCHAR( 20 ) NOT NULL . Se entra en cliente mysql: mysql -u root -psesamo Se crea la base de datos. userfield VARCHAR( 255 ) NOT NULL . cid_dnid VARCHAR( 80 ) NOT NULL . mysql> GRANT ALL PRIVILEGES ON asteriskcel. uniqueid VARCHAR( 150 ) NOT NULL . userdeftype VARCHAR( 255 ) NOT NULL .enabled=yes Se guardan los cambios y se recarga la configuración de Asterisk: service asterisk reload Ahora falta crear la tabla y luego crear una conexión a la misma a través de ODBC. channame VARCHAR( 80 ) NOT NULL . appdata VARCHAR( 80 ) NOT NULL . la tabla y el usuario con los permisos: mysql> create database asteriskcel mysql> use asteriskcel mysql> CREATE TABLE cel( eventtime TIMESTAMP NOT NULL . appname VARCHAR( 80 ) NOT NULL . cid_ani VARCHAR( 80 ) NOT NULL . amaflags INT NOT NULL . linkedid VARCHAR( 150 ) NOT NULL . peer VARCHAR( 80 ) NOT NULL ).* TO 'asterisk'@'localhost' IDENTIFIED BY 'sesamo'. cid_num VARCHAR( 80 ) NOT NULL . cid_name VARCHAR( 80 ) NOT NULL . Se sale del cliente: mysql> quit Ahora los pasos a seguir son: 418 . exten VARCHAR( 80 ) NOT NULL . context VARCHAR( 80 ) NOT NULL .

conf Se abre el archivo odbc.conf Configurar el archivo cel_odbc.conf: nano /etc/asterisk/res_odbc.conf se añade el siguiente bloque: [asteriskcel] enabled => yes dsn => asteriskcel username => asterisk password => sesamo pre-connect => yes 419 .ini: nano /etc/odbc.• • • Crear uno nuevo bloque en el archvo odbc.ini Crear un nuevo bloque en el archivo res_odbc.ini y al final se añade el siguiente bloque: [asteriskcel] Description = MySQL AsteriskCEL Driver = MySQL Database = asteriskcel Server = localhost User = asterisk Password = sesamo Port = 3306 Option = 3 Se guarda los cambios y se prueba la nueva conexión: isql asteriskcel asterisk sesamo +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ SQL> quit Se pasa al archivo res_odbc.

old nano /etc/asterisk/cel_odbc.conf cel: nombre de la tabla que se ha creado y donde se guardarán los nuevos registros Se guarda los cambios y se entra en la consola de Asteirsk: asterisk -rvvvvvvvvvvvv Se recarga primero el module res_odbc.ini Por ultimo se modifica el archivo cel_odbc.conf.sanitysql => select 1 idlecheck => 3600 connect_timeout => 10 El valor que aparece en el parámetro dns tiene que ser el mismo con que inicia el bloque que se acaba de configurar en el archivo odbc.conf Se copian las siguientes lineas: [CEL1] connection=asteriskcel table=cel • • • CEL1:nombre que se le quiere asignar a la conexión asteriskcel: tiene que ser el mismo valor con que inicia el bloque que se ha configurado en el archivo res_odbc.conf: mv /etc/asterisk/cel_odbc.so: CLI> module reload res_odbc.so Se averigua que haya conexión con ODBC: CLI> odbc show ODBC DSN Settings ----------------Name: asterisk DSN: asterisk Last connection attempt: 1969-12-31 19:00:00 Pooled: No Connected: Yes Name: asteriskcdr 420 .conf /etc/asterisk/cel_odbc.

Cuando la extensión 1000 esté en la conferencia.appdata.so CLI> module reload cel_odbc. desde la extensión 1001 se marca el mismo numero de conferencia (3500).appname.so Ahora desde la extensión 1001 se llama la extensión 1000 y utilizando el botón “Transfer” del softphone 3CX se transfiere la llamada a la conferencia numero 3500. Una vez que las dos extensiones estén en la conferencia. El resultado en la tabla CEL será: CLI> quit mysql -u root -psesamo mysql> use asteriskcel mysql> select eventtime.linkedid from cel. 421 .exten.channame.uniqueid. primero cuelga la 1000 y luego la 1001.DSN: asteriskcdr Last connection attempt: 1969-12-31 19:00:00 Pooled: No Connected: Yes Name: asteriskcel DSN: asteriskcel Last connection attempt: 1969-12-31 19:00:00 Pooled: No Connected: Yes Se recarga el modulo cel_odbc.context.

Que tipo de archivos y que tipo de registros se quieren guardar. Valor queue_log yes = las estadísticas de las colas se siguen guardando en el archivo queue_log aunque estén configuradas en Realtime. Para evitarlo se pueden “rotar” y con este parámetro se define que tipo de rotación se va a utilizar: • secuential – se renombran los archivos siguiendo un orden donde el más reciente tendrá un numero más alto.conf. Normalmente los archivos de Log pueden alcanzar un tamaño considerable que dificulta su consulta.8 de Asterisk) debug – se crea un archivo donde se guardará solamente el debug de 422 [logfiles] debug => . se define en el archivo logger. Parámetro [general] dateformat appendhostname queue_log queue_log_name queue_log_to_file rotatestrategy Descripción inicia la parte general de la configuración del archivo formato de la fecha.conf Además de las llamadas. advertencias) en archivos de texto que se guardan en la carpeta /var/log/asterisk.%F %T si se quiere añadir o no al nombre del archivo el nombre del dominio del servidor. En la tabla que sigue los distintos parámetros con una descripción.3 Logger. En negrita el valor asignado a cada parámetro. Cada archivo puede contener los siguientes valores: • debug • notice • warning • error • verbose • dtmf • fax (desde la versión 1. es posible tener traza del funcionamiento de Asterisk (errores. Predefinido ISO 8601 . Valor yes El nombre del archivo donde guardar las estadísticas de la colas de espera. • rotate – se renombran los archivos siguiendo un orden donde el más viejo tendrá el numero más alto • timestamp – se renombran los archivos añadiendo al nombre la fecha en que se archivaron esta etiqueta define el inicio de la configuración de los archivos de registro. Valor no define si se quiere guardar o no las estadísticas de las colas de espera en un archivo.20.

fax El archivo console no es propiamente un archivo.debug.Parámetro la actividad de Asterisk verbose => fax => console => Descripción verbose – se crea un archivo donde guardar muy en detalle los registros de la actividad de Asterisk fax – se crea un archivo donde se guardarán los registros de actividad del envío/recepción de FAX notice.dtmf En el archivo messages se guardarán solamente los registros relacionados con noticias.warning. yum install logrotate 423 .dtmf. notice.dtmf error => error Se guardan los cambios y se pasa a la definición de las política de rotación de los archivos de registro.warning. messages => error => Para crear el nuevo archivo. Para definir estas políticas hay que instalar el programa Logrotate que se encarga de este tipo de tarea. Se indica que tipo de registros aparecerán en la consola de Asterisk. advertencias. se renombra el predefinido: mv /etc/asterisk/logger.conf Se copian las siguientes lineas: [general] dateformat=%F %T appendhostname=no queue_log=yes queue_log_name=queue_log queue_log_to_file=yes rotatestrategy=rotate [logfiles] debug => debug verbose => verbose fax => fax console => notice.error.fax messages => notice.conf.warning. DTMF y fax error En el archivo error se guardarán solamente los errores.debug.conf /etc/asterisk/logger.warning.old y se crea uno nuevo: nano /etc/asterisk/logger.dtmf.error.

1 archivo.Una vez instalado se crea un nuevo archivo donde se va a definir la rotación de los archivos de Log de Asterisk: nano /etc/logrotate. El segundo bloque define la política de rotación del archivo de registro queue_log (las estadísticas de las colas de espera).d/asterisk Se copian las siguientes líneas: /var/log/asterisk/messages /var/log/asterisk/error /var/log/debug /var/log/verbose { missingok rotate 7 daily postrotate /usr/sbin/asterisk -rx 'logger reload' > /dev/null 2> /dev/null endscript } /var/log/asterisk/queue_log { missingok rotate 5 size=1000k postrotate /usr/sbin/asterisk -rx 'logger reload'> /dev/null 2> /dev/null endscript } El primer bloque define la rotación para los archivos messages. debug y verbose La rotación será diaria y se crearán un máximo de 7 archivos secuenciales (archivo. En este caso el archivo rotará cuando alcanzará un tamaño de 1000 Kbyte y se creerán un máximo de 5 archivos secuenciales. etc. error.conf en asterisk. Para testar el archivo de configuración creado el procedimiento es: cd /etc/logrotate.).2 . El más antiguo tendrá el numero secuencial más alto.d logrotate -fv asterisk Para aplicar los cambios desde la consola de Asterisk: asterisk -rvvvvvvvvvvvvvv 424 . Después de la rotación (postrotate) se actualiza la configuración del archivo logger.

De esta forma las informaciones que se reciben acerca de las operaciones efectuadas por Asterisk son mucho más detalladas y en la mayoría de los casos permite solucionar el problema.DEBUG NOTICE WARNING ERROR DTMF FAX /var/log/asterisk/fax File Enabled . hay la posibilidad de aumentar el nivel de debug de la consola para buscar el tipo de problema que está afectando el funcionamiento de la PBX.NOTICE WARNING DTMF Console Enabled .VERBOSE CLI> quit Se reinicia Asterisk service asterisk restart En la carpeta /var/log/asterisk estarán presentes los archivos configurados en logger.------------/var/log/asterisk/error File Enabled .FAX /var/log/asterisk/debug File Enabled . 425 . 20. ademas de la consola.conf y se podrán revisar los errores en el archivo error: nano /var/log/asterisk/error De esta forma en cualquier momento se tendrá bajo control el funcionamiento de Asterisk.1 Debug Cuando algo no está funcionando en Asterisk.conf se ha definido que el debug se guardará en el archivo “debug”.-----.ERROR /var/log/asterisk/messages File Enabled .se escribe: CLI> logger reload Para ver la configuración del archivo: CLI> logger show channels Channel Type Status Configuration ---------. Esto se hace con un comando especifico: asterisk -rvvvvvvvvvvvvvvvvvvvvv CLI> core set debug 9 El nivel de debug va de 0 (ningún debug) a 9 (máximo debug). Como en el logger. se puede utilizar este archivo para encontrar eventuales errores.DEBUG /var/log/asterisk/verbose File Enabled .3.

Para buscar algo especifico se puede utilizar el programa “cat” junto al programa “grep”. troncal: CLI> sip set debug peer justvoip Como se ha visto en el párrafo 3.4 . El primero lee un archivo y devuelve su contenido en la ventana terminal de Linux. Si se quiere enviar el resultado a un archivo: cat /var/log/asterisk/debug | grep odbc > odbc En el caso el problema sea con la señalización SIP. se puede utilizar también la utilidad ngrep. Un ejemplo: cat /var/log/asterisk/debug | grep odbc De esta forma todas la lineas del archivo debug que contengan la palabra odbc aparecerán en la ventana terminal. La consulta de estos archivos puede ser bastante complicada si se ha generado una cantidad considerable de registros. grep permite buscar una determinada palabra o frase en un archivo.De hecho si se vuelve a desactivar el debug: CLI> core set debug 0 se sale de la consola de Asterisk: CLI> quit y se abre el archivo: nano /var/log/asterisk/debug se verá que ese archivo contiene todo el debug generado desde que se ha activado en la consola. 426 . desde la consola se puede activar el debug de este protocolo con el siguiente comando: asterisk -rvvvvvvvvvvvvvvvvvvvvv CLI> sip set debug on Si se quiere limitar el debug solamente a una determinada extensión.

.

Capitulo XXI Seguridad en Asterisk 21.4.2 Fail2ban Se descarga el programa: cd /usr/src wget http://downloads. 21.sourceforge.net/project/fail2ban/fail2ban-stable/fail2ban-0.1 Reglas de oro Hay una reglas de oro que se necesita seguir en la configuración de Asterisk. un programa que lee los registros de Asterisk del archivo /var/log/asterisk/messages y si hay un numero determinado de intentos de conexión sin éxito.142.conf el parámetro alwaysauthreject=yes. no utilizar la misma contraseña para todas las extensiones 3. 7. No permitir el acceso al AMI de Asterisk desde remoto (teniendo cerrado el puerto 5038 TCP del servidor Linux.tar. el contexto definido en la parte general del sip.tar. 2..bz2 . 4. 6.bz2 se descomprime: tar -xf fail2ban-0.4. Esto se configura con el parámetro allowguest=no en la parte general del sip. De esta forma cualquier intento de registro a extensiones existentes en la centralita. En el caso que se necesite utilizar el AMI desde remoto.168.8. interactuando con iptables (cortafuegos). configurar Iptables de modo que acepte el trafico solo desde determinadas direcciones IP. Otra forma es utilizar el protocolo TLS. configurar en la parte general del sip. Estas reglas permiten mejorar la seguridad de la PBX y evitar ataques exitosos: 1.8. bloquea la IP de donde se han originados. no aceptar llamadas entrantes de invitados.200 -j ACCEPT Con esta linea se podrá conectar desde remoto al AMI de Asterisk solamente la maquina con IP 192. es posible instalar en el servidor Asterisk Fail2Ban.4/fail2ban0. evitando dar trazas al atacante 5.142. Ademas de estas 7 reglas. utilizar siempre contraseñas bastantes largas y difíciles de memorizar. Utilizar números o nombres de extensiones largos y no fácilmente memorizables.200.conf. recibirá como respuesta que la extensión no existe. Si se decide aceptar llamadas entrantes de invitados (sin autentificación).168. Un ejemplo es esta linea: -A INPUT -p tcp -m state --state NEW -m tcp --dport 5038 -s 192.conf no debe permitir el acceso a troncales SIP y/o lineas telefónicas tradicionales. Utilizar las funciones GROUP y GRUP_COUNT para limitar las llamadas salientes de las extensiones.8.

: regex to match the password failures messages in the logfile.Peer is not supposed to register NOTICE.4 y se instala: python setup. The # host must be matched by a group named "host".*: <HOST> failed to authenticate as '.*: Failed to authenticate user .*: Registration from '.local #before = common.*) NOTICE.*' failed for '<HOST>(:[0-9]{1.*: Registration from '.* .*' failed for '<HOST>(:[0-9]{1.* .*@<HOST>.6}:)?(?P<host>\S+) # Values: TEXT # failregex = NOTICE.se entra en la carpeta: cd fail2ban-0.conf y se añaden estas líneas: # Fail2Ban configuration file # [INCLUDES] # Read common prefixes.Wrong password NOTICE.* .*: Registration from '.*'$ NOTICE.*: Sending fake auth rejection for device .d/fail2ban chkconfig --add fail2ban chkconfig fail2ban on Se configura para que lea los registros de Asterisk: cd /etc/fail2ban/filter. The tag "<HOST>" can # be used for standard IP/hostname matching and is only an alias for # (?:::f{4.* .*@<HOST>.Username/auth name mismatch NOTICE.No matching peer found NOTICE.*' failed for '<HOST>(:[0-9]{1.*' \(from <HOST>\) NOTICE.* .5})?' .8.5})?' .5})?' .*' failed for '<HOST>(:[0-9]{1.*: Registration from '.5})?' .4/files/redhat-initd /etc/init.d nano asterisk.* NOTICE. If any customizations available -.* .* 429 .*' (.* .*' failed for '<HOST>(:[0-9]{1.conf [Definition] #_daemon = asterisk # Option: failregex # Notes.8.*: Host <HOST> failed MD5 authentication for '.* .py install Se activa el script para arrancarlo como servicio: cp /usr/src/fail2ban-0.read them from # common.*: No registration for peer '.*: Registration from '.* .* .5})?' .Device does not match ACL NOTICE.

Se termina modificando el archivo de configuración general de fail2ban: cd /etc/fail2ban nano jail. En lugar de root@localhost se pone la dirección de correo electrónico donde se quiere recibir las notificaciones. Con esta configuración cuando se verifiquen 5 ataques del mismo tipo procedentes de la misma IP.d/fail2ban start Starting fail2ban: [ OK ] 430 . sender=fail2ban@pbx. # Values: TEXT # ignoreregex = Con estas líneas se configura fail2ban para que controle eventuales accesos indeseados que aparecen en el archivo de registro de Asterisk. En sender.org] logpath = /var/log/asterisk/messages maxretry = 5 bantime = 1800 En la línea logpath aparece el archivo de registros que fail2ban leerá para averiguar intentos frustrados de conexión a Asterisk. Para enviar los correos.warning. the line is ignored.dtmf Se inicia fail2ban: /etc/init.dyndns. protocol=all] sendmail-whois[name=ASTERISK.conf al final del archivo se añaden las lineas que siguen: [asterisk-iptables] enabled = true filter = asterisk action = iptables-allports[name=ASTERISK.# Option: ignoreregex # Notes.org se pone fail2ban@nombrededominio del servidor donde está instalado Asterisk. dest=root@localhost.: regex to ignore.conf en la siguiente linea esté presente el valor notice (configuración predefinida): messages => notice. en lugar de fail2ban@pbx. En la configuración hay que modificar la dirección de correo electrónico.dyndns. Fail2ban bloqueará el IP insertando una nueva linea en el archivo de configuración de Iptables y la mantendrá bloqueada por 1800 segundos. Para que funcione hay que averiguar que en el archivo de configuración de Asterisk nano /etc/asterisk/logger. If this regex matches. fail2ban está configurado con Sendmail.

Se averigua que no haya errores en el log de fail2ban: tail -f /var/log/fail2ban.log Si se quiere hacer una prueba se configura en X-lite una extensión que no existe en el sistema y se intenta registrarla a Asterisk: La IP de donde se está intentando registrarse será bloqueada. la única forma de quitar el bloqueo es parar y reiniciar Iptables o reiniciar el servidor Linux. 431 . Accediendo a la consola del servidor remoto desde otra dirección IP con el comando: iptables -L se verá la IP bloqueada: Desde el log de fail2ban: Si por error se bloquea la IP de un computador.

.

2.2 Se compila y se instala: .2. archivos.d/monit chmod +x /etc/init./configure --prefix=/usr make make install Se termina la instalación con la copia y activación del script de inicio de monit: cd contrib cp rc.1 Monit Monit es un programa Open Source para la gestión y el monitoreo de procesos. programas. 22. Permite programar tareas de mantenimiento y de corrección de errores cuando se verifiquen problemas en el sistema. Se instalará desde las fuentes: cd /usr/src wget http://mmonit.Capitulo XXII Monitorear Asterisk En este capitulo se ilustrará como monitorear Asterisk y el servidor Linux a través de dos distintos programas: • • Monit Nagios y el protocolo SNMP Se ilustrará también como monitorear la calidad de las llamadas directamente desde la consola de Asterisk y a través del programa VoIPmonitor.gz tar -xf monit-5.d/monit chkconfig --add monit .monit /etc/init.gz cd monit-5.3.3.com/monit/dist/monit-5.tar.3. carpetas y particiones de un sistema Linux.tar.

aquí se pone la configuración general del programa Services.chkconfig monit on Ahora se modifica el archivo de configuración para monitorear los siguientes programas: • • • • Sendmail MySQL Asterisk la troncal Justvoip El archivo de configuración de Monit se divide en tres bloques: • • • Global Section. nano /etc/monitrc set daemon 60 # Indica cada cuantos segundos Monit controla los servicios (en este caso cada 60) with start delay 30 # Al iniciar el programa el primer ciclo se ejecutará después de 30 segundos set logfile /var/log/monit.log # Nombre del archivo donde se guardarán todos los registros de Monit set idfile /var/.$EVENT $SERVICE Message: $EVENT Servicio $SERVICE Fecha: $DATE Accion: $ACTION 434 . donde se configuran los servicios Includes: permite incluir a la configuración de Monit otros archivo que contienen a su vez la configuración de otros procesos. Cuando el servidor volverá a funcionar. todas las # alertas serán enviada siguiendo el orden cronológico en que se guardaron set mail-format { From: monit@libroasterisk.org Subject: monit alerta -.id # Nombre de la carpeta y archivo donde se guardará el numero del proceso de Monit set mailserver localhost # nombre del host del servidor de correo electrónico que Monit utilizará para enviar las alertas set eventqueue basedir /var/monit slots 100 # Si por alguna razón el servidor de correo electrónico no esté funcionando podemos decirle a Monit de # guardar todas las alerta en una determinada carpeta.monit.

d/asterisk start" with timeout 60 seconds stop program = "/etc/init. Monit } # Con el bloque de arriba.d/asterisk stop" with timeout 60 seconds if failed host 127.com maxforward 10 then alert # SendMail check process sendmail with pidfile /var/run/sendmail. se define como tiene que ser enviado el correo electrónico de alerta set alert admin@voztovoice.justvoip.d/sendmail start" stop program = "/etc/init.0.com if failed port 5060 type udp protocol SIP and target usuario@sip.pid group mail start program = "/etc/init.org if loadavg (1min) > 4 then alert if loadavg (5min) > 2 then alert if memory usage > 75% then alert if cpu usage (user) > 70% then alert if cpu usage (system) > 30% then alert if cpu usage (wait) > 20% then alert # Asterisk check process asterisk with pidfile /var/run/asterisk/asterisk.justvoip.d/sendmail stop" if failed port 25 protocol smtp then restart if 5 restarts within 5 cycles then timeout 435 .pid start program = "/etc/init. En las dos lineas de arriba se activa en el puerto 2812 # (que hay que abrir en el cortafuegos) y se define nombre de usuario y contraseña para ingresar a la # pagina # Servidor Linux check system cursoasterisk.com # Con esta línea se define el correo electrónico que recibirá todas las alertas (personalizar) set httpd port 2812 allow admin:sesamo # Monit viene con un servidor Web.1 port 5038 then restart if 5 restarts within 5 cycles then timeout # Troncal SIP check host Justvoip with address sip.0.Host: $HOST Descripcion: $DESCRIPTION Tu devoto empleado.

d/monit start En el cortafuegos. hay que abrir el puerto 2812 TCP para tener acceso al servidor Web interno de Monit: nano /etc/sysconfig/iptables antes de este bloque: # DUNDi -A INPUT -p udp -m udp --dport 4520 -j ACCEPT se añade: # Monit -A INPUT -p tcp -m state --state NEW -m tcp --dport 2812 -j ACCEPT Se guardan los cambios y se reinicia iptables service iptables restart Después de unos minutos se puede acceder a la pagina de administración de Monit: http://ipservidor:2812 436 .# MySQL check process mysql with pidfile /var/run/mysqld/mysqld.d/mysqld start" stop program = "/etc/init.d/mysqld stop" if failed port 3306 protocol mysql then restart if 5 restarts within 5 cycles then timeout Se guardan los cambios y se cambian los permisos del archivo de configuración: chmod 700 /etc/monitrc Se inicia Monit: /etc/init.pid group database start program = "/etc/init.

el pagina principal aparecerán todos los procesos/programas monitoreados: y en el caso del servidor Linux: 437 .Nombre de usuario: admin Contraseña: sesamo Una vez entrados en la Web de Monit.

router.Cualquier problema se presente con el servidor y/o con los procesos/programas configurados. Es parte de la familia de protocolos TCP/IP. se recibirá una notificación al correo electrónico configurado. 22. y planear su crecimiento. switch y casi cualquier tipo de aparado conectado a la red (local o remota). Para empezar se averigua si el modulo res_snmp está instalado y cargado en Asterisk: asterisk -rvvvvvvvvvvvvvvv CLI> module show like snmp Significa que el modulo está instalado.2 SNMP Una definición del protocolo SNMP tomada de wikipedia: “El Protocolo Simple de Administración de Red o SNMP es un protocolo de la capa de aplicación que facilita el intercambio de información de administración entre dispositivos de red. SNMP permite a los administradores supervisar el funcionamiento de la red. Asterisk implementa el protocolo SNMP y a través de ese protocolo es posible monitorear muchos parámetros de la PBX.” De hecho a través de este protocolo se monitorean servidores. Se sale de la consola de Asterisk: 438 . buscar y resolver sus problemas.

old y se crea uno nuevo: nano snmpd.old nano /etc/asterisk/res_snmp.CLI> quit Se configura el modulo: mv /etc/asterisk/res_snmp.XXX.conf. Un OID (identificador de objeto) es una cadena alfanumérica que se utiliza para identificar de forma única un objeto que en el caso del protocolo SNMP representa un determinado parámetro del dispositivo que se quiere monitorear.XXX public group asterisk v1 local group asterisk v2c local 439 .conf /etc/asterisk/res_snmp.conf.XXX.conf snmpd.voztovoice. cd /usr/share/snmp/mibs wget http://www.org/tmp/asterisk-mib.txt Ahora se configura SNMP de modo que pueda interactuar con Asterisk: cd /etc/snmp Se renombra el archivo de configuración predefinido: mv snmpd.txt wget http://www. Ejemplo: se puede conocer el numero de llamadas totales cursadas por la centralita desde su ultimo arranque.org/tmp/digium-mib.voztovoice.conf donde se ponen las siguientes líneas: master agentx agentXPerms 0660 0550 root root com2sec local localhost public com2sec remote XXX.conf Se añaden las siguientes lineas: [general] subagent = yes enabled = yes Se guardan los cambios y se descargan los OID de Asterisk en la carpeta de SNMP.

Una tiene acceso local y otra remoto (útil si se quiere hacer consultas desde otro servidor).4. Se guardan los cambios y se reinicia Asterisk: /etc/init.XXX. Hay que sustituir XXX. Primero se define el agente y los permisos de acceso.XXX.d/snmpd start se vuelve el arranque automático: chkconfig snmpd on Para ver los resultados con la descripción de los OID en lugar de los números de los objetos: export MIBS=all Ahora ya se puede hacer una consulta utilizando el OID raiz de Asterisk: snmpwalk -OT -c public -v 2c localhost . Luego se definen dos comunidades. las que interesan son estas tres: ASTERISK-MIB::astChanTypeName.1. 440 .1 access asterisk "" any noauth exact all none none access NetWork "" any noauth exact all none none Una explicación. Luego se definen dos grupos y que tipo de consultas pueden hacer (en este caso SNMP versión 1 y versión 2c.4 = STRING: SIP ASTERISK-MIB::astChanTypeName.1.3.7 = STRING: DAHDI Se anotan los valores que aparecen en negrita y el tipo de canal asociado. es decir: SIP 4 IAX2 6 DAHDI 7 Se pasa a la instalación y configuración de Nagios.6.1.6 = STRING: IAX2 ASTERISK-MIB::astChanTypeName.22736 De todas las lineas que aparecen.d/asterisk restart se inicia snmp: /etc/init. Se define el tipo de objetos que pueden consultar (en este caso todos) y los permisos que cada grupo tiene.group NetWork v1 remote group NetWork v2c remote view all included .XXX con la ip del servidor remoto.

i386.22.cfg y se encuentra en 441 .5.i386 : Header files.el5. unas carpetas donde se guardarán los registros y los archivo necesarios para que Nagios funcione. un archivo para la integración con el servidor Web (apache). los plugins.Nagios object configuration parsing perl-Nagios-Plugin.rpm rpm -ivh rpmforge-release-0. se empieza con la configuración de Nagios. yum install nagios nagios-plugins perl-Net-Jabber perl-IO-Socket-SSL ndoutils mailx httpd CentOS se hará cargo de instalar también todas las dependencias necesarias.i386 : Open Source host.i386 : Nagios plug-in for NRPE nagios-plugins-setuid.rpm Ahora se controlan los paquetes disponibles para Nagios: yum search nagios check_logfiles. unas librerías en Perl para utilizar el protocolo XMPP. una aplicación para el envío de los correo electrónicos desde Nagios utilizando una linea de comando.i386 : Logfile check plugin for nagios icinga.i386 : Nagios plugin to store Nagios data in a relational database nsc.org/rpmforge-release/rpmforge-release-0. una utilidad para guardar los registros de Nagios en una base de datos.i386 : Console monitor for Nagios nsc.i386. libraries and development documentation for nagios nagios-nrpe.repoforge. hay que instalar el repositorio rpmforge: cd /usr/src wget http://pkgs.i386 : Authenticated RSS alerts for nagios Se instalan los siguientes paquetes: el programa.5.i386 : Host/service/network monitoring program plugins for Nagios nagios-plugins-nrpe.i386 : Open Source host.i386 : nagios send_nsca nagios-plugins.rf. Se creará el grupo y usuario Nagios. service and network monitoring program nagios.noarch : Nagios::Object .3 Nagios Para la instalación de Nagios desde los paquetes precompilados.el5.noarch : Family of perl modules to streamline writing Nagios rss4nagios.2-2.noarch : Console monitor for Nagios perl-Nagios-Object.2-2. Una vez terminada la instalación. El archivo principal donde se definen los parámetros para el programa es nagios.i386 : Host/service/network monitoring program plugins for Nagios requiring setuid ndoutils.i386 : Nagios Service Check Acceptor nagios-nsca-client.i386 : Nagios Remote Plug-ins Execution daemon nagios-nsca.rf. service and network monitoring program nagios-devel.

cfg.cfg: nano /etc/nagios/objects/contacts.cfg. En este archivo el bloque del genericcontact es: nano /etc/nagios/objects/templates. Para este tipo de instalación no hace falta hacer algún tipo de modifica es ese archivo.cfg template.com es la dirección de correo electrónico donde Nagios enviará las notificaciones (personalizar). hace referencia a un template definido en el archivo templates.cfg define contact{ 442 .cfg localhost.la carpeta /etc/nagios.cfg contact.com address1 fulano } fulano@gmai.cfg En este archivo se cambian estas líneas: define contact{ contact_name nagiosadmin use generic-contact alias Nagios Admin email nagios@localhost } para que queden: define contact{ contact_name nagiosadmin use generic-contact alias Nagios Administrador email fulano@gmail. Nagiosadmin es el nombre del administrador predefinido en Nagios. Se guardan los cambios y se abre el archivo templates. Address1 es el usuario GoogleTalk donde Nagios enviará las notificaciones vía mensaje instantáneo. Cada vez que aparece una línea que empieza con “use”.cfg Se inicia con contact. Los archivos de configuración de Nagios que hay que modificar son los siguientes y se encuentran en la carpeta /etc/nagios/objects: • • • • commands.

para enviar las notificaciones via GoogleTalk se descargará otro plugin.u.name generic-contact service_notification_period 24x7 host_notification_period 24x7 service_notification_options w. se descargará un plugin del repositorio de Nagios y por ultimo. a veces. check_asterisk. Los plugins de Nagios se instalan en /usr/lib/nagios/plugins.f.0 En el servidor hay servicios que no son críticos y que se pueden monitorear cada 5 minutos (el tiempo predefinido en Nagios).org/campus/a2b/check_asterisk_peers wget http://www.c.u.pl Se cambian los permisos para que se pueda ejecutar: chmod +x check_asterisk_peers 443 . Por eso al final del archivo se añade el siguiente bloque que define que para todos los servicios de Asterisk el control se hará cada 2 minutos (se puede personalizar): define service{ name asterisk use generic-service max_check_attempts 4 normal_check_interval 2 retry_check_interval 1 register 0 } Ahora se modifica el tercer archivo (commands.notify-host-jabber can_submit_commands 1 register 0 } En este bloque se añaden las dos partes en negrita.notify-service-jabber host_notification_commands notify-host-by-email. Para monitorear las troncales. se usará el plugin check_snmp y otro que viene en la carpeta /usr/lib/nagios/plugins/contrib.voztovoice. Se entra en la carpeta /usr/lib/nagios/plugins y se descargan los plugin que hacen falta: cd /usr/lib/nagios/plugins wget http://www.voztovoice.r.org/campus/a2b/notify_via_jabber.s service_notification_commands notify-service-by-email.s host_notification_options d.f. Para Asterisk.pl.r. Para monitorear Asterisk. Esto para enviar las notificaciones también vía GoogleTalk. estos cinco minutos pueden ser demasiados.cfg) donde se definen los comandos que luego se utilizarán para la configuración del monitoreo del servidor local. Hay una explicación de estos parámetros en la documentación oficial de Nagios 3.

para que queden: my $username = "sutano". Después del bloque notify-service-by-email se añade: # 'host-notify-by-jabber' command definition define command{ command_name notify-host-jabber command_line /usr/lib/nagios/plugins/notify_via_jabber. Se abre: nano notify_via_jabber.pl Notify_via_jabber. Esto quiere decir que para que el sistema funcione se necesita tener dos cuentas de GoogleTalk.pl $CONTACTADDRESS1$ "Host '$HOSTALIAS$' is $HOSTSTATE$ ./check_snmp -h Para añadir los comandos en Nagios.Info: $HOSTOUTPUT$" } # 'service-notify-by-jabber' command definition define command { command_name notify-service-jabber 444 .cfg Primero se configura el comando para enviar las notificaciones vía mensaje instantáneo.chmod +x notify_via_jabber. Esto se hace para los servidores (en este caso uno) y los servicios. En este archivo se configura el usuario de GoogleTalk que enviará las notificaciones.com) Una paréntesis. sutano es el usuario googletalk y password su contraseña (no hace falta poner @gmail.pl es el único que tiene que ser modificado. El plugin funciona de la siguiente manera. se modificará el archivo commands. my $password = "password".cfg serà él que las recibe siempre y cuando añadirá el usuario configurado en el plugin en su lista de amigos. my $password = "password". El usuario configurado en el contact. Para conocer la sintaxis de un plugin de Nagios el comando es: cd /usr/lib/nagios/plugins .cfg nano /etc/nagios/objects/commands.pl se modifican estas dos lineas: my $username = "usuarioGoogleTalk".

cfg • -C public – es la comunidad que se va a utilizar para la conexión al agente como definido en el archivo /etc/snmp/snmp.cfg Al verificarse el evento Warning y/o Critical.cfg • check_snmp – Nombre del plugin • -H $HOSTADDRESS$ – la opción –H define el servidor que se va a consultar y $HOSTADDRESS$ es una macro (variable) predefinida que contiene el nombre del servidor como se definirá luego en localhost.command_line /usr/lib/nagios/plugins/notify_via_jabber.conf • -o – la OID que se consultará • -P 2c – versión de SNMP utilizada para la consulta • -l la etiqueta que luego se definirá • -w – está por Warning • -c – está por Critical • $ARG1$ $ARG2$ $ARG3$ ARG4$ son las macros (variables) cuyo valor será asignado desde la configuración de localhost.pl $CONTACTADDRESS1$ "$NOTIFICATIONTYPE$ $HOSTNAME$ $SERVICEDESC$ $SERVICESTATE$ $SERVICEOUTPUT$ $LONGDATETIME$" } IMPORTANTE: todo lo que aparece en la linea command-line debe estar en la misma linea Se continua con el plugin check_snmp para monitorear Asterisk a través del protocolo SMNP. Nagios enviará una notificación por correo electrónico y 445 . Se buscan estas lineas: # 'check_snmp' command definition define command{ command_name check_snmp command_line $USER1$/check_snmp -H $HOSTADDRESS$ $ARG1$ } y se modifican para que queden: define command{ command_name check_snmp command_line $USER1$/check_snmp -H $HOSTADDRESS$ -C public -o $ARG1$ -P 2c -l $ARG2$ -w $ARG3$ -c $ARG4$ } IMPORTANTE: todo lo que aparece en la linea command-line debe estar en la misma linea Command name: nombre del comando Command line: los parámetros que pasaremos al comando: • La macro (variable) $USER1$ contiene el valor /usr/lib/nagios/plugins como especificado en el archivo /etc/nagios/resource.

bash_profile 446 .pl -h $HOSTADDRESS$ -m mgr -u nagios -p sesamo } nagios y sesamo indican respectivamente el usuario y la contraseña para conectarse al AMI de Asterisk. El segundo plugin se define de la siguiente forma (añadir las lineas después del bloque anterior): define command{ command_name check_asterisk command_line $USER1$/contrib/check_asterisk. Para definirlos. es el que permite monitorear las troncales: define command{ command_name check_justvoip command_line sudo /usr/lib/nagios/plugins/check_asterisk_peers -t sip -p $ARG1$ } Se guardan los cambios.vía mensaje instantáneo. Como se puede ver este plugin se activa con el programa sudo que permite ejecutar un comando con los permisos del usuario root. Para que pueda hacerlo hay que modificar el archivo sudousers que es donde se definen los usuarios que pueden ejecutar comandos con los permisos de root. se busca este bloque: # 'check_ssh' command definition define command{ command_name check_ssh command_line $USER1$/check_ssh $ARG1$ $HOSTADDRESS$ } y se modifica para que quede: # 'check_ssh' command definition define command{ command_name check_ssh command_line $USER1$/check_ssh -p $ARG1$ $HOSTADDRESS$ } El ultimo plugin que se define en el archivo command.cfg. luego hay que modificar el manager. Esto porque el programa Nagios se inicia con usuario nagios y ese usuario no tiene los permisos para ejecutar el plugin.conf de Asterisk: Como el servidor SSH está escuchando en el puerto 15000. Para modificar este archivo con el editor nano hay que seguir este procedimiento: cd /root nano .

conf Al final del archivo se añade: [nagios] secret = sesamo deny=0. Como se había dicho el plugin check_asterisk.agent.agi Se guardan los cambios y se actualiza la configuración de Asterisk: /etc/init.command.cfg.d/asterisk reload Para terminar la configuración de Nagios se modifica el archivo localhost.agi.dtmf.255. Para que funcione hay que modifica el archivo manager.0.reporting.agent.otiginate.call.0. Se mueve el predefinido: 447 .1/255.al final del archivo se añade la siguiente linea: export EDITOR=/usr/bin/nano Se guardan los cambios y se recarga el perfile de la shell bash: source .0.cc write=system.pl funciona conectándose a la AMI de Asterisk.dialplan.conf de Asterisk: nano /etc/asterisk/manager.0 permit=127.call.255.cdr.0.0.bash_profile Ahora se puede modificar el archivo sudousers con nano con el comando: visudo primero se modifica esta linea: Defaults requiretty para que quede: # Defaults requiretty luego se añade al final del archivo: nagios ALL=(ALL) NOPASSWD: /usr/lib/nagios/plugins/check_asterisk_peers Se guardan los cambios.0/0.user.reporting.user.255 read=system.config.0.

4!"Canales SIP Activos"!8!16 } Si los canales SIP activos son más de 8 se recibirá un WARNING.1 } define service{ use asterisk host_name CursoAsterisk service_description SIP check_command check_snmp!ASTERISK-MIB::astChanTypeChannels.old se crea uno nuevo: nano /etc/nagios/objects/localhost.cfg Se añaden las siguientes lineas: define host{ use linux-server host_name CursoAsterisk alias CursoAsterisk address 127.0.mv /etc/nagios/objects/localhost.cfg. Se continua copiando las lineas que siguen: define service{ use asterisk host_name CursoAsterisk service_description IAX2 check_command check_snmp!ASTERISK-MIB::astChanTypeChannels.6!"Canales IAX2 Activos"!4!8 } define service{ use asterisk host_name CursoAsterisk service_description DAHDI check_command check_snmp!ASTERISK-MIB::astChanTypeChannels.cfg /etc/nagios/objects/localhost.7!"Canales DAHDI Activos"!4!8 } define service{ use asterisk host_name CursoAsterisk service_description Asterisk_check check_command check_asterisk } 448 .0. si son mas de 16 un CRITICAL.

0. se añaden estas líneas: define service{ use local-service host_name CursoAsterisk service_description PING check_command check_ping!100. En los tres bloques que siguen se controla a través del plugin check_snmp. En el bloque que sigue se utiliza el plugin check_asterisk. procesos.1 o localhost). carga. Si se quiere controlar también algunos servicios básicos del servidor (usuarios. El ultimo bloque se utilizan para monitorear la troncal SIP Justvoip.cfg que se utiliza para estos comandos.60% } define service{ use local-service host_name CursoAsterisk service_description Current Users check_command check_local_users!20!50 } define service{ use local-service host_name CursoAsterisk service_description Total Processes check_command check_local_procs!250!400!RSZDT } 449 . que se han visto al momento de la configuración del comando ($ARG1$ $ARG2$ $ARG3$ ARG4$).define service{ use asterisk host_name CursoAsterisk service_description Troncal_Justvoip check_command check_justvoip!justvoip } Una pequeña explicación. Se asignan a las cuatros macros (variables). los respectivos valores separados por el caracter ! Las OID se toman interrogando Asterisk con SNMP como hemos visto en el párrafo anterior.pl y a través del AMI de Asterisk se controla que esté corriendo. un alias y la dirección IP (en este caso siendo Nagios y Asterisk instalados en el mismo servidor se indica 127. En la segunda linea de cada bloque aparece el parámetro “use asterisk” que representa el template (la plantilla) configurada en templates. los canales SIP. etc…).20%!500. En el primer bloque se define el nombre del servidor.0. IAX2 y DAHDI activos.0.0.

3. de la siguiente forma: htpasswd -bc /etc/nagios/htpasswd.users que contendrá los datos de acceso para el usuario predefinido nagiosadmin (en este caso la contraseña es sesamo) Se configuran Nagios para que arranque en automático: chkconfig nagios on Se reinicia apache y luego se inicia Nagios: /etc/init.0 } define service{ use local-service host_name CursoAsterisk service_description SSH check_command check_ssh!15000 } Antes de iniciar Nagios hay una forma para controlar que todos los archivos de configuración estén exentes de errores: nagios -v /etc/nagios/nagios.d/httpd start /etc/init.0.0.4.cfg Si la respuesta termina con: Total Warnings: 0 Total Errors: 0 Things look okay .0!10.4.users nagiosadmin sesamo Adding password for user nagiosadmin Este comando creará una archivo htpasswd.0.d/nagios start 450 . nagiosadmin. En caso contrario Nagios indicará el archivo y la línea donde se encuentra el error. El acceso a la pagina Web de administración de Nagios está protegido y para poder acceder hay que configurar la contraseña del usuario predefinido.No serious problems were detected during the pre-flight check Significa que la configuración está bien.0.define service{ use local-service host_name CursoAsterisk service_description Current Load check_command check_local_load!5.6.

hay que abrir el puerto 80 TCP (servidor WEB) en Iptables: nano /etc/sysconfig/iptables Antes de este bloque: # Monit -A INPUT -p tcp -m state --state NEW -m tcp --dport 2812 -j ACCEPT se añade: # HTTP -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT Se guardan los cambios y se reinicia Iptables: service iptables restart Para entrar en la pagina de Nagios: http://IPservidor/nagios Aparecerá una ventana donde habrá que insertar las credenciales de acceso es decir: usuario: nagiosadmin contraseña: sesamo Se presiona el botón Aceptar. Aparece la pagina inicial de Nagios: 451 .Antes de entrar a la pagina de administración de Nagios.

452 .3. 22.1 NDOutils NDOutils permite guardar todos los datos de Nagios en una base de datos MySQL. Lo primero que hay que hacer es crear la base de datos: mysql -u root -psesamo mysql> create database nagios.En la derecha se selecciona el enlace Hosts para ver el servidor configurado: Se selecciona Services para ver los servicios monitoreados: Todos están bien.

cfg.d/ndoutils start 453 .o config_file=/etc/nagios/ndomod.cfg nano /etc/nagios/nagios.lock en db_user y db_password se pone: db_user=nagios db_pass=sesamo se guardan los cambios y se inicia NDOutils: /etc/init.cfg: nano /etc/nagios/ndo2db. Primero se modifica nagios. mysql> quit Se crean las tablas en la base de datos nagios desde un archivo instalado con el paquete NDOutils: mysql -u root -psesamo nagios < /usr/share/ndoutils/mysql.se asigna al usuario nagios los permisos para la base de datos creada: mysql> GRANT ALL PRIVILEGES ON nagios.sql Ahora falta modificar dos archivos de configuración: nagios. mysql> flush privileges.cfg que permiten a Nagios conectarse a la librería de NDOutils y enviar todos los datos de configuración y los eventos: Se guardan los cambios y se continua con el ndo2db.cfg y ndo2db.* TO 'nagios'@'localhost' IDENTIFIED BY 'sesamo'.cfg Después de estas dos lineas: ndo2db_user=nagios ndo2db_group=nagios se añade: lock_file=/var/nagios/ndo2db.cfg al final del archivo se añaden las siguientes lineas: event_broker_options=-1 broker_module=/usr/libexec/ndomod-3x.

por ejemplo.4. Hay disponibles distintos tipos de consultas de las tablas en la carpeta /usr/share/ndoutils/queries/ 22.4 Monitoreo calidad llamadas Como se ha dicho al inicio de este capitulo.d/nagios restart se averigua que en el log de Nagios haya conexión con la librería NDOutils: tail -f /var/log/nagios/nagios.1 Monitoreo calidad llamadas desde la consola de Asterisk Se entra en la consola de Asterisk: 454 . La primera es desde la consola de Asterisk: 22.y se reinicia Nagios: /etc/init. la tabla nagios_commands: Todo está funcionando como debería. es posible monitorear la calidad de las llamadas de distintas formas.log Las lineas que interesan son: En Webmin se puede controlar que las tablas se ha ido llenando de nuevas entradas como.

Entre el 1 y el 5%.4. Cuando las dos extensiones están hablando.2 Monitoreo calidad llamadas con VoIPMonitor VoIPmonitor es un programa que permite guardar todos los datos relacionados con la calidad de las llamadas en una base de datos. Se contesta la llamada y después de unos segundos se cuelga. se vuelve a marcar desde la extensión 1000 la extensión 1001. CLI> rtcp set stats on RTCP Stats Enabled Para ver como funciona. 22.asterisk -rvvvvvvvvvvvvvvvvvv Si activan las estadísticas del protocolo RTCP (Real Time Control Protocol) definido en el RFC 3550. se vuelve a ejecutar el comando: CLI> sip show channelstats En las lineas aparecen todos los datos relacionados con la llamadas corrientes (en este caso una): • • • • • • • • • • • Peer: la IP de las extensiones Call ID: el identificador único de llamada para cada extensión Duration: la duración de la llamada hasta el momento (en segundos) Recv: Pack: paquetes recibidos por Asterisk de las dos extensiones Lost: paquetes perdidos de la extensiones a Asterisk %: porcentaje de paquetes perdidos Jitter: Jitter entre las extensiones y Asterisk Send: Pack: paquete enviados por Asterisk Lost: paquetes perdidos de Asterisk a las extensiones %: porcentaje de paquetes perdidos Jitter: Jitter entre Asterisk y las extensiones Si el porcentaje de los paquetes perdidos se mantiene por abajo del 1%. Otra forma de hacerlo es con el comando: CLI> sip show channelstats para verlo en acción. aceptable. De este programa existen dos versiones. Una Open Source sin parte 455 . desde la extensión 1000 se llama la extensión 1002. la calidad de la llamada es muy buena. En la consola aparecerán todas una serie de datos relacionados con la llamada.

gz cd libpcap-1.1. El programa analiza y captura todos los paquetes SIP (señalización) y RTP (flujo media)./configure --prefix=/usr make make install 456 .1.2.2. para ambos canales. De cada llamada. perdidos Jitter canal llamante Jitter canal llamado Jitter promedio de la llamada MOS (Mean Opinion Score) llamante MOS (Mean Opinion Score) llamado Pre requisitos para la compilación e instalación: • • una versión de Libpcap >= 1.tar.tcpdump. hay que instalar la librería desde la fuentes: cd /usr/src wget http://www.org/release/libpcap-1. guarda los siguientes datos: • • • • • • • • • • • • • Fecha de la llamada Duración CallerID llamante CallerID llamado Quien de los dos canales ha colgado Codec Llamante Codec Llamado Paquetes recibidos.Web para ver la estadísticas desde un Navegador.gz tar -xf libpcap-1. una comercial que incluye la parte Web. enviados.1 .tar.2.0 Librería MySQL++ Primero se averigua la versión de libpcap instalada: yum info libpcap Como el numero de versión es inferior a 1.

mysql> quit Se cargan las tablas en la base de datos: mysql -u root -psesamo voipmonitor < cdrtable.0.net/svnroot/voipmonitor/trunk voipmonitor-svn Se entra en la carpeta creada: cd voipmonitor-svn Se compila y se instala: make make install Se crea la carpeta donde se guardarán todos los datos de las llamadas (archivo pcap.Se continua con MySQL++ cd /usr7src wget http://tangentsoft.1.1. archivo audio de la llamada si se utiliza el codec audio G711): mkdir /var/spool/voipmonitor Se crea la base de datos donde se guardarán los datos de las llamadas: mysql -u root -psesamo mysql> create database voipmonitor. Primero se descarga: svn co https://voipmonitor.0 . mysql> GRANT ALL PRIVILEGES ON voipmonitor.gz tar -xf mysql++-3. mysql> flush privileges./configure --prefix=/usr make make install Instalados los pre requisitos ya se puede compilar e instalar VoIPMonitor.svn.* to 'voipuser'@'localhost' IDENTIFIED BY 'sesamo'.net/mysql++/releases/mysql++-3.0.1.sql Se crea un archivo de configuración para el programa: 457 .gz cd mysql++-3.tar.sourceforge.tar.

31 jitterbuffer_f1=yes jitterbuffer_f2=yes jitterbuffer_adapt=yes # tipos de jitterbuffer utilizados para el calculo del MOS rtp-firstleg=no # se capturará el flujo media de ambos canales sip-register=no # no se guardarán en la captura SIP.conf Se copian las lineas que siguen: [general] # inicia la parte general de la configuración interface=any # el programa se pondrá a la escucha en todas las tarjetas de red presentes en el servidor managerport=5029 # puerto TCP para gestionar el programa sipport=5060 sipport=5061 # puertos SIP donde voipmonitor se pondrá a la escucha. los mensajes de REGISTER nocdr=no # VoIPMonitos guardará los CDR de las llamadas savesip=yes # VoIPMonitos guardará los datos SIP en un archivo savertp=yes #VoIPMonitor guardará los paquetes RTP en un archivo savegraph=plain # Se guardarán los datos de los graficos en un archivo (en el caso se utilice la GUI) spooldir=/var/spool/voipmonitor # Carpeta donde se guardarán los datos de las llamadas mysqlhost=localhost # dirección IP o nombre de dominio del servidor MySQL mysqldb=voipmonitor # Nombre de la base de datos mysqltable=cdr # Nombre de la tabla mysqlusername=voipuser # Nombre del usuario MySQL con los permisos para la base de datos mysqlpassword=sesamo # Password del usuario voipuser Se guardan los cambios y se instala lo script para iniciar el servicio en automático: 458 . Se indica uno por linea # ringbuffer=10 # Parámetro valido solamente para versiones del Kernel >= 2.nano /etc/voipmonitor.6.

d/voipmonitor /etc/init. 459 .d/voipmonitor chkconfig --add voipmonitor chkconfig voipmonitor on Se inicia el servicio: service voipmonitor start e se efectúa una llamada desde la extensión 1000 a la extensión 1001.cp config/init.d/ chmod +x /etc/init. Terminada la llamada se mira las entradas en la base de datos (serán dos).

.

Capitulo XXIII Conectar un Softphone (Blink) de forma segura: SIP TLS y SRTP En algunos contextos la privacidad de las comunicaciones es un factor importante para el desarrollo de las actividades de la empresa. el flujo media seguirá viajando en claro y podrá ser interceptado Las claves que intercambian el cliente y el servidor para instaurar el cifrado del flujo media. no tendría mucho sentido. Aunque se puedan utilizar separadamente.0/contrib/scripts/ Primero se crea el certificado de la autoridad de certificación y del servidor Asterisk: . Si no se utiliza el cifrado del protocolo SIP y alguien logra interceptar este trafico. por las siguientes razones: • • Si se utiliza solamente el protocolo SIP TLS. Se crea la carpeta donde se guardarán las claves: mkdir /etc/asterisk/keys y se entra en la carpeta de las fuentes de Asterisk que contiene uno script para la generación de los certificados: cd /usr/src/asterisk-1.X se han implementados dos nuevos protocolos: • • SIP TLS para el cifrado de la señalización SIP SRTP para el cifrado del flujo media. MAC OS y Windows..1 Creación de los certificados El primer paso es crear los certificado cliente. Las conversaciones seguras eran importantes en las comunicaciones tradicionales y más aun lo son en la voz sobre IP. Con la versión de Asterisk 1. 23.11. se envian a través de la señalización SIP.members. podrá tener acceso a las claves y de esta forma descifrar el flujo media.com -O "Campus VozToVoice" -d /etc/asterisk/keys • • con la opción -C se indica el nombre de dominio o la IP del servidor Asterisk con la opción -O se indica el nombre de la empresa o de la institución .8.. El único Softphone con una versión gratuita que soporta los protocolos SIP TLS Y SRTP es Blink.8. más aun si los datos que se intercambian a lo largo de las conversaciones son datos sensibles tipo: números de tarjetas de crédito. Antes de instalarlo hay que configurar Asterisk para activar el protocolo SIP TLS y SRTP.linode. De este producto existen versiones para Linux. datos de cuentas bancarias. secretos industriales./ast_tls_cert -C li374-112. servidor y de la autoridad de certificación. etc.

..../ast_tls_cert -C li374-112........members......key: Creating /etc/asterisk/keys/ca.key: Verifying ....key -C blink1.• con la opción -d se indica la ruta donde se guardarán los certificados . creating '/etc/asterisk/keys/tmp.Enter pass phrase for /etc/asterisk/keys/ca..../ast_tls_cert -m client -c /etc/asterisk/keys/ca.. Con esta operación se crearán el certificado de la autoridad de certificación con relativa clave y el certificado del servidor Asterisk con relativa clave.++++++ e is 65537 (0x10001) Creating signing request Creating /etc/asterisk/keys/asterisk...key: Creating /etc/asterisk/keys/asterisk..linode... En este caso un certificado cliente con la opción -c se indica la ruta del certificado de la autoridad de certificación con la opción -k se indica la ruta de la clave del certificado de la autoridad de certificación con -C se indica el nombre de dominio o la IP de donde se conectará el softphone...........li374112...crt Enter pass phrase for /etc/asterisk/keys/ca.....................linode....crt Signature ok subject=/CN=li374-112...pem Cuando el sistema lo solicita... El segundo paso es crear la clave del softphone utilizando la misa autoridad de certificación: .. 1024 bit long modulus ... Como en este caso el computador desde donde se conectará el softphone no tiene un nombre de dominio o una IP fija.com -O "Campus VozToVoice" -d /etc/asterisk/keys -o blink1 • • • • con la opción -m se indica el tipo de certificado...........++++++ ..key: Combining key and crt into /etc/asterisk/keys/asterisk......crt -k /etc/asterisk/keys/ca........++ e is 65537 (0x10001) Enter pass phrase for /etc/asterisk/keys/ca.....com -O "Campus VozToVoice" -d /etc/asterisk/keys No config file specified... se indica una contraseña que tiene que ser la misma a lo largo de todo el proceso...members.. En este caso se utilizará la contraseña server.....linode......key Generating RSA private key......... se pone un nombre que identifique el softphone y al mismo tiempo el dominio del servidor con la opción -O se indica el nombre de la empresa o de la institución 462 • .++ ... 4096 bit long modulus ..key Generating RSA private key.members.com/O=Campus VozToVoice Getting CA Private Key Enter pass phrase for /etc/asterisk/keys/ca...cfg' You can use this config file to create additional certs without re-entering the information for the fields in the certificate Creating /etc/asterisk/keys/ca....

.0.conf al final de la parte general se añaden las siguientes lineas: tlsenable=yes tlsbindaddr=0..com/O=Campus VozToVoice Getting CA Private Key Enter pass phrase for /etc/asterisk/keys/ca.0....key Generating RSA private key...crt tlscapath=/etc/asterisk/keys tlsdontverifyserver=yes • • • • • • Linea 1: se activa el protocolo SIP TLS Linea 2: Asterisk se pondrá a la escucha en todas las direcciones IP presentes en el servidor Linea 3: ruta y nombre del certificado del servidor Asterisk Linea 4: ruta y nombre del certificado de la autoridad de certificación Linea 5: ruta donde se encuentran todos los certificados de las distintas autoridades de certificación Linea 6: como el softphone no utiliza un nombre de dominio propio.crt Signature ok subject=/CN=blink1. es decir..• con la opción -d se indica la ruta donde se guardarán los certificados No config file specified.++++++ .members. se indica que el servidor Asterisk no deberá verificar el certificado del cliente Al final del archivo se crea una nueva extensión: [1005] 463 ..li374-112..conf de Asterisk: nano /etc/asterisk/sip...++++++ e is 65537 (0x10001) Creating signing request Creating /etc/asterisk/keys/blink1.....linode.cfg' You can use this config file to create additional certs without re-entering the information for the fields in the certificate Creating /etc/asterisk/keys/blink1.key: Combining key and crt into /etc/asterisk/keys/blink1. se ingresa la misma contraseña utilizada en la fase anterior.pem tlscafile=/etc/asterisk/keys/ca. Una vez creados los certificados se modifica la configuración del archivo sip.. server.....pem Cuando el sistema lo solicite.. creating '/etc/asterisk/keys/tmp.. con este parámetro en yes.. 1024 bit long modulus .0 tlscertfile=/etc/asterisk/keys/asterisk.

entre las varias lineas aparecerá: SSL certificate ok Como el protocolo SIP TLS utiliza el puerto 5061 TCP.type=friend accountcode=1005 language=es secret=pbx9095 qualify=yes mailbox=1005@default host=dynamic dtmfmode=rfc2833 context=externas directmedia=no callerid=Perengano <1001> callgroup=1 pickupgroup=1 disallow=all allow=ulaw allow=alaw allow=g729 allow=h263 cc_agent_policy=generic cc_monitor_policy=generic transport=tls encryption=yes Las ultimas dos lineas indican que para la extensión 1005. Se guardan los cambios y se recarga la configuración SIP: asterisk -rvvvvvvvvvvvvv CLI> sip reload Si todo sale bien. hay que abrirlo en el cortafuegos: nano /etc/sysconfig/iptables Después de esta linea: -A INPUT -p tcp -m state --state NEW -m tcp --dport 5060 -j ACCEPT se pone: -A INPUT -p tcp -m state --state NEW -m tcp --dport 5061 -j ACCEPT 464 . Asterisk aceptará solamente conexiones con el protocolo SIP TLS y el cifrado del flujo media.

Ahora se puede descargar el Softphone Blink según el sistema operativo utilizado. 23. en Windows se puede utilizar el programa winscp. hay que trasferir los certificado en el computador donde se instalará el Softphone Blink. Los archivos que hay que descargar son: • • ca. Bajo Linux el comando scp. Una vez descargado se instala y se inicia la configuración entrando en el menú Blink → Accounts → Add Account: 465 .pem Para esta operación.2 Configuración Softphone Blink Asterisk ya está configurado para el soporte SIP TLS y SRTP.crt blink1.Se guardan los cambios y se reinicia iptables: service iptables restart Para terminar esta primera parte.

En la pestaña “Media”: Se selecciona el protocolo SRTP como obligatorio “mandatory”. En la pestaña “Server settings”: se configura como aparece en la imagen de arriba y se continua con la pestaña “Advanced”: Se selecciona el certificado blink1.pem descargado del servidor Asterisk y se selecciona la casilla “Verify server”. Se pasa al icono Advanced: 466 .• • • Display name: un nombre que se le asigna a la cuenta SIP address: numero de extensión y dominio del servidor Asterisk Password: contraseña de la extensión 1005 Se presiona el botón ADD y se va al menú Blink → Account → Manage accounts.

Hangup En la primera linea se lee el valor asociado a la variable de canal “secure_signaling” Si es ugual a 1 significa que la llamada ha sido iniciada por una extensión configurada con el protocolo SIP TLS.Macro(voicemail) same => n.4-5].4].Se selecciona el certificado de la autoridad de certificación descargado del servidor Asterisk: Se vuelve a la pantalla principal del softphone y se averigua en la consola de Asterisk que esté registrado: CLI> sip show peers Prueba llamadas Para probar la configuración. En la segunda linea se lee el valor asociado a la variable de canal “secure_media”. hay que modificar el dialplan: nano /etc/asterisk/extensions.1. Si es igual a 1 significa que la llamada ha sido iniciada por una extensión configurada con el protocolo SRTP activado.Dial(SIP/${EXTEN}.Dial(SIP/${EXTEN}.conf Se modifica este bloque: exten => _100[0-2.Noop(Protocolo SIPTLS = ${CHANNEL(secure_signaling)}) same => n.hHkKtTwWxX) same => n. desde la extensión 1000 a la extensión 1005 467 .Hangup para que quede: exten => _100[0-2.1.Macro(voicemail) same => n.45. Se guardan los cambios y se recarga el dialplan: asterisk -rvvvvvvvvvvvvvvvvv CLI> dialplan reload Ahora se hacen dos llamadas: 1.hHkKtTwWxX) same => n.Noop(Protocolo SRTP = ${CHANNEL(secure_media)}) same => n.45.

-.SRTP SIP .2. aunque la segunda pata de la llamada no es segura.SRTP SoftPhone X-Lite ---------------------> Asterisk -------------------------> SoftPhone Blink El el primer caso.Executing [1000@externas:2] NoOp("SIP/1005-00000014".45.Executing [1000@externas:1] NoOp("SIP/1005-00000014".hHkKtTwWxX") Como la extensión 1000 (Softphone X-Lite) no soporta SIP TLS y SRTP.45. "Protocolo SRTP = 1") in new stack -.Executing [1005@externas:3] Dial("SIP/1000-00000010". "SIP/1005. Esto implica que es posible que se presenten estos escenarios: SIP TSL . "Protocolo SIPTLS = 1") in new stack -. Asterisk siempre está en el medio de una llamada para la señalización SIP.hHkKtTwWxX") Como la extensión 1005 (Softphone Blink) soporta SIP TLS y SRTP. Consideraciones finales Como se ha comentado en otro modulo. "SIP/1000.RTP SoftPhone Blink ---------------------> Asterisk -------------------------> SoftPhone X-Lite o: SIP TSL .Executing [1000@externas:3] Dial("SIP/1005-00000014". las dos variables de canal tendrán el valor 1. Para el flujo media depende de la configuración del parámetro directmedia y si las extensiones se registran detrás de un NAT o no. desde la extensión 1005 a la extensión 1000 Los resultados: Executing [1005@externas:1] NoOp("SIP/1000-00000010".Executing [1005@externas:2] NoOp("SIP/1000-00000010". "Protocolo SIPTLS = ") in new stack -. no implica que no se deban implementar los protocolo SIP TLS y SRTP cuando sea posible. Lo mismo vale para el segundo caso. "Protocolo SRTP = ") in new stack -.RTP 468 . las dos variable de canal estarán vacías. SIP .

.

Con Openfire instalado se tendrá un servidor de mensajería instantánea sin tener que acudir a servicios de terceros.0_20" OpenJDK Runtime Environment (IcedTea6 1.gz se descomprime tar -xf openfire_3_7_1.tar. Entre tantos servidores con protocolo XMMP Openfire se destaca por la sencillez de la instalación. fácilmente manejable y segura gracias al uso del protocolo TLS.10.23.6.el5_7-i386) OpenJDK Client VM (build 19.9. su multiplicidad de funciones y la posibilidad de ser integrado con Asterisk.Capitulo XXIV Openfire y Asterisk 24.0-b09.tar. ¿Porque Openfire?.6.0.0 .6.org/downloadServlet?filename=openfire/openfire_3_7_1.6.gz Se entra en la carpeta bin cd /opt/openfire/bin Se modifica el script de inicio: nano openfire modificando esta linea: # INSTALL4J_JAVA_HOME_OVERRIDE= para que quede: INSTALL4J_JAVA_HOME_OVERRIDE=/usr/lib/jvm/java-1.0-openjdk-1.1 Instalación de Openfire Openfire es un servidor Jabber.0-openjdk* Terminada la instalación se controla la versión instalada: java -version java version "1. Openfire es escrito en java y.igniterealtime.9.10) (rhel-1. Esto implica tener una red de mensajería instantánea privada.1. mixed mode) Se descarga el servidor jabber Openfire: cd /opt wget http://www. para que funcione. la administración desde una página Web. hay que instalar la JDK (Java SE Development Kit) o instalar (la opción que se usará) la versión OpenSource del java development Kit yum install java-1.

Query OK. Se crea la base de datos en MySQL mysqladmin create openfire -u root -psesamo Se entra en el cliente de mysql: mysql -u root -psesamo Se crea un usuario y se le otorgan todos los permisos para manejar la base de datos Openfire mysql> GRANT ALL PRIVILEGES ON openfire. En este caso se usará MySQL. Query OK.sql -u root -psesamo 471 .00 sec) mysql> quit Bye sesamo es la contraseña del usuario openfire Ahora se importan las tablas para la base de datos mysql openfire < /opt/openfire/resources/database/openfire_mysql. Openfire para registrar los datos puede utilizar una base de datos interna o externa.* TO 'openfire'@'localhost' IDENTIFIED BY 'sesamo'./openfire start Se averigua que esté corriendo . El servidor está funcionando. 0 rows affected (0. 0 rows affected (0.01 sec) mysql> flush privileges.Se guardan los cambios y se inicia: ./openfire status Si aparece: The daemon is running. Ahora hay que configurarlo.

com) aparecerá una pagina de configuración: 472 .Para que Openfire sea accesible desde afuera de la red local hay que abrir unos puertos en el cortafuegos. el nombre (Ej.ejemplo. nano /etc/sysconfig/iptables Después de este bloque: # Monit -A INPUT -p tcp -m state --state NEW -m tcp --dport 2812 -j ACCEPT Se añade: # Openfire -A INPUT -p tcp -m state --state NEW -m tcp --dport 5222:5223 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 5269 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 5275 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 7070 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 7443 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 9090 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 9091 -j ACCEPT Se guardan los cambios y se reinicia iptables: service iptables restart Una vez configurado el firewall se accede a la pagina de configuración de Openfire. En la barra de la direcciones del navegador se escribe: http://IPservidor:9090 en lugar de IPservidor se pone la dirección IP del servidor Linux o. www. si se tiene un dominio registrado.

se elige el idioma Se configura el nombre del dominio o la dirección IP: Se elige el tipo de base de datos que se utilizará: 473 .

Se configura el acceso a MySQL y la base de datos: En seteos de perfil se elige la opción “por defecto” 474 .

Se configura el correo electrónico y la cuenta del administrador: El servidor está listo para funcionar. 475 .

Antes de entrar en la página de administración de Openfire hay que parar y volver a arrancar el servidor: /opt/openfire/bin/openfire stop /opt/openfire/bin/openfire start Ahora se puede configurar el servidor. y se presiona Login: Después de unos segundos: 476 . instalar plugins. Hay que descargarlo. crear conferencias y otras cuantas funciones. que es el que se ha creado a lo largo de la configuración de Openfire. instalarlo y abrirlo. Para probar la conexión el cliente predefinido de Openfire es Spark (en este caso para Windows). Se pone come usuario admin. crear usuarios.

Se pueden configurar más usuarios y grupos desde la pagina de administración Si se quiere iniciar Openfire en automático: cd /opt/openfire/bin/extra/redhat nano openfire-sysconfig Se modifican estas lineas: #OPENFIRE_HOME="" #OPENFIRE_USER="daemon" #OPENFIRE_PIDFILE="/var/run/openfire.pid" #OPENFIRE_LOGDIR="/some/where/logs" #OPENFIRE_OPTS="-Xmx1024m" #JAVA_HOME=/usr/java/default para que queden OPENFIRE_HOME="/opt/openfire" OPENFIRE_USER="root" OPENFIRE_PIDFILE="/var/run/openfire.pid" OPENFIRE_LOGDIR="/var/log" 477 .

Este plugin permite asociar a un usuario registrado en Openfire una cuenta SIP o extensión Asterisk.OPENFIRE_OPTS="-Xmx256m" JAVA_HOME=/usr/lib/jvm/java-1. 478 .d/openfired status openfire is running 24.d/openfired se vuelve ejecutable: chmod +x /etc/init.6. Desde un navegador Web entramos en la pagina de administración.0. Luego se instala el mismo plugin en el cliente Spark y desde éste se podrán efectuar llamadas usando el dialplan configurado en Asterisk.0-openjdk-1.2 Instalar el Plugin SIPPhone en Openfire En este párrafo se verá come instalar el plugin SIPPhone para Openfire.0 Se guardan los cambios y se copia el archivo en la carpeta /etc/sysconfig: cp openfire-sysconfig /etc/sysconfig/openfire Ahora se instala el servicio: cp openfire /etc/init.d/openfired y se añade a los servicios: chkconfig --add openfired chkconfig openfired on Para averiguar si Openfire arranca en automático se hace un un reboot de la maquina Linux.6. reboot Se vuelve a entrar en el servidor y se averigua que openfire esté corriendo: /etc/init.

Dependiendo de los plugins que ya se instalaron. Se presiona el botón Server en la barra del menú. En la segunda línea del menú habrá un nuevo menú: “Phone”. aparecerá una lista de los plugins disponibles entre los cuales: Se presiona el botón a la derecha del plugin para instalarlo. Se escoge “Agregar nuevo mapeo” y se rellenan los campos: 479 .En el menú Plugins se escoge Available Plugins en el menú de la izquierda. Se presiona para entrar en el menú de configuración del plugin.

En el menú del cliente Spark se elige Spark → Plugins y en Plugins disponibles Phone client y se instala: 480 .• • • • • • • • Nombre de usuario XMPP : el nombre del usuario openfire Nombre de usuario : el numero o nombre de la extensión Usuario de Autorización : el numero o nombre de la extensión Numero de teléfono a mostrar : el numero que aparecerá al llamado Clave: la contraseña asociada a la extensión Servidor: el nombre del dominio o IP del servidor Asterisk Outbound Proxy : si se utiliza un proxy para conectarse al servidor Asterisk hay que indicarlo aquí sino se pone la dirección IP o el nombre de dominio del servidor Asterisk Numero Correo de voz : como en el dialplan se ha definido que para acceder al buzón de voz se utiliza la extensión 97. Se abre el cliente Spark y se abre una conexión con el nombre de usuario configurado arriba (en este caso admin). Se repite la misma operación para todos los usuarios que se quiere asociar a una extensión de Asterisk. se pone aquí el numero Se presionas el botón “Crear” para guardar la configuración. Una vez terminado hay que configurar el cliente Spark que es el único que funciona con este plugin.

En el menú acciones se elige Phone Enabled. Ahora se puede hacer una primera prueba. Aparecerá el cliente SIP en una nueva línea del menú de Spark y se podrá empezar a usarlo para hacer llamadas. Desde la extensión 1001 se marca la extensión 1000. se cierra el cliente y se vuelve a iniciar. Spark debería empezar a timbrar: 481 .Cuando se termina de descargar el plugin.

De este modo cuando esa extensión está hablando. en el cliente jabber Spark el estado del usuario Openfire asociado con la extensión cambiará de disponible a “on the phone”.aoc write=system.dtmf.agi.agi.call.0/0.user.config.reporting.1/255. monitorear las extensiones.0.agent.0.otiginate.conf: nano /etc/asterisk/manager.agent.conf haber configurado un usuario en el archivo manager.0.cc.255.d/asterisk reload 482 .0 permit=127. esta es una buena solución.3 El Plugin Asterisk-IM Asterisk-IM permite asociar a cada usuario Openfire una extensión SIP configurada en sip. 24.call.dialplan.Si se quiere usar un único programa para chatear. como se verá en el próximo párrafo.user.command.255 read=system. hacer llamadas VoIP y.0. Requisitos: • • • haber instalado openfire con una base de datos externa (Mysql) haber puesto el parámetro callevents=yes en la parte general del archivo sip.conf Al final del archivo se añade un nuevo usuario: [openfire] secret = sesamo deny=0.conf.cdr.0.0.aoc Se actualiza la configuración de Asterisk: /etc/init.reporting.conf Se modifica el archivo manager.255.

Se escoge el menú Asterisk-IM y luego General Settings. Desde un navegador Web se abre la pagina de administración de Openfire y se va al menú Plugins. En la misma ventana se escoge el menú Add Server y se configura la conexión al Asterisk Manager 483 . Una vez instalado en el barra de los menú. Se presiona el menú “Available Plugins” Para instalarlo se presiona el botón que aparece al fondo de la línea del plugin.Se instala el plugin en Openfire. habrá una nueva voz. Se configura siguiendo las pautas indicadas en la imagen que sigue: Se presiona el botón SAVE. Asterisk IM.

conf Password: la contraseña configurada en el manager. Para averiguar que efectivamente el usuario Openfire esté conectado al Asterisk Manager se entra en la 484 .En la pagina que aparece se configura como en la imagen que sigue: • • • • • Server Name: un nombre que se quiere asignar al servidor Server Address: dirección IP o nombre de dominio del servidor Asterisk (en este caso como se encuentra en el mismo servidor Linux. La bolita verde a la izquierda indica che hay conexión con Asterisk.conf Se presiona el botón “Create Server”. se pone localhost Port: el puerto para conectarse a la AMI de Asterisk Username: el nombre de usuario definido en el archivo manager.

0. Para guardar los cambios.consola de Asterisk: asterisk -rvvvvvvvvvvvvvv se digita el comando: CLI> manager show connected Username openfire IP Address Start Elapsed FileDes HttpCnt Read Write 127.0. en el cliente Spark cambiará el estado del usuario admin: Como cambiará en el cliente X-Lite: 485 . Desde el cliente Spark se abre una conexión con el usuario admin que se ha configurado en Phone Mappings. Desde el cliente Spark se marca el 97 para entrar en la buzón de voz. se presiona el botón “Add”.1 1323817682 79 10 0 04079 04851 Se guardan los cambios y se entra en el menú Phone Mappings: Se configuran todos los usuarios de Openfire que se quiere asociar con una extensión SIP presente en el servidor Asterisk.

Usar el protocolo SASL 486 .24.conf presente en la carpeta /etc/asterisk. el nombre de dominio o IP del servidor Openfire username=asterisk@localhost/openfire . Nombre del usuario Openfire del servidor asterisk secret=sesamo .4 Asterisk como cliente en Openfire La configuración de Asterisk como cliente jabber en Openfire es parecida a la de GoogleTalk (párrafo 5. Asterisk actuará como un cliente (las opciones son cliente. se copian las siguientes lineas: [asterisk] . Se empieza con la modifica del archivo jabber. nano /etc/asterisk/jabber. componente y server) serverhost=localhost .conf Al final del archivo.1). Usar el protocolo TLS usesasl=yes . el puerto TCP del servidor Openfire usado para conectarse usetls=yes . la contraseña priority=10 . etiqueta que define la conexión (importante para las funciones Jabberstatus y Jabbersend de Asterisk) type=client . el nivel de prioridad que tiene en cliente en caso de conflictos (ej: dos conexiones simultaneas del mismo usuario) port=5222 .

uno por línea statusmessage=Asterisk server . Se guardan los cambios y antes de actualizar la configuración de Asterisk se configura este usuario en Openfire. un mensaje personalizado del usuario timeout=100 .conf (sesamo) Confirm Password: otra vez la contraseña 487 . Desde un navegador Web se entra en la pagina de administración de Opnefire En la barra de menú se escoge “Users/Groups” y luego en el menú vertical en la izquierda “Create New User” • • • • • Username: el nombre de usuario Openfire Name: el nombre completo o un apodo Email: la dirección del correo electrónico del usuario (personalizar) Password: la contraseña creada en el jabber. la lista de amigos.buddy=admin@localhost .

488 .d/asterisk reload Se averigua el resultado desde la consola de Asterisk asterisk -rvvvvvvvvvvvv CLI> jabber show connected Jabber Users and their status: User: asterisk@localhost/openfire Para ver la lista de amigos: CLI> jabber show buddies Client: asterisk@localhost/openfire Buddy: admin@localhost Resource: None En el menú “Sessions” de Openfire: .Connected Se inicia el cliente Spark y se añade el usuario asterisk.Se termina presionando el botón “Create User”. Ya se puede recargar la configuración de Asterisk: /etc/init.

members.com • • Primero: si hay un cortafuegos por el medio.El resultado será: 24.members.linode.linode. los usuarios de uno podrán agregar en su lista de amigos usuarios del otro servidor. hay que abrir el puerto 5269 TCP en ambos Segundo: se entra en la pagina de administración del servidor A y se escoge el menú Server → 489 . Para lograr este tipo de comportamiento hay que modificar la configuración en los dos servidor: Los dos servidores están instalados en dos computadores de la misma LAN: Openfire A dominio: li115-178.com Openfire B dominio: li340-16.5 Conectar dos servidores Openfire Si se conectan dos servidores Openfire entre ellos.

Server Settings → Server to Server Se configura la página como sigue: Luego se pasa al menú Server > Server settings > Security settings y bajo el cuadro Server Connection Security se selecciona la casilla: 490 .

com en la White List.linode. La conexión se activa solamente cuando de un servidor se envía una solicitud a otro servidor.Se guardan los cambios y se sigue el mismo procedimiento en el servidor B indicando el dominio: li340-16. Para probarla en el servidor B se crea un nuevo usuario (menú Users/Groups → Create New User): Ahora desde el cliente Spark conectado al servidor A.members. se añade a la lista de amigos el usuario servidorb: 491 . Se guardan los cambios.

Se entra en el menú Sessions > Server Session de ambos servidores donde debería aparecer: Servidor A: Servidor B: 492 .

Este programa se configura delante del servidor Openfire y gestiona las conexiones y las autenticaciones de los usuarios.Si no aparece ninguna conexión se puede usar el programa Telnet para averiguar si el puerto 5269 TCP esté efectivamente abierto.. Si aparece la expresión en negrita todo está bien.115. Se pueden instalar uno o más Connection Manager según el numero de usuarios.126.6 Openfire Connection Manager Si hay que manejar un numero considerable de usuarios (más de 1000 en linea a la vez).com 5269 Trying 96. Cada Connection Manager es capaz de manejar cinco mil usuarios. hay que recurrir al Connection Manager. El esquema de funcionamiento es el que aparece en la imagen que sigue: En ese ejemplo hay tres Connection Managers instalados que reciben los registros de los usuarios y a su vez están conectados con el servidor Openfire.members. Desde la consola de Linux del servidor A se escribe: yum install telnet telnet telnet> o -a li340-16. Se descarga el programa: 493 . </stream:stream>Connection closed by foreign host.com.linode.16. Para tres o más servidores Openfire. Connected to li340-16. se sigue el mismo procedimiento.linode. 24. Escape character is '^]'.. que queremos conectar entre ellos. Los clientes tendrán que conectarse a ese servidor y luego serán enrutados por el Connection Manager al servidor Openfire.members.

gz Se entra en la carpeta de configuración y se modifica el archivo manager.org) hostname: la dirección IP del servidor Openfire port: el puerto configurado en el servidor Openfire para aceptar las conexiones del Connection Manager (5262 predefinido) password: la contraseña que se ha definido en el servidor Openfire para aceptar las conexiones del Connection Manager name: un nombre que se quiere asignar a el Connection Manager (muy útil si se tiene planeado instalar más de uno).voztovoice.gz Se descomprime: tar -xf connection_manager_3_6_3.org/tmp/connection_manager_3_6_3.xml cd /opt/connection_manager/conf nano manager.tar.tar.xml Las líneas que hay que modificar son: • • • domain: el nombre de dominio del servidor Openfire (ej: miodominio.cd /opt wget http://www. • • • Se guardan los cambios. interface: dirección IP o nombre de dominio donde el Connection Manager aceptará las conexiones. Para terminar se instala el “script” para iniciar Connection Manager en automático: cd /opt/connection_manager/bin/extra nano cmanagerd Se modifican las siguientes líneas: export CMANAGER_HOME=/opt/connection_manager export CMANAGER_USER=root 494 .

d/cmanagerd status running pid is 5747 Connection Manager 3. En el servidor Linux donde se instaló se escribe: /etc/init.d/cmanagerd start Se averigua que esté corriendo: /etc/init.CMD=".d/ chmod +x /etc/init.3 [Feb 6. se escoge el puerto y se define una contraseña. Se abre el puerto 5262 TCP en el cortafuegos. Se presiona el botón “Save Settings”.6.sh $1" Se guardan los cambios y se termina: cp cmanagerd /etc/init. Desde la pagina di administración del servidor Openfire bajo el menú “Server settings” se elige “Connection Manager”. 2010 5:02:17 AM] y en la pagina de administración de Openfire se verifica que está conectado: 495 . En la pagina que aparece se activa el servicio. Ahora se puede arrancar el Connection Manager./cmanager.d/cmanagerd chkconfig –add cmanagerd chkconfig cmanagerd on Antes de arrancar el Connection Manager hay que modificar la configuración del servidor Openfire.

xml 496 .Desde un cliente XMPP se abre una conexión usando como dirección IP o nombre de Dominio la que se ha configurado en la linea “interface” del archivo manager.

.

La replicación master-slave no es una copia de backup de la base de datos. Se puede usar el esclavo para consultas desde otros programas y de esta manera no cargar demasiado el Maestro. ¿Como funciona la replicación MySQL Master-slave? • • • El Maestro registra los cambios en un registro binario (Binary log) El esclavo copia los eventos en un registro propio (Relay log) El esclavo lee y repite los eventos presentes en el Relay log en la base de datos Una imagen que explica el funcionamiento: . La idea es tener siempre una copia de backup y además crear la replicación maestro-esclavo. habrá que escoger el tipo que se quier implementar 25. la posibilidad de replicar los datos en un servidor MySQL instalado en otro computador. Es buena practica usar una conexión dedicada para el intercambio de datos entre el maestro y el esclavo para evitar que hayan retrasos considerables en la actualización de la base de datos. automáticamente se borrará también en el esclavo. Ahora se quiere tener una copia de la base de datos actualizada en tiempo real para hacer frente a cualquier tipo de evento que pueda afectar la integridad de los registros de las llamadas o de las configuraciones en Realtime.Capitulo XXV Asterisk y alta disponibilidad El servidor Asterisk ya está instalado y trabajando. En vez de hacer las consultas en el maestro. de hecho si se borra una entrada en el MySQL maestro.1 Replicación MySQL Master-Slave En este párrafo se verá como crear una replicación MySQL Master-Slave. En este tipo de escenario hay disponible una funcionalidad de MySQL. Un ejemplo puede ser cuando se generan reportes mensuales de las llamadas. se hacen en el esclavo. Hay dos formas de replicar los datos: • • configurar una replicación master-slave (maestro-esclavo) configurar una replicación master-master (maestro-maestro) Como no se pueden tener los dos tipos de configuraciones activas a la vez. antes de empezar.

El escenario que se va a presentar es el siguiente: ServidorA: IP LAN: 192.128.168.128.145 Esclavo Base de datos replicada: asteriskcdr Servidor A: Se crea una carpeta donde guardar los Binary log: mkdir /var/log/mysql Se cambian los permisos de modo que MySQL pueda escribir y leer en esa carpeta: chown mysql:mysql /var/log/mysql Se entra en el cliente mysql mysql -u root -psesamo y se crean los privilegios de replicación para un nuevo usuario que luego se configurará en el servidorB: 499 .168.144 Base de datos a replicar: asterisk Master ServidorB: IP LAN: 192.

Se actualizan los privilegios y se sale del cliente MySQL: mysql> flush privileges.cnf Bajo la etiqueta [mysqld] se añaden las siguientes líneas: server-id = 10 log_bin = /var/log/mysql/mysql-bin.145' IDENTIFIED BY 'sesamo'. mysql> quit Ahora se modifica el archivo de configuración de MySQL para configurar los parámetros necesarios para la replicación: nano /etc/my.d/mysqld restart Considerando que el servidor Asterisk tiene tiempo trabajando hay que crear una copia de la base de datos para luego importarla en el servidor MySQL esclavo: mysql -u root -psesamo Primero se selecciona la base de datos asteriskcdr: mysql> use asteriskcdr 500 .168.128.* TO 'asterisk'@'192.myslq> GRANT REPLICATION SLAVE ON *. Aumenta la carga del Master a cambio de una replicación más precisa Se guardan los cambios y se reinicia MySQL /etc/init.log expire_logs_days = 10 max_binlog_size = 100M binlog_do_db = asteriskcdr sync_binlog=1 Una pequeña explicación de los parámetros: • • • • • • server-id: identifica el servidor MySQL log_bin: nombre del archivo donde se guardará el Binary log expire_log_days: especifica que los archivos Binary log más viejos de 10 días se pueden borrar max_binlog_size: el tamaño máximo de un Binary log binlod_do_db: el nombre de la base de datos que se va a replicar sync_binlog: cada evento generado en el Master será escrito inmediatamente en el Binary log.

no está instalado se instala: yum install mysql mysql-server mysql-devel Se inicia: /etc/init. Sin cerrar esta ventana.000001 98 | asteriskcdr | | +------------------+----------+--------------+------------------+ 1 row in set (0. Por ultimo se mira el estado del Master: mysql> SHOW MASTER STATUS.145:/tmp Se cierra esta ventana y se vuelve a la primera.Segundo se bloquea la lectura de todas las tablas de todas las bases de datos: mysql> FLUSH TABLES WITH READ LOCK.128.sql root@192.168.d/mysqld start 501 . y se sale del cliente: mysql> quit Servidor B Si MySQL. Se desbloquean las tablas: mysql> UNLOCK TABLES.000001) y en la columna Position (98). se abre otra ventana terminal o otra conexión al servidor Linux y se crea una copia de la base de datos asteriskcdr: cd /tmp mysqldump -u root -psesamo asteriskcdr > asteriskslave. Aparecerá algo por el estilo: +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.sql se copia el archivo en el servidoB en la carpeta tmp: scp asteriskslave.00 sec) Se anotan los datos que aparecen en la columna File (mysql-bin.

sql A este punto se crean los datos de acceso al servidor MySQL Master: mysql -u root -psesamo mysql> CHANGE MASTER TO MASTER_HOST='192.Se crea una contraseña para el usuario root: mysqladmin –u root password sesamo Se modifica el archivo de configuración de MySQL nano /etc/my.d/mysqld restart Se crea la base de datos asteriskcdr: mysqladmin -u root -psesamo create asteriskcdr se recuperan tablas y datos de la copia que está en la carpeta /tmp: cd /tmp mysql -u root -psesamo asteriskcdr < asteriskslave.168.144'.cnf bajo la etiqueta [mysqld] se pone: server-id=20 master-connect-retry=60 replicate-do-db=asteriskcdr skip_slave_start read_only Los parámetros: • • • • • server-id: numero que identifica el servidor MySQL del servidorB master-connect-retry: si el esclavo pierde la conexión con el maestro. 502 .128. cada 60 segundos intentará restablecerla replicate-do-db: la base de datos que vamos a replicar skip_slave_start: evita que el esclavo se reinicie en el caso de un crash del servidor read_only: no permite a la mayoría de los usuarios del servidor MySQL esclavo cambiar las tablas Se guardan los cambios y se reinicia MySQL: /etc/init.

000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes 503 . En MASTER_LOG_FILE Y MASTER_LOG_POS. Antes de iniciar el esclavo.142.000001 Read_Master_Log_Pos: 98 Relay_Log_File: mysqld-relay-bin.248 Master_User: fulano Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001'. MASTER_PASSWORD='sesamo'. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168. hay que abrir el puerto TCP 3306 en el servidor A.145 --dport 3306 -j ACCEPT Se guardan los cambios y se reinicia iptables: service iptables restart Se vuelve a la ventana del servidorB y se inicia el esclavo: mysql> START SLAVE. se ponen los datos del servidor MySQL A que se habían anotado.000002 Relay_Log_Pos: 235 Relay_Master_Log_File: mysql-bin. MASTER_LOG_FILE='mysql-bin.MASTER_USER='asterisk'. MASTER_LOG_POS=98.168.128. Se hace indicando que la única IP que podrá conectarse será la del Servidor B: nano /etc/sysconfig/iptables Después de este bloque: # Monit -A INPUT -p tcp -m state --state NEW -m tcp --dport 2812 -j ACCEPT Se pone: # MySQL -A INPUT -p tcp -m state --state NEW -m tcp -s 192. Se controla el estado de la conexión con el Master: mysql> SHOW SLAVE STATUS\G *************************** 1.

168.168.128. En éste se verá como utilizar la replicación MySQL Master-Master para la base de datos asteriskcdr solamente para la tabla CDR.00 sec) Se sale del cliente: mysql> quit Ahora se efectúa una llamada de prueba. Desde la extensión 1000 conectada al servidorA se llama el buzón de voz. 25.128.2 Replicación MySQL Master-Master En el párrafo anterior se ha visto como usar la replicación MySQL Master-Slave para la base de datos de asteriskcdr.Replicate_Do_DB: asteriskcdr 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: 98 Relay_Log_Space: 235 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: 0 1 row in set (0. ¿Qué diferencia hay entra una replicación Maestro-Esclavo y una Maestro-Maestro? 504 .144) ha enviado tress paquetes al servidorB (192. CDR2 y CDR3 de la base de datos asteriskcdr del servidor B.145) para actualizar las tablas CDR. Antes de hacerlo se activa en el servidorB la captura de paquetes con Ngrep para el puerto 3306 y la red local: ngrep -d eth0:1 -W byline port 3306 > /tmp/esclavo Terminada la llamada. se cierra la captura de paquetes y se mira que contiene el archivo /tmp/esclavo El servidorA (192.

Ejemplo: hay dos servidores Asterisk: A y B.128. El problema principal de la replicación Master-Master es el conflicto que se puede presentar en las entradas de la tabla.128. En este escenario se pueden generar conflictos entre los datos de las dos tablas y errores de replicación porque los dos presentan entradas con el mismo ID en la clave primaria de la tabla (siendo progresivo). Cuando A vuelve a funcionar. +----+---------------------+ | id | calldate | +----+---------------------+ | 21 | 2011-12-14 13:21:42 | 505 . este empieza a grabar nuevas entradas en la misma tabla. En el segundo caso la configuración se utiliza para la alta disponibilidad en Asterisk. Ejemplo: el servidorA se cae y toma su lugar el servidorB. Para solucionar este tipo de problema se usarán estos dos parámetros: • • auto_increment_increment auto_increment_offset ServidorA Se entra en el cliente MySQL y se consultan las fechas de las llamadas de la extensión 1000: mysql -u root -psesamo mysql> use asteriskcdr mysql> select id.En el primer caso se tiene una copia de todos los registros en otro servidor y se pueden efectuar estadísticas usando el Esclavo sin sobrecargar el Maestro. Se registran unos cuantos datos en la tabla cdr del servidorB. Como se verá en los próximos párrafos.168. para la alta disponibilidad en Asterisk.calldate from cdr where dst=1000.168. se necesitará configurar otros programas. Escenario: ServidorA: IP 192. Si A se cae B toma su lugar.145 Base de datos a replicar: asteriskcdr – Tabla: cdr MasterB SlaveB La tabla CDR en el ServidorA ya existe y tiene unos cuantos datos registrados. B vuelve a ser el servidor de respaldo. Mientras el servidorA vuelve a funcionar y antes que el servidorB pueda actualizar los datos de la tabla CDR en el servidorA. además de la replicación Master-Master.144 Base de datos a replicar: asteriskcdr – Tabla: cdr MasterA SlaveA ServidorB: IP 192.

cnf bajo la etiqueta [mysqld] se pone: server-id = 10 auto_increment_increment = 10 auto_increment_offset = 1 log_bin = /var/log/mysql/mysql-bin. mysql> flush privileges.00 sec) Se crea una carpeta donde guardar los Binary log de MySQL y se cambia usuario y grupo que tiene los permisos en la carpeta creada: mkdir /var/log/mysql chown mysql:mysql /var/log/mysql Se regresa al cliente MySQL y se crean los privilegios de replicación para un nuevo usuario: mysql -u root -psesamo mysql> GRANT REPLICATION SLAVE ON *.| 55 | 2011-12-15 09:01:57 | | 56 | 2011-12-15 09:03:10 | | 57 | 2011-12-15 09:03:28 | | 58 | 2011-12-15 09:03:56 | +----+---------------------+ 5 rows in set (0.168.145' IDENTIFIED BY 'sesamo'.log expire_logs_days = 10 max_binlog_size = 100M replicate-do-table =asteriskcdr.128.* TO 'masterb'@'192. mysql> quit Se modifica el archivo de configuración de MySQL: nano /etc/my. Con auto_increment_offset a 1 cada entrada usará el entero 1 506 .cdr sync_binlog =1 Los parámetros: • • Con auto_increment_increment a 10 cada entrada en la tabla cdr tendrá un ID progresivo que irá de 10 en 10.

sin cerrar esta ventana.00 sec) Se anotan los datos que aparecen en la columna File (mysql-bin.sql se copia el archivo en el servidorB en la carpeta tmp: 507 . Aparecerá algo por el estilo: +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.d/mysqld restart Considerando que el servidor Asterisk tiene tiempo trabajando hay que crear una copia de la base de datos para luego importarla en el servidorB: mysql -u root -psesamo Primero se selecciona la base de datos asterisk: mysql> use asteriskcdr Segundo se bloquea la lectura de todas las tablas de todas las bases de datos: mysql> FLUSH TABLES WITH READ LOCK. Por ultimo se mira el estado del Master: mysql> SHOW MASTER STATUS. se abre otra ventana terminal o otra conexión al servidor Linux y se crea una copia de la base de datos asteriskcdr: cd /tmp mysqldump -u root -psesamo asteriskcdr > cdr.000001) y en la columna Position (98).En el caso de tres entradas en la tabla el resultado será: ID 1 ID 11 ID 21 • Con replicate-do-table se define que la replicación es solamente para la tabla cdr de la base de datos asteriskcdr Se reinicia mysql: /etc/init.000001 | 98 | asterisk | | +------------------+----------+--------------+------------------+ 1 row in set (0.

calldate from cdr where dst=1000.scp cdr. y se sale del cliente: mysql> quit ServidorB Se crea la carpeta para guardar los Bynary log con los permisos para el usuario mysql: mkdir /var/log/mysql chown mysql:mysql /var/log/mysql Se entra en el cliente mysql y se crea la base de datos asterisk: mysql -u root -psesamo mysql> create database asteriskcdr.128.sql root@192. mysql> quit Se importa la tabla cdr: cd /tmp mysql -u root -psesamo asteriskcdr < cdr.sql Se averigua que efectivamente las tabla y los datos presentes se han guardado: mysql -u root -psesamo mysql> use asteriskcdr mysql> select id. Se desbloquean las tablas: mysql> UNLOCK TABLES.145:/tmp Se cierra esta ventana y se regresa a la primera.168. +----+---------------------+ | id | calldate | +----+---------------------+ | 21 | 2011-12-14 13:21:42 | | 55 | 2011-12-15 09:01:57 | | 56 | 2011-12-15 09:03:10 | 508 .

Se reinicia Mysql: /etc/init. En el caso de tres entradas el ID sería: ID 2 ID 12 ID 22 Como se puede ver. mysql> quit Ahora se modifica el archivo de configuración de MySQL: nano /etc/my.144' IDENTIFIED BY 'sesamo'.d/mysqld restart Y ahora como para el servidorA se mira el Binary log y se anotan los datos: mysql -u root -psesamo mysql> FLUSH TABLES WITH READ LOCK. 509 .128.168. de esta forma no se presentarán conflictos en las entradas de la tabla CDR.| 57 | 2011-12-15 09:03:28 | | 58 | 2011-12-15 09:03:56 | +----+---------------------+ 5 rows in set (0.cnf bajo la etiqueta [mysqld] se pone: server-id = 20 auto_increment_increment = 10 auto_increment_offset = 2 log_bin = /var/log/mysql/mysql-bin. Se crea un nuevo usuarios con los permisos de replicación: mysql> GRANT REPLICATION SLAVE ON *.* TO 'mastera'@'192.00 sec) Aparecerán las mismas entradas del servidorA.cdr sync_binlog =1 El auto_increment_offset es igual a 2. mysql> flush privileges.log expire_logs_days = 10 max_binlog_size = 100M replicate-do-table =asteriskcdr.

168.142.000001'. MASTER_USER='masterb'.144'. MASTER_PASSWORD='sesamo'.00 sec) y se mira el resultado: mysql> SHOW SLAVE STATUS\G *************************** 1. +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin. Query OK. MASTER_LOG_POS=98.000001 | 98 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.128.168.144 --dport 3306 -j ACCEPT Se reinicia el servicio: service iptables restart Ahora se conecta el servidorB al servidorA: mysql -u root -psesamo mysql> CHANGE MASTER TO MASTER_HOST='192.mysql> SHOW MASTER STATUS. hay que abrir el puerto TCP 3306 solamente para esa IP local: nano /etc/sysconfig/iptables En la sección filter se añade: # MySQL -A INPUT -p tcp -m state --state NEW -m tcp -s 192. 0 rows affected (0.248 510 .168.00 sec) mysql> quit Para dar acceso a la base de datos al servidorA. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192. 0 rows affected (0.128.00 sec) Se inicia el esclavo: mysql> START SLAVE. MASTER_LOG_FILE='mysql-bin. Query OK.

000002 Relay_Log_Pos: 235 Relay_Master_Log_File: mysql-bin.10 sec) mysql> START SLAVE. Query OK.Master_User: masterb Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.145'.128. 0 rows affected (0. MASTER_USER='mastera'. MASTER_LOG_FILE='mysql-bin. MASTER_LOG_POS=98. MASTER_PASSWORD='sesamo'.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: asteriskcdr.00 sec) Se sigue el mismo procedimiento para el ServidorA: mysql -u root -psesamo mysql> CHANGE MASTER TO MASTER_HOST='192.000001 Read_Master_Log_Pos: 98 Relay_Log_File: mysqld-relay-bin.cdr Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 98 Relay_Log_Space: 235 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: 0 1 row in set (0.168.000001'. mysql> SHOW SLAVE STATUS\G 511 .

168. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.000002 Relay_Log_Pos: 235 Relay_Master_Log_File: mysql-bin.*************************** 1. El resultado en la base de datos: mysql -u root -psesamo mysql> use asteriskcdr 512 .cdr Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 98 Relay_Log_Space: 235 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: 0 1 row in set (0.146.90 Master_User: mastera Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: asterisk.000001 Read_Master_Log_Pos: 98 Relay_Log_File: mysqld-relay-bin.00 sec) La prueba Se para el MySQL del servidorB y se efectúan dos llamadas desde la extensión 1000 del Asterisk A al buzón de voz.

las ultimas dos entradas tienen un salto de 10 y cada una termina con el numero 1.00 sec) El ID progresivo en el servidorB cambia con saltos de 10 y cada entrada termina con el numero 2. +----+---------------------+ | id | calldate | +----+---------------------+ | 32 | 2011-12-14 18:06:06 | | 54 | 2011-12-15 08:51:20 | | 61 | 2011-12-15 09:33:23 | | 71 | 2011-12-15 09:33:48 | +----+---------------------+ 4 rows in set (0. +----+---------------------+ | id | calldate | +----+---------------------+ | 32 | 2011-12-14 18:06:06 | | 54 | 2011-12-15 08:51:20 | | 61 | 2011-12-15 09:33:23 | | 71 | 2011-12-15 09:33:48 | | 72 | 2011-12-15 09:38:07 | | 82 | 2011-12-15 09:39:14 | +----+---------------------+ 6 rows in set (0.calldate from cdr where dst=97.calldate from cdr where dst=97.calldate from cdr where dst=97. El resultado en la base de datos: mysql -u root -psesamo mysql> use asteriskcdr mysql> select id. Terminada la operación. se para MySQL en el servidorA y se inicia MySQL en el servidorB efectuando dos llamadas al buzón de voz usando el Asterisk del servidorB. +----+---------------------+ 513 .00 sec) Mientras antes el ID era progresivo. Ahora se inicia MySQL en el servidorA y se mira que pasa en los dos servidores: ServidorA mysql -u root -psesamo mysql> use asteriskcdr mysql> select id.mysql> select id.

calldate from cdr where dst=97. se han creado 4 particiones: 514 . Lo mismo se puede hacer con dos servidores locales con las modificaciones oportunas. Al momento de configurar el servidor Linode.| id | calldate | +----+---------------------+ | 32 | 2011-12-14 18:06:06 | | 54 | 2011-12-15 08:51:20 | | 61 | 2011-12-15 09:33:23 | | 71 | 2011-12-15 09:33:48 | | 72 | 2011-12-15 09:38:07 | | 82 | 2011-12-15 09:39:14 | +----+---------------------+ 6 rows in set (0.3 DRBD . Funciona en el mismo modo de un sistema RAID1 con la sencilla diferencias que las copias de los datos se hacen a través de la red usando el protocolo TCP. +----+---------------------+ | id | calldate | +----+---------------------+ | 32 | 2011-12-14 18:06:06 | | 54 | 2011-12-15 08:51:20 | | 61 | 2011-12-15 09:33:23 | | 71 | 2011-12-15 09:33:48 | | 72 | 2011-12-15 09:38:07 | | 82 | 2011-12-15 09:39:14 | +----+---------------------+ 6 rows in set (0.00 sec) Los datos se han replicado y no hubo ningún tipo de conflicto en la tabla cdr gracias al uso de: • • auto_increment_increment auto_increment_offset 25. Se verá como instalar DRBD en dos servidores VPS en Linode y de esta forma crear un sistema de alta disponibilidad para Asterisk.Raid1 vía TCP DRBD es un programa que permite conectar particiones presentes en distintos servidores y tenerlas sincronizadas.00 sec) ServidorB mysql -u root -psesamo mysql> use asteriskcdr mysql> select id.

64 bytes from li340-16.145): icmp_seq=4 ttl=64 time=0.168.430 ms 64 bytes from li340-16.linode.128.linode.145): icmp_seq=2 ttl=64 time=0.com 192.126.com (192.128.128.168.members. Una vez terminada esta operación.168. Claramente las mismas particiones tienen que ser creadas el en segundo servidor de respaldo.com Se guardan los cambios y se averigua que efectivamente se logra localizar el servidor B: ping li340-16.com Servidor B IP publico: 96.members.168. tendremos los dos servidores Linode listos para la instalación y configuración de DRBD.671 ms 64 bytes from li340-16. Servidor A IP publico: 69.members.115.128.128.168.144 Dominio: li115-178.128.La ultimas dos es las que se utilizarán para DRDB.linode.145 li340-16.168.com PING li340-16.members.128.145 Dominio: li340-16.com (192.145): icmp_seq=1 ttl=64 time=0.168.178 IP Lan: 192.linode.16 IP Lan: 192.479 ms 515 .com (192.linode.linode.128.members.members.201.405 ms 64 bytes from li340-16.145): icmp_seq=3 ttl=64 time=0.168.members.168.linode.members.com Se inicia la configuración de los dos servidores para que cada uno sepa a que dirección IP encontrar el otro: Servidor A nano /etc/hosts Al final de archivo se añaden las siguientes líneas: 192.128.linode.linode.com (192.144 li115-178.members.145) 56(84) bytes of data.linode.members.com (192.164.

128.com 192.members. time 4996ms rtt min/avg/max/mdev = 0.587/0.members.linode.144): icmp_seq=2 ttl=64 time=0.linbit.480/0.3.128.168.com (192.671/0.linode.168./configure --prefix=/ --with-km --with-xen Se compila utilizando la ultimas versión de las fuentes del Kernel-XEN instalado en el servidor. time 4997ms rtt min/avg/max/mdev = 0.com (192.com (192.144 li115-178.422 ms 64 bytes from li115-178.144): icmp_seq=1 ttl=64 time=0.members.128.gz tar -xf drbd-8.com/drbd/8.483 ms --.128.com (192.076 ms Una vez terminada esta parte se prepara el sistema para la instalación de DRBD: Las operaciones que siguen hay que ejecutarlas en ambos servidores: cd /usr/src wget http://oss.tar.386 ms 64 bytes from li115-178.members. 6 received.members.gz cd drbd-8.405/0.linode.linode.3.168.members.com ping statistics --6 packets transmitted.145 li340-16.members.128.com ping statistics --6 packets transmitted.144): icmp_seq=4 ttl=64 time=0.168.386/0.144): icmp_seq=3 ttl=64 time=0.168.members.168.com (192.7 .518 ms 64 bytes from li340-16.tar.members.128.7.64 bytes from li340-16.members.com (192.168.128.li115-178.linode.497/0.li340-16.168. 6 received.com (192.linode.089 ms Se efectua el mismo procedimiento en el servidor B Servidor B nano /etc/hosts Se añaden las siguientes líneas: 192.com (192. 0% packet loss.525 ms --.144): icmp_seq=6 ttl=64 time=0.168.linode.members.542 ms 64 bytes from li115-178.3/drbd-8.com PING li115-178.587 ms 64 bytes from li115-178.members.com ping li115-178.168.linode.members. 64 bytes from li115-178.128.144): icmp_seq=5 ttl=64 time=0.145): icmp_seq=6 ttl=64 time=0.7. 0% packet loss.com (192.linode.linode.128.145): icmp_seq=5 ttl=64 time=0.128.linode. es 516 .linode.128.144) 56(84) bytes of data.members.3.linode.168.420 ms 64 bytes from li115-178.linode.

144:7789.6. } on li340-16.conf /etc/drbd. disk /dev/xvdc.1. address 192. address 192.el5-xen-i686 make install Se mueve la configuración predefinida que viene con la instalación de DRBD mv /etc/drbd.com { device /dev/drbd1.conf Se copian las lineas que siguen en ambos servidores: global { usage-count yes.18-308.1.168.linode.1.128.6. } resource data { net { allow-two-primaries.1.linode.conf. meta-disk /dev/xvdd[0]. } common { protocol C. } on li115-178.old se crea una nueva: nano /etc/drbd.members.com { device /dev/drbd1.128.168. } startup { become-primary-on both. meta-disk /dev/xvdd[0].decir: uname -r 2.el5xen make KDIR=/usr/src/kernels/2. disk /dev/xvdc.members.18-308.145:7789. } } De esta forma se crean dos nodos primarios usando el protocolo C y se nombra este recurso creado 517 .

145.168. you need to zero out the first part of the device (destroy the content). Ahora se crean los meta-datos en la partición xvdd de ambos servidores: drbdadm create-md data Normalmente sale este error: Found ext3 filesystem This would corrupt existing data. You should be very sure that you mean it.“data”.. El nodo 2 será li340-16.linode.2176 seconds.com cuya IP local es 192.128. 1.com cuya IP local es 192.128.144 Se utilizarán las dos particiones creadas (xvdc y xvdd) una para las copia de los datos y la otra como meta disco para guardar los datos que DRBD crea al momento de conectarse y sincronizarse con el segundo nodo. 110 MB/s Se ejecuta otra vez el comando: drbdadm create-md data Writing meta data.members. success Se configurara el programa para que el servicio arranque en automático: chkconfig --add drbd chkconfig drbd on Para crear una primera sincronización entre los datos de las dos particiones de los dos servidores se 518 .linode. initializing activity log NOT initializing bitmap New drbd meta data block successfully created.168..members. If you want me to do this. Command 'drbdmeta 1 v08 /dev/xvdd 0 create-md' terminated with exit code 40 Se soluciona destruyendo todos los datos presentes en la partición: dd if=/dev/zero of=/dev/xvdd bs=1M count=128 128+0 records in 128+0 records out 134217728 bytes (134 MB) copied. Operation refused. El nodo 1 será li115-178.

.0% (815528/819200)K finish: 0:42:28 speed: 252 (244) K/sec Cuando el proceso termine... 2011-12-15 11:24:58 1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r---ns:3672 nr:0 dw:0 dr:3672 al:0 bm:0 lo:6 pe:0 ua:6 ap:0 ep:1 wo:b oos:815528 [>.linode...--overwrite-data-of-peer primary data Esta operación puede durar bastante tiempo dependiendo del tamaño de los discos..com... Se puede controlar en cualquier momento a que punto ha llegado con el comando: cat /proc/drbd version: 8...7 (api:88/proto:86-91) GIT-hash: ea9e28dbff98e331a62bcbcc63a6135808fe2917 178. aparecerá: cat /proc/dbd version: 8.linode. 2011-12-15 11:24:58 build by root@li115- 1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r---519 .carga el modulo DRBD en el Kernel: modprobe drbd se averigua que efectivamente esté corriendo: lsmod | grep drbd drbd 251364 0 Ahora se crea la conexión entre los dos servidores: drbdadm attach data drbdadm syncer data drbdadm connect data Se efectuá una primera sincronización de los datos: Servidor A drbdadm -.members..3...] sync'ed: 1....com.3....members.7 (api:88/proto:86-91) GIT-hash: ea9e28dbff98e331a62bcbcc63a6135808fe2917 build by root@li115178.

se copian 520 .ns:819200 nr:0 dw:0 dr:819200 al:0 bm:50 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0 Se reinician ambos servidores: reboot Servidor A Se crea una nueva carpeta donde se copiarán los datos que se quiere sincronizar: mkdir /home/data Se monta la partición de los datos: mount /dev/drbd1 /home/data se crean unos cuantos archivos de prueba: touch /home/data/file1 touch /home/data/file2 touch /home/data/file3 ls /home/data file1 file2 file3 lost+found Se desmonta la partición: umount /home/data y se averigua el resultado en el servidor B Servidor B mkdir /home/data mount /dev/drbd1 /home/data ls /home/data file1 file2 file3 lost+found umount /home/data En el caso que se quiera tener sincronizados los archivos de configuración de Asterisk.

No hace falta dejar la partición montada en ninguno de los dos servidores porque. Heartbeat se encargará de hacerlo según el servidor que esté activo en ese momento. como se verá en el próximo párrafo.directamente la carpeta de esta forma: Servidor A mount /dev/drbd1 /home/data mkdir /home/data/etc cd /etc mv asterisk /home/data/etc/asterisk Para terminar se crea un enlace simbólico a la nueva carpeta: ln -s /home/data/etc/asterisk asterisk Lo mismo con DAHDI: mv dahdi /home/data/etc/dahdi ln -s /home/data/etc/dahdi dahdi umount /home/data Servidor B mount /dev/drbd1 /home/data cd /etc rm -fr asterisk rm -fr dahdi ln -s /home/data/etc/asterisk asterisk ln -s /home/data/etc/dahdi dahdi umount /home/data Ya está configurado y funcionando DRBD. 25.4 Heartbeat 521 .

201.255.191 es la nueva IP adquirida.115.164.128.144 Servidor B IP publico: 96.0 173. poniendo activo el IP compartido y arrancando dahdi y asterisk.255. el slave toma el control cargando la partición de DRBD donde hemos guardado los datos de configuración de Asterisk. Una vez comprado.126. Se reinicia el servidor: reboot Luego en la pagina de administración de Linode del servidor B se configura el failover.168.128.196. Esto permite que al caerse el servidor A.255.178 IP Lan: 192.3.196. Cuando se utiliza Asterisk alta disponibilidad con este tipo de configuración. En el menú “Remote Access” de la pagina de administración del Linode: 522 . hay que configurarlo en una nueva tarjeta de red virtual: nano /etc/sysconfig/network-scripts/ifcfg-eth0:2 Se copian las siguientes lineas: DEVICE=eth0:2 BOOTPROTO=none ONBOOT=yes IPADDR=173.255.191 NETMASK=255.Se termina el capitulo dedicado a Asterisk y alta disponibilidad con la instalación y configuración de Heartbeat.168. Para resumir: Servidor A IP publico: 69. habrá un IP publico compartido que es él que se utilizará para registrar las extensiones.16 IP Lan: 192.145 Primero se compra en Linode un segundo IP publico para el servidor A (costo: un dólar al mes) que será el IP “virtual” que compartirán los dos servidores. Cuando el master se cae. Heartbeat se necesita para que los dos servidores sepan el estado del otro. el servidor B tomará la gestión de ese IP. En el caso de una red publica y de Linode sería algo parecido: IP Servidor Asterisk Master IP Asterisk Publico IP servidor Asterisk Slave Se utilizará la misma configuración que se presentó en el párrafo 25.

Se escoge el enlace “IP Failover”.centos.centos.d/CentOS-Base.Extras mirrorlist=http://mirrorlist. Ahora hay que instalar Heartbeat.centos.org/centos/$releasever/extras/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5 Se guardan los cambios y se instala Heartbeat: yum install heartbeat Por algún raro motivo hay que repetir el comando dos veces: 523 .org/?release=$releasever&arch=$basearch&repo=extras baseurl=http://mirror.Extras mirrorlist=http://mirrorlist. Para activarlos: nano /etc/yum.repos. Este programa es presente en los repositorios "extras” de CentOS.repo se modifica este bloque: [extras] name=CentOS-$releasever .org/centos/$releasever/extras/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5 para que quede: [extras] name=CentOS-$releasever .org/?release=$releasever&arch=$basearch&repo=extras #baseurl=http://mirror.centos. En la nueva pagina: Se selecciona la nueva IP adquirida y se presiona el botón “Save Changes”.

linode.145 udpport 694 auto_failback on node li115-178.linode.members.members.128.168.com node li340-16.d/ha.d/ha.members.com Ahora en ambos servidores se crea el archivo que utilizará Heartbeat para el intercambios de llaves de autentificación y el archivo donde se indicará la IP virtual compartida y los servicios que heartbeat 524 .cf debugfile /var/log/ha-debug logfile /var/log/ha-log logfacility local0 keepalive 2 deadtime 120 initdead 120 ucast eth0 192.168.cf • authkeys • haresources Se empieza con el que se encarga de controlar el estado de los servidores. Servidor A: nano /etc/ha.linode.cf se pegan las siguientes líneas: debugfile /var/log/ha-debug logfile /var/log/ha-log logfacility local0 keepalive 2 deadtime 120 initdead 120 ucast eth0 192.144 udpport 694 auto_failback on node li115-178.members.com Servidor B: nano /etc/ha.linode.yum install heartbeat Ahora hay que crear tres archivos de configuración: • ha.128.com node li340-16.

Estos servicios tienen que ser indicados en la carpeta etc/ha. drbddisk es el script que se encarga de montar la partición donde se han guardado los archivos de configuración de Asterisk.d/authkeys Para terminar el archivo de los recursos: nano /etc/ha.d/resource.d ln -s /etc/init. Estos archivos tienen que ser iguales en ambos servidores: nano /etc/ha.linode.com y se indica como IP virtual la que se acaba de comprar.d/resource.d/asterisk asterisk ln -s /etc/init.196. en este caso dahdi y asterisk.com IPaddr2::173.d/drbddisk 525 .linode. Todo parecía funcionar bien pero heartbeat no montaba la partición /dev/drbd1 y Asterisk no podía funcionar. en este caso /dev/drbd1. Por ultimo se indican los servicios que Heartbeat tiene que iniciar. Para hacerlo se crea un enlace simbólico: cd /etc/ha.191 drbddisk::data Filesystem::/dev/drbd1::/home/data::ext3 dahdi asterisk IMPORTANTE: tiene que estar todo el la misma línea Se define como servidor Master li115-178. Se resuelve de la siguiente forma: nano /etc/ha.d/resource. Revisando las cosas el script drbddisk (que viene con la instalación de Heartbeat) estaba mal configurado.deberá gestionar.255.d/authkeys auth 3 3 md5 sesamo Se usa como método de cifrado MD5 y después se pone la contraseña que se quiere utilizar (en este caso sesamo). Ahora hay que cambiar los permisos de este archivo para que sea accesible (en lectura y escritura) solamente para el usuario root: chmod 600 /etc/ha.d/dahdi dahdi Ahora el problema.d.d/haresources Se pone: li115-178.members.members.

conf" indicando donde efectivamente se encuentra el archivo de configuración de drbd.Se cambia esta linea: DEFAULTFILE="/etc/default/drbd" para que quede: DEFAULTFILE="/etc/drbd. chkconfig --add heartbeat chkconfig heartbeat on Se abre el puerto UDP 694 que permite a los servicios Hertbeat instalados en los dos servidores de comunicarse entre ellos: Servidor A nano /etc/sysconfig/iptables después de este bloque: # HTTP -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT se añade: # Heartbeat -A INPUT -p udp -m udp -s 192. Para terminar la configuración los últimos cambios en ambos servidores: chkconfig asterisk off chkconfig dahdi off Esto porque es Heartbeat que se encarga de iniciar los dos programas.168.128.145 --dport 694 -j ACCEPT Se reinicia iptables: service iptables restart Servidor B nano /etc/sysconfig/iptables después de este bloque: 526 .

# HTTP -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT se añade: # Heartbeat -A INPUT -p udp -m udp -s 192.linode.168.128.144:694 >>> t=status st=active dt=1d4c0 protocol=1 src=li340-16.com (1)srcuuid=9ku7IyMqS7uMVmJpcNsTCg== seq=274 hg=4eea4a62 ts=4eea4ec9 ld=0. Todas las extensiones tendrán que conectarse a la nueva IP compartida.128.members.144 --dport 694 -j ACCEPT Se reinicia iptables: service iptables restart Con esta ultima operación se ha terminado la configuración de Heartbeat. Si en algún momento el servidor A se cae.07 0.168. es decir: 173.145:54002 -> 192.07 1/189 8883 ttl=3 auth=3 3fe72eec1f8c4df616b8067ce368f847 <<< Donde Heartbeat comunica al Servidor B su estado. puerto 694: ngrep -d eth0:1 -W byline port 694 Se verán una serie de paquetes de este tipo: U 192.191.255.128.196. automáticamente el servidor B tomará su lugar.168.06 0. 527 . Solo falta reiniciar los dos servidores y mirar si todo funciona: reboot Si se hace una captura de paquetes en el Servidor A.

.

conf Se averigua que todos los parámetros que siguen tengan el valor indicado: [general] enabled=yes webenabled=yes port=5038 . es buena practica hacer una copia de todos los archivo de configuración de Asterisk presentes en la carpeta /etc/asterisk: mkdir /tmp/asterisk cp /etc/asterisk/* /tmp/asterisk/ Para descargar la ultima versión disponible hay que instalar el programa SUBVERSION.0 Se entra en la carpeta: cd 2.conf (si ya se ha configurado como indicado en el párrafo 19. Al arrancar la GUI.org/svn/asterisk-gui/branches/2. yum install subversion cd /usr/src Se descargan los archivos de la GUI svn co http://svn. Simplifica el manejo de Asterisk siempre y cuando se tenga un conocimiento básico del funcionamiento de la PBX.0/ Se compila y instala: . ésta añade macros y extensiones al plan de llamadas pero no lee totalmente la configuración ya presentes en la carpeta /etc/asterisk.CAPITULO XXVI Asterisk GUI Asterisk GUI es una interfaz gráfica desarrollada para la gestión y la configuración de Asterisk desde un navegador Web. Primero el manager. para evitar de perder el trabajo que se ha hecho hasta el momento.asterisk./configure make make install Para terminar con la instalación hay que modificar dos archivos de configuración de Asterisk. se añade solamente al final del archivo el nuevo usuario): nano /etc/asterisk/manager.1.

0.old nano /etc/asterisk/http.0 .config.user.aoc Se guardan los cambios y se sigue con el archivo http.agent.aoc write=system.var3 debug=no authtimeout=60 authlimit=20 httptimeout=60 Se crea un usuario que sera él que se usará para entrar en la pagina de administración de la GUI de Asterisk [asterisk] secret=sesamo writetimeout=100 read=system.cc.tlsprivatekey=/tmp/private.0.reporting.user.tlscertfile=/tmp/asterisk.0 .agi.command.conf [general] enabled = yes enablestatic = yes bindaddr=0.dtmf.channelvars = var1.conf /etc/asterisk/http.cdr.pem .otiginate.bindaddr=0.0.pem allowmultiplelogin=yes displayconnects=yes timestampevents=yes .call.var2.tlsbindport=5039 .0 bindport=8088 Se guardan los cambios y se reinicia Asterisk /etc/init.agi.dialplan.tlsenable=no .agent.call.conf mv /etc/asterisk/http.d/asterisk restart Ahora hay que abrir el puerto 8088 TCP en el cortafuegos nano /etc/sysconfig/iptables Después de este bloque: # Apache 530 .reporting.0.tlsbindaddr=0.0.conf.0.

Username: Asterisk Password: sesamo Se presiona el botón “Login” Después de unos segundos aparecerá: 531 .html A pesar que aparezca la linea en negrita como dirección para acceder a la GUI.Everything looks good --* GUI should be available at http://li115-178.members.members.conf: OK * Checking for manager.-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT Se añaden las siguientes linea: # Asterisk GUI -A INPUT -p tcp -m state --state NEW -m tcp --dport 8088 -j ACCEPT Se guardan los cambios y se reinicia el cortafuegos: service iptables restart Ahora se averigua que todo esté bien configurado make checkconfig * Checking for http.linode.linode. la dirección exacta es: http://li115-178.html Desde un navegador Web se visita la pagina de administración de la GUI de Asterisk.com:8088/asterisk/static/config/index.conf: OK * Checking if HTTP is enabled: OK * Checking if HTTP static support is enabled: OK * Checking if manager is enabled: OK * Checking if manager over HTTP is enabled: OK --.com:8088/static/config/index.

conferencias) desde los archivos presentes en la carpeta /etc/asterisk. El Asterisk GUI leerá algunas configuraciones (colas de espera. Las extensiones configuradas en el sip.conf no aparecerán porque Asterisk GUI las lee y guarda en el archivo users.conf Aquí van algunas imágenes de la interfaz gráfica El orden para configurar la GUI es: • • • Crear las troncales en el menú Trunks Crear los contextos para las llamadas saliente en el menú Outgoing Calling Rules Crear el dialplan en el menú Dial Plans 532 .Se vuelve a la ventana terminal del servidor y se para y reinicia Asterisk: service asterisk stop service asterisk start Se vuelve a la pagina de administración de Asterisk y se presiona el Botón Aceptar. Se vuelve a poner Username y password presionando el botón “Login”.

se copian los dos archivos modificados y se recarga la configuración guardada: cd /etc/asterisk cp manager. es la más indicada.conf /tmp/asterisk cp http.• Crear las extensiones en el menú Users Una vez que que se ha probado la GUI de Asterisk y se quiere volver a la configuración anterior. Para pequeñas instalaciones con configuraciones básicas.conf /tmp/asterisk rm -fr * cp /tmp/asterisk/* /etc/asterisk /etc/init.d/asterisk restart La diferencia entre esta GUI y otras es que no utiliza muchos recursos del sistema para funcionar porque no necesita un servidor Web externo (Apache). 533 .

.

4 .4. si se ha instalado.13.conf . No se copia ningún fichero del directorio skel en él. en este capitulo se verá como instalar la GUI FreePBX. Como la GUI se basa en PHP. Como entiendo que a muchos puede interesar el tema.CAPITULO XXVII FreePBX Personalmente no soy partidario de la instalaciones de Asterisk con Interfaz gráfica./configure --prefix=/usr make make install Se cambia el usuario y grupo predefinido del servidor WEB de apache a asterisk: sed -i "s/User apache/User asterisk/" /etc/httpd/conf/httpd.sourceforge.bz2 cd mpg123-1.4. si no se ha ya instalado.4/mpg123-1. Cambiamos los permisos en todas las carpetas creadas por la instalación de Asterisk asignándolos al usuario asterisk que se acaba de crear: chown -R asterisk /var/run/asterisk chown -R asterisk /var/log/asterisk chown -R asterisk /var/lib/asterisk/moh chown -R asterisk /var/lib/php/session chown -R asterisk /var/spool/asterisk chown -R asterisk /etc/asterisk Como para la música en espera Asterisk + FreePBX utilizan archivos en formato wav.tar.13.bz2 tar -xf mpg123-1. Antes.tar.13.conf sed -i "s/Group apache/Group asterisk/" /etc/httpd/conf/httpd.13.1) que se encargará de convertir los archivos mp3 en wav: cd /usr/src wget http://downloads. se instala ahora junto al servidor Apache y el modulo mod_ssl. si se quiere utilizar archivos mp3 hay que instalar mpg123 (si ya no se ha hecho en el párrafo 10.net/project/mpg123/mpg123/1. se remueve el paquete rpmforge-release: yum remove rpmforge-release yum install php-* httpd mod_ssl Se añade el usuario Asterisk con home directory /var/lib/asterisk: useradd -c "Asterisk PBX" -d /var/lib/asterisk asterisk useradd: aviso: el directorio personal ya existe.

' or '\h' for help.9.0.gz Se descomprime el paquete y se entra en la carpeta creada: tar -xf freepbx-2.0 Se crean las tablas para las bases de datos asterisk y asteriskcdrdb: mysql -u root -psesamo asterisk < SQL/newinstall.* TO asteriskuser@localhost IDENTIFIED BY 'sesamo'. Query OK. Type '\c' to clear the buffer. Your MySQL connection id is 5 Server version: 5.tar.9.conf Se entra en el cliente MySQL y se crean dos bases de datos y los respectivos permisos (si no existen): mysql -u root -psesamo Welcome to the MySQL monitor. 0 rows affected (0. mysql> create database asterisk.sql 536 .freepbx.tar.00 sec) mysql> GRANT ALL PRIVILEGES ON asterisk. Query OK. or \g. Query OK. 1 row affected (0.77 Source distribution Type 'help. 0 rows affected (0.* TO asteriskuser@localhost IDENTIFIED BY 'sesamo'.Para prevenir problemas de acceso se modifica el parámetro AllowOverride de All a None: sed -i "s/AllowOverride All/AllowOverride None/" /etc/httpd/conf/httpd.00 sec) mysql> quit Bye Se descarga la ultima versión estable de FreePBX: cd /usr/src wget http://mirror. 1 row affected (0.0.9.00 sec) mysql> flush privileges. 0 rows affected (0. Query OK.0.gz cd freepbx-2.00 sec) mysql> GRANT ALL PRIVILEGES ON asteriskcdrdb. Query OK. Commands end with .02 sec) mysql> create database asteriskcdrdb.org/freepbx-2.

d/asterisk restart Se reinicia el servidor Apache y se configura para que arranque en automático: service httpd restart chkconfig httpd on Se lanza el script de instalación de FreePBX: .sql Se reinicia Asterisk: /etc/init.mysql -u root -psesamo asteriskcdrdb < SQL/cdr_mysql_table. tipo de autentificación para acceder a la 537 ./install_amp Se insertan los datos como aparecen en la imagen y al terminar se para FreePBX: /usr/sbin/amportal stop Se entra en el archivo de configuración de FreePBX y se modifican estas tres líneas (password para el administrador de la pagina de los buzones de voz personales.

xx.local /usr/sbin/amportal start Se guardan los cambios y se entra a la pagina web para administrar FreePBX utilizando la siguiente dirección: http://IPservidor Se escoge el enlace “FreePBX Adminsitration”: 538 .pagina de administración del FreePBX y la dirección IP publica del servidor Linux. respectivamente): nano /etc/amportal.xx.conf ARI_ADMIN_PASSWORD=ari_password AUTHTYPE=none AMPWEBADDRESS=xx.local se copia esta línea para que el arranque sea automático: nano /etc/rc.xx para que queden: ARI_ADMIN_PASSWORD=sesamo AUTHTYPE=database AMPWEBADDRESS=IPservidor (poner la IP publica del servidor Linux) Se guardan los cambios y se inicia nuevamente FreePBX: /usr/sbin/amportal start En el archivo rc.

Primero en el menú “Adminisitrators” se cambia la contraseña del usuario admin: Se pone la nueva contraseña y se presiona el botón “Submit Changes”. Se averigua si hay actualizaciones y se instalan: 539 . Luego desde el menú izquierdo se selecciona “Module Admin”.Se pone como usuario admin y como contraseña admin.

540 . errores de configuración: Una vez que se hayan corregido todos los avisos/errores: Ya se puede empezar con la configuración de Asterisk a través de la GUI FreePBX. Se selecciona el menú “FreePBX System Status” y se controla que no hayan avisos.De la misma forma se pueden instalar los módulos que se necesiten.

.

8 32bit en un maquina virtual creada con el sistema de virtualización VirtualBOX.iso Una vez terminada la descarga se crea la maquina virtual: Se abre VitualBox y se presiona el icono “Nueva”. En la ventana que aparecerá.virtualbox. Esta maquina se puede utilizar como laboratorio para trabajar con el libro.arcticnetwork.8/isos/i386/CentOS-5.8-i386-netinstall. se selecciona el botón “Siguiente” y se siguen los pasos mostrados en las imágenes: Nombre: CentOSLocal Sistema Operativo: Linux Versión: Red Hat .org/wiki/Downloads Luego se instala y se continua con la descarga de la ISO de CentOS: http://centos. Para iniciar se descarga Virtualbox desde esta pagina: https://www.ca/5.Apéndice A Instalar CentOS 5.8 en una maquina virtual con VirtualBox En esta guía se ilustrará como instalar el sistema operativo CentOS 5.

hay que poner por lo menos 512 Mb.En la memoria RAM para el sistema huésped. Si el sistema lo permite. mejor aun seleccionar 1GB (1024 Mb) 543 .

544 .

545 .

546 .

Debe quedar: 547 .Se selecciona el icono marcado con el circulo y en la ventana que aparece se escoge la iso de CentOS que se acaba de bajar.

Para terminar se presiona el botón “Aceptar”. 548 . ya se puede iniciar la maquina. En Nombre hay que poner la tarjeta de red instalada en el computador.Se pasa a la configuración de red: Se habilita un Adaptador y se escogen las opciones como aparecen en la pagina.

Se continua presionando la tecla Enter (Envío): 549 .

El tipo de teclado. 550 .Se escoge el idioma.

El tipo de instalación (vía HTTP): Se activa la tarjeta de red para las direcciones Ipv4 551 .

Nombre del sitio Web: mirror.centos.8/os/i386 Terminada la primera fase se iniciará la configuración del sistema: 552 .org Directorio CentOS: /centos/5.

Se borran todos los datos del disco virtual creado: Se crean las particiones predefinidas: 553 .

Se confirma: Se modifica la configuración de la tarjeta de red. 554 .

puerta de enlace (normalmente la IP del router) y DNS primario (la IP del router). 555 . Se crea un nombre de dominio.Configurando una IP fija.

Se escoge la zona horaria: Se crea una contraseña para el usuario root: 556 .

Se escoge el tipo de instalación (Sever) y se personalizan los paquetes que se instalarán: Se entra en el menú Servidores y se dejan seleccionados solo los paquetes que aparecen en la imagen: 557 .

Se inicia la instalación del sistema operativo: 558 .

para que quede: 559 .Cuando termine se presiona el botón reiniciar. volverá a presentar la pagina de instalación del sistema operativo. El sistema se reiniciará y como el Cd todavía está presente. Se cierra la ventana y en la configuración de la maquina virtual se entra en el menú Almacenamiento: Se selecciona el icono evidenciado y en el menú que aparece se escoge la opción “Eliminar disco de la unidad virtual”.

Al primer arranque aparecerá el siguiente menú: Se entra en la configuración del cortafuegos: 560 .Ahora se puede iniciar nuevamente la maquina virtual.

Se deshabilita el cortafuegos y Selinux. Un ejemplo: 561 . se activa una DMZ en el router para la IP del servidor Linux. Para terminar. Se sale de la herramienta de configuración.

562 .Se vuelve a la maquina virtual y se actualiza el sistema: yum -y update Se reinicia el servidor reboot Ya se puede retomar el libro desde la pagina 9 con la creación de la clave RSA.

.

0.0:5060 tcpauthtimeout=30 tcpauthlimit=100 srvlookup=yes maxexpiry=3600 minexpiry=60 defaultexpiry=120 mwiexpiry=3600 maxforwards=70 qualifyfreq=60 preferred_codec_only=no disallow=all allow=ulaw allow=alaw mohinterpret=default mohsuggest=default parkinglot=default language=es sendrpid=ye rpid_update=yes prematuremedia=no useragent=VozToVoice v.0 sdpsession=asterisk sdpowner=asterisk dtmfmode=rfc2833 videosupport=yes maxcallbitrate=384 callevents=yes authfailureevents=yes alwaysauthreject=yes use_q850_reason=yes rtptimeout=60 rtpholdtimeout=300 rtpkeepalive=0 allowsubscribe=yes . 1.0.0:5060 tcpenable=yes tcpbindaddr=0.Apéndice B Archivos de configuración sip.conf [general] allowguest=no context=default allowtransfer=yes .0.realm=mydomain.tld udpbindaddr=0.0.

register => fulano:sesamo@sip.externrefresh=180 nat=force_rport directmedia=no .0 externaddr= .register => fulano:contraseña@sip.crt tlscapath=/etc/asterisk/keys tlsdontverifyserver=yes register => serverA:pass1@IPserverB/serverB .provider1.maxdatagram=400 faxdetect=yes localnet= localnet=10.126.com/1234 [1000] accountcode=1000 language=es type=friend secret=pbx9090 qualify=yes mailbox=1000@default host=dynamic dtmfmode=rfc2833 context=externas directmedia=no callerid=callerid=Fulano <1000> callgroup=1 pickupgroup=1 disallow=all 565 .org .provider1.0.255.dyndns.com/1234 registertimeout=20 registerattempts=10 .com:5061 .subscribecontext=subscribe notifyringing=yes notifyhold=yes callcounter=yes t38pt_udptl=yes.media_address=0.8.0.255.0 localnet=10.externhost=prueba.0/255.125.provider1.mwi => 1234:password@mysipprovider.com .0/255.register => fulano:sesamo@sip.10.0.255.255.pem tlscafile=/etc/asterisk/keys/ca.fec.0 rtcachefriends=no rtupdate=yes tlsenable=yes tlsbindaddr=96.112 tlscertfile=/etc/asterisk/keys/serverA.0.

allow=alaw allow=g722 allow=g729 allow=h263 cc_agent_policy=generic cc_monitor_policy=generic [1001] type=friend accountcode=1001 language=es secret=pbx9091 qualify=yes mailbox=1001@default host=dynamic dtmfmode=rfc2833 context=externas directmedia=no callerid=zutano <1001> callgroup=1 pickupgroup=1 disallow=all allow=alaw allow=g722 allow=g729 allow=h263 cc_agent_policy=generic cc_monitor_policy=generic [int-locales](!) type=friend language=es qualify=yes host=dynamic dtmfmode=rfc2833 context=locales directmedia=no callgroup=1 pickupgroup=1 disallow=all allow=alaw allow=g722 allow=g729 allow=h263 [1002](int-locales) accountcode=1002 566 .

secret=pbx9092 mailbox=1002@default callerid=Mengano <1002> cc_agent_policy=generic cc_monitor_policy=generic [justvoip] type=peer host=sip.justvoip.justvoip.com fromuser= defaultuser= secret= qualify=yes dtmfmode=rfc2833 context=from-justvoip directmedia=no language=es nat=no disallow=all allow=alaw allow=g729 [spa3102] type=friend secret=password qualify=yes nat=yes host=dynamic directmedia=no context=from-spa3102 dtmfmode=rfc2833 language=es callerid=LineaTel <NumTel> allowtransfer=yes allowsubscribe=yes subscribecontext=subscribe callcounter=yes disallow=all allow=alaw allow=g729 [serverB] type=friend remotesecret=pass2 context=internas qualify=yes 567 .com fromdomain=sip.

49.6 disallow=all allow=g729 allow=alaw language=es qualify=yes dtmfmode = rfc2833 [serverbtls] type=peer context=from-tls host=66.216 disallow=all allow=alaw language=es qualify=yes transport=tls encryption=yes [1005] type=friend accountcode=1005 language=es secret=pbx9095 qualify=yes mailbox=1005@default host=dynamic dtmfmode=rfc2833 context=externas directmedia=no callerid=Perengano <1001> callgroup=1 pickupgroup=1 disallow=all allow=ulaw allow=alaw allow=g729 568 .0.host=dynamic language=es disallow=all allow=gsm allow=ulaw allow=alaw [serverbvpn] type=peer context=vpn host=10.8.228.

0.net [marko] type=friend host=dynamic secret=pbx9094 context=externas mailbox=1234@default 569 .0/0.0.allow=h263 cc_agent_policy=generic cc_monitor_policy=generic transport=tls encryption=yes iax.0.conf [general] bindport=4569 bindaddr=0.linux-support.0.0.register => marko:[key]@tormenta.0 nochecksums=no delayreject=yes amaflags=documentation srvlookup=yes language=es mohinterpret=default mohsuggest=defautl bandwidth=high disallow=all allow=alaw allow=alaw minregexpire=60 maxregexpire=60 encryption=yes forceencryption=no trunkmaxsize=128000 trunkmtu=1240 autokill=yes codecpriority=host rtcachefriends=no rtupdate=yes parkinglot=default calltokenoptional=0.linux-support.0 requirecalltoken=auto .register => joe@remotehost:5656 .net .register => marko:secretpass@tormenta.0.

Agi(googletts.agi.es) 570 .2) same => n.Gotoif($[${ISNULL(${CALENDAR_EVENT(location)})} = 0 & "$ {CALENDAR_EVENT(summary)}" = "Conferencia"]?conf) same => n..s.1.conf [general] static=yes writeprotect=yse autofallthrough=yse extenpatternmatchnew=yse clearglobalvars=no [globals] 1000=SIP/1000 JUST=SIP/justvoip marko=IAX2/marko DYNAMIC_FEATURES=test1#blindxfer#automon#disconnect#atxfer#parkcall#automixmon [from-didvoztovoice] exten => s.Hangup [calendario] exten => cal.1.%H:%M)}.216 trunk=yes context=internas qualify=yes [server1] type=user dbsecret=dundi/secret context=servera-local qualify=yes disallow=all allow=ulaw allow=alaw extensions."${CALENDAR_EVENT(summary)} a las ${STRFTIME($ {CALENDAR_EVENT(start)}.Answer same => n.".qualify=yes callerid=marko requirecalltoken=auto [serverb] type=friend host=66.228.NoOp(Llamada desde el calendario) same => n.Goto(IVR.49.

Receivefax(/tmp/${UNIQUEID}.Confbridge(${CALENDAR_EVENT(location)}.1.Hangup [test] switch => Realtime [fax] exten => _X.Dial(SIP/1000. SRTP = ${CHANNEL(secure_media)}) same => n.n.Hangup exten => 1234.1.Wait(6) same => n.Noop(FAXSTATUS ${FAXSTATUS}.1.1.1.45) exten => fax.n.Answer same => n. FAXERROR ${FAXERROR}) same => n.Playback(hello-world) exten => 20.tif.hangup [servera-local] exten => 20.Hangup [from-tls] exten => 71.Playback(demo-congrats) same => n.1.df) same => n.Playback(tt-monkeys) same => n.Hangup() [dundi-remoto] switch => DUNDi/serverb [vpn] exten => 70.agi.CallCompletionRequest 571 .Hangup [internas] exten => *30.Playback(goodbye) same => n.Noop(TLS = ${CHANNEL(secure_signaling)}.Agi(googletts.Answer() exten => 20.Dial(IAX2/iaxmodem2) same => n.Hangup exten => h.Hangup same => n(conf).Answer same => n.same => n.Hangup exten => 1235.cM(default)) same => n.Wait(1) same => n.es) same => n.Answer same => n.1.1."${CALENDAR_EVENT(description)}"..1.Answer same => n.Dial(SIP/justvoip/${EXTEN}) same => n.

PauseQueueMember(ventas.CallCompletionCancel same => n.SIP/${CALLERID(num)}) same => n.Playback(agent-loggedoff) same => n.es) same => n.Set(id=${CALENDAR_QUERY(campusvoztovoice.Agi(googletts.$ {num})}.Agi(googletts.agi.agi.1.Dial(SIP/serverB/${EXTEN:1}.same => n.${num})}".%H:%M)}".agi.Hangup exten => *31."${CALENDAR_QUERY_RESULT(${id}.${EPOCH}.Hangup() exten => _*1100X.Hangup exten => 51."Rellamada anulada".start.Hangup exten => _*1XXX.es) same => n.es) same => n.Hangup exten => *73.SIP/${CALLERID(num)}) same => n.${fin})}) same => n.30) same => n.Agi(googletts.Addqueuemember(ventas.SIP/${CALLERID(num)}) same => n.1.Agi(googletts.Set(num=1) same => n. Set(CALLERID(num)=serverA) same => n.Set(numeve=$[${numeve}-1]) same => n.Hangup exten => *70.Hangup exten => 50.Endwhile same => n.Dial(IAX2/serverb/${EXTEN:2}) same => n.SIP/${CALLERID(num)}) same => n.agi.1..summary.1.1.Noop(Idioma Servidor ${PBX}) same => n.Set(num=$[${num}+1]) same => n.Set(PBX=${ENV(LANG)}) same => n.Playback(beep) same => n.1."Rellamada activada".Playback(agent-loginok) same => n.Removequeuemember(ventas.1.Hangup 572 .Set(numeve=${CALENDAR_QUERY_RESULT(${id}."a las ${STRFTIME(${CALENDAR_QUERY_RESULT(${id}.Playback(beep) same => n.UnpauseQueueMember(ventas.es) same => n.Noop(Consulta en el calendario) same => n.1.While($[${numeve} > 0]) same => n.Hangup exten => *72.Set(fin=$[${EPOCH}+10800]) same => n.getnum)}) same => n.1.Hangup exten => *71.

1.Answer same => n.Wait(1) same => n.com.Jabbersend(campus.Dial(SIP/serverbtls/${EXTEN}) same => n.Set(CALLERID(num)=openvpna) same => n.hangup exten => 75.VoicemailMain same => n.Hangup exten => 98.Echo same => n.1.Playback(demo-echotest) same => n.1) exten => 77.Answer same => n.1.1.Dumpchan same => n.Playback(hello-world) same => n.1.Set(CHANNEL(language)=es) same => n.Hangup exten => 200.Hangup exten => 99.voztovoice.hangup exten => 71.e) same => n.1.exten => 70.Noop same => n.Goto(IVR.1.s.1.agi(wakeup.Hangup exten => 100.1.1.internas.Answer same => n.Hangup exten => 123.VoiceMailMain(${CALLERID(num)}@default) same => n.1.php) same=> n.Hangup 573 .voztovoicenet@gmail.Answer same => n.Hangup exten => 150.MusicOnHold(mp3.Estamos escuchando MP3) same => n.Directory(default.Dial(SIP/1000&SIP/1001&SIP/1002.Dial(SIP/serverbvpn/${EXTEN}) same => n.Hangup exten => 97.Set(CALLERID(num)=serveratls) same => n.Answer same => n.30) same => n.60) same => n.Playback(demo-echodone) same => n.

Noop same => n.s.Answer() same => n.1.) same => n.Noop same => n.Hangup exten => 1234.Dial(IAX2/marko.php) same => n.Set(EMPNAME=${ODBC_Empleados(${EMPNUM})}) same => n.php) same => n.Dial(SIP/${EXTEN}.1. Hasta luego.Hangup same => n(nombre).Answer same => n.1.Hangup exten => 251.Goto(encuesta.Hangup exten => 670.Agi(callerid.AGI(agi://127.1:4573) same => n.Hangup() exten => 660.0.Read(EMPNUM.beep.Hangup exten => 650.Festival(Por favor ingrese los 4 digitos de la matricula del empleado.Macro(voicemail) same => n.Agentlogin(${EXTEN}) 574 .45.hHkKtTwWxX) same => n.Festival(Asterisk y Festival trabajan junto.Hangup exten => 1235.4) same => n.1) same => n.1.1.Hangup exten => 252.Dial(IAX2/marko2.Agi(pruebaudio.AGI(agi:async) same => n. Chevere!!!) same => n.Noop(Protocolo SRTP = ${CHANNEL(secure_media)}) same => n.1.Macro(voicemail) same => n.1.Noop(Protocolo SIPTLS = ${CHANNEL(secure_signaling)}) same => n.Wait(2) same => n.Macro(voicemail) same => n.1.exten => 250.0.Hangup exten => _100[0-2.30) same => n.1.1.30) same => n.) same => n.4-5].) same => n.Hangup exten => 253.Festival(Ningun empleado encontrado.1.GotoIf($[${EXISTS(${EMPNAME})}]?nombre) same => n.Hangup exten => _200[012].Festival(El nombre del empleado es ${EMPNAME}. Hasta luego.

same => n.Gotoif($[${DIALSTATUS} = ANSWER)]?contestada) same => n.Hangup exten => 3000.45) same => n.Dial(SIP/spa3102.1.Page(SIP/1001&SIP/1002) same => n.45.1.Page(SIP/1001&SIP/1002.Voicemail(1000@default) same => n.Set(CALLERID(name)=Calendario) same => n.Answer same => n.Hangup exten => _350[012].scM(default)) same => n.15) same => n.DM(default)) same => n.1.Wait(2) same => n.1.Dial(DAHDI/R1/${EXTEN:1}.Hangup exten => 502.Busy(3) same => n.R) same => n.Answer() same => n.d) same => n.Wait(2) same => n.Hangup exten => _66XX..Hangup() exten => 6500.Record(/tmp/prompt${EXTEN:2}:wav) same => n.Playback(/tmp/prompt${EXTEN:2}) same => n.D(${EXTEN:1})) same => n.hangup same => n(contestada).Meetme(${EXTEN}.Answer same => n.1.1.Hangup exten => 3510.Wait(2) same => n.Set(CALLERID(num)=CampusVozToVoice) same => n.Queue(ventas) same => n.Dial(SIP/1000.Hangup [conferencias] exten => 501.1.Hangup exten => 3001.Queue(ventas.Hangup exten => _9[12456789]XXXXXXX!.1.1.1.Meetme(.Hangup exten => _8.Dial(SIP/justvoip/0057XXXXXXXXXX) same => n.Hangup 575 .

Read(var1.10) same => n.%y%m%d%H%M%S)}.1.SIP/1000 exten => 1001.SIP/1002 exten => 1004.1.hint..Festival(Pregunta cuatro) same => n.Playback(thank-you-cooperation) same => n.Read(var2.${var1}.hint.1.Hangup [encuesta] exten => s.hint.Festival(Pregunta tres) same => n.Hangup exten => 3530.Hangup [auten] exten => _00.hint...Read(var4.hint.park:704@parkedcalls exten => 705.10) same => n.Wait(2) same => n..1.Macro(meetme) same => n.1.Read(var3.Mcs) same => n.Dial(SIP/justvoip/${EXTEN}) same => n.Hangup exten => _500[01].SIP/1001 exten => 1002.IAX2/marko2 exten => 701.am.1.txt.hint.Set(confmax=10) same => n..IAX2/marko exten => marko2.Authenticate(/tmp/pin.Festival(Pregunta dos) same => n.${var4}) same => n.1.hint.Set(ODBC_Encuesta()=${STRFTIME(${EPOCH}.Hangup [subscribe] exten => 1000.ConfBridge(3530.park:703@parkedcalls exten => 704.Answer same => n.1.park:706@parkedcalls exten => 707.park:702@parkedcalls exten => 703.10) same => n.${var3}..NoOP same => n.Meetme(${EXTEN}) same => n.hint..Answer same => n..$ {var2}.hint..hint.park:707@parkedcalls 576 .SIP/1004 exten => marko.park:701@parkedcalls exten => 702.park:705@parkedcalls exten => 706.hint.4) same => n.Festival(Pregunta uno) same => n..10) same => n.1.hint.exten => 3520.hint.

Set(trunksal=${GROUP_COUNT(justvoip@voip)}) same => n..Dial(SIP/1000.google.Dial(gtalk/campus.1.Dial(SIP/justvoip/${EXTEN}) same => n.Hangup 577 .Set(extsal=${GROUP_COUNT(${CALLERID(num)}@salida)}) same => n.NoOp(Hay ${extsal} llamadas desde la extension ${CALLERID(num)} y ${trunksal} con el proveedor Justvoip) same => n.Hangup() [from-spa3102] exten => s.Dial(gtalk/campus.Hangup exten => _1XXXXXXXXXX.com) same => n..Set(CDR(userfield)=${CHANNEL(peerip)}) same => n.20)}) same => n.Wait(2) same => n.location.google.park:708@parkedcalls exten => 709.n.Set(nombre=${JABBER_RECEIVE(campus.${CALLERID(name)}.Hangup same => n(busy).1.park:709@parkedcalls [google-in] exten => s.Set(CALLERID(name)=${nombre}) same => n.30) same => n.Hangup exten => _NNXX.${EPOCH}) same => n.1. bienvenido en VozToVoice) same => n.IP = ${CHANNEL(peerip)}.exten => 708.Como te llamas?) same => n.Set(GROUP(salida)=${CALLERID(num)}) same => n.Set(CALENDAR_WRITE(llamadas.Hangup [internacio] exten => _00X.Dial(SIP/1000) same => n.1.45) exten => s.NoOp( Call from Gtalk ) same => n.NoOp same => n.hint.hint.Set(GROUP(voip)=justvoip) same => n.voztovoice.NoOp same => n.voztovoice/+${EXTEN}@voice.SendText(Espera un momento mientras te comunicamos con un operador) same => n.1.summary.SendText(Hola.Dial(SIP/1000.start)=Llamada de $ {CALLERID(num)} a ${EXTEN}.Llamada desde la extension ${CALLERID(num)} al numero $ {EXTEN}.Gotoif($[${extsal} > 2 | ${trunksal} > 2]?busy) same => n.voztovoice/+${EXTEN}@voice.Hangup [from-pstn] exten => s.1.Playback(all-outgoing-lines-unavailable) same => n.SendText(Hola ${nombre}.com) same => n.description.

Busy exten => s.1.Voicemail(${MACRO_EXTEN}@default.n.1. llame mas tarde.Set(estado=${CALENDAR_BUSY(campusvoztovoice)}) same => n..Hangup exten => s-CANCEL.[externas] include => internas include => internacio include => parkedcalls include => test include => conferencias include => dundi-remoto [locales] include => internas include => auten include => parkedcalls include => test include => conferencias include => dundi-remoto [macro-disponible] exten => s.Agi(googletts.agi.Goto(s-${DIALSTATUS}.Congestion same => n.MacroExit [macro-calendario] exten => s.n.n.Noop(Estado = ${estado}) same => n.1.Hangup exten => s.1.Gotoif($["${estado}" = "NOT_INUSE"]?5) exten => s."la extensión se encuentra ocupada.Hangup [macro-voicemail] exten => s.Hangup exten => s-CONGESTION.Voicemail(${MACRO_EXTEN}@default.MacroExit same => n(calendario).Set(estado=${DEVICE_STATE(SIP/${MACRO_EXTEN})}) exten => s.MacroExit same => n(ocupado).n.Hangup exten => _s-.1.1) exten => s-BUSY.Gotoif($[${estado} = 1]?ocupado) same => n.1.1.Hangup [macro-meetme] exten => s.count) 578 .u) same => n.MeetMeCount(${MACRO_EXTEN}.1.es) same => n.b) same => n. Gracias".Noop(${MACRO_EXTEN}) same => n.GotoIf($[${MACRO_EXTEN} = 1000]?calendario) same => n.

WaitExten() exten => 1.1.2.2.6.BackGround(custom/prompt03) exten => s.Playback(invalid) exten => i.goto(IVR.Goto(IVR1.Hangup [IVR1] exten => s.Set(TIMEOUT(digit)=7) exten => s.Hangup [IVR2] exten => s.2.Set(TIMEOUT(response)=10) exten => s.1) exten => i.Hangup #include IVR IVR [IVR] exten => s.5.Set(CHANNEL(language)=en) exten => s.2.Hangup exten => t.2) exten => h.s.Playback(invalid) exten => i.1.Goto(IVR.Set(TIMEOUT(digit)=7) exten => s.2) exten => i.MusicOnHold exten => 3.1.3.goto(IVR2.5.Playback(conf-invalid) same => n.100.MeetMe(${MACRO_EXTEN}.1) exten => 2.s.3.1) exten => i.Playback(demo-echotest) exten => 1.1.Set(CHANNEL(language)=es) 579 .2.D) same => n.1) exten => i.1.s.4.Hangup same => n(llena).Playback(pls-wait-connect-call) exten => 3.s.2.Goto(internas.Set(TIMEOUT(digit)=7) exten => s.1.1.3.3.goto(IVR1.1.1.1.Echo() exten => 2.Set(TIMEOUT(response)=10) exten => s.1.1.1.Gotoif($[${count} > ${confmax}]?llena) same => n.hangup exten => t.1.2.3.1) exten => h.BackGround(custom/prompt01) exten => s.goto(IVR1.s.same => n.4.s.Set(TIMEOUT(response)=10) exten => s.Wait(1) exten => s.WaitExten() exten => 1.Set(CHANNEL(language)=es) exten => s.

Playback(pls-wait-connect-call) exten => 3.2.exten => s.1.1.1.5.MusicOnHold exten => 3.1.goto(IVR2.Playback(invalid) exten => i.1.1) exten => i.3.Goto(internas.Hangup 580 .4.WaitExten() exten => 1.Goto(IVR2.2.s.1) exten => h.1) exten => i.Playback(demo-echotest) exten => 1.Echo() exten => 2.2.BackGround(custom/prompt02) exten => s.hangup exten => t.s.100.1.

.

refers to any such manual or work. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work. 0.Apéndice C Licencia GNU FDL GNU Free Documentation License Version 1. but changing it is not allowed. in any medium. Inc. 3 November 2008 Copyright (C) 2000. unlimited in duration. 2007. while not being considered responsible for modifications made by others. and is addressed as "you". regardless of subject matter or whether it is published as a printed book. This License is a kind of "copyleft". 1. it can be used for any textual work.org/> Everyone is permitted to copy and distribute verbatim copies of this license document.3. with or without modifying it. which is a copyleft license designed for free software. Such a notice grants a world-wide. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall . this License preserves for the author and publisher a way to get credit for their work. royalty-free license. It complements the GNU General Public License. 2001. Any member of the public is a licensee. A "Modified Version" of the Document means any work containing the Document or a portion of it. PREAMBLE The purpose of this License is to make a manual. or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it. 2008 Free Software Foundation. Secondarily. <http://fsf. that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. either commercially or noncommercially. modify or distribute the work in a way requiring permission under copyright law. or with modifications and/or translated into another language. You accept the license if you copy. 2002. which means that derivative works of the document must themselves be free in the same sense. The "Document". below. because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. We have designed this License in order to use it for manuals for free software. either copied verbatim. to use that work under the conditions stated herein. textbook. But this License is not limited to software manuals. We recommend this License principally for works whose purpose is instruction or reference.

XCF and JPG. SGML or XML for which the DTD and/or processing tools are not generally available. Examples of transparent image formats include PNG. and standard-conforming simple HTML. Texinfo input format. plus such following pages as are needed to hold. legibly. or absence of markup. and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. Examples of suitable formats for Transparent copies include plain ASCII without markup. A copy that is not "Transparent" is called "Opaque". if the Document is in part a textbook of mathematics. PostScript or PDF designed for human modification. in the notice that says that the Document is released under this License. ethical or political position regarding them. as Front-Cover Texts or Back-Cover Texts. preceding the beginning of the body of the text. (Thus. "Title Page" means the text near the most prominent appearance of the work's title.subject (or to related matters) and contains nothing that could fall directly within that overall subject. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The "publisher" means any person or entity that distributes copies of the Document to the public. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following 583 . The Document may contain zero Invariant Sections. The "Title Page" means. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors. for a printed book. A "Transparent" copy of the Document means a machine-readable copy. as being those of Invariant Sections. a Secondary Section may not explain any mathematics. and a Back-Cover Text may be at most 25 words.) The relationship could be a matter of historical connection with the subject or with related matters. and the machine-generated HTML. represented in a format whose specification is available to the general public. the material this License requires to appear in the title page. LaTeX input format. A Front-Cover Text may be at most 5 words. For works in formats which do not have any title page as such. A copy made in an otherwise Transparent file format whose markup. SGML or XML using a publicly available DTD. that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor. has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. The "Cover Texts" are certain short passages of text that are listed. commercial. the title page itself. If the Document does not identify any Invariant Sections then there are none. PostScript or PDF produced by some word processors for output purposes only. The "Invariant Sections" are certain Secondary Sections whose titles are designated. philosophical. in the notice that says that the Document is released under this License. or of legal.

the copyright notices. free of added material. and Back-Cover Texts on the back cover. You may also lend copies. If you publish or distribute Opaque copies of the Document numbering more than 100. The front cover must present the full title with all words of the title equally prominent and visible. to ensure 584 . or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document. can be treated as verbatim copying in other respects. numbering more than 100. and the license notice saying this License applies to the Document are reproduced in all copies. and you may publicly display copies. Copying with changes limited to the covers. you may accept compensation in exchange for copies. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document. you must either include a machine-readable Transparent copy along with each Opaque copy. either commercially or noncommercially. under the same conditions stated above. you must take reasonably prudent steps. "Dedications".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. (Here XYZ stands for a specific section name mentioned below. VERBATIM COPYING You may copy and distribute the Document in any medium. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. as long as they preserve the title of the Document and satisfy these conditions. If the required texts for either cover are too voluminous to fit legibly. If you use the latter option. when you begin distribution of Opaque copies in quantity. you should put the first ones listed (as many as fit reasonably) on the actual cover. such as "Acknowledgements". and the Document's license notice requires Cover Texts. provided that this License. but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2.text that translates XYZ in another language. you must enclose the copies in covers that carry. However. You may add other material on the covers in addition. These Warranty Disclaimers are considered to be included by reference in this License. 3. or "History". You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. and continue the rest onto adjacent pages. and that you add no other conditions whatsoever to those of this License. clearly and legibly. "Endorsements". all these Cover Texts: Front-Cover Texts on the front cover. If you distribute a large enough number of copies you must also follow the conditions in section 3. Both covers must also clearly and legibly identify you as the publisher of these copies.

Preserve the network location. For any section Entitled "Acknowledgements" or "Dedications". 4. if there were any. a license notice giving the public permission to use the Modified Version under the terms of this License. and preserve in the section all 585 . immediately after the copyright notices. G. if it has fewer than five). in the form shown in the Addendum below. and add to it an item stating at least the title. State on the Title page the name of the publisher of the Modified Version. K.that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. if any) a title distinct from that of the Document. and from those of previous versions (which should. Preserve its Title. you must do these things in the Modified Version: A. E. List on the Title Page. F. Preserve the section Entitled "History". as the publisher. year. I. with the Modified Version filling the role of the Document. Use in the Title Page (and on the covers. If there is no section Entitled "History" in the Document. C. You may use the same title as a previous version if the original publisher of that version gives permission. In addition. be listed in the History section of the Document). J. but not required. unless they release you from this requirement. given in the Document for public access to a Transparent copy of the Document. that you contact the authors of the Document well before redistributing any large number of copies. to give them a chance to provide you with an updated version of the Document. year. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. Preserve the Title of the section. B. create one stating the title. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above. It is requested. and publisher of the Document as given on its Title Page. new authors. as authors. and publisher of the Modified Version as given on the Title Page. Preserve all the copyright notices of the Document. thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. You may omit a network location for a work that was published at least four years before the Document itself. Include. provided that you release the Modified Version under precisely this License. authors. one or more persons or entities responsible for authorship of the modifications in the Modified Version. then add an item describing the Modified Version as stated in the previous sentence. These may be placed in the "History" section. or if the original publisher of the version it refers to gives permission. if any. D. Include an unaltered copy of this License. together with at least five of the principal authors of the Document (all of its principal authors. and likewise the network locations given in the Document for previous versions it was based on. H. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.

Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. add their titles to the list of Invariant Sections in the Modified Version's license notice. and that you preserve all their Warranty Disclaimers. provided that you include in the combination all of the Invariant Sections of all of the original documents. Preserve all the Invariant Sections of the Document. You may add a section Entitled "Endorsements". unaltered in their text and in their titles. to the end of the list of Cover Texts in the Modified Version. O. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. previously added by you or by arrangement made by the same entity you are acting on behalf of. but you may replace the old one. If there are multiple Invariant Sections with the same name but different contents. You may add a passage of up to five words as a Front-Cover Text. provided it contains nothing but endorsements of your Modified Version by various parties--for example. Section numbers or the equivalent are not considered part of the section titles. To do this. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. The combined work need only contain one copy of this License. These titles must be distinct from any other section titles. N. Such a section may not be included in the Modified Version. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document. Delete any section Entitled "Endorsements". Preserve any Warranty Disclaimers. and multiple identical Invariant Sections may be replaced with a single copy. in parentheses. 5. M.L. If the Document already includes a cover text for the same cover. the substance and tone of each of the contributor acknowledgements and/or dedications given therein. the name of the original author or publisher of that section if known. unmodified. make the title of each such section unique by adding at the end of it. statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. and a passage of up to 25 words as a Back-Cover Text. 586 . you may at your option designate some or all of these sections as invariant. under the terms defined in section 4 above for modified versions. on explicit permission from the previous publisher that added the old one. and list them all as Invariant Sections of your combined work in its license notice. COMBINING DOCUMENTS You may combine the Document with other documents released under this License. you may not add another. or else a unique number.

COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License. or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. You must delete all sections Entitled "Endorsements". the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate. and replace the individual copies of this License in the various documents with a single copy that is included in the collection. and distribute it individually under this License. If the Cover Text requirement of section 3 is applicable to these copies of the Document. then if the Document is less than one half of the entire aggregate. and follow this License in all other respects regarding verbatim copying of that document. but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. you must combine any sections Entitled "History" in the various original documents. 8. so you may distribute translations of the Document under the terms of section 4. is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. provided you insert a copy of this License into the extracted document. in or on a volume of a storage or distribution medium. 6. TRANSLATION Translation is considered a kind of modification. and all the license notices in the Document. 587 .In the combination. You may extract a single document from such a collection. likewise combine any sections Entitled "Acknowledgements". forming one section Entitled "History". and any sections Entitled "Dedications". the original version will prevail. provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. and any Warranty Disclaimers. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works. Replacing Invariant Sections with translations requires special permission from their copyright holders. provided that you also include the original English version of this License and the original versions of those notices and disclaimers. When the Document is included in an aggregate. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer. You may include a translation of this License. 7.

RELICENSING 588 . TERMINATION You may not copy. "Dedications".org/copyleft/. you may choose any version ever published (not as a draft) by the Free Software Foundation. Any attempt otherwise to copy. if you cease all violation of this License. However. receipt of a copy of some or all of the same material does not give you any rights to use it. and (b) permanently.gnu. that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document. sublicense. Moreover. your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means. but may differ in detail to address new problems or concerns. If the Document specifies that a proxy can decide which future versions of this License can be used. and will automatically terminate your rights under this License. revised versions of the GNU Free Documentation License from time to time. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. or "History". Such new versions will be similar in spirit to the present version. 10. unless and until the copyright holder explicitly and finally terminates your license. Each version of the License is given a distinguishing version number. the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. See http://www. modify. and you cure the violation prior to 30 days after your receipt of the notice. if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. then your license from a particular copyright holder is reinstated (a) provisionally. If the Document does not specify a version number of this License. or distribute it is void. sublicense. 9. 11. you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document specifies that a particular numbered version of this License "or any later version" applies to it. If your rights have been terminated and not permanently reinstated. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new.If a section in the Document is Entitled "Acknowledgements". modify. or distribute the Document except as expressly provided under this License. this is the first time you have received notice of violation of this License (for any work) from that copyright holder.

(1) had no cover texts or invariant sections. or some other combination of the three. a not-for-profit corporation with a principal place of business in San Francisco. merge those two alternatives to suit the situation. 2009. California. If you have Invariant Sections without Cover Texts. include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (c) YEAR YOUR NAME. A copy of the license is included in the section entitled "GNU Free Documentation License". distribute and/or modify this document under the terms of the GNU Free Documentation License. as well as future copyleft versions of that license published by that same organization. and if all works that were first published under this License somewhere other than this MMC. Permission is granted to copy. If you have Invariant Sections. If your document contains nontrivial examples of program code. "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation. 589 . to permit their use in free software. replace the "with. in whole or in part.Texts. provided the MMC is eligible for relicensing. such as the GNU General Public License. as part of another Document. we recommend releasing these examples in parallel under your choice of free software license. with the Front-Cover Texts being LIST. "Incorporate" means to publish or republish a Document. 2008. and (2) were thus incorporated prior to November 1. and with the Back-Cover Texts being LIST."Massive Multiauthor Collaboration Site" (or "MMC Site") means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works.3 or any later version published by the Free Software Foundation. no Front-Cover Texts. Version 1.. and subsequently incorporated in whole or in part into the MMC. ADDENDUM: How to use this License for your documents To use this License in a document you have written. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1. A "Massive Multiauthor Collaboration" (or "MMC") contained in the site means any set of copyrightable works thus published on the MMC site. with no Invariant Sections. A public wiki that anybody can edit is an example of such a server." line with this: with the Invariant Sections being LIST THEIR TITLES. Front-Cover Texts and Back-Cover Texts. An MMC is "eligible for relicensing" if it is licensed under this License. and no Back-Cover Texts..

Sign up to vote on this title
UsefulNot useful