Consulta los festivos de un calendario WebDAV desde Asterisk

Calendario Festivos

Introducción

Una de las grandes ventajas de las centralitas basadas en Asterisk es su flexibilidad a la hora de realizar implantaciones. Asterisk Gateway Interface (AGI) dota a nuestra centralita de una potencia sin igual para la integración de la misma con diferentes servicios dentro de la empresa, como CRM, ERP o un calendario compartido como es el caso del presente tutorial.

A lo largo de este “howto” aprenderemos a implementar un sistema de consultas de calendario mediante un AGI de Asterisk.

Objetivo

Nuestra empresa quiere que la centralita responda con un mensaje de bienvenida específico los festivos y fines de semana.

La información sobre las fechas en las que la empresa cierra al público estará contenida en un calendario editable desde los clientes PIM.

Resumen

  • Instalaremos un servidor Apache2 + WebDav para compartir un calendario en formato ICalendar, todo ello en el servidor Debian Sarge que alberga nuestra centralita Asterisk.
  • Configuraremos el calendario en nuestro cliente PIM para consultarlo y editarlo.
  • Crearemos un AGI que consulte el día actual en el calendario y responda con un mensaje de aviso en caso de que sea festivo o fin de semana.

Instalación

Instalación de Apache2 + WebDAV

apt-get install apache2
a2enmod dav
a2enmod dav_fs
/etc/init.d/apache2 restart

Añadimos el directorio WebDAV en el fichero /etc/apache2/sites-available/default.

Nota: En el ejemplo no se pide autenticación para acceder al recurso WebDAV, pero hay que tener presente que se le puede aplicar todo tipo de directivas comunes en Apache como autenticación, htaccess, etc. WebDAV permite además permisos de escritura independientes de los de lectura (todos pueden leer el calendario pero sólo algunos pueden editarlo).

Conseguir el calendario con festivos de España

Descargamos el calendario de la web de Mac, en concreto el calendario de España.

Creamos el directorio /var/www/webdav y guardamos en él el calendario. Nos aseguramos de dar permisos de escritura al usuario www-data en dicho recurso:

mkdir /var/www/webdav
mv Spain32Holidays.ics /var/www/webdav
chown www-data /var/www/webdav -R

Configuración del calendario compartido en nuestro cliente PIM

El acceso en modo escritura vía WebDAV a un calendario ICS está soportado por los principales clientes PIM. En este caso comentaré como implementarlo en Kontact, el cliente PIM de KDE:

  • Abrir el módulo KOrganizer y crear un nuevo recurso de tipo “Calendario en un fichero remoto“.
    • Descargar de: webdav://IP_Asterisk/webdav/Spain32Holidays.ics
    • Publicar en: webdav://IP_Asterisk/webdav/Spain32Holidays.ics
    • Recargar automáticamente: Intervalo regular (10 minutos)
    • Guardar automáticamente: Retrasado tras los cambios

Tras ello veremos en nuestro calendario los festivos nacionales.

Importante: La mayoría de clientes PIM (Mozilla Sunbird, Evolution, Outlook, etc) permiten el acceso a calendarios remotos ICalendar mediante el protocolo WebDAV.

Crear la categoría “Festivo”

Para nuestro propósito necesitamos definir una categoría “Festivo y asignársela manualmente a todas las fechas marcadas en el calendario. Esto se debe a que los festivos en el calendario que estamos usando no vienen especificados como tal, y de alguna forma debemos identificarlos en la consulta.

Festivo en mi empresa por obras

Crear nuestros propios festivos

La empresa puede definir sus propios festivos incluyéndolos en el calendario con la categoría Festivo.

Instalación de Ruby y librerías necesarias

En nuestro programa hemos empleado el lenguaje Ruby por disponer de clases muy cómodas para manejar AGI’s y ficheros ICalendar.

apt-get install ruby
apt-get install rdoc

Ahora instalaremos las librerías para manejo de AGI’s y ficheros ICalendar (ICS). En nuestro caso usaremos RubyGems, un gestor de librerías Ruby desde repositorio común:

  • Descargamos RubyGems.
  • Descomprimimos: tar -zxvf rubygems-0.9.0.tgz
  • Lo instalamos: ruby rubygems-0.9.0/setup.rb
  • Instalamos Ruby-Agi: gem install ruby-agi
  • Instalamos la librería iCalendar: gem install icalendar

Gracias al generador de documentación Rdoc podemos acceder cómodamente al API de las clases instaladas mediante un navegador web:

  • /usr/lib/ruby/gems/1.8/doc/ruby-agi-1.1.2/rdoc/index.html
  • /usr/lib/ruby/gems/1.8/doc/icalendar-0.97/rdoc/index.html

El dialplan

Tan sólo mencionar que ejecutaremos el AGI para cada llamada entrante desde el exterior, por lo que, suponiendo que el AGI se llama “comprobar-festivos.rb” y que el contexto adecuado es “entrantes” el dialplan sería: [entrantes]
exten => s,1,AGI(comprobar-festivos.rb)

También se podría complementar este sistema con una comprobación del horario de apertura al público en las llamadas recibidas. Esto se podría implementar con la aplicación GotoIfTime en la línea siguiente del dialplan.

El AGI

El código del programa sería éste: comprobar-festivos.rb.

Debemos guardar el fichero en “/var/lib/asterisk/agi-bin” y darle permisos de ejecución: chmod +x /var/lib/asterisk/agi-bin/comprobar-festivos.rb

Nota: En caso de tener el servidor web con el calendario en otra máquina habría que acceder al fichero remotamente. Por ejemplo usando el protocolo HTTP desde alguna clase de Ruby a tales efectos, o mediante alguna clase que implemente un cliente WebDAV (desconozco si existe para Ruby), o incluso montando el directorio remoto en el sistema de archivos del servidor Asterisk.

Las grabaciones de voz

Debemos grabar dos mensajes y guardarlos en /var/lib/asterisk/sounds:

  • hoy-es-fin-de-semana.alaw
  • hoy-es-festivo.alaw

Nota: El formato de audio puede ser cualquier otro soportado por Asterisk.

Conclusiones

Una vez más, la flexibilidad de Asterisk y sus AGI’s nos brindan la posibilidad de implementar cualquier funcionalidad que se nos ocurra en nuestra centralita, desde la más sencilla hasta la más exótica e innovadora.

En el ejemplo que nos ocupa confluyen en armonía varios conceptos y tecnologías (dialplan, AGI, Ruby, WebDAV, ICalendar). Las posibilidades sólo podrían estar limitadas por nuestra propia imaginación.

No quisiera terminar este pequeño “howto” sin antes agradecer su aportación a todas las personas que con sus desarrollos lo han hecho posible.

Leave a comment

4 Comments.

  1. La verdad es que AGI permite hacer cosas realmente interesantes.

  2. tengo problemas con el ruby cuando hago correr la aplicacion en un centos 5.0 me salen los siguientes errores Launched AGI Script /var/lib/asterisk/agi-bin/comprobar-festivos.rb
    /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require’: no such file to load –error.rb (LoadError)
    from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require’
    from /usr/lib/ruby/gems/1.8/gems/ruby-agi-2.0.0/lib/ruby-agi/rs/receive_char.rb:24
    from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:33:in `gem_original_require’
    from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:33:in `require’
    from /usr/lib/ruby/gems/1.8/gems/ruby-agi-2.0.0/lib/ruby-agi/return_status.rb:9
    from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:33:in `gem_original_require’
    from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:33:in `require’
    from /usr/lib/ruby/gems/1.8/gems/ruby-agi-2.0.0/lib/ruby-agi/command.rb:40
    … 10 levels…
    from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:228:in `activate’
    from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:66:in `active_gem_with_options’
    from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:59:in `require_gem’
    from /var/lib/asterisk/agi-bin/comprobar-festivos.rb:20
    — AGI Script comprobar-festivos.rb completed, returning 0

  3. Vaya, parece que CentOS guarda las librerías de Ruby en otro sitio. No obstante creo que no debería haber problema, asegúrate de hacer estos pasos:

    - wget http://rubyforge.org/frs/download.php/11289/rubygems-0.9.0.tgz (aunque hay ya una versión 0.9.4).

    - tar -zxvf rubygems-0.9.0.tgz

    - ruby rubygems-0.9.0/setup.rb

    - gem install ruby-agi

    - gem install icalendar

    ¿No te da ningún error? si es así continuamos:

    Cambia en el script:
    require_gem ‘ruby-agi’
    por:
    require ‘ruby-agi’
    (require_gem está deprecated aprece ser).

    Ahora ejecuta de nuevo el programa a ver si te sigue dando el error. Si continúa haz lo siguiente:

    - Crea un script “prueba.rb”:
    ————————
    puts “require rubygems”
    require ‘rubygems’

    puts “require icalendar”
    require ‘icalendar’

    puts “require date”
    require ‘date’

    puts “require ruby-agi”
    require ‘ruby-agi’

    puts “agi=AGI.new”
    agi = AGI.new
    ———————–

    y pega la salida.

Leave a Reply


[ Ctrl + Enter ]

Trackbacks and Pingbacks: