Asterisk 1.8.X y los Calendarios en CentOS 5.7 - Primera Parte

Asterisk puede ser integrado con distintos formatos de calendarios. Esta nueva funcionalidad ha sido incluida desde la versión 1.8.X. Los formatos soportados son:

  • iCalendar: es un estándar Internet (RFC5546) que ha sido utilizado por primera vez por Apple con su aplicación iCal

  • CalDAV: es un estándar Internet (RFC4791) que permite a un cliente acceder a la información de eventos programados presentes en un servidor. Es una extensión del estándar Internet WebDAV (RCF 4918). Para el formato de los datos se apoya a iCalendar. Actualmente es utilizado por muchas aplicaciones, entre ellas, Google Calendar, Zimbra, Yahoo! Calendar y Thunderbird de Mozilla Fundation.

  • MS Exchange: utilizado por Microsoft Exchange 2003

  • Ms Exchange Web Services: utilizado por Exchange 2007 y superiores.

Esto significa que Asterisk, oportunamente configurado, puede interactuar con estos formatos de Calendario. Los módulos que se encargan de esta integración son:

asterisk -rvvvvvvvvvvvvv

CLI> module show like res_calendar

Module Description Use Count
res_calendar.so Asterisk Calendar integration 1
res_calendar_caldav.so Asterisk CalDAV Calendar Integration 0
res_calendar_ews.so Asterisk MS Exchange Web Service Calenda 0
res_calendar_icalendar.so Asterisk iCalendar .ics file integration 0
res_calendar_exchange.so Asterisk MS Exchange Calendar Integratio 0

Para que estén activados en Asterisk, hay que compilar las siguientes dos librerías:

  • Neon

  • libical

Al momento de ejecutar, desde la carpeta de las fuentes de Asterisk, el comando make menuselect, se averigua que los módulos estén habilitados:

1

El archivo para la configuración de los calendarios es calendar.conf y se encuentra en la carpeta /etc/asterisk. En este archivo se puede configurar más de un calendario y cada uno será identificado por una etiqueta inicial. Para crear un entorno real, se simulará la conexión al calendario de Google, que se puede activar utilizando una cuenta Gmail registrada. A seguir los parámetros de configuración.

[voztovoice]

Etiqueta que permite identificar el calendario que se está configurando.

type

Puede ser:

  • iCal

  • caldav

  • exchange (Microsoft Exhange 2003)

  • ews ( Microsoft Exchange 2007 y superiores)

Para Google Calendar el tipo es caldav

url

La URL para conectarse al calendario. En el caso de GoogleCalendar la sintaxis es:

https://www.google.com/calendar/dav/voztovoice@gmail.com/events/

Personalizar username@gmail con su cuenta de Google

user

Nombre usuario gmail. En este ejemplo: voztovoice@gmail.com Personalizar

secret

la contraseña del usuario Google

refresh

Cada cuantos minutos consultar el Calendario de Google para actualizar los datos en Asterisk. Valor: 10

timeframe

Por cada consulta extraer los eventos que tendrán lugar en los próximos N minutos. Este valor tiene que ser mayor del parámetro refresh. Valor: 180 (3 horas)

autoreminder

Este parámetro anula cualquiera notificación configurada para un evento y la cambia por el valor indicado en minutos. Valor 10

channel

Cuando falten los N minutos definidos en el parámetro autoreminder, es posible enviar una llamada a la extensión indicada en este parámetro. La sintaxis es: Tecnología/numero. Suponiendo que este calendario es asociado a la extensión 1000, se pone SIP/1000. A partir de los próximos parámetros podemos definir dos comportamientos distintos cuando la extensión 1000 conteste la llamada:

  • enviar la llamada a un contexto, extensión definida

  • ejecutar una aplicación y definir sus parámetros.

context

extension

nombre del contexto: calendario

numero de extensión: cal

app

appdata

aplicación a ejecutar cuando la extensión conteste: Playback

opciones para la aplicación: demo-congrats

waittime

este ultimo parámetro define el tiempo (en segundos) que tendrá la extensión 1000 para contestar la llamada. Valor 45

Con estos parámetros se configura el primer calendario. Como configuración predefinida, cuando la extensión 1000 conteste, se utilizarán los dos parámetros context/extension. Primero se crea una copia del archivo predefinido:

mv /etc/asterisk/calendar.conf /etc/asterisk/calendar.conf.old

y se crea uno nuevo:

nano /etc/asterisk/calendar.conf

[voztovoice]
type=caldav
url=
https://www.google.com/calendar/dav/voztovoice@gmail.com/events/
user=voztovoice@gmail.com
secret=password
refresh=10
timeframe=180
autoreminder=10
channel=SIP/1000
context=calendario
extension=cal
waittime=45
;app= Playback
;appdata=demo-conrats

Importante: Personalizar los datos de la etiqueta inicial, el parámetro url, el parámetro user y el parámetro secret con los datos de su cuenta Google.

Se guardan los cambios

Ahora se entra en la pagina del calendario de Google y se van añadiendo una serie de eventos para el día en que se está configurando este modulo. En este ejemplo se han creado tres:

1

Se entra en la consola de Asterisk:

asterisk -rvvvvvvvvvvvvvvvvvvvv

Se recarga el modulo calendario:

CLI> module reload res_calendar.so

Si aparece esta advertencia:

[Feb 7 16:20:09] WARNING[27477]: res_calendar_caldav.c:157 caldav_request: Unknown response to CalDAV calendar voztovoice, request REPORT to /calendar/dav/voztovoice@gmail.com/events/: Could not read status line: connection was closed by server

significa que la configuración no está funcionando. ¿Por qué? Si se mira el parámetro url del archivo, se notará que empieza con https, esto quiere decir que se basa en una conexión segura y que la librería que permite la conexión a CalDAV (neon) debe implementar el protocolo SSL. ¿Será que Neon no se ha compilado con el soporte SSL?

Se entra en la carpeta de las fuentes de neon (que deberíamos haber instalado al momento de la compilación de Asterisk 1.8.X):

cd /usr/src/neon-0.29.6

y se lanza nuevamente un configure:

./configure

Cuando el comando termine:

1

Por defecto neon no se compila con el soporte SSL, pues para solucionar el problema hay que volver a compilar neon y luego Asterisk:

make distclean

./configure --prefix=/usr --with-ssl=openssl

1

Ahora si se compiló con el soporte SSL. Se termina la compilación e instalación:

make

make install

Ahora hay que volver a compilar Asterisk. Primero se para el servicio:

service asterisk stop

Se entra en la carpeta de las fuentes:

cd /usr/src/asterisk-1.8.8.2

se borra la compilación anterior:

make distclean

se vuelve a compilar:

./configure

Se necesita volver a entrar en la interfaz gráfica para seleccionar los módulos Add-ons ya que por defecto no están seleccionados:

make menuselect

1

Se guardan los cambios y se vuelve a compilar:

make

make install

Terminada esta operación, se inicia nuevamente Asterisk:

service asterisk start

Se entra en la consola y se recarga nuevamente el modulo Calendario:

asterisk -rvvvvvvvvvvvvv

CLI> module reload res_calendar.so

Si no aparecen errores significa que esta vez la conexión al calendario de Google ha tenido éxito y se debería poder ver algunos eventos programados.

CLI> calendar show calendars

Con este comando aparecerá la lista de calendarios configurados y el estados de cada uno:

Calendar     Type     Status
-------- ---- ------
voztovoice caldav free

Con este comando:

CLI> calendar show calendar voztovoice

2

se pueden ver los eventos programados en los próximos 180 minutos (parámetro timeframe=180). Si no aparecen es porque todavía Asterisk no ha actualizado la información ya que lo hace cada 10 minutos (parametro refresh=10). Modificar voztovoice con el nombre de su calendario.

Aparece el evento de las 7:30 y el evento de las 9:30. El evento programado a las 11 no aparece porque el modulo está configurado para que lea los eventos de los próximos 180 minutos. Ahora para que la llamada llegue a la extensión 1000 hay que crear el contexto calendario y la extensión cal (como configurado en el archivo calendar.conf). ¿Cómo se construye el dialplan para que la extensión 1000 pueda saber que cita está para iniciar?. Hay que instalar un sistema de texto a voz que lea un texto y lo transforme en audio.

Lefteris Zafiris, ha desarrollado un AGI que se conecta al sistema de texto a voz de Google y transforma un texto en audio. Aunque la parte de los AGI se verá de manera más detallada en el ultimo modulo del curso, en este caso se implementará esta solución. Para que el AGI funcione, los requisitos son:

  • Paquete Perl

  • Paquete perl-libwww

  • sox

  • mpg123

  • el servidor donde está instalado Asterisk debe tener acceso a Internet

Como sox ya se ha instalado antes de compilar Asterisk, se instalan los paquetes de perl:

yum install perl perl-libwww-perl

se descarga y compila mpg123:

cd /usr/src

wget http://downloads.sourceforge.net/project/mpg123/mpg123/1.13.4/mpg123-1.1...

tar -xf mpg123-1.13.4.tar.bz2

cd mpg123-1.13.4

./configure --prefix=/usr

make

make install

Ya se puede descargar el archivo que contiene el AGI:

cd /usr/src

wget http://www.voztovoice.org/campus/pbx18/asterisk-googletts-0.5.tar.gz

Se descomprime:

tar -xf asterisk-googletts-0.5.tar.gz

Se entra en la carpeta creada:

cd asterisk-googletts-0.5

Por defecto Asterisk busca los AGI en la carpeta /var/lib/asterisk/agi-bin. Por eso se copia el AGI en esa carpeta y se vuelve ejecutable:

cp googletts.agi /var/lib/asterisk/agi-bin/

chmod +x /var/lib/asterisk/agi-bin/googletts.agi

Por ultimo se modifica el dialplan:

nano /etc/asterisk/extensions.conf

y se crea el nuevo contexto:

[calendario]
exten => cal,1,NoOp(Llamada desde el calendario)
same => n,Agi(googletts.agi,"${CALENDAR_EVENT(summary)}.",es)
same => n,Agi(googletts.agi,"a las ${STRFTIME(${CALENDAR_EVENT(start)},,%H:%M)}.",es)
same => n,Wait(1)
same => n,Playback(goodbye)
same => n,Hangup

En la segunda y tercera línea se inicia el AGI y se leen las variables ${CALENDAR_EVENT(summary)} y ${CALENDAR_EVENT(start)} que contienen el titulo del evento y la hora de inicio respectivamente. Como la hora se lee en el formato EPOCH, hay que transformarla en el formato de hora y minutos a través de la función STRFTIME

Se recarga el dialplan:

asterisk -rx "dialplan reload"

Ahora 10 minutos antes del inicio del evento, Asterisk llamará la extensión 1000 y cuando esta conteste, le anunciará el tipo de evento y la hora en que va a iniciar. La llamada llegará siempre con este CALLERID:

1

Cuando el evento iniciará en el calendario aparecerá el estado ocupado:

asterisk -rvvvvvvvvvvvvvv

CLI> calendar show calendars

Calendar Type Status
-------- ---- ------
voztovoice caldav busy

Esto es así siempre y cuando en la configuración del evento en el Calendario se haya configurado la opción:

1

Para saber que tipo de informaciones se pueden conocer acerca de un evento programado el comando es:

asterisk -rvvvvvvvvvvvvvv

CLI> core show function CALENDAR_EVENT

-= Info about function 'CALENDAR_EVENT' =-

[Synopsis]

Get calendar event notification data from a notification call.

[Description]

Whenever a calendar event notification call is made, the event data may be accessed with this function.

[Syntax]

CALENDAR_EVENT(field)

[Arguments]
field
summary - The VEVENT SUMMARY property or Exchange event 'subject'
description - The text description of the event
organizer - The organizer of the event
location - The location of the eventt
categories - The categories of the event
priority - The priority of the event
calendar - The name of the calendar associated with the event
uid - The unique identifier for this event
start - The start time of the event
end - The end time of the event
busystate - The busy state of the event 0=FREE, 1=TENTATIVE,2=BUSY

Todos los parámetros bajo la etiqueta [Arguments] se pueden extraer del calendario y utilizar en el dialplan.

Vota el Articulo: 

Sin votos (todavía)
Evalúa la calidad del articulo

8 comentarios

duda no-relacionada

Hola, el articulo esta genial, en mi caso tengo que sincronizarlo con un Exchange via OWA. Mi duda es ¿como se hace para consultar un calendario OWA desde la consola de linux? Si mi Asterisk puede, supongo que podre usar "mas o menos" las mismas herramientas para hacerlo fuera de Asterisk ... ¿no?

No logro ver lo eventos y conectarme

Buenas tardes, te puedo hacer una consulta por favor, he seguido todos lo pasos y llegué a compilar asterisk 1.8.20.1 sin problemas. pero no logro conectarme al calendario. Me da el error

res_calendar_caldav.c:157 caldav_request: Unknown response to CalDAV calendar calendar1, request REPORT to /calendar/dav/martin.scian.mts@gmail.com/events/: Could not read status line: connection was closed by server

pero he compilado neon con ssl como lo explicas, pero me esta este error, se te ocurre que puede ser?

Lo único que veo distintos es que no me permite seleccionar en la configuración de asterisk es res_config_mysql, puede ser esto?

Muchas gracias
Martín

Un Dato mas

Ahí usando la url privada, pareciera que se conecto, pero me dice lo siguiente:

'res_calendar_icalendar.c:472WARNING[16354]: res_calendar_icalendar.c:472 ical_load_calendar: Unable to parse iCalendar 'mts'

Muchas gracias
Saludos

Re: Un dato más

Hola,

has probado a conectarte directamente desde firefox o chrome:

https://www.google.com/calendar/dav/fulano@gmail.com/events/

Debería aparecerte una ventana pidiéndote nombre de usuario y contraseña. Nombre de usuario pones tu cuenta gmail (fulano@gmail.com) y en contraseña la contraseña de ese usuario. Si te aparece una ventana para descargar un archivo significa que la conexión funciona sino el problema es a nivel de acceso a tu calendario.

Claramente si la conexión funciona debe haber algo en la configuración de Asterisk que no está bien.

Acuérdate que después de haber compilado neon con el soporte SSL tienes que volver a compilar e instalar Asterisk.

Me cuentas

Saludos

Un dato más

Hola, si verifique la URL y logro conectarme sin problema con el Google chrome. Por otro lado luego de instalar neon volví a compilar asterisk, pero obtengo el mismo error. Podrá ser la versión de neon029?

Muchas gracias
Saludos

Re: Un dato más

Hola,

por fin logramos entender que estaba pasando.

Parece que desde el 23 de enero de este año la conexión a los calendarios de Google con la configuración indicada en este tutorial dejó de funcionar.

Ahora en el archivo calendar.conf, parametro type, en lugar de:

type = caldav

hay que poner:

type = ical

luego reiniciar Asterisk.

http://forums.asterisk.org/viewtopic.php?f=1&t=85623

Muchas gracias compañero

Gracias por tu aporte compañero. todo me funcionaba bien, pero no me mostraba ninguno de los eventos programados, ha sido introducir el cambio que indicas y todo perfecto. Un saludo,

Suscribirse a Comentarios de "Asterisk 1.8.X y los Calendarios en CentOS 5.7 - Primera Parte" Suscribirse a VozToVoice - Todos los comentarios