asterisk

Configurar tarjetas Sangoma en trixbox (generico)

En un post anterior hablamos sobre wanpipe-para-sangoma-en-trixbox para poner a punto los controladores de estas tarjetas tanto en trixbox como en cualquier redhat, centos y derivados. Ahora vamos a aprender como darle los ultimos toques para iniciar las labores con asterisk/sangoma:

vamos a configurar:

1. Creemos los archivos de configuracion de Wanpipe/DAHDI:

<br />
      #&gt; Setup-Sangoma<br />
          (Note -&gt; Si ya creaste manualmente los archivos de configuracion pasamos al paso 2)<br />
           Este proceso creara los archivos:<br />
           - La configuracion de Dahdi<br />
           - La configuracion de wanpipe en /etc/wanpipe<br />
           - Creara los archivos de configuracion para SMG y Woomera<br />
           - Creara ademas los archivos de configuracion wanpipe en /etc/wanpipe<br />

2. Iniciamos el Wanpipe

<br />
      #&gt; wanrouter start<br />
            - Con esto iniciaremos todos los puertos de wanpipe<br />
            - Si existiera algun error podemos revisar /var/log/messages para mas informacion<br />

3. Configuraremos el modulo de DAHDI/ZAPTEL

<br />
      #&gt; dahdi_cfg -vvv<br />
            - DAHDI modulo del kernel que esta identificado en /etc/dahdi/system.conf<br />
            --o tambien--<br />
      #&gt; ztcfg -vvv<br />
           - ZAPTEL modulo del kernel que esta identificado en /etc/zaptel.conf<br />

4. Start Asterisk
#> asterisk

Wanpipe, para Sangoma en trixbox

Lo que necesitamos saber primero y basados en la matris de instalacion es si nuestras versiones de software son las correctas y claro si las tenemos en nuestro Linux/Trixbox

Definamos con encontrar las versiones que tenemos instaladas (Asterisk, Dahdi/Zaptel) ademas del kernel que estamos usando:

1) version del kernel ??

<br />
        #&gt; uname -r<br />
             2.6.18-164.11.1.el5<br />

2) Version de Asterisk ??

<br />
        #&gt; asterisk -V<br />
            Asterisk 1.6.0.22<br />

3) Version de dahdi/zaptel ??
Para Dahdi

<br />
       #&gt; dahdi_cfg -vvv<br />
           DAHDI Tools Version - 2.2.0<br />
           DAHDI Version: 2.2.0<br />

Para Zaptel
<br />
       #&gt; ztcfg -vvv<br />
           Zaptel Version: 1.4.12.9.svn.r4590-Xorcom-trunk-r7049<br />

Para la descarga de los RPMs necesarios tan solo utilizaremos el comando “wget X” donde X representa la URL del rpm
Ej:

<br />
wget -c ftp://ftp.sangoma.com/linux/custom/shaunt/Trixbox%202.8.0.4/Stock/wanpipe-util-3.5.11.8-0.i686.rpm<br />

Ahora la instalacion :

<br />
         #&gt; rpm -i wanpipe-modules-2.6.18-128.1.1.el5-3.5.11-0.i686.rpm<br />
         #&gt; rpm -i wanpipe-util-3.5.11-0.i686.rpm<br />

Para verificar que todo esta bien instalado podemos utilizar:

        #> wanrouter hwprobe verbose 

Tendriamos que obtener algo asi: (los resultados pueden variar dependiendo de la tarjeta que tengamos)

<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
| Wanpipe Hardware Probe Info (verbose) |<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
1 . AFT-A200-SH : SLOT=4 : BUS=5 : IRQ=169 : CPU=A : PORT=PRI : HWEC=32 : V=12<br />
+01:FXO: PCIe: PLX1<br />
+02:FXO: PCIe: PLX1<br />
+03:FXS: PCIe: PLX1<br />
+04:FXS: PCIe: PLX1</p>
<p>

Link | Descargar los RPM

UPGRADE VicidialNOW 1.3 a asterisk 1.4

Algo que me ha traido con bastante curiosidad desde hace un par de dias, es como actualizar el asterisk que contiene la distro VicidialNOW, un dialer para Contact Center bastante recomendable.

ahora bien vamos a los que nos trae a este post, actualizar este asterisk bastante viejo 1.2 a la version mas decente 1.4.

<br />
rpm -e zaptel-modules-1.2.27-2.2.6.18_164.el5.vnow<br />
rpm -e zaptel-devel-1.2.27-1<br />
rpm -e zaptel-1.2.27-1 --nodeps<br />
rpm -e asterisk-devel-1.2.30.2-2.vnow<br />
rpm -e asterisk-1.2.30.2-2.vnow --nodeps<br />

.
<br />
mkdir /usr/src/asterisk-1.4<br />
cd /usr/src/asterisk-1.4<br />
wget http://downloads.asterisk.org/pub/telephony/asterisk/old-releases/asterisk-1.4.21.2.tar.gz<br />
wget http://downloads.asterisk.org/pub/telephony/zaptel/zaptel-1.4.12.1.tar.gz<br />
wget http://downloads.asterisk.org/pub/telephony/libpri/libpri-1.4.11.3.tar.gz<br />
tar xzf asterisk-1.4.21.2.tar.gz<br />
tar xzf zaptel-1.4.12.1.tar.gz<br />
tar xzf libpri-1.4.11.3.tar.gz<br />

Ahora compilaremos los mas facil libpri y zaptel

<br />
cd libpri-1.4.11.3<br />
make clean; make; make install<br />
cd ../zaptel-1.4.12.1<br />
./configure; make clean; make; make install<br />

Ahora si el core de todo Asterisk 1.4

<br />
cd ../asterisk-1.4.21.2<br />
wget http://www.eflo.net/files/enter.h<br />
wget http://www.eflo.net/files/leave.h<br />
mv -f enter.h apps/enter.h<br />
mv -f leave.h apps/leave.h<br />
wget http://download.vicidial.com/asterisk-patches/1.4-gsm-gcc4.2.patch<br />
patch -p1 ./codecs/gsm/Makefile 1.4-gsm-gcc4.2.patch<br />
wget http://download.vicidial.com/conf/res_agi_defunct.patch<br />
patch -p1 &lt; res_agi_defunct.patch<br />
File to patch: res/res_agi.c<br />
cd apps/<br />
rm -f app_waitforsilence.c<br />
wget http://download.vicidial.com/conf/app_waitforsilence.c<br />
cd ../channels/<br />
rm chan_sip.c<br />
wget http://download.vicidial.com/conf/chan_sip.c<br />
cd ../<br />
./configure; make clean; make; make install<br />

Listo ahora tenemos nuestro vicidial con Asterisk 1.4.21.2

debugging IAX en Asterisk 1.4

Debido a algunos problemas con un carrier de Voip que me provee sus enlaces via IAX2 he tenido que aprender a tomar la investigación por mi propia cuenta, en realidad voy a describir un poco las herramientas que he utilizado hasta el momento para tratar de encontrar el error.

Primero y lo mas basico vamos a habilitar los logs de asterisk a su mayor capacidad, para esto modificaremos el archivo Logger.conf

<br />
[root@srv-pbx asterisk]# pwd<br />
/etc/asterisk<br />
[root@srv-pbx asterisk]# ls -lha logger.conf<br />
-rw-r--r-- 1 root root 144 Sep  9 11:23 logger.conf<br />

En este archivo asterisk define tanto el nivel de reportes, como el nombre de los archivos generados para guardar los mismos.

  • debug
  • notice
  • warning
  • error
  • verbose
  • dtmf

Ejemplos:
debug => debug
console => notice,warning,error
messages => notice,warning,error
full => notice,warning,error,verbose
syslog.local0 => notice,warning,error

<br />
[root@srv-pbx asterisk]# cat logger.conf<br />
[logfiles]<br />
debug =&gt; debug<br />
console =&gt; notice,warning,error<br />
messages =&gt; notice,warning,error,debug,verbose<br />
full =&gt; notice,warning,error,verbose<br />

Luego de realizadas estas modificaciones desde nuestro CLI vamos a ejecutar “logger reload” para poner a funcionar los nuevos logs

para no perdernos entre tanta información que a veces asterisk despliega en su consola vamos a colocar un “mute

<br />
srv-pbx*CLI&gt; set verbose 0<br />
Verbosity is now OFF<br />

Seguido esto podemos iniciar a tomar trazas de nuestra actividad IAX2

<br />
srv-pbx*CLI&gt; iax2 set debug<br />
IAX2 Debugging Enabled<br />

De esto podremos obtener un poco de información que esta relacionada con nuestro trafico/registro/identificación

<br />
Rx-Frame Retry[ No] -- OSeqno: 000 ISeqno: 000 Type: IAX     Subclass: POKE<br />
   Timestamp: 00017ms  SCall: 03132  DCall: 00000 [172.20.1.141:4569]<br />
Rx-Frame Retry[ No] -- OSeqno: 000 ISeqno: 001 Type: IAX     Subclass: ACK<br />
   Timestamp: 00023ms  SCall: 03132  DCall: 00001 [172.20.1.141:4569]<br />
Tx-Frame Retry[000] -- OSeqno: 000 ISeqno: 000 Type: IAX     Subclass: POKE<br />
   Timestamp: 00004ms  SCall: 11911  DCall: 00000 [127.0.0.1:39767]<br />
Tx-Frame Retry[000] -- OSeqno: 000 ISeqno: 000 Type: IAX     Subclass: POKE<br />
   Timestamp: 00004ms  SCall: 07223  DCall: 00000 [172.20.1.169:4569]<br />
Tx-Frame Retry[000] -- OSeqno: 000 ISeqno: 000 Type: IAX     Subclass: POKE<br />
   Timestamp: 00004ms  SCall: 13976  DCall: 00000 [127.0.0.1:40726]<br />
Tx-Frame Retry[000] -- OSeqno: 000 ISeqno: 000 Type: IAX     Subclass: POKE<br />
Rx-Frame Retry[ No] -- OSeqno: 000 ISeqno: 000 Type: IAX     Subclass: POKE<br />
Rx-Frame Retry[ No] -- OSeqno: 000 ISeqno: 000 Type: IAX     Subclass: POKE<br />
   Timestamp: 00004ms  SCall: 07951  DCall: 00000 [172.20.1.141:4569]<br />
   Timestamp: 00004ms  SCall: 13976  DCall: 00000 [127.0.0.1:40569]<br />

si esta información no bastara vamos a bajar un poco mas de nivel utilizando tcpdump tanto en el puerto como protocolo

<br />
tcpdump -w trace.cap -p -n -s 0 &quot;udp&quot;<br />
tcpdump -w trace.cap -p -n -s 0 port 4569<br />

* -p : no iniciar en modo promiscuo y solo los paquetes de asterisk in/out seran capturados
* -n : no utilizar la resolución de DNS para evitarnos nombres innecesarios en nuestra traza
* -s 0 : aqui capturaremos todo el contenido de los paquetes tanto SIP como RTP debido a que nos interesa todo el trafico.
0 significa la información completa del frame.
* -w : con esto mandaremos a escribir la información a un archivo especifico
* 4569 es el puerto estandard en el cual se conecta asterisk via IAX2

ahora el archivo resultante lo podremos analizar mucho mejor con el Wireshark y sus plugs de telefonia

Asterisk, migracion de Master CSV a Mysql

Luego de aprender como guardar todos nuestros CDRs dentro de mysql, me ha surgido la duda de como migrar los ya existentes en el master.csv a la base de datos nueva, bueno primero explico algo de como y porque.

Por que:
Esto corriendo asterisk 1.4 y manejandolo con Vicidial (contact center app) pero este utiliza el custom_cdr.conf en donde el guardado en CVS esta definido de la siguiente forma:

<br />
Master.csv =&gt; &quot;${CDR(clid)}&quot;,&quot;${CDR(src)}&quot;,&quot;${CDR(dst)}&quot;,&quot;${CDR(dcontext)}&quot;,<br />
&quot;${CDR(channel)}&quot;,&quot;${CDR(dstchannel)}&quot;,&quot;${CDR(lastapp)}&quot;,<br />
&quot;${CDR(lastdata)}&quot;,&quot;${CDR(start)}&quot;,&quot;${CDR(answer)}&quot;,&quot;${CDR(end)}&quot;,<br />
&quot;${CDR(duration)}&quot;,&quot;${CDR(billsec)}&quot;,&quot;${CDR(disposition)}&quot;,<br />
&quot;${CDR(amaflags)}&quot;,<br />
&quot;${CDR(accountcode)}&quot;,&quot;${CDR(uniqueid)}&quot;,&quot;${CDR(userfield)}&quot;<br />

Que significa esto ?? http://www.voip-info.org/wiki/view/Asterisk+billing

ahora bien he encontrado algunos scripts que dicen ser la herramienta mas util para este tipo de migracion lo cual luego de probarlos ha resultado falso!! jejeje

aqui les dejo el que yo modifique y utilize para que migrara de forma transparente los datos del Master.csv con la configuracion cdr_custom de vicidial.

<br />
&lt;?php<br />
/*** process asterisk cdr file (Master.csv) insert usage<br />
* values into a mysql database which is created for use<br />
* with the Asterisk_addons cdr_addon_mysql.so<br />
* The script will only insert NEW records so it is safe<br />
* to run on the same log over-and-over.<br />
*<br />
* Author: John Lange (john@johnlange.ca)<br />
* Date: Version 2 Released July 8, 2008<br />
*<br />
*<br />
* Here is what the script does:<br />
*<br />
* Parse each row from the text log and insert it into the database after testing for a<br />
* matching &quot;calldate, src, duration&quot; record in the database. Note that not all fields are<br />
* tested.<br />
*<br />
* If you have a large existing database it is recomended that you add an index to the calldate<br />
* field which will greatly speed up this import.<br />
*<br />
*/<br />
/*<br />
 * Modified by Leif Madsen, July 29, 2009 to add additional columns.<br />
 * Original post and code by John Lange: http://www.johnlange.ca/tech-tips/asterisk/asterisk-cdr-csv-mysql-import-v20/<br />
 */<br />
/*<br />
 * Modified by Paulo Alvarado, Nov. 09 2009 to run with the custom master.cvs from vicidial now<br />
 * Original post and code by John Lange: http://www.johnlange.ca/tech-tips/asterisk/asterisk-cdr-csv-mysql-import-v20/<br />
 */<br />
$locale_db_host = &#8216;localhost&#8217;;<br />
$locale_db_name = &#8216;asterisk&#8217;;<br />
$locale_db_login = &#8216;root&#8217;;<br />
$locale_db_pass = &#8216;vicidialnow&#8217;;<br />
if($argc == 2) {<br />
$logfile = $argv[1];<br />
} else {<br />
print(&quot;Usage &quot;.$argv[0].&quot; &lt;filename&gt;\n&quot;);<br />
print(&quot;Where filename is the path to the Asterisk csv file to import (Master.csv)\n&quot;);<br />
print(&quot;This script is safe to run multiple times on a growing log file as it only imports records that are newer than the database\n&quot;);<br />
exit(0);<br />
}<br />
// connect to db<br />
$linkmb = mysql_connect($locale_db_host, $locale_db_login, $locale_db_pass) or die(&quot;Could not connect : &quot; . mysql_error());<br />
mysql_select_db($locale_db_name, $linkmb) or die(&quot;Could not select database $locale_db_name&quot;);<br />
//** 1) Find records in the asterisk log file. **<br />
$rows = 0;<br />
$handle = fopen($logfile, &quot;r&quot;);<br />
while (($data = fgetcsv($handle, 1000, &quot;,&quot;)) !== FALSE) {<br />
// NOTE: the fields in Master.csv can vary. This should work by default on all installations but you may have to edit the next line to match your configuration</p>
<p>list($clid, $src, $dst, $dcontext, $channel, $dstchannel, $lastapp, $lastdata, $start, $answer, $end, $duration, $billsec, $disposition, $amaflag, $accountcode,$uniqueid, $userfield ) = $data;</p>
<p>/** 2) Test to see if the entry is unique **/<br />
$sql=&quot;SELECT calldate, src, duration&quot;.<br />
&quot; FROM cdr&quot;.<br />
&quot; WHERE calldate=&#8217;$end&#8217;&quot;.<br />
&quot; AND src=&#8217;$src&#8217;&quot;.<br />
&quot; AND duration=&#8217;$duration&#8217;&quot;.<br />
&quot; LIMIT 1&quot;;<br />
if(!($result = mysql_query($sql, $linkmb))) {<br />
print(&quot;Invalid query: &quot; . mysql_error().&quot;\n&quot;);<br />
print(&quot;SQL: $sql\n&quot;);<br />
die();<br />
}<br />
if(mysql_num_rows($result) == 0) { // we found a new record so add it to the DB<br />
// 3) insert each row in the database</p>
<p>$sql = &quot;INSERT INTO cdr (calldate, answerdate, hangupdate, clid, src, dst, dcontext, channel, dstchannel, lastapp, lastdata, duration, billsec, disposition, amaflag, accountcode, uniqueid, userfield)<br />
VALUES(&#8216;$start&#8217;, &#8216;$answer&#8217;, &#8216;$end&#8217;, &#8216;$clid&#8217;, &#8216;$src&#8217;, &#8216;$dst&#8217;, &#8216;$dcontext&#8217;, &#8216;$channel&#8217;, &#8216;$dstchannel&#8217;,'$lastapp&#8217;, &#8216;$lastdata&#8217;, &#8216;$duration&#8217;, &#8216;$billsec&#8217;, &#8216;$disposition&#8217;, &#8216;$amaflag&#8217;, &#8216;$accountcode&#8217;, &#8216;$uniqueid&#8217;, &#8216;$userfield&#8217;)&quot;;</p>
<p>if(!($result2 = mysql_query($sql, $linkmb))) {<br />
print(&quot;Invalid query: &quot; . mysql_error().&quot;\n&quot;);<br />
print(&quot;SQL: $sql\n&quot;);<br />
die();<br />
}<br />
print(&quot;Inserted: $end $src $duration\n&quot;);<br />
$rows++;<br />
} else {<br />
print(&quot;Not unique: $end $src $duration\n&quot;);<br />
}<br />
}<br />
fclose($handle);<br />
print(&quot;$rows imported\n&quot;);<br />
?&gt;<br />

ahora la parte mas dificil, como ejecutarlo: :D

<br />
php import.php Master.csv<br />

Nota: si por algun motivo no funciona el comando php, eso significa que no tienen el paquete php-cli para ejecutar sentencias php en linea de comando.

Asterisk, CDR en mysql

Call Detail Records
Las centrales telefónicas generan los llamados Call Detail Records (CDR) que son archivos o logs que contienen información detallada acerca de las llamadas tanto de donde fueron originadas, terminadas o que pasa por el intercambio de las mismas. Y claro no es sorprendente que los CDR se utilizan para la facturación. Fuente: http://www.voip-info.org/wiki/view/CDR

Ahora bien Asterisk es una central telefonica en la que podemos variar  tipo de informacion y almacenamiento que este sistema va a recolectar para sus  CDRs

Asterisk puede trabajar sus CDR de las siguientes formas:

  • Csv – archivos de texto con valores separados coma
  • Cdr SQLite – logs de CDR en la base de datos de SQLite
  • Pgsql – logs de CDR en las bases de datos de PostgreSQL
  • Odbc – logs de CDR a cualquier base de datos con soporte unixODBC
  • Mysql – logs  de CDR en las bases de datos de MySQL
  • Cdr FreeTDS – logs CDR en MS SQL o a la base de datos de Sybase a través de los conductores de FreeTDS
  • Yada – logs de CDR registrados en cualquier base de datos con soporte  yada.

Pero lo que veremos por el momento es como conectar nuestro mysql para guardar los CDRs

Primero vamos a crear la tabla que guardara nuestros datos en el Mysql

<br />
CREATE DATABASE asterisk;</p>
<p>GRANT INSERT<br />
  ON asterisk.*<br />
  TO asterisk@localhost<br />
  IDENTIFIED BY &#8216;tu_clave&#8217;;</p>
<p>USE asterisk;<br />
CREATE TABLE cdr (<br />
  calldate datetime NOT NULL default &#8217;0000-00-00 00:00:00&#8242;,<br />
  clid varchar(80) NOT NULL default &#8221;,<br />
  src varchar(80) NOT NULL default &#8221;,<br />
  dst varchar(80) NOT NULL default &#8221;,<br />
  dcontext varchar(80) NOT NULL default &#8221;,<br />
  channel varchar(80) NOT NULL default &#8221;,<br />
  dstchannel varchar(80) NOT NULL default &#8221;,<br />
  lastapp varchar(80) NOT NULL default &#8221;,<br />
  lastdata varchar(80) NOT NULL default &#8221;,<br />
  duration int(11) NOT NULL default &#8217;0&#8242;,<br />
  billsec int(11) NOT NULL default &#8217;0&#8242;,<br />
  disposition varchar(45) NOT NULL default &#8221;,<br />
  amaflags int(11) NOT NULL default &#8217;0&#8242;,<br />
  accountcode varchar(20) NOT NULL default &#8221;,<br />
  uniqueid varchar(32) NOT NULL default &#8221;,<br />
  userfield varchar(255) NOT NULL default &#8221;<br />
);<br />

Segundo tenemos que contar con soporte cdr_mysql en nuestro sistema asterisk, como verificamos esto:

dentro del CLI de asterisk corremos

 show modules

…. y la salida tendria que ser algo asi
<br />
app_addon_sql_mysql.so         Simple Mysql Interface                   0<br />
cdr_addon_mysql.so             MySQL CDR Backend                        0<br />
134 modules loaded<br />

si por alguna razon no los tenemos cargados, podemos compilar los add-ons de asterisk y luego cargarlos

<br />
load app_addon_sql_mysql.so<br />
load cdr_addon_mysql.so<br />

por ultimo crearemos la conexion entre estos 2 sistemas modificaremos el archivo cdr_mysql.conf

<br />
[root@SRV-ASTERISK asterisk]# nano /etc/asterisk/cdr_mysql.conf<br />
[global]</p>
<p>hostname=127.0.0.1<br />
dbname=asterisk<br />
table=cdr<br />
password=usuario<br />
user=password<br />
port=3306<br />
;sock=/tmp/mysql.sock<br />
;userfield=1<br />

bueno luego de estos 3 pasos quedara listo nuestros CDRs en Mysql para la central telefonica Asterisk.

1 2 Scroll to top