Tablas con LaTeX

Una de las cosas que de inicio puede ser complicado con Latex, es la creación de tablas. No es que no sea sencillo, mas que nada en base a lo aprendido se necesita de un buen ejemplo y de ahí partir. Ya que de otra forma puede llevar un poco de tiempo lo que quieres.
Para instalar LaTeX necesitamos instalar el siguiente paquete que contiene todo lo necesario para empezar a trabajar con el mismo.

aptitude install texlive-latex-base

Un excelente editor para LaTeX en KDE es Kile, lo podemos instalar de igual manera con la siguiente sentencia.

aptitude install kile kile-i18n-es
Editor Kile
Editor Kile

Vamos a crear un archivo llamado testlatex.tex donde ingresaremos lo siguiente:

documentclass[a4paper,10pt]{report}
usepackage[utf8]{inputenc} %Acentos
usepackage[spanish]{babel} %Poner en español el documento

begin{document}

begin{table}
begin{center}
caption{Números}
vspace{2mm}
begin{tabular}{|r|r|r|r|r|}
hline
1 & 2 & 3 & 4 & 5  hline
2 & 3 & 4 & 5 & 4  hline
3 & 4 & 5 & 6 & 3  hline
4 & 5 & 6 & 7 & 2  hline
5 & 4 & 3 & 2 & 1  hline
end{tabular}
end{center}
end{table}

end{document}

Si quisieramos crear un archivo PDF a partir de este documento previamente realizado necesitamos realizar lo siguiente.

gabriel@trantor:~/CDR$ pdflatex testlatex.tex
This is pdfTeXk, Version 3.141592-1.40.3 (Web2C 7.5.6)
 %&-line parsing enabled.
entering extended mode
(./testlatex.tex
LaTeX2e 
Babel  and hyphenation patterns for english, usenglishmax, dumylang, noh
yphenation, spanish, catalan, galician, loaded.
(/usr/share/texmf-texlive/tex/latex/base/report.cls
Document Class: report 2005/09/16 v1.4f Standard LaTeX document class
(/usr/share/texmf-texlive/tex/latex/base/size10.clo))
(/usr/share/texmf-texlive/tex/latex/base/inputenc.sty
(/usr/share/texmf-texlive/tex/latex/base/utf8.def
(/usr/share/texmf-texlive/tex/latex/base/t1enc.dfu)
(/usr/share/texmf-texlive/tex/latex/base/ot1enc.dfu)
(/usr/share/texmf-texlive/tex/latex/base/omsenc.dfu)))
(/usr/share/texmf-texlive/tex/generic/babel/babel.sty
(/usr/share/texmf-texlive/tex/generic/babel/spanish.ldf
(/usr/share/texmf-texlive/tex/generic/babel/babel.def))) (./testlatex.aux)
[1{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] (./testlatex.aux) )
Output written on testlatex.pdf (1 page, 8072 bytes).
Transcript written on testlatex.log.
Números
Números

Otro ejemplo igual puede ser este, el cual nos muestra otros detalles a considerar.

begin{table}
begin{center}
caption{Arquitecturas soportadas por Debian}
vspace{2mm}
begin{tabular}{|l|l|l|}hline
Alpha & AMD64 & ARM hline
HP PA-RISC & Intel x86 & Intel IA-64 hline
MIPS (big endian) & MIPS (little endian) & PowerPC hline
IBM S/390 & SPARC & hline
end{tabular}
end{center}
end{table}
Arquitecturas disponibles en Debian
Arquitecturas disponibles en Debian

Asterisk llama a Cuba

Tiene como mes y medio que note que alguien estaba intentando llamar a costa del conmutador y lamentablemente lo logro por cierto tiempo debido a unas lineas que tenia de prueba y que olvide comentar. Así que después de corregir el error, la consola y los logs se llenaron de lineas semejantes a estas, se cansaron de probar una vez que verificaron que el hueco había sido tapado. Cuidado con lineas sueltas que tengan por ahí y que permitan llamar por la PSTN, se pueden llevar una desagradable sorpresa en la factura. Cosa a destacar que al día siguiente TELMEX llamo para ver si nosotros por alguna razón habíamos echo llamadas a este país, ya que es anormal hacer llamadas a este país en un lapso de tiempo tan corto.

[Jul 1 18:24:15] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005352943654’ rejected because extension not found.
[Jul 1 18:24:21] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005352873548’ rejected because extension not found.
[Jul 1 18:24:42] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005352415837’ rejected because extension not found.
[Jul 1 18:24:43] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘000053622226347’ rejected because extension not found.
[Jul 1 18:24:44] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005378361157’ rejected because extension not found.
[Jul 1 18:24:51] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005372046125’ rejected because extension not found.
[Jul 1 18:25:12] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005352611328’ rejected because extension not found.
[Jul 1 18:25:19] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005346399396’ rejected because extension not found.
[Jul 1 18:25:59] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005352287086’ rejected because extension not found.
[Jul 1 18:26:06] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005343555236’ rejected because extension not found.
[Jul 1 18:26:08] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005343555236’ rejected because extension not found.
[Jul 1 18:26:35] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005352949012’ rejected because extension not found.
[Jul 1 18:27:07] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005352917137’ rejected because extension not found.
[Jul 1 18:27:08] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005346324206’ rejected because extension not found.
[Jul 1 18:27:09] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005346324206’ rejected because extension not found.
[Jul 1 18:27:11] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘0000537001934’ rejected because extension not found.
[Jul 1 18:27:49] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005352769352’ rejected because extension not found.
[Jul 1 18:27:54] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005352823316’ rejected because extension not found.
[Jul 1 18:27:57] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005343572966’ rejected because extension not found.
[Jul 1 18:28:00] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005343572966’ rejected because extension not found.
[Jul 1 18:28:50] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘0000536535345228’ rejected because extension not found.
[Jul 1 18:28:55] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005378333636’ rejected because extension not found.
[Jul 1 18:28:57] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005376833290’ rejected because extension not found.
[Jul 1 18:28:58] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005353130672’ rejected because extension not found.
[Jul 1 18:29:04] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005345812858’ rejected because extension not found.
[Jul 1 18:29:05] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005372640160’ rejected because extension not found.
[Jul 1 18:29:07] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005372640160’ rejected because extension not found.

Extrayendo el audio de videos flv (ffmpeg2theora, oggz-tools).

Es cosa común hoy en día descargar vídeos de youtube (principalmente) por los múltiples clips musicales que se pueden encontrar. En mi caso particular muchas veces lo único que quiero es extraer el audio para agregarlo a mi biblioteca musical y últimamente los he querido almacenar en formato ogg (Vorbis).

Los vídeos siempre los descargo con youtube-dl

Ahora en la mayoría de los casos, siempre convierto los archivos a MP3 con ffmpeg de la siguiente manera:

gabriel@trantor:~/Videos$ ../Descargas/youtube-dl http://www.youtube.com/watch?v=_O_O4XesuA4
gabriel@trantor:~/Videos$ ls *.flv
B1Do0SZYKXY.flv  fUYaosyR4bE.flv  _O_O4XesuA4.flv
gabriel@trantor:~/Videos$ ffmpeg -i _O_O4XesuA4.flv -ac 2 -ab 128k -ar 44100 -y nada.mp3

Sin embargo al querer crear un disco de audio con K3b agregando los MP3 me marcaba problemas al agregar los archivos al proyecto, formato no soportado. De igual manera estos archivos no eran reproducidos por mi reproductor portátil.

errork3b

Buscando con el sabelotodo Google, llegue a hacer el siguiente procedimiento gracias a este blog http://blog.kfish.org/labels/flac.html.

Instalamos los siguientes paquetes.

trantor:/home/gabriel# aptitude install ffmpeg2theora
trantor:/home/gabriel# aptitude install oggz-tools

Y ahora de esta manera primero convertimos los flv al formato de vídeo ogv (de todos modos los vídeos los conservo).

gabriel@trantor:~/Videos$ ls *.flv
B1Do0SZYKXY.flv  fUYaosyR4bE.flv  _O_O4XesuA4.flv
gabriel@trantor:~/Videos$ ffmpeg2theora -a 10 -A 128 -c 2 -H 44100 _O_O4XesuA4.flv
Input #0, flv, from '_O_O4XesuA4.flv':
  Duration: 00:05:32.4, start: 0.000000, bitrate: 112 kb/s
    Stream #0.0: Video: flv, yuv420p, 400x180 [PAR 0:1 DAR 0:1], 29.92 tb(r)
    Stream #0.1: Audio: mp3, 22050 Hz, stereo, 112 kb/s
  Resize: 400x180
  Resample: 22050Hz => 44100Hz
      0:05:33.02 audio: 130kbps video: 394kbps, time elapsed: 00:05:39

Ahora solo extraemos el audio.

gabriel@trantor:~/Videos$ oggzrip -c vorbis _O_O4XesuA4.ogv -o nada.ogg
gabriel@trantor:~/Videos$ ls *.ogg
alfa.ogg  nada.ogg

Y listo lo podemos reproducir o hacer lo que queramos. Ahora ya puedo escuchar estos ogg en mi imitación de ipod. =)

Si sabes de un método mejor bienvenido sea.

MP3 y música en espera

El MP3 es un formato de archivos de audio tan extendido, sobre todo en el usuario final que en alguna ocasión nos pueden dar un archivo de este tipo para integrarlo en nuestro PBX, por lo cual aquí veremos como partiendo de un MP3 convertirlo al formato nativo de asterisk para integrarlo a nuestra música en espera.

El archivo es la música clásica del personaje mas sobresaliente del imperio.

gabriel@trantor:~/Descargas/IPBX$ ls *.mp3
Star_Wars-Imperial_March.mp3

Utilizamos ffmpeg para convertir el archivo mp3 a un formato que asterisk entienda.

gabriel@trantor:~/Descargas/IPBX$ ffmpeg -i Star_Wars-Imperial_March.mp3 -ar 8000 -ac 1 -ab 64 Star_Wars-Imperial_March.wav
FFmpeg version r11872+debian_0.svn20080206-17, Copyright (c) 2000-2008 Fabrice Bellard, et al.
  configuration: --enable-gpl --enable-libfaad --enable-pp --enable-swscaler --enable-x11grab --prefix=/usr --enable-libgsm --enable-libtheora --enable-libvorbis --enable-pthreads --disable-strip --enable-libdc1394 --disable-armv5te --disable-armv6 --disable-altivec --disable-vis --enable-shared --disable-static
  libavutil version: 49.6.0
  libavcodec version: 51.50.0
  libavformat version: 52.7.0
  libavdevice version: 52.0.0
  built on Feb 10 2009 08:13:56, gcc: 4.3.3
Input #0, mp3, from 'Star_Wars-Imperial_March.mp3':
  Duration: 00:03:04.3, start: 0.000000, bitrate: 112 kb/s
    Stream #0.0: Audio: mp3, 44100 Hz, stereo, 112 kb/s
WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s
Output #0, wav, to 'Star_Wars-Imperial_March.wav':
    Stream #0.0: Audio: pcm_s16le, 8000 Hz, mono, 128 kb/s
Stream mapping:
  Stream #0.0 -> #0.0
Press [q] to stop encoding
size=    2880kB time=184.3 bitrate= 128.0kbits/s
video:0kB audio:2880kB global headers:0kB muxing overhead 0.001492%

gabriel@trantor:~/Descargas/IPBX$ ls *.wav
Star_Wars-Imperial_March.wav

Creamos un nuevo directorio y copiamos el archivo para la creación de una nueva clase de musica en espera.

trantor:/home/gabriel# mkdir /var/lib/asterisk/moh/custom
trantor:/home/gabriel# cd Descargas/IPBX/
trantor:/home/gabriel/Descargas/IPBX# cp Star_Wars-Imperial_March.wav /var/lib/asterisk/moh/custom/

Especificamos la configuración que consta principalmente del nombre de la clase y el directorio donde se guardaran futuros archivos.

trantor:/home/gabriel/Descargas/IPBX# vim /etc/asterisk/musiconhold.conf
[default]
mode=files
directory=/var/lib/asterisk/moh

[pruebas]
mode=files
directory=/var/lib/asterisk/moh/custom

Recargamos la configuración y verificamos lo anteriormente escrito.

*CLI> moh reload
*CLI> moh show classes
Class: default
        Mode: files
        Directory: /var/lib/asterisk/moh
Class: pruebas
        Mode: files
        Directory: /var/lib/asterisk/moh/custom
*CLI>

Para probar agregamos la siguiente linea a nuestro dialplan.

trantor:/home/gabriel/Descargas/IPBX# vim /etc/asterisk/extensions.conf
exten => 6000,1,MusicOnHold(pruebas)

Vemos en la consola la ejecución de nuestro archivo y nos imaginamos a Darth Vader caminando en la estrella de la muerte.

*CLI>     -- Executing [6000@default:1] MusicOnHold("SIP/5010-08d39190", "pruebas") in new stack
    -- Started music on hold, class 'pruebas', on SIP/5010-08d39190
    -- Stopped music on hold on SIP/5010-08d39190
  == Spawn extension (default, 6000, 1) exited non-zero on 'SIP/5010-08d39190'

Grabando llamadas con Asterisk

Pequeño macro para realizar grabación de llamadas con Asterisk.

[macro-grabarfile]
exten => s,1,Set(calltime=${STRFTIME(${EPOCH},,%C%y%m%d-%H%M%S)})
exten => s,n,Set(calldir=/var/spool/asterisk/monitor/${CALLERID(num)})
exten => s,n,System(/bin/mkdir -p ${calldir})
exten => s,n,MixMonitor(${calldir}/${calltime}-${CALLERID(num)}-${MACRO_EXTEN}.wav|av(0)V(0))
exten => s,n,Dial(${ARG1},40)
exten => s,n,Hangup()

Para grabar las llamadas hacia una extensión dada.

exten => 9261,1,Macro(grabarfile,SIP/trantor)

El macro en ejecución.

    -- Executing [9261@default:1] Macro("SIP/10.9.201.252-b6909650", "grabarfile|SIP/trantor") in new stack
    -- Executing [s@macro-grabarfile:1] Set("SIP/10.9.201.252-b6909650", "calltime=20090511-163021") in new stack
    -- Executing [s@macro-grabarfile:2] Set("SIP/10.9.201.252-b6909650", "calldir=/var/spool/asterisk/monitor/8237") in new stack
    -- Executing [s@macro-grabarfile:3] System("SIP/10.9.201.252-b6909650", "/bin/mkdir -p /var/spool/asterisk/monitor/8237") in new stack
    -- Executing [s@macro-grabarfile:4] MixMonitor("SIP/10.9.201.252-b6909650", "/var/spool/asterisk/monitor/8237/20090511-163021-8237-9261.wav|av(0)V(0)") in new stack
  == Begin MixMonitor Recording SIP/10.9.201.252-b6909650
    -- Executing [s@macro-grabarfile:5] Dial("SIP/10.9.201.252-b6909650", "SIP/trantor|40") in new stack
    -- Called trantor
    -- SIP/trantor-08242458 is ringing
    -- SIP/trantor-08242458 answered SIP/10.9.201.252-b6909650
  == Spawn extension (macro-grabarfile, s, 5) exited non-zero on 'SIP/10.9.201.252-b6909650' in macro 'grabarfile'
  == Spawn extension (macro-grabarfile, s, 5) exited non-zero on 'SIP/10.9.201.252-b6909650'
  == End MixMonitor Recording SIP/10.9.201.252-b6909650

El archivo en cuestión.

asteriskpbx:/home/gabriel# ls /var/spool/asterisk/monitor/8237/*61.wav
/var/spool/asterisk/monitor/8237/20090511-163021-8237-9261.wav

Preparando el pastel (instalando cakePHP)

CakePHP es un framework para PHP basandose en el modelo MVC (modelo vista controlador).
En primera instancia descargamos los paquetes necesarios junto con las dependencias necesarias.

gabriel@trantor:~$ sudo aptitude install apache2 mysql-server php5 php5-mysql

Para tener un poco ordenado nuestros sitios en apache, vamos a crear un virtual host donde almacenaremos todos los archivos de la instalación y en donde realizaremos nuestros pruebas al teclear en un navegador web: http://www.caketest.com
Creamos los siguientes directorios.

gabriel@trantor:~$ pwd
/home/gabriel
gabriel@trantor:~$ mkdir -p www/www.caketest.com
gabriel@trantor:~$ mkdir www/www.caketest.com/htdocs
gabriel@trantor:~$ mkdir www/www.caketest.com/cgi-bin
gabriel@trantor:~$ mkdir www/www.caketest.com/logs
gabriel@trantor:~$ sudo vim /etc/apache2/sites-available/www.caketest.com

Escribimos la siguiente configuración para nuestro host virtual.


        ServerAdmin webmaster@caketest.com
        ServerName  www.caketest.com
        ServerAlias caketest.com

        # Indexes + Directory Root.
        DirectoryIndex index.html
        DocumentRoot /home/gabriel/www/www.caketest.com/htdocs/

        # CGI Directory
        ScriptAlias /cgi-bin/ /home/gabriel/www/www.caketest.com/cgi-bin/
        
                Options +ExecCGI
        

        # Logfiles
        ErrorLog  /home/gabriel/www/www.caketest.com/logs/error.log
        CustomLog /home/gabriel/www/www.caketest.com/logs/access.log combined

Activamos el nuevo sitio.

gabriel@trantor:~$ sudo a2ensite www.caketest.com
Enabling site www.caketest.com.
Run '/etc/init.d/apache2 reload' to activate new configuration!
gabriel@trantor:~$ sudo /etc/init.d/apache2 reload
Reloading web server config: apache2
gabriel@trantor:~$ sudo /etc/init.d/apache2 restart
gabriel@trantor:/etc/apache2$ ls -l sites-enabled/
total 0
lrwxrwxrwx 1 root root 26 mar 29 14:36 000-default -> ../sites-available/default
lrwxrwxrwx 1 root root 35 abr 14 09:23 www.caketest.com -> ../sites-available/www.caketest.com

Realizamos una modificación a nuestro archivo hosts.

gabriel@trantor:~$ cat /etc/hosts
127.0.0.1       localhost
127.0.1.1       trantor       www.caketest.com

Tecleamos en algún navegador la dirección http://www.caketest.com donde deberemos visualizar algo similar a un posible listado de archivos.
cake1
Desde la siguiente pagina descargamos la ultima versión estable del framework:
http://cakeforge.org/frs/download.php/713/cake_1.2.2.8120.tar.gz
Descomprimimos el archivo y copiamos todo su contenido al directorio htdocs de nuestro host virtual además de darle permisos al directorio tmp.

gabriel@trantor:~/Descargas$ tar xfz cake_1.2.2.8120.tar.gz
gabriel@trantor:~/Descargas$ cd cake_1.2.2.8120/
gabriel@trantor:~/Descargas/cake_1.2.2.8120$ cp -R * /home/gabriel/www/www.caketest.com/htdocs/
gabriel@trantor:~/Descargas/cake_1.2.2.8120$
gabriel@trantor:~/www/www.caketest.com/htdocs/app$ chmod -R 777 tmp/

Actualizando la pagina debemos ver la pagina de información de cake la cual dista de ser colorida.
cake3

Activamos mod_rewrite de apache.

gabriel@trantor:~$ sudo a2enmod rewrite
Enabling module rewrite.
Run '/etc/init.d/apache2 restart' to activate new configuration!
gabriel@trantor:~$ sudo /etc/init.d/apache2 restart

Para poder habilitar en nuestras paginas el modulo anterior realizamos unas modificaciones al archivo de configuración de nuestro sitio.

gabriel@trantor:~$ sudo vim /etc/apache2/sites-available/www.caketest.com
VirtualHost *:80>
        ServerAdmin webmaster@caketest.com
        ServerName  www.caketest.com
        ServerAlias caketest.com

        # Indexes + Directory Root.
        DirectoryIndex index.php
        DocumentRoot /home/gabriel/www/www.caketest.com/htdocs/app/webroot

        
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                Allow from all
        

        # CGI Directory
        ScriptAlias /cgi-bin/ /home/gabriel/www/www.caketest.com/cgi-bin/
        
                Options +ExecCGI
        

        # Logfiles
        ErrorLog  /home/gabriel/www/www.caketest.com/logs/error.log
        CustomLog /home/gabriel/www/www.caketest.com/logs/access.log combined

Reiniciamos nuestro servidor apache.

gabriel@trantor:~$ sudo /etc/init.d/apache2 reload

En dado caso que no se note una diferencia, se debe verificar la configuración referente a la activación de mod_rewrite ya que es la causa de los muchos errores iniciales.
cake4
Creamos nuestra base de datos a utilizar, iniciamos el servico de mysql, y nos conectamos con nuestro usuario (al instalarse mysql mediante aptitude, me pidio la clave para root).

gabriel@trantor:~$ sudo /etc/init.d/mysql start
Starting MySQL database server: mysqld.
Checking for corrupt, not cleanly closed and upgrade needing tables..
gabriel@trantor:~$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 28
Server version: 5.0.51a-24 (Debian)

Type 'help;' or 'h' for help. Type 'c' to clear the buffer.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
+--------------------+
2 rows in set (0.00 sec)

mysql> create database cake;
Query OK, 1 row affected (0.00 sec)

mysql>

Configuramos el archivo para la conexión de la base de datos a utilizar.

gabriel@trantor:~/www/www.caketest.com/htdocs/app/config$ mv database.php.default database.php
gabriel@trantor:~/www/www.caketest.com/htdocs/app/config$ vim database.php
class DATABASE_CONFIG {

	var $default = array(
		'driver' => 'mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'root',
		'password' => 'password',
		'database' => 'cake',
		'prefix' => '',
	);

Recargamos la pagina y listo tenemos nuestro cakePHP listo y funcionando.
cake5
Referencias y para leer mas:
http://www.debian-administration.org/articles/412

Asterisk con Openvox D110P y OpenR2

Finalmente encuentro algo de interés para empezar este pequeño blog. He tenido la oportunidad de que caiga a mis manos una tarjeta openvox D110P para un E1. Por lo cual hay tiempo para probar dos nuevas cosas; la tarjeta en especifico (ya que solo he trabajado con tarjetas Digium) y las librerías de openR2 (en lugar de Unicall).

Se utilizaron las siguientes versiones: asterisk-1.4.18, Zaptel-1.4.11, openr2-1.1.0 y como sistema operativo CentOS 4 (prefiero a la espiral pero en fin).

Antes que nada recomiendo leer un poco este documento que dice todo lo que hay que hacer.

Click to access openr2-guide-0.1-es.pdf

Bueno manos a la obra.

Al obtener los dispositivos de hardware con los que contamos, observamos que satisfactoriamente nuestro sistema detecta la tarjeta instalada.

[root@serverweb IPBX]# lspci
00:00.0 Host bridge: Broadcom CMIC-LE Host Bridge (GC-LE chipset) (rev 33)
00:00.1 Host bridge: Broadcom CMIC-LE Host Bridge (GC-LE chipset)
00:00.2 Host bridge: Broadcom CMIC-LE Host Bridge (GC-LE chipset)
00:08.0 Class ff00: Dell Embedded Remote Access or ERA/O
00:08.1 Class ff00: Dell Remote Access Card III
00:08.2 Class ff00: Dell Remote Access Card III: BMC/SMIC device not present
00:0e.0 VGA compatible controller: ATI Technologies Inc Rage XL (rev 27)
00:0f.0 Host bridge: Broadcom CSB5 South Bridge (rev 93)
00:0f.1 IDE interface: Broadcom CSB5 IDE Controller (rev 93)
00:0f.2 USB Controller: Broadcom OSB4/CSB5 OHCI USB Controller (rev 05)
00:0f.3 ISA bridge: Broadcom CSB5 LPC bridge
00:10.0 Host bridge: Broadcom CIOB-E I/O Bridge with Gigabit Ethernet (rev 12)
00:10.2 Host bridge: Broadcom CIOB-E I/O Bridge with Gigabit Ethernet (rev 12)
00:11.0 Host bridge: Broadcom CIOB-X2 PCI-X I/O Bridge (rev 05)
00:11.2 Host bridge: Broadcom CIOB-X2 PCI-X I/O Bridge (rev 05)
01:04.0 Network controller: Tiger Jet Network Inc. Tiger3XX Modem/ISDN interface
02:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5704 Gigabit Ethernet (rev 02)
02:00.1 Ethernet controller: Broadcom Corporation NetXtreme BCM5704 Gigabit Ethernet (rev 02)
04:03.0 RAID bus controller: Dell PowerEdge Expandable RAID controller 4/Di (rev 02)

Descargamos e instalamos zaptel.

[root@serverweb IPBX]# wget http://downloads.digium.com/pub/zaptel/releases/zaptel-1.4.11.tar.gz
[root@serverweb IPBX]# tar xzf zaptel-1.4.11.tar.gz
[root@serverweb IPBX]# cd zaptel-1.4.11
[root@serverweb zaptel-1.4.11]# ./configure
[root@serverweb zaptel-1.4.11]# make
[root@serverweb zaptel-1.4.11]# make install
[root@serverweb zaptel-1.4.11]# make config
install -D zaptel.init /etc/rc.d/init.d/zaptel
/usr/bin/install -c -D -m 644 zaptel.sysconfig /etc/sysconfig/zaptel
install -D ifup-hdlc /etc/sysconfig/network-scripts/ifup-hdlc
/sbin/chkconfig --add zaptel
Zaptel has been configured.

If you have any zaptel hardware it is now recommended to
edit /etc/default/zaptel or /etc/sysconfig/zaptel and set there an
optimal value for the variable MODULES .

I think that the zaptel hardware you have on your system is:
pci:0000:01:04.0     wcte11xp-    e159:0001 Digium Wildcard TE110P T1/E1 Board

Al final de la instalación se nos menciona el modelo de la tarjeta con la que contamos, en este caso se nos presenta un modelo de Digium (aunque obviamente sabemos que es una openvox).

Configuramos nuestro archivo con los parametros necesarios.

[root@serverweb zaptel-1.4.11]# vim /etc/zaptel.conf

# MFC/R2 requires CAS signaling
# channel 16 is required to transmit ABCD bits so is not used for voice
span=1,1,0,cas,hdb3
cas=1-15:1101
dchan=16
cas=17-31:1101

loadzone=us
defaultzone=us

Iniciamos el servicio de zaptel para cargar los módulos (también lo podemos hacer manualmente).

[root@serverweb zaptel-1.4.11]# service zaptel start
Loading zaptel framework:                                  [  OK  ]
Waiting for zap to come online...OK
Loading zaptel hardware modules: tor2.
 wct4xxp.
 wcte12xp.
 wct1xxp.
 wcte11xp.
 wctdm24xxp.
 wcfxo.
 wctdm.
 wcusb.
Running ztcfg:                                             [  OK  ]

Esta en rojo ya que aun no se ha conectado el enlace.

[root@serverweb zaptel-1.4.11]# cat /proc/zaptel/1
Span 1: WCT1/0 "Digium Wildcard TE110P T1/E1 Card 0" (MASTER) HDB3/ RED

           1 WCT1/0/1 CAS RED
           2 WCT1/0/2 CAS RED
           3 WCT1/0/3 CAS RED
           4 WCT1/0/4 CAS RED
           5 WCT1/0/5 CAS RED
           6 WCT1/0/6 CAS RED
           7 WCT1/0/7 CAS RED
           8 WCT1/0/8 CAS RED
           9 WCT1/0/9 CAS RED
          10 WCT1/0/10 CAS RED
          11 WCT1/0/11 CAS RED
          12 WCT1/0/12 CAS RED
          13 WCT1/0/13 CAS RED
          14 WCT1/0/14 CAS RED
          15 WCT1/0/15 CAS RED
          16 WCT1/0/16 HDLCFCS RED
          17 WCT1/0/17 CAS RED
          18 WCT1/0/18 CAS RED
          19 WCT1/0/19 CAS RED
          20 WCT1/0/20 CAS RED
          21 WCT1/0/21 CAS RED
          22 WCT1/0/22 CAS RED
          23 WCT1/0/23 CAS RED
          24 WCT1/0/24 CAS RED
          25 WCT1/0/25 CAS RED
          26 WCT1/0/26 CAS RED
          27 WCT1/0/27 CAS RED
          28 WCT1/0/28 CAS RED
          29 WCT1/0/29 CAS RED
          30 WCT1/0/30 CAS RED
          31 WCT1/0/31 CAS RED

Aunque al iniciar los módulos ya se cargo el archivo de configuración lo volvemos a cargar, para obtener un mensaje mas descriptivo.

[root@serverweb zaptel-1.4.11]# ztcfg -v

Zaptel Version: 1.4.11
Echo Canceller: MG2
Configuration
======================

SPAN 1: CAS/HDB3 Build-out: 0 db (CSU)/0-133 feet (DSX-1)

31 channels to configure.

Descargamos e instalamos las librerías de openr2.

[root@serverweb IPBX]# wget http://openr2.googlecode.com/files/openr2-1.1.0.tar.gz
[root@serverweb IPBX]# tar xfz openr2-1.1.0.tar.gz
[root@serverweb IPBX]# cd openr2-1.1.0
[root@serverweb openr2-1.1.0]# ./configure --prefix=/usr
[root@serverweb openr2-1.1.0]# make
[root@serverweb openr2-1.1.0]# make install

Descargamos e instalamos asterisk.

[root@serverweb IPBX]# wget http://downloads.digium.com/pub/asterisk/releases/asterisk-1.4.18.tar.gz
[root@serverweb IPBX]# wget http://openr2.googlecode.com/files/openr2-asterisk-1.4.18.patch
[root@serverweb IPBX]# tar xfz asterisk-1.4.18.tar.gz
[root@serverweb IPBX]# cd asterisk-1.4.18
[root@serverweb asterisk-1.4.18]# patch -p0 < ../openr2-asterisk-1.4.18.patch
[root@serverweb asterisk-1.4.18]# ./bootstrap.sh
[root@serverweb asterisk-1.4.18]# ./configure --prefix=/usr
[root@serverweb asterisk-1.4.18]# make
[root@serverweb asterisk-1.4.18]# make install
[root@serverweb asterisk-1.4.18]# make samples
[root@serverweb asterisk-1.4.18]# make config

Aqui es importante resaltar algo que ya menciona el autor de la guia original, la version de autoconf es muy importante, en este caso debe ser la 2.60, ya que menciona que puede o no funcionar, y esto es cierto verifica que version tienes ya que en mi caso tuve que actualizar mi versión de autoconf.

Si la instalación no marca algun incoveniente, entonces asterisk se instalo con el soporte de MFC/R2 usando openr2. Para comprobar que chan_zap.so tiene integrado openr2, ejecutamos el siguiente comando.

[root@serverweb asterisk-1.4.18]# ldd channels/chan_zap.so | grep openr2
        libopenr2.so.1 => /usr/lib/libopenr2.so.1 (0x00e16000)

Iniciamos el servicio de asterisk

[root@serverweb asterisk-1.4.18]# service asterisk start
[root@serverweb asterisk-1.4.18]# asterisk -r

Nos registramos con un softphone (Zoiper) para autentificarnos y poder realizar llamadas.

zoiper2

Realizamos una llamada a una pizzeria muy famosa (aunque no tan buenas las pizzas).

consola01

Realizamos una llamada para dirigirla a una de nuestras extensiones por medio de uno de nuestros DNIS.

consola03