Translate

viernes, 7 de diciembre de 2012

Asterisk con Alta-Disponibilidad + MySQL

En algunas ocasiones nos vemos en la necesidad de crear un Cluster de alta disponibilidad para nuestros servicios de Asterisk. A continuación se describen los pasos necesarios para llevar esto acabo en nuestros servidores usando Asterisk y MySQL(por si queremos usar Asterisk Realtime Architechture).

Estos pasos están basados en las instrucciones que brinda Digium y los tutoriales de DRBD para MySQL.
Este tutorial no esta hecho para hacer copy&paste.
El color verde indica que son pasos para realizar en ambos servidores.
El color Naranja indica que son pasos para realizar en el servidor primario.
El color Rojo indica que son pasos para realizar en el servidor secundario.
El Hostname del Servidor primario es "node1".
El Hostname del Servidor secundario es "node2".
La dirección IP del servidor primario es 10.0.1.51
La dirección IP del servidor secundario es 10.0.1.52
La dirección IP compartida del cluster y a la que deberán apuntar los servicios(como el registro de teléfonos, MySQL o apache) es 10.0.1.50.
La dirección IP del Gateway es 10.0.1.1.
Se puede adaptar fácilmente el Hardware Failover que provee Digium(rseries) y los servicios de Apache.



La Imagen anterior describe el funcionamiento del Cluster:
-- Escenario 1: El servidor primario esta activo y el secundario esta en modo pasivo esperando.
-- Escenario 2: El servidor Primario ha entrado en estado de falla(por conexión de RED o por reinicio o falla en el kernel), el servidor secundario entonces, se convierte en el servidor primario y es marcado como activo.
-- Escenario 3: El servidor secundario(antes primario) se ha recuperado de la falla y ha entrado en modo pasivo.
-- Escenario 4: El servidor primario(antes secundario)  ha presentado falla  y el servidor secundario(antes primario) es marcado como servidor primario nuevamente y entra en modo activo.


Paso 1 ---- Realizar en Ambos Servidores:

Instala CentOS 5.X(Los agentes de recursos "ocf"de Digium no son compatibles con las versiones 6.X de CentOS). Escoger el modo de partición manual y dejar un espacio libre sin formateo ni nada, en este tutorial yo he dejado 5GB sin particionar. Este espacio será donde guardemos nuestros datos a replicar en el Cluster, así que deberán considerar cuanto espacio necesitaran para sus archivos y logs.

Paso 2 ---- Realizar en Ambos Servidores:

Instala las dependencias para nuestros servidores. Primero añadiré el repositorio de rpmforge:
#rpm -ihv http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.[ARCH].rpm
Cambia [ARCH] por la arquitectura del servidor: i386 o x86_64.

Ahora instala las dependencias:
#yum -y install kernel kernel-devel libxml2  libxml2-devel  libtiff  libtiff-devel  lame httpd  mysql mysql-devel mysql-server php  php-pear  php-mysql  php-gd openssl openssl-devel perl  bison ncurses-devel audiofile-devel curl sox gcc newt-devel libusb-devel glibc-devel  zlib-devel svn gcc-c++ subversion make nano wget cfdisk


Paso 3 ---- Realizar en Ambos Servidores:

Ejecuta el comando:
#cfdisk

Obtendrás una ventana como esta:

Selecciona el espacio libre y crea una nueva partición con todo el espacio libre usando los botones: New, Primary, Write. Al finalizar te preguntara si quieres efectuar los cambios, escribe la palabra: yes y da enter.

Cuando el proceso termine reinicia el servidor:
#reboot  

Una vez que el servidor haya arrancado de nuevo hay que limpiar la nueva partición usando el siguiente comando:
#dd if=/dev/zero of=/dev/[hs]da[#] bs=1M; sync
Cambia /dev/[hs]da[#] por tu dispositivo que puede ser SDA3,HDA3 o SDB3 HDB3 etc. En este tutorial es HDA3.

Veras una salida similar cuando termine el proceso, dependiendo del tamaño de tu partición y de la velocidad de tus discos duros puede tomar minutos u horas.


Crea un nuevo directorio en /usr/src:
#cd /usr/src/
#mkdir asterisk
#cd asterisk/


En el nuevo directorio descarga Asterisk y sus componentes:
#wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-2.6.1+2.6.1.tar.gz
#wget http://downloads.asterisk.org/pub/telephony/libpri/libpri-1.4.13.tar.gz
#wget http://downloads.asterisk.org/pub/telephony/certified-asterisk/certified-asterisk-1.8.11-current.tar.gz
#wget http://downloads.digium.com/pub/telephony/rseries/rseries-current.tar.gz

Descomprime los archivos fuente:
#for i in `ls *gz`; do tar zxvf $i; done

Compilamos DAHDI:
#cd dahdi-linux-complete-2.6.1+2.6.1
#make && make all && make install && make config

Compilamos LibrPRI y configuramos DAHDI:
#cd ../libpri-1.4.13
#make && make install
#service dahdi start
#dahdi_genconf
#dahdi_cfg -vvvvv

Instalamos los agentes de Digium para el cluster:
#cd ../rseries-1.0.0/
#make && make install


Paso 4 ---- Realizar solo en  Servidor Primario..

Instalar Asterisk en el servidor primario:

#cd ../certified-asterisk-1.8.11-cert9
#contrib/scripts/get_mp3_source.sh
#./configure && make menuselect


En el menú selecciona las aplicaciones que quieras disponibles en tu asterisk:

Guarda los cambios y compila Asterisk:
#make && make install && make config && make samples

Inicia el servicio de Mysql y detenlo esto solo para crear las bases de datos por default.
#service mysqld start
#service mysqld stop


Paso 5 ---- Realizar en Ambos Servidores.

Cambiate al directorio de rseries:
#cd /usr/src/asterisk/rseries-1.0.0/

Instala los servicios de DRBD:
#yum -y install drbd83 kmod-drbd83

Instala Libesmtp, dependencia necesaria para Pacemaker:
#wget http://dl.fedoraproject.org/pub/epel/5/[ARCH]/libesmtp-1.0.4-5.el5.[ARCH].rpm #64bits
Cambia [ARCH] por la arquitectura del servidor: i386 o x86_64.

Instala PaceMaker y Corosync:
#wget -O /etc/yum.repos.d/pacemaker.repo http://clusterlabs.org/rpm/epel-5/clusterlabs.repo
#yum -y install -x heartbeat-stonith* pacemaker corosync
Estamos exluyendo el paquete heratbeat-stonith ya que cre un conflicto con pacemaker.

Instala los archivos de configuración que provee Digium:
#make samples

Agrega estas lineas al archivo /etc/drbd.conf:
echo "include \"drbd.d/global_common.conf\";" >> /etc/drbd.conf
echo "include \"drbd.d/*.res\";" >> /etc/drbd.conf

Edita el archivo /etc/drbd.d/asterisk.res. Cambia astnode1 por el nombre el hostname del servidor primario, cambia astnode2 por el hostname del servidor secundario, cambia /dev/sda3 por la partición que creamos con el espacio libre(en este tutorial hda3). Cambia las IPs por las de tus servidores primarios y secundarios.Cambia el correo electrónico por el tuyo o el administrador del sistema en este tutorial el archivo quedo así:
resource asterisk {
  handlers {
    split-brain "/usr/lib/drbd/notify-split-brain.sh clusteradmin@example.com";
  }

  net {
    after-sb-0pri discard-younger-primary;
    after-sb-1pri discard-secondary;
    after-sb-2pri disconnect;
  }

  on node1 {
    device    /dev/drbd0;
    disk      /dev/hda3;
    address   10.0.1.51:7789;    
    meta-disk internal;
  }
  on node2 {
    device    /dev/drbd0;
    disk      /dev/hda3;
    address   10.0.1.52:7789;
    meta-disk internal;
  }
}

Crea el Recurso llamado asterisk e inicia el servicio de DRDB:
#drbdadm create-md asterisk
#service drbd start


Paso 6 ---- Realizar solo en  Servidor Primario.

A continuación crea el UUID llamado Asterisk, y formatea la partición que será usada por el cluster tipo: EXT3
#drbdadm disconnect asterisk
#drbdadm -- --clear-bitmap new-current-uuid asterisk
#drbdadm -- --overwrite-data-of-peer primary asterisk
#mkfs.ext3 -m0 /dev/drbd0
#drbdadm secondary asterisk
#drbdadm detach asterisk
#drbdadm up asterisk


Crea el directorio que será usado para el cluster, pero antes marca como nodo primario para poder montarlo:
#drbdadm primary asterisk
#mkdir /mnt/asterisk

Monta la partición:
#mount -t ext3 /dev/drbd0 /mnt/asterisk

Ahora crea el directorio donde estará Mysql:
#mkdir /mnt/asterisk/mysql
#mkdir /mnt/asterisk/mysql/data
#cd /mnt/asterisk/mysql

Copia el contenido del directorio de Mysql al nuevo directorio:
#cp -aR /var/lib/mysql/* /mnt/asterisk/mysql/data
#ls data/

Mueve el archivo /etc/my.cnf al nuevo directorio de Mysql:
#mv /etc/my.cnf .

Crea un enlace simbólico al nuevo directorio:
#ln -s /mnt/asterisk/mysql/my.cnf /etc/
Edita el archivo my.cnf y cambia la directiva de DATADIR: datadir=/mnt/asterisk/mysql/data.

Crea un archivo dummy solo para verificar la replicación en el nodo secundario.
#touch test11

Desmonta la partición y marca el nodo como secundario:
#cd --
#umount /mnt/asterisk
#drbdadm secondary asterisk


Paso 7 ---- Realizar solo en Servidor Secundario

Elimina el archivo /etc/my.cnf
#rm -rf /etc/my.cnf

Vamos a verificar que los archivos de nuestra partición en el cluster se repliquen. Marca el servidor como primario y crea el mismo directorio:
#drbdadm primary asterisk
#mkdir /mnt/asterisk

Monta la partición y cambiate al directorio:
#mount -t ext3 /dev/drbd0 /mnt/asterisk
#cd /mnt/asterisk

Haz un enlace simbolico del archo my.cnf al directorio de la partición del cluster:
#ln -s /mnt/asterisk/mysql/my.cnf /etc/
Verifica que el archivo my.cnf sea el mismo que editamos anteriormente, es decir, que contenga:  datadir=/mnt/asterisk/mysql/data

Verifica que los archivos de Mysql y el archivo test11 existan en el directorio:
#ls

Si los archivos existen la replicación va de maravilla.

Desmonta la partición y marca el nodo como secundario:
#cd --
#umount /mnt/asterisk
#drbdadm secondary asterisk


Paso 8 ---- Realizar solo en  Servidor Primario.

Cambiate al directorio de rseries, mara el servdiro como primario y monta la partición:
#cd /usr/src/asterisk/rseries-1.0.0
#drbdadm primary asterisk
#mount -t ext3 /dev/drbd0 /mnt/asterisk/

Ejecuta el script cretalinks.sh:
#./createlinks.sh
Veras una salida como la siguiente:


Elimina el script de asterisk para que no arranque automáticamente cuando inicie el sistema, desmonta la partición y marca el nodo como secundario:
#chkconfig --del asterisk
#umount /mnt/asterisk
#drbdadm secondary asterisk


Paso 9 ---- Realizar solo en Servidor Secundario

Cambiate al directorio de rseries, marca el nodo como primario, monta la partición y ejecuta el script createlinks.sh:
#cd /usr/src/asterisk/rseries-1.0.0
#drbdadm primary asterisk
#mount -t ext3 /dev/drbd0 /mnt/asterisk/
#./createlinks.sh
Veras una salida como en la imagen anterior.

Cambiate al directorio de Asterisk, configura las mismas opciones que se configuraron en el servidor primario. Compilalo solo ejecutando make && make install. Desmonta la partición y marca el nodo como secundario.
#cd ../certified-asterisk-1.8.11-cert9
#contrib/scripts/get_mp3_source.sh
#./configure && make menuselect
#make && make install
#umount /mnt/asterisk/
#drbdadm secondary asterisk


Paso 10 ---- Realizar en Ambos Servidores.

Edita el archivo /etc/corosync/corosync.conf. Cambia la opción bindnetaddr, y las opciones memberaddr. Para este tutorial el archivo quedo de la siguiente manera:

totem {
        version: 2
        token: 3000
        token_retransmits_before_loss_const: 10
        join: 60
        consensus: 5000
        vsftype: none
        max_messages: 20
        clear_node_high_bit: yes
        secauth: off
        threads: 0
        rrp_mode: none

        interface {
                ringnumber: 0
                bindnetaddr: 10.0.1.0
                broadcast: yes
                mcastport: 5405
                member {
                        memberaddr: 10.0.1.51
                }
                member {
                        memberaddr: 10.0.1.52
                }
        }
}

aisexec {
        user:   root
        group:  root
}

logging {
        fileline: off
        to_stderr: yes
        to_logfile: no
        to_syslog: yes
        syslog_facility: daemon
        debug: off
        timestamp: on
        logger_subsys {
                subsys: AMF
                debug: off
                tags: enter|leave|trace1|trace2|trace3|trace4|trace6
        }
}

amf {
        mode: disabled
}

Inicia el servicio de Corosync y añade drbd y corosync al startup:
#service corosync start
#chkconfig drdb on
#chkconfig corosync on

Verifica el estado del Cluster con el siguiente comando:
#cat /proc/drbd
Veras una imagen como la siguiente:
Veras que se esta sincronizando la particion del cluster, también verás como Secondary/Secondary(no como en la imagen).

Si el proceso de sincronización reporta que tardará mucho tiempo puedes usar este comando para acelerar la velocidad de sincronización:
#drbdsetup /dev/drbd0 syncer -r 250M

La velocidad máxima de sincronización dependerá de la velocidad de tus tarjetas de red así como la velocidad de escritura de tus discos duros. Para más información de como calcular la velocidad ve a este enlace.

Una vez que el estado sea UpToDate/UpToDate reinicia los servidores:
#reboot


Paso 11 ---- Realizar solo en  Servidor Primario.

Edita el siguiente codigo para que:
-- node1 y node2. Sean los hostnames de tus servidores. En este ejemplo node1 y node2
-- ip bajo ClusterIP. Sea la Ip de tu Cluster, la IP flotante. En este ejemplo 10.0.1.50
-- cidr_mask bajo ClusterIP. Sea la mascara de tu red. en este ejemplo de 24bits(255.255.255.0)
- -host_list bajo GatewayStatus. Sea el gateway de tu red. en este ejemplo 10.0.1.1

node node1
node node2
primitive ClusterIP ocf:heartbeat:IPaddr2 \
        params ip="10.0.1.50" cidr_netmask="24" \
        op monitor interval="5"
primitive drbd ocf:linbit:drbd \
      params drbd_resource="asterisk" \
      op monitor start-delay="10" interval="5"  \
primitive drbd_fs ocf:heartbeat:Filesystem \
      params device="/dev/drbd0" directory="/mnt/asterisk/" fstype="ext3"
primitive mysqld lsb:mysqld
primitive Asterisk ocf:Digium:asterisk \
        op monitor interval="5"
primitive GatewayStatus ocf:pacemaker:ping \
        params host_list="10.0.1.1" multiplier="100" \
        op monitor interval="5" timeout="10"
ms drbd_ms drbd \
        meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
clone GatewayStatusClone GatewayStatus
location Asterisk-with-ping Asterisk \
        rule $id="Asterisk-with-ping-rule" -inf: not_defined pingd or pingd lte 0
group mysql drbd_fs ClusterIP mysqld
colocation mysql_on_drbd inf: mysql drbd_ms:Master
order mysql_after_drbd inf: drbd_ms:promote mysql:start
colocation Everything-with-Asterisk inf: ( drbd_ms:Master )  ( ClusterIP drbd_fs )  Asterisk
order  Asterisk-after-Everything inf:   ( drbd_ms:promote ) ( ClusterIP drbd_fs )  Asterisk:start
property $id="cib-bootstrap-options" \
        cluster-infrastructure="openais" \
        expected-quorum-votes="2" \
        stonith-enabled="false" \
        no-quorum-policy="ignore"
rsc_defaults $id="rsc-options" \
        resource-stickiness="99"

Una vez que has editado el archivo Cluster_Mysql_Asterisk.cfg, actualiza la configuración de pacemaker:
#crm configure load update Cluster_Mysql_Asterisk.cfg

Si todo sale bien veras una salida como la siguiente y los servicios de MySQL y Asterisk se iniciaran en el nodo primario:

Para verificar que los servicios estén corriendo puedes revisar el estado del cluster con:
#crm_mon

Y verás algo así:



Demostración:

El siguiente video muestra las pruebas del cluster. Asterisk esta configurado con "static realtime" obteniendo los datos de una base de datos de MySQL. Este tutorial no cubre la cofiguración de ARA(Asterisk Realtime Architechture).




Herramientas para diagnosticar fallas:

Puedes ejecutar el siguiente comando en el nodo secundario para verificar que la configuración de pacemaker se replico:
#crm configure show

Para detener los servicios del cluster:
#crm configure property stop-all-resources=true

Para borrar la configuracion del cluster:
#crm configure erase

Verificar el estado del cluster:
#crm_mon

Verificar el estado de la sincronización y los roles de los servidores:
#cat /prco/drbd

Aumentar la velocidad de sincronización:
#drbdsetup /dev/drbd0 syncer -r 250M

viernes, 5 de octubre de 2012

Notificación de correo HTML para el buzón de voz.

Todos sabemos que Asterisk nos informa vía correo electrónico sobre un nuevo mensaje en nuestro Buzón de voz. Esta herramienta es de las más solicitadas en las instalaciones de los IP-PBX; sin embargo, la notificación tiende a ser en texto plano con muy poco formato.


Enviar la notificación en modo HTML nos permite darle mayor vista/formato, además de que es un plus a nuestras instalaciones y nuestro trabajo. ;)

Existen dos maneras de hacer que Asterisk envíe la notificación de correo con formato HTML: Nativamente y con un Script externo.


Nativamente:

Usando este método no se necesita mas que modificar el archivo app_voicemail.c y recompilar Asterisk para enviar en modo HTML el correo electrónico.

Pero tiene su desventaja: dado que la aplicación encargada de ejecutar el proceso tiene el tamaño de las variables limitadas el cuerpo del mensaje es muy pequeño, cerca de 500 letras solamente, lo que limita el formato del correo. Si aún así pretenden hacerlo de manera nativa he aquí los pasos a seguir:


1) Con el editor de Texto preferido abrir el archivo fuente: app_voicemail.c, ubicado en le directorio apps.


2) Navegar hasta la línea #4748, estamos buscando esta cadena:
fprintf(p, "Content-Type: text/plain; charset=%s" ENDL "Content-Transfer-Encoding: 8bit" ENDL ENDL, charset);



3) Reemplazar text/plain por text/html:
fprintf(p, "Content-Type: text/html; charset=%s" ENDL "Content-Transfer-Encoding: 8bit" ENDL ENDL, charset);

4) Guardar los cambios y recompilar Asterisk:
# make && make install



5) Editar el Archvio voicemail.conf para añadir nuestro mensaje con formato HTML, yo utilicé este codigo:
emailbody="
Estimado: ${VM_NAME}
Deseamos Hacerle saber que ha recibido un nuevo mensaje de voz desde el número ${VM_CALLERID} el día ${VM_DATE}.
Para revisarlo marque desde su Teléfono la extensión 9898 o vaya al siguiente enlace
Sistema de Correo de Voz Digital-Merge
6) Entramos al cli de Asterisk y recargamos la configuración del voicemail:
> voicemail reload


7) Al recibir un nuevo buzón de voz, ahora nuestro correo recibirá un texto similar a esta imagen:




Usando un Script:


Este método requiere un poco mas de trabajo pero la presentación final vale la pena:

1) Lo que vamos a hacer es un archivo externo que envíe el correo usando PHP y dando el formato desde ese mismo archivo. Por esta razón necesitamos la librería PHPMAILER. 

2) Lo que necesitamos es capturar la salida de Asterisk al enviar el correo al stdin de Linux, con el fin de capturar las variables del buzón de voz. Este es el ejemplo de la salida que envía Asterisk al STDIN:


Date: Mon, 17 Sep 2012 11:22:41 -0500
From: "Digital-Merge" <Digital-Merge@Airo-Shaka>
To: "Max Reyes" <navaismo@gmail.com>
Subject: =?ISO-8859-1?Q?=5BVM=5D=3A_Nuevo_Mensaje_de_Voz?=
Message-ID: <Asterisk-1-1981780523-5000-1192@Airo-Shaka>
X-Asterisk-CallerID: 5001
X-Asterisk-CallerIDName: Test
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="----voicemail_150001192190857712"


This is a multi-part message in MIME format.

------voicemail_150001192190857712
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit

Max Reyes|5000|0:01|"Test" <5001>|Monday, September 17, 2012 at 11:22:41 AM
------voicemail_150001192190857712
Content-Type: audio/x-wav; name="msg0000.wav"
Content-Transfer-Encoding: base64
Content-Description: Voicemail sound attachment.
Content-Disposition: attachment; filename="msg0000.wav"

UklGRqQMAABXQVZFZm10IBAAAAABAAEAQB8AAIA+AAACABAAZGF0YYAMAAAIAAAACAAIAAgA
CAAIAAAACAAAAAAACAAAAAAACAAAAAAAAAAIAAgACAAIAAgAAAAAAAgACAAIAAgACAAIAAgA
CAAAAAgACAAIAAgAAAAIAAAAAAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgA
CAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAAAAAAAgAAAAIAAAACAAIAAAACAAAAAAA
CAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAAAAAAAgACAAIAAgAAAAIAAAA
CAAIAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgAAAAAAAAACAAAAAAACAAIAAgACAAIAAgA
CAAIAAgACAAAAAgACAAIAAgACAAIAAgACAAIAAgAAAAAAAgACAAIAAgACAAIAAgACAAIAAgA
CAAIAAAAAAAIAAAAAAAIAAgACAAIAAgAAAAAAAgACAAAAAgACAAAAAAACAAIAAgACAAIAAAA
AAAAAAgACAAIAAgAAAAAAAAACAAIAAAAAAAAAAAACAAIAAAACAAIAAgACAAIAAgACAAIAAgA
AAAIAAgACAAAAAgACAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgACAAIAAgACAAAAAAAAAAAAAAA
AAAAAAAAAAAIAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAAAAAAAAAgACAAIAAgA
AAAAAAgACAAIAAAAAAAAAAgAAAAAAAgACAAIAAgACAAAAAAACAAIAAgACAAIAAgACAAIAAgA
AAAIAAgACAAAAAAAAAAIAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAA
AAAIAAAAAAAAAAAAAAAAAAAACAAIAAAAAAAIAAAACAAIAAgACAAAAAgAAAAAAAgAAAAAAAAA
AAAAAAAAAAAAAAAACAAAAAgACAAIAAgAAAAAAAgACAAAAAgACAAIAAAACAAIAAAACAAAAAgA
AAAIAAgAAAAIAAgAAAAAAAAAAAAAAAAACAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAA
AAAIAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgAAAAAAAgACAAAAAAAAAAAAAAAAAAIAAAA
CAAIAAgACAAIAAAACAAAAAAACAAAAAAAAAAAAAAAAAAIAAgAAAAAAAgACAAAAAAACAAAAAAA
CAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAA
AAAAAAgACAAAAAgACAAIAAgAAAAIAAAACAAIAAgACAAAAAgACAAAAAgACAAIAAAACAAAAAAA
CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAACAAAAAgACAAAAAAAAAAIAAgAAAAIAAgAAAAIAAAAAAAAAAgA
CAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAIAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAIAAAAAAAIAAAAAAAAAAgACAAAAAAAAAAAAAAAAAAAAAAACAAIAAAA
AAAAAAAAAAAAAAAACAAAAAAAAAAIAAgAAAAAAAgACAAIAAgAAAAAAAgAAAAAAAAACAAIAAAA
CAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAIAAAAAAAAAAgACAAAAAgACAAIAAAAAAAAAAgA
CAAAAAgACAAAAAAACAAIAAAAAAAAAAAAAAAIAAgACAAAAAgACAAAAAAACAAIAAAAAAAAAAAA
AAAAAAAACAAIAAAAAAAAAAgAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAgACAAIAAAAAAAAAAAA
AAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgACAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAA
AAAAAAAAAAAIAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAA
CAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAAAAAAAAAgACAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAIAAgACAAIAAAAAAAIAAAACAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAA
CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAIAAgA
AAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAAAAAAAAAAA
CAAAAAAACAAAAAAACAAIAAgACAAAAAgACAAAAAAAAAAIAAgAAAAAAAAAAAAAAAAAAAAIAAgA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgAAAAAAAgAAAAAAAAAAAAAAAAACAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAA
AAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAAACAAAAAgA
CAAAAAgAAAAAAAAAAAAAAAAAAAAIAAgACAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAACAAIAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgAAAAAAAAA
AAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
CAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAACAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAA
AAAAAAAACAAAAAAAAAAIAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAIAAAA
AAAAAAAACAAIAAgACAAIAAAAAAAAAAAACAAIAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAIAA==


------voicemail_150001192190857712--
.




3) El script de PHP:
#!/usr/bin/php -q
?php
date_default_timezone_set('America/Mexico_City');

//************** obtenemos el stdin del asterisk *************************************/
$in = fopen('php://stdin', 'r');
while(!feof($in)){
 $text = $text . fgets($in, 4096);
}

//************* guardamos la salida a un archivo temporal ****************************/
$time=time();
$fp = fopen("/etc/asterisk/data_" .$time .".txt", "w");
fwrite($fp, $text);
fclose($fp);

//************ Obtenemos las Lineas que contienen los datos del Buzón
$path = "/etc/asterisk/data_" .$time. ".txt";
$handle = fopen($path, "r");
$lines = file($path); 

//*********** las lineas que usaremos son:
$linenum = 2; //email
$linenum2 = 17; // variables vm
$linenum3 = 19; // numero de mensaje

$toemail=get_between($lines[$linenum],"<",">"); //********* el email
$msg=str_replace('"',"",$lines[$linenum3]); //********* Quitamos las comillas
$msg2=get_between($msg,"=",".wav"); //********* el numero de mensaje
$args=$lines[$linenum2]; //********* argumentos del vm(nombre, buzon, CID etc) 

/*********** Separamos los Valores de Nombre, buzon, Fecha, CID y Duracion *************************/
$vmargs=explode("|",$args);
$name=$vmargs[0];
$mailbox=$vmargs[1];
$dur=$vmargs[2];
$cid=$vmargs[3];
$date=$vmargs[4];


/********** Construimos las Variables a usar para enviar el email **********************************/

$mail_lib_path = "/etc/asterisk/PHPMailer/"; 
$from = "micorreo@midominio.com";  /* correo */
$fromName = "QuienEnvia";                  /* quien lo envia */
$host = "ssl://smtp.gmail.com";              /* servidor smpt */
$username = "micorreo@midominio";  /* usuario  */
$password = "mipassword";                   /* password */
$port = "465";                                            /* puerto   */
$subject = "[VM]: New Voicemail Message";   /* titulo del correo */


/***************** Este es el Cuerpo HTML,  editar las URLS **************************/
$body="
New Voicemail Received
Dear ${name}
You have a new voicemail on your mailbox: ${mailbox}. From the Number: ${cid} with duration: ${dur} the day ${date}
You can check it from the user's web page.
Best Regards.
Or Just Dial

You can hear the message from your phone just dialing the number 9898 and following the instructions.
Digital-Merge Voicemail System
"; /*************** Asignamos las varibales al constructor email ******************/ require($mail_lib_path . "class.phpmailer.php"); $mail = new PHPMailer(true); $mail -> IsHTML (true); $mail->IsSMTP(); //$mail->SMTPDebug = 1; // Habilita información SMTP (opcional para pruebas) // 1 = errores y mensajes // 2 = solo mensajes $mail->SMTPAuth = true; // Habilita la autenticación SMTP $mail->Subject = $subject; $mail->Body = $body; $mail->AddAddress($toemail,$name); $mail->From = $from; $mail->FromName = $fromName; $mail->Host = $host; $mail->Mailer = "smtp"; $mail->SMTPAuth = true; $mail->Username = $username; $mail->Password = $password; $mail->Port = $port; $mail->AddAttachment("/var/spool/asterisk/voicemail/default/".${mailbox}."/INBOX/".${msg2}.".wav"); /************* enviar email ******************************/ if($mail->Send()) { echo "\r\nSent Ok! \r\n"; } else { echo "\r\nSend Failed... \r\n"; echo $mail->ErrorInfo; } /**************** eliminamos el archivo temporal ******************/ unlink("/etc/asterisk/data_" .$time .".txt"); /****************** funcion para obtener una cadena entre dos palabras ****************/ function get_between ($text, $s1, $s2) { $mid_url = ""; $pos_s = strpos($text,$s1); $pos_e = strpos($text,$s2); for ( $i=$pos_s+strlen($s1) ; (( $i<($pos_e)) && $i < strlen($text)) ; $i++ ) { $mid_url .= $text[$i]; } return $mid_url; } ?>
4) Editamos el Archivo voicemail.conf para enviar las variables y ejecutar el script, solo editamos la parte del emailbody y el programa que se ejecutará:



emailbody=${VM_NAME}|${VM_MAILBOX}|${VM_DUR}|${VM_CALLERID}|${VM_DATE}
mailcmd=/etc/asterisk/sendvm.php
5) Finalmente cuando recibamos un nuevo buzón de voz la notificacón que llegara será como esta imagen:






Espero esto les sea de utilidad!






jueves, 9 de agosto de 2012

Call Monitor Asterisk

Hola,

Aquí dejo este programa que sirve para monitorear las llamadas entrantes de cualquier extensión IAX2, SIP o DAHDI.

Descargar Version 1.5 RC3 Español

English Version Download Here Version 1.5 RC3

Portugés Version Baixe aqui a versão 1.5RC3 Traducción gracias a Fabricio Tavares

 /************************************* !!!!!!!!!!! IMPORTANTE ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ********************************/
  
 Este Programa es brindado "COMO ES" sin garantia, ni soporte.
  
 /*************************************  Requerimientos *****************************************************/
  
 1) Para poder usar este programa necesita agregar un usuario al manager de asterisk. Por ejemplo: Abra el 
  
   archivo /etc/asterisk/manager.conf y agregue las siguientes líneas.
  
      [popup] ;usuario
  
      secret= popup_pass ;paswword
  
      deny=0.0.0.0/0.0.0.0 
  
      permit=10.0.1.0/255.255.255.0 ; cambiar por su IP o localhost
  
      read = system,call,log,verbose,agent,user,config,dtmf,reporting,cdr,dialplan
  
      write = system,call,agent,user,config,command,reporting,originate,message
  
 2) Cargar la nueva configuración del manager en asterisk con el siguiente comando:
  
      manager relaod
  
 3) Si activa la opcion "Activar navegador" necesitará instalar Firefox en su sistema. 
  
 /************************************** Instrucciones de Instalación ****************************************/
  
 1) Para Linux:
  
      -- Copie la carpeta Linux/CallMonitor a la ubicación que desee.
  
      -- Asegurese que el binario Callmonitor tenga permisos de ejecucion, esto se logra entrando en una 
  
        consola e ingresando el siguiente comando:
  
           chmod +x CallMonitor
  
      -- Ejecute desde consola o desde el Escritorio. 
  
 2) Para Windows:
  
      -- Copie la carpeta Windows/CallMonitor a la ubicación que desee.
  
      -- Ejecute el programa dando doble click sobre el icono.
  
      -- Cuando minimize la aplicación, esta se ancalará a la barra de tareas, para volverla a mostrar 
  
        de click derecho sobre el icono y elija Mostrar.
  
 /***************************************** Caracteristicas ****************************************************/
  
 Este programa provee las siguientes funciones:
  
 1) Abre una ventana emergente que contiene el: Nombre(CALLERID(name)) y el Número(CALLERID(num)) del Llamante
  
 2) Abre un navegador web(FireFox) con la URL dada y los parametros:
  
      -- UNIQUEID.
  
      -- CALLERIDNAME
  
      -- CALLERIDNUM
  
 /***************************************** LICENCIA *************************************************************/
  
 COPYLEFT
  
 Mantenga el Autor
  
 Y NO COBRE por este programa!!!!!
  

Aquí hay dejo unas imagenes:

Linux:






En Windows:

 En Windows al Minimizar la aplicación se esconde junto al reloj.