Telefonia con opensource – en Guatemala
Desde hace ya bastante tiempo que no hago un post personalizado y con dedicatoria, claro este pues sera uno de esos…. a decir verdad no me considero un master en la materia de telecomunicaciones puesto que según mi filosofía nunca llegamos a conocer el 100% de un tema porque siempre esta en evolución, siempre he sido un adicto a el opensource a resolver mis inquietudes con software no privativo aunque en algunas ocasiones esto provoque algunos roses idealistas.
Este post nace por un spam que he recibido el día de hoy en donde me ofrecen una certificación sobre uno de los front-end de moda para administrar asterisk. En ningun momento digo que eso este mal pero que hay en conocer quien realmente hace el trabajo de telefonia en esos front-ends ?? a caso tambien van a enseñarlos sobre asterisk? como siempre he dicho es muy facil instalar con click tras click cada una de estas aplicaciones, pero que pasara cuando …:
- El apache falle y no puedan ver el administrador?
- El mysql deje de guardar los cambios?
- La base de datos se corrompa?
- Cuando pierda el password del administrador web
- Cuando los controladores de la tarjeta FXO/FSX no funcionen?
- Cuando los controladores de la tarjeta E1 no esten en la version indicada
- Necesiten compilar desde codigo fuente algun parche/controlador/
- Necesiten Debugiar Asterisk para encontrar la falla?
- Se necesite saber que nos manda el PSTN a nuestra planta? o viceversa
- Cuando necesitemos programar AGIs ?
- Cuando nos cambien el color de la administracion ?
- Cuando necesitemos interactuar con bases de datos?
Este curso tambien cubrira eso? si es asi mis felicitaciones …. yo donde me apunto?.
Estemos realmente preparados para ofrecer un curso (s) o mejor dicho para ofrecer darte un grado de ingeniero en Asterisk (ala Tortrix) ?
Creo que mas practico seria ayudar al estudiante a conocer todos estos aspectos del que verdaderamente hacer la magia tras bambalinas, el dueño del circo de pulgas, el domador del leon, ese que se pasa el dia realmente trabajando y no dando la carita bonida en el front-desk… ASTERISK!
Como dije al iniciar esto realmente en estos tiempos difíciles para todos, nuestro dinero tiene que ser realmente valorado e invertido en algo que si nos redituara al máximo. Nada de lo anterior significa que trixbox, Goautodial, Vicidial, AsteriskNOW!, Elastix, FreePBX, sean malos claro que no, pero que pasara cuando nos cambien el color, las posiciones de los clicks, o la distribución de linux? también para eso tendremos que tomar un curso? de 1000 USD! ??
Asterisk es el corazón de todos estos lindos nombrecitos y es a el que se le debe todo esto, independientemente de como o porque esta funcionando.
Esto es solo la humilde opinion de este, su servidor pero la ultima palabra la tienen ustedes.
Debugging Asterisk
Una de las tecnicas mas importantes de aprender, tanto cuando se inicia con Asterisk como cuando ya se es un Guru
es saber extraer informacion y comprenderla, en el momento de un problema.
He escuchado a muchas personas hablar sobre el tema “tan escabroso” como tomar “trazas” en asterisk. Pero bueno muy humildemente les compartire los pasos que a mi me man funcionado de maravilla.
Prerequisito INDISPENSABLE:
Asterisk 1.4.30 en adelante.
Puede funcionar con versiones anteriores pero no garantizo la exactitud de la info a extraer.
Primero
Vamos a editar el archivo logger.conf que se encuentra el /etc/asterisk para activar el tomar trazados de la actividad. Tenemos que agregar la siguiente linea, con la palabra: “miDebugLog” esto pueden cambiarlo por cualquier otra cosa que quieran, este va a ser el nombre del archivo en donde se guardara la informacion . Un buen ejemplo podria ser : Problema_12345_full.log
logger.conf [logfiles] miDebugLog => notice,warning,error,debug,verbose,dtmf
Desde la linea de comando de Asterisk vamos a reiniciar el modulo del logger:
*CLI> core set verbose 15 *CLI> core set debug 15 *CLI> module reload logger
Si por algun motivo este archivo ya habia sido utilizado anteriormente para algun otro problema, pues lo mejor sera que se roten los logs:
*CLI> logger rotate
Dependiendo de el problema que tengan asegurese de activar el trazado en el canal correcto, puede ser SIP, IAX, IAX2.
Vamos a activar para SIP: Asterisk 1.4 y 1.6
*CLI> sip set debug on *CLI> sip set debug
Activar para IAX2: Asterisk 1.4 y 1.6
*CLI> iax2 set debug on *CLI> iax2 set debug
Luego de esto vamos a tratar de reproducir el problema….
Una vez que terminemos de tomar los datos que necesitamos recordemos de desactivar todo, para no toparnos con sorpresas mas adelante.
*CLI> core set verbose 0 *CLI> core set debug 0 *CLI> sip set debug off *CLI> iax2 set debug off
Ahora nuestro archivo con la data la podremos encontrar en /var/log/asterisk/miDebugLog.
Recordemos tambien desactivar el logger.conf comentando o borrando la linea que agregamos.
logger.conf [logfiles] ;miDebugLog => notice,warning,error,debug,verbose,dtmf
Ahora reiniciemos el logger como lo hicimos anteriormente
*CLI> module reload logger
Goautodial – UPGRADE Asterisk y Dahdi
Para iniciar nuestra mini guia de como actualizar la paqueteria de Asterisk y de Dahdi sobre Goautodial (a.k.a Vicidialnow) vamos a darle una revisada de lo que trae “Out of the box”.
- Vicidial 2.2.1
- Asterisk 1.4.27.1-vici
- Dahdi 2.3
- Sangoma 3.5.14
Bueno ahora vamos a ver hasta que versión podemos subir para nuestra actualización de sistema: (yo estoy utilizando una Sangoma A104d QUAD T1/E1)
asterisk-1.4.39.1
dahdi-linux-complete-2.4.0+2.4.0
wanpipe-3.5.18 (sangoma)
como es acostumbrado vamos a sacar un backup de nuestros archivos de configuracion (asumiendo que tenemos ya un sistema en funcionamiento), recordemos que casi todo lo importante esta en /etc/asterisk, pero no olvidemos que /etc/dahdi tenemos algunos archivos importantes.
ahora bien vamos a proceso de remover la paqueteria a ser actualizada:
hacemos la busqueda de versiones de asterisk rpm -aq | grep asterisk
removamos unicamente los siguientes paquetes: rpm -e asterisk-devel-[version].vnow rpm -e asterisk-[version].vnow --nodeps (reemplacemos "version" por la versión que nuestro sistema tenga)
ahora.... vamos a la busqueda de la versiones de dadhi instaladas rpm -aq | grep dahdi
con dahdi tendremos un listado mas amplio de paquetes que podran ser lo siguientes, y digo podran porque pueden cambiar talvez la version.
- dahdi-tools-doc-2.2.1-goautodial
- dahdi-linux-2.3.0.1-goautodial
- dahdi-tools-2.2.1-goautodial
- dahdi-linux-devel-2.3.0.1-goautodial
- kmod-dahdi-PAE-2.3.0.1-1.el5.elrepo
vamos a removerlos todos para poder colocar la nueva paqueteria, esto lo hare compilando todo desde fuente, para esto necesitamos instalarle al Centos los paquetes necesarios:
yum groupinstall 'Development Tools'
Esta parte de proceso me gusta porque instalado el grupo de herramientas el yum nos coloca todo lo necesario para nuestra compilacion futura.
Ahora a descargar los nuevos paquetes (hoy dia son los mas actuales, segun la fecha podria variar la version) vamos a descargarlos en (/usr/src) por motivos practicos
wget http://downloads.asterisk.org/pub/telephony/dahdi-tools/releases/dahdi-tools-2.4.0.tar.gz wget http://downloads.asterisk.org/pub/telephony/dahdi-linux/releases/dahdi-linux-2.4.0.tar.gz wget http://downloads.asterisk.org/pub/telephony/libpri/libpri-1.4-current.tar.gz wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-1.4.39.1.tar.gz
Instalacion de Dahdi
tar xvfz dahdi-linux-<version> tar xvfz dahdi-tools-<version> ln -s dahdi-linux-<version> dahdi cd dahdi-linux-<version> make make install cd .. cd dahdi-tools-<version> ./configure make make install
Instalacion de LibPRI
tar xvfz libpri-<version> cd libpri-<version> make make install
como estamos haciendo un upgrade de asterisk lo mas sano es mover algunos modulos
cd /usr/lib/asterisk mv modules modules.old
Instalacion de Asterisk:
tar xvfz asterisk-<version>.tgz cd asterisk-<version> ./configure make make install
Ahora hay que comprobar el funcionamiento de nuestra tarjeta y nuestras configuraciones que hasta este momento no fueron tocadas, pero si por algun error o problema estos fueron modificadas las copiaremos del resplado que hicimos al iniciar esta guía.
Al finalizar esto tenemos ya nuestro sistema terminado, claro en mi caso que tengo una tarjeta Sangoma necesito instalar los controladores, pero eso no lo tocaremos en este post, si de lo contrario la tarjeta a utilizar fuera digium, con esto bastaria para tener nuestra actualizacion terminada.
NOTA: al remover el paquete de asterisk que goautodial tiene por default el script de inicio tambien se remueve para solucionar esto, vamos a la carpeta de el codigo fuente de asterisk que recien compilamos
../../asterisk-1.4.39.1/contrib/init.d
y ahi encontraremos el script para redhat “rc.redhat.asterisk”, lo copiamos a /etc/init.d/ bajo el nombre de asterisk y listo.
iptables para asterisk
codigo simple para tener nuestro firewall local en un servidor con asterisk, no lo hice yo pero funciona de maravilla
#!/bin/bash EXIF="eth0" # Clear any existing firewall stuff before we start /sbin/iptables --flush # As the default policies, drop all incoming traffic but allow all # outgoing traffic. This will allow us to make outgoing connections # from any port, but will only allow incoming connections on the ports # specified below. /sbin/iptables --policy INPUT DROP /sbin/iptables --policy OUTPUT ACCEPT # Allow all incoming traffic if it is coming from the local loopback device /sbin/iptables -A INPUT -i lo -j ACCEPT # Accept all incoming traffic associated with an established connection, or a "related" connection /sbin/iptables -A INPUT -i $EXIF -m state --state ESTABLISHED,RELATED -j ACCEPT # Check new packets are SYN packets for syn-flood protection /sbin/iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP # Drop fragmented packets /sbin/iptables -A INPUT -f -j DROP # Drop malformed XMAS packets /sbin/iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP # Drop null packets /sbin/iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP # Allow connections to port 22 - ssh. You can add other ports you need in here /sbin/iptables -A INPUT -p tcp -i $EXIF --dport 22 -m state --state NEW -j ACCEPT # Allow connections from my machines /sbin/iptables -A INPUT -p tcp -i $EXIF -m state --state NEW -s 100.101.5.182 -j ACCEPT /sbin/iptables -A INPUT -p tcp -i $EXIF -m state --state NEW -s 200.123.88.196 -j ACCEPT # Allow SIP connections /sbin/iptables -A INPUT -p udp -i $EXIF --dport 5060 -m udp -j ACCEPT /sbin/iptables -A INPUT -p tcp -i $EXIF --dport 5060 -m tcp -j ACCEPT /sbin/iptables -A INPUT -p udp -i $EXIF --dport 10000:20000 -m udp -j ACCEPT # Allow icmp input so that people can ping us /sbin/iptables -A INPUT -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT # Log then drop any packets that are not allowed. You will probably want to turn off the logging #/sbin/iptables -A INPUT -j LOG /sbin/iptables -A INPUT -j REJECT
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 ??
#> uname -r
2.6.18-164.11.1.el5
2) Version de Asterisk ??
#> asterisk -V
Asterisk 1.6.0.22
3) Version de dahdi/zaptel ??
Para Dahdi
#> dahdi_cfg -vvv
DAHDI Tools Version - 2.2.0
DAHDI Version: 2.2.0
Para Zaptel
#> ztcfg -vvv
Zaptel Version: 1.4.12.9.svn.r4590-Xorcom-trunk-r7049
Para la descarga de los RPMs necesarios tan solo utilizaremos el comando “wget X” donde X representa la URL del rpm
Ej:
wget -c ftp://ftp.sangoma.com/linux/custom/shaunt/Trixbox%202.8.0.4/Stock/wanpipe-util-3.5.11.8-0.i686.rpm
Ahora la instalacion :
#> rpm -i wanpipe-modules-2.6.18-128.1.1.el5-3.5.11-0.i686.rpm
#> rpm -i wanpipe-util-3.5.11-0.i686.rpm
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)
----------------------------------------- | Wanpipe Hardware Probe Info (verbose) | ----------------------------------------- 1 . AFT-A200-SH : SLOT=4 : BUS=5 : IRQ=169 : CPU=A : PORT=PRI : HWEC=32 : V=12 +01:FXO: PCIe: PLX1 +02:FXO: PCIe: PLX1 +03:FXS: PCIe: PLX1 +04:FXS: PCIe: PLX1
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.
rpm -e zaptel-modules-1.2.27-2.2.6.18_164.el5.vnow rpm -e zaptel-devel-1.2.27-1 rpm -e zaptel-1.2.27-1 --nodeps rpm -e asterisk-devel-1.2.30.2-2.vnow rpm -e asterisk-1.2.30.2-2.vnow --nodeps
.
mkdir /usr/src/asterisk-1.4 cd /usr/src/asterisk-1.4 wget http://downloads.asterisk.org/pub/telephony/asterisk/old-releases/asterisk-1.4.21.2.tar.gz wget http://downloads.asterisk.org/pub/telephony/zaptel/zaptel-1.4.12.1.tar.gz wget http://downloads.asterisk.org/pub/telephony/libpri/libpri-1.4.11.3.tar.gz tar xzf asterisk-1.4.21.2.tar.gz tar xzf zaptel-1.4.12.1.tar.gz tar xzf libpri-1.4.11.3.tar.gz
Ahora compilaremos los mas facil libpri y zaptel
cd libpri-1.4.11.3 make clean; make; make install cd ../zaptel-1.4.12.1 ./configure; make clean; make; make install
Ahora si el core de todo Asterisk 1.4
cd ../asterisk-1.4.21.2 wget http://www.eflo.net/files/enter.h wget http://www.eflo.net/files/leave.h mv -f enter.h apps/enter.h mv -f leave.h apps/leave.h wget http://download.vicidial.com/asterisk-patches/1.4-gsm-gcc4.2.patch patch -p1 ./codecs/gsm/Makefile 1.4-gsm-gcc4.2.patch wget http://download.vicidial.com/conf/res_agi_defunct.patch patch -p1 < res_agi_defunct.patch File to patch: res/res_agi.c cd apps/ rm -f app_waitforsilence.c wget http://download.vicidial.com/conf/app_waitforsilence.c cd ../channels/ rm chan_sip.c wget http://download.vicidial.com/conf/chan_sip.c cd ../ ./configure; make clean; make; make install
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
[root@srv-pbx asterisk]# pwd /etc/asterisk [root@srv-pbx asterisk]# ls -lha logger.conf -rw-r--r-- 1 root root 144 Sep 9 11:23 logger.conf
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
[root@srv-pbx asterisk]# cat logger.conf [logfiles] debug => debug console => notice,warning,error messages => notice,warning,error,debug,verbose full => notice,warning,error,verbose
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”
srv-pbx*CLI> set verbose 0 Verbosity is now OFF
Seguido esto podemos iniciar a tomar trazas de nuestra actividad IAX2
srv-pbx*CLI> iax2 set debug IAX2 Debugging Enabled
De esto podremos obtener un poco de información que esta relacionada con nuestro trafico/registro/identificación
Rx-Frame Retry[ No] -- OSeqno: 000 ISeqno: 000 Type: IAX Subclass: POKE Timestamp: 00017ms SCall: 03132 DCall: 00000 [172.20.1.141:4569] Rx-Frame Retry[ No] -- OSeqno: 000 ISeqno: 001 Type: IAX Subclass: ACK Timestamp: 00023ms SCall: 03132 DCall: 00001 [172.20.1.141:4569] Tx-Frame Retry[000] -- OSeqno: 000 ISeqno: 000 Type: IAX Subclass: POKE Timestamp: 00004ms SCall: 11911 DCall: 00000 [127.0.0.1:39767] Tx-Frame Retry[000] -- OSeqno: 000 ISeqno: 000 Type: IAX Subclass: POKE Timestamp: 00004ms SCall: 07223 DCall: 00000 [172.20.1.169:4569] Tx-Frame Retry[000] -- OSeqno: 000 ISeqno: 000 Type: IAX Subclass: POKE Timestamp: 00004ms SCall: 13976 DCall: 00000 [127.0.0.1:40726] Tx-Frame Retry[000] -- OSeqno: 000 ISeqno: 000 Type: IAX Subclass: POKE Rx-Frame Retry[ No] -- OSeqno: 000 ISeqno: 000 Type: IAX Subclass: POKE Rx-Frame Retry[ No] -- OSeqno: 000 ISeqno: 000 Type: IAX Subclass: POKE Timestamp: 00004ms SCall: 07951 DCall: 00000 [172.20.1.141:4569] Timestamp: 00004ms SCall: 13976 DCall: 00000 [127.0.0.1:40569]
si esta información no bastara vamos a bajar un poco mas de nivel utilizando tcpdump tanto en el puerto como protocolo
tcpdump -w trace.cap -p -n -s 0 "udp" tcpdump -w trace.cap -p -n -s 0 port 4569
* -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:
Master.csv => "${CDR(clid)}","${CDR(src)}","${CDR(dst)}","${CDR(dcontext)}",
"${CDR(channel)}","${CDR(dstchannel)}","${CDR(lastapp)}",
"${CDR(lastdata)}","${CDR(start)}","${CDR(answer)}","${CDR(end)}",
"${CDR(duration)}","${CDR(billsec)}","${CDR(disposition)}",
"${CDR(amaflags)}",
"${CDR(accountcode)}","${CDR(uniqueid)}","${CDR(userfield)}"
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.
<?php
/*** process asterisk cdr file (Master.csv) insert usage
* values into a mysql database which is created for use
* with the Asterisk_addons cdr_addon_mysql.so
* The script will only insert NEW records so it is safe
* to run on the same log over-and-over.
*
* Author: John Lange (john@johnlange.ca)
* Date: Version 2 Released July 8, 2008
*
*
* Here is what the script does:
*
* Parse each row from the text log and insert it into the database after testing for a
* matching "calldate, src, duration" record in the database. Note that not all fields are
* tested.
*
* If you have a large existing database it is recomended that you add an index to the calldate
* field which will greatly speed up this import.
*
*/
/*
* Modified by Leif Madsen, July 29, 2009 to add additional columns.
* Original post and code by John Lange: http://www.johnlange.ca/tech-tips/asterisk/asterisk-cdr-csv-mysql-import-v20/
*/
/*
* Modified by Paulo Alvarado, Nov. 09 2009 to run with the custom master.cvs from vicidial now
* Original post and code by John Lange: http://www.johnlange.ca/tech-tips/asterisk/asterisk-cdr-csv-mysql-import-v20/
*/
$locale_db_host = 'localhost';
$locale_db_name = 'asterisk';
$locale_db_login = 'root';
$locale_db_pass = 'vicidialnow';
if($argc == 2) {
$logfile = $argv[1];
} else {
print("Usage ".$argv[0]." <filename>\n");
print("Where filename is the path to the Asterisk csv file to import (Master.csv)\n");
print("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");
exit(0);
}
// connect to db
$linkmb = mysql_connect($locale_db_host, $locale_db_login, $locale_db_pass) or die("Could not connect : " . mysql_error());
mysql_select_db($locale_db_name, $linkmb) or die("Could not select database $locale_db_name");
//** 1) Find records in the asterisk log file. **
$rows = 0;
$handle = fopen($logfile, "r");
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
// 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
list($clid, $src, $dst, $dcontext, $channel, $dstchannel, $lastapp, $lastdata, $start, $answer, $end, $duration, $billsec, $disposition, $amaflag, $accountcode,$uniqueid, $userfield ) = $data;
/** 2) Test to see if the entry is unique **/
$sql="SELECT calldate, src, duration".
" FROM cdr".
" WHERE calldate='$end'".
" AND src='$src'".
" AND duration='$duration'".
" LIMIT 1";
if(!($result = mysql_query($sql, $linkmb))) {
print("Invalid query: " . mysql_error()."\n");
print("SQL: $sql\n");
die();
}
if(mysql_num_rows($result) == 0) { // we found a new record so add it to the DB
// 3) insert each row in the database
$sql = "INSERT INTO cdr (calldate, answerdate, hangupdate, clid, src, dst, dcontext, channel, dstchannel, lastapp, lastdata, duration, billsec, disposition, amaflag, accountcode, uniqueid, userfield)
VALUES('$start', '$answer', '$end', '$clid', '$src', '$dst', '$dcontext', '$channel', '$dstchannel','$lastapp', '$lastdata', '$duration', '$billsec', '$disposition', '$amaflag', '$accountcode', '$uniqueid', '$userfield')";
if(!($result2 = mysql_query($sql, $linkmb))) {
print("Invalid query: " . mysql_error()."\n");
print("SQL: $sql\n");
die();
}
print("Inserted: $end $src $duration\n");
$rows++;
} else {
print("Not unique: $end $src $duration\n");
}
}
fclose($handle);
print("$rows imported\n");
?>
ahora la parte mas dificil, como ejecutarlo:
php import.php Master.csv
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.