A2Billing v. 3.9 A2Billing 2.2.0 CentOS 6.8 64bit Asterisk 11.23.1 Octubre 2016
By
VozToVoice
www.voztovoice.org
Convenciones tipográficas. Negrita = comandos escritos 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 se está trabajando en la consola de Asterisk mysql> indica que se está trabajando en la consola del cliente MySQL redis 127.0.0.1:6379> indica que se está trabajando en la consola del cliente Redis
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 A de este libro.
Copyright (C)
2014-2020
Andrea Sannucci
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.
INDICE Capitulo I – VPS Linode …........................................................................................................... 1 1.1 Preparación del VPS 1.1.1 Servidor Linux CentOS 6.6 Local 1.2 SSH y Clave RSA 1.2.1 Clave RSA en Windows 1.2.2 Clave RSA en Linux 1.2.3 Configuración servidor SSH 1.3 Configuración del VPS
1 7 10 10 14 15 17
Capitulo II - Instalación de Asterisk …...................................................................................... 23 2.1 Utilidades, librerías, dependencias 2.2 DAHDI 2.3 LibPRI 2.4 App_fax, GoogleTalk, LibiCAL y SRTP 2.5 Instalación de Asterisk
23 26 27 28 30
Capitulo III – Instalación de A2Billing ….................................................................................. 38 3.1 Preparación del sistema 3.2 Instalación del demonio Callback 3.3 Configuración de Asterisk 3.3.1 sip.conf 3.3.2 extensions.conf 3.3.3 Asterisk Realtime 3.4 Configuración del Firewall 3.5 Primer acceso
38 45 47 47 50 52 55 59
Capitulo IV – Configuración Base A2Billing............................................................................ 63 4.1 System Settings 4.2 Configuración de los Proveedores 4.3 Creación de los planes de llamadas y de las tarifas 4.4 Configuración de los métodos de pago 4.5 Configuración para la facturas 4.6 Plantillas de los correos electrónicos 4.7 Creación de un cliente 4.8 Registro de un nuevo cliente desde la pagina Web 4.9 Creación de una cuenta POSTPAGO 4.10 Crear Revendedores i
64 96 100 109 111 113 114 129 134 137
Capitulo V - Configuración Avanzada A2Billing …............................................................... 5.1 Distintos CallPlan 5.2 El sistema de soporte 5.3 Callback (Rellamada) 5.3.1 Rellamada desde la pagina personal del cliente 5.3.2 Rellamada con numero de acceso 5.4 A2Billing como sistema de tarjetas prepago 5.5 Paquetes de llamadas 5.6 El Parámetro LCR Mode 5.7 Añadir extensiones a un cliente 5.8 El sistema de facturación 5.9 Subscription services 5.10 Account Service 5.11 Números geográficos 5.11.1 Didx.Net 5.11.2 Configurar Numero DID 5.12 A2Billing en dos servidores 5.12.1 Primer Servidor – Asterisk PBX 5.12.2 Segundo Servidor – Parte Web 5.13 Conteo de canales
145 145 154 157 159 161 165 180 186 189 191 194 197 201 201 204 210 210 218 222
Capitulo VI – Seguridad del servidor ….................................................................................... 232 6.1 Poner en seguridad el servidor Web 6.1.1 Creación y configuración de un certificado para el Servidor Web 6.2 Seguridad en Asterisk 6.2.1 Fail2ban 6.2.2 Bloquear IP por países
232 236 240 241 244
Capitulo VII – Monitoreo del sistema …................................................................................... 251 7.1 Monitoreo desde A2Billing 7.1.1 Monitoreo calidad llamadas 7.1.2 Monitoreo con script y un sistema de TTS 7.2 Monitoreo con Nagios y SNMP 7.2.1 Asterisk y SNMP 7.2.2 Nagios 7.2.3 NDOutils 7.2.4 PNP4NAGIOS 7.3 Monitoreo calidad de las llamadas con pre-dial handlers y hangup-handlers 7.4 Monitoreo calidad de las llamadas con VoIPMonitor
ii
251 251 253 260 260 262 274 277 283 289
Capitulo VIII – Trucos y consejos ….......................................................................................... 293 8.1 Cambiar la moneda predefinida 8.2 Rellamada sin cobrar en ningún caso la primera llamada 8.3 Nginx en lugar de Apache 8.4 Guardar la IP del llamante en el CDR 8.5 Cambiar el numero de las tarjetas 8.6 Modificar el tamaño del campo destination en los reportes de las llamadas 8.7 Campo destination en la tabla cc_call 8.8 Registros de Asterisk 8.9 Cambio nombre pestaña Navegador 8.10 Aumentar el numero de decimales en los reportes de llamadas 8.11 Autenticación sobre IP 8.12 Actualizar A2Billing a una nueva versión
293 294 297 302 303 304 305 306 307 308 308 311
Capitulo IX – Resolución de problemas …................................................................................. 316 9.1 Pagina Web en blanco 9.2 Recuperar password administrador A2Billing 9.3 Tarificación errada de las llamadas
316 317 317
Apéndice A – GNU Free Documentation License
320
iii
Capitulo I VPS Linode La parte que se presenta a seguir es valida solamente para un VPS Linode. Para una instalación en un servidor local o un servidor remoto dedicado (no virtualizado), véase el párrafo 1.1.1. 1.1 Preparación del VPS Los VPS de Linode, utilizan como sistema de virtualización Xen y desde el mes de Junio de 2015 también KVM; los dos vienen con un Kernel personalizado. Para poder trabajar con el ultimo Kernel disponible de la versión de CentOS instalada, se modificará la configuración del servidor instalando el sistema de arranque GRUB y luego iniciando el servidor con la opción (GRUB (Legacy)). De esta forma el servidor se iniciará con el Kernel configurado en el archivo menu.lst que habrá que crear. Una vez creada una cuenta en Linode, se accede a la pagina de administración y se adquiere un nuevo VPS:
El nuevo VPS estará disponible:
Se selecciona el enlace indicado en la imagen y en la nueva ventana el enlace “Deploy an Image”:
Se selecciona el tamaño de la RAM del VPS (2048) y el centro de datos que lo hospedará (Dallas). Se confirma la compra presionando el botón “Add This Linode!”.
Terminada la configuración se presiona el botón “Deploy”. Empezará el proceso de instalación y configuración del sistema operativo. Una vez que termine ya se puede iniciar el servidor presionando el botón “Boot”.
Como se puede ver en la imagen, el Kernel que se instala es la versión “Latest 64 bit (4.7.0-x86_64linode72). De esta versión no hay las fuentes disponibles y eso imposibilita la instalación de DAHDI y, en general, de todos los programas que se instalan como módulos del Kernel. Por eso en los próximos párrafos se verá como instalar en el servidor Linode, la ultima versión disponible del Kernel Linux y el sistema de arranque GRUB.
2
Una vez que el servidor esté corriendo, como indicado en la imagen que sigue, que aparece en el lado derecho de la pagina de administración de Linode, se puede acceder al servidor con el programa PuTTy (un cliente SSH):
Para conocer la dirección IP del servidor Linode, se entra en la siguiente pagina, donde aparecen todos los datos de configuración de red del servidor:
Se descarga el programa PuTTy para Windows desde esta pagina: http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe Una vez descargado se ejecuta. Aparecerá la siguiente ventana:
3
En “Host Name (or IP address) se pone la dirección IP publica del servidor Linode, en “Port” 22 y en “Saved Sessions” un nombre que identifique la conexión al VPS. Terminada la configuración se presiona el botón “Save” y luego el botón “Open” que aparece más abajo. Se abrirá una nueva ventana donde en “login as” se pone root y en “password” la contraseña que se ha escogido al momento de la instalación del sistema operativo. Si se está utilizando Linux en lugar de Windows, se abre una ventana terminal y para conectarse al servidor remoto se ejecuta el siguiente comando: ssh root@IPservidor El resultado será:
La primera cosa que hay que hacer es actualizar el sistema: yum update -y Se instalan los repositorios de Fedora que se utilizarán más adelante para instalar algunos paquetes que no vienen con los repositorios estándar de CentOS: yum install epel-release -y Se desactivan los nuevos repositorios para activarlos solamente cuando se necesiten: 4
nano /etc/yum.repos.d/epel.repo En el primer bloque del archivo se modifica el parámetro: enabled=1 para que quede: enable=0 Se guardan los cambios. Se instala la ultima versión disponible del Kernel y el sistema de arranque GRUB: yum install kernel grub -y Se averigua la versión del Kernel que se ha instalado: rpm -q kernel kernel-2.6.32-642.4.2.el6.x86_64 y con esos datos se configura GRUB: nano /boot/grub/grub.conf Se copian las lineas que siguen: #boot=/dev/sda default=0 timeout=5 title CentOS (2.6.32-642.4.2.el6.x86_64) root (hd0) kernel /boot/vmlinuz-2.6.32-642.4.2.el6.x86_64 root=/dev/sda console=ttyS0 initrd /boot/initramfs-2.6.32-642.4.2.el6.x86_64.img Se guardan las modificaciones y se crea un enlace simbólico del archivo que se acaba de crear: ln -s /boot/grub/grub.conf /boot/grub/menu.lst IMPORTANTE: como la versión del Kernel puede cambiar en el tiempo, hay que modificar el archivo grub.conf, con los datos de la versión realmente instalada. 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:
5
En la nueva pagina se modifican los parámetros como indicado en la siguiente imágen:
Para terminar se guardan los cambios presionando el botón “Save Changes” que aparece al final de la pagina. Se regresará a la pagina principal del servidor Linode y de ahí se reinicia:
Para averiguar que efectivamente el sistema arranca utilizando el Kernel Linux instalado y el gestor de arranque GRUB, en la pagina de Linode se entra en el menú “Remote access” y luego se sigue el enlace “Launch Lish Ajax Console” que permite acceder al servidor desde una consola local. Se abrirá una nueva ventana y después de unos segundos aparecerá esta imagen:
6
1.1.1 Servidor Linux CentOS 6.8 Local En el caso de un servidor Linux local, la instalación se realiza desde cero partiendo de un CD de instalación que contenga el sistema operativo CentOS 6.8 64bit. La imagen se puede descargar desde esta pagina. Al momento de escoger el tipo de instalación, se selecciona “minimal”. A lo largo de la instalación se configurará el idioma, el país del teclado, la zona horaria, la contraseña de root, etc. Una vez terminada la configuración se reiniciará el servidor y se podrá acceder con el mismo programa (PuTTY) indicado en el párrafo anterior. Normalmente cuando CentOS se instala en local, el cortafuegos viene configurado por defecto y arranca con una configuración básica. Si se quiere, se puede mover la configuración predefinida: mv /etc/sysconfig/iptables /etc/sysconfig/iptables.old y reiniciar iptables: service iptables restart Otra opción es desactivar el cortafuegos y utilizar el router para definir los puertos que se querrá dejar abiertos. Otra operación que hay que ejecutar es desactivar Selinux. Primero se instala el editor NANO: yum install nano -y luego se abre el archivo de configuración de Selinux:
7
nano /etc/selinux/config Modificar las dos opciones presentes de forma que el archivo quede de la siguiente manera: SELINUX=disabled SELINUXTYPE=targeted Se guardan los cambios y se actualiza el sistema: yum update -y Si se quiere configurar el servidor con una IP estática se instala la relativa utilidad: yum install system-config-network-tui y se ejecuta: system-config-network En la ventana que aparece se escoge “device configuration”:
Se selecciona la tarjeta de red instalada en el servidor:
8
Se configura la IP estática:
Static IP: dirección IP que se quiere asignar al servidor (tiene que estar dentro del rango configurado en el router) Netmask: normalmente el valor es 255.255.255.0 Default Gateway IP: dirección IP del router Primary DNS Server: dirección IP del router Secondary DNS Server: se puede dejar en blanco Se presiona el botón Ok y se vuelve a la pagina anterior donde se escoge el botón Save y en la pagina principal se escoge DNS configuration:
En la pagina que sigue se escoge un nombre de dominio y se configura nuevamente el DNS primario:
9
Se presiona el botón OK y en la pagina que sigue el botón Save&Quit. De esta forma se sale de la aplicación. Se reinicia el servidor: reboot 1.2 SSH y clave RSA RSA es un sistema de cifrado de clave publica che permite la configuración de conexiones seguras. Como en todo sistema de clave pública, cada usuario posee dos claves de cifrado: una pública y otra privada. Cuando se quiere enviar un mensaje, el emisor busca la clave pública del receptor, cifra su mensaje con esa clave, y una vez que el mensaje cifrado llega al receptor, este se ocupa de descifrarlo usando su clave privada. 1.2.1 Clave RSA en Windows Para crear la clave RSA se descarga el programa PuTTygen: http://the.earth.li/~sgtatham/putty/latest/x86/puttygen.exe Se ejecuta:
10
En “Number of bits in a generated key” se pone 2048 y luego se presiona el botón “Generate”. Para la creación de la clave se necesita generar una serie aleatoria de números y esto se realiza moviendo el ratón en el cuadro que aparece bajo la linea “Key”:
11
Hay que seguir moviendo el ratón hasta que la barra que aparece no llegue al final de la linea. Terminada la operación se tendrá disponible la clave RSA (publica y privada):
IMPORTANTE: para aumentar la seguridad de la clave privada, se puede asociar una contraseña. La contraseña se escribe en la casilla “Key passphrase” y se repite en “Confirm passphrase”. 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 presiona el botón derecho del ratón y se escoge en el menú “copiar”:
12
El texto copiado es la clave publica. Se accede nuevamente con PuTTy al servidor remoto y se sigue este procedimiento para utilizar la clave publica; se crea la carpeta ssh: mkdir .ssh se permite el acceso a la carpeta creada solamente al usuario root: chmod 700 .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:
13
Se guarda el archivo presionado la tecla CTRL junto a la tecla X. Se asigna al archivo recién creado los permisos de lectura y escritura solamente para el usuario root: chmod 600 /root/.ssh/authorized_keys Ya se puede continuar con la configuración del servidor SSH (párrafo 1.2.3). 1.2.2 Clave RSA en Linux Se accede al servidor Linux LOCAL como usuario root y e la ventana terminal se escribe: cd /root mkdir .ssh se permite el acceso a la carpeta creada solamente al usuario root: chmod 700 .ssh se entra en la carpeta: cd .ssh Se crea la clave RSA ssh-keygen -t rsa Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: 2e:86:eb:d0:8e:2d:49:1f:0e:83:a8:b2:45:e7:2b:26 root@li215-240 The key's randomart image is: +--[ RSA 2048]----+ |... . S | |o.++.. . | |..o*+.o . | |E.==o+ . | |o+.+* | 14
+-----------------+ [root@li215-240 .ssh]# ls -l total 8 -rw------- 1 root root 1675 Mar 11 20:06 id_rsa -rw-r--r-- 1 root root 396 Mar 11 20:06 id_rsa.pub Cuando el sistema lo solicita (lineas en negrita), se puede configurar la clave con una contraseña. Se crearán dos archivos: • •
id_rsa que contiene la clave privada id_rsa.pub que contiene la clave publica
El segundo archivo se copia en el servidor Linode remoto: scp id_rsa.pub root@IPservidorremoto:/tmp Con este comando se copia la clave publica en la carpeta /tmp del servidor remoto. Luego se añade la clave al archivo authorized_keys en la carpeta /root/.ssh cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys Se borra la clave publica: rm /tmp/id_rsa.pub y se cambian los permisos del archivo authorized_keys: chmod 600 /root/.ssh/authorized_keys 1.2.3 Configuración servidor SSH Terminada la operación de creación y configuración de las claves RSA, hay que modificar 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 realiza 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 presionar la tecla CTRL junto a la tecla W): #Port 22 #RSAAuthentication yes PasswordAuthentication yes 15
y se modifican para que queden: Port 15000 RSAAuthentication yes PasswordAuthentication no Se guardan los cambios y se reinicia el servidor SSH: /etc/init.d/sshd restart Se abre otra instancia del cliente SSH:
Se pone la IP del servidor Linode, come puerto el 15000 y se asigna un nuevo nombre a esta nueva conexión.
16
En la barra 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 utilizará la sesión Linode2, botón “Load” y luego botón “Open”. Debe aparecer esta ventana:
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. 1.3 Configuración del VPS Para iniciar la configuración del VPS, se modifica la hora predefinida del servidor: rm /etc/localtime rm: remove regular file `/etc/localtime'? Y 17
Se crea un enlace simbólico a la hora de Colombia (personalizar según su país): ln -s /usr/share/zoneinfo/America/Bogota /etc/localtime se averigua que la hora esté correctamente configurada con el comando: date Mon Oct 6 10:50:52 COT 2014 IMPORTANTE: cada vez que se actualizan los paquetes del sistema (yum update), revisar siempre si la hora del servidor ha cambiado. Si así fuera volver a configurar la de su país Para que la hora se sincronice de manera automática se instala el servidor NTP (Network Time Protocol): yum install ntp -y Se configura para que se inicie automáticamente al arrancar el servidor Linux: chkconfig ntpd on y se inicia: service ntpd start Starting ntpd:
[ OK ]
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: LANG="es_CO.iso88591" Para ver la lista de idiomas disponibles y de esta forma personalizar la configuración, el comando es: locale -a Para activar el nuevo idioma basta salir y volver a entrar al servidor con PuTTy. Como la IP publica en Linode se asigna a través de un servidor DHCP y esto puede causar problemas si hay modificaciones de la configuración del servidor por parte de Linode, es buena practica configurar 18
la IP publica de forma estática. Para realizar este cambio, se modifica el siguiente archivo: nano /etc/sysconfig/network-scripts/ifcfg-eth0 Se comenta el contenido previo y se añaden las siguiente lineas de forma que el archivo quede: #DEVICE="eth0" #BOOTPROTO="dhcp" #IPV6INIT="yes" #IPV6_AUTOCONF="yes" #ONBOOT="yes" #TYPE="Ethernet" DEVICE=eth0 BOOTPROTO=none IPV6INIT="no" IPV6_AUTOCONF="no" ONBOOT=yes IPADDR=50.116.16.112 NETMASK=255.255.255.0 GATEWAY=50.116.16.1 50.116.16.112 es la IP publica del servidor Linode (personalizar). Se guardan los cambios. En el servidor Linode es posible crear una IP privada que se puede utilizar para intercambiar datos y conexiones entre distintos VPS Linode presentes en el mismo centro de datos. Esto puede ser muy útil, por ejemplo, cuando se quiera compartir un servidor MySQL entre dos servidores y/o cuando algunos servicios se configuran en un servidor y los demás servidores acceden a ellos utilizando la IP privada. Hay que tener en cuenta que todo el trafico que pase por la IP privada no viene contabilizado en el consumo mensual de banda.. Para configurar la IP privada se entra nuevamente en el menú “Remote Access” y se crea:
Aparecerá (por ejemplo):
Con esos datos se configura una tarjeta de red virtual de la siguiente manera:
19
nano /etc/sysconfig/network-scripts/ifcfg-eth0:1 Se pegan las siguientes lineas: DEVICE=eth0:1 BOOTPROTO=none ONBOOT=yes IPADDR=192.168.146.30 NETMASK=255.255.128.0 Personalizar la linea IPADDR con la IP privada asignada por Linode. Se guardan los cambios. Se continua configurando el subdominio asociado al Linode. Este dato aparece siempre en el menú “Remote Access”:
Se abre este archivo: nano /etc/sysconfig/network y se modifica esta linea: HOSTNAME=localhost.localdomain para que quede: HOSTNAME=li403-112.members.linode.com Personalizar con el dominio asignado por Linode. Para terminar se configuran algunos parámetros y alias para los comandos que más se utilizarán a lo largo del libro: nano .bash_profile al final del archivo se pegan las lineas que siguen: export EDITOR=/usr/bin/nano export PS1='\[\033[0;35m\]\H\[\033[0;33m\] \w\[\033[00m\]: ' alias free="free -m" alias aste="asterisk -rvvvvvvvvvvvvvvvvvv" alias sip="nano /etc/asterisk/sip.conf" alias ext="nano /etc/asterisk/extensions.conf" Se guardan los cambios y se recarga la configuración de la consola Linux:
20
source .bash_profile Ya se puede reiniciar el servidor remoto: reboot
21
CAPITULO II Instalación de Asterisk En este libro no se abordarán todas las configuraciones de Asterisk por motivos de espacio y porque las funcionalidades que se utilizarán para la instalación y configuración de A2Billing son mínimas. Para aquellos que quieran profundizar el tema, aconsejo el libro dedicado a Asterisk 11.X presente en el sitio web de VozToVoice. 2.1 Utilidades, librerías, dependencias Antes de la compilación e instalación de Asterisk, se instalarán una serie de librerías y dependencias que permitirán obtener una instalación de casi todos los módulos disponibles en 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 -y Para el formato audio GSM se instalan los relativos paquetes: yum install gsm gsm-devel gsm-tools -y 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 -y se instalan todas las librerías y dependencias que se necesitan para compilar las fuentes: yum install gcc ncurses-devel make gcc-c++ compat-libtermcap zlib-devel libtool bison \ bison-devel openssl-devel bzip2-devel wget newt-devel subversion flex gtk2-devel -y a seguir para crear y gestionar las bases de datos, MySQL: yum install mysql mysql-server mysql-devel -y Si en lugar de MySQL se quiere utilizar POSTGRESQL: yum install postgresql postgresql-devel postgresql-docs postgresql-libs postgresql-odbc postgresql-server -y
Como la base de datos interna de Asterisk desde la versión 11.X se basa en SQLite, se instala el paquete del programa y el paquete de desarrollo:
yum install sqlite sqlite-devel -y 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 -y Se instala FESTIVAL, que es un sistema de text to speech (disponible con las voces en español): yum install festival festival-devel hispavoces-pal-diphone hispavoces-sfl-diphone -y Para las librerías de pjproject incluidas en Asterisk 11.X, se instala libuuid: yum install libuuid libuuid-devel uuid uuid-devel -y Se continua con la instalación de otros formatos audio: SPEEX y WAW: yum install speex speex-devel wavpack wavpack-devel -y Una vez terminada esta parte se empieza a instalar una serie de programas desde las fuentes. IMPORTANTE: Para todos los programas que se instalan desde las fuentes, antes de descargarlos, averiguar si hay una versión más reciente disponible. El primero es 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 Se descomprime: tar -xf lame-3.99.5.tar.gz Se entra en la carpeta creada: cd lame-3.99.5 Se inicia la compilación: ./configure --prefix=/usr --libdir=/usr/lib64 La mayoría de los programas que se compilan desde las fuentes se instalan por defecto en la carpeta /usr/local. Es por eso que en la linea del configure se especifica que la carpeta donde se quiere que se 24
instalen es la /usr. Lo mismo pasa con las librerías del programa. Como el sistema es 64bit se especifica la carpeta donde se quiere que se instalen las librerías make el comando make compila las fuentes creando todos los archivos ejecutables y librerías que luego se instalarán con el comando que sigue: make install con make install se instala el programa y las librerías compiladas. Se continua con 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 --libdir=/usr/lib64 Para que la compilación tenga éxito hay que modificar una linea del Makefile: nano +129 Makefile CFLAGS = -Wall -g -O -fforce-mem -fforce-addr -fthread-jumps -fcse-follow-jumps -fcse-skipblocks -fexpensive-optimizations -fregmove -fschedule-insns2 para que quede: CFLAGS = -Wall -g -O -fforce-addr -fthread-jumps -fcse-follow-jumps -fcse-skip-blocks -fexpensive-optimizations -fregmove -fschedule-insns2 se continua con la compilación e instalación: make make install Se termina esta primera parte con SOX que es un programa que permite la manipulación de archivos audio y la posibilidad de transformarlos de un formato a otro: cd /usr/src
25
wget http://downloads.sourceforge.net/project/sox/sox/14.4.2/sox-14.4.2.tar.gz tar -xf sox-14.4.2.tar.gz cd sox-14.4.2 ./configure --prefix=/usr --libdir=/usr/lib64 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 2.2 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). Aunque su instalación ya no es indispensable ya que para las conferencias audio existe la aplicación ConfBridge que es mucho más completa, se instalará para tener todos los módulos disponibles. Se instala el paquete de desarrollo del Kernel: yum install kernel-devel -y Se continua con la ultima versión disponible de DAHDI-Linux: 26
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.11.1 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-2.10.2.tar.gz tar -xf dahdi-tools-2.10.2.tar.gz cd dahdi-tools-2.10.2 ./configure Se termina con la compilación e instalación: make make install make config Como no se van a instalar tarjetas (en el caso del servidor remoto), se pueden comentar todo los controladores que aparecen el el archivo /etc/dahdi/modules. Luego se puede iniciar DAHDI: /etc/init.d/dahdi start Loading DAHDI hardware modules: Running dahdi_cfg:
[ OK ]
2.3 LIBPRI En el caso que se quiera instalar tarjetas digitales en el servidor Asterisk (E1, T1, ISDN), después de instalar DAHDI, hay que instalar la librería libpri: cd /usr/src wget http://downloads.asterisk.org/pub/telephony/libpri/libpri-1.5.0.tar.gz 27
se descomprime: tar -xf libpri-1.5.0.tar.gz se entra en la carpeta: cd libpri-1.5.0 se compila y se instala: make make install 2.4 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, IKSEMEL que permite implementar el protocolo XMPP en Asterisk y de esta forma conectarse a GoogleTalk y/o a cualquier servidor con protocolo XMPP (otro ejemplo es Openfire), LibiCAL que permite conectar Asterisk a los calendarios que utilizan el protocolo iCAL y libSRTP que permite cifrar el flujo media de las llamadas. Para SpanDSP se necesita instalar primero las librerías libtiff y libxml2: yum install libtiff libtiff-devel libxml2 libxml2-devel -y se continua con SpanDSP desde los repositorios EPEL: yum --enablerepo=epel install spandsp spandsp-apidoc spandsp-devel -y 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 -y se continua con IKSEMEL (desde los repositorios EPEL): yum --enablerepo=epel install iksemel iksemel-devel iksemel-utils -y Se continua con 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 -y 28
Se remueve el servidor de correo electrónico predefinido POSTFIX: service postfix stop yum remove postfix -y Se configura para que arranque en automático: chkconfig sendmail on El subdominio configurado en el párrafo 1.3, 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. Solamente si se necesita que sea alcanzable desde remoto (para recibir correos electrónicos) hay que abrir el archivo de configuración de Sendmail: nano /etc/mail/sendmail.mc buscar esta linea (para buscar un texto con el editor Nano hay que presionar la combinación de teclas CTRL-W): DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl y modificar 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 se inicia el servidor de correo: /etc/init.d/sendmail start 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 -y 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:
29
yum install net-snmp net-snmp-devel net-snmp-libs net-snmp-utils -y 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: yum --enablerepo=epel install radiusclient-ng radiusclient-ng-devel radiusclient-ng-utils -y 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. Al terminar la instalación de Asterisk se encontrará un archivo de ejemplo en la carpeta /etc/asterisk. yum install lua lua-devel -y Para terminar se compilan los paquetes que permiten utilizar las nuevas funcionalidades de Asterisk. Primero LIBICAL que permite la implementación del protocolo iCalendar (RFC5546) en Asterisk a través del modulo res_calendar: yum install libical libical-devel -y Luego NEON que es una librería que permite la implementación del protocolo WebDAV en Asterisk: yum install neon neon-devel -y Por ultimo la librería LIBSRTP que permite implementar el cifrado del flujo media en Asterisk a través del protocolo SRTP (RFC3711): yum --enablerepo=epel install libsrtp libsrtp-devel -y 2.5 Instalación de Asterisk Terminada la preparación del servidor, se inicia con la instalación de Asterisk. Se descarga la ultima versión 11.X disponible: cd /usr/src wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-11.23.1.tar.gz tar -xf asterisk-11.23.1.tar.gz cd asterisk-11.23.1 ./configure --libdir=/usr/lib64 make menuselect
30
Desde la versión 1.8.X lo que antes era un paquete a parte (asterisk-addons) ahora es presente en el paquete principal de Asterisk. Como se puede notar, los módulos relacionados con MySQL (menos res_mysql) son “deprecated” y en las versiones futuras de Asterisk serán eliminados. Se entra en el menú “Add-ons” y se activan los paquetes que siguen:
Desde la versión 11.X, la aplicación MeetMe (conferencias audio) está desactivada. Asegurarse seleccionarla para que el modulo sea compilado (menú izquierdo Applications):
En “Resource modules” se controla que el modulo relacionado con el cifrado del flujo media esté activado:
Para servidores virtualizados, en el menú “Compiler Flags” de desactiva el parámetro BUILD_NATIVE (si está activado):
Se seleccionan todos los módulos en el menú “Utilities” y “AGI Samples”:
31
En “Core Sound Packages”, “Music On Hold File Packages” y “Extra Sound Packages” se seleccionan todos los paquetes disponibles. 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 resuelve con: contrib/scripts/get_mp3_source.sh y se continua otra vez con el make: make se instala Asterisk: make install se instalan los archivos de configuración predefinidos: make samples 32
se configura el script de arranque de Asterisk: make config Terminada la instalación, se procede con la configuración de MySQL para crear la base de datos y la tabla donde se guardarán los registros de las llamadas. /etc/init.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 poner en seguridad 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, successfully used password, moving on... Change the root password? [Y/n] n ... skipping. Remove anonymous users? [Y/n] y ... Success! Disallow root login remotely? [Y/n] y ... Success! Remove test database and access to it? [Y/n] y - Dropping test database... Reload privilege tables now? [Y/n] y ... Success! Cleaning up... 33
All done! If you've completed all of the above steps, your MySQL installation should now be secure. Thanks for using MySQL! Se configura la zona horaria en MySQL: mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -psesamo mysql Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it. nano /etc/my.cnf Bajo la etiqueta [mysqld] se añade (personalizar): default-time-zone = America/Bogota Se reinicia el servidor MySQL: service mysqld restart Se crea la base de datos para guardar los registros de las llamadas de Asterisk. Se entra en el cliente de MySQL: mysql -u root -psesamo se crea la base de datos asteriskcdr: mysql> create database asteriskcdr; se selecciona: mysql> use asteriskcdr se crea la tabla cdr (copiando y pegando las lineas que siguen): mysql> CREATE TABLE cdr ( calldate datetime NOT NULL default '0000-00-00 00:00:00', clid varchar(80) NOT NULL default '', src varchar(80) NOT NULL default '', dst varchar(80) NOT NULL default '', dcontext varchar(80) NOT NULL default '', channel varchar(80) NOT NULL default '', dstchannel varchar(80) NOT NULL default '', lastapp varchar(80) NOT NULL default '', lastdata varchar(80) NOT NULL default '', 34
duration int(11) NOT NULL default '0', billsec int(11) NOT NULL default '0', disposition varchar(45) NOT NULL default '', amaflags int(11) NOT NULL default '0', accountcode varchar(20) NOT NULL default '', peeraccount varchar(20) NOT NULL default '', uniqueid varchar(32) NOT NULL default '', linkedid varchar(80) NOT NULL default '', userfield varchar(255) NOT NULL default '', KEY callerid (clid) ); 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. Se otorgan los permisos de acceso a la base de datos creada al usuario asterisk, desde local: mysql> GRANT ALL PRIVILEGES ON asteriskcdr.* TO 'asterisk'@'localhost' IDENTIFIED BY 'sesamo'; desde remoto (solamente si se necesita acceder a la base de datos desde otro servidor): mysql> GRANT ALL PRIVILEGES ON asteriskcdr.* TO 'asterisk'@'%' IDENTIFIED BY 'sesamo'; se actualizan los permisos: mysql> flush privileges; 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, se configura en el archivo cdr_mysql.conf. Se renombra el predefinido: mv /etc/asterisk/cdr_mysql.conf /etc/asterisk/cdr_mysql.conf.old se crea uno nuevo: nano /etc/asterisk/cdr_mysql.conf se añaden las siguientes lineas: 35
[global] hostname=127.0.0.1 dbname=asteriskcdr table=cdr password=sesamo user=asterisk port=3306 sock=/var/lib/mysql/mysql.sock Los datos: 1. 2. 3. 4. 5. 6. 7. 8.
[global] – etiqueta inicial del bloque hostname - nombre de dominio o IP del servidor MySQL (en este caso local) dbname - nombre de la base de datos table - nombre de la tabla password - contraseña del usuario que tiene los permisos para acceder a la base de datos user - 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. Se necesita indicar para una correcta conexión en el caso en que en hostname se indique “localhost”.
Se guardan los cambios y se inicia Asterisk: /etc/init.d/asterisk start se averigua que esté corriendo: /etc/init.d/asterisk status asterisk (pid 2403) is running... 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, port 3306 using table cdr for 59 seconds. Wrote 0 records since last restart. Se sale de la consola: CLI> quit Asterisk cleanly ending (0). Executing last minute cleanups
36
Capitulo III Instalación A2Billing A2billing es un Softswitch de clase 4 y clase 5. Un softswitch de clase 4 es un sistema capaz de enrutar una gran cantidad de llamadas y permite la conexión entre distintos operadores; un softswitch de clase 5 es un sistema utilizado para brindar servicios de valor añadido a los usuarios finales. A2Billing es el único sistema de facturación para Asterisk distribuido bajo una licencia Open Source (GNU GPL) basado en MySQL o PostgreSQL para las base de datos y PHP como lenguaje de programación. Se puede utilizar: • • • • •
Como sistema de tarjetas telefónicas a través de números de acceso telefónicos; Como sistema de venta de trafico telefónico al por mayor (Wholesale) Como sistema para la facturación de las llamadas Como sistema de venta de números geográficos (DID) Como sistema para la gestión de revendedores
3.1 Preparación del sistema A2billing requiere por lo menos la versión 5.3 de PHP. En la versión de CentOS 6.8 esta versión está disponible pues se instalará junto al servidor Web Apache y el modulo SSL (para conexiones seguras hacia el servidor Web): yum install php php-gd php-mysql php-process httpd mod_ssl php-cli php-soap php-xml -y Luego se instala php-mcrypt activando el repositorio epel: yum --enablerepo=epel install php-mcrypt -y Terminada esta operación, se configura la zona horaria en el archivo de configuración de PHP (php.ini) nano +946 /etc/php.ini Se modifica la linea para que quede (en el caso de Colombia): date.timezone = America/Bogota En el mismo archivo se busca esta linea: upload_max_filesize = 2M
y se modifica para que quede: upload_max_filesize = 8M De esta forma se podrán cargar los archivos de las tarifas que tengan un tamaño de hasta 8 MegaBytes Siempre en el mismo archivo, se busca esta linea: error_reporting = E_ALL & ~E_DEPRECATED y se modifica para que quede: error_reporting = E_ALL & ~E_NOTICE de esta forma en los LOG del servidor web aparecerán solamente los errores, si presentes, relacionados con el lenguaje PHP. Se guardan los cambios y se descarga la ultima versión disponible de A2Billing: cd /usr/local/src wget https://github.com/Star2Billing/a2billing/archive/v2.2.0.tar.gz Se descomprime: tar -xf v2.2.0.tar.gz se renombra la carpeta creada: mv a2billing-2.2.0 a2billing cd a2billing A partir de la versión 2.1.1 de A2Billing se utiliza Composer para instalar toda las dependencias; como algunas se instalan utilizando el programa GIT: yum install git -y Se continua utilizando Composer para instalar las dependencias: curl -sS https://getcomposer.org/installer | php php composer.phar update php composer.phar install Se entra en el cliente MySQL: mysql -u root -psesamo se crea la base de datos a2billing: 39
mysql> create database a2billing; Query OK, 1 row affected (0.00 sec) se otorgan los permisos de acceso a la base de datos creada al usuario a2user identificado con la contraseña sesamo desde local: mysql> GRANT ALL PRIVILEGES ON a2billing.* TO 'a2user'@'localhost' IDENTIFIED BY 'sesamo'; Query OK, 0 rows affected (0.00 sec) se actualizan los permisos: mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) se sale del cliente MySQL: mysql> quit Bye Se crean las tablas en la base de datos a2billing utilizando el script presente en la siguiente carpeta: cd DataBase/mysql-5.x/ se ejecuta: ./install-db.sh Se insertan los datos como mostrado en la imagen que sigue:
40
Para resumir: Database Name: a2billing Hostname: localhost Username: root Password: sesamo Se instalan las locuciones distribuidas con el programa (ingles, francés, español, portugués y ruso): cd /usr/local/src/a2billing/addons/sounds/ utilizando el siguiente script: ./install_a2b_sounds.sh La verdad la calidad de las locuciones en español no son muy buenas y algunas faltan del todo. En la misma carpeta se encuentra el archivo Audio_text.info que contiene todos los nombres de las locuciones disponibles con relativas frases. Puede ser una buena ayuda para grabar las propias. Se continua la instalación copiando el archivo de configuración de a2billing en la carpeta /etc: cp /usr/local/src/a2billing/a2billing.conf /etc/ se abre con el editor: nano /etc/a2billing.conf se modifican estas lineas: [database] hostname = localhost port = user = a2billing_dbuser password = a2billing_dbpassword dbname = a2billing_dbname dbtype = mysql para que queden: [database] hostname = localhost port = 3306 user = a2user password = sesamo dbname = a2billing dbtype = mysql
41
Se guardan los cambios. Por defecto A2billing trabaja con Asterisk en Realtime, es decir que las extensiones SIP y IAX2 se guardan en la base de datos a2billing y Asterisk accede a ellas a través de la configuración del modulo de Realtime. Existe también la posibilidad de guardar la configuración de las extensiones en archivos de texto. Para este tipo de configuración se crean dos archivos que son los que a2billing utilizará para guardar las extensiones SIP y IAX2: touch /etc/asterisk/additional_a2billing_iax.conf touch /etc/asterisk/additional_a2billing_sip.conf se asignan los permisos de escritura/lectura para estos dos archivos al usuario y grupo apache, es decir el servidor Web: chown -Rf apache:apache /etc/asterisk/additional_a2billing_iax.conf chown -Rf apache:apache /etc/asterisk/additional_a2billing_sip.conf A2Billing para recargar la configuración de Asterisk (en el caso que las extensiones se guarden en los archivos que se acaban de crear) y para generar las llamadas de callback se apoya al AMI (Asterisk Manager Interface) de la PBX. Es por eso que hay que configurar el archivo manager.conf. Se abre: nano /etc/asterisk/manager.conf Se cambian las siguientes tres lineas: enabled = no ;allowmultiplelogin = yes ;displayconnects = yes para que queden: enabled=yes allowmultiplelogin = yes dislplayconnects=yes El usuario predefinido en la configuración de A2billing para conectarse al AMI de Asterisk es myasterisk con contraseña mycode. Para evitar de trabajar con configuraciones predefinidas, se cambiaran estos datos respectivamente con asterisk y sesamo: [asterisk] secret=sesamo deny=0.0.0.0/0.0.0.0 permit=127.0.0.1/255.255.255.255 read = system,call,log,verbose,agent,user,config,dtmf,reporting,cdr,dialplan write = system,call,agent,user,config,command,reporting,originate Se guardan los cambios y se continua con los script AGI presentes en el paquete de A2Billing. Uno se 42
utiliza para realizar las llamadas (a2billing.php) y el segundo para monitorear el servidor (a2billing_monitoring.php). Se entra en la carpeta que contiene los AGI: cd /usr/local/src/a2billing/AGI se crean dos enlaces simbólicos de los dos AGI en la carpeta /var/lib/asterisk/agi-bin que es donde Asterisk los busca de manera predefinida: ln -s /usr/local/src/a2billing/AGI/a2billing.php /var/lib/asterisk/agi-bin/a2billing.php ln -s /usr/local/src/a2billing/AGI/a2billing_monitoring.php /var/lib/asterisk/agi-bin/a2billing_monitoring.php
Como los AGI se apoyan en una serie de librerías contenidas en la carpeta /lib, se crea un enlace simbólico también a esta carpeta: ln -s /usr/local/src/a2billing/AGI/lib /var/lib/asterisk/agi-bin/lib Se vuelven ejecutables los dos archivos: chmod +x /var/lib/asterisk/agi-bin/a2billing.php chmod +x /var/lib/asterisk/agi-bin/a2billing_monitoring.php Una vez terminada esta parte se crean una series de carpetas. La primera es donde se guardarán los archivos temporales y los script de A2Billing: mkdir -p /var/lib/a2billing/script la segunda donde se guardará el proceso del servicio de callback: mkdir -p /var/run/a2billing Ahora ya se puede crear un enlace simbólico a las carpetas que se necesitan para la parte Web de A2billing que son: • • • •
admin (para la conexión de los administradores) customer (para la conexión de los clientes) agent (para la conexión de los agentes/revendedores) common (librerías compartidas por los tres tipos de usuarios)
ln -s /usr/local/src/a2billing/admin/ /var/www/html/admin ln -s /usr/local/src/a2billing/agent/ /var/www/html/agent ln -s /usr/local/src/a2billing/customer/ /var/www/html/customer ln -s /usr/local/src/a2billing/common/ /var/www/html/common Se cambian los permisos en las tres carpetas que siguen que es donde se guardarán los archivos temporales para cada tipo de usuario: chmod 755 /usr/local/src/a2billing/admin/templates_c 43
chmod 755 /usr/local/src/a2billing/customer/templates_c chmod 755 /usr/local/src/a2billing/agent/templates_c Se cambia el usuario y grupo que tiene acceso a todas las carpetas creadas (el servidor Web Apache): chown -R apache:apache /var/www/html/ chown -R apache:apache /var/www/html/admin/ chown -R apache:apache /var/www/html/agent/ chown -R apache:apache /var/www/html/customer/ chown -R apache:apache /var/www/html/common/ Los registros de las actividades de A2Billing se guardan en una serie de archivos que hay que crear antes de acceder por primera vez al programa. Primero se crea la carpeta: mkdir /var/log/a2billing se entra en la carpeta y se crean los archivos: cd /var/log/a2billing touch cront_a2b_alarm.log cront_a2b_autorefill.log cront_a2b_batch_process.log \ cront_a2b_archive_data.log cront_a2b_bill_diduse.log cront_a2b_subscription_fee.log \ cront_a2b_currency_update.log cront_a2b_invoice.log cront_a2b_check_account.log \ a2billing_paypal.log a2billing_epayment.log a2billing_api_ecommerce_request.log \ a2billing_api_callback_request.log a2billing_api_card.log a2billing_agi.log Se cambian los permisos para que el usuario apache (el servidor Web) pueda escribir en ellos: chown apache:apache /var/log/a2billing/* A2biblling necesita que se ejecuten una serie de script para monitorear el sistema y para elaborar algunas funciones (ejemplo: pagos, facturas, etc.). Estos script se añaden al cron del sistema para el usuario root: crontab -e Se pegan las siguientes lineas: # A2Billing # Para actualizar la tasa de cambio de las monedas 0 6 * * * php /usr/local/src/a2billing/Cronjobs/currencies_update_yahoo.php # Para el pago se servicios subscritos 0 6 1 * * php /usr/local/src/a2billing/Cronjobs/a2billing_subscription_fee.php # Para notificaciones cuando el credito del cliente es más bajo de lo indicado 0 * * * * php /usr/local/src/a2billing/Cronjobs/a2billing_notify_account.php # Para el pago de los numeros geograficos asociados a los clientes 0 2 * * * php /usr/local/src/a2billing/Cronjobs/a2billing_bill_diduse.php 44
# Para el pago de servicios periódicos 0 12 * * * php /usr/local/src/a2billing/Cronjobs/a2billing_batch_process.php # Para la generación de las facturas de los clientes 0 6 * * * php /usr/local/src/a2billing/Cronjobs/a2billing_batch_billing.php # Para la generación de llamadas automáticas utilizadas en las campañas # */5 * * * * php /usr/local/src/a2billing/Cronjobs/a2billing_batch_autodialer.php # Para la gestión de las alarmas que se pueden configurar en A2Billing 0 * * * * php /usr/local/src/a2billing/Cronjobs/a2billing_alarm.php # Para archivar los datos de las llamadas más viejos de lo indicado en la configuración de A2Billing 0 12 * * * php /usr/local/src/a2billing/Cronjobs/a2billing_archive_data_cront.php # Para recargar el crédito de un cliente en automático 0 6 1 * * php /usr/local/src/a2billing/Cronjobs/a2billing_autorefill.php Se deja comentada la linea a2billing_batch_autodialer.php ya que no se pueden realizar las campañas de llamadas con A2Billing. Se guardan las modificaciones e se reinicia Cron: /etc/init.d/crond restart 3.2 Instalación del demonio CallBack El demonio para el Callback es el que permite utilizar el sistema de rellamada de A2Billing. El programa es escrito en el lenguaje de programación Python y es por eso que primero hay que instalar unos paquetes que se necesitan para su compilación: yum install python-setuptools MySQL-python python-devel -y Luego, a través de easy_install, se instala el programa sqlalchemy: easy_install sqlalchemy Una vez satisfechas estas dependencias, se puede empezar con la compilación y instalación del programa de callback: cd /usr/local/src/a2billing/CallBack/callback-daemon-py/dist/ tar -xf callback_daemon-1.0.prod-r1528.tar.gz cd callback_daemon-1.0.prod-r1528 se compila: python setup.py build python setup.py bdist_egg easy_install dist/callback_daemon-1.0.prod_r1528-py2.6.egg
45
Compilado el programa se instala come servicio a través de uno script presente en el paquete de A2Billing: cd /usr/local/src/a2billing/CallBack/callback-daemon-py/callback_daemon Se copia el script: cp a2b-callback-daemon.rc /etc/init.d/a2b-callback-daemon Se vuelve ejecutable: chmod +x /etc/init.d/a2b-callback-daemon Se añade a la lista de servicios: chkconfig --add a2b-callback-daemon Por defecto el servicio guarda los registros en la carpeta /var/log y tiene que arrancar después de MySQL y Asterisk. Para ese efecto hay que abrir el archivo: nano /etc/init.d/a2b-callback-daemon y cambiar estas lineas: # chkconfig: 2345 40 60 LOG='/var/log/a2b-callback-daemon.log' para que queden: # chkconfig: 2345 95 60 LOG='/var/log/a2billing/a2b-callback-daemon.log' Se guardan las modificaciones y se configura para que arranque en automático con el sistema: chkconfig a2b-callback-daemon on Ahora ya se puede iniciar el servicio: /etc/init.d/a2b-callback-daemon start a2b_callback_daemon está parado Starting a2b-callback-daemon:
[ OK ]
y controlar que esté funcionando: tail -f /var/log/a2billing/a2b-callback-daemon.log "2011-04-23 19:10:52,297 - root - MainThread - INFO - waiting..." 46
"2011-04-23 19:10:57,308 - root - MainThread - INFO - waiting..." "2011-04-23 19:11:02,322 - root - MainThread - INFO - waiting..." "2011-04-23 19:11:07,355 - root - MainThread - INFO – waiting..." Se sale del comando tail con CTRL-C IMPORTANTE: cada vez que se reinicia Asterisk hay que reiniciar el servicio de callback ya que pierde la conexión a la AMI de Asterisk. 3.3 Configuración de Asterisk Como ya se ha dicho anteriormente, en esta guía no se explicarán las configuraciones de Asterisk de forma detallada pero es importante saber que los archivos que se modifican son solamente los que se necesitan para que A2Billing funcione. 3.3.1 sip.conf En el archivo sip.conf se configurará la/s troncal/es para sacar las llamadas hacia el proveedor VoIP. Se renombra el sip.conf predefinido: mv /etc/asterisk/sip.conf /etc/asterisk/sip.conf.old se crea uno nuevo: nano /etc/asterisk/sip.conf se pegan las siguientes lineas: [general] context=default allowguest=no allowtransfer=no match_auth_username=yes realm=asterisk udpbindaddr=0.0.0.0:5060 tcpenable=no tcpbindaddr=0.0.0.0:5060 tcpauthtimeout=30 tcpauthlimit=100 transport=udp srvlookup=yes pedantic=yes maxexpiry=3600 minexpiry=60 47
defaultexpiry=120 mwiexpiry=3600 maxforwards=70 qualifyfreq=20 qualifygap=200 keepalive=yes disallow=all allow=ulaw allow=alaw mohinterpret=default mohsuggest=default language=es relaxdtmf=no sendrpid = yes prematuremedia=no progressinband=no useragent=LibroA2Billing promiscredir=no dtmfmode = rfc2833 videosupport=yes maxcallbitrate=384 callevents=yes alwaysauthreject=yes rtptimeout=60 rtpholdtimeout=300 allowsubscribe=yes subscribecontext=subscribe notifyringing=yes notifyhold=yes callcounter = yes t38pt_udptl = yes,fec,maxdatagram=400 faxdetect=yes directmedia=no sdpsession=A2Billing sdpowner=a2billing externaddr=IPservidor localnet=192.168.146.0/255.255.255.0 Antes de guardas los cambio, personalizar las siguientes Lineas: • • •
useragent: nombre que se quiere dar a la PBX externaddr: IP publica del servidor localnet: rango de IP locales en el caso en que en el servidor se haya configurado la IP privada (como es el caso del VPS Linode)
Siempre en el mismo archivo se añaden los datos para configurar las troncales. En este caso se crean dos de ejemplo con el mismo proveedor; una utilizando un servidor/dominio, otra utilizando otro 48
servidor/dominio de respaldo. En las dos la autenticación será con usuario y contraseña. Para un sistema en producción configurar las troncales de sus proveedores). Si quieren utilizar una cuenta de prueba, pueden abrir una con la empresa VozToVoice. Recibirán un dólar de crédito para las pruebas. [voztovoice1] type=peer port=5060 host=sip.voztovoice.eu defaultuser=usuario fromuser=usuario secret=contraseña dtmfmode=rfc2833 disallow=all context=from-trunk canreinvite=no allow=ulaw allow=alaw qualify=yes [voztovoice2] type=peer port=5060 host=sip1.voztovoice.eu defaultuser=usuario fromuser=usuario secret=contraseña dtmfmode=rfc2833 disallow=all context=from-trunk canreinvite=no allow=ulaw allow=alaw qualify=yes • • •
defaultuser: nombre de usuario de la cuenta creada fromuser: nombre de usuario de la cuenta creada secret: contraseña asociada al nombre de usuario de la cuenta creada
En el caso que el proveedor permita la autenticación sobre IP, un ejemplo típico y bastante general de configuración sería: [voztovoice1] type=peer qualify=yes host=sip.voztovoice.eu disallow=all allow=g729,alaw 49
nat=no Para terminar, se incluye el archivo que se ha creado en el primer párrafo y que contendrá las extensiones creadas en A2Billing en el caso en que no se utilice el Realtime: #include additional_a2billing_sip.conf Se guardan los cambios y se hace lo mismo con el archivo iax.conf en el caso en que se quiera configurar también extensiones IAX2 (no recomendado): echo "#include additional_a2billing_iax.conf" >> /etc/asterisk/iax.conf 3.3.2 extensions.conf Se sigue con el dialplan. Se renombra el archivo extensions.conf predefinido: mv /etc/asterisk/extensions.conf /etc/asterisk/extensions.conf.old Se crea uno nuevo: nano /etc/asterisk/extensions.conf se pegan las lineas que siguen: [general] static = yes writeprotect = no autofallthrough = yes extenpatternmatchnew = true clearglobalvars = no userscontext=default [globals] ; Variables globales y se incluye el contexto para las llamadas con el AGI de a2billing: [a2billing] exten => _X.,1,NoOp(A2Billing Start) same => n,Agi(a2billing.php,1) same => n,Hangup exten => h,1,Hangup Si se quisiera brindar la posibilidad de marcar los números como se haría en el país de la empresa/clientes (en este caso Colombia), se añaden los tres bloques que siguen: [colombia] 50
exten => _09[12,4-9]XXXXXXX,1,NoOp(Llamadas a Fijos de Colombia con 09) same => n,Goto(a2billing,57${EXTEN:2},1) same => n,Hangup exten => _[12,4-9]XXXXXXX,1,NoOp(Llamadas a Fijos de Colombia sin) same => n,Goto(a2billing,57${EXTEN:2},1) same => n,Hangup exten => _3XXXXXXXXX,1,NoOp(Llamadas a Celulares de Colombia) same => n,Goto(a2billing,57${EXTEN},1) same => n,Hangup Se guardan los cambios y se averigua que efectivamente el dialplan englobado esté presente. Se entra en la consola de Asterisk: asterisk -rvvvvvvvvvvvvvv se recarga el dialplan: CLI> dialplan reload aparecerán muchas lineas porque hay partes de dialplan escritas en otros lenguajes que son leídas por Asterisk. Si no se van a utilizar, es mejor desactivar los respectivos módulos. Se sale de la consola de Asterisk: CLI> quit Se abre el siguiente archivo: nano /etc/asterisk/modules.conf y al final se añaden las lineas que siguen: noload => pbx_lua.so noload => pbx_ael.so Se guardan los cambios y se reinicia Asterisk y luego el sistema de callback: service asterisk restart service a2b-callback-daemon restart Se revisa uno de los contextos recien creados. Para acceder a la consola de Asterisk se utiliza el alias creado a lo largo del párrafo 1.3: aste CLI> dialplan show a2billing 51
debe aparecer: [ Context 'a2billing' created by 'pbx_config' ] 'h' => 1. Hangup() [pbx_config] '_X.' => 1. NoOp(A2Billing Start) [pbx_config] 2. Agi(a2billing.php,1) [pbx_config] 3. Hangup() [pbx_config] -= 2 extensions (4 priorities) in 1 context. =CLI> quit Se sale de la consola de Asterisk. 3.3.3 Asterisk Realtime Las extensiones creadas a través del sistema de facturación se guardarán en la base de datos de A2Billing. Para que Asterisk las pueda leer y actualizar, hay que configurar Asterisk utilizando su funcionalidad, llamada Realtime, que le permite interaccionar con base de datos para la configuración, en este caso, de las extensiones SIP e IAX. En este libro la configuración se realizará utilizando ODBC en lugar de utilizar directamente MySQL. Esto con el objetivo de obtener un mejor rendimiento y una más alta estabilidad. El primer paso es configurar ODBC para la conexión a MySQL: mv /etc/odbcinst.ini /etc/odbcinst.old nano /etc/odbcinst.ini se añaden las siguientes lineas: [MySQL] Description = ODBC for MySQL Driver = /usr/lib64/libmyodbc5.so Setup = /usr/lib64/libodbcmyS.so FileUsage = 1 Se guardan los cambios y se continua con la conexión a la base de datos a2billing: nano /etc/odbc.ini se añaden las siguientes lineas: [a2billing] Description = MySQL a2billing 52
Driver = MySQL Database = a2billing Server = localhost User = a2user Password = sesamo Port = 3306 Option = 3 Se guardan los cambios y se prueba la conexión utilizando los datos configurados en odbc.ini (base de datos, usuario, contraseña del usuario): isql a2billing a2user sesamo Tiene que aparecer: +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ SQL> Para salir: SQL> quit Se pasa a Asterisk. En la PBX la configuración Realtime con ODBC se efectúa en dos archivos: • •
extconfig.conf res_odbc.conf
El el primero se define que las extensiones SIP e IAX deberán ser configuradas en Realtime utilizando ODBC y la base de datos a2billing: nano /etc/asterisk/extconfig.conf se modifican estas lineas: ;iaxusers => odbc,asterisk ;iaxpeers => odbc,asterisk ;sippeers => odbc,asterisk para que queden:
53
iaxusers => odbc,a2b,cc_iax_buddies iaxpeers => odbc,a2b,cc_iax_buddies sippeers => odbc,a2b,cc_sip_buddies Se guardan los cambios. cc_iax_buddies y cc_sip_buddies son las tablas de la base de datos A2billing donde están guardadas las extensiones creadas en el sistema de facturación. A2b es el nombre de la etiqueta que se configurará en el archivo res_odbc.conf. Para terminar se configura el archivo res_odbc.conf: nano /etc/asterisk/res_odbc.conf al final del archivo se añaden las siguientes lineas: [a2b] enabled => yes dsn => a2billing username => a2user password => sesamo pre-connect => yes sanitysql => select 1 idlecheck => 3600 connect_timeout => 10 La conexión funciona de la siguiente manera. En el archivo extconfig.conf se define la conexión a la base de datos utilizando el nombre que aparece como etiqueta del bloque presente en el archivo res_odbc.onf (en este caso el nombre es a2b). En el archivo res_odbc.conf en el parámetro dsn se pone el nombre de la etiqueta del bloque configurado en el archivo odbc.ini (a2billing). En el archivo odbc.ini se define la conexión a la base de datos MySQL (en este caso la base de datos se llama a2billing). Se reinicia Asterisk, el sistema de callback y se averigua que la conexión esté funcionando: /etc/init.d/asterisk restart service a2b-callback-daemon restart asterisk -rvvvvvvvvvvvvvvvvv CLI> odbc show la respuesta debe ser: ODBC DSN Settings ----------------Name: a2b DSN: a2billing Last connection attempt: 1969-12-31 19:00:00 54
Pooled: No Connected: Yes Se sale de la consola de Asterisk: CLI> quit 3.4 Configuración del Firewall Para proteger el servidor Linux de accesos no autorizados hay que instalar un firewall (cortafuegos) y abrir los puertos que A2Billing necesita para aceptar conexiones externas. 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. En el caso del VPS Linode se instalará y Configurará IPtables. Si A2Billing 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. Configurar una DMZ en el router y luego gestionar los puertos directamente con IPtables
Para instalar iptables: yum install iptables -y IPtables se encarga de gestionar todos los paquetes que entren y salgan del servidor Linux. Para eso se utilizan tres tipos de tablas: •
la tabla filter donde pasan todos los paquetes en entrada y salida. 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 y/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 vengan 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, todas las reglas aplicarán a la tabla filter. Se acepta todo el trafico en entrada con destino la interfaz lookpack: iptables -A INPUT -i lo -j ACCEPT Se rechaza (REJECT) todo el trafico entrante con destino las IP 127.0.0.0/127.255.255.255 menos los 55
paquetes para la interfaz -lo: iptables -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT Se aceptan todos los paquetes en entrada de conexiones ya establecidas, o relacionados con conexiones establecidas. Véase protocolo TCP: iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT Se dejan pasar todos los paquetes salientes: 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 para el protocolo SMTP (puerto 25 tcp) solamente si se ha configurado el acceso desde remoto al programa SendMail: iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT Se deja pasar todo el trafico en entrada para el protocolo HTTP (puerto 80 tcp): iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT Se deja pasar todo el trafico en entrada para el protocolo HTTPs (puerto 443 tcp): iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT Se deja pasar todo el trafico en entrada destinado al puerto udp 4569 (protocolo IAX2); Solamente si se va a utilizar el protocolo IAX2: iptables -A INPUT -p udp --dport 4569 -j ACCEPT Se bloquea el trafico sobre el puerto 5060 para los más conocidos programas de escaneo de servidores SIP utilizados para ataques y fraudes de llamadas: iptables -A INPUT -p udp -m udp --dport 5060 -m string --string "friendly-scanner" --algo bm -j DROP
iptables -A INPUT -p udp -m udp --dport 5060 -m string --string "sipcli" --algo bm -j DROP iptables -A INPUT -p udp -m udp --dport 5060 -m string --string "VaxSIPUserAgent" --algo bm -j DROP
iptables -A INPUT -p udp -m udp --dport 5060 -m string --string "sipvicious" --algo bm -j DROP iptables -A INPUT -p udp -m udp --dport 5060 -m string --string "sundayddr" --algo bm -j DROP
56
iptables -A INPUT -p udp -m udp --dport 5060 -m string --string "iWar" --algo bm -j DROP iptables -A INPUT -p udp -m udp --dport 5060 -m string --string "sipsak" --algo bm -j DROP Solamente ahora se deja pasar todo el trafico en entrada destinado al puerto udp 5060 (protocolo SIP) utilizado por Asterisk: iptables -A INPUT -p udp --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, ya que se han definido los puertos base que se necesitan abiertos, se bloquea todo el trafico restante. iptables -A INPUT -j REJECT iptables -A FORWARD -j REJECT Se averigua el estado de las reglas definidas con el comando: iptables -L -v Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source 0 0 ACCEPT all -- lo any anywhere 0 0 REJECT all -- !lo any anywhere unreachable 88 11870 ACCEPT all -- any any anywhere RELATED,ESTABLISHED 0 0 ACCEPT tcp -- any any anywhere 0 0 ACCEPT tcp -- any any anywhere 0 0 ACCEPT tcp -- any any anywhere 0 0 ACCEPT tcp -- any any anywhere 0 0 ACCEPT udp -- any any anywhere 0 0 DROP udp -- any any anywhere "friendly-scanner" ALGO name bm TO 65535 0 0 DROP udp -- any any anywhere "sipcli" ALGO name bm TO 65535 0 0 DROP udp -- any any anywhere "VaxSIPUserAgent" ALGO name bm TO 65535 57
destination anywhere loopback/8 anywhere
reject-with icmp-portstate
anywhere anywhere anywhere anywhere anywhere anywhere
state NEW tcp dpt:hydap state NEW tcp dpt:smtp state NEW tcp dpt:http state NEW tcp dpt:https udp dpt:iax udp dpt:sip STRING match
anywhere
udp dpt:sip STRING match
anywhere
udp dpt:sip STRING match
0 0 DROP udp -- any any anywhere "sipvicious" ALGO name bm TO 65535 0 0 DROP udp -- any any anywhere "sundayddr" ALGO name bm TO 65535 0 0 DROP udp -- any any anywhere "iWar" ALGO name bm TO 65535 0 0 DROP udp -- any any anywhere "sipsak" ALGO name bm TO 65535 0 0 ACCEPT udp -- any any anywhere 0 0 ACCEPT udp -- any any anywhere 0 0 ACCEPT icmp -- any any anywhere 0 0 REJECT all -- any any anywhere unreachable
anywhere
udp dpt:sip STRING match
anywhere
udp dpt:sip STRING match
anywhere
udp dpt:sip STRING match
anywhere
udp dpt:sip STRING match
anywhere anywhere anywhere anywhere
udp dpt:sip udp dpts:ndmp:dnp icmp echo-request reject-with icmp-port-
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 REJECT all -- any any anywhere anywhere unreachable
reject-with icmp-port-
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 71 13822 ACCEPT all -- any any anywhere anywhere Para guardar los cambios: service iptables save iptables: Guardando las reglas del cortafuegos en /etc/sysconfig/iptables [ OK ] Se inicia el servicio: service iptables start Para iniciar IPtables automáticamente: chkconfig iptables on Se configura el inicio automático también para el servidor Web: chkconfig httpd on Ahora que se ha terminado con la configuración del servidor y de A2Billing se reinicia el sistema para averiguar que todos los servicios arranquen correctamente: reboot
58
3.5 Primer acceso Reiniciado el servidor se vuelve a entrar con el cliente SSH y se accede a la consola de Asterisk: asterisk -rvvvvvvvvvvvvvv desde un navegador web se entra a la pagina de administración de A2Billing: http://IPservidor/admin o la pagina segura (mejor). Más adelante veremos como instalar un certificado para el servidor Web utilizando la autoridad de certificación Let's Encrypt: https://IPservidor/admin Debe aparecer:
Los datos por defecto para acceder son: User: root Password: changepassword Lo primero que hay que hacer es crear un nuevo administrador y borrar el predefinido. Se entra en el menú ADMINS y luego en “Add Search”:
En la pagina que aparece se escoge “ADD Administrator”. En la nueva pagina se rellenan los campos indicados (personalizar):
59
Se guardan las modificaciones presionando el botón “Confirm Data”. Se regresará a la pagina anterior y ya se podrá borrar el usuario root:
y confirmando con el botón “DELETE” en la pagina siguiente:
60
Ya se puede salir del programa:
y volver a entrar con los datos del nuevo administrador:
61
Capitulo IV Configuración base A2Billing Una vez en la pagina de administración de A2Billing, se tendrán disponibles dos bloques de menú. Uno en la parte de arriba de la pagina:
• •
•
HOME: para volver a la pagina de inicio de A2Billing DASHBOARD: es una pagina compuesta de distintos bloques: • ACCOUNT INFO: informaciones relacionadas con las cuentas de los clientes • REFILLS INFO: informaciones sobre las recargas realizadas • CALL INFO TODAY: informaciones sobre las llamadas, costes y ganancias • SYSTEM INFO: informaciones del sistema • PAYMENTS INFO: informaciones de los pagos realizados por los clientes • LATEST NEWS: un canal de noticias gestionado por los desarrolladores de A2Billing donde se pueden leer las ultimas novedades relacionadas con los programas. NOTIFICATION: es este bloque aparecerá la palabra “New” cada vez que se verifique un determinado evento. Ejemplos: • Se ha registrado un nuevo usuario • Se ha creado un nuevo tiquete de soporte • Un revendedor ha solicitado el pago de su comisión
Uno en la parte derecha:
La parte más tediosa y al mismo tiempo más importante de la configuración de A2Billing es la que tiene que ver con las variables globales del sistema de facturación. A través de estas variables se configuran, entre otras cosas, el sistema de pago, el callback (rellamada), la interfaz del cliente y algunos datos de configuración de Asterisk. Para simplificar esta parte, se presentarán las variables como aparecen en los distintos grupos del menú “SYSTEM SETTINGS” de A2Biling. La configuración inicial que se adoptará es para un sistema Wholesale, es decir para la venta de trafico telefónico a clientes y revendedores. En el capitulo V dedicado a la configuración avanzada, se verá como configurar A2Billing como sistema de tarjetas telefónicas; este tipo de configuración se utiliza normalmente a través de números de acceso telefónicos. 4.1 System Settings Desde la pagina de administración de A2Biling se selecciona el menú “System Settings” y luego “Global List” come aparece en la imagen que sigue:
En la nueva pagina se empieza la configuración escogiendo en el menú desplegable “Global” y presionando el Botón “Search”:
64
Aparecerá la lista de las variables globales. En la tabla que sigue el significado de cada una y el valor a configurar. En negrita las variables que hay que modificar. Titulo
Valor
Descripción
Card Number length
5-20
Longitud numérica de la Tarjeta de llamada que es también el PIN che se utilizará con la configuración de tarjetas telefónicas de llamadas.
Card Alias length
5
Longitud Alias tarjeta. El alias lo utiliza el cliente para acceder a su pagina personal y para las llamadas entre clientes configurados en A2Billing
Voucher length
15
Longitud de los Voucher. Los voucher se utilizan para recargar las cuentas de los clientes
Base Currency
usd
Moneda predefinida (en este caso dolares estadounidenses)
Invoice Image
asterisk01.jpg
Logo para las facturas (no aplica). Se verá más adelante como se configura correctamente.
Admin Email
[email protected]
e-Mail del administrador del sistema (personalizar con una cuenta real).
7
Días disponibles para renovar un DID antes de eliminarlo de la cuenta del cliente.
Manager Host
localhost
Host/IP para conectarse a la AMI de Asterisk
Manager User ID
asterisk
Usuario para la conexión a la AMI de Asterisk (como se ha configurado en el archivo manager.conf)
DID Billing Days to pay
65
Titulo
Valor
Descripción
Manager Password
sesamo
Contraseña para la conexión a la AMI de Asterisk (como se ha configurado en el archivo manager.conf)
Use SMTP Server
no
Se utiliza el servidor de correo electrónico interno en lugar de un servidor externo.
localhost
Dirección IP o nombre de dominio del servidor de correo electrónico. En este caso se utilizará Sendmail instalado en el sistema
SMTP Host
SMTP UserName
Se deja en blanco
SMTP Password
Se deja en blanco
Use Realtime
Go To Customer
yes
Se usará Asterisk Realtime para guardar la configuración de las extensiones SIP/IAX2 en una base de datos
https://IPservidor/customer
URL pagina clientes (en lugar de IPservidor poner la IP del servidor asignado). Este parámetro permite acceder a la cuenta del cliente directamente desde la pagina de administración de A2Billing.
SMTP Secure
Para enviar los correos electrónicos no se utilizará una conexión segura. Esto porque el servidor reside en el mismo servidor Linux.
SMTP Port
25
Server GMT
GMT-05:00
Invoice Template Path Outstanding Template Path Sales Template Path Enable CDR local cache
66
../invoice/
Puerto del servidor de correo electrónico. Predefinido 25 Zona horaria (para Colombia) Plantilla para facturas
../outstanding/
Carpeta de las plantillas para facturas pendientes
../sales/
Carpeta de las plantillas para facturas pagadas
No
Se activa en el caso se quiera guardar los datos de las llamadas
Titulo
Valor
Descripción en una base de datos SQLite
Path for the CDR cache file
/etc/asterisk/cache_a2billing
Archivo donde se guardarían los datos de las llamadas en el caso se utilice una base de datos SQLlite
COL
País de la empresa (personalizar)
Base Country Base Language
es
Asterisk Version Global Days to bill anniversary
before
1_11 month
3
Idioma predefinido del sistema Versión de Asterisk No aplica
En el caso en que se quiera utilizar un servidor de correo electrónico externo en lugar del SENDMAIL, los parámetros que hay que cambiar son (para Gmail): Use SMTP Server
Yes
SMTP Host
smtp.gmail.com
SMTP UserName
[email protected]
SMTP Password
password
SMTP Secure
ssl
SMTP Port
465
Se sigue con callback. En este menú se configura todo lo relacionado con el sistema de rellamada de A2Billing:
Titulo
Valor
Descripción
Context Callback
a2billing-callback
Contexto que hay que configurar en el dialplan de Asterisk para la rellamada
Extension
1000
Extensión que el sistema utilizará en una llamada de
67
callback Wait before callback
10
Segundos que el sistema esperará antes de iniciar la rellamada
Avoid Repeat Duration
30
Numero de segundos antes que una rellamada pueda ser enviada nuevamente desde la pagina Web del cliente
Time out
60
Si dentro de 20 segundos la rellamada no se establece, se considera terminada sin éxito
Answer on Call
No
Para gestionar la respuesta de una rellamada se pone en no. De esta forma la segunda llamada no se iniciará hasta que la primera no sea contestada.
No of Predictive Calls
10
Numero de llamadas que se lanzan cuando un Agente presiona el botón de llamada (no aplica)
Delay for Availability
1
Numero de días para que un numero llamado sea nuevamente disponible en una campaña (no aplica)
PD Context
a2billing-predictivedialer
Contexto que hay que configurar en el dialplan de Asterisk para el sistema de llamadas automático (no aplica)
Max Time to call
5400
Numero máximo de segundos de duración de una llamada generada con el sistema predictivo (no aplica)
PD Caller ID
123456
Identificador de llamada saliente para las rellamadas y las campañas (personalizar)
Callback CallPlan ID
1
El ID del Callplan que se utilizará para las rellamadas
Server Group ID
1
Para las rellamadas se puede configurar más de un grupo de servidores Asterisk. Si se utiliza solamente uno se pone la ID del grupo como aparece en el menú CALLBACK → Server Group.
68
Si se utiliza más de un grupo de servidores se indican los ID separados por un coma. Audio Intro
prepaid-callback_intro
Locución que se escuchará cuando se inicia una rellamada
Context Campaign's Callback
a2billing-campaign-callback
Contexto para la rellamadas de una campaña (no aplica)
Default Context forward Campaign's Callback
campaign
Contexto donde transferir las llamadas de una campaña (no aplica)
Terminada la configuración de este grupo se continua con webcustomerui:
Titulo
Valor
Return URL distant Forget Password
Se puede indicar una dirección Web donde enviar el usuario si se ha presentado un problema con la recuperación de la contraseña.
WebPhone Server
localhost
Antes en la pagina personal de los clientes, había un webphone que se podía utilizar para realizar llamadas. Ya no está presente
CallerID Limit
5
Numero máximo de identificativos de llamada que un cliente puede configurar en su cuenta
Return URL distant Login
Notifications Modules
69
Descripción
Se puede indicar una dirección Web donde enviar el usuario si se ha presentado un problema durante el acceso. Yes
Visualiza un menú que permite al cliente configurar una alerta cuando su crédito está por debajo del valor definido
Se sigue con sip-iax-info donde se define la configuración de los parámetros de configuración de la cuenta SIP que los clientes pueden ver en su pagina personal y que les permite configurar su teléfono SIP/IAX2 o su PBX:
Titulo
Valor
Descripción
Trunk Name
a2billing
Nombre de la troncal como aparecerá al cliente (personalizar con el nombre de su empresa, por ejemplo)
Codecs Allowed
alaw,ulaw
Codec audio disponibles para los clientes
Host
li403-112.members.linode.com Nombre de dominio del servidor. El nombre de dominio es preferible a la IP del servidor porque si en cualquier momento se traslada la instalación del servidor, con solo modificando los DNS, será posible asociar el dominio a la nueva IP (en el caso de Linode)
IAX Parms
canreinvite = no
Parámetros adicionales para IAX
SIP Parms
trustrpid = yes | sendrpid = yes | canreinvite = no
Parámetros adicionales para SIP
Para los últimos dos parámetros el cambio hay que realizarlo directamente desde la base de datos ya que en la ultimas versiones de A2Billling se han implementado toda una serie de controles de seguridad que no permiten modificar parámetros donde aparezcan caracteres especiales (en este caso el símbolo de =). se accede a MySQL: mysql -u root -psesamo se selecciona la base de datos a2billing:
70
mysql> use a2billing y se modifican los dos parámetros finales del grupo: mysql> update cc_config set config_value='directmedia = yes' where id='54'; mysql> update cc_config set config_value='trustrpid = yes | sendrpid = yes | directmedia = yes ' where id='55'; Se sale de cliente MySQL: mysql> quit Se continua con epayment_method donde se configuran todos los parámetros relacionados con los métodos de pago disponibles. En esta parte se configuran también los accesos a las paginas seguras del portal de los clientes.
Titulo Enable
Valor Yes
HTTP Server Customer
Descripción Se activa el modulo de pago que permite a los clientes efectuar recargas directamente desde su pagina personal utilizando distintos métodos de pago (ej: PayPal) En producción se deja el parámetro en blanco. Se utiliza solamente la Web segura
HTTPS Server Customer
https://IPservidor
Se pone la IP del servidor asignado y la carpeta donde se encuentra a2billing
Server Customer IP/Domain
IPservidor
Dirección IP servidor asignado
Secure Server Customer IP/Domain
IPservidor
Dirección IP servidor asignado
Application Customer Path
/customer/
Carpeta web clientes
Secure Application Customer Path
/customer/
Carpeta web clientes
71
Application Customer Physical Path
/customer/
Carpeta web clientes
Secure Application Customer Physical Path
/customer/
Carpeta web clientes
Enable SSL
Yes
Acceso seguro activado para el proceso de pago.
HTTP Domain
IPservidor
Dirección IP servidor asignado
Directory Path
/customer/
Carpeta web clientes
Payment Amount
5:10:20:25:50
Valores que los clientes pueden recargar en su cuenta (se pueden indicar hasta 5)
Item Name
Compra Recarga
Un nombre para la operación de recarga
Currency Code
USD
Moneda utilizada para los pagos (se puede personalizar)
Paypal Payment URL
https://www.paypal.com/cgibin/webscr
Gateway PayPal para los pagos
Paypal Verify URL
ssl://www.paypal.com
URL de verifica para PayPal
Authorize.NET Payment URL
https://secure.authorize.net/gate way/transact.dll
URL para los pagos con Authorize.Net
PayPal Store Name
LibroA2Billing
Nombre de la tienda que aparecerá al momento del pago con PayPal (personalizar)
Transaction Key
asdf1212fasd121554sd4f5s45sdf Clave de seguridad aleatoria para los pagos
Secret Word
Si para los pagos se utiliza Moneybookers (ahora Skrill), aquí hay que indicar la clave secreta de la cuenta
Payment Amount
100:200:500:1000
Valores que lo revendedores tienen disponibles para realizar recargas.
Charge for the paypal extra fees
Yes
Con No se asumen los gastos de las comisiones de PayPal. Con Yes se cobran a los clientes
PlugnPay Payment URL
https://pay1.plugnpay.com/paym URL para pagos con el servicio ent/pnpremote.cgi PlugnPay
HTTP Server Agent HTTPS Server Agent 72
En producción de deja en blanco https://IPservidor
Se pone la IP del servidor
asignado y la carpeta donde se encuentra a2billing Secure Server Agent IP/Domain
IPservidor
Dirección IP del servidor asignado
Application Agent Path
/agent/Public/
Carpeta web acceso revendedores
Secure Application Agent Path
/agent/Public/
Carpeta web acceso revendedores
Application Agent Physical Path /agent/Public/
Carpeta web acceso revendedores
Secure Application Agent Physical Path
/agent/Public/
Carpeta web acceso revendedores
Paypal Amount Subscription
10
PayPal permite pagos de forma recurrente. Este parámetro y los 4 que siguen permiten configurar este servicio.
Paypal Subscription Time period 1 number
Este numero es asociado al que sigue y se utiliza para definir cada cuanto tiempo se repite el pago recurrente.
Paypal Subscription Time period M
M = mes. En este caso se repite cada mes.
Enable PayPal subscription
Yes
No se habilitan los pagos recurrentes
Paypal Subscription account
[email protected]
Correo Electrónico para recibir pagos recurrentes en PayPal (personalizar)
En en próximo menú, signup, se configuran todos los parámetros relacionados con la creación de nuevos clientes. Es aquí que se define si los clientes se pueden registrar desde una pagina Web, que tipo de datos se les pedirá, que planes de llamadas pueden escoger y si se les regala un crédito de prueba inicial. A diferencia de los clientes, los revendedores no se pueden registrar por su cuenta. Solo los administradores pueden crear las cuentas de los revendedores.
73
Titulo
74
Valor
Descripción
Enable
Yes
Los clientes se pueden registrar desde una pagina Web
Captcha Security
Yes
Se añade un bloque de seguridad para evitar registros no deseados
Credit
1
Se le obsequia un dólar de crédito a cada nuevo cliente para que pueda probar las rutas
CallPlan ID List
1,2
Numero ID de los planes de llamadas que un cliente puede escoger al momento de registrarse
Card Activation
No
Las cuentas de los clientes tendrán que ser activadas por un administrador. Con yes se activarán automáticamente
Access Type
0
Con 0 se le brinda al cliente un canal (una llamada a la vez) con 1 más de un canal
Paid Type
0
Tipo de cuenta que se creará 0 = prepago 1= postpago
Credit Limit
0
Utilizado solo para tarjetas postpago. Indica el crédito disponible que tendrá cada nueva cuenta PostPago hasta que no se genere una nueva factura
Run Service
0
No se aplican cargos adicionales de forma predefinida
Enable Expire
0
Tarjeta. 0 = no se vence 1 = se vence
Date Format
DD-MM-YYYY HH:MM:SS
Fecha en que las nuevas cuentas creadas se vencen. El formato es: YYYY-MM-DD HH:MM:SS Ejemplo: 2030:12:31 00:00:01. Se deja vacío.
Expire Limit
0
Numero de días después de los cuales la tarjeta se vence. 0 = nunca
Create SIP
Yes
Se creará una cuenta SIP
Create IAX
No
No se creará una cuenta IAX de forma predefinida
Activate Card
No
Para confirmar la cuenta, el
75
cliente recibirá un correo electrónico con un enlace para que demuestre que es dueño del correo electrónico indicado al momento del registro. Si es Yes se activa sin confirmación Customer Interface URL
https://IPservidor/customer/
Dirección web que aparecerá al cliente una vez que se haya registrado. Modificar IPServidor con la IP asignada
Asterisk Reload
No
Como las extensiones SIP se guardan en una base de datos no hace falta recargar la configuración de Asterisk una vez creada la cuenta
Language field
Yes
El cliente puede escoger el idioma
Currency field
Yes
El cliente puede escoger el tipo de moneda
Last Name Field
Yes
Se le pedirá el apellido
First Name Field
Yes
Se le pedirá el nombre
Address Field
Yes
Se le pedirá la dirección
City Field
Yes
Se le pedirá la ciudad
State Field
Yes
Se le pedirá la región/departamento
Country Field
Yes
Se le pedirá el País
Zipcode Field
No
No se le pedirá el código Postal
Timezone Field
Yes
Podrá escoger la zona horaria
Phone Field
Yes
Se le pedirá el teléfono
Fax Field
No
No se le pedirá el numero del FAX
Company Name Field
No
No se le pedirá el nombre de su compañía
Company Website Field
No
Ni la Web
VAT Registration Number Field
No
Ni el numero para el pago de impuestos de la empresa
Traffic Field
No
No se le mostrará el campo para definir el tipo de trafico que tiene planeado hacer
76
Traffic Target Field
No
Sobre que tipo de destinaciones
Si se quiere efectuar una primera prueba, en una nueva pestaña del navegador, se pone la siguiente dirección (sostituir IPServidor con la IP de su servidor Linode o servidor local): https://IPservidor/customer y cuando aparece esta pagina:
Se presiona el enlace en la linea “To sign up Click here”. Aparecerá la pagina para registrarse: Como se puede ver, a los nuevos clientes se les pedirán solamente los datos que se acaban de configurar en el menu “signup”. Como faltan algunas partes de la configuración de A2Billing, el cliente no puede todavía registrarse.
77
Se regresa a la pestaña del navegador donde se estaba anteriormente configurando A2Billing y se continua con el menú backup. En este menú se configurarán todos los parámetros relacionados con las copias de seguridad de la base de datos a2billing y con el archivo de los registros de las llamadas.
Titulo
Valor
Descripción
Backup Path
/tmp
Carpeta donde se guardarán las copias de backup de la base de datos a2billing
GZIP Path
/bin/gzip
Posición del programa gzip
GunZip Path
/bin/gunzip
Posición del programa gunzip
MySql Dump Path
/usr/bin/mysqldump
Posición del programa
78
mysqldump PGSql Dump Path
/usr/bin/pg_dump
Posición del programa pg_dump
MySql Path
/usr/bin/mysql
Posición del programa MySQL
PSql Path
/usr/bin/psql
Posición del programa PostgreSQL
Archive Calls
12
Los archivos de las llamadas anteriores a los 12 meses se archivarán en otra tabla de la base de datos “a2billing” y no podrán ser consultados más por los clientes. En el caso que el sistema tenga mucho trafico, es aconsejado bajar este valor a 6 meses
Se sigue con el menú webui donde se configuran, entre otras cosas, la grabación de las llamadas, la música de espera personalizada, como exportar algunos tipos de datos en archivos con formato CSV y la configuración de la venta de DID en el caso se tenga una cuenta con el proveedor DIDX.net, que el único proveedor de números geográficos cuyas API están implementadas en A2Billing.
Titulo
Valor
Descripción
SIP File Path
/etc/asterisk/additional_a2billing_sip.conf Carpeta y nombre del archivo donde se guardarán las extensiones SIP creadas en A2Billing si no se utiliza el Asterisk Realtime
IAX File Path
/etc/asterisk/additional_a2billing_iax.conf Como el anterior para las extensiones IAX2
API Security Key
Ae87v56zzl34v
A2billing suporta unas API para consultas web. Esta es la clave para utilizar las API.
Authorized IP
127.0.0.1
Direcciones IP que
79
pueden acceder a las API (separadas con un punto y coma). En esta caso solamente localhost o 127.0.0.1 Admin Email
[email protected]
Correo electrónico del administrador (personalizar)
MOH Directory
/var/lib/asterisk/mohmp3
Carpeta para la música de espera personalizada (No aplica)
MOH Classes
10
Clases de música en espera que se utilizarán. (No aplica).
Display Help
No
No se mostrarán las ayudas en las paginas de A2Billing
Max File Upload Size
8192000
Tamaño máximo (en Byte) de los archivos de las tarifas que se cargan en A2Billing. En el caso que se quiera aumentar el valor, hay que modificar este parámetro: upload_max_filesize en el archivo de configuración de PHP (php.ini) que se encuentra en la carpeta /etc. Una vez efectuado el cambio hay que reiniciar el servidor Web. service httpd restart
Audio Directory Path
/var/lib/asterisk/sounds/a2billing
No se utiliza (obsoleto)
Max Audio File Size
8192000
Tamaño máximo de los archivos audio que se podrán cargar en el sistema
Extensions Allowed
gsm, mp3, wav
Formatos audio permitidos
Music Files Allowed
mp3
Formato audio de los archivos musicales cargados para la música
80
de espera. Link Audio
No
No se creará un enlace en los registros de las llamadas a los archivos de las llamadas grabadas
Monitor Path
/var/spool/asterisk/monitor
Carpeta donde se guardarán las llamadas grabadas
Monitor Format
gsm
Formato audio de las llamadas grabadas
Currency
usd, eur, cad, hkd
Monedas predefinidas brindadas a los clientes
Card Export Fields
card.id, username, useralias, lastname, Si se exportan las tarjetas credit, tariff, activated, language, inuse, de los clliente en un currency, sip_buddy, iax_buddy archivo CSV, estos son los campos que aparecerán en el archivo exportado.
Voucher Export Fields
voucher, credit, tag, activated, usedcardnumber, usedate, currency
Campos exportados de los vouchers
Advance Mode
No
Si activado se mostrarán campos adicionales en la creación de los RATECARD
SIP/IAX Delete
Yes
Cuando se elimina un cliente, automáticamente se borrarán las extensiones SIP/IAX2 asociadas.
Card Show Fields
id:,username:, useralias:, lastname:,id_group:, id_agent:, credit:, tariff:, status:, language:, inuse:, sip_buddy:, iax_buddy:, nbused:,
Orden de los campos mostrados en la pagina de administración de los clientes
PNL Pay Phones
(8887798764,0.02,0.06)
Para crear reportes de llamadas a números de pago, se puede indicar aquí los números completos (o solamente el prefijo) y el costo de compra y de venta
PNL Toll Free Numbers
(6136864646,0.1,0),(6477249717,0.1,0)
Lo mismo para los números gratuitos
81
DIDX ID
708XXX
Si se dispone de una cuenta con DIDx, aquí se indica la ID de la cuenta (para la compra de los números geográficos)
DIDX PASS
XXXXXXXXXX
En este parámetro se indica la contraseña de la cuenta DIDX.net
DIDX MIN RATING
3
El rating mínimo (calidad) que tiene que tener el vendedor del DID según la clasificación de DIDX (de 1 a 5)
DIDX RING TO
didx
Extensión donde enviar las llamadas entrantes de los números adquiridos con DIDX
Card Serial Pad Length
3
Números de 0 de relleno para las tarjetas creadas como pertenecientes a una serie. Si se pone 3 el resultado será 001. Véase menú CUSTOMERS → Card Series
Rate Export Fields
destination,dialprefix,buyrate,rateinitial Campos de las tarifas que ,initblock se exportará en el archivo CSV
El el próximo menú se configurarán algunos valores básicos de las extensiones. Estos valores serán los predefinidos cada vez que se creará una nueva extensión SIP y/o IAX
Titulo
Valor
Descripción
Type
friend
Puede ser user, peer y friend
Allow
alaw,ulaw
Codec audio permitidos
Context
a2billing
Contexto que por defecto será
82
asociado a cada extensión creada El mismo que se ha creado en el archivo extensions.conf y es donde llegará cualquier llamada efectuada por un cliente del sistema. Nat
force_rport,comedia
Como la mayoría de las extensiones se conectarán desde remoto y detrás de un router, se pone NAT=force_rport,comedia (Desde la versión 11.X de Asterisk estos son los dos nuevos parámetros)
AMA Flag
billing
Parámetro que se guardará en los registros de las llamadas y identificará todas las llamadas efectuadas utilizando A2Billing
Qualify
no
En Asterisk Realtime este parámetro se pone en no
Host
dynamic
Para extensiones remotas sin autenticación sobre IP
DTMF Mode
RFC2833
Protocolo para el envío de los tonos (DTMF) a lo largo de una llamada
En el menú log-files se definen los nombres de todos los archivos donde se guardarán los distintos tipos de registros relacionados con la actividad de A2Billing. No se necesita ningún tipo de cambio ya que así se han definidos durante la instalación de A2Billing. Se presentan solamente para tener un cuadro completo de la configuración de A2Billing.
Titulo
Valor
Alarm Log File
/var/log/a2billing/cront_a2b_alarm.log
Auto refill Log File
/var/log/a2billing/cront_a2b_autorefill.log
Bactch Process Log File
/var/log/a2billing/cront_a2b_batch_process.log
83
Descripción
Archive Log File
/var/log/a2billing/cront_a2b_archive_data.log
DID Billing Log File
/var/log/a2billing/cront_a2b_bill_diduse.log
Subscription Fee Log File /var/log/a2billing/cront_a2b_subscription_fee.log Currency Cront Log File
/var/log/a2billing/cront_a2b_currency_update.log
Invoice Cront Log File
/var/log/a2billing/cront_a2b_invoice.log
Cront Log File
/var/log/a2billing/cront_a2b_check_account.log
Paypal Log File
/var/log/a2billing/a2billing_paypal.log
EPayment Log File
/var/log/a2billing/a2billing_epayment.log
ECommerce Log File
/var/log/a2billing/a2billing_api_ecommerce_request.log
Callback Log File
/var/log/a2billing/a2billing_api_callback_request.log
Webservice Card Log File /var/log/a2billing/a2billing_api_card.log AGI Log File
/var/log/a2billing/a2billing_agi.log
La parte más importante de la configuración de A2Billing es el menú agi-conf1 donde se definirán todos los parámetros que utilizará el AGI de A2Billing para las llamadas.
Titulo Call to free DID Command Params
Valor Dial ,60,L(%timeout%:61000:30000)
Descripción Opciones para la aplicación Dial de Asterisk para las llamadas a números geográficos configurados en el sistema por los cuales no se cobran las llamadas entrantes.
Description
Wholesale
Un nombre para este perfil
Asterisk Version
1_11
Versión de Asterisk utilizada
Answer Call
No
El AGI no contestará la llamada
Play Audio
No
Se deshabilita el utilizo de las locuciones audio
Say GoodBye
No
No se utilizará la locución Goodbye al terminar una
84
Titulo
Valor
Descripción llamada
Play Language Menu
No
No se presentará el IVR para escoger el idioma
Force Language
Fuerza el uso de un idioma para las locuciones. No aplica para Wholesale
Intro Prompt
Locución de personalizada.
introducción
Min Call Credit
0.5
Crédito mínimo para iniciar una llamada. Ayuda a no tener saldos negativos
Min Bill Duration
0
Duración mínima para que la llamada sea cobrada. 0 = se cobra a partir del momento en que es contestada.
Not Enough Credit
No
Con yes; si el cliente no tiene suficiente crédito en la tarjeta que está utilizando, se le permitirá seleccionar otra. No, no se le permite
New Caller ID
No
Si el precedente parámetro está en Yes y este parámetro también, se asocia el CallerID del cliente a la nueva tarjeta
Use DNID
Yes
Con Yes: si la variable DNID contiene el numero marcado (en Asterisk es así), al cliente no se le pide que ingrese el numero a marcar
Not Use DNID
2400,2300
Lista de números que si marcados enviarán la llamada a la locución que solicitará el numero a marcar seguido de la tecla numero aunque el parámetro anterior esté configurado con Yes.
Try Count
1
Numero de intentos permitidos al cliente para marcar un numero (para Wholesale tiene que ser 1)
85
Titulo
Valor
Force CallPlan
Descripción Para forzar el utilizo de un Callplan determinado (no se utiliza en este caso)
Say Balance After Auth
No
No se anuncia el crédito disponible después de la autenticación
Say Balance After Call
No
No se anuncia el crédito disponible al terminar la llamada
Say Rate
No
No se anuncia el costo de la llamada
Say Duration
No
No se anuncia la duración máxima de la llamada en base al crédito disponible
Auto Set CLID
No
No se configura el CallerID en automático
Force CLID
CLID Sanitize
86
Si el parámetro anterior está en yes y este contiene un numero, ese numero se utiliza como identificativo de llamada para las llamadas salientes. CID
Si el parámetro anterior no está configurado, en este parámetro se configura cual numero se utilizará para el identificativo de las llamadas salientes del cliente: • NO: desactivado • CID: uno de los números configurados por el cliente como identificativos de llamada • DID: uno de los números geográficos adquiridos por el cliente • BOTH: el identificativo de llamada puede ser o un DID del cliente o uno de los números configurados por el cliente.
Titulo
Valor
Descripción
CLID Enable
No
No se autentica el cliente en base a su CallerID
Ask PIN
No
No se le pide al cliente de introducir su PIN
FailOver LCR/LCD Prefix
No
Si en un CallPlan están presentes dos tarifas distintas para terminar la llamada (ejemplo prefijos 573 y 57) y se llama a un celular de Colombia, el sistema intentará sacar la llamada con la primera tarifa (573). Si no tiene éxito, se intentará utilizar la segunda tarifa (57). Con No se desactiva esta funcionalidad
Auto CLID
No
Si el cliente no se puede autenticar con el CallerID se le pedirá su numero de tarjeta e automáticamente se asociará al numero de tarjeta el CallerId del teléfono de donde está llamando el cliente. Con NO se desactiva.
Auto CLID Security
No
Con yes se controla que el CallerID del cliente esté asociado con la tarjeta que está utilizando para la llamada.
SIP Call
No
Se habilita para permitir llamadas entre las extensiones SIP/IAX2 configuradas en el sistema y asociadas a los clientes.
SIP Call Prefix
555
Prefijo que hay que anteponer al numero de extensión SIP/IAX2 que se quiere llamar (funciona si SIP CALL = Yes)
Direct Call
No
Si se habilita no se presentará una locución para marcar un numero. Si este numero empieza por 555 la llamada sera cursada hacia la extensión
87
Titulo
Valor
Descripción SIP/IAX marcada; de otra forma se cursará normalmente
IVR Voucher Refill
No
Si está en Yes se permite recargar las tarjetas utilizando un voucher
IVR Voucher Prefix
8
Dígito a marcar desde el menú de tarjetas prepago para recargar la cuenta con un voucher
IVR Low Credit
No
Si está en Yes y el crédito disponible del cliente es menor que el valor definido en el parámetro “Min Call Credit”, se presentará en automático el IVR para recargar la tarjeta utilizando un voucher
Dial Command Params
,60,rL(%timeout%:61000:30000) Opciones para el comando Dial de Asterisk. La opción r que aparece en la linea genera un timbrado falso. En algunos dispositivos este timbrado puede generar problemas de facturación de la llamada. En esos casos, se quita la r de la linea de configuración del parámetro.
SIP/IAX Params
Dial
Command ,60,L(3600000:61000:30000)
Opciones para el comando Dial para llamadas entre extensiones:Duración máxima de este tipo de llamadas 3600000 mili segundos = 1 hora
Outbound Call
No
Forma de marcar el numero: No = SIP/Proveedor/numero – Yes = SIP/numero@IPProveedor
Failover Retry Limit
1
Numero de intentos de cursar la llamada utilizando las troncales de respaldo
Max Time
3600
Numero máximo de segundos de duración de una llamada cuya tarifa es igual o inferior a 0
88
Titulo
Valor
Descripción
Send Reminder
No
Yes = se envía un correo electrónico al cliente cuando su crédito es inferior al valor del parámetro “ Min Call Credit”
Record Call
No
Yes = se grabará el audio de todas las llamadas
Monitor File Format
gsm
Formato audio utilizado para grabar las llamadas
AGI Force Currency
Indicando una moneda el crédito disponible se anunciará en la moneda indicada en este parámetro en lugar de la moneda configurada por el cliente en su pagina personal
Currency Associated
usd:dollars,mxn:pesos,eur:euros, Locuciones para las monedas cop:pesos,all:credit configuradas
Option Local Dialing
No
No añadir el prefijo internacional del cliente si el numero marcado contiene un 0 inicial. Con Yes se añade
Max time to Call a DID no 3600 billed
Tiempo de duración de una llamada a un Numero geográfico configurado en el sistema para el cual no se cobran las llamadas entrantes. 3600 segundos = 1 hora.
File Enter Destination
prepaid-enter-dest
Locución utilizada para pedir al cliente el numero a marcar
Menu Language Order
es:en:fr
Lista de idiomas disponibles en el IVR que permite escoger un idioma para las locuciones
Bill Callback
Yes
Se cobrará la llamada de Callback del primer canal aunque el segundo canal no ha contestado o no se ha podido establecer la llamada
International prefixes
011,00,09
Prefijos internacionales que se quitarán del numero marcado por el cliente si el CallPlan lo prevea
89
Titulo
Valor
Descripción
Extra charge DIDs
1800,1900
Cargos adicionales para DID que empiecen con 1800 0 1900 (por minuto)
Extra charge DID fees
0,0
Se indican los costos, por minuto, de llamadas a los números que empiecen con el prefijo indicado en el parámetro anterior.
Extra charge DID buy fees
0,0
Se indican los costos adicionales para la compra de números cuyo prefijo está presente en el parámetro “Extra charge DIDs”
Max Time For Unlimited Calls 3600
Tiempo máximo de duración de una llamada incluida en un paquete de minutos gratuitos cuyo paquete tiene configurado en el parámetro PACKAGE TYPE el valor “Unlimited calls”
Max Time For Free Calls
Tiempo máximo de duración de una llamada incluida en un paquete de minutos gratuitos cuyo paquete tiene configurado en el parámetro PACKAGE TYPE el valor “Number of Free calls”.
3600
CallPlan threshold Deck switch
Este parámetro se utiliza para pasar un cliente de un Call Plan a otro en el momento en que haya utilizado n segundos del primero. Los valores se indican de la siguiente forma: ID Call Plan : segundos (coma) ID segundo Call Plan : segundos. Ejemplo: 1:3600,2:7200
Disable annoucement the No second of the times that the card can call
Yes = no anuncia el numero de segundos si el cliente tiene disponible para la llamada más de un minuto
Currency Cents Association
Define las locuciones que se utilizarán para los centavos
90
usd:prepaid-cents,eur:prepaidcents,gbp:prepaid-pence,all:credit
Titulo
Valor
Descripción según la moneda.
Default Accountcode
Si en este parámetro se indica el numero de un cliente, o ACCOUNTCODE, todas las llamadas que utilizarán este agiconf se cobrarán a ese cliente. Esto dependiendo de la configuración del parámetro “Default Accountcode Behaviour” que aparece más adelante. Se deja vacío
Verbosity
3
Configura el nivel de verbosidad de los registros de A2Billling 3 = INFO
Logging
3
Lo mismo para lo registros de LOG 3 = INFO
Dial Balance reservation
0.25
Crédito que se reserva para cada llamada en el caso de clientes que pueden utilizar más de una canal a la vez. Ayuda a prevenir la presencia de saldos negativos
Option CallerID update
No
Yes = Se permite al cliente de actualizar su CallerID antes de realizar una llamada.
Auto Create Card
No
Si está en yes y el CallerID del cliente se captura, se generará una nueva tarjeta de llamadas con asociado ese CallerID
Auto Create Card Length
10
Longitud del numero de tarjeta generado automáticamente
Auto Create Card Type
PREPAID
Tipo de tarjeta generada automáticamente (PREPAID = prepago; POSTPAID = postpago)
Auto Create Card Credit
0
Crédito disponible en la tarjeta creada automáticamente (si es prepago)
Auto Create Card Limit
0
Si es una tarjeta postpago, aquí se fija el limite de crédito disponible para la tarjeta
91
Titulo
Valor
Descripción generada automáticamente
Auto Create Card TariffGroup
1
ID del Call Plan que se utilizará para la tarjeta generada automaticamente
Busy Timeout
3
Tiempo, en segundos, de duración del tono de ocupado
Callback Reduce Balance
1
Monto que se quitará al crédito disponible del cliente para asegurarse que la llamada de callback tenga crédito suficiente.
IVR Locking option
No
Si está en Yes permite al cliente configurar un segundo código para acceder a su cuenta
IVR Account Information
No
Si está en Yes permite al cliente consultar una serie de datos relacionados con su cuenta
IVR Speed Dial
No
Si está en Yes permite al cliente configurar los números de marcado rápido
Play rate lower one
0
Si está en Yes anuncia el valor de la llamada aunque el costo sea menor de un centavo
Callback Beep for Destination
No
= Yes a lo largo de una llamada de callback, el cliente escuchará un beep cuando la llamada se establece.
Callback CID Prompt Confirm No PhoneNumber
Si está en Yes a quien inicia una llamada de callback se le pedirá de confirmar su numero
LCR Mode
Este parámetro ha sido añadido desde la versión 2.0 de A2Billing. Si el valor es 0 A2billing busca el prefijo que más se acerca al numero marcado en todas las RateCard presentes en un CallPlan y escoge la ruta más barata. Si el valor es 1 A2Billing busca en cada RateCard presente en un CallPlan el prefijo que más se
92
1
Titulo
Valor
Descripción acerca al numero marcado y entre todos los encontradas, escoge la ruta más barata. Más adelante se mostrará como se utiliza esta nueva funcionalidad.
Default Accountcode Behaviour No
Si está en Yes utiliza el ACCOUNTCODE definido en el parámetro “Default Accountcode” aunque la llamada tenga asociado un ACCOUNTCODE. Si está en no aplicará este ACCOUNTCODE solamente para las llamadas que no tengan uno.
Si se quiere activar la configuración para permitir las llamadas entre extensiones. En el agi-conf1 se modifican estos parámetros:
SIP Call
No
Se habilita para permitir llamadas gratuitas entre las extensiones SIP/IAX
SIP Call Prefix
555
Prefijo que hay que anteponer al numero de extensión SIP/IAX que se quiere llamar
Direct Call
No
Si se habilita no se presentará una locución para marcar un numero. Si este numero empieza por 555 la llamada sera cursada hacia la extensión SIP/IAX marcada; de otra forma se cursará normalmente
Yes
Se habilita para permitir llamadas gratuitas entre las extensiones SIP/IAX
Para que queden:
SIP Call
93
SIP Call Prefix
555
Prefijo que hay que anteponer al numero de extensión SIP/IAX que se quiere llamar
Direct Call
Yes
Si se habilita no se presentará una locución para marcar un numero. Si este numero empieza por 555 la llamada sera cursada hacia la extensión SIP/IAX marcada; de otra forma se cursará normalmente
Para llamar de una extensión a otra habrá que marcar 555 + el parámetro que aparece en esta columna de cada cliente:
Si por ejemplo el primer cliente de la lista quiere llamar el segundo, tendrá que marcar: 555 837943829751935 El parámetro LOGIN que se llama también ALIAS, se puede modificar en cualquier momento y esto permite simplificar los números que deben marcar los clientes para llamarse entre ellos. En el menú notifications, se configurará la parte relacionada con los avisos que se enviarán a los clientes cuando su crédito se está agotando. Aquí se definen los distintos valores que el cliente puede escoger y cada cuando enviar los avisos. Para que este modulo sea activo, el cliente tiene que configurarlo en su pagina personal.
Titulo List of possible values to notify 94
Valor 1:3:5:10:20:50:100:500:1000
Descripción Valores que el cliente puede
escoger (1 dólar, 3 dolares, etc) Notications Cron Module
1
Con 0 se deshabilita el modulo
Notications Delay
1
Cada cuantos días enviar la notifica. Si se configura con 0, la notifica se enviará cada vez que se ejecute el cron relativo (por defecto a la medianoche de cada día)
En dashboard se configura la posición de distintos cuadros que aparecerán en la pagina de administración de A2Bbilling cuando se presione el siguiente menú:
Titulo
Valor
Descripción
Enable info module about customers
LEFT
Modulo clientes
Enable info module about refills
CENTER
Modulo recargas
Enable info module about payments
CENTER
Modulo Pagos
Enable info module about calls
RIGHT
Modulo Llamadas
Enable info module about system
LEFT
Modulo Info sistema
Enable news module
NONE
Modulo novedades acerca del programa
Para terminar en el ultimo menú, webagentui, se configuran dos parámetros que definen lo que puede o no puede hacer un agente desde su pagina personal.
95
Titulo
Valor Descripción
Personal Info
1
El revendedor puede modificar sus datos personales. Con 0 no puede
Authorize Remittance Request
1
Con 1 se habilita en la pagina del revendedor el enlace para solicitar el pago de sus comisiones. Con 0 se deshabilita.
Terminada la configuración de los parámetros del sistema de facturación, se puede empezar con la creación de los proveedores que se utilizarán para terminar las llamadas con sus relativas tarifas. 4.2 Configuración de los Proveedores Para poner en marcha A2Billing hay que seguir este orden: • • • • • • •
Configurar los proveedores Configurar las troncales Configurar los Callplan Configurar los RateCard Asociar los Ratecards a los Callplan Importar las tarifas Crear los clientes
Siguiendo la lista, se empieza configurando los proveedores: En el menú de la izquierda de la pagina de administración de A2Billing se selecciona Providers → Providers:
En la pagina que aparece, se selecciona “Add Provider” y se rellenan los campos con los siguientes valores:
96
Se confirma la creación del nuevo proveedor presionando el Botón “Confirm Data”. Luego se pasa a la configuración de las troncales utilizando el siguiente menú:
En la pagina que aparece, se selecciona “Add Trunk” y se rellenan los campos con los siguientes valores:
97
Una pequeña explicación de los valores: VOIP PROVIDER: el nombre del proveedor como se ha configurado en PROVIDERS → Providers LABEL: una etiqueta que identifique esta troncal ADD PREFIX: como se verá al momento de configurar las tarifas, normalmente estas se añaden utilizando los códigos de los países sin el 00 por delante. Cuando se marca un numero para que el AGI pueda buscar en la base de datos una ruta para el destino, se quita al numero marcado (si presentes) los prefijos definidos en este parámetro del grupo agi-conf1: International prefixes
011,00,09
Prefijos internacionales que se quitarán si el CallPlan lo prevea
Una vez que a2billing haya encontrado la ruta para la llamada, hay que volver a poner los dos 00 si el proveedor exige que las sintaxis para marcar un numero sea: 00 + código país + numero. Es por eso que en este campo se pone 00. En el caso que el proveedor venda distintos tipos de rutas (Oro, Platino) será el mismo proveedor que indicará que tipo de prefijo hay que poner delante del numero marcado para salir con una tarifa en lugar de otra. PROVIDER TECH: aquí se define que tipo de protocolo se utiliza para la troncal que se está configurando. En este caso SIP. Puede ser SIP, IAX2, DAHDI PROVIDER IP: en este campo se indica la IP del proveedor o mejor aun la etiqueta inicial de la troncal como se ha definido en el archivo sip.conf. En este caso voztovoice1 es la troncal configurada FAILOVER TRUNK: como esta es la primera troncal que se define, no se puede seleccionar ninguna troncal de respaldo MAXIMUM CONNECTIONS: numero máximo de canales que brinda el proveedor. En este caso 30 STATUS: La troncal está activada Se guarda la configuración presionando el botón “Confirm data”. Se vuelve nuevamente al menú Trunks y se configura la segunda troncal de la siguiente forma:
98
Los únicos dos campos que varían son: LABEL y PROVIDER IP. En el primero se pone una etiqueta para la segunda troncal y en el segundo el nombre voztovoice2 como configurado en el sip.conf. Se presiona el botón “Confirm Data”. Ahora en la lista de troncales aparecerá:
Se borra la que venía con la instalación de A2Billing y se confirma presionando el botón Delete:
99
Es siempre una buena practica tener configurada una troncal de respaldo en el caso que la primera no esté funcionando. Algunos proveedores proveen este servicio brindando dos troncales con distintas IP. La primera se utiliza como principal y la segunda como respaldo. En este caso se utilizará la segunda troncal como respaldo de la primera. Se vuelve al menú Trunks y se selecciona el icono para modificar la primera troncal:
En la pagina que aparece, en el campo: FAILOVER TRUNK se selecciona voztovoice2:
Se guardan los cambios presionando el botón “Confirm Data”. 4.3 Creación de los planes de llamadas y de las tarifas Siguiendo la lista indicada en el párrafo anterior, se continua con la creación de los Callplan, Ratecard y la importación de las tarifas. Para crear un Callplan se entra en el menú RATES → Callplan
100
En la nueva pagina se selecciona “Add Callplan”. Aparecerá la siguiente ventana:
Los campos: NAME: nombre del Callplan. En este caso Base. LCR TYPE: en este campo se define si se escogerán las tarifas más baratas desde el punto de vista del vendedor o del cliente. En este caso desde el punto de vista del vendedor. PACKAGES: se puede añadir al Callplan un paquete de minutos gratuitos o de llamadas gratuitas. En este caso se deja el valor predefinido ya que todavía no se han creados paquetes de este tipo. REMOVE INTER PREFIX: como ya se ha dicho anteriormente, antes de buscar una ruta hay que quitar los prefijos si están presentes en el numero marcado, como definido en este parámetro del agiconf1: International prefixes
011,00,09
Prefijos internacionales que se quitarán si el CallPlan lo prevea
Esto para que A2billing pueda buscar en la tabla de las tarifas la ruta para la llamada que se está cursando. Una vez encontrada la ruta, se volverá a poner los dos 00 como indicado en la configuración de las dos troncales. Se termina presionando el botón “Confirm Data” Se pasa al menú RateCards y se escoge “Add RateCard”. En la ventana que aparece se configura la RateCard: 101
Los campos: TARIFFNAME: el nombre que se asigna a la tarifa. Como esta tarifa se asociará al CallPlan Base que se acaba de crear, se escoge el nombre Base1 para acordarse que la Ratecard está asociada con ese CallPlan START DATE: fecha de inicio de vigencia de las tarifas. Si no se cambia será la fecha en que se ha creado. EXPIRY DATE: fecha de vencimiento de la tarifa. Como los proveedores suelen actualizar las tarifas periódicamente, cuando se carga una nueva RateCard con las nuevas tarifas, habrá que indicar la fecha exacta en que la RateCard se vencerá (caducará). DESCRIPTION: en este campo se puede añadir una descripción de la tarifa. DNID PREFIX: si se quiere que esta tarifa se utilice solamente para determinados prefijos (ejemplo 573 para los celulares colombianos), hay que indicarlo aquí. Predefinido es el valor all (todos los prefijos). CALLERID PREFIX: parecido al campo precedente pero desde el punto de vista del identificador de llamada. Si por ejemplo se quiere que solo los clientes cuyo CALLERID empieza con 57 (Colombia) puedan utilizar esta tarifa hay que indicarlo en este campo. Predefinido es el valor all (todos los CALLERID) Para guardar los cambios se presiona el botón “Confirm Data”. Ahora para indicar a A2Billing que esta Ratecard se debe utilizar con el Callplan Base que se ha creado anteriormente, se vuelve al menú Call plan y se modifica el CallPlan: 102
Aparecerá:
Se selecciona la RateCard Base1 y se presiona el botón “ADD RATECARD”. La pagina cambiará de esta forma:
La RateCard Base1 será parte del Callplan Base. Para guardar los cambios se presiona el botón “Confirm Data”. Se ha configurado un Callplan para los clientes y una RateCard para el Callplan. Falta solamente ingresar las tarifas. Para hacerlo hay dos métodos: • •
el manual (una a una) importando un archivo en formato CSV con todas las tarifas configuradas.
Este archivo debe contener por lo menos los siguientes datos: • • •
Prefijo Nombre del destino Tarifa de venta
Estos tres valores aunque sean suficientes para poder empezar a vender trafico telefónico, no son la 103
mejor opción en los siguientes casos: 1. si se quiere ver en las estadísticas de las llamadas el valor de lo que se está ganando 2. si para algunos destinos la tarificación no es por segundo 3. si se quiere diferenciar la tarificación que aplica el proveedor de la que se aplica a los clientes. Por esta serie de motivos el archivo debe tener las siguientes columnas: • • • • • • • •
prefijo nombre destino tarifa de venta tarifa de compra duración mínima de la llamada que cobra el proveedor tarificación que aplica el proveedor duración mínima de la llamada que se cobrará al cliente tarificación que se aplica al cliente
Para cargar las tarifas en A2billing se utilizará LibreOffice y se buscará un proveedor de llamadas que permite descargar las tarifas desde su pagina web. En este caso se ha escogido SipTraffic. Se entra en la pagina de SipTraffic: se sigue el enlace “View our Rates”, se selecciona “See USD rates“ y para terminar se bajan las tarifas (Bronze):
Se guarda el archivo en el computador local. Antes de abrirlo hay que modificar la configuración de LibreOffice de forma que la división entre enteros y decimales se realice con el punto en lugar de la coma. Para eso se abre LibreOffice Calc y se selecciona el menú “Herramientas → Opciones”. En la ventana que aparece, se escoge “Configuración de idioma → Idiomas”. En el lado derecho de la ventana la configuración debe ser:
Se presiona el botón aceptar y se abre el archivo bajado del sitio web de SipTraffic. En la parte baja aparecen dos hojas: 104
• •
Rates Numberplan
Se selecciona la hoja numberplan y se modifica de la siguiente forma:
En la primera columna se ponen los prefijos, en la segunda los nombres de los destinos, en la tercera la siguiente formula =(D1*1.15) que luego se copia en todas las celdas de la columna C. De esta forma se aumenta el valor de las llamadas de un 15% que representará la ganancia. En la columna D aparecerá el costo de las llamadas que aplica el proveedor. Las columnas C y D deben tener cinco cifras decimales (Si se utiliza como moneda el dolar). En las columnas E,F,G,H, respectivamente: • • • •
duración mínima de la llamada que cobra el proveedor tarificación que aplica el proveedor duración mínima de la llamada que se cobrará al cliente tarificación que se aplica al cliente
Como la tarificación para México es por minuto, en la hoja hay que buscar las lineas donde aparecen los distintos destinos de México y modificar la ultima cuatros columnas como da imagen:
Terminadas las modificaciones, se selecciona el menú “Archivo → Guardar como” y selecciona el formato CSV:
Se presiona el botón Guardar. En la nueva ventana:
105
Se presiona el botón “Usar formato Text CSV”. En la siguiente ventana las opciones deben quedar de la siguiente forma:
Se presiona el botón Aceptar. De esta forma ya se tiene listo el archivo para cargarlo en A2Billing. En la pagina de administración se escoge el menú “RATES → Import”. Se seleccionan los distintos valores como se muestra en la imagen que sigue:
106
Se continua en la parte más abajo de la pagina presionando el botón Examinar:
y en la ventana que aparece se escoge el archivo que se acaba de guardar en formato CSV. Una vez seleccionado se presiona “Import RateCard”. El sistema empezará a importar las tarifas en la base de datos. Después de algunos segundos aparecerá esta pagina:
107
Donde se podrá comprobar si las tarifas se están importando correctamente. Una vez que se haya hecho este tipo de control se continua presionando el botón “Continue to import the RateCard”. Si aparece este error:
Significa que el archivo tiene un tamaño de más de 8Mb que es el limite que se ha configurado en el parámetro: Max File Upload Size en SYSTEM SETTINGS → Global List → webui. Para que se puedan cargar las tarifas se modifica el parámetro y se pone un valor más alto. Luego se modifica la siguiente linea del archivo php.ini: nano +878 /etc/php.ini Cambiando el parámetro: upload_max_filesize = 8M Con el numero de MegaBytes configurados en A2Billing. Se guardan los cambio y se reinicia el servidor Web: 108
service httpd restart Se vuelve a la pagina de administración de A2Billing y se intenta cargar las tarifas nuevamente. Si no aparecen más errores, en el menú Rates:
estarán todas las tarifas que se acaba de importar. Si aparece este error en el navegador:
Hay que abrir el archivo CSV con un editor de texto y guardar el contenido en formato TXT sin ningún tipo de formateo. Luego se vuelve a importar las tarifas al sistema. 4.4 Configuración de los métodos de pago Terminada la parte dedicada a las tarifas y los planes de llamadas, para poner en marcha el sistema de facturación, faltan todavía unos pasos: • • • •
configurar los sistemas de pago modificar las plantillas de los correos que utiliza el sistema modificar los datos que aparecerán en las facturas de los clientes crear por lo menos un cliente
Se entra en el menú BILLING → Payment Methods:
109
En la nueva pagina estará la lista de métodos soportados por A2Biling:
El único que se utilizará para los fines de este libro, es PayPal. Por eso hay que desactivar todos los demás. Se entra en la configuración del primero de la lista presionando el botón “View Detail”:
En la nueva pagina se desactiva el método de pago seleccionando el botón “False”:
y confirmando la modifica presionando el botón “Update” que aparece al final de la pagina. Se sigue el mismo procedimiento para los pagos con Moneybookers (ahora Skrill). Para terminar se entra en el método de pago con PayPal y se añade el correo electrónico que se ha utilizado al momento de registrarse en PayPal. Ejemplo:
110
Se guardan las modificaciones presionando el botón “Update”. 4.5 Configuración para la facturas Cada vez que un cliente realice un pago/recarga, se emitirá una factura. En la factura aparecerán los datos de la empresa que está facturando. Para definir estos datos hay que entrar en el menú INVOICES → Configuration:
En la nueva pagina se rellenan los campos con los datos de la empresa que va a facturar. En la imagen que sigue un ejemplo de como se debe hacer:
111
Se guardan los cambios presionando el botón “Save”. Para añadir un logo a las facturas de la pagina de administración de A2Billing, se copia la imagen en la carpeta: /var/www/html/admin/Public/templates/default/images/ Luego se modifica el siguiente archivo: nano /var/www/html/admin/Public/A2B_invoice_view.php y después de esta linea:
se añade el siguiente bloque: '; } else { echo '
'; } ?> 112
logo.jpg es el nombre del archivo gráfico del logo de la empresa que se ha cargado anteriormente (personalizar). Se guardan los datos. Para que aparezca el logo también en la pagina de los clientes se copia la imagen del logo en esta carpeta: /var/www/html/customer/templates/default/images/ Luego se modifica el siguiente archivo: nano /var/www/html/customer/A2B_invoice_view.php y después de esta linea:
se añade: '; } else { echo '
'; } ?> Se guardan los cambios. 4.6 Plantillas de los correos electrónicos Las plantillas de los correos electrónicos, que se encuentran en la pagina de administración de A2Billing, se necesitan para enviar correos predefinidos a los clientes. Para que reflejen los datos de la empresa, hay que personalizarlos. Si en el sistema se va a utilizar solamente un idioma, se puede modificar las plantillas predefinidas que vienen en inglés. Si se quiere tener las plantillas en más idiomas, hay que traducirlas utilizando el botón “Translate” y luego escoger el idioma. Se entra en el menú MAIL → Mail Templates:
113
Se empieza modificando la primera plantilla de la lista “signup”. Este correo electrónico se enviará a un nuevo cliente para que pueda confirmar la cuenta que acaba de crear. En la imagen que sigue aparece un ejemplo de como modificar la plantilla. La parte del enlace es la más importante porque es donde se define la dirección web donde se encuentra la carpeta customer en el servidor Linode (sostituir IPlinode con la dirección IP o nombre de dominio del servidor Linode o del servidor local):
Para guardar la modificaciones se presiona el botón “Confirm Data”. Se continua con las demás plantillas y se personalizan siguiendo el patrón de la primera. 4.7 Creación de un cliente Como se ha visto en los párrafos anteriores, los clientes se pueden registrar en autonomía utilizando la pagina web dedicada . En este párrafo se verá como crear un cliente desde la pagina de administración de A2Billing. Más adelante se efectuará una prueba de registro utilizando la pagina de los clientes. Para crear un nuevo cliente se entra en el menú CUSTOMERS → Add::Search: 114
Se presiona el enlace “Add Customer”:
En en la pagina que sigue, se rellenan todos los campos creando un cliente para las pruebas:
En el primer bloque aparecen las siguientes informaciones: ACCOUNT NUMBER: es el numero de la tarjeta del nuevo cliente generada automáticamente por el sistema. Este numero es también el PIN que el cliente tendrá que marcar en el caso que el sistema se lo pida: es también el numero de extensión que habrá que configurar para conectarse al servidor Asterisk. La longitud predefinida es 5, como indicado en el parámetro “Card Number length” in SYSTEM SETTINGS → Global List → Global WEBUI LOGIN: es el numero que el cliente tendrá que ingresar para poder acceder a su cuenta personal desde la pagina Web de los clientes. En lugar de este numero, para acceder a la pagina web personal, el cliente puede utilizar también el correo electrónico que ha indicado al momento de registrarse. Si activado en el agi-conf1, este numero representa también el numero a marcar para llamadas entre extensiones. Mientras el ACCOUNT NUMBER una vez creado no se puede modificar, 115
el WEBUI LOGIN se puede personalizar en cualquier momento. La longitud predefinida es 5, como indicado en el parámetro “Card Alias length” in SYSTEM SETTINGS → Global List → Global WEBUI PASSWORD: es la clave para acceder a la cuenta personal desde la pagina Web de los clientes y también para registrarse al servidor Asterisk. Es generada automáticamente por A2Billing. BALANCE: es el crédito disponible. En este caso no se asigna ningún crédito al nuevo cliente CUSTOMER GROUP: los clientes tienen que pertenecer a un grupo. Más adelante se verá para que sirven, como se utilizan y como se configuran. En este caso se selecciona el predefinido DEFAULT SERIAL: se utiliza si al cliente se aplica un determinado tipo de tarjeta prepago (no aplica)
En el segundo bloque se indican los datos personales del cliente.
116
117
El tercer bloque está dedicado al estado del cliente: PAYMENT TYPE: se indica el tipo de tarjeta. En este caso prepago (PREPAID CARD) CALL PLAN: es el plan de llamadas que utilizará el cliente. Base es el que se ha configurado anteriormente y, por ahora, el único disponible. DIDGROUP: en el caso que el cliente esté asociado a un grupo de números geográficos que pueda adquirir, en este parámetro se indica el nombre del grupo TIMEZONE: zona horaria del cliente (en este caso Bogotá) LANGUAGE: idioma predefinido para el cliente CURRENCY: moneda en que el cliente manejará su cuenta.
118
STATUS: es el estado de la cuenta. ACTIVE significa que la cuenta está activa y se puede utilizar. LOCK: es posible asociar a la cuenta un segundo PIN (clave) LOCK PIN: es la clave si LOCK está activado SIMULTANEOUS ACCESS: es posible permitir al cliente de efectuar más de una llamada a la vez. En este caso con SIMULTANEOUS ACCESS el cliente podrá cursar más de una llamada a la vez. Si se selecciona INDIVIDUAL ACCESS el cliente podrá cursar solamente una llamada a la vez. RUN SERVICE: es posible aplicar costos adicionales a la cuenta del cliente. Pueden ser, por ejemplo, por cada llamada o basados en el tiempo. En este caso no se activan CREDIT LIMIT: aplica solamente a clientes postpago e indica un monto máximo que el cliente puede gastar cada mes. CREDIT LIMIT NOTIFICATION: si se quiere enviar al cliente una notificación cuando el crédito de su cuenta se está agotando en este parámetro se indica un valor en dolares entre los definidos anteriormente en el System Settings. Si, por ejemplo se escoge 5, cuando el crédito del cliente esté por debajo de los 5 dolares, se le enviará una notificación. Se deja vacío. PERMITTED NOTIFICAYIONS BY EMAIL: si se selecciona, cuando el crédito del cliente esté por debajo del valor indicado en el parámetro anterior, recibirá una notificación al correo electrónico indicado en el próximo parámetro. Se deja en No. EMAIL NOTIFICATION: Dirección de correo electrónico donde el cliente recibirá la notificaciones relacionadas con el crédito bajo. CAMPAIGN: si queremos permitir al cliente de gestionar campañas (llamadas a clientes tipo call center) en este campo tenemos que definir la campaña que podrá utilizar el cliente (no aplica). FIRST USE DATE: en este campo aparecerá fecha y hora de cuando el cliente ha utilizado por primera vez la tarjeta ENABLE EXPIRY: se puede definir una duración máxima para la tarjeta basada en tres tipos di opciones: • EXPIRY DATE - Una fecha predefinida • EXPIRY DAYS SINCE FIRST USE - Un numero de días que empiezan a contar después del primer uso • EXPIRY DAYS SINCE CREATION - Un numero de días que empiezan a contar desde la creación del cliente EXPIRY DATE: fecha en que la tarjeta se vence si ENABLE EXPIRY se ha activado con la opción EXPIRY DATE EXPIRY DAYS: numero de días después de los cuales la tarjeta se vencerá si en el parámetro ENABLE EXPIRY se haya activado EXPIRY DAYS SINCE FIRST USE o EXPIRY DAYS SINCE 119
CREATION CREATE SIP CONFIG: con yes se creará una extensión SIP asociada al cliente CREATE IAX CONFIG: con no, no se creará una extensión IAX2 asociada al cliente. Por defecto el sistema está configurado para crear la cuenta IAX2. Si no se va a utilizar extensiones IAX2, lo mejor es desactivar por defecto su creación. Se realiza modificando la linea 778 de este archivo: nano +778 /usr/local/src/a2billing/admin/Public/form_data/FG_var_card.inc se pone 0 en lugar del 1 presente. Se guardan los cambios. Si ahora se crea un nuevo usuario, la opción CREATE IAX CONFIG estará desactivada por defecto. MAC ADDRESS: utilizado en el caso que se quiera asociar al cliente el MAC ADDRESS del dispositivo utilizado para realizar las llamadas. IN USE: en este campo aparecerán el numero de llamadas activas del cliente MAX CONCURRENT CALLS: el numero de llamadas simultaneas permitidas al cliente en el caso el parámetro SIMULTANEOUS ACCESS esté configurado con la opción SIMULTANEOUS ACCESS. Como dice la legenda esta funcionalidad todavía no está implementada (no funciona). Se verá más adelante como implementarla apoyándose a un Servidor NoSQL (Redis).
En los bloques presentes en la imagen de arriba se configuran los últimos parámetros: AUTOREFILL: si está en yes la cuenta del cliente se recargará automáticamente hasta llevar el crédito al valor indicado en el parámetro que sigue. INITIAL BALANCE: el valor del crédito del cliente cada vez que se ejecutará un autorefill. Ejemplo: si el crédito del cliente es de 2 dolares y INITIAL BALANCE es configurado con 20, la cuenta del cliente se recargará con 18 dolares para que el total sea de 20 dolares.
120
INVOICE DAY: de forma predefinida el sistema genera las facturas cada primer día del mes. En este parámetro se indica el día del mes en que se generará la factura para este cliente. VAT: Es el impuesto que se aplicará a las facturas del cliente. En Colombia se llama IVA y es del 16% . Cuando el cliente realice una recarga de 10 dolares el total que tendrá que pagar son 10 dolares más el 16%, es decir 11.6 dolares. VAT REGISTRATION NUMBER: el numero de registro de la empresa del cliente o código fiscal. En Colombia se llama RUT o NIT. DISCOUNT: si se quiere aplicar un descuento al cliente, en este parámetro se indica el porcentaje. Es valido solamente para cuentas postpago. Los demás campos que aparecen en la pagina se pueden dejar, por el momento, con sus valores predefinidos. Para guardar la configuración se presiona el botón “Confirm Data”. En la pagina de los clientes se podrá ver el nuevo cliente creado:
Una explicación de las columnas más importantes: BA = Balance; crédito disponible USE: muestra en tiempo real los canales utilizados por el cliente SIP: Yes, hay una extensión SIP asociada al cliente IAX: No, no hay una extensión IAX2 asociada al cliente ACD: numero de llamadas totales exitosas (contestadas) realizadas por el cliente Los Iconos: LUPA: para ver un resumen de los datos del cliente LAPIZ: para modificar los datos de la cuenta del cliente X: Para borrar el cliente SIP: para crear una cuenta SIP para el cliente en el caso que no exista IAX: para crear una cuenta IAX para el cliente en el caso no exista BILLETES: Para realizar operaciones sobre el crédito del cliente (recargas, pagos, etcétera) LIBRETA: para inscribir el cliente a un pago recurrente SOBRE: para enviar un correo electrónico al cliente En este caso se selecciona el icono BILLETES para recargar la cuenta del cliente: 121
CUSTOMER ID: numero ID del cliente PAYMENT DATE: Fecha en que se realizó el pago/recarga PAYMENT AMOUNT: valor del pago/recarga DESCRIPTION: una descripción para la operación CREATE ASSOCIATE REFILL: se creará una factura para la recarga CREATE AGENT COMMISSION: en el caso que el cliente esté asociado a un revendedor, si se selecciona la casilla, se reconoce la comisión al revendedor. PAYMENT TYPE: tipo de pago Para completar la recarga se presiona el botón “Confirm Data”. Ahora en el menú BILLING → Customers Balance → Refills, aparecerá la recarga recién realizada. En el menú INVOICES → Invoices aparecerá la factura de la recarga. Se vuelve al menú CUSTOMERS → Add :: Search y se selecciona el icono del lápiz:
Seleccionando el enlace de la imagen, presente en alto a la derecha, se entrará directamente a la pagina del cliente. En el menú derecho se selecciona INVOICE → View Invoices. Aparecerá la linea de la 122
factura relacionada con la recarga realizada. Si se selecciona el icono de la lupa:
Se verá la factura con el icono de la empresa y todos los datos del cliente. Al momento de la creación del cliente, se ha creado una cuenta SIP. Para ver los datos y la configuración de la cuenta, se ingresa al menú CUSTOMERS → VoIP Settings y luego se selecciona el icono lápiz.
123
124
Como se puede ver, algunos datos los genera en automático A2Billing, otros se toman de los configurados en SYSTEM SETTINGS → Global List → peer_friend. Por ultimo algunos más se toman de la configuración de los valores por defecto de la tabla cc_sip_buddies de A2Billing. De los datos presentes por defecto hay que modificar por lo menos: • • • • •
125
CANREINVITE RTPTIMEOUT RTPHOLDTIMEOUT CANCALLFORWARD RTPKEEPLIVE
Se entra en el cliente MySQL: mysql -u root -psesamo mysql> use a2billing Se modifican: mysql> alter table cc_sip_buddies alter canreinvite set default 'no'; mysql> alter table cc_sip_buddies alter rtptimeout set default '60'; mysql> alter table cc_sip_buddies alter rtpholdtimeout set default '120'; mysql> alter table cc_sip_buddies alter cancallforward set default 'no'; mysql> alter table cc_sip_buddies alter rtpkeepalive set default '15'; Se sale del cliente MySQL: mysql> quit Para ver los datos que tiene que utilizar el cliente para configurar su SoftPhone, Teléfono SIP o troncal, se vuelve a entrar en la cuenta del cliente y se selecciona el menú SIP/IAX INFO:
Como se puede ver una parte de la información viene en inglés y no es correcta (ejemplo los codecs). Esto se puede corregir abriendo el siguiente archivo:
126
nano +147 /var/www/html/customer/A2B_entity_sipiax_info.php y cambiando las siguientes lineas: context= ; change for proper context allow= ; we support ulaw,alaw,ilbc,gsm,g723.1,g726,g729a
Para que queden: context= disallow=all allow= ; soportamos alaw,ulaw,g729 Importante la linea vacía entre context y disallow. Se guardan los cambios y se accede nuevamente, desde la pagina del cliente, al menú SIP/IAX INFO:
Los datos necesarios para la configuración del dispositivo son (en HOST hay que poner el dominio del servidor): USERNAME : 09148 SECRET: 65245yveo3bduuhi6swu HOST: li403-112.members.linode.com Con esos datos se configura el X-Lite . Se descarga el programa desde la pagina web de la empresa que lo desarrolla: 127
http://www.counterpath.com/x-lite-download.html Se instala y se abre. Se entra en el menú Softphone → Account Settings y se configura la cuenta:
Se presiona en botón OK y se espera que el SoftPhone se conecte a Asterisk:
Si no aparece ningún error, el SofPhone estará conectado. Desde la consola de Asterisk se puede averiguar con el siguiente comando: CLI> sip show peer 09148 load cambiando 09148 con el numero del cliente generado por el sistema. La respuesta será una larga lista de todos los parámetros configurados para esa extensión. Ahora se puede realizar la primera llamada. Hay tres formas de marcar: 128
código país + numero 00 + código país + numero 011 + código país + numero Un ejemplo: marcar el numero de atención al cliente de la compañía aérea Avianca (Colombia): 005714013434 Una vez terminada la llamada se regresa a la pagina de administración de A2Billing y se selecciona el menú CALL REPORTS → CDRs
Aparecerá la llamada que se acaba de hacer:
Con la prueba de la llamada, se ha averiguado que el sistema de facturación está funcionando correctamente. 4.8 Registro de un nuevo cliente desde la pagina Web Los clientes, como se ha definido en la configuración de A2Billing, se pueden registrar desde una pagina Web dedicada. Se entra a la pagina: 129
https://IPservidor/customer
Si se quiere que la pagina aparezca siempre en español, se modifica este archivo: nano /usr/local/src/a2billing/customer/templates/default/index.tpl Y se personaliza la pagina para que quede:
Luego se selecciona la opción indicada para registrarse. En la nueva pagina se rellenan los campos personalizandolos:
130
Para terminar se presiona el botón Registrarse. Como respuesta se recibirá el siguiente mensaje:
El nuevo cliente recibirá, porque así se ha configurado, un correo electrónico con un enlace para confirmar la activación de su cuenta:
131
Se selecciona el enlace y se pega en una nueva ventana del navegador. El resultado será:
Volviendo a la pagina de administración, en el bloque NOTIFICATION aparecerá la palabra NEW que indica che hay alguna novedad en el sistema:
Se selecciona con un click ese bloque: 132
Seleccionando el icono evidenciado se entrará directamente en la cuenta del nuevo cliente donde se modifica el parámetro STATUS de NEW a ACTIVE:
Se guardan los cambios presionando el botón “CONFIRM DATA”. Ahora se puede desactivar la notifica volviendo a seleccionar el Menú NOTIFICATION y luego el botón NEW que aparece en la ultima columna. La palabra NEW se transformará en una X que permite borrar la linea de notificación. Ahora el cliente podrá acceder a su pagina personal:
En el menú de la derecha de la pagina personal del cliente, están presentes las funcionalidades activas para el cliente mismo. Estas funcionalidades se definen en el grupo DEFAULT presente en el menú CUSTOMERS → Groups de la pagina de administración de A2Billing. Se pueden modificar en cualquier momento de la siguiente forma. Se entra en ese menú y se selecciona el icono para modificar el grupo DEFAULT:
En la nueva pagina presionando la tecla CTRL se añaden o quitan las funcionalidades. Para este ejemplo: • •
se desactiva la funcionalidad AUTODIALER se desactiva la posibilidad de adquirir números geográficos (DID)
Tiene que quedar de esta manera:
133
Se confirma presionando el botón “CONFIRM DATA”. Claramente se pueden crea distintos grupos y asociar los clientes a los grupos creados según el tipo de funcionalidades que se quiere que el cliente pueda utilizar. Ejemplo: si para algunos clientes no se quiere que puedan utilizar el sistema de callback presente en la pagina del cliente, se desactiva la linea CALL BACK. 4.9 Creación de una cuenta POSTPAGO Para terminar esta parte dedicada a la creación de los clientes, se creará un nuevo usuario con cuenta POSTPAGO. A seguir los datos utilizados:
Como la cuenta es POSTPAGO no se añade crédito:
134
Los datos del cliente:
Como la cuenta es POSTPAGO en el parámetro PAYMENT TYPE se selecciona “POSTPAID CARD”. En SIMULTANEOUS ACCESS se selecciona SIMULTANEOUS ACCESS que quiere decir que el cliente podrá realizar más de una llamada a la vez:
135
En CREDIT LIMIT se pone 50 dolares que es el valor máximo que puede consumir el cliente POSTPAGO hasta que no se genere una nueva factura:
Se creará solamente una cuenta SIP:
La factura se generará cada primer día del mes, se aplicara un impuesto del 16% y un descuento del 136
5%. Se guarda la configuración presionando el botón “Confirm Data”. Ahora para probar la cuenta POSTPAGO se configura la extensión SIP creada para esa cuenta en el X-Lite y se realiza una llamada al mismo numero utilizado anteriormente. El resultado será:
El saldo será negativo ya que el cliente pagará su cuenta cuando se genere la factura, es decir cada primer día del mes. 4.10 Crear Revendedores El sistema A2Billing brinda la posibilidad de crear revendedores. A los revendedores se le asigna una comisión sobre las tarifas y tienen las posibilidad de poder crear y recargar sus propios clientes. De esta forma un revendedor ganará sobre todo el trafico generado por sus clientes. Solo los administradores pueden crear nuevos revendedores. Para hacerlo se entra en el menú AGENTS → Add :: Search y se selecciona ADD Agent. En la nueva pagina se crea un nuevo revendedor.
137
LOGIN: nombre de usuario PASSWORD: contraseña PERMISSIONS: las funcionalidades activadas para el revendedor. Se activan manteniendo presionada la tecla CTRL y seleccionándolas una a una. En este caso se seleccionan todas. ACTIVE: yes. La cuenta está activada BALANCE: el crédito que tiene disponible el revendedor. Se añaden 50 dolares de crédito. COMMISSION BALANCE: la ganancia actual del revendedor CURRENCY: la moneda con que se pagará el revendedor COMMISSION PERCENTAGE: la comisión reconocida al revendedor: 5% THRESHOLD REMITTANCE: el valor de ganancias mínimo para que el revendedor pueda solicitar sus comisiones VAT: impuestos si aplican LANGUAGE: el idioma predefinido para el revendedor. En la parte que sigue de la pagina, aparecen todos los datos personales del revendedor que hay que personalizar. Terminada la configuración se presiona el botón “Confirm Data”. Se vuelve a entrar en la pagina del agente creado:
Se define que planes de llamadas se asocian al agente ya que el revendedor no puede cargar y/o utilizar sus propias tarifas. En este caso el Plan Base:
138
Terminada la configuración del plan de llamadas, se guardan los cambios presionando el botón “CONFIRM DATA”. En A2Billing es posible crear una dirección web donde los nuevos clientes que se registren, sean asociados directamente a un revendedor. Esto se realiza a través de una clave que identificará el revendedor en la pagina de registro de los nuevos clientes. Antes de crear la clave es obligatorio crear un nuevo grupo en el menú CUSTOMERS → Groups. Se selecciona ADD Group y en la pagina que aparece se crea el nuevo grupo con estos parámetros:
139
Se asocia el nuevo grupo al revendedor agente1. Para guardar los datos se presiona el botón CONFIRM DATA. Ahora se puede crear la clave para el revendedor accediendo al menú AGENTS → Signup URLs y seleccionando el enlace “ADD Signup KEY”. En la nueva pagina se selecciona el agente, el plan de llamadas y el grupo que se acaba de crear:
Se guardan los datos presionando el botón “ADD URL KEY”. Aparecerá la dirección web que deberá utilizar el revendedor para hacer registrar sus propios clientes:
Si se copia la dirección Web y se pega en una nueva pestaña del navegador, aparecerá la pagina de registro para un nuevo usuario. Se crea un nuevo usuario:
140
se confirma presionando el botón “Registrarse”. A partir de este momento el nuevo cliente seguirás los mismos pasos presentados anteriormente para confirmar su cuenta. Entrando en la pagina de administración del revendedor: https://IPservidor/agent
Modificando: nano /usr/local/src/a2billing/agent/Public/templates/default/index.tpl Se traduce al español:
Se accede con los datos asignados al revendedor. Se verá que el nuevo cliente es parte de los clientes de este revendedor; menú CUSTOMERS → List customers:
En este caso es el mismo agente que puede activar la cuenta del cliente:
141
Una vez que el cliente esté activo la cuenta la puede recargar directamente el cliente, el agente o el administrador. Si lo hace el agente, escoge el siguiente menú:
y en la ventana que sigue:
se escoge primero el icono con el circulo negro y se selecciona el cliente que se quiere recargar, luego se pone el valor, una descripción y presiona el botón “ADD CREDIT”. El resultado será:
Como la recarga la realizó el agente, automáticamente recibirá la comisión del 5% sobre ese valor (menú MY ACCOUNT → Account Information):
El administrador puede realizar una recarga al mismo cliente utilizando el icono de los billetes que aparece al final de la linea del cliente que quiere recargar. Al mismo tiempo puede decidir si reconocer o no la comisión al agente seleccionando Yes en la linea del parámetro: “CREATE AGENT COMMISSION”.
142
El resultado en la pagina del agente será:
Si el cliente realiza la recarga con unos de los métodos de pago implementados, el resultado será el mismo. Como el administrador, también el revendedor puede crear nuevos usuarios desde el menú CUSTOMERS → List Customers y seleccionando Add Customer. Si quiere que cuando el revendedor cree un cliente, por defecto se cree solamente una extensión SIP: nano +758 /usr/local/src/a2billing/agent/Public/form_data/FG_var_card.inc Se cambia el 1 presente en la linea con un 0 y se guardan los cambios.
143
Capitulo V Configuración avanzada A2Billing 5.1 Distintos CallPlan Para crear nuevos CallPlan en A2billing el procedimiento es parecido al que se utilizó para crear el primero, es decir: • • • •
crear las troncales crear el callplan crear la Ratecard importar las tarifas
Los proveedores utilizan distintos prefijos para diferenciar las rutas de las llamadas según las tarifas que se quieren utilizar. En el caso de SipTraffic, se encuentran estos prefijos en la pagina del Proveedor bajo el menu FAQ → 1. General → What different routes do you offer?:
Como se puede leer para la ruta Grey (que seria la Bronze, un error en la pagina del proveedor) hay que anteponer al numero a marcar el prefijo 00001, para la ruta Silver los dos 00 tradicionales y para la ruta Platinum el prefijo 00000. El primer error. Al momento de configurar la troncal para la ruta Base de A2billing en el parámetro ADD_PREFIX se ha puesto 00. Como esa ruta se basa en las tarifas Bronze de SipTraffic, hay que efectuar la corrección. En el menú Providers → Trunks se modifican las dos troncales presentes modificando el parámetro ADD_PREFIX. El resultado debe ser:
Ahora se crean dos troncales más, una para las tarifas Silver y otra para la tarifa Gold utilizando la nueva troncal. Se presiona el enlace Add Trunk y se define la nueva troncal de esta forma:
En esta troncal el parámetro ADD_PREFIX es 00 que corresponde a las tarifas Silver de SipTraffic. Se guardan los cambios y se crea la troncal para las tarifas Gold de SipTraffic (con prefijo 00000):
146
Si para estás dos ruta se quiere crear las correspondientes troncales de respaldo, se crearían dos troncales más, indicando en LABEL voztovoice-premium2 y voztovoice-platino2 respectivamente; los datos a modificar serían PROVIDER IP donde se pondría voztovoice2 para las dos. Una vez creadas, se modificaría la troncal voztovoice-premium y en FAILOVER TRUNK se escogería voztovoicepremium2. Para terminar se modificaría la troncal voztovoice-platino y en FAILOVER TRUNK se escogería voztovoice-platino2. Ahora se crean dos nuevos CallPlan (Premium y Platino) desde el menú RATES → Call Plan. El resultado será:
Se continua creando dos RateCard nuevas en el menú RATES → RateCards. La Premium1 y la Platino1: 147
El resultado de las RateCards disponibles:
148
Se asocian las nuevas RateCards a los respectivos CallPlan; se entra en menú RATES → Call Plan y se modifica el CallPlan Premium:
Se continua con el CallPlan Platino:
Para terminar hay que importar las tarifas Silver y Gold de SipTraffic creando los respectivos archivos CSV como se ha visto en el párrafo 4.3 y importándolos desde el menú RATES → Import. Para las tarifas Premium:
149
Para las tarifas Platino:
Para terminar en el menú RATES → Rates se controla que estén las tres tarifas:
150
Si se entra en el menú CUSTOMERS → Add :: Search y se crea un nuevo usuario, a este nuevo usuario se le podrá asociar uno de los tres CallPlan disponibles:
Problema: si se intenta registrar un nuevo usuario desde la pagina web: https://IPServidor/customer/signup.php al momento de escoger un CallPlan, estarán disponibles solamente Base y Premium. Solución: Para que estén disponibles los tres hay que modificar el parámetro que sigue del grupo signup, menú SYSTEM SETTINGS → Global List:
CallPlan ID List
1,2
Numero ID de los planes de llamadas que un cliente puede escoger al momento de registrarse
1,2,3
Numero ID de los planes de llamadas que un cliente puede escoger al momento de registrarse
Para que quede:
CallPlan ID List
Los números 1, 2 y 3 son los que aparecen en la columna ID del menú RATES → Call Plan. Ahora el cliente podrá escoger entre los tres. Los proveedores cambian periódicamente las tarifas. Normalmente cuando salen las tarifas nuevas, en el archivo que se recibe, se indica la fecha en que serán vigentes. En este ejemplo se verá como cargar las nuevas tarifas para la RateCard Base suponiendo que sean vigentes a partir de la fecha 01 noviembre 2016. Se entra en el menú Rate → RateCards y se crea una nueva con el enlace ADD RateCard. En el parámetro START DATE hay que indicar la fecha en que las tarifas serán vigentes. El resultado: 151
Esta nueva RateCard se nombrará Base2 para indicar que es parte del CallPlan Base y que es la segunda serie de tarifas de ese CallPlan (la Base1 ya existe). Como para la Base1 hay que importar las tarifas. Para la prueba, se utilizará el mismo archivo CSV utilizado para la Base1 con la configuración que aparece en la imagen que sigue:
Ya que esta RateCard empieza a funcionar desde el primero de Noviembre de 2016, hay que indicar que la vieja RateCard Base1 se vence el 31 de Octubre 2016 a las 23:59. Para eso se modifica la 152
Ratecard Base1 cambiando el parámetro EXPIRY DATE de esta forma:
Para terminar se añade la nueva RateCard Base2 al CallPlan Base:
Para conocer en cualquier momento cual es la Rate Card activa, se puede utilizar el Simulator. Se entra en el menú RATES → Simulator y en la pagina que aparece se rellenan los campos de la siguiente manera:
Se presiona el botón “Simulate” y aparecerá:
153
En la tabla se verá que para la llamada al numero indicado se utilizará el Call Plan Base y la Rate Card Base1. Si se realiza la misma prueba cuando sea vigente la Rate Card Base2, la nueva RateCard aparecerá en la linea tariffname. 5.2 El sistema de soporte A2Billing tiene un sistema de soporte para clientes y revendedores basado en los “tickets”. Los clientes o los revendedores, desde su pagina personal, pueden abrir tiquetes de soporte. Los administradores podrán ver y contestar los tiquetes creados. Según el tipo de incidencia, ésta se puede enviar a una dirección de correo electrónico en lugar de otra. Esto se realiza creando, por ejemplo, dos SUPPORT BOX distintas. Una para el departamento administrativo y otra para el departamento de soporte técnico. Se entra en el menú SUPPORT → Support boxes y se modifica la SUPPORT BOX presente:
de modo que quede:
Se personaliza el correo electrónico presente, se guardan los cambios y se crea otra para el soporte técnico:
154
Se personaliza el correo electrónico presente, se guardan los cambios y se entra en el menú SUPPORT → Ticket Components. En este menú se crean distintos objetos y se enrutan según el tema. En este caso se crearán 4 distintos objetos, dos de carácter administrativo (recargas y pagos) y dos técnicos (VoIP configuración y Callback). Se crea el primero modificando la entrada presente (DEFAULT):
Como se ve en la imagen todos los tickets abiertos con este objeto se enrutarán hacia el Support Box “Administración” En “USER TYPE” se puede definir si este componente es para los clientes, para los revendedores o ambos. Se continua con pagos:
Se crean los dos de soporte técnico:
155
Para probar el sistema se entra en la pagina personal de unos de los clientes creados. Desde el menú SUPPORT se crea un ticket escogiendo entre los 4 componentes creados. Un ejemplo:
Se presiona el botón CREATE para crear el ticket. Se vuelve a la pagina de administración donde aparecerá una nueva notificación:
Si se selecciona:
Seleccionando el enlace evidenciado se entrará directamente en la pagina del tiquete creado:
156
Se contesta y si se quiere cerrar el tiquete en el parámetro STATUS se selecciona “FIXED”. Para actualizarlo se presiona el Botón “UPDATE”. En en menú SUPPORT → Customers Tickets, aparecerá:
Una vez terminada la operación acordarse siempre de borrar la notificación para que no quede en la barra NOTIFICATION. A la casilla de correo electrónico del cliente llegará una copia del tiquete creado y de la respuesta del departamento de Soporte. Lo mismo al correo electrónico
[email protected]. Importante personaliar las plantillas de los correos electrónicos que se enviarán en MAIL → Mail Templates 5.3 Callback (Rellamada) En A2Billing la funcionalidad de Callback o rellamada se puede utilizar de dos formas: desde la pagina personal de los clientes (si activada) o marcando un numero conectado a la centralita Asterisk. Normalmente este numero es un numero geográfico o un numero de teléfono tradicional conectado a Asterisk a través de una gateway PSTN o Tarjeta telefónica instalada en el servidor Linux donde la centralita está funcionando.
157
En el primer caso la rellamada se procesa de la siguiente manera. El sistema llama el primer numero indicado en la pagina y cuando este conteste llama el segundo. En este caso el costo de la llamada será la suma del costo de la llamada hacia el primer numero y el costo de la llamada hacia el segundo numero. La configuración predefinida de A2billing es que cobre la primera llamada aunque la segunda no sea contestada. Si se quiere modificar este comportamiento, en el menú SYSTEM SETTINGS → Global List → Select Gruop → agi-conf1, se modifica la siguiente linea cambiando el parámetro de yes a no: Bill Callback
Yes
Se cobrará la llamada de Callback del primer canal aunque el segundo canal no ha contestado o no se ha podido establecer la llamada
En el segundo caso, el cliente marca un numero de acceso telefónico determinado donde se configura el sistema con el tipo de callback que se quiera utilizar. Los distintos tipos son: • •
•
cid-callback: el sistema lee el CALLERID del llamante y cuelga. Si el numero está presente en la configuración de algún cliente devuelve la llamada a ese numero. Cuando el cliente conteste, se le pedirá de marcar el numero de destino. cid-prompt-callback: el sistema lee el CALLERID del llamante y le pide que introduzca el numero de destino. Cuelga la llamada y si el CALLERID está presente en la configuración de algún cliente devuelve la llamada a ese numero. Cuando el cliente conteste, marca directamente el segundo numero escogido por el cliente. all-callback: el sistema lee el CALLERID del llamante y cuelga. Luego devuelve la llamada al numero del llamante y cuando este conteste, le solicita el código PIN que sería el ACCOUNT NUMBER de su cuenta. Una vez digitado el PIN, el sistema pedirá al cliente de marcar el numero de destino.
La configuración del CallBack en A2Billing se realiza en el menú CALLBACK. En este menú es posible definir los grupos de servidores utilizados y dentro de cada grupo, los servidores que se utilizarán para las llamadas de Callback. Entrando en el menú CALLBACK → Server Group se verá que hay solamente un grupo configurado. Entrando en el menú CALLBACK → Server se verá que hay solamente un servidor configurado. Como en la configuración de A2Billing se ha modificado el nombre de usuario y la contraseña para conectarse a la AMI de Asterisk (véase /etc/asterisk/manager.conf), hay que modificar la entrada:
158
Los dos parámetros son lo mismos que aparecen en el menú SYSTEM SETTINGS → Global List → Global:
Con esto ya se tiene configurado el servidor Asterisk y A2Billing para las llamadas de Callback. 5.3.1 Rellamada desde la pagina personal cliente En la primera prueba se verá como un cliente puede solicitar una llamada de Callback desde su pagina personal. Para efectuar una prueba de rellamada desde la pagina web del cliente se entra en el menú CALLBACK. En la pagina que aparece hay que indicar los dos números a marcar. En la primera linea se indica el propio numero y en la segunda el numero de la persona que se quiere llamar:
Los números que aparecen en la imagen no son reales. Lo importante es que la sintaxis de los números a marcar sea: código país + numero de teléfono. Antes de iniciar la llamada se entra en el servidor Linux y se modifica el dialplan: nano /etc/asterisk/extensions.conf Al final del archivo se añade este bloque: [a2billing-callback] exten => _X.,1,NoOp(llamada Callback) same => n,Agi(a2billing.php,1,callback) same => n,Hangup exten => h,1,Hangup Se guardan los cambios y se recarga el dialplan: asterisk -rx "dialplan reload" El contexto a2billing-callback es el que se ha configurado en SYSTEM SETTINGS → Global List → Callback:
159
Luego se escribe el comando que sigue para monitorear los registros del servicio de Callback: tail -f /var/log/a2billing/a2b-callback-daemon.log de esta forma se verá como el servicio de callback enviará la llamada a la AMI de Asterisk. Se vuelve a la pagina del cliente y se presiona el botón “Click here to Place de Call”. El sistema llamará el primer numero y cuando este conteste llamará el segundo. En la ventana terminal aparecerá:
Volviendo a la pagina de administración de A2billing y entrando en el menú Callback → Add se encontrará la llamada de Callback efectuada:
En STATUS aparece el estado de la llamada de Callback (en este caso SENT, enviada), en AR el resultado generado por el AMI de Asterisk, en este caso Success, significa que la llamada se ha cursado con éxito. Para terminar se entra en el menú CALL REPORTS → CDRs y se verá como el sistema ha facturado las dos llamadas:
bajo la columna CallType, se puede ver que para la primera “pata” de la llamada es CALLBACK y 160
para la segunda STANDARD, es decir el primer numero llamado aparecerá en el reporte como CALLBACK y el segundo como llamada normal STANDARD. 5.3.2 Rellamada con numero de acceso Como se ha dicho, para el segundo caso normalmente se utiliza un numero de acceso telefónico. Para que se pueda realizar la prueba sin tener este numero, se simulará su funcionamiento trabajando con los archivos sip.conf y extensions.conf de Asterisk. Primero se crea una nueva extensión en el archivo sip.conf: nano /etc/asterisk/sip.conf al final del archivo se añaden las siguientes lineas: [3000] type=friend secret=a2b854 host=dynamic nat=force_rport,comedia context=phones disallow=all allow=alaw allow=ulaw qualify=yes La extensión configurada tendrá acceso al contexto “phones”. Se guardan los datos y se abre el archivo del dialplan: nano /etc/asterisk/extensions.conf y al final del archivo se añaden las siguientes lineas: [phones] exten => 5000,1,Set(CALLERID(num)=189445322) same => n,Agi(a2billing.php,1,all-callback,57) same => n,hangup Una pequeña explicación. Se define un contexto con nombre “phones” que es el mismo al que la extensión 3000 tiene acceso. El callback que se está configurando no utiliza la autenticación basada sobre el CallerID del llamante. Esto significa que el sistema permitirá la rellamada y cuando el destinatario conteste, le pedirá de introducir su código PIN y luego el numero de destino. Como en este caso la llamada no se efectúa a un numero de acceso, en la primera linea se asigna un CallerID a la extensión (3000) que está llamando. Para que la prueba funcione, hay que configurar en la primera linea un numero real al que se quiere que el sistema llame (sin el prefijo del país). En la segunda linea se ejecuta el AGI de A2Billing especificando que es una llamada de callback sin autenticación previa 161
del llamante. Los últimos dos números son el código del país que hay que añadir al CallerID del llamante para devolverle la llamada (en este caso Colombia). Se guardan los cambios y se recarga el modulo SIP y el dialplan: aste CLI> sip reload CLI> dialplan reload Ahora se configura el X-Lite con los datos de la extensión 3000 configurada en el sip.conf (modificar Domain con el dominio/IP del servidor):
Se averigua que la extensión esté conectada a Asterisk: CLI> sip show peers
162
Ahora desde el softphone se marca la extensión 5000. El sistema leerá el CallerID del llamante (presente en la primera linea del bloque del dialplan) y colgará la llamada. Después de 10 segundos llamará ese numero y una vez que se conteste la llamada solicitará el numero de PIN y sucesivamente el numero de destino seguido de la tecla numeral. Una vez terminada la llamada, en los reportes de A2Billing aparecerá de la siguiente forma:
En este caso la primera “pata” de la llamada (el numero indicado en el archivo extensións.conf) será registrada como de CALLBACK. La segunda, el numero de destino marcado después del PIN será la parte STANDARD. En la segunda prueba se utilizará el cid-callback. En este caso el CALLERID del llamante tendrá que ser previamente registrado en la cuenta del cliente. Para empezar se modifica el dialplan: nano /etc/asterisk/extensions.conf Al final del archivo (bajo el contexto [phones]) se añade este bloque: exten => 5001,1,Set(CALLERID(num)=189445322) same => n,Agi(a2billing.php,1,cid-callback,57) same => n,hangup Se guardan los cambios y recarga el dialplan: aste CLI> dialplan reload CLI> quit El numero que aparece en la primera linea tiene que ser un numero real (fijo o celular) sin el prefijo del país. Ese mismo numero es el que a seguir se añadirá como identificativo de llamada en la cuenta del cliente. En la segunda linea personalizar el 57 con indicativo de su país. Se entra en la pagina de administración de A2Billing, en el menú CUSTOMERS → Caller-ID → Add CallerID. En esta pagina hay que asignar el CallerID configurado en el dialplan de Asterisk a unos de los clientes existentes (por ejemplo el primero):
163
Se guardan los cambios presionando el botón “CONFIRM DATA”. Ahora desde el softphone se marca la extensión 5001. El sistema leerá el CallerID del llamante y colgará la llamada. Después de 10 segundos llamará ese numero y una vez que se conteste la llamada se escuchará una locución que invitará a marcar el numero de destino seguido por la tecla numero (#). El el menú Call Reports → CDRs estará el registro de la llamada:
En la ultima prueba se utilizará el cid-prompt-callback. Como para el cid-callback el CallerID del cliente debe estar previamente configurado en el sistema. En este caso el cliente llama un numero de acceso, el sistema averigua que el CallerID del llamante esté configurado en alguna cuenta de los clientes y si así es, solicita el numero de destino y luego cuelga. Después de 10 segundos llama el numero del cliente y cuando esté conteste, marca directamente el numero de destino escogido por el cliente. Para realizar la prueba se abre nuevamente el dialplan: ext y después de este bloque: exten => 5001,1,Set(CALLERID(num)=189445322) same => n,Agi(a2billing.php,1,cid-callback,57) same => n,hangup se añade: exten => 5002,1,Set(CALLERID(num)=189445322) same => n,Agi(a2billing.php,1,cid-prompt-callback,57) same => n,hangup Se guardan los cambios y se recarga el dialplan:
164
aste CLI> dialplan reload Ahora desde el X-Lite configurado como extensión 3000 se marca el numero 5002. El sistema reconocerá el CallerID del llamante y le solicitará digitar el numero de destino seguido por la tecla numero. Una vez el cliente digite el numero, el sistema colgará. Como previsto, después de 10 segundos, el sistema llamará el numero del cliente y cuando este conteste, el numero de destino. En los reportes de A2Billing:
5.4 A2Billing como sistema de tarjetas prepago Hasta ahora se ha presentado la configuración de A2Biling como sistema Wholesale. En este párrafo se ilustrará como configurarlo como sistema de tarjetas prepago. A2Billing brinda la posibilidad de activar dos o más configuraciones y utilizarlas a la vez. Esto se realiza creando distintos agi-conf en el menú SYSTEM SETTINGS → Add agi-conf. Se entra en ese menú y en la pagina que aparece:
Se presiona el botón “Create AGI-CONF2” (ya que es el segundo agi-conf que se está creando). En la pagina que sigue se presiona el botón Search:
165
En la nueva pagina se prepara la configuración para un sistema de tarjetas prepago. Se activan casi todas las opciones disponibles en modo de poder probar el sistema en toda su totalidad. Luego se irán quitando algunas para hacer distintas pruebas. En negrita aparecen los parámetros que hay que modificar: Titulo Call to free DID Command Params
Valor Dial ,60,L(%timeout%:61000:30000)
Descripción Opciones para la aplicación Dial de Asterisk para las llamadas a números geográficos configurados en el sistema por los cuales no se cobran las llamadas entrantes.
Description
tarjetas-telefónicas
Un nombre para este perfil
Asterisk Version
1_11
Versión de Asterisk utilizada
Answer Call
Yes
En este caso el AGI tiene que contestar la llamada para aceptar los tonos DTMF enviados por los clientes.
Play Audio
Yes
Se habilita el utilizo de las locuciones audio
Say GoodBye
Yes
Se utilizará la locución Goodbye al terminar una llamada
Play Language Menu
Yes
Se presentará el IVR para escoger el idioma
Force Language
Fuerza el uso de un idioma para las locuciones
Intro Prompt
Locución de personalizada
introducción
Min Call Credit
0.5
Crédito mínimo para iniciar una llamada. Evita de obtener saldos negativo
Min Bill Duration
0
Duración mínima para que la llamada sea cobrada. 0 = se cobra a partir del momento en
166
que es contestada. Not Enough Credit
No
Con yes; si el cliente no tiene suficiente crédito en la tarjeta que está utilizando, se le permitirá seleccionar otra. No, no se le permite
New Caller ID
No
Si el parámetro anterior es Yes, este parámetro en Yes asocia el CallerID a la nueva tarjeta
Use DNID
No
No se utiliza la variable DNID
Not Use DNID
2400,2300
Lista de números que si marcados enviarán la llamada a la locución que solicitará el numero a marcar seguido de la tecla numero aunque el parámetro anterior esté configurado con Yes
Try Count
3
Numero de intentos permitidos al cliente para marcar un numero.
Force CallPlan
Para forzar el utilizo de un Callplan determinado (no se utiliza en este caso)
Say Balance After Auth
Yes
Anunciar al cliente el crédito disponible después de su autenticación
Say Balance After Call
Yes
Anuncia el crédito disponible al terminar la llamada
Say Rate
Yes
Anuncia llamada
Say Duration
Yes
Anuncia los minutos disponibles para la llamada en base al crédito del cliente.
Auto Set CLID
No
No se configura el CallerID en automático
Force CLID CLID Sanitize
167
el
costo
de
la
Deshabilitado CID
Si el parámetro anterior no está configurado, en este parámetro se configura cual numero se utilizará para el
identificativo de las llamadas salientes del cliente: • NO: desactivado • CID: uno de los números configurados por el cliente como identificativo de llamada • DID: uno de los números geográficos adquiridos por el cliente • BOTH: el identificativo de llamada puede ser o un DID del cliente o uno de los números configurados por el cliente. CLID Enable
Yes
Se autentica el cliente con el CallerID de donde llama (si configurado en el sistema)
Ask PIN
Yes
Si no se identifica el callerid del llamante, se le pedirá el PIN
FailOver LCR/LCD Prefix
No
Si en un CallPlan están presentes dos tarifas distintas para terminar la llamada (ejemplo prefijos 573 y 57) y se llama a un celular de Colombia, el sistema intentará sacar la llamada con la primera tarifa (573). SI no tiene éxito, se intentará utilizar la segunda tarifa (57). Con No se desactiva esta funcionalidad
Auto CLID
No
Si el cliente no se puede autenticar con el CallerID se le pedirá su numero de tarjeta e automáticamente se asociará al numero de tarjeta el CallerId del teléfono de donde está llamando el cliente. Con NO se desactiva.
168
Auto CLID Security
No
Con yes se controla que el CallerID del cliente esté asociado con la tarjeta que está utilizando para la llamada
SIP Call
No
Se habilita para permitir llamadas entre las extensiones SIP/IAX2 configuradas en el sistema y asociadas a los clientes.
SIP Call Prefix
555
Prefijo que hay que anteponer al numero de extensión SIP/IAX2 que se quiere llamar (funciona si SIP CALL = Yes)
Direct Call
No
Si se habilita no se presentará una locución para marcar un numero. Si este numero empieza por 555 la llamada sera cursada hacia la extensión SIP/IAX marcada; de otra forma se cursará normalmente
IVR Voucher Refill
Yes
Si está en Yes se permite recargar las tarjetas utilizando un voucher
IVR Voucher Prefix
8
Dígito a marcar desde el menú de tarjetas prepago para recargar la cuenta con un voucher
IVR Low Credit
Yes
Si está en Yes y el crédito disponible del cliente es menor que el valor definido en el parámetro “Min Call Credit”, se presentará en automático el IVR para recargar la tarjeta utilizando un voucher
Dial Command Params
,60,rL(%timeout%:61000:30000)
Opciones para el comando Dial de Asterisk. La opción r que aparece en la linea genera un timbrado falso. En algunos dispositivos este timbrado puede generar problemas de
169
facturación de la llamada. En esos casos, se quita la r de la linea de configuración del parámetro. SIP/IAX Params
Dial
Command ,60,L(3600000:61000:30000)
Opciones para el comando Dial para llamadas entre extensiones
Outbound Call
No
Forma de marcar el numero: No = SIP/Proveedor/numero – Yes = SIP/numero@IPProveedor
Failover Retry Limit
1
Numero de intentos de cursar la llamada utilizando las troncales de respaldo
Max Time
3600
Numero máximo de duración de una llamada cuya tarifa es igual o inferior a 0
Send Reminder
No
Yes = se envía un correo electrónico al cliente cuando su crédito es inferior al valor del parámetro “ Min Call Credit”
Record Call
No
Yes = se grabará el audio de las llamadas
Monitor File Format
gsm
Formato audio utilizado para grabar las llamadas
AGI Force Currency
Currency Cents Association Default Accountcode
170
Indicando una moneda el crédito disponible se anunciará en la moneda indicada en lugar de la moneda configurada por el cliente en su pagina personal usd:dollars,mxn:pesos,eur:euros,cop: Locuciones para las monedas pesos,all:credit configuradas Si en este parmentro se indica el numero de un cliente, o ACCOUNTCODE, todas las llamadas que utilizarán este agi-conf se cobrarán a ese cliente. Esto dependiendo de la configuración del parámetro “Default
Accountcode Behaviour” que aparece más adelante. Se deja vacío Option Local Dialing
No
No añadir el prefijo internacional del cliente si el numero marcado contiene un 0 inicial. Con Yes se añade
Max time to Call a DID no 3600 billed
Tiempo de duración de una llamada a un Numero geográfico configurado en el sistema por el cual no se cobran las llamadas entrantes. 3600 segundos = 1 hora.
File Enter Destination
prepaid-enter-dest
Locución utilizada para pedir al cliente el numero a marcar
Menu Language Order
es:en:fr
Lista de idiomas utilizables en los menú audio
Bill Callback
Yes
Se cobrará la llamada de Callback del primer canal aunque el segundo canal no ha contestado o no se ha podido establecer la llamada
International prefixes
011,00,09
Prefijos internacionales que se quitarán del numero marcado por el cliente si el CallPlan lo prevea
Extra charge DIDs
1800,1900
Cargos adicionales para DID que empiecen con 1800 0 1900 (por minuto)
Extra charge DID fees
0,0
Se indican los costos, por minuto, de llamadas a los números que empiecen con el prefijo indicado en el parámetro anterior.
Extra charge DID buy fees
0,0
Se indican los costos adicionales para la compra de números cuyo prefijo está presente en el parámetro “Extra charge DIDs”
Max Time For Unlimited Calls 3600
171
Tiempo máximo de duración de una llamada incluida en un paquete de minutos gratuitos
cuyo paquete tiene configurado en el parámetro PACKAGE TYPE el valor “Unlimited calls” Max Time For Free Calls
3600
Tiempo máximo de duración de una llamada incluida en un paquete de minutos gratuitos cuyo paquete tiene configurado en el parámetro PACKAGE TYPE el valor “Number of Free calls”.
CallPlan threshold Deck switch
Este parámetro se utiliza para pasar un cliente de un Call Plan a otro en el momento en que haya utilizado n segundos del primero. Los valores se indican de la siguiente forma: ID Call Plan : segundos (comma) ID segundo Call Plan : segundos. Ejemplo: 1:3600,2:7200
Disable annoucement the Yes second of the times that the card can call
Yes = no anuncia el numero de segundos si el cliente tiene disponible para la llamada más de un minuto
Currency Cents Association
usd:prepaid-cents,eur:prepaidcents,gbp:prepaid-pence,all:credit
Define las locuciones que se utilizarán para los centavos según la moneda.
Verbosity
3
Configura el nivel de detalle de los registros de A2Billling 3 = INFO
Logging
3
Lo mismo para lo registros
Dial Balance reservation
0.25
Crédito que se reserva por cada llamada en el caso de clientes que pueden utilizar más de una canal a la vez. Ayuda a prevenir la presencia de saldos negativos
Option CallerID update
Yes
Permitir al cliente de actualizar su CallerID antes de la llamada
Call to free DID Command Params 172
Dial ,60,L(%timeout%:61000:30000)
Opciones para la aplicación Dial de Asterisk para las
llamadas a números geográficos configurados en el sistema por los cuales no se cobran las llamadas entrantes. Auto Create Card
No
Si está en yes y el CallerID del cliente se captura, se generará una nueva tarjeta de llamadas asociadas al ese CallerID
Auto Create Card Length
10
Longitud del numero de tarjeta generado automáticamente
Auto Create Card Type
PREPAID
Tipo de tarjeta generada (PREPAID = prepago; POSTPAID = postpago)
Auto Create Card Credit
0
Crédito disponible en la tarjeta creada automáticamente (si es prepago)
Auto Create Card Limit
0
Si es una tarjeta postpago, aquí se fija el limite de crédito disponible para la tarjeta generada automáticamente
Auto Create Card TariffGroup
1
ID del Call Plan que se utilizará para la tarjeta generada automaticamente
Busy Timeout
3
Tiempo en segundos de la duración del tono de ocupado
Callback Reduce Balance
1
Monto que se quitará al crédito disponible del cliente para asegurarse que la llamada de callback tenga crédito suficiente.
IVR Locking option
Yes
Si está en Yes permite al cliente configurar un segundo código para acceder a su cuenta
IVR Account Information
Yes
Si está en Yes permite al cliente consultar una serie de datos relacionados con su cuenta
IVR Speed Dial
Yes
Si está en Yes permite al
173
cliente configurar los números de marcado rápido Play rate lower one
0
Si está en Yes anuncia el valor de la llamada aunque el costo sea menor de un centavo
Callback Beep for Destination
No
= Yes a lo largo de una llamada de callback, el llamante escuchará un beep cuando la llamada se establece.
Callback CID Prompt Confirm No PhoneNumber
Si está en Yes a quien inicia una llamada de callback se le pedirá de confirmar su numero
LCR Mode
Este parámetro ha sido añadido con la versión 2 de A2Billing. Si el valor es 0 A2billing busca el prefijo que más se acerca al numero marcado en todas las RateCard presente en un CallPlan y escoge la ruta más barata. Si el valor es 1 A2Billing busca en cada RateCard presente en un CallPlan el prefijo que más se acerca al numero marcado y entre todas las encontradas, escoge la ruta más barata.
1
Default Accountcode Behaviour No
Si está en Yes utiliza el ACCOUNTCODE definido en el parámetro “Default Accountcode” aunque la llamada tenga asociado un ACCOUNTCODE. Si está en no aplicará este ACCOUNTCODE solamente para las llamadas que no tengan uno.
Normalmente un sistema de tarjetas telefónicas se apoya a números de acceso telefónicos que los clientes marcan para efectuar sus llamadas. En este caso, como para el callback, se simulará la llamada modificando el dialplan de Astersk.
174
Se abre el archivo desde la consola del servidor Linux: nano /etc/asterisk/extensions.conf y al final del contesto [phones] se añaden las siguientes lineas: exten => 6000,1,NoOp(A2Billing Start) same => n,Agi(a2billing.php,2) exten => h,1,Hangup la parte importante de este bloque de dialplan es la segunda linea: cuando desde la extensión 3000 se marcará la extensión 6000 se ejecutará el AGI a2billing.php. El numero 2 que aparece después de la coma indica que se utilizará el segundo agi-conf creado, es decir, él que se acaba de configurar en la pagina de administración de A2Billing. Se guardan los cambios y se entra en la consola de Asterisk: asterisk -rvvvvvvvvvvvvv se recarga el dialplan: CLI> dialplan reload Para conocer la sintaxis de una aplicación de Asterisk el comando que hay que escribir es: CLI> core show application nombreaplicacion ejemplo: CLI> core show application NoOp -= Info about application 'NoOp' =[Synopsis] Do Nothing (No Operation). [Description] This application does nothing. However, it is useful for debugging purposes. This method can be used to see the evaluations of variables or functions without having any effect. [Syntax] NoOp([text]) [Arguments] text Any text provided can be viewed at the Asterisk CLI. 175
[See Also] Verbose(), Log() Para probar el sistema de tarjetas prepago, desde el X-lite conectado a Asterisk como extensión 3000, se marca el numero 6000. Se escuchará primero el IVR que permite seleccionar el idioma. Se presentan tres idiomas: ingles, francés, español. Esto se puede modificar en la pagina de administración de A2Biling menú System Settings → Global List → agi-conf2, parámetro “Menu Language Order “. Luego el sistema pedirá el código PIN (numero de tarjeta). Introducido el código PIN se escuchará el crédito disponible en la cuenta y sucesivamente una locución (hay solo en inglés) que anunciará que digitando la tecla 4 se puede entrar en un menú para recibir distintas informaciones acerca de la cuenta. Se continua con un anuncio que permite (digitando la tecla 5) configurar un segundo PIN para la cuenta. Si este PIN se configura, para poder efectuar una llamada habrá que digitar ambos (el numero de la tarjeta y el segundo PIN de seguridad). La siguiente locución anuncia que digitando la tecla 8 se puede recargar la cuenta con un Voucher. Más adelantes se realizará una prueba para efectuar este tipo de operación. El sucesivo anuncio permite configurar teclas para las llamadas rápidas, es decir asociar a un dígito (de 0 a 9) un numero de teléfono. De esta forma marcando ese dígito seguido de la tecla numero, se llamará directamente el numero de teléfono asociado. Por ultimo, después de todos estos menú, la ultima locución pedirá de introducir el numero a llamar seguido de la tecla numero (almohadilla). Como se puede ver, las opciones son muchas. Algunas son útiles y otras menos. Se puede ir depurando la configuración empezando con el IVR de los idiomas. Si este IVR se quita, el idioma predefinido será aquel configurado en el siguiente parámetro presente en la lista Global: Base Language
es
Idioma predefinido locuciones
de
las
En la lista de parámetros de agi-conf2 se modifica: Play Language Menu
Yes
Se presentará el IVR para escoger el idioma
Poniéndolo en no. Realizado el cambio se vuelve a marca la extensión 6000. Ya no se escuchará el IVR de los idiomas y la locución que pedirá de introducir el código PIN será en español. Una vez introducido el código PIN, el idioma predefinido para las locuciones a seguir, será el configurado por el cliente al momento de registrarse al sistema. Para simplificar las llamadas se pueden quitar el IVR para obtener informaciones acerca de la cuenta, el IVR para configurar las teclas de llamadas rápidas y el IVR para recargar la cuenta con un Voucher. 176
Esto porque el cliente puede ver esos datos en la pagina de su cuenta y de todas formas no son configuraciones importantes. Para ese efecto se modifican los tres siguientes parámetros:
IVR Account Information
Yes
Si está en Yes permite al cliente consultar una serie de datos relacionados con su cuenta
IVR Speed Dial
Yes
Si está en Yes permite al cliente configurar los números de marcación rápida
IVR Voucher Refill
Yes
Si está en Yes permite recargar las tarjetas utilizando un voucher
y se ponen en no. Se marca el numero 6000 otra vez. Quedará disponible una opción: la posibilidad de configurar un PIN de seguridad. Para recargar la cuenta con un voucher, primero hay que crearlo. Se entra en la pagina de administración de A2Billling y luego en el menú BILLING → Vouchers. Se escoge la opción Add Voucher y en la nueva pagina se crea uno:
Se toma nota del numero del voucher. En A2Billing existe la posibilidad de acceder directamente al menú del voucher sin tener que configurarlo entre las opciones disponibles que el cliente escucha cuando llama el numero de acceso dedicado a las tarjetas prepago. En este caso se utilizaría otro numero de acceso totalmente dedicado a las recargas con voucher. Para probar esta solución se vuelve a abrir el archivo del diaplan: nano /etc/asterisk/extensions.conf y al final de contexto [phones] se añade este bloque: 177
exten => 7000,1,NoOp(A2Billing Start) same => n,Agi(a2billing.php,2,voucher) same => n,Hangup En la segunda linea, después del nombre del archivo php y el numero del AGI que se utilizará, se pone la palabra voucher. De esta forma A2Billing sabrá que tiene que presentar ese menú. Se guardan los cambios y se actualiza el dialplan: asterisk -rvvvvvvvvvvvvvvvv CLI> dialplan reload Desde el X-Lite se marca la extensión 7000. El sistema solicitar el PIN del cliente, luego anunciará el crédito disponible y solicitará la introducción del numero de voucher para recargar la cuenta. Se digita el numero del voucher creado seguido por la tecla numero. Ahora en en menú BILLING → Vouchers aparecerá:
El voucher ha sido utilizado por el cliente cuyo numero de tarjeta es 8670787576. Si entramos en el pagina personal de ese cliente bajo el menú Vouchers:
aparecerá el voucher que el cliente acaba de utilizar como recarga. Todos los menú y las locuciones son completamente configurables según las exigencias del administrador de A2Billing y/o de los clientes. El cliente, desde su pagina personal, tiene la posibilidad de configurar hasta 5 distintos CallerID. Si efectúa la llamada desde uno de esos 5 teléfonos, el sistema no le pedirá de introducir el numero de la tarjeta porque lo autenticará utilizando el CallerID. Para realizar una prueba, se modifica el dialplan: nano /etc/asterisk/extensions.conf después de este bloque: exten => 6000,1,NoOp(A2Billing Start) same => n,Agi(a2billing.php,2) exten => h,1,Hangup 178
se añade: exten => 6001,1,NoOp(A2Billing Start) same => n,Set(CALLERID(num)=189445322) same => n,Agi(a2billing.php,2) same => n,Hangup En la segunda linea se pone el numero de teléfono como se ha configurado para el cliente para las pruebas de Callback. Se guardan los cambios y re recarga el dialplan de Asterisk: CLI> dialplan reload Desde X-Lite se marca la extensión 6001. El sistema no pedirá el numero de tarjeta del cliente. Otra opción que se puede configurar es la posibilidad de añadir en automático el CallerID del cliente una vez que se haya autenticado con su numero de tarjeta. De esta forma cuando el cliente vuelva a marcar desde el mismo teléfono, no se le pedirá más el numero de su tarjeta. Esta escenario se crea modificando este parámetro del agi-conf2: Auto CLID
No
Si el cliente no se puede autenticar con el CallerID se le pedirá su numero de tarjeta e automáticamente se asociará al numero de tarjeta al CallerId de teléfono de donde está llamando
Poniéndolo en Yes. Se marca la extensión 6000 y si introduce el numero de tarjeta. Se cuelga la llamada y se entra en la pagina de administración de a2billing. En los parámetros del cliente cuya tarjeta se ha utilizado para autenticarse, aparecerá el nuevo CallerID (en este caso el numero de la extensión 3000):
179
Si se vuelve a marcar la extensión 6000, el sistema ya no pedirá el numero de tarjeta. Si a lo largo de una llamada se deja que el llamado cuelgue primero, el sistema anunciará nuevamente el crédito disponible y permitirá efectuar una nueva llamada. 5.5 Paquetes de llamadas Una de las funcionalidades más interesantes de A2Billing es la posibilidad de crear paquetes de minutos/llamadas que luego se pueden ofrecer a los clientes. Un típico ejemplo es cuando se vende un plan mensual de llamadas a Colombia (por ejemplo) donde se incluye un determinado número de minutos gratuitos a fijos y/o celulares. Una limitación intrínseca de A2Billing es que no se pueden diferenciar los minutos gratuitos a celulares de los minutos gratuitos a fijos o crear distintos paquetes y asociarlos a un mismo Call Plan. Para empezar con la configuración se entra en el menú PACKAGE OFFER → Add → Add Package:
Los parámetros disponibles: LABEL: Un nombre que se asigna al paquete 180
PACKAGE TYPE: acepta tres distintas opciones: • • •
UNLIMITED CALLS: el paquete incluirá llamadas ilimitadas. En este caso en el parámetro FREE UNITS habrá que poner 0 (cero) que significa que las llamadas serán ilimitadas. NUMBER OF FREE CALLS: el paquete incluirá un numero determinado de llamadas gratuitas FREE SECONDS: el paquete incluirá un numero determinado de segundos de llamadas gratuitas
BILLING TYPE: si se quiere cobrar por el paquete, en este parámetro se define si el cobro se efectuará cada mes o cada semana (opciones Monthly y Weekly) STARTING DAY: si el parámetro anterior es Monthly, en este parámetro se indicará el día del mes en que el plan se activa y/o se vuelven a recargar los minutos/llamadas configurados. Si el parámetro anterior es Weekly, se indicará el día de la semana en que el plan se activa e/o se vuelven a recargar los minutos/llamadas configurados. En este caso los valores aceptados van de 1 a 7 (1 Lunes, 7 Domingo) FREE UNITS: el numero de llamadas o segundos incluidos en el plan según la configuración del parámetro PACKAGES TYPE. En este caso se ha configurado un paquete con nombre Colombia que incluye 10 minutos de llamadas al mes y que empieza cada primer día de cada mes. Se guarda la configuración presionando el Botón “Confirm Data” que aparece en la pagina. El programa volverá a la pagina anterior donde aparecerá el paquete que se acaba de crear:
Se selecciona en la parte derecha de la linea:
En la nueva ventana habrá que seleccionar los destinos que estarán incluidos en el plan (en este caso, fijos y celulares de Colombia):
181
Primero se selecciona el icono +: En la nueva ventana los destinos se pueden seleccionar uno a uno:
Para que el resultado sea (en el caso de llamadas genéricas a fijos de Colombia):
Si ahora se va a la ventana terminal y se entra en MySQL: mysql -u root -psesamo Se selecciona la base de datos a2billing:
182
mysql> use a2billing Se seleccionan todas las rutas presentes en el paquete: mysql> select * from cc_package_rate; El resultado:
¿Qué significa? Que al paquete de llamadas han sido añadidas todas las rutas presentes en las cuatro Rate Cards configuradas (dos Base, una Premium y una Platino). Para averiguarlo: mysql> select id,idtariffplan,dialprefix,buyrate,rateinitial from cc_ratecard where id='3417';
Bajo la columna “idtariffplan” aparece el numero de ID de la RateCards configurada. Esto significa que si se borra una ratecard para crear una nueva, automáticamente las tarifas presentes en el paquete de minutos no aplicarán para la tarifa borrada. Otra forma de añadir las rutas al paquete es utilizar el siguiente enlace:
En el menú que se despliega se seleccionan las siguientes opciones:
183
Se selecciona la casilla PREFIX y se pone 57, se selecciona la casilla “Begins with”. Se termina presionando el Botón “BATCH ASSIGNED”; se cierra la ventana:
Aparecerán todos los prefijos de Colombia incluidos en el paquete. Si no se selecciona la RATECARD, las rutas que aplicarán al paquete serán aquellas presentes en la RateCard con id más bajo, en este caso la base1 (la primera que se creó). Esto quiere decir que si se intenta asignar el paquete de minutos, como se verá más adelante, a los CallPlan Premium o Platino, el paquete no aplicará. Ahora que el paquete está listo se asocia al CallPlan Base. Se entra en el menú RATES → Call Plan y se escoge el CallPlan Base:
En el parámetro PACKAGES se escoge el paquete que se acaba de crear. Se termina presionando el Botón “Confirm Data”. A partir de este momento, todos los clientes cuyo CallPlan es Base tendrán el paquete disponible y utilizable. Para averiguarlo, se efectúa una llamada a un fijo o celular de 184
Colombia. Terminada la llamada se entra en el menú PACKAGE OFFER → Details:
Aparecerá una entrada con los siguientes datos: CARDID: numero de ID de cliente CARDNUMBER: numero de tarjeta del cliente PACKAGE: el paquete utilizado (en este caso Colombia) USED MINUTES: numero de minutos utilizados (15 segundos) NB PERFORMED: numero de llamadas efectuadas por ese cliente: 1 Si el mismo cliente efectúa una segunda llamada a un fijo/celular de Colombia, la misma pagina cambiará de la siguiente forma:
Para averiguar que efectivamente el paquete no aplica a los CallPlan Premium y Platino, se añade el paquete de minutos al CallPlan Platino. Luego se asigna a un cliente ese CallPlan y se realiza una llamada utilizando las credenciales de ese cliente. En los reportes de llamadas:
La llamada ha sido cobrada normalmente aunque se haya añadido al CallPlan Platino, el paquete Colombia:
Para cobrar el paquete se puede crear un Subscriptions Service o un Account Services, como se verá en los párrafos 5.9 y 5.10. 185
5.6 El Parámetro LCR Mode Como se ha visto en la configuración de los agi-conf, desde la versión 1.9.5 de A2billing es presente un nuevo parámetro: LCR Mode. Si el valor es 0 A2billing busca el prefijo que más se acerca al numero marcado en todas las RateCards presentes en un CallPlan y escoge la ruta más barata. Si el valor es 1 A2Billing busca en cada RateCard presente en un CallPlan el prefijo que más se acerca al numero marcado y entre todos los encontrados, escoge aquel que tiene asociada la tarifa más barata. Para ver como funciona, se efectúa una primera prueba. Se añade al CallPlan Base la RateCard Premium1:
Luego desde el X-lite configurado con los datos de configuración del primer cliente, se marca un numero fijo o de celular de Colombia. En los datos de la llamada:
Como se puede notar, la tarifa de venta que se ha aplicado es 0.068 y la troncal VozToVoice-1. En este caso se ha llamado un 57315 (Movistar Colombia). Ahora si en el menú RATES → Rates se mira los costos de las distintas RateCards:
186
Como era imaginable, se ha utilizado la RateCard Base1 (la más barata). La segunda prueba es crear una nueva RateCard Prueba1:
y añadir la nueva RateCard al CallPlan Base:
187
Luego volver a entrar en el Menú RATES → Rates y en la casilla a lado de la casilla “SELECT TRUNK” seleccionar la RateCard Prueba1 y luego presionar el botón Search; sucesivamente el enlace “Add Rate”. En la nueva ventana se crea una nueva tarifa utilizando los datos que aparecen en la imagen que sigue:
188
Se confirma la creación presionando el botón “Confirm Data” que aparece al final de la pagina. De este forma se ha creado una nueva tarifa para todas las llamadas cuyo prefijo empiece con 5731. Como esta tarifa es más barata de la Base1 y incluye también llamadas a números de Movistar Colombia (57315), debería ser la elegida por el sistema cuando se vuelva a marcar el mismo numero de la primera prueba. Desde X-Lite se vuelve a marcar el numero de celular:
efectivamente esta es la tarifa que el A2Billing ha escogido. 5.7 Añadir extensiones a un cliente En algunas ocasiones, por ejemplo pequeñas oficinas o residencias, los clientes necesitan más de una extensión ya que quieren realizar las llamadas desde distintos dispositivos. Otro ejemplo es cuando el cliente quiere conectar un fax tradicional a Asterisk para recibir y/o enviar FAX. En estos casos existe en A2Billing la posibilidad de crear nuevas extensiones y asociarlas a un cliente que ya existe en el sistema. Se entra en el menú CUSTOMERS → VOIP Settings y luego Add SIP Config. Como se puede ver, los datos predefinidos de algunos parámetros no son los mismos que crea el sistema cuando la extensión SIP se genera junto a la creación del cliente. Para modificar los datos predefinidos, se abre el siguiente archivo a la linea 115: nano +115 /usr/local/src/a2billing/admin/Public/form_data/FG_var_friend.inc se modifica este bloque: if ($form_action=="ask-add" || $form_action == "add_sip" || $form_action == "add_iax") { $AMAFLAGS_default= "value='".$A2B->config["peer_friend"]['amaflag']."'"; $TYPE_default= "value='friend'"; $NAT_default= "value='yes'"; $DTMFMODE_default= "value='RFC2833'"; $CANREINVITE_default= "value='yes'"; $DISALLOW_default= "value='all'"; $ALLOW_default= "value='ulaw,alaw,gsm,g729'"; $HOST_default= "value='dynamic'"; $CONTEXT_default= "value='".$A2B->config["peer_friend"]['context']."'"; $REGSECONDS_default= "value='0'"; $CANCALLFORWARD_default= "value='yes'"; $TRUNK_default= "value='yes'"; para que quede:
189
if ($form_action=="ask-add" || $form_action == "add_sip" || $form_action == "add_iax") { $AMAFLAGS_default= "value='".$A2B->config["peer_friend"]['amaflag']."'"; $TYPE_default= "value='friend'"; $NAT_default= "value='force_rport,comedia'"; $DTMFMODE_default= "value='RFC2833'"; $CANREINVITE_default= "value='no'"; $DISALLOW_default= "value='all'"; $ALLOW_default= "value='ulaw,alaw'"; $HOST_default= "value='dynamic'"; $CONTEXT_default= "value='".$A2B->config["peer_friend"]['context']."'"; $REGSECONDS_default= "value='0'"; $CANCALLFORWARD_default= "value='no'"; $TRUNK_default= "value='yes'"; Se guardan los cambios y se selecciona nuevamente Add SIP Config:
En ID CARD se selecciona el icono evidenciado y en la nueva ventana el cliente al que se quiere asociar la nueva extensión:
Automáticamente el parámetro ACCOUNTCODE tendrá como valor el numero de la tarjeta del cliente seleccionado. Esto porque este parámetro es el que permite al sistema saber a que cliente facturar la llamada. Se modifica solamente el siguiente parámetro que tiene que quedar en no:
Se confirma la creación de la nueva extensión con el botón CONFIRM DATA. En la lista de las extensiones aparecerá una nueva entrada:
La segunda extensión del cliente aparecerá con un grosor distinto a indicar que no es la principal. Se configura el X-Lite con los datos de usuario y contraseña de la nueva extensión creada y se realiza una 190
llamada.
En el campo CallerID aparecerá el numero de la extensión y en la columna Account el numero de la cuenta a la que será facturada la llamada. De esta forma el cliente, en su reporte de llamadas, podrá diferenciar las llamadas según la extensión de donde se realizaron. 5.8 El sistema de facturación El sistema de facturación es el corazón de A2Billing y es donde se maneja toda la parte contable del sistema. Los menú importantes y que se analizarán en este párrafo, son BILLING y INVOICES.
VOUCHERS: es el menú donde se crean los Vouchers para recargar las cuentas PREPAGO CUSTOMERS BALANCE: aparecen todos los datos contables de las cuentas de los clientes (facturas, pagos, facturas a pagar). De esta forma es posible conocer la situación contable de los clientes de forma resumida:
191
TRANSACTIONS: es donde aparecen todos los pagos realizados por los clientes con los sistemas activados en la plataforma (ejemplo PayPal) BILLINGS: en este menú aparecen todos las facturas y los recibos generados por el sistema. De manera predefinida el sistema crea nuevas entradas, para cada cliente, según el valor del parámetro INVOICE DAY presente en la cuenta del cliente mismo. Si el cliente es PREPAGO, el sistema creará un recibo con todos los gastos realizados hasta la fecha, si el cliente es POSTPAGO, creará un nueva factura que el cliente tendrá que pagar dentro de 7 días pena la suspensión automática de la cuenta. En cualquier momento es posible generar un nuevo recibo/factura desde el enlace Add Billing. En la pagina que aparece se selecciona el cliente y en el segundo campo que aparece la fecha actual. Se crea presionando el botón CONFIRM DATA:
En este caso, como el cliente con ID 1 es PREPAGO, se creará un recibo (menú INVOICES → Receipts:
REFILLS: aparecerán todas las recargas realizadas por los clientes, administradores PAYMENTS: aparecerán todos los pagos realizados por los clientes. A cada pago será asociada la correspondiente operación en REFILLS:
192
E-PAYMENT LOG: es el menú donde estarán presentes todos los registros de los pagos realizados por los clientes con los métodos disponibles en la plataforma. Un ejemplo:
CHARGES: En este menú aparecerán todos los costos para servicios adicionales contratados por el cliente: DID, pagos recurrentes:
AGENTS BALANCE: a partir de este menú empiezan una serie de entradas dedicadas a los revendedores. En este primer menú aparecerán todos los datos contables de cada revendedor, uno por linea:
COMMISSIONS: en este menú estarán presentes todas las operaciones que hayan generado una comisión para el revendedor:
REMITTANCE REQUEST: aquí es donde aparecen todos los pagos de las comisiones solicitadas por los revendedores y aceptadas por un administrador del sistema: TRANSACTIONS: es donde aparecen todos los pagos realizados por los revendedores con los sistemas activados en la plataforma (ejemplo PayPal) 193
REFILLS: aparecerán todas las recargas realizadas por los revendedores PAYMENTS: aparecerán todos los pagos realizados por los revendedores. A cada pago será asociada la correspondiente operación en REFILLS E-PAYMENT LOG: es el menú donde estarán presentes todos los registros de los pagos realizados por los revendedores con los métodos disponibles en la plataforma Pasando al menú INVOICES:
RECEIPTS: son los recibos generados por el sistema y que no tienen valor contable sino son el comprobante de los gastos realizados desde la generación del recibo anterior INVOICES: son la facturas generadas por el sistema y representan la parte contable. En el caso de cuentas PREPAGO, se generará una factura para cada recarga realizada por el cliente. En el caso de cuentas POSTPAGO, son los gastos generados por el cliente hasta la creación de la factura. Algunos ejemplos:
5.9 Subscription services Los servicios de suscripción permiten al administrador del sistema crear paquetes de ofertas mensuales a las que el cliente se puede suscribir al momento del registro y/o solicitando el servicio. El primer paso es crear uno entrando en el menú RECUR SERVICE → Subscriptions Services → Add SUBSCRIPTION SERVICE:
194
LABEL: una etiqueta que describa el servicio FEE: el costo mensual del servicio STATUS: activo o inactivo START DATE: fecha de creación del servicio STOP DATE: fecha de vencimiento del servicio EMAIL TO SEND REPORT: dirección de correo electrónico donde enviar los reportes relacionados con el servicio (personalizar) Se confirma la creación presionando el botón “CONFIRM DATA”. Ahora que el servicio se ha creado, hay dos forma de añadir suscriptores: • •
añadiendo los clientes manualmente creado un Subscriptions SIGNUP que permite al cliente escoger el servicio al momento del registro
Para la primera opción se entra en el menú RECUR SERVICE → Subscribers y se selecciona el enlace Add SUBSCRBER:
195
ACCOUNT ID: numero del cliente ID SUBSCRIPTION SERVICE: el paquete al que se va a subscribir el cliente. En este caso Colombia. START DATE: fecha actual STOP DATE: fecha en que se vencerá la suscripción PRODUCT LABEL: Una descripción que será la que aparecerá en el recibo del cliente cuando le será cobrado el servicio. Se confirma la creación con CONFIRM DATA Para la segunda opción se entra en el menú RECUR SERVICE → Subscriptions SIGNUP y se crea una nueva entrada:
LABEL: la etiqueta que describe el servicio: ACTIVATED: Yes o No SUBSCRIPTIONS OPTIONS: el paquete que se quiere utilizar con esta entrada (Colombia) DESCRIPTION: una descripción del servicio como aparecerá al nuevo cliente al momento del registro CALL PLAN: el call plan asociados al servicio. Como el paquete de minutos creado anteriormente es para el CallPlan Base, se selecciona ese CallPlan. Se guarda la configuración presionando el botón CONFIRM DATA Ahora si un cliente entra en la pagina de registro, le aparecerá:
196
Esto antes que se le pidan sus datos. Como se puede ver el cliente no tiene la posibilidad de rechazar la oferta y pasar a la pagina con el formulario con los datos de registro. En este caso hay dos opciones: 1. Crear distintos SUBSCRIPTIONS Service y SUBSCRIPTIOS SIGNUP de modo que el cliente pueda escoger el que más le interese 2. Crear un SUBSCRIPTIONS Service y un SUBSCRPTION SIGNUP que no tenga costo y que permita al cliente registrarse sin tener que escoger obligatoriamente un servicio. En el caso que el cliente escoja un servicio de pago y cree la cuenta, automáticamente el sistema le cobrará el primer pago del servicio. Como el cliente todavía no tiene crédito en su cuenta (la acaba de crear), cuando ingrese a su cuenta encontrará la factura a pagar y su STATUS será WAITING SUBSCRPTION PAYMENT. IMPORTANTE: el sistema cobra los Subscription service cada primer día del mes; esto sin tener en cuenta el día en que el cliente ha subscrito realmente el servicio. 5.10 Account Service Los Account Service permiten a los administradores crear toda una serie de cobros en las cuentas de los clientes. La diferencia con los Subscriptions Service es que estos pagos aplican a un grupo especifico de usuarios según el grupo de pertenencia y/o según su CallPlan. Otra diferencia es que son pagos que se basan en una serie de parámetros de configuración. Por ultimo en la cuenta del cliente, para que los Account Services apliquen, este parámetro:
tiene que estar en yes. Para mostrar como funciona, se crea el primero:
197
NAME: el nombre del servicio AMOUNT CREDIT: el valor que se cobrará para el servicio RULE: En este parámetro se pueden escoger distintas opciones: • • •
Apply service every Y Days: el servicio se cobrará cada Y días Apply service if card not used in last X days: el servicio se cobrará si la cuenta no ha sido utilizada en los últimos X días Apply service if card has been used in the last X days: el servicio se cobrará si la cuenta ha sido utilizada en los últimos X días
DAY NUMBER (X): este parámetro se configura solamente si en RULE se ha seleccionado la segunda o la tercera opción. En este caso se deja vacío PERIOD (Y): este parámetro se configura si en RULE se ha seleccionado la primera opción disponible. En este caso se pone every 7 days; se cobrará cada 7 días STOP MODE: cuando se deja de cobrar el servicio: • 198
Never: nunca
• •
Account balance below zero: cuando el crédito del cliente está por debajo de cero Max number of cycle reach: cuando se ha alcanzado el numero de ciclos indicados en el parámetro che sigue
MAX NUMBER OF CYCLES BY CARD: el numero máximo de veces que se puede cobrar el servicio a un Cliente/tarjeta STATUS: Active/Inactive EMAIL TO SEND REPORT: dirección de correo electrónico donde enviar los reportes relacionados con el servicio (personalizar) CALL PLAN: el servicio aplicará solamente a los clientes que estén asociados con el Call Plan Base (se puede indicar que sea por cualquier Call Plan seleccionando --ANY--) OPERATE MODE: hay dos opciones: • •
Allow be charged into negative balance: se permite que el servicio sea cobrado aunque el crédito del cliente es negativo Do partial charge but never go into negative balance: en el caso el cliente no tenga crédito suficiente para pagar el servicio, se le cobra parcialmente hasta llevar su crédito a 0.
SKIP GROUP: hay dos opciones: • •
List of group below: se indicará una lista de grupos a que no aplica el servicio. Los grupos son los que se ha creado en el menú CUSTOMERS → Groups Any group: el servicio aplicará a cada grupo configurado en CUSTOMERS → Groups
Se guardan los cambios presionando en botón CONFIRM DATA. Aparecerá el nuevo servicio configurado: Presionado el botón View Details, aparecerá una ventana con todos los datos contables del servicio:
Un ejemplo practico: se quiere cobrar un paquete de minutos semanalmente para los usuarios con cuenta Premium. Primero se crea el paquete de minutos desde el menú PACKAGE OFFER → Add: 199
Se continua asociando las rutas al nuevo paquete de minutos:
Se selecciona la RATECARD y PREFIX indicando que las rutas empiezan con 57. Como esta incluyen los celulares, luego se quitan de la lista de las rutas del paquete. Luego se asocia el paquete a la Call Plan Premiun desde el menú RATES → Call Plan, añadiéndolo de la siguiente manera:
Por ultimo se crea un nuevo servicio desde RECUR SERVICE → Account Service:
200
En este caso, como el servicio se estaría cobrando después de su utilizo, para la primera semana habría que realizar el cobro manualmente creando una recarga con valor negativo en la cuenta del cliente. 5.11 Números geográficos A2Billing puede ser utilizado también para la ventas de números geográficos. La única desventaja es que para volver disponibles los números a los clientes, en la mayoría de los casos hay que comprarlos anticipadamente. La plataforma integra las API de didx.net, es decir que si se tiene una cuenta con ese proveedor de DID, es posible adquirirlos directamente desde la pagina de administración de A2Billing. En este párrafo se ilustrará como configurar la cuenta de didx.net en el menú System Settings y como configurar un numero geográfico ficticio y enrutar las llamadas a un numero de teléfono fijo y una dirección SIP. 5.11.1 Didx.Net Una vez que se tenga una cuenta activa con este proveedor, hay que entrar en la pagina de administración de A2Billing, en el menú SYSTEM SETTINGS → Global List y seleccionar webui. En la lista de parámetros que aparece, hay que modificar los cuatro que siguen:
DIDX ID
708XXX
ID de la cuenta DIDx
DIDX PASS
XXXXXXXXXX
La contraseña
DIDX MIN RATING
3
Cada proveedor de DIDx tiene asignado un numero
201
que representa la calidad de los DID que está vendiendo. Si se quiere comprar solamente DID con Rating mínimo de 3, se pone ese numero en este parámetro. DIDX RING TO
did@IPlinode
Extensión donde enviar las llamadas entrantes de DIDX. Personalizar IPlinode con la IP del servidor o nombre de dominio
Las llamadas procedentes de DIDx, llegan a Asterisk desde una serie de IP predefinidas. Para que Asterisk las procese hay que añadir esa lista de IP en un archivo que luego se incluirá al sip.conf. De esta forma todos las IP de DIDx quedarán autenticadas y Asterisk no rechazará las llamadas. Esto porque en la configuración de la parte general del sip.conf de Asterisk se ha definido el parámetro allowguest en no, es decir que no se aceptan llamadas de usuarios no configurados, direcciones IP no autenticadas. La lista de IP se encuentra en esta pagina. Para la prueba, se toma la primera de la lista y se crea un archivo en el /etc/asterisk: nano /etc/asterisk/didx se pegan estás lineas: [67.15.180.14] host = 67.15.180.14 type = peer insecure = port,invite context = didx canreinvite=no disallow=all allow=g729 allow=ulaw dtmfmode=rfc2833 Se sigue el mismo procedimiento para cada IP de DIDx. Se guardan los cambios y se añade este archivo al sip.conf nano /etc/asterisk/sip.conf al final del archivo se pone:
202
#include didx Se guardan los cambios y se recarga la configuración SIP: asterisk -rvvvvvvvvvvvvv CLI> sip reload CLI> quit Ahora las llamadas de DIDx llegarán a Asterisk. La parte importante del bloque que se acaba de crear es el parámetro context donde se ha indicado como valor didx. Esto significa que todas las llamadas desde DIDx, entrarán a ese contexto y para que todo funcione hay que modificar el dialplan: nano /etc/asterisk/extensions.conf al final del archivo se pegan estas lineas: [didx] exten => _X.,1,Agi(a2billing.php,1,did) exten => h,1,Hangup De esta forma todas las llamadas que llegan desde DIDx a cualquier numero geográfico adquirido, entrarán a este contexto y serán procesadas por A2Billling. La palabra did presente en la primera linea, indica a A2Billing que todas las llamadas que lleguen a este contexto proceden de numeros geograficos y de esa forma tiene que procesarla. Se guardan los cambios y se recarga el dialplan. asterisk -rvvvvvvvvvv CLI> dialplan reload CLI> quit Desde el lado A2Billing ya se pueden adquirir DID de DIDx. Se entra en el menú Inbound DID → Import DIDX y se compra el numero:
203
Para terminar la operación se presiona el botón evidenciado. 5.11.2 Configurar Numero DID Para probar el sistema de DID de A2Billing sin tener que comprar un numero real, se sigue este procedimiento: Se entra en el menú INBOUND DID → Groups y se crea un nuevo grupo:
Se guardan los cambios presionando el botón Confirm Data. Se continua entrando en el menú INBOUND DID → Add :: Search y se añade un nuevo numero geográfico:
204
Los parámetros: DID: el numero que se pone en venta (totalmente inventado para la prueba) BILLING: la forma de cobrar el numero. Las opciones son: • Fix por month + dialroute: se cobra un fijo mensual más las llamadas si el cliente desvía el numero a un numero fijo/celular • Fix por month: se cobra solamente un fijo mensual • Only Dialing route: se cobran solamente las llamadas de desvío a un fijo/celular • Free: el numero es totalmente gratuito START DATE y EXPIRY DATE: fecha de inicio y de vencimiento de la disponibilidad del numero DIDGROUP: Este numero pertenecerá al grupo que se acaba de crear COUNTRY: el país del numero ACTIVATED: si el numero está activo o no MONTHLY RATE: el costo mensual del numero Se guardan los cambios presionando el botón Confirm Data. Ahora para que un cliente pueda adquirir los números hay que añadir en su perfil el grupo de DID que se ha creado “VozToVoiceDID”. Se entra en la cuenta de un cliente y se modifica este parámetro:
205
Para que el cliente pueda adquirir el numero además de este parámetro, hay que asegurarse que en el grupo al que pertenece, sea activada la funcionalidad para adquirir DID. Si por ejemplo el cliente pertenece al grupo Default se entra a ese grupo a través del menú CUSTOMERS → Groups y se averigua que la opción DID esté seleccionada:
Para terminar, se entra en la pagina del cliente, menú DID, y se averigua que el numero esté disponible para la compra:
Se selecciona el País, se selecciona el numero y se configura como primer destino de las llamadas un numero celular de Colombia (hay que incluir el prefijo del país) y se presiona el botón Next.
Se confirma la compra presionando el botón Ok. Aparecerá:
206
Para añadir el numero de extensión del cliente como destino de desvío:
El resultado:
En el caso de un desvío a una cuenta VoIP (en este caso SIP), el desvío tiene que ser validado por un administrador del sistema. En la columna PRIORIY aparece una valor que para ambos desvíos es 1. Esto significa que los dos números timbrarán a la vez. En el caso que se quiera que primero timbre el destino VOIP y luego el numero de celular:
A nivel de facturación, como la cuenta es PREPAGO, se descontará el valor de 10 dolares de la cuenta del cliente y aparecerá un nueva entrada en el recibo que se creará al primer día del mes siguiente. Desde la pagina del cliente se entra en el menú INVOICES → Preview next billing:
207
Ahora para realizar la prueba de llamada, se configura en X-Lite la cuenta del cliente y en un segundo SoftPhone la cuenta del cliente que llamará el DID Configurado. Se marca el numero 130599999 y se averigua que pasa en la consola de Asterisk:
El sistema primero llamará la extensión SIP. Si esta no está disponible llamará el numero de celular configurado:
El cliente que ha realizado la llamada no pagará nada ya que A2Billing antes de sacar cualquier llamada externa averigua si el numero marcado está presente en la lista de DID configurados. El único que pagará será el cliente que recibe el desvío a su numero de celular. Si se quiere que el llamante pague de todas formas algo para esa llamada, se entra en el menú INBOUND DID → Add :: Search y se modifica el numero configurado:
En el bloque DID on Net Charges se pone un costo al minuto para llamadas a DID configurados en el sistema. Si se vuelve a marcar el DID:
Aparece como costo 0.003 porque el cobro es por segundo. 208
En algunos casos los proveedores de Números Geográficos o DIDs, cobran un valor para todas las llamadas entrantes que se reciban. El valor cobrado puede ser diferente según la hora; normalmente más caro en el día y más barato en la noche. Para aplicar ese costo al cliente, se utilizan los últimos tres bloques presentes en la pagina de configuración del DID:
En el primer bloque se configuran los horarios de tarifa alta y de tarifa baja; la sintaxis es: • • • • • •
hora inicio hora final días de la semana días del mes (1-31). El asterisco indica todos mes (1-12). El asterisco indica todos p (hora más cara) o (hora más barata)
Si por algún motivo los horarios de tarifa baja y los horarios de tarifa alta se sobreponen, se tomará la tarifa baja como referencia.
En el segundo bloque se configuran las tarifas para la franja horaria alta. El este caso no hay costo para 209
establecer la llamada que tiene un costo de 0.03 centavos de dólar con tarificación al segundo y se vende sin costo de establecimiento de llamada a un precio de 0.04 centavos de dólar con tarificación al minuto.
En el ultimo bloque se configuran las tarifas para la franja horaria de bajo coste siguiendo las misma pautas utilizadas en el bloque anterior. Una vez terminada la configuración, se guardan los datos presionando el botón CONFIRM DATA. 5.12 A2Billing en dos servidores Si no se quiere cargar mucho el servidor y diferenciar los servicios, es posible instalar la parte Web en un servidor y Asterisk en otro servidor. Como el tiempo de acceso a la base de datos a2billing es bastante importante del lado Asterisk y menos del lado Web, MySQL se instalará en el servidor donde se encuentra la PBX. En este párrafo se ilustrarán solamente las partes directamente relacionadas con A2Billing. Para la instalación de Asterisk en el primer servidor y del servidor Web en el segundo, seguir los mismos pasos descritos en los capítulos anteriores. Escenario: Dirección IP primer servidor: 192.168.100.100 – Asterisk PBX Dirección IP segundo servidor 192.168.100.200 – Web 5.12.1 Primer Servidor – Asterisk PBX En este servidor, además de Asterisk PBX hay que instalar el servidor MySQL y PHP. 210
Se entra en la carpeta donde se descargará A2Billing: cd /usr/local/src wget https://github.com/Star2Billing/a2billing/archive/v2.2.0.tar.gz Se descomprime: tar -xf v2.2.0.tar.gz se renombra la carpeta creada: mv a2billing-2.2.0 a2billing cd a2billing A partir de la versión 2.1.1 se utiliza Composer para instalar toda las dependencias; como algunas se instalan utilizando el programa GIT, primero se instala este paquete: yum install git -y Luego se utiliza Composer para instalar las dependencias: curl -sS https://getcomposer.org/installer | php php composer.phar update php composer.phar install Se entra en el cliente MySQL: mysql -u root -psesamo se crea la base de datos a2billing: mysql> create database a2billing; Query OK, 1 row affected (0.00 sec) se otorgan los permisos de acceso a la base de datos creada al usuario a2user identificado con la contraseña sesamo. Desde local: mysql> GRANT ALL PRIVILEGES ON a2billing.* TO 'a2user'@'localhost' IDENTIFIED BY 'sesamo'; Query OK, 0 rows affected (0.00 sec) y desde el segundo servidor
211
mysql> GRANT ALL PRIVILEGES ON a2billing.* TO 'a2user'@'192.168.100.200' IDENTIFIED BY 'sesamo'; Query OK, 0 rows affected (0.00 sec) se actualizan los permisos: mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) se sale del cliente MySQL: mysql> quit Bye Para que el segundo servidor pueda acceder a MySQL desde remoto, hay que modificar IPtables: nano /etc/sysconfig/iptables después de esta linea: -A INPUT -p tcp -m state --state NEW -m tcp --dport 15000 -j ACCEPT se añade: -A INPUT -p tcp -m state -m tcp --dport 3306 --state NEW -s 192.168.100.200 -j ACCEPT 192.168.100.200 es la dirección IP del segundo servidor (la parte Web). Se guardan los cambios y se reinicia iptables: service iptables restart Se crean las tablas en la base de datos a2billing utilizando el script presente en la siguiente carpeta: cd a2billing/DataBase/mysql-5.x/ se ejecuta: ./install-db.sh Se insertan los datos como mostrado en la imagen que sigue:
212
Para resumir: Database Name: a2billing Hostname: localhost Username: root Password: sesamo Se instalan las locuciones distribuidas con el programa (ingles, francés, español, portugués y ruso): cd /usr/local/src/a2billing/addons/sounds/ utilizando el siguiente script: ./install_a2b_sounds.sh Se copia el archivo de configuración de a2billing en la carpeta /etc: cp /usr/local/src/a2billing/a2billing.conf /etc/ se abre con el editor: nano /etc/a2billing.conf se modifican estas lineas: [database] hostname = localhost port = user = a2billing_dbuser password = a2billing_dbpassword dbname = a2billing_dbname dbtype = mysql para que queden: 213
[database] hostname = localhost port = 3306 user = a2user password = sesamo dbname = a2billing dbtype = mysql Se guardan los cambios. A2Billing para recargar la configuración de Asterisk (en el caso las extensiones se guarden en los archivos que se acaba de crear) y para generar las llamadas de callback se apoya al AMI (Asterisk Manager Interface) de la PBX. Es por eso que hay que configurar el archivo manager.conf. Se abre: nano /etc/asterisk/manager.conf Se cambian las siguientes tres lineas: enabled = no ;allowmultiplelogin = yes ;displayconnects = yes para que queden: enabled=yes allowmultiplelogin = yes dislplayconnects=yes A2billing, para conectarse al AMI de Asterisk, se instala con un usuario y una contraseña predefinidos. Por este motivo al final del archivo se añaden las siguientes lineas: [asterisk] secret=sesamo deny=0.0.0.0/0.0.0.0 permit=127.0.0.1/255.255.255.255 permit=192.168.1.200/255.255.255.255 read = system,call,log,verbose,agent,user,config,dtmf,reporting,cdr,dialplan write = system,call,agent,user,config,command,reporting,originate dando acceso a la AMI desde local y desde el servidor Web. Se guardan los cambios y se continua con los script AGI presentes en el paquete de A2Billing. Uno se utiliza para realizar las llamadas (a2billing.php) y el segundo para monitorear el servidor (a2billing_monitoring.php). Se entra en la carpeta que contiene los AGI: cd /usr/local/src/a2billing/AGI se crean dos enlaces simbólicos de los dos AGI en la carpeta /var/lib/asterisk/agi-bin donde Asterisk 214
busca los AGI que se ejecuten: ln -s /usr/local/src/a2billing/AGI/a2billing.php /var/lib/asterisk/agi-bin/a2billing.php ln -s /usr/local/src/a2billing/AGI/a2billing_monitoring.php /var/lib/asterisk/agi-bin/a2billing_monitoring.php
Como los AGI se apoyan en una serie de librerías contenidas en la carpeta /lib, se crea un enlace simbólico también a esta carpeta: ln -s /usr/local/src/a2billing/AGI/lib /var/lib/asterisk/agi-bin/lib Se vuelven ejecutables los dos archivos: chmod +x /var/lib/asterisk/agi-bin/a2billing.php chmod +x /var/lib/asterisk/agi-bin/a2billing_monitoring.php Una vez terminada esta parte se crean una series de carpetas. La primera es donde se guardarán los archivos temporales creados por los script de A2Billing: mkdir -p /var/lib/a2billing/script la segunda donde se guardará el proceso del servicio de callback: mkdir -p /var/run/a2billing Los registros de las actividades de A2Billing se guardan en una serie de archivos que hay que crear antes de acceder por primera vez al programa. Primero se crea la carpeta: mkdir /var/log/a2billing luego los archivos: cd /var/log/a2billing touch cront_a2b_alarm.log cront_a2b_autorefill.log cront_a2b_batch_process.log \ cront_a2b_archive_data.log cront_a2b_bill_diduse.log cront_a2b_subscription_fee.log \ cront_a2b_currency_update.log cront_a2b_invoice.log cront_a2b_check_account.log \ a2billing_paypal.log a2billing_epayment.log a2billing_api_ecommerce_request.log \ a2billing_api_callback_request.log a2billing_api_card.log a2billing_agi.log A2biblling necesita que se ejecuten una serie de script para monitorear el sistema y para elaborar algunas funciones (ejemplo: pagos, facturas, etc.). Estos script se añaden al cron del sistema: crontab -e Al final del archivo se pega el siguiente bloque de lineas: # A2Billing 215
# Para actualizar la tasa de cambio de las monedas 0 6 * * * php /usr/local/src/a2billing/Cronjobs/currencies_update_yahoo.php # Para el pago se servicios subscritos 0 6 1 * * php /usr/local/src/a2billing/Cronjobs/a2billing_subscription_fee.php # Para notificaciones cuando el credito del cliente es más bajo de lo indicado 0 * * * * php /usr/local/src/a2billing/Cronjobs/a2billing_notify_account.php # Para el pago de los numeros geograficos asociados a los clientes 0 2 * * * php /usr/local/src/a2billing/Cronjobs/a2billing_bill_diduse.php # Para el pago de servicios periodicos 0 12 * * * php /usr/local/src/a2billing/Cronjobs/a2billing_batch_process.php # Para la generación de las facturas de los clientes 0 6 * * * php /usr/local/src/a2billing/Cronjobs/a2billing_batch_billing.php # Para la generación de llamadas automaticas utilizadas en las campañas # */5 * * * * php /usr/local/src/a2billing/Cronjobs/a2billing_batch_autodialer.php # Para la gestión de las alarmas que se pueden configurar en A2Billing 0 * * * * php /usr/local/src/a2billing/Cronjobs/a2billing_alarm.php # Para archivar los datos de las llamadas más viejos de lo indicado en la configuración de A2Billing 0 12 * * * php /usr/local/src/a2billing/Cronjobs/a2billing_archive_data_cront.php # Para recargar el crédito de un cliente en automatico 0 6 1 * * php /usr/local/a2billing/Cronjobs/a2billing_autorefill.php Se reinicia el cron: /etc/init.d/crond restart El demonio para la rellamada se instala en este servidor. El demonio para el Callback es el que permite utilizar el sistema de callback de A2Billing. El programa es escrito en el lenguaje de programación Python y es por eso que primero hay que instalar unos paquetes que se necesitan para la compilación del programa: yum install python-setuptools MySQL-python python-devel Luego, a través de easy_install, se instala el programa sqlalchemy: easy_install sqlalchemy Una vez satisfechas estas dependencias, se puede empezar con la compilación y instalación del programa de callback: cd /usr/local/src/a2billing/CallBack/callback-daemon-py/dist/ tar -xf callback_daemon-1.0.prod-r1528.tar.gz cd callback_daemon-1.0.prod-r1528 se compila: 216
python setup.py build python setup.py bdist_egg easy_install dist/callback_daemon-1.0.prod_r1528-py2.6.egg Compilado el programa se instala come servicio a través de uno script ya presente en el paquete de A2Billing: cd /usr/local/src/a2billing/CallBack/callback-daemon-py/callback_daemon Se copia el script: cp a2b-callback-daemon.rc /etc/init.d/a2b-callback-daemon Se vuelve ejecutable: chmod +x /etc/init.d/a2b-callback-daemon Se añade a la lista de servicios: chkconfig --add a2b-callback-daemon Por defecto el servicio guarda los registros en la carpeta /var/log y tiene que arrancar después de MySQL y Asterisk. Para ese efecto hay que abrir el archivo: nano /etc/init.d/a2b-callback-daemon y cambiar estas lineas: # chkconfig: 2345 40 60 LOG='/var/log/a2b-callback-daemon.log' para que queden: # chkconfig: 2345 95 60 LOG='/var/log/a2billing/a2b-callback-daemon.log' Se guardan las modificaciones y se configura para que arranque en automático con el sistema: chkconfig a2b-callback-daemon on Ahora ya se puede iniciar el servicio: /etc/init.d/a2b-callback-daemon start a2b_callback_daemon is stopped Starting a2b-callback-daemon: 217
[ OK ]
y controlar que esté funcionando: tail -f /var/log/a2billing/a2b-callback-daemon.log "2011-04-23 19:10:52,297 - root - MainThread - INFO - waiting..." "2011-04-23 19:10:57,308 - root - MainThread - INFO - waiting..." "2011-04-23 19:11:02,322 - root - MainThread - INFO - waiting..." "2011-04-23 19:11:07,355 - root - MainThread - INFO – waiting..." Se sale del comando tail con CTRL-C Se termina la configuración del primer servidor con el sip.conf, el extensions.conf y Asterisk Realtime. 5.12.2 Segundo Servidor – Parte Web Se instala el servidor Web, PHP y GIT: yum install php php-gd php-mysql php-process httpd mod_ssl php-cli php-soap php-xml -y yum --enablerepo=epel install php-mcrypt -y Terminada esta operación, se configura la zona horaria en el archivo de configuración de PHP (php.ini) nano +946 /etc/php.ini Se modifica la linea para que quede (personalizar con su zona horaria): date.timezone = America/Bogota En el mismo archivo se busca esta linea: upload_max_filesize = 2M y se modifica para que quede: upload_max_filesize = 8M Se continua con A2Billing: cd /usr/local/src wget https://github.com/Star2Billing/a2billing/archive/v2.2.0.tar.gz Se descomprime:
218
tar -xf v2.2.0.tar.gz se renombra la carpeta creada: mv a2billing-2.2.0 a2billing cd a2billing A partir de la versión 2.1.1 se utiliza Composer para instalar toda las dependencias; como algunas se instalan utilizando el programa GIT, primero se instala este paquete: yum install git -y Luego se utiliza Composer para instalar las dependencias: curl -sS https://getcomposer.org/installer | php php composer.phar update php composer.phar install Se copia el archivo de configuración de a2billing en la carpeta /etc: cp /usr/local/src/a2billing/a2billing.conf /etc/ se abre con el editor: nano /etc/a2billing.conf se modifican estas lineas: [database] hostname = localhost port = user = a2billing_dbuser password = a2billing_dbpassword dbname = a2billing_dbname dbtype = mysql para que queden: [database] hostname = 192.168.100.100 port = 3306 user = a2user password = sesamo dbname = a2billing dbtype = mysql
219
Importante señalar que en hostname se pone la dirección IP del primer servidor que es donde se encuentra la base de datos A2Billing. Se guardan los cambios. Una vez terminada esta parte, se crea un enlace simbólico a las carpetas que se necesitan para la parte Web de A2billing que son: • • • •
admin (para la conexión de los administradores) customer (para la conexión de los clientes) agent (para la conexión de los agentes/revendedores) common (común a la demás tres)
ln -s /usr/local/src/a2billing/admin/ /var/www/html/admin ln -s /usr/local/src/a2billing/agent/ /var/www/html//agent ln -s /usr/local/src/a2billing/customer/ /var/www/html/customer ln -s /usr/local/src/a2billing/common/ /var/www/html/common Se cambian los permisos en estas tres carpetas donde se guardarán los archivos temporales para cada tipo de usuario: chmod 755 /usr/local/src/admin/templates_c chmod 755 /usr/local/src/customer/templates_c chmod 755 /usr/local/src/agent/templates_c Se cambia el usuario y grupo que tiene acceso a todas las carpetas creadas (es servidor Web Apache): chown -R apache:apache /var/www/html chown -R apache:apache /var/www/html/admin/ chown -R apache:apache /var/www/html/agent/ chown -R apache:apache /var/www/html/customer/ chown -R apache:apache /var/www/html/common/ Se crean algunos archivos de log donde escribirá el usuario apache (el servidor Web): mkdir /var/log/a2billing cd /var/log/a2billing touch cront_a2b_alarm.log cront_a2b_autorefill.log cront_a2b_batch_process.log \ cront_a2b_archive_data.log cront_a2b_bill_diduse.log cront_a2b_subscription_fee.log \ cront_a2b_currency_update.log cront_a2b_invoice.log cront_a2b_check_account.log \ a2billing_paypal.log a2billing_epayment.log a2billing_api_ecommerce_request.log \ a2billing_api_callback_request.log a2billing_api_card.log a2billing_agi.log Se cambian los permisos para el usuario apache (el servidor web): chown apache:apache /var/log/a2billing/*
220
Ahora, ya se puede entrar en la pagina de administración de A2Billing indicando la IP del segundo servidor: https://192.168.100.200 Debería aparecer la pagina de Login:
De esta forma el primer servidor se ocupa de cursar las llamadas y el segundo de toda la parte Web de A2Billing. A la hora de la configuración del SYSTEM SETTINGS → Global List → Global, es importante configurar correctamente la conexión al AMI de Asterisk modificando estos tres parámetros:
Manager Host
localhost
Host/IP para conectarse a la AMI de Asterisk
Manager User ID
asterisk
Usuario para la conexión a la AMI de Asterisk como creado en el archivo manager.conf de Asterisk
Manager Password
sesamo
Contraseña del usuario creado en el manager.conf de Asterisk.
Para que queden:
221
Manager Host
192.168.1.100
Host/IP para conectarse a la AMI de Asterisk
Manager User ID
asterisk
Usuario para la conexión a la AMI de Asterisk como creado en el archivo manager.conf de Asterisk
Manager Password
sesamo
Contraseña del usuario creado en el manager.conf de Asterisk.
La misma operación hay que ejecutarla en el menú CALLBACK → Server:
En el caso que el trafico de llamadas sea muy alto, es aconsejable desplazar la base de datos en un tercer servidor. Esto para evitar que cuando se realicen consultas complejas, el servidor con Asterisk se vea afectado con posibles consecuencias en la calidad de las llamadas. 5.13 Conteo de canales Cuando se configura un nuevo cliente (párrafo 4.7) entre los distintos parámetros que se pueden configurar hay:
Como se puede leer en la descripción, la funcionalidad no está implementada. En teoría su tarea sería la de limitar el numero de canales que un cliente puede utilizar siempre y cuando en la configuración de su cuenta se ha configurado el parámetro:
Para poder implementar esta funcionalidad, se podría utilizar MySQL realizando una consulta a la tabla cc_card de a2billing y de ahí sacar el valor del parámetro MAX CONCURRENT CALLS y compararlo con los canales que efectivamente está utilizando el cliente. El problema con este tipo de solución es que si el sistema procesa muchas llamadas concurrentes y/o se está utilizando un sistema de balanceo de carga entre distintos servidores Asterisk, no se puede tener cuenta de todas las llamadas realizadas en todos los servidores. 222
Afortunadamente hay una solución alternativa que se basa en un sistema de base de datos NoSQL: Redis. En general los sistemas NoSQL, a pesar de que no permiten consultas SQL, no utilizan tablas para guardar los datos, escalan mucho mejor horizontalmente; esto quiere decir que son más rápidos en elaborar las entradas y pueden almacenar una cantidad considerable de datos y acceder a ellos en tiempos breves. Para implementar esta solución, los pasos a seguir son: 1. 2. 3. 4. 5.
crear la consulta en la tabla cc_card de la base de datos A2Billing instalar el servidor Redis y la relativa librería Perl para interactuar con Asterisk Configurar el servidor Redis Crear el script que se encargará de la cuenta de los canales modificar el dialplan de Asterisk
Para crear la consulta en la tabla cc_card se utilizará el modulo func_odbc de Asterisk. Los pasos a seguir serían: • • •
Configurar ODBC para la conexión a la base de datos a2billing Configurar el archivo res_odbc.conf para conectarse a la base de datos a2billing utilizando el conector ODBC configurar el archivo func_odbc.conf
Como los primeros dos pasos ya se realizaron en el párrafo 3.3.3 (Asterisk Realtime), lo único que hace falta es configurar el archivo func_odbc.conf. Se renombra el predefinido: mv /etc/asterisk/func_odbc.conf /etc/asterisk/func_odbc.conf.old se crea uno nuevo: nano /etc/asterisk/func_odbc.conf y se copian la lineas que siguen: [canales] dsn=a2b readsql=select max_concurrent from cc_card where username='${SQL_ESC(${ARG1})}' Lo datos: • • •
223
[canales]: el nombre de la función que se va a crear: dsn=a2b: parámetro para la conexión a la base de datos. Este parámetro tiene que corresponder a la etiqueta que da inicio al bloque configurado en el archivo res_odbc.conf en la tercera linea aparece la consulta SQL que sería: selecciona el campo max_concurrent desde la tabla cc_card donde el valor username corresponde a la variable que te voy a pasar a través del diaplan.
Se guardan los cambios y se entra en la consola de Asterisk: aste Se recarga el modulo func_odbc CLI> module reload func_odbc.so y se mira si efectivamente la nueva función existe: CLI> core show function ODBC_canales -= Info about function 'ODBC_canales' =[Synopsis] Runs the referenced query with the specified arguments [Description] Runs the following query, as defined in func_odbc.conf, performing substitution of the arguments into the query as specified by ${ARG1}, ${ARG2}, ... ${ARGn}. This function may only be read, not set. SQL: select max_concurrent from cc_card where username='${SQL_ESC(${ARG1})}' [Syntax] ODBC_canales(
[...[,]]) Perfecto! Ya se puede salir de la consola de Asterisk: CLI> quit El segundo paso es instalar el servidor Redis y la relativa librería perl: yum --enablerepo=epel install redis perl-Redis -y Se configura el servidor Redis: se renombra el archivo de configuración predefinido: mv /etc/redis.conf /etc/redis.conf.old se crea uno nuevo: nano /etc/redis.conf se copian las lineas que siguen:
224
daemonize yes pidfile /var/run/redis/redis.pid port 6379 bind 127.0.0.1 timeout 0 loglevel notice logfile /var/log/redis/redis.log databases 16 save 900 1 save 300 10 save 60 10000 rdbcompression yes dbfilename dump.rdb dir /var/lib/redis/ appendonly no appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb slowlog-log-slower-than 10000 slowlog-max-len 1024 vm-enabled no vm-max-memory 0 vm-page-size 32 vm-pages 134217728 vm-max-threads 4 hash-max-zipmap-entries 512 hash-max-zipmap-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 activerehashing yes Con esta configuración, Redis escuchará sobre el puerto 6379 de todas las direcciones IP configuradas en el servidor. Se guardan los cambios y se configura para que se inicie al Boot del sistema: chkconfig redis on Ya se puede iniciar: service redis start Se averigua si hay errores y/o advertencias en los registros del programa: nano /var/log/redis/redis.log 225
Debería aparecer este WARNING: WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. Se soluciona como se dice en la linea: nano /etc/sysctl.conf al final del archivo se añade: vm.overcommit_memory = 1 Se guardan los cambios y se ejecuta el comando: sysctl vm.overcommit_memory=1 Se reinicia el servidor Redis: service redis restart Ya no debería aparecer más la advertencia. Para acceder a la consola del servidor Redis: redis-cli Para ver los datos presentes: redis 127.0.0.1:6379> keys * (empty list or set) Para salir: redis 127.0.0.1:6379> quit El cuarto paso es crear el script para contar el números de canales y guardarlos en Redis. Se entra en la siguiente carpeta: cd /usr/local/bin se crea un nuevo archivo: nano canales.pl
226
se copian las siguientes lineas: #!/usr/bin/perl my $redis_db = $ARGV[0]; my $command = $ARGV[1]; my $keyname = $ARGV[2]; my $value = $ARGV[3]; require Redis; my $redis = Redis->new(server => '127.0.0.1:6379'); if($redis_db > 0 && $redis_db < 16){ $redis->select("$redis_db"); } else { print "using Default Redis DB\n"; } if($command eq "GET"){ $val=$redis->get("$keyname"); print "$val"; } if($command eq "SET" && $value != ""){ $redis->set("$keyname" => "$value"); } if($command eq "INCR"){ $redis->incr("$keyname"); } if($command eq "DECR"){ $redis->decr("$keyname"); } $redis->quit; En el primer bloque se asignan 4 variables que el script recibirá desde Asterisk. Luego se configura la conexión al servidor Redis sobre la IP 127.0.0.1 y puerto 6379 (el predefinido). En el caso que el servidor Redis se encuentre en otro servidor, habría que indicar la IP publica de ese servidor y el puerto; luego en el servidor remoto abrir en el cortafuego el puerto 6379 para la IP del servidor donde está configurado el script. Se guardan los cambios y se vuelve el archivo ejecutable: chmod +x canales.pl Luego se prueba la conexión del script con el servidor Redis: ./canales.pl using Default Redis DB 227
Si no aparecen errores, significa que la conexión funciona correctamente. El ultimo paso es modificar el dialplan: ext se modifica este bloque: [a2billing] exten => _X.,1,NoOp(A2Billing Start) same => n,Agi(a2billing.php,1) same => n,Hangup exten => h,1,Hangup para que quede: [a2billing] exten => _X.,1,NoOp(A2Billing Start) same => n,System(/usr/local/bin/canales.pl 1 INCR ${CDR(accountcode)}) same => n,Set(CALLS=${SHELL(/usr/local/bin/canales.pl 1 GET ${CDR(accountcode)})}) same => n,GotoIf($[${CALLS} > ${ODBC_canales(${CDR(accountcode)})}]?cong) same => n,NoOp(El cliente: ${CDR(accountcode)} tiene ${CALLS} llamadas activas) same => n,Agi(a2billing.php,1) same => n,Hangup same => n(cong),Congestion(3) same => n,hangup exten => h,1,System(/usr/local/bin/canales.pl 1 DECR ${CDR(accountcode)}) exten => h,n,Hangup La cuenta de los canales se basará en el ACCOUNTCODE del cliente. Esto porque, como se dijo en el párrafo 5.7, es posible asociar más de una extensión a un cliente y el único parámetro común es propio el ACCOUNTCODE. En la segunda linea se ejecuta el script canales.pl pasando las siguientes variables: • • •
1: se utilizará la base de datos numero 1 de Redis (hay 16 disponibles) INCR: es el comando que se utiliza para aumentar de 1 unidad el valor de una variable. Si la variable no existe se creará y se le asociará el valor 1 ${CDR(accountcode)}: es la variable que contiene el ACOOUNTCODE de quien está llamando y será la variable que se creará en el servidor Redis
En la tercera linea se asocia a la variable CALLS el numero de canales en uso por el cliente. Valor que se obtiene consultando nuevamente la base de datos de Redis En la cuarta linea se compara el valor de la variable CALLS con el valor del parámetro MAX CONCURRENT CALLS configurado en la cuenta del cliente. Si la variable CALLS es mayor a ese 228
valor se envía la llamada a la etiquete cong donde se reproduce una señal de congestión y se cuelga la llamada. Si es inferior se continua con la siguiente linea del dialplan. Por ultimo en la extensión h,1 se utiliza el comando DECR para disminuir de una unidad en el servidor Redis el numero de canales utilizados por el cliente. Se guardan los cambios y se entra en la consola de Asterisk: aste Se actualiza el dialplan: CLI> dialplan reload y desde un cliente se realiza una llamada. El resultado en la consola de Asterisk: NoOp("SIP/09148-00000004", "A2Billing Start") in new stack System("SIP/09148-00000004", "/usr/local/bin/canales.pl 1 INCR 09148") in new stack Set("SIP/09148-00000004", "CALLS=1") in new stack GotoIf("SIP/09148-00000004", "0?cong") in new stack NoOp("SIP/09148-00000004", "El cliente: 09148 tiene 1 llamadas activas") in new stack AGI("SIP/09148-00000004", "a2billing.php,1") in new stack Cuando la llamada termine: System("SIP/09148-00000004", "/usr/local/bin/canales.pl 1 DECR 09148") Hangup("SIP/09148-00000004", "") En el servidor Redis debería estar la nueva variable con valor 0: redis-cli se selecciona la base de datos 1 redis 127.0.0.1:6379> select 1 OK Se saca la lista de variables presentes redis 127.0.0.1:6379[1]> keys * 1) "09148" Se mira el valor de la variable 1 redis 127.0.0.1:6379[1]> get "09148" "0"
229
En el caso de muchos trafico y/o una caída del servidor es posible reajustar la base de datos borrando todas las variables presentes: redis 127.0.0.1:6379[1]> FLUSHDB Ya se puede salir de cliente: redis 127.0.0.1:6379[1]> quit
230
Capitulo VI Seguridad del servidor La seguridad del servidor es la parte más delicada de toda la puesta en marcha del sistema de facturación A2Billing. Si alguien lograra acceder al servidor mismo, tendría acceso a cualquier tipo de información (datos de los clientes, troncales, etc). Es por eso que se necesita asegurar el sistema en su totalidad. Esto quiere decir que hay que hacerlo desde el protocolo SSH hasta el servidor Web pasando por el servidor Asterisk y el servidor MySQL. En el párrafo 1.2 ya se ha presentado la forma de asegurar los accesos SSH a través de la clave RSA. Con esta configuración es imposible para cualquier atacante poder acceder a la consola del servidor Linux. Lo importante es que nadie logre acceder a la clave RSA privada guardada en el computador local. En el párrafo 3.4 se ha visto como configurar el Firewall (cortafuegos) para dejar abiertos solamente algunos puertos bien definidos del servidor. La segunda fase es mejorar la seguridad del servidor Web que será el tema del próximo párrafo. 6.1 Poner en seguridad el servidor WEB Si se entra en la pagina principal del servidor Web: http://IPservidor aparece esta pagina:
Se ha dejado esta pagina disponible porque normalmente el sistema de facturación A2Billing es asociado con el sitio web de la empresa que está ofreciendo el servicio. En el caso que no se quiera o no se necesite configurar un sitio web, es mejor modificar esta pagina para que no sea la predefinida. Una posible solución es redireccionar el trafico que llega a esta pagina, a la pagina segura de los clientes. Esto se realiza copiando un pequeño archivo de texto en la carpeta raíz del servidor Web. cd /var/www/html nano index.html se copian estas lineas:
<meta http-equiv="refresh" content="3;URL=https://miempresa.com/customer"> En lugar de miempresa.com se pone el nombre de dominio asociado al servidor Linode. Se guardan los cambios y se recarga la pagina. Después de unos segundos, aparecerá la pagina de acceso de los clientes. Si se entra en la siguiente pagina: http:://ipservidor/common las carpetas serán visibles:
esto no es una buena cosa porque puede permitir accesos no deseados. Para que esto no suceda hay que modificar un parámetro en el archivo de configuración del servidor Web: nano +331 /etc/httpd/conf/httpd.conf y modificar la linea: Options Indexes FollowSymLinks para que quede: Options -Indexes FollowSymLinks
233
De esta forma ya no se podrán ver las carpetas presentes en el servidor. Se guardan los cambios y se reinicia el servidor Web: /etc/init.d/httpd restart Si se vuelve a entra a la misma pagina, se recibirá el siguiente mensaje:
A pesar de que las carpetas no son visibles, se están entregando bastantes datos sensibles (versión del servidor Web, distribución Linux y IP del servidor. Para reducir al mínimo la visibilidad de estos datos, se abre nuevamente el archivo de configuración de Apache: nano /etc/httpd/conf/httpd.conf y se modifica estas dos lineas: ServerSignature On ServerTokens OS para que queden: ServerSignature Off ServerTokens PROD Se guardan los cambios y se reinicia el servidor Web. Otra forma de reiniciarlo es utilizando el comando service: service httpd restart visitando la misma pagina se notará el cambio:
Mucho mejor. Si cualquier persona pone la dirección Web de la pagina de administración de A2Billing puede ver la 234
pagina y intentar acceder al sistema. Para evitar que se pueda acceder directamente, se configura el servidor Web para que pida un usuario y una clave de acceso. Esto se realiza siguiendo el procedimiento que se describe. Se abre el archivo de configuración del servidor Web: nano +338 /etc/httpd/conf/httpd.conf y se modifica este parámetro (en la linea 338 del archivo): AllowOverride None para que quede: AllowOverride All de esta forma el servidor Web leerá, si presentes, los archivos .htaccess en las carpetas del servidor web. Se reinicia el servidor: service httpd restart Se entra en la carpeta de la pagina de administración de A2Billing: cd /var/www/html/admin/Public y se crea el archivo .htaccess: nano .htaccess copiando estas lineas: order allow,deny deny from all order allow,deny deny from all AuthUserFile /etc/httpd/htpasswd AuthName "Administration" AuthType Basic require valid-user En el primer bloque se niega el acceso a la carpeta a todos los usuarios. En el segundo bloque se niega 235
el acceso al archivo .htaccess a todos los usuarios. En las ultimas cuatro lineas se define que tendrán acceso a la pagina solamente los usuarios que podrán validarse con una contraseña. Se guardan los cambios y se crea un usuario con su respectiva contraseña. El comando que permite este tipo de operación es htpasswd: htpasswd -c /etc/httpd/htpasswd admin New password: Re-type new password: Adding password for user admin se teclea dos veces la contraseña para el usuario admin y de esta forma se habrá configurado el primer usuario. Ahora si se intenta acceder a la pagina de administración de A2Billing: http://IPservidor/admin aparecerá la ventana:
Se ponen los datos de usuario y contraseña y se presiona el botón Aceptar. Ya se puede acceder a la pagina de administración de A2Billing. De esta forma, los eventuales visitantes de la pagina no tendrán la menor idea de lo que hay detrás de la ventana de autorización. 6.1.1 Creación y configuración de un certificado para el Servidor Web Para que toda la comunicación con el servidor Web sea cifrada y además ese cifrado se base en un certificado brindado por una autoridad de certificación reconocida, se creará ese certificado con Let's Encrypt. Primero se descarga la utilidad para crear el certificado: cd /usr/src git clone https://github.com/letsencrypt/letsencrypt
236
se entra en la carpeta creada: cd letsencrypt se instala el paquete que sigue desde los repositorios epel: yum --enablerepo=epel install python-virtualenv -y Se para el servidor apache (Web): service httpd stop y se ejecuta el comando para crear los certificados de manera manual (el único que parece funcionar con la versión 2.6 de Python instalada en CentOS 6.7): ./letsencrypt-auto certonly --debug el comando, instala las dependencias, actualiza el paquete si se necesita y, después de unos segundos, aparecerá:
Se pone una dirección de correo electrónico valida y se continua con Aceptar:
237
Se continua con Agree:
Se añades los dominios como indicado para que el certificado sirva para www.miempresa.com y miempresa.com. Se continua con Aceptar. Aparecerá (en este caso se ha utilizado el sub dominio sip50.voztovoice.org): IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/sip50.voztovoice.org/fullchain.pem. Your cert will expire on 2016-03-12. To obtain a new version of the certificate in the future, simply run Let's Encrypt again. - If like Let's Encrypt, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le Ahora se pasa a la configuración del servidor Web. Se abre el siguiente archivo: nano /etc/httpd/conf.d/ssl.conf Se modifican las siguientes líneas: SSLCertificateFile /etc/pki/tls/certs/localhost.crt SSLCertificateKeyFile /etc/pki/tls/private/localhost.key #SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt SSLProtocol all -SSLv2 SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DES para que queden: SSLCertificateFile /etc/letsencrypt/live/sip50.voztovoice.org/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/sip50.voztovoice.org/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/sip50.voztovoice.org/fullchain.pem SSLProtocol -ALL +TLSv1 +TLSv1.1 +TLSv1.2 SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 238
EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL ! LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4" y después de esta ultima linea se añade: SSLHonorCipherOrder on IMPORTANTE: Personalizar los primeros tres parámetros con el nombre de la carpeta donde se encuentra sus certificados. se guardan los cambios y se reinicia Apache: service httpd restart se accede con el dominio configurado. En este caso: https://sip50.voztovoice.org/admin Aparecerá:
para conocer la calidad de nuestro cifrado: https://www.ssllabs.com/ssltest/
Después de unos cuantos segundos:
239
6.2 Seguridad en Asterisk Hay una reglas de oro que se necesita seguir en la configuración de Asterisk. Estas reglas permiten mejorar la seguridad de la PBX y evitar ataques exitosos: 1. para las extensiones utilizar siempre contraseñas bastantes largas y difíciles de memorizar. 2. no utilizar la misma contraseña para todas las extensiones 3. no aceptar llamadas entrantes de invitados. Esto se configura con el parámetro allowguest=no en la parte general del sip.conf. Si se decide aceptar llamadas entrantes de invitados (sin autenticación), el contexto definido en la parte general del sip.conf no debe permitir el acceso a troncales SIP y/o lineas telefónicas tradicionales. 4. configurar en la parte general del sip.conf el parámetro alwaysauthreject=yes. De esta forma cualquier intento sin éxito de registro a extensiones existentes en la centralita, recibirá como respuesta que la extensión no existe, evitando dar trazas al atacante 5. No permitir el acceso al AMI de Asterisk desde remoto. En el caso que se necesite utilizar el AMI desde remoto, configurar Iptables de modo que acepte el trafico solamente desde determinadas direcciones IP. Un ejemplo es esta linea: -A INPUT -p tcp -m state --state NEW -m tcp --dport 5038 -s 192.168.142.200 -j ACCEPT Con esta linea se podrá conectar desde remoto al AMI de Asterisk solamente la maquina con IP 192.168.142.200. Otra forma es utilizar el protocolo TLS. 6. Utilizar números o nombres de extensiones largos y difíciles de memorizar 7. Utilizar las funciones GROUP y GRUP_COUNT o el servidor Redis para limitar las llamadas concurrentes de las extensiones. 8. Permitir las llamadas y el registro solamente si se utiliza el nombre de dominio y no la IP. En el archivo sip.conf, parte general, se añaden los siguientes dos parámetros: ◦ domain=dominiolinode y allowexternaldomains=no Cambiar dominiolinode con el dominio asociado al VPS de Linode o del servidor local. Si se intenta el registro utilizando la IP en lugar del nombre de dominio: NOTICE[1349]: chan_sip.c:28382 handle_request_register: Registration '"09148"' failed for '186.114.112.239:65165' - Not a local domain
from
Si se intenta sacar una llamada utilizando la IP en lugar del dominio, el resultado final será: SIP/2.0 403 Forbidden Via: SIP/2.0/UDP 240
192.168.1.14:60398;branch=z9hG4bK-524287-1---
04b8a746995a3c21;received=186.114.112.239;rport=60398 From: "09148";tag=03a57737 To: ;tag=as65c3fff6 Call-ID: 81564MTdhZWFhOGUwYzA1Mzc1MmZhOWU3ZDBmZTM0NjYwNjE CSeq: 2 INVITE Server: LibroA2Billing Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE Supported: replaces, timer Content-Length: 0 6.2.1 Fail2ban Ademas de estas 8 reglas, es posible instalar en el servidor Asterisk Fail2Ban, un programa que lee los registros de Asterisk (/var/log/asterisk/security) y si hay un numero determinado de intentos de conexión sin éxito, bloquea la IP de donde se han originados, interaccionando con Iptables (cortafuegos). Se descarga el programa: cd /usr/src wget https://github.com/fail2ban/fail2ban/archive/0.9.5.tar.gz se descomprime: tar -xf 0.9.5.tar.gz se entra en la carpeta creada: cd fail2ban-0.9.5 y se instala: python setup.py install Se activa el script para iniciarlo como servicio: cp /usr/src/fail2ban-0.9.5/files/redhat-initd /etc/init.d/fail2ban chkconfig --add fail2ban chkconfig fail2ban on cd /etc/fail2ban/filter.d
241
nano asterisk.conf La configuración presente es más que suficiente pero si se quiere se puede modificar. Se guardan los cambios y se termina modificando el archivo de configuración general de fail2ban: cd /etc/fail2ban nano jail.conf al final del archivo se añaden las lineas que siguen: [asterisk-iptables] enabled = true filter = asterisk action = iptables-allports[name=ASTERISK, protocol=all] sendmail-whois[name=ASTERISK, dest=root@localhost, [email protected]]
logpath = /var/log/asterisk/security maxretry = 5 bantime = 3600 En la línea logpath aparece el archivo de registros que fail2ban leerá para averiguar intentos frustrados de conexión a Asterisk. En la configuración hay que modificar la dirección de correo electrónico. En lugar de root@localhost se pone la dirección de correo electrónico donde se quiere recibir las notificaciones. En sender, en lugar de [email protected] se pone fail2ban@nombrededominio del servidor donde está instalado Asterisk. Para enviar los correos, fail2ban está configurado con Sendmail. Con esta configuración cuando se verifiquen 5 ataques del mismo tipo procedentes de la misma IP, Fail2ban bloqueará la IP insertando una nueva linea en el archivo de configuración de Iptables y mantendrá bloqueada la IP por 3600 segundos (una hora). Para que funcione hay que modificar el archivo de configuración de los registros de Asterisk: nano /etc/asterisk/logger.conf Se modifica esta linea: ;security => security para que quede: security => security,notice Se guardan los cambios y se reinicia Asterisk: service asterisk restart Se modifica un parámetro de este archivo:
242
nano +59 /etc/fail2ban/action.d/iptables-common.conf se modifica esta linea: lockingopt = -w Para que quede: lockingopt = Se guardan los cambios y se inicia fail2ban: /etc/init.d/fail2ban start Iniciando fail2ban:
[ OK ]
IMPORTANTE: cada vez que se reinicie Iptables, hay que reiniciar también el servicio de Fail2Ban: service iptables restart – service fail2ban restart Se averigua que no haya errores en el log de fail2ban: tail -f /var/log/fail2ban.log Si se quiere realizar 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 registrase, será bloqueada. Accediendo a la consola del servidor remoto desde otra dirección IP con el comando: iptables -L -v se verá la IP bloqueada:
243
Desde el log de fail2ban:
Si por error se bloquea la IP del propio computador, la única forma de quitar el bloqueo es parar y reiniciar Iptables o reiniciar el servidor Linux. 6.2.2 Bloquear IP por países Normalmente los clientes de una empresa que vende terminación SIP son casi siempre de una determinada aérea geográfica o, de todas formas, siempre habrán países donde no se vende trafico. En estos casos, para mejorar la seguridad de la PBX, es posible bloquear todas la IP de un determinado país y de esta forma evitar que se presenten ataques procedentes del país mismo. Este tipo de solución se apoya a una base de datos que contiene todas las IP del mundo, divididas por países, y Xtables-addons que contiene una serie de módulos adicionales para IPtables entre los cuales se encuentra él que permite interactuar con la base de datos. Los requerimientos para este tipo de instalación son: • • •
iptables >= 1.4.3 kernel-source >= 2.6.29 Perl
Primero se instalan algunos paquetes necesarios para la compilación de Xtables-addons: yum install xz iptables-devel zip unzip -y yum --enablerepo=epel install perl-Text-CSV_XS -y Luego se descargan las fuentes de Xtables-addons: cd /usr/src wget http://downloads.sourceforge.net/project/xtables-addons/Xtables-addons/xtables-addons-1.47.1.tar.xz
Se descomprime: tar -xf xtables-addons-1.47.1.tar.xz 244
Se entra en la carpeta creada, se compila e instala: cd xtables-addons-1.47.1 ./configure --prefix=/usr --libdir=/usr/lib64 make si a lo largo del make aparece este error: /usr/src/xtables-addons-1.47.1/extensions/compat_xtables.c: En la función 'xtnu_ipv6_find_hdr': /usr/src/xtables-addons-1.47.1/extensions/compat_xtables.c:633: error: faltan argumentos para la función 'ipv6_find_hdr' make[4]: *** [/usr/src/xtables-addons-1.47.1/extensions/compat_xtables.o] Error 1 make[3]: *** [_module_/usr/src/xtables-addons-1.47.1/extensions] Error 2 make[3]: se sale del directorio `/usr/src/kernels/2.6.32-573.8.1.el6.x86_64' make[2]: *** [modules] Error 2 make[2]: se sale del directorio `/usr/src/xtables-addons-1.47.1/extensions' make[1]: *** [all-recursive] Error 1 make[1]: se sale del directorio `/usr/src/xtables-addons-1.47.1' make: *** [all] Error 2 se corrige: nano /lib/modules/2.6.32-642.4.2.el6.x86_64/build/include/linux/autoconf.h se modifica esta linea: #define CONFIG_IP6_NF_IPTABLES_MODULE 1 para dejarla comentada: /* #define CONFIG_IP6_NF_IPTABLES_MODULE 1 */ Se guardan los cambios y se compila nuevamente: ./configure --prefix=/usr --libdir=/usr/lib64 make make install Se entra en la carpeta donde están presentes los script que permiten descargar la base de datos de GeoIP: cd geoip Se descarga la base de datos en formato CSV:
245
./xt_geoip_dl Desde la base de datos se crean los archivos de las IP por países: ./xt_geoip_build GeoIPCountryWhois.csv El resultado será la creación de dos carpetas que contienen las IP por países en el formato que IPtables puede leer. Se crea la carpeta predefinida donde IPtables buscará las IP: mkdir -p /usr/share/xt_geoip/ y se copian las dos carpetas: cp -r {BE,LE} /usr/share/xt_geoip/ Para bloquear las direcciones IP de un determinado país en IPtables, la sintaxis es: -A INPUT -m geoip --src-cc CN -j DROP CN es la sigla del país (en este caso China) Se puede realizar una prueba bloqueando todas las IP de su proprio País (en este caso Colombia) para el puerto 5060. Se abre el archivo de configuración de IPtables: nano /etc/sysconfig/iptables antes de esta linea: -A INPUT -p udp -m udp --dport 5060 -j ACCEPT se pone: -A INPUT -p udp --dport 5060 -m geoip --src-cc CO -j DROP Se guardan las modificaciones y se reinicia Iptables y Fail2ban: service iptables restart service fail2ban restart Ahora se intenta conectarse a Asterisk con las credenciales de unos de los clientes configurados en A2Billing. El registro no funcionará y en IPtables se verá, en la linea que se acaba de crear, que todos los paquetes han sidos rechazados iptables -L -v
246
Si se quiere invertir la configuración, es decir aceptar conexiones solamente desde Colombia, la linea cambiaría de: -A INPUT -p udp --dport 5060 -m geoip --src-cc CO -j DROP a -A INPUT -p udp --dport 5060 -m geoip --src-cc CO -j ACCEPT Claramente esto si los clientes y los proveedores VoIP son solamente de Colombia. En el caso que el proveedor VoIP sea de otro país (ejemplo Estados Unidos) habría que añadir otra linea después de la de Colombia: -A INPUT -p udp --dport 5060 -m geoip --src-cc US -j ACCEPT Si se quiere actualizar la lista de las IP de GeoIP de forma automática cada inicio mes se crea un script en bash: nano /usr/local/bin/geoip.sh se copian las siguientes lineas: #!/bin/bash /usr/src/xtables-addons-1.47.1/geoip/xt_geoip_dl /usr/src/xtables-addons-1.47.1/geoip/xt_geoip_build GeoIPCountryWhois.csv \cp -rf {BE,LE} /usr/share/xt_geoip/ /etc/init.d/iptables restart /etc/init.d/fail2ban restart Se guardan los cambios y se vuelve ejecutable el archivo creado: chmod +x /usr/local/bin/geoip.sh
247
Se configura un cronjob para que ejecute el script cada primer día del mes: crontab -e al final del archivo se añaden las siguientes lineas: # GeoIP 0 0 1 * * /usr/local/bin/geoip.sh Se guardan los cambios. Si se quiere realizar una prueba para ver si todo funciona como esperado: /usr/local/bin/geoip.sh
248
Capitulo VII Monitoreo del sistema Monitorear el sistema es una parte muy importante de la configuración de A2Billing. Es necesario conocer si las troncales están activas, si las llamadas se completan y si el sistema está padeciendo algún tipo de mal funcionamiento. Si se ha testado el sistema y se sabe que puede soportar, por ejemplo, 40 llamadas simultaneas, es importante conocer en cada momento cuantas son las llamadas que efectivamente el sistema está cursando. En esta parte se verá como monitorear algunos parámetros del sistema a través de algunas funcionalidades presentes en A2BIlling. 7.1 Monitoreo desde A2Billing El pagina de administración de A2Billing tenemos dos sistemas de monitoreo: • •
uno para la calidad de las llamadas uno para el sistema en general
7.1.1 Monitoreo calidad llamadas En la pagina de administración de A2Billing, se entra en el menú MAINTENANCE → Alarms. Una pequeña premisa: en este menú es posible configurar tres tipos de alarmas: 1. Alarma basada en el ALOC (average length of call). El ALOC permite monitorear la duración media de las llamadas y si este valor es más alto o más bajo del umbral definido, el sistema enviará un correo electrónico de notificación a la dirección configurada; 2. Alarma basada en el ASR (answer seize ratio). El ASR mide la relación entre las llamadas realizadas y las llamadas atendidas. Si este valor es muy bajo significa que la calidad de la ruta no es buena, si este valor es alto significa que casi todas las llamadas realizadas han sido atendidas. 3. Alarma basada en el CIC (Consecutive Incomplete Calls). Se las llamadas consecutivas que no se completan superan el numero indicado, se activará el alarma y puede ser la síntoma que algo con nuestro proveedor no está funcionando. Una vez en la pagina del menú se selecciona Add Alarm y se configura la primera alarma basada en el ALOC:
El alarma queda así configurada: NAME: nombre del alarma PERIOD: cada cuanto ejecutar el control (cada hora) TYPE: el tipo de alarma. En este caso ALOC MAX VALUE: valor máximo. En este caso si el promedio de duración de las llamadas es mayor a 3600 segundos (una hora) el alarma se activará MIN VALUE: valor mínimo. 60 segundos TRUNK: si no se especifica una troncal, el alarma quedará activada para todas las troncales configuradas en A2Billing STATUS: indica si el alarma está activada o no EMAIL TO SEND ALARM: una dirección de correo electrónico donde enviar el mensaje de alarma Se guardan los cambios con el botón Confirm Data y se crean dos alarmas más, una para el ASR:
251
y una para el CIC:
El resultado final será:
252
Presionando el botón VIEW DETAILS de cada alarma se abrirá una nueva ventana con todas las estadísticas relacionadas con el alarma misma. Claramente la configuración se puede personalizar según las troncales. Una cosa que hay que tener en cuenta es que el trafico generado por Call Center es basado en muchas llamadas cuya mayoría son muy breves. Solamente un poco de practica puede ayudar a calibrar los distintos parámetros. 7.1.2 Monitoreo con script y un sistema de TTS (Text to Speech) El segundo tipo de monitoreo que se puede configurar en A2Billing está basado en script que se pueden crear y utilizar en el sistema. Cada script creado hay que copiarlo en la carpeta /var/lib/a2billing/script. Se copia el único script presente en el paquete de A2Billing: cp /usr/local/src/a2billing/addons/script/check_connectivity.sh /var/lib/a2billing/script/ Se modifica para adaptarlo al idioma español: nano /var/lib/a2billing/script/check_connectivity.sh y se modifican estás dos lineas: echo "down" echo "good" para que queden: echo "inactiva" echo "activa" El AGI para monitorear el sistema (a2billing_monitoring.php) utiliza como sistema predefinido para el texto tu voz espeak. Para poderlo utilizar se instalan los paquetes relacionados: yum --enablerepo=epel install espeak espeak-devel portaudio portaudio-devel -y y algunas dependencias: yum install libsamplerate libsamplerate-devel libsndfile-devel libsndfile -y 253
Luego se instala el modulo de espeak para Asterisk: cd /usr/src Se descarga:
git clone git://github.com/zaf/Asterisk-eSpeak Se entra en la carpeta creada: cd Asterisk-eSpeak Se compila y se instala: make make install make samples Se reinicia Asterisk: /etc/init.d/asterisk restart service a2b-callback-daemon restart y se averigua que el modulo esté cargado: asterisk -rvvvvvvvvvvv CLI> module show like app_espeak.so Module Description app_espeak.so eSpeak TTS Interface 1 modules loaded
Use Count 0
La sinopsis del comando CLI> core show application espeak -= Info about application 'eSpeak' =[Synopsis] Say text to the user, using eSpeak speech synthesizer. [Description] eSpeak(text[,intkeys,language]): This will invoke the eSpeak TTS engine, send a text string, get back the resulting waveform and play it to the user, allowing any given interrupt keys to immediately terminate and return. 254
[Syntax] Not available [Arguments] Not available [See Also] Not available Se sale de la consola de Asterisk: CLI> quit En la carpeta donde están los archivos de configuración de Asterisk se habrá creado un nuevo archivo: espeak.conf. La prueba se realiza con los valores predefinidos. Para probar la instalación, hay que crear algunas lineas en en el dialplan, contexto phones: nano /etc/asterisk/extensions.conf al final del contexto phones se añaden las siguientes lineas: exten => 660,1,Answer() same => n,espeak("Bienvenido en el centro de comunicaciones de VoztoVoice",any,es) same => n,Wait(2) same => n,Hangup Se guardan los cambios y se actualiza el dialplan: asterisk -rvvvvvvvv CLI> dialplan reload Desde el X-Lite configurado con la extensión 3000 se marca el numero 660 y se averigua que la instalación de espeak funcione. Si todo salió bien se puede pasar a la configuración de A2Billing. Se entra en la pagina de administración y luego en el menú MAINTENANCE → Monitoring. En esa pagina se encontrarán tres ejemplos para monitorear el sistema:
255
El primero es para probar la conexión a Internet. El segundo para saber la fecha y hora exacta del servidor y el tercero para conocer el numero total de llamadas cursadas. Como los textos están en inglés hay que pasarlos al español. Se modifica la primera linea de la siguiente forma:
LABEL: el nombre que se quiere asignar. DIAL CODE: el numero que hay que digitar desde el IVR para utilizar este tipo de monitoreo. DESCRIPTION: una descripción TEXT INTRO: el texto en español que leerá eSpeak QUERY TYPE: El tipo de consulta (en este caso una consulta basada en uno script) QUERY / SHELL SCRIPT: el nombre del script que se utilizará SAY RESULT AS: come va anunciado el resultado (en este caso con el TTS eSpeak) ENABLE: yes = activo Se presiona el botón “Confirm Data” y se procede con la segunda linea:
256
En este caso el numero que hay que digitar para activar el monitoreo es el 1 y el tipo de consulta es SQL (es decir en una base de datos). La QUERY es el comando que permite realizar la consulta especifica en la base de datos. El resultado se anunciará como UNIXTIME es decir la hora del sistema Linux. Se guardan los cambios y se pasa a la tercera linea:
Para utilizar se digita el numero 2, la consulta en la base de datos a2billing busca el numero total de 257
llamadas cursadas por el sistema y lo anuncia como un numero. Se guardan los datos y se modifica el plan de llamadas para poder acceder al IVR de monitoreo de A2BIlling: nano /etc/asterisk/extensions.conf al final del contexto phones se añaden las siguientes lineas: exten => 670,1,NoOP same => n,Answer same => n,Agi(a2billing_monitoring.php) same => n,Hangup Se guardan los cambios y se recarga el dialplan: asterisk -rvvvvvvvvvvvvv CLI> dialplan reload Ahora desde el X-Lite conectado a Asterisk como extensión 3000 se marca el numero 670 y cuando el sistema lo pide se marca el 1, el 2 o el 3. En el menú MAINTENANCE → Monitoring se puede añadir cualquier tipo de consulta. Otro menú que puede resultar muy útil es MAINTENANCE → Asterisk info. En este menú es posible monitorear el estado de Asterisk, los canales (llamadas) activos y un largo etcétera. Los comandos son enviados directamente a la AMI de Asterisk pero como algunos hacen referencia a versiones anteriores de Asterisk, hay que modificar el siguiente archivo: nano +141 /var/www/html/admin/Public/A2B_asteriskinfo.php Se modifica la linea: if (ASTERISK_VERSION == '1_4'|| ASTERISK_VERSION == '1_6') { para que quede: if (ASTERISK_VERSION == '1_8'|| ASTERISK_VERSION == '1_11') { La misma operación se ejecuta en la linea 364 del archivo. Se guardan los cambios y se vuelve a la pagina de administración de A2Billing, menú MAINTENANCE → Asterisk Info → Summary: Menú Channels:
258
Menú Peers:
259
7.2 Monitoreo con Nagios y SNMP En este segundo párrafo del capitulo se ilustrará como monitorear el servidor Linux y Asterisk con Nagios y el protocolo SNMP. De esta forma se podrá tener bajo control el funcionamiento del Servidor Linux, las troncales SIP, los canales SIP activos y recibir por correo o GoogleTalk notificaciones si acontece algún problema en el sistema. Se ilustrará también como guardar los datos de configuración de Nagios y todos los eventos/notificaciones en una base de datos MySQL utilizando NDOutils. Se terminará con la instalación y configuración de PNP4NAGIOS que añade gráficos a la plataforma de Nagios. Para iniciar, lo primero que hay que hacer, es configurar el protocolo SNMP en Asterisk. 7.2.1 Asterisk y 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. Es parte de la familia de protocolos TCP/IP. SNMP permite a los administradores supervisar el funcionamiento de la red, buscar y resolver sus problemas, y planear su crecimiento.” De hecho a través de este protocolo se monitorean servidores, router, switch y casi cualquier tipo de dispositivo conectado a la red (local o remota). Asterisk implementa el protocolo SNMP y es posible monitorear muchos parámetros de la PBX. Para empezar se averigua que el modulo res_snmp está instalado y cargado en Asterisk: asterisk -rvvvvvvvvvvvvvvv CLI> module show like snmp
Significa que el modulo está instalado. Se sale de la consola de Asterisk: CLI> quit Se configura el modulo: mv /etc/asterisk/res_snmp.conf /etc/asterisk/res_snmp.conf.old nano /etc/asterisk/res_snmp.conf Se añaden las siguientes lineas:
260
[general] subagent = yes enabled = yes Se guardan los cambios y se copian los OID de Asterisk en la carpeta de SNMP. 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. Ejemplo: se puede conocer el numero de llamadas totales cursadas por la centralita desde su ultimo arranque. cd /usr/share/snmp/mibs wget https://www.voztovoice.org/tmp/asterisk-mib.txt wget https://www.voztovoice.org/tmp/digium-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.conf snmpd.conf.old y se crea uno nuevo: nano snmpd.conf donde se ponen las siguientes líneas: master agentx agentXPerms 0660 0550 root root com2sec local localhost public com2sec remote XXX.XXX.XXX.XXX public group asterisk v1 local group asterisk v2c local group NetWork v1 remote group NetWork v2c remote view all included .1 access asterisk "" any noauth exact all none none access NetWork "" any noauth exact all none none Primero se define el agente y los permisos de acceso. Luego se definen dos comunidades. Una tiene acceso local y otra remoto (útil si se quiere realizar consultas desde otro servidor). Hay que sustituir 261
XXX.XXX.XXX.XXX con la IP del servidor remoto. Luego se definen dos grupos y que tipo de consultas pueden efectuar (en este caso SNMP versión 1 y versión 2c. Se define el tipo de objetos que pueden consultar (en este caso todos) y los permisos que cada grupo tiene. Se guardan los cambios y se reinicia Asterisk: /etc/init.d/asterisk restart service a2b-callback-daemon restart se inicia snmp: /etc/init.d/snmpd start se vuelve el arranque automático: chkconfig snmpd on Para ver los resultados con una descripción de cada OID en lugar de su su versión numérica: export MIBS=all Ahora ya se puede realizar una consulta utilizando el OID raíz de Asterisk: snmpwalk -OT -c public -v 2c localhost .1.3.6.1.4.1.22736 De todas las lineas que aparecen, las que interesan son estas tres: ASTERISK-MIB::astChanTypeName.6 = STRING: SIP ASTERISK-MIB::astChanTypeName.7 = STRING: IAX2 ASTERISK-MIB::astChanTypeName.9 = STRING: DAHDI Se anotan los valores que aparecen en negrita y el tipo de canal asociado, es decir: SIP 6 IAX2 7 DAHDI 9 IMPORTANTE: los tres valores pueden cambiar según el tipo de instalación y la configuración de Asterisk Se pasa a la instalación y configuración de Nagios. 7.2.2 Nagios Para la instalación de Nagios desde los paquetes pre compilados se activa el repositorio epel y se controlan los paquetes disponibles para Nagios: 262
yum --enablerepo=epel search nagios Se instalan los siguientes paquetes (el programa, los plugins, una utilidad para guardar los registros de Nagios en una base de datos, 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): yum --enablerepo=epel install nagios nagios-plugins-all perl-Net-Jabber \ perl-IO-Socket-SSL ndoutils mailx ndoutils-mysql -y CentOS se hará cargo de instalar también todas las dependencias necesarias. Se creará el grupo y usuario nagios, unas carpetas donde se guardarán los registros y los archivo necesarios para que Nagios funcione, y un archivo para la integración con el servidor Web (apache). Una vez terminada la instalación, se empieza con la configuración de Nagios. El archivo principal donde se definen los parámetros para el programa es nagios.cfg y se encuentra en la carpeta /etc/nagios. Para la configuración inicial no hace falta realizar algún tipo de modifica. Los archivos de configuración de Nagios que hay que modificar son los siguientes y se encuentran en la carpeta /etc/nagios/objects: • • • •
commands.cfg localhost.cfg contact.cfg template.cfg
Se inicia con contact.cfg: nano /etc/nagios/objects/contacts.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 263
email [email protected] address1 fulano } [email protected] es la dirección de correo electrónico donde Nagios enviará las notificaciones (personalizar). Address1 es el usuario GoogleTalk donde Nagios enviará las notificaciones vía mensaje instantáneo. Nagiosadmin es el nombre del administrador predefinido en Nagios. Cada vez que aparece una línea que empieza con “use”, hace referencia a un template definido en el archivo templates.cfg. Se guardan los cambios y se abre el archivo templates.cfg. En este archivo el bloque del genericcontact es: nano /etc/nagios/objects/templates.cfg define contact{ name generic-contact service_notification_period 24x7 host_notification_period 24x7 service_notification_options w,u,c,r,f,s host_notification_options d,u,r,f,s service_notification_commands notify-service-by-email,notify-service-jabber host_notification_commands notify-host-by-email,notify-host-jabber can_submit_commands 1 register 0 } En este bloque se añaden las dos partes en negrita. Esto para enviar las notificaciones también vía GoogleTalk. Hay una explicación de estos parámetros en la documentación oficial de Nagios 3.0 En el servidor hay servicios que no son críticos y que se pueden monitorear cada 5 minutos (el tiempo predefinido en Nagios). Para Asterisk, a veces, estos cinco minutos pueden ser demasiados. Por eso al final del archivo se añade el siguiente bloque que define que para todos los servicios de Asterisk el control se efectuará cada minuto (se puede personalizar): define service{ name asterisk use generic-service max_check_attempts 4 normal_check_interval 1 retry_check_interval 1 register 0 } Ahora se modifica el tercer archivo (commands.cfg) donde se definen los comandos que luego se utilizarán para la configuración del monitoreo del servidor local. Los plugins de Nagios se instalan 264
en /usr/lib64/nagios/plugins. Para monitorear Asterisk, se usará el plugin check_snmp y otro que se descargará. Para monitorear las troncales, se descargará un plugin del repositorio de Nagios y por ultimo, para enviar las notificaciones via GoogleTalk se descargará otro plugin. Se entra en la carpeta /usr/lib64/nagios/plugins y se descargan los plugins que hacen falta: cd /usr/lib64/nagios/plugins wget http://www.voztovoice.org/campus/a2b/check_asterisk_peers wget http://www.voztovoice.org/campus/a2b/notify_via_jabber.pl wget http://www.voztovoice.org/campus/a2b/check_asterisk.pl Se cambian los permisos para que se pueda ejecutar: chmod +x check_asterisk_peers chmod +x notify_via_jabber.pl chmod +x check_asterisk.pl Notify_via_jabber.pl es el único que tiene que ser modificado. Se abre: nano notify_via_jabber.pl se modifican estas dos lineas: my $username = "usuarioGoogleTalk"; my $password = "password"; para que queden: my $username = "sutano"; my $password = "password"; sutano es el usuario googletalk y password su contraseña (no hace falta poner @gmail.com). Una paréntesis. El plugin funciona de la siguiente manera. En este archivo se configura el usuario de GoogleTalk que enviará las notificaciones. El usuario configurado en el contact.cfg será él que las recibe siempre y cuando añadirá el usuario configurado en el plugin en su lista de amigos. Esto quiere decir que para que el sistema funcione se necesita tener dos cuentas de GoogleTalk. Para conocer la sintaxis de un plugin de Nagios el comando es: cd /usr/lib/nagios/plugins ./check_snmp -h Para añadir los comandos en Nagios se modifica el archivo commands.cfg
265
nano /etc/nagios/objects/commands.cfg Primero se configura el comando para enviar las notificaciones vía mensaje instantáneo. Esto se realiza para los servidores (en este caso uno) y los servicios. 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/lib64/nagios/plugins/notify_via_jabber.pl $CONTACTADDRESS1$ "Host '$HOSTALIAS$' is $HOSTSTATE$ - Info: $HOSTOUTPUT$" } # 'service-notify-by-jabber' command definition define command { command_name notify-service-jabber command_line /usr/lib64/nagios/plugins/notify_via_jabber.pl $CONTACTADDRESS1$ "$NOTIFICATIONTYPE$ $HOSTNAME$ $SERVICEDESC$ $SERVICESTATE$ $SERVICEOUTPUT$ $LONGDATETIME$" } IMPORTANTE: todo lo que aparece en la linea command-line debe estar en el mismo renglón Se continua con el plugin check_snmp para monitorear Asterisk a través del protocolo SMNP. 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: # 'check_snmp' command definition 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$
} Command name: nombre del comando Command line: los parámetros que se pasarán al comando: • La macro (variable) $USER1$ contiene el valor /usr/lib64/nagios/plugins como especificado en el archivo /etc/nagios/resource.cfg • check_snmp – Nombre del plugin 266
• -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.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.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.cfg Al verificarse el evento Warning y/o Critical, Nagios enviará una notificación por correo electrónico y vía mensaje instantáneo. 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$/check_asterisk.pl -h $HOSTADDRESS$ -m mgr -u nagios -p sesamo
} nagios y sesamo indican respectivamente el usuario y la contraseña para conectarse a la AMI de Asterisk. Para definirlos, luego hay que modificar el manager.conf de Asterisk: El ultimo plugin que se define en el archivo command.cfg, es el que permite monitorear las troncales: define command{ command_name check_voztovoice command_line sudo /usr/lib64/nagios/plugins/check_asterisk_peers -t sip -p $ARG1$ } Para terminar como el protocolo SSH se utiliza sobre el puerto 15000, hay que cambiar este bloque: # 'check_ssh' command definition define command{ command_name check_ssh command_line $USER1$/check_ssh $ARG1$ $HOSTADDRESS$ } para que quede: # 'check_ssh' command definition define command{ 267
command_name check_ssh command_line $USER1$/check_ssh -p $ARG1$ $HOSTADDRESS$ } Se guardan los cambios. El plugin check_asterisk_peers se activa con el programa sudo que permite ejecutar un comando con los permisos del usuario root. Esto porque el programa Nagios se inicia con usuario nagios y ese usuario no tiene los permisos para ejecutar el plugin. 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 modifica el archivo sudousers con el comando: visudo al final del archivo se añade: nagios ALL=(ALL) NOPASSWD: /usr/lib64/nagios/plugins/check_asterisk_peers Se guardan los cambios. Como se había dicho el plugin check_asterisk.pl funciona conectándose a la AMI de Asterisk. Para que funcione hay que modifica el archivo manager.conf de Asterisk: nano /etc/asterisk/manager.conf Al final del archivo se añade: [nagios] secret = sesamo deny=0.0.0.0/0.0.0.0 permit=127.0.0.1/255.255.255.255 read = system,call,log,verbose,agent,user,config,dtmf,reporting,cdr,dialplan write = system,call,agent,user,config,command,reporting,originate Se guardan los cambios y se actualiza la configuración de Asterisk: /etc/init.d/asterisk reload Para terminar la configuración de Nagios se modifica el archivo localhost.cfg. Se mueve el predefinido: mv /etc/nagios/objects/localhost.cfg /etc/nagios/objects/localhost.cfg.old se crea uno nuevo: nano /etc/nagios/objects/localhost.cfg Se añaden las siguientes lineas: 268
define host{ use linux-server host_name LibroA2Billing alias A2Billing address 127.0.0.1 } define service{ use asterisk host_name LibroA2Billing service_description SIP check_command check_snmp!ASTERISK-MIB::astChanTypeChannels.6!"Canales SIP Activos"!8!16
} Si los canales SIP activos son más de 8 se recibirá un WARNING, si son mas de 16 un CRITICAL. Se continua copiando las lineas que siguen: define service{ use asterisk host_name LibroA2Billing service_description IAX2 check_command check_snmp!ASTERISK-MIB::astChanTypeChannels.7!"Canales IAX2 Activos"!4!8
} define service{ use asterisk host_name LibroA2Billing service_description DAHDI check_command check_snmp!ASTERISK-MIB::astChanTypeChannels.9!"Canales DAHDI Activos"!4!8
} define service{ use asterisk host_name LibroA2Billing service_description Asterisk_check check_command check_asterisk } define service{ use asterisk host_name LibroA2Billing service_description Troncal_Voztovoice1 check_command check_voztovoice!voztovoice1 } define service{ 269
use asterisk host_name LibroA2Billing service_description Troncal_Voztovoice2 check_command check_voztovoice!voztovoice2 } Una pequeña explicación. En el primer bloque se define el nombre del servidor, un alias y la dirección IP (en este caso siendo Nagios y Asterisk instalados en el mismo servidor se indica 127.0.0.1 o localhost). En los tres bloques que siguen se controla a través del plugin check_snmp, los canales SIP, IAX2 y DAHDI activos. Se asignan a las cuatros macros (variables), que se han visto al momento de la configuración del comando ($ARG1$ $ARG2$ $ARG3$ ARG4$), los respectivos valores separados por el caracter ! Las OID se toman interrogando Asterisk vía SNMP como se ha visto en el párrafo anterior. En el bloque que sigue se utiliza el plugin check_asterisk.pl y a través del AMI de Asterisk se controla que esté corriendo. Los últimos dos bloques se utilizan para monitorear las dos troncales SIP de Asterisk. En la segunda linea de cada bloque aparece el parámetro “use asterisk” que representa el template (la plantilla) configurada en templates.cfg que se utiliza para estos comandos. Si se quiere controlar también algunos servicios básicos del servidor (usuarios, procesos, carga, etc…), se añaden estas líneas: define service{ use local-service host_name LibroA2Billing service_description PING check_command check_ping!100.0,20%!500.0,60% } define service{ use local-service host_name LibroA2Billing service_description Current Users check_command check_local_users!20!50 } define service{ use local-service host_name LibroA2Billing service_description Total Processes check_command check_local_procs!250!400!RSZDT }
270
define service{ use local-service host_name LibroA2Billing service_description Current Load check_command check_local_load!5.0,4.0,3.0!10.0,6.0,4.0 } define service{ use local-service host_name LibroA2Billing service_description SSH check_command check_ssh!15000 } Se guardan los cambios. 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.cfg Si la respuesta termina con: Total Warnings: 0 Total Errors: 0 Things look okay - No serious problems were detected during the pre-flight check Significa que la configuración está bien. En caso contrario Nagios indicará el archivo y la línea donde se encuentra el error. El acceso a la pagina de Nagios está protegido y para poder acceder hay que configurar la contraseña del usuario predefinido, nagiosadmin, de la siguiente forma: htpasswd -bc /etc/nagios/passwd nagiosadmin sesamo Adding password for user nagiosadmin Este comando creará una archivo passwd que contendrá los datos de acceso para el usuario predefinido nagiosadmin (en este caso la contraseña es sesamo) Se configura Nagios para que arranque en automático: chkconfig nagios on Se reinicia apache y luego se inicia Nagios: /etc/init.d/httpd restart
271
/etc/init.d/nagios start Para entrar en la pagina de Nagios: http://IPLinode/nagios Aparecerá una ventana donde habrá que insertar las credenciales de acceso es decir usuario: nagiosadmin y contraseña: sesamo
Se presiona el botón Aceptar. Aparece la pagina inicial de Nagios:
En la derecha se selecciona el enlace Hosts para ver el servidor configurado:
Se selecciona Services para ver los servicios monitoreados:
272
Todos están bien. Una prueba. Se entra en el sip.conf y se modifica el dominio de la troncal voztovoice1: nano /etc/asterisk/sip.conf en lugar de sip.voztovoice.eu se pone voip.voztovoice.eu Se guardan los cambios y se recarga la configuración SIP: asterisk -rvvvvvvvvvvvvvvv CLI> sip reload CLI> sip show peers
La conexión con la troncal no está activa. En la pagina de Nagios (después de unos minutos):
El mensaje instantáneo recibido:
273
y el correo electrónico:
Ahora se restablece la IP correcta y se averigua lo que pasa en la pagina de Nagios:
Todo ha vuelto a la normalidad.
7.2.3 NDOutils Para utilizar NDOutils y guardar todos los datos de Nagios en una base de datos MySQL, lo primero 274
que hay que hacer es crear la base de datos: mysql -u root -psesamo mysql> create database nagios; se asigna al usuario nagios los permisos para la base de datos creada: mysql> GRANT ALL PRIVILEGES ON nagios.* TO 'nagios'@'localhost' IDENTIFIED BY 'sesamo'; mysql> flush privileges; 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/doc/ndoutils-mysql-1.5.2/db/mysql.sql Ahora falta modificar dos archivos de configuración: nagios.cfg y ndo2db.cfg. Primero se modifica nagios.cfg nano /etc/nagios/nagios.cfg al final del archivo se añaden las siguientes lineas: event_broker_options=-1 broker_module=/usr/lib64/nagios/brokers/ndomod.so config_file=/etc/nagios/ndomod.cfg que permiten a Nagios de conectarse a la librería de NDOutils para enviar todos los datos de configuración y los eventos. Se guardan los cambios y se continua con el ndo2db.cfg: nano /etc/nagios/ndo2db.cfg Después de estas dos lineas: ndo2db_user=nagios ndo2db_group=nagios se añade: lock_file=/var/log/nagios/ndo2db.lock en db_user y db_password se pone:
275
db_user=nagios db_pass=sesamo se guardan los cambios y se inicia NDOutils: /etc/init.d/ndo2db start Se configura para que arranque en automático: chkconfig ndo2db on y se reinicia Nagios: /etc/init.d/nagios restart se averigua que en el log de Nagios haya conexión con la librería NDOutils: nano /var/log/nagios/nagios.log Las lineas que interesan son:
Después de unos minutos, se puede corroborar que efectivamente los datos de Nagios se están guardando en la base de datos creada: mysql -u root -psesamo mysql> use nagios mysq> select command_id,instance_id,config_type,object_id from nagios_commands;
276
Todo está funcionando como debería. Se encuentran distintos tipos de consultas de las tablas en la carpeta /usr/share/doc/ndoutils-mysql-1.5.2/db/queries/ 7.2.4 PNP4NAGIOS Seguramente Nagios es un optimo programa para el monitoreo de servidores, switch y dispositivos, pero le hace falta algo que la mayoría de los programas de monitoreo tienen: los gráficos. Pasa suplir esta falta existe el programa PNP4Nagios. En este párrafo se verá como instalarlo y complementarlo con Nagios. Requisitos previos: • • • •
Perl >= 5.x y los paquetes perl-Time-HiRes rrdtool-perl RRDtool >= 1.x, mejor 1.2 pero no obligatorio PHP >= 5.1.6 para el frontal web basado en Kohana Nagios >= 2.x o Icinga
Kohana necesita que el módulo de Apache “mod_rewrite” esté habilitado. Se instala el paquete perl-Time-HiRes: yum install perl-Time-HiRes rrdtool-perl perl-ExtUtils-MakeMaker -y RRDtool se instala desde las fuentes: cd /usr/src 277
wget http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.6.0.tar.gz tar -xf rrdtool-1.6.0.tar.gz cd rrdtool-1.6.0 ./configure --prefix=/usr --libdir=/usr/llib64 make make install Terminada la instalación de RRDTool ya se puede instalar PNP4Nagios: cd /usr/src wget http://downloads.sourceforge.net/project/pnp4nagios/PNP-0.6/pnp4nagios-0.6.25.tar.gz tar -xf pnp4nagios-0.6.25.tar.gz cd pnp4nagios-0.6.25 ./configure Aparecerá:
PNP4Nagios detectará de forma automática RRDTool y estará listo para la instalación. Se continua con: make all make fullinstall Terminada la instalación los pasos a seguir son: • • 278
Modificar el templates.cfg de Nagios Modificar el commands.cfg de Nagios
• • • •
Modificar la configuración general de Nagios Modificar la configuración del servidor localhost y los servicios monitoreados Reiniciar Nagios Reiniciar el Servidor Web
Se inicia modificando el archivo templates.cfg: nano /etc/nagios/objects/templates.cfg al final del archivo se añade: define host { name host-pnp action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=_HOST_ register 0 } define service { name srv-pnp action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=$SERVICEDESC$ register 0 } Se guardan los cambios y se continua con el archivo commands.cfg nano /etc/nagios/objects/commands.cfg Después de este bloque de comentario: ################################################################################ # # SAMPLE PERFORMANCE DATA COMMANDS # # These are sample performance data commands that can be used to send performance # data output to two text files (one for hosts, another for services). If you # plan on simply writing performance data out to a file, consider using the # host_perfdata_file and service_perfdata_file options in the main config file. ################################################################################# se borran los dos bloques que siguen y se remplazan con los siguientes: define command{ command_name process-service-perfdata-file command_line /usr/local/pnp4nagios/libexec/process_perfdata.pl --bulk=/usr/local/pnp4nagios/var/service-perfdata
} define command{ 279
command_name process-host-perfdata-file command_line
/usr/local/pnp4nagios/libexec/process_perfdata.pl --bulk=/usr/local/pnp4nagios/var/host-perfdata
} Estos dos comandos son los que se encargan de recolectar los datos para luego crear los gráficos. Se guardan los cambios y se pasa al archivo nagios.cfg: nano /etc/nagios/nagios.cfg Se busca esta linea: process_performance_data=0 y se modifica para que quede: process_performance_data=1 Al final del archivo se añaden los siguientes bloques: service_perfdata_file=/usr/local/pnp4nagios/var/service-perfdata service_perfdata_file_template=DATATYPE::SERVICEPERFDATA\tTIMET:: $TIMET$\tHOSTNAME::$HOSTNAME$\tSERVICEDESC:: $SERVICEDESC$\tSERVICEPERFDATA:: $SERVICEPERFDATA$\tSERVICECHECKCOMMAND:: $SERVICECHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE:: $HOSTSTATETYPE$\tSERVICESTATE::$SERVICESTATE$\tSERVICESTATETYPE:: $SERVICESTATETYPE$ service_perfdata_file_mode=a service_perfdata_file_processing_interval=15 service_perfdata_file_processing_command=process-service-perfdata-file host_perfdata_file=/usr/local/pnp4nagios/var/host-perfdata host_perfdata_file_template=DATATYPE::HOSTPERFDATA\tTIMET::$TIMET$\tHOSTNAME:: $HOSTNAME$\tHOSTPERFDATA::$HOSTPERFDATA$\tHOSTCHECKCOMMAND:: $HOSTCHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE:: $HOSTSTATETYPE$ host_perfdata_file_mode=a host_perfdata_file_processing_interval=15 host_perfdata_file_processing_command=process-host-perfdata-file Lo importante es la segunda linea de cada bloque que tiene que estar en el mismo renglón. Se guardan los cambios. Para activar PNP4NAgios: chkconfig --add npcd chkconfig npcd on Se inicia: 280
/etc/init.d/npcd start Para activar PNP4NAGIOS para cada host, servicio monitoreado, se abre el archivo localhost.cfg: nano /etc/nagios/objects/localhost.cfg se modifica el primer bloque: define host{ use linux-server host_name LibroA2Billing alias A2Billing address 127.0.0.1 } para que quede: define host{ use linux-server,host-pnp host_name LibroA2Billing alias A2Billing address 127.0.0.1 } Para todos los demás bloques al final de la linea use se añade una coma y srv-pnp. Ejemplo: define service{ use asterisk,srv-pnp host_name LibroA2Billing service_description SIP check_command check_snmp!ASTERISK-MIB::astChanTypeChannels.13!"Canales SIP Activos"! 8!16 } Una vez modificado todo el archivo, se guardan los cambios y se reinicia Nagios: service nagios restart Antes de reiniciar el servidor web, se modifica el archivo de configuración de PNP4NAGIOS para el servidor web: nano /etc/httpd/conf.d/pnp4nagios.conf Se cambia esta linea: AuthUserFile /usr/local/nagios/etc/htpasswd.users 281
para que quede: AuthUserFile /etc/nagios/passwd Se guardan los cambios y se reinicia el servidor web: service httpd restart Si se vuelve a entrar en la pagina de administración de Nagios → Services:
A lado de cada servicio aparecerá un icono de un gráfico. Si se presiona el icono de la linea PING se abrirá otra pestaña en el navegador donde PNP4NAGIOS averiguará que la configuración esté sin errores. Si todo está bien, al final de la pagina aparecerá:
Como indicado se borra el archivo: rm /usr/local/pnp4nagios/share/install.php Se recarga la pagina:
282
Se verá el gráfico (después de algunos minutos) del servicio PING. Si se quiere personalizar la configuración de PNP4Nagios hay que modificar el siguiente archivo: nano /usr/local/pnp4nagios/etc/config.php 7.3 Monitoreo calidad de las llamadas con pre-dial handlers y hangup-handlers Con la versión 11 de Asterisk se ha introducido una funcionalidad que permite ejecutar una subrutina antes que la llamada empiece pero después que los dos canales, llamante y llamado, se han credo. Esta funcionalidad se llama pre-dial handlers. En la subrutina se puede indicar otra subrutina que se ejecutará cuando la llamada termine; esta subrutina, también introducida con la versión 11 de Asterisk, se llama hangup-handlers. Aprovechando estas dos funcionalidades es posible, con un mínimo de configuración, guardar en una tabla de una base de datos, todas las estadísticas de una llamada. Para empezar hay que crear los pre-dial handlers que se utilizarán solamente para las llamadas salientes. La sintaxis para el canal del llamante es: B([[context^]exten^]priority[(arg1[^...][^argN])]) para el canal de llamado es: b([[context^]exten^]priority[(arg1[^...][^argN])]) Las dos subrutinas van configuradas en la linea del Dial. Se entra en la pagina de administración de A2Billing, menú SYSTEM SETTINGS → Global List → agi-conf1 y se modifica este parámetro:
Para que quede: 283
es decir que se añade este bloque: B(predial^caller_handler^1)b(predial^callee_handler^1) Si se quiere se realiza la misma operación también para el agi-conf2. Luego se modifica el dialplan: nano /etc/asterisk/extensions.conf Al final del archivo se crean el contexto y las dos extensiones que se acaban de configurar en A2Billing: [predial] exten => caller_handler,1,NoOp(Caller_Handler) same => n,Set(CHANNEL(hangup_handler_push)=caller,s,1); same => n,Return exten => callee_handler,1,NoOp(Callee_Handler) same => n,Set(CHANNEL(hangup_handler_push)=callee,s,1); same => n,Return En el bloque del llamante se indica que cuando termine la llamada se ejecutará la subrutina presente en el contexto caller, extensión s, prioridad 1. Para el llamado la subrutina será presente en el contexto callee, extensión s, prioridad 1. El paso a seguir es crear las dos subrutinas (al final del archivo). Para el llamante: [caller] exten => s,1,NoOp(${CHANNEL(rtpqos,audio,all)}) same => n,set(hangupcause=${HANGUPCAUSE}) same => n,set(accountcode=${CDR(accountcode)}) same => n,set(peerip=${CHANNEL(peerip)}) same => n,set(recvip=${CHANNEL(recvip)}) same => n,set(useragent=${CHANNEL(useragent)}) same => n,set(codecr=${CHANNEL(audioreadformat)}) same => n,set(codecw=${CHANNEL(audiowriteformat)}) same => n,set(codecn=${CHANNEL(audionativeformat)}) same => n,set(tlp=${CHANNEL(rtpqos,audio,txcount)}) same => n,set(llp=${CHANNEL(rtpqos,audio,txploss)}) same => n,set(porlp=$[{CHANNEL(rtpqos,audio,txploss)} / ${CHANNEL(rtpqos,audio,txcount)} * 100])
same => n,set(trp=${CHANNEL(rtpqos,audio,rxcount)}) same => n,set(rlp=${CHANNEL(rtpqos,audio,rxploss)}) same => n,set(porrp=$[{CHANNEL(rtpqos,audio,rxploss)} / ${CHANNEL(rtpqos,audio,rxcount)} * 100])
284
same => n,set(ljitter=${CHANNEL(rtpqos,audio,local_maxjitter)}) same => n,set(rjitter=${CHANNEL(rtpqos,audio,remote_maxjitter)}) same => n,Set(ODBC_cdr2()=${STRFTIME(${EPOCH},,%y%m%d%H%M%S)},${hangupcause},$ {accountcode},${peerip},${recvip},${useragent},${codecr},${codecw},${codecn},${tlp},${llp},${porlp}, ${trp},${rlp},${porrp},${ljitter},${rjitter}) same => n,Return Para el llamado: [callee] exten => s,1,NoOp(${CHANNEL(rtpqos,audio,all)}) same => n,set(hangupcause=${HANGUPCAUSE}) same => n,set(accountcode=${CDR(accountcode)}) same => n,set(peerip=${CHANNEL(peerip)}) same => n,set(recvip=${CHANNEL(recvip)}) same => n,set(useragent=${CHANNEL(useragent)}) same => n,set(codecr=${CHANNEL(audioreadformat)}) same => n,set(codecw=${CHANNEL(audiowriteformat)}) same => n,set(codecn=${CHANNEL(audionativeformat)}) same => n,set(tlp=${CHANNEL(rtpqos,audio,txcount)}) same => n,set(llp=${CHANNEL(rtpqos,audio,txploss)}) same => n,set(porlp=$[{CHANNEL(rtpqos,audio,txploss)} / ${CHANNEL(rtpqos,audio,txcount)} * 100])
same => n,set(trp=${CHANNEL(rtpqos,audio,rxcount)}) same => n,set(rlp=${CHANNEL(rtpqos,audio,rxploss)}) same => n,set(porrp=$[{CHANNEL(rtpqos,audio,rxploss)} / ${CHANNEL(rtpqos,audio,rxcount)} * 100])
same => n,set(ljitter=${CHANNEL(rtpqos,audio,local_maxjitter)}) same => n,set(rjitter=${CHANNEL(rtpqos,audio,remote_maxjitter)}) same => n,Set(ODBC_cdr2()=${STRFTIME(${EPOCH},,%y%m%d%H%M%S)},${hangupcause},$ {accountcode},${peerip},${recvip},${useragent},${codecr},${codecw},${codecn},${tlp},${llp},${porlp}, ${trp},${rlp},${porrp},${ljitter},${rjitter}) same => n,Return Los datos que se guardarán son (para cada canal): • • • • • • • • • • • • • 285
Hangupcause: el código relacionado con el colgado de la llamada accountcode: la cuenta utilizada para realizar la llamada peerip: la dirección IP de donde se ha originado la llamada recvip: la dirección IP recibida por Asterisk para la llamada useragent: el dispositivo utilizado para realizar la llamada codecr: el codec audio “leído” por Asterisk sobre el canal codecw: el codec audio “escrito” por Asterisk sobre el canal codecn: el codec nativo utilizado por Asterisk para el canal tlp: el total de paquetes audio trasmitidos desde el dispositivo hacia Asterisk llp: el total de paquetes audio perdidos desde el dispositivo hacia Asterisk porlp: el porcentaje de paquetes audio perdidos desde el dispositivo hacia Asterisk trp: el total de paquetes audio trasmitidos desde Asterisk hacia el dispositivo rlp: el total de paquetes audio perdidos desde Asterisk hacia el dispositivo
• • •
porrp: el porcentaje de paquetes audio perdidos desde Asterisk hacia el dispositivo ljitter: el Jitter de la llamada desde el dispositivo hacia Asterisk rjitter: el Jitter de la llamada desde Asterisk hacia el dispositivo
Ahora todos los datos presentes en los dos hangup-handlers se guardan en una tabla de la base de datos asteriskcdr. Se entra en mysql: mysql -u root -psesamo se selecciona la base de datos asteriskcdr: mysql> use asteriskcdr y se crea la nueva tabla: mysql> CREATE TABLE `cdr2` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `calldate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `hangupcause` int(2) NOT NULL DEFAULT '0', `accountcode` varchar(20) DEFAULT NULL, `peerip` varchar(20) DEFAULT NULL, `recvip` varchar(20) DEFAULT NULL, `useragent` varchar(30) DEFAULT NULL, `codecr` varchar(10) DEFAULT NULL, `codecw` varchar(10) DEFAULT NULL, `codecn` varchar(10) DEFAULT NULL, `tlp` int(15) NOT NULL DEFAULT '0', `llp` int(15) NOT NULL DEFAULT '0', `porlp` decimal(6,3) unsigned zerofill NOT NULL DEFAULT '000.000', `trp` int(15) NOT NULL DEFAULT '0', `rlp` int(15) NOT NULL DEFAULT '0', `porrp` decimal(6,3) unsigned zerofill NOT NULL DEFAULT '000.000', `ljitter` decimal(7,6) unsigned zerofill NOT NULL DEFAULT '0.000000', `rjitter` decimal(7,6) unsigned zerofill NOT NULL DEFAULT '0.000000', PRIMARY KEY (`id`) ); Para que los datos se guarden en la tabla se recurre nuevamente al archivo func_odbc. Como no hay una conexión ODBC hacia la base de datos asteriskcdr, hay que crearla: nano /etc/odbc.ini [asteriskcdr] Description = MySQL asteriskcdr Driver = MySQL Database = asteriskcdr 286
Server = localhost User = asterisk Password = sesamo Port = 3306 Option = 3 Se guardan los cambios y se prueba la conexión: isql asteriskcdr asterisk sesamo +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ SQL> Perfecto! Se sale del programa: SQL> quit Luego para que func_odbc funcione, hay que crear un nuevo bloque en el archivo res_odbc.conf que es donde se conectará unc_odbc: nano /etc/asterisk/res_odbc.conf al final del archivo se pone: [cdr] enabled => yes dsn => asteriskcdr username => asterisk password => sesamo pre-connect => yes sanitysql => select 1 idlecheck => 3600 connect_timeout => 10 Se guardan los cambios y se configura func_odbc: nano /etc/asterisk/func_odbc.conf
287
al final del archivo se añade: [cdr2] dsn=cdr writesql=insert into cdr2 (calldate,hangupcause,accountcode,peerip,recvip,useragent,codecr,codecw,codecn,tlp,llp,porlp,trp,rl p,porrp,ljitter,rjitter) values ("${SQL_ESC(${VAL1})}","${SQL_ESC(${VAL2})}","${SQL_ESC(${VAL3})}","${SQL_ESC($ {VAL4})}","${SQL_ESC(${VAL5})}","${SQL_ESC(${VAL6})}","${SQL_ESC(${VAL7})}", "${SQL_ESC(${VAL8})}","${SQL_ESC(${VAL9})}","${SQL_ESC(${VAL10})}","${SQL_ESC($ {VAL11})}","${SQL_ESC(${VAL12})}","${SQL_ESC(${VAL13})}","${SQL_ESC(${VAL14})}", "${SQL_ESC(${VAL15})}","${SQL_ESC(${VAL16})}","${SQL_ESC(${VAL17})}") Todos los datos presentes en la linea writesql tienen que estar en el mismo renglón. Se guardan las modificaciones y se entra en la consola de Asterisk: asterisk -rvvvvvvvvvvvvvvvvvvvv se recarga el modulo res_odbc y luego el modulo func_odbc CLI> module reload res_odbc.so CLI> module reload func_odbc.so se recarga el dialplan: CLI> dialplan reload y se realiza una prueba llamando un numero fijo/celular. Una vez terminada la llamada se entra nuevamente en la consola de MySQL: mysql -u root -psesamo se selecciona la base de datos asteriskcdr: mysql> use asteriskcdr y se revisa que se ha guardado en la tabla cdr2: mysql> select id,calldate,hangupcause,accountcode,peerip,recvip,tlp,llp,porlp,trp,rlp,porrp from cdr2;
288
7.4 Monitoreo calidad de las 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. De este programa existen dos versiones: una Open Source sin la GUI (Interfaz gráfica); una comercial que incluye la GUI la que permite ver todas las estadísticas desde un navegador Web. El programa analiza y captura todos los paquetes SIP (señalización) y RTP (flujo media). De cada llamada, para ambos canales, 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, enviados, 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: • •
Versión de Libpcap >= 1.0 Librería MySQL++
Primero se instalan los paquetes de libpcap: yum install libpcap libpcap-devel -y Luego se averigua la versión instalada: rpm -q libpcap libpcap-1.4.0-1.20130826git2dbcaa1.el6.x86_64 Se instalan algunas dependencias:
289
yum --enablerepo=epel install snappy* libssh-devel json-c-devel -y Instalados los pre requisitos se decarga VoIPMonitor ya compilado. cd /usr/src wget http://www.voipmonitor.org/current-stable-sniffer-static-64bit.tar.gz Se descomprime: tar -xf current-stable-sniffer-static-64bit.tar.gz Se entra en la carpeta creada: cd voipmonitor-amd64-17.3.4-static Se ejecuta el script de instalación: ./install-script.sh Se crea la base de datos donde se guardarán los datos de las llamadas: mysql -u root -psesamo mysql> create database voipmonitor; mysql> quit Se modifica el archivo de configuración: nano /etc/voipmonitor.conf Se modifican las siguientes lineas: #id_sensor = 1 mysqlpassword = interface = eth0 #sipport = 5061 #jitterbuffer_f1 = no #jitterbuffer_f2 = yes #jitterbuffer_adapt = no para que queden: id_sensor = 1 mysqlpassword = sesamo interface = eth0,eth0:1 290
sipport = 5061 jitterbuffer_f1 = yes jitterbuffer_f2 = yes jitterbuffer_adapt = yes Se guardan las modificaciones y se inicia el servicio: service voipmonitor start Starting voipmonitor: voipmonitor[24353]: set buffer memory limit to 1051772928 Loading configuration from file /etc/voipmonitor.conf OK voipmonitor[24353]: set buffer memory limit to 1051772928 voipmonitor version 17.3.4 voipmonitor[24353]: start voipmonitor version 17.3.4 local time 2016-10-03 20:35:37 voipmonitor[24353]: local time 2016-10-03 20:35:37 voipmonitor[24353]: detected rrdtool version 10600 y se efectúa una llamada hacia un fijo/celular. Terminada la llamada se mira las entradas en la base de datos voipmonitor, tabla cdr (serán dos). mysql -u root -psesamo mysql> use voipmonitor mysql> select ID,calldate,called,duration,connect_duration,a_received,b_received,a_lost,b_lost from cdr;
291
Capitulo VIII Trucos y consejos En este capitulo del libro, se ilustrarán algunas soluciones que han nacido como inquietudes a lo largo de los cursos a distancia de A2Billing dictados por VozToVoice. 8.1 Cambiar la moneda predefinida En el libro se ha asumido que la moneda predefinida para las tarifas, los clientes y las recargas, fuera el dólar. Esto no significa que no se pueda cambiar. Para hacerlo se entra en el Menú SYSTEM SETTINGS → Global List → Global y se modifica este parámetro (para el peso colombiano): Base Currency
cop
Moneda predefinida
Para aceptar pagos en pesos colombianos en SYSTEM SETTINGS → Global List → epayment_method se modifica: Currency Code
COP
Moneda utilizada para los pagos (se puede personalizar)
Para configurar como moneda predefinida el peso colombiano. Luego hay que decirle a A2Billing que todas las tasas de cambio tienen que calcularse a partir de esta moneda, se entra en el menú BILLING → Currencies List y se presiona el botón que aparece en la imagen que sigue:
El resultado será:
En la lista de las monedas si se busca el peso colombiano el cambio tienes que estar en 1:
Esto permite resolver un problema muy sencillo. Si se utiliza como moneda predefinida el dólar y el cliente al momento de registrarse escoge como moneda el peso colombiano, su crédito cambiará cada día ya que el sistema actualiza las tasas de cambio cada 24 horas. Esto significa que el cliente encontrará variaciones en su crédito (más bajo o más alto) a pesar que no haya realizado llamadas. 8.2 Rellamada sin cobrar en ningún caso la primera llamada Como se ha visto en el párrafo 5.3 dedicado a la rellamada, hay un parámetro que se puede modificar para decidir si cobrar o no la primera llamada: Bill Callback
Yes
Se cobrará la llamada de Callback del primer canal aunque el segundo canal no ha contestado o no se ha podido establecer la llamada
Este parámetro permite definir si en una rellamada la primera “pata” se cobre o no en base a si la segunda llamada sea contestada o no. Si estás en Yes se cobrará la primera llamada aunque la segunda no sea contestada; si está en No se cobrará la primera llamada solamente si la segunda conteste. Desafortunadamente no hay un sistema para decirle a A2Billing que no cobre en ningún caso la primera llamada. Para solucionar este problema se puede adoptar el siguiente truco; primero se crea un nuevo paquete de llamadas gratuitas. Se entra en el menú Package Offer → Add:
Y se escoge el enlace “Add Package”. Se configura un paquete de la siguiente forma:
294
El paquete configurado permite cursar 10000 llamadas gratuitas. Se guardan los cambios presionando el botón “Confirm Data”. Se selecciona el botón “Add rates” del paquete que se acaba de crear y se seleccionan todos los prefijos presentes en la Rate Card Base1:
Ahora se entra en el menu RATES→ CallPlan y se crea un nuevo plan de llamadas:
Como se puede ver en la imagen a este nuevo CallPlan se asocia el paquete de llamadas gratuitas que se acaba de crear. Se guardan los cambios presionando el botón “Confirm Data” y se vuelve a entrar al 295
callplan creado para asignarle una RateCard (en este caso Base1):
El nuevo CallPlan creado tendrá un numero ID:
en este caso el numero es 4. Este numero es el que hay que utilizar para configurar la linea del AGI del Callback. Se retoma la configuración del dialplan vista en el párrafo 5.3.2: nano /etc/asterisk/extensions.conf exten => 5001,1,Set(CALLERID(num)=189445322) same => n,Agi(a2billing.php,1,cid-callback,57) same => n,hangup y se modifica para que quede: exten => 5001,1,Set(CALLERID(num)=189445322) same => n,Agi(a2billing.php,1,cid-callback,57,,4) same => n,hangup La linea que se ha cambiado es: same => n,Agi(a2billing.php,1,cid-callback,57,,4) 1 2 345 En la posición 5 es posible indicar que CallPlan se utilizará para devolver la llamada a quien ha solicitado el callback. En este caso el CallPlan será el numero de ID 4 que es él que se ha configurado en A2Billing. De esta forma la primera llamada de callback no será cobrada bajo ninguna circunstancia. Una vez hecha la prueba en CALL Reports → CDRs aparecerá:
La llamada de callback que realiza el sistema no se ha cobrado (columna Sell de la segunda linea). 296
8.3 Nginx en lugar de Apache En el párrafo 5.12 se ha visto como instalar Apache en un servidor y Asterisk en otro. Esto para evitar que los recursos utilizados por el servidor Web afecten el rendimiento de la PBX. Otra posibilidad es sostituir Apache con otro servidor Web: Nginx. Nginx (pronunciado en inglés “engine X”) es un servidor web/proxy inverso ligero, de alto rendimiento y también un proxy para protocolos de correo electrónico (IMAP/POP3) (Wikipedia). Siendo mucho más liviano que Apache, permite una convivencia mucho más funcional entre el servidor Web y la PBX. En este párrafo se verá como instalar y configurar Nginx en CentOS 6.5 para trabajar con la parte Web de A2Billing. Se instala el paquete junto a Fast-CGI desde los repositorios epel: yum --enablerepo=epel install nginx spawn-fcgi fcgi -y Se modifica el archivo de configuración principal: nano /etc/nginx/nginx.conf modificando esta linea: user
nginx;
para que quede: user
apache apache;
De esta forma se inicia el servidor Nginx con usuario apache y grupo apache. Los mismos datos del servidor Apache. Esto para no tener que modificar los permisos de todos los archivos que se han modificado a lo largo de la instalación de A2Billing. Se sigue añadiendo después de esta linea: default_type application/octet-stream; la siguiente linea: client_max_body_size 8m; Esta linea permite cargar en A2Billing archivos de hasta 8 Megabyte (las tarifas). Se guardan los cambios y se configura el archivo para el servidor Web. Se renombra el predefinido: mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.old y se crea uno nuevo: nano /etc/nginx/conf.d/default.conf Se copian las siguientes lineas:
297
server { listen 80; server_name _; root /var/www/html; index index.html index.htm index.php; server_tokens off; location ~ \.php$ { try_files $uri =404; fastcgi_pass 127.0.0.1:9010; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; include /etc/nginx/fastcgi_params; } location /admin { auth_basic "Administration"; auth_basic_user_file /etc/httpd/htpasswd; } location /admin/Public { auth_basic "Administration"; auth_basic_user_file /etc/httpd/htpasswd; } location ~ /\.ht { deny all; } } Se guardan los cambios y se crea la configuración para las conexiones seguras. Se renombra el archivo predefinido: mv /etc/nginx/conf.d/ssl.conf /etc/nginx/conf.d/ssl.conf.old se crea uno nuevo nano /etc/nginx/conf.d/ssl.conf se copian las lineas que siguen: server { listen 443; server_name _; root /var/www/html; index index.html index.htm index.php; server_tokens off; 298
ssl on; ssl_certificate /etc/pki/tls/certs/localhost.crt; ssl_certificate_key /etc/pki/tls/private/localhost.key; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_ciphers on; location ~ \.php$ { try_files $uri =404; fastcgi_pass 127.0.0.1:9010; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; include /etc/nginx/fastcgi_params; } location /admin { auth_basic "Administration"; auth_basic_user_file /etc/httpd/htpasswd; } location /admin/Public { auth_basic "Administration"; auth_basic_user_file /etc/httpd/htpasswd; } location ~ /\.ht { deny all; } } En este archivo se utilizan los certificados que venían por defecto con la instalación de Apache. Para averiguar que la configuración de Nginx esté sin errores: nginx -t La respuesta tiene que ser: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful Se pasa a la configuración de Fast-CGI: nano /etc/sysconfig/spawn-fcgi 299
Se modifican estas lineas: #SOCKET=/var/run/php-fcgi.sock #OPTIONS="-u apache -g apache -s $SOCKET -S -M 0600 -C 32 -F 1 -P /var/run/spawn-fcgi.pid -- /usr/bin/php-cgi"
para que queden: SOCKET=/var/run/php-fcgi.sock OPTIONS="-u apache -g apache -p 9010 -S -M 0600 -C 6 -F 1 -P /var/run/spawn-fcgi.pid -- /usr/bin/php-cgi"
Para conocer el significado de cada opción presente: man spawn-fcgi El bloque de la configuración de Nginx que permite conectarse al servicio spawn-fcgi, y de esta forma procesar cada archivo PHP, es: location ~ \.php$ { try_files $uri =404; fastcgi_pass 127.0.0.1:9010; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; include /etc/nginx/fastcgi_params; } Se guardan los cambios y se para el servidor Apache: /etc/init.d/httpd stop Luego se inicia primero Fast-CGI seguido por Nginx: /etc/init.d/spawn-fcgi start /etc/init.d/nginx start Se hace una primera prueba entrando con el nombre de dominio o la dirección IP del servidor: http://IPservidor Después de algunos segundo se entrará a la pagina de los clientes de forma segura (de la misma forma en que se había configurado en Apache). Si se entra en la siguiente pagina: http://IPservidor/common Aparecerá: 300
Normalmente junto a “nginx” aparece el numero de versión. Se ha quitado con la sentencia: server_tokens off; presente en la configuración de Nginx. Si se entra en la pagina: http://IPservidor/admin Aparecerá:
De la misma forma en que aparecía con el servidor Apache. Esto se debe a estos dos bloques presentes en la configuración de Nginx: location /admin { auth_basic "Administration"; auth_basic_user_file /etc/httpd/htpasswd; } location /admin/Public { auth_basic "Administration"; auth_basic_user_file /etc/httpd/htpasswd; } Cuyo significado es: para la carpeta /admin y /admin/Public se requiere una autenticación (auth_basic) y los datos de usuarios y contraseñas se encuentran en el archivo /etc/httpd/htpasswd (el mismo creado para Apache).
301
Una vez ingresados los datos de usuario (admin) y contraseña (sesamo) se entrará en la pagina de administración de A2Billing donde hay que ingresar los datos de acceso. Una vez probado el sistema , si se quiere utilizar Nginx en lugar de Apache, hay que terminar con la configuración: chkconfig httpd off chkconfig spawn-fcgi on chkconfig nginx on chown -Rf apache:apache /var/lib/nginx/ De esta forma iniciando el servidor nuevamente, se iniciarán en automático spawn-fcgi y Nginx. Apache estará desactivado. Para averiguarlo: reboot 8.4 Guardar la IP del llamante en el CDR En algunas ocasiones puede ser útil guardar la dirección IP utilizada para cada llamada. En la tabla CDR , donde se guardan todos los registros de las llamadas, hay un campo (userfield) que está disponible para cualquier tipo de uso. En este caso se utilizará para guardar las direcciones IP de los llamantes. El procedimiento es bastante sencillo. Se modifica el dialplan de a2billing modificando una linea: nano /etc/asterisk/extensions.conf se modifica este bloque: [a2billing] exten => _X.,1,NoOp(A2Billing Start) same => n,System(/usr/local/bin/canales.pl 1 INCR ${CDR(accountcode)}) same => n,Set(CALLS=${SHELL(/usr/local/bin/canales.pl 1 GET ${CDR(accountcode)})}) same => n,GotoIf($[${CALLS} > ${ODBC_canales(${CDR(accountcode)})}]?cong) same => n,NoOp(El cliente: ${CDR(accountcode)} tiene ${CALLS} llamadas activas) same => n,Agi(a2billing.php,1) same => n,Hangup same => n(cong),Congestion(3) same => n,hangup exten => h,1,System(/usr/local/bin/canales.pl 1 DECR ${CDR(accountcode)}) exten => h,n,Hangup para que quede: [a2billing] exten => _X.,1,NoOp(A2Billing Start) same => n,set(CDR(userfield)=${CHANNEL(peerip)}) same => n,System(/usr/local/bin/canales.pl 1 INCR ${CDR(accountcode)}) 302
same => n,Set(CALLS=${SHELL(/usr/local/bin/canales.pl 1 GET ${CDR(accountcode)})}) same => n,GotoIf($[${CALLS} > ${ODBC_canales(${CDR(accountcode)})}]?cong) same => n,NoOp(El cliente: ${CDR(accountcode)} tiene ${CALLS} llamadas activas) same => n,Agi(a2billing.php,1) same => n,Hangup same => n(cong),Congestion(3) same => n,hangup exten => h,1,System(/usr/local/bin/canales.pl 1 DECR ${CDR(accountcode)}) exten => h,n,Hangup De esta forma, en cada entrada de la tabla CDR, bajo el campo userfield, estará la dirección IP de donde se ha originado la llamada. Para más información acerca de la función CHANNEL: asterisk -rvvvvvvvvvvvvvvv CLI> core show function CHANNEL 8.5 Cambiar el numero de las tarjetas Normalmente el ACCOUNT NUMBER del cliente es generado automáticamente por el sistema y no se puede modificar. Esto porque en la configuración de A2BIlling el campo está configurado como de sola lectura. Es posible modificar la configuración de A2Billing para que el campo sea de lectura/escritura. Se abre el archivo que sigue: nano +331 /var/www/html/admin/Public/form_data/FG_var_card.inc y se modifica la siguiente linea: "size=30 $maxi readonly maxlength=40", Para que quede: "size=30 $maxi maxlength=40", Se guardan los cambios Se entra en el menú CUSTOMERS → Add Search y luego se escoge la opción “Add Customer”. El campo ACCOUNT NUMBER ya se debería poder modificar sin problema:
303
La longitud del campo no puede ser inferior al valor indicado en el siguiente parámetro (SYSTEM SETTINGS → Global List → Global): Card Number length
5-20
Longitud llamada
numérica.
Tarjeta
porque en ese caso el sistema de tarjetas prepago no funcionaria ya que el sistema espera recibir un numero de tarjeta entre 5 y 20 cifras. 8.6 Modificar el tamaño del campo destination en distintos reportes En algunos casos, en los reportes de llamadas presentes en la pagina de administración de A2Billing, no es posible identificar de forma clara el destino de las llamadas realizadas. Esto se debe al tamaño reservado por A2Billing a ese tipo de información. En el caso que se quiera aumentar el tamaño de ese campo en el reporte de las llamadas del la pagina de administración: nano +116 /var/www/html/admin/Public/call-log-customers.php Se modifica esta linea: $FG_TABLE_COL [] = array (gettext ( "Destination" ), "dest","10%", "center", "SORT", "15", "lie", "cc_prefix", "destination,prefix", "prefix='%id'", "%1" ); para que quede: $FG_TABLE_COL [] = array (gettext ( "Destination" ), "dest","10%", "center", "SORT", "30", "lie", "cc_prefix", "destination,prefix", "prefix='%id'", "%1" ); El parámetro que se modifica es SORT y se cambia su valor de 15 a 30. Se guardan los cambios. La misma cosa, aunque normalmente no se necesita, se puede hacer para los reportes de llamadas de la pagina de los clientes. Se abre el siguiente archivo:
304
nano +102 /var/www/html/customer/call-history.php y se modifica la siguiente linea: $FG_TABLE_COL[]=array (gettext("Destination"), "destination", "14%", "center", "SORT", "30", "lie", "cc_prefix", "destination", "prefix='%id'", "%1" ); Modificando el parámetro SORT de 30 a 40: $FG_TABLE_COL[]=array (gettext("Destination"), "destination", "14%", "center", "SORT", "40", "lie", "cc_prefix", "destination", "prefix='%id'", "%1" ); El mismo procedimiento se puede utilizar también para la pagina de las tarifas, menú RATES → Rates: nano +118 /usr/local/src/a2billing/admin/Public/form_data/FG_var_def_ratecard.inc se modifica la linea: $HD_Form -> AddViewElement(gettext("DESTINATION"), "destination", "17%", "center", "", "15");
para que quede: $HD_Form -> AddViewElement(gettext("DESTINATION"), "destination", "20%", "center", "", "30");
8.7 Campo destination en la tabla cc_call El campo destination de la tabla donde se guardan los reportes de las llamadas, cc_call, contiene un numero que representa el prefijo utilizado para escoger la ruta en la RateCards. Solamente al momento de visualizar el reporte de las llamadas, este numero se sustituye con el nombre del destino que el sistema saca de la tabla cc_prefix (véase el menú PROVIDERS → Prefixes). Mientras el campo prefix de la tabla cc_prefix está configurado como bigint(20), el campo destination de la tabla cc_call está configurado como Int(11). Problema: si en el campo prefix de la tabla cc_prefix está presente un valor con una longitud mayor de 11, como el valor del campo destination de la tabla cc_call no acepta valores con una longitud mayor de 11, no se visualizará correctamente el nombre del destino y en su lugar aparecerá el siguiente numero: 2147483647 Solución: modificar el campo destination de la tabla cc_call para que quede bigint(20): mysql -u root -psesamo mysql> use a2billing mysql> ALTER TABLE cc_call CHANGE destination destination BIGINT( 20 ) NULL 305
DEFAULT '0'; 8.8 Registros de Asterisk Como y donde se guardan los registros de Asterisk, se define en el archivo logger.conf. Para tener registros más detallados y distribuidos de forma más ordenada, se modifica dicho archivo: mv /etc/asterisk/logger.conf /etc/asterisk/logger.conf.old nano /etc/asterisk/logger.conf Se copian las lineas que siguen: [general] dateformat=%F %T ; ISO 8601 date format ;dateformat=%F %T.%3q ; with milliseconds ;appendhostname = yes queue_log = yes queue_log_name = queue_log rotatestrategy = rotate event_log = yes [logfiles] ; ; Format is "filename" and then "levels" of debugging to be included: ; debug ; notice ; warning ; error ; verbose ; dtmf debug => debug console => notice,warning,error,dtmf,debug security => security,notice messages => notice,warning full => error verbose => verbose,fax Se guarda los cambios y se recarga la configuración de ese archivo desde la consola: aste CLI> logger reload CLI> logger show channels
306
Para que no se creen archivos muy pesados, se aplican unas cuantas reglas de rotación: nano /etc/logrotate.d/asterisk Se copian las lineas que siguen: /var/log/asterisk/messages /var/log/asterisk/debug /var/log/asterisk/verbose /var/log/asterisk/security /var/log/a2billing/a2billing_agi.log{
missingok rotate 7 daily postrotate /usr/sbin/asterisk -rx 'logger reload' > /dev/null 2> /dev/null endscript } 8.9 Cambio nombre pestaña Navegador Cada vez que se entra a cualquier pagina de A2Billing, en la pestaña del navegador aparecerá el siguiente nombre:
Si se quiere modificar este nombre, se abre el siguiente archivo: nano +125 /var/www/html/common/lib/common.defines.php se modifica la linea: define ("CCMAINTITLE", gettext("A2Billing Portal")); Para que quede (personalizar): define ("CCMAINTITLE", gettext("VozToVoice")); El resultado:
307
8.10 Aumentar el numero de decimales en los reportes de llamadas Por defecto, los números de decimales que aparecen en los reportes de llamadas son 3:
Esto a pesar que en la base de datos, los datos se guarden con 5 decimales. Si se quiere modificar el numero de decimales, se abre el siguiente archivo: nano +512 /var/www/html/common/lib/Misc.php se modifica la linea: echo number_format($var, 3) . ' ' . strtoupper($currency); Para que quede (para 4 decimales): echo number_format($var, 4) . ' ' . strtoupper($currency); Se guardan los cambios. El resultado:
8.11 autenticación sobre IP Algunos clientes pueden solicitar que se les autentifique con la IP de donde van a enviar las llamadas. De hecho existen algunas PBX o sistemas de facturación que permiten solamente ese tipo de autenticación. En esos casos se pueden utilizar dos configuraciones distintas: • •
Modificar la extensión SIP del cliente directamente desde A2Billing Configurar la troncal directamente en Asterisk
La primera opción tiene la ventaja que es seguramente muchos más fácil de implementar. Se entra en el menú CUSTOMER → VoIP Settings y se modifica/crea una nueva extensión teniendo en cuenta los parámetros más importantes: • 308
ACCOUNTCODE: tiene que contener el numero de cliente al que se quiere facturar las
• • • •
llamadas SECRET: como el cliente se va a autentificar con la IP se quita la contraseña presente en este parámetro. HOST: en lugar de dynamic hay que indicar la IP de donde procederán las llamadas TYPE: en este parámetro se indica peer ya que Asterisk empareja la llamada entrante basándose en la IP de donde llega USERNAME: el parametro USERNAME contiene el numero de extensión que Asterisk utiliza para autenticar los INVITE entrantes. Como se va a trabajar con la IP, se deja en blanco.
La segunda opción es un poco más compleja pero tiene la ventaja que permite definir el numero de canales que se le va a asignar al cliente utilizando las funciones GROUP y GROUP_COUNT . Esto siempre y cuando no se utilice el sistema de conteo de canales indicado en el párrafo 5.13. Otra ventaja es que se pueden configurar más IP por cada cliente. Por cada cliente se crea en el servidor Asterisk una troncal de este tipo: nano /etc/asterisk/sip.conf [cliente1] type=peer context=cliente1 host=IPcliente1 disallow=all allow=ulaw allow=alaw insecure=invite language=es dtmfmode = rfc2833 qualify=yes Como se puede notar a ese cliente se asocia el contexto “cliente1”. En el caso que el cliente tenga una segunda IP: [cliente1] type=peer context=cliente1 host=IPcliente2 disallow=all allow=ulaw allow=alaw insecure=invite language=es dtmfmode = rfc2833 qualify=yes Indicando la segunda IP y el mismo contexto (cliente1). Se guardan los cambios y se recarga la configuración sip: 309
asterisk -rvvvvvvvvvvvvvvvvv CLI> sip reload El paso a seguir es crear el contexto cliente1 en el dialplan: nano /etc/asterisk/extensions.conf Al final del archivo se crea el siguiente bloque: [cliente1] exten => _X.,1,NoOp(llamadas del cliente1) same => n,Set(CDR(accountcode)=accountcliente1) same => n,Set(GROUP(voip)=cliente1) same => n,Set(canales=${GROUP_COUNT(cliente1@voip)}) same => n,Gotoif($[${canales} > 10]?congestion) same => n,Goto(a2billing,${EXTEN},1) same => n,Hangup same => n(congestion),Congestion(2) same => n,Hangup Las partes importantes: • • • • •
en la segunda linea de asigna a la variable CDR(accountcode) el valor del parámetro ACCOUNT NUMBER del cliente que aparece en el menú CUSTOMERS → Add :: Search. Esto para que la llamada se facture correctamente. En la tercera linea se crea un grupo que contendrá el nombre del cliente En la cuarta linea se utiliza la función GROUP_COUNT que lo que hace es añadir una unidad al grupo que se acaba de crear (cliente1) y asocia ese valor a la variable “canales” en la quinta linea se ejecuta este proceso: si el valor de la variable ${canales} es mayor a 10 salta a la etiqueta congestion, sino sigue con la próxima linea. En la sexta linea se envía la llamada al contexto [a2billing], extensión igual al numero marcado, prioridad uno.
En el caso en que los canales utilizados son más de 10 se envía una señal de congestión al cliente1 que de esta forma podrá enrutar la llamada a otro proveedor. Se guardan los cambios y se recarga el dialplan: asterisk -rvvvvvvvvvvvvv CLI> dialplan reload Ahora en CUSTOMERS → VoIP Settings se puede borrar la entrada asociada al cliente1.
310
8.12 Actualizar A2Billing a una nueva versión Para actualizar una versión “vieja” de A2Billing, a la ultima disponible, los pasos a seguir son: 1. 2. 3. 4. 5. 6. 7.
Parar Asterisk y Apache o Nginx Sacar una copia de la base de datos a2billing Descargar la ultima versión Actualizar los permisos de los archivos Actualizar la base de datos Modificar nuevamente todos los archivos que se han cambiado en la vieja versión Iniciar nuevamente Asterisk
En este caso se actualizará la versión 2.1.0 de la versión 3.7 del libro a la versión 2.2.0, la ultima disponible en este momento. Primero se para Asterisk: service asterisk stop Se para Apache o Nginx según el que se utilice: service httpd stop service nginx stop Se entra en la siguiente carpeta: cd /usr/local/src Se realiza una copia de la base de datos a2billing (por seguridad): mysqldump -u root -psesamo a2billing > a2billing.sql se descarga la versión 2.2.0 de A2Billing: wget https://github.com/Star2Billing/a2billing/archive/v2.2.0.tar.gz se descomprime: tar -xf v2.2.0.tar.gz Se renombra la carpeta que contiene la versión 2.1.0 de A2Billing: mv a2billing a2billing.2.1.0 Se renombra la carpeta que contiene A2Billing 2.2.0: mv a2billing-2.2.0 a2billing Como a partir de la versión 2.1.1 de A2Billing se utiliza Composer para instalar toda las dependencias 311
y como algunas se instalan utilizando el programa GIT: yum install git -y Se continua utilizando Composer para instalar las dependencias: curl -sS https://getcomposer.org/installer | php php composer.phar update php composer.phar install Se cambian nuevamente los permisos en las carpetas presentes en el servidor web: chmod 755 /usr/local/src/a2billing/admin/templates_c chmod 755 /usr/local/src/a2billing/customer/templates_c chmod 755 /usr/local/src/a2billing/agent/templates_c chown -Rf apache:apache /var/www/html/ chown -Rf apache:apache /var/www/html/admin/ chown -Rf apache:apache /var/www/html/agent/ chown -Rf apache:apache /var/www/html/customer/ chown -Rf apache:apache /var/www/html/common/ Se continua con la actualización de la base de datos: cd /usr/local/src/a2billing/DataBase/mysql-5.x/ se envía a MySQL los archivos desde la versión 2.0.11 hasta la versión 2.1.0 de la siguiente forma: mysql -u root -psesamo a2billing < UPDATE-a2billing-v2.1.0-to-v2.1.1.sql mysql -u root -psesamo a2billing < UPDATE-a2billing-v2.1.1-to-v2.1.2.sql mysql -u root -psesamo a2billing < UPDATE-a2billing-v2.1.2-to-v2.1.3.sql mysql -u root -psesamo a2billing < UPDATE-a2billing-v2.1.3-to-v2.1.4.sql mysql -u root -psesamo a2billing < UPDATE-a2billing-v2.1.4-to-v2.2.0.sql Terminada la actualización de la base de datos, se modifican los archivos que se habían cambiado en la versión anterior: nano /var/www/html/admin/Public/A2B_invoice_view.php para e logo de las facturas lado administrador. nano /var/www/html/customer/A2B_invoice_view.php Para el logo de las facturas lado cliente. nano +778 /usr/local/src/a2billing/admin/Public/form_data/FG_var_card.inc
312
Para que por defecto no se cree una extensión IAX cuando un administrador crea un nuevo cliente. nano +147 /var/www/html/customer/A2B_entity_sipiax_info.php Para modificar la salida del menú SIP/IAX INFO de la pagina del cliente. nano /usr/local/src/a2billing/customer/templates/default/index.tpl Para traducir la pagina de acceso del cliente al español. nano /usr/local/src/a2billing/agent/Public/templates/default/index.tpl Para traducir la pagina de acceso del revenedor al español. nano +758 /usr/local/src/a2billing/agent/Public/form_data/FG_var_card.inc Para que por defecto no se cree una extensión IAX cuando un revendedor crea un nuevo cliente. nano +115 /usr/local/src/a2billing/admin/Public/form_data/FG_var_friend.inc Para modificar los parámetros predefinidos cuando se añade una nueva extensión a un cliente. nano +141 /var/www/html/admin/Public/A2B_asteriskinfo.php Para modificar la versión de Asterisk en el menú MAINTENANCE → Asterisk Info nano +331 /var/www/html/admin/Public/form_data/FG_var_card.inc Para volver el parámetro ACCOUNT NUMBER del cliente modificable desde la pagina de administración nano +67 /usr/local/src/a2billing/admin/Public/phpconfig_init.php Para modificar el usuario como indicado en el archivo manager.conf nano +116 /var/www/html/admin/Public/call-log-customers.php Para agrandar el tamaño del campo DESTINATION en los reportes de la pagina de administración nano +102 /var/www/html/customer/call-history.php Para agrandar el tamaño del campo DESTINATION en los reportes de la pagina del cliente nano +118 /usr/local/src/a2billing/admin/Public/form_data/FG_var_def_ratecard.inc Para agrandar el tamaño del campo DESTINATION en la pagina de las tarifas
313
nano +125 /var/www/html/common/lib/common.defines.php Para modificar el nombre que aparece en la pestaña del navegaor. nano +512 /var/www/html/common/lib/Misc.php Para aumentar el numero de decimales en los reportes de las llamadas. Ahora que se han modificado todos los archivos y supuestamente el sistema está configurado con la nueva versión, se inicia nuevamente Asterisk, Apache o Nginx: service asterisk start service httpd start service nginx start Se accede a la pagina de administración de A2Billing y se averigua que efectivamente la versión de la interfaz y de la base de datos sea la 2.1.0. Menú DASHBOARD:
314
Capitulo IX Resolución de problemas Este capitulo está dedicado a la resolución de problemas que puedan ocurrir a lo largo de la configuración y implementación de A2BIlling. 9.1 Pagina Web en blanco Si al momento de entrar en la pagina de administración de A2BIlling, aparece una pagina totalmente blanca, significa que hay algún tipo de error en la configuración del sistema o en el código PHP del sistema de facturación. El tipo de error no aparece porque por seguridad en la configuración predefinida del php.ini este parámetro está deshabilitado. Para habilitarlo se abre el archivo: nano /etc/php.ini y se modifica este parámetro: display_errors = Off para que quede: display_errors = On se reinicia el servidor Web: service httpd restart Se vuelve a entrar en la pagina que quedaba en blanco. Ya aparecerá el tipo de error. Una vez que se tenga esta referencia ya se puede solucionar el problema y una vez solucionado se vuelve a poner el parámetro como estaba: nano /etc/php.ini de: display_errors = On a:
display_errors = Off service httpd restart 9.2 Recuperar password administrador A2billing Si por cualquier motivo se olvida la contraseña de administrador de A2BIlling hay una forma para volver a configurar la predefinida. Suponiendo que el usuario que se está utilizando es admin, los pasos a seguir son: entrar en la consola de MySQL mysql -u root -psesamo utilizar la base de datos a2billing: mysql> use a2billing se escribe este comando: mysql> update cc_ui_authen set pwd_encoded = '410fc6268dd3332226de95e42d9efa4046c5463769d7493b85e65cfa5c26362dc2455cc23c0bc5831de b008def4ab11a9eaa9b76ba3f377da134f39ec60dd758' where login='admin'; Este comando no hace nada más que volver a poner como password predefinida changepassword. Todos los numeros y las letras que aparecen son la versión cifrada de esa password. Se sale del cliente mysql: mysql> quit y se vuelve a entrar en la pagina de administración de A2Billing utilizando estos datos: Usuario: admin Password: changepassword 9.3 Tarificación errada de las llamadas En algunos ATA la llamada se empieza a cobrar desde que se termina de marcar el numero. Para solucionar el problema en la linea en el menú SYSTEM SETTINGS → Globa List, se selecciona el agi-conf que se está utilizando para las llamadas y se modifica el siguiente parámetro:
317
Dial Command Params
,60,rL(%timeout%:61000:30000)
Opciones para el comando Dial de Asterisk.
quitando la r de la linea del Dial para que quede: Dial Command Params
,60,L(%timeout%:61000:30000)
Opciones para el comando Dial de Asterisk.
Esta es también la configuración indicada para evitar que se cobre la llamadas a celulares cuando vaya al buzón de voz.
318
Apéndice A GNU Free Documentation License Version 1.3, 3 November 2008
Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. 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
subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, 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, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, 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. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. The "publisher" means any person or entity that distributes copies of 321
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 text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) 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. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in 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. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent 322
copy along with each Opaque copy, 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, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure 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. It is requested, but not required, 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. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one 323
stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. 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. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. 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. 5. COMBINING DOCUMENTS 324
You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements". 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, 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. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. 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, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. 325
Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. 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. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in 326
detail to address new problems or concerns. See http://www.gnu.org/copyleft/. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, 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 does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document. 11. RELICENSING "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. A public wiki that anybody can edit is an example of such a server. A "Massive Multiauthor Collaboration" (or "MMC") contained in the site means any set of copyrightable works thus published on the MMC site. "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. "Incorporate" means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is "eligible for relicensing" if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. 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, 2009, provided the MMC is eligible for relicensing. ADDENDUM: How to use this License for your documents To use this License in a document you have written, 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. 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. A copy of the license is included in the section entitled "GNU 327
Free Documentation License". If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.
328