Obteniendo un control exhaustivo de llamadas con CDR-Stats

Una de las funciones más interesantes que tiene Asterisk casi por defecto, es el hecho de guardar todo un registro completo de eventos acontecidos, todos aquellos movimientos a través del Plan de Marcación en tiempo real. Y estos eventos pueden quedar registrados de diversas formas, sea en ficheros CSV (comma separated values) formato muy común de almacenaje de datos en ficheros de texto planos, o registros en una base de datos SQL (Postgre SQL, MySQL, etc).

En mi caso, he mostrado un gran interés en registrar los eventos en una base de datos MySQL puesto que ha sido hasta la fecha, pese a ser propietaria de la todopoderosa Oracle (y porque no decirlo, Sun Microsystems me caía mejor como corporación), la que más he manejado en mi vida. Quizá algún día empiece a indagar en el mundo del elefantito Postgre, pero de momento la combinación MySQL y el gestor del gestor, valga la redundancia, phpMyAdmin, simplifica mi existencia.

Ahora, tras esta breve introducción, voy a explicar cómo combinar estos dos elementos, el registro detalle de llamadas (CDR, call detail record) con una base de datos MySQL, y poder obtener una interfaz genérica, ya preparada, y de gran utilidad para manipular estos registros de llamada: CDR-STATS (créditos a Areski Belaid por este excelente trabajo de integración)

Pues como siempre, empecemos manos a la obra.

En primer lugar, toca configurar el sistema Asterisk para que vaya almacenando de forma automática todo el registro de llamadas en la base de datos, y por ende, necesitamos la base de datos instalada en nuestro sistema. Para ello lo más sencillo, en el sistema en que nos encontramos (Ubuntu Server), es instalar LAMP (Linux + Apache + MySQL + PHP) ya que toda esta combinación nos servirá en un futuro cada una de sus partes (Apache y MySQL son requeridos por Cdr-stats y PHP por phpMyAdmin).

Existe un comando en Ubuntu Server muy sencillo que nos permitirá hacer la instalación de este sistema en cuestión de segundos: tasksel (veremos aquella pantalla que vimos en su día durante la instalación del sistema base). Ahí seleccionamos Servidor LAMP y validamos, instalándose automáticamente todo. Nos pedirá algunos detalles de instalación, como las contraseñas de acceso root a nuestra base de datos MySQL que necesitaremos para la posterior configuración.

A continuación instalamos phpMyAdmin para la gestión sencilla como comentaba antes: aptitude install phpmyadmin. Nos pedirá entre otros temas, la contraseña de administrador (root) de nuestra base de datos Mysql, se la proporcionamos. Una vez instalado, con un navegador apuntando a nuestro servidor Asterisk podemos acceder (o a la dirección donde este ubicado nuestro servidor web si lo tenemos independiente al servidor asterisk): http://servidorasterisk/phpmyadmin. Ahí podremos acceder de momento con el usuario “root” y la contraseña de administrador a nuestras bases de datos.

Ahora tenemos que empezar a diseñar la base de datos donde vamos a almacenar nuestros CDR de Asterisk.  De momento, creamos un archivo de texto que llamamos por ejemplo, dbasterisk.sql y dentro agregamos:

CREATE DATABASE asterisk;
GRANT INSERT
ON asterisk.*
TO asterisk@localhost
USE asterisk;

CREATE TABLE `cdr` (
`calldate` datetime NOT NULL default ‘0000-00-00 00:00:00’,
`clid` varchar(80) NOT NULL default ”,
`src` varchar(80) NOT NULL default ”,
`dst` varchar(80) NOT NULL default ”,
`dcontext` varchar(80) NOT NULL default ”,
`channel` varchar(80) NOT NULL default ”,
`dstchannel` varchar(80) NOT NULL default ”,
`lastapp` varchar(80) NOT NULL default ”,
`lastdata` varchar(80) NOT NULL default ”,
`duration` int(11) NOT NULL default ‘0’,
`billsec` int(11) NOT NULL default ‘0’,
`disposition` varchar(45) NOT NULL default ”,
`amaflags` int(11) NOT NULL default ‘0’,
`accountcode` varchar(20) NOT NULL default ”,
`userfield` varchar(255) NOT NULL default ”
);

ALTER TABLE `cdr` ADD `uniqueid` VARCHAR(32) NOT NULL default ”;
ALTER TABLE `cdr` ADD INDEX ( `calldate` );
ALTER TABLE `cdr` ADD INDEX ( `dst` );
ALTER TABLE `cdr` ADD INDEX ( `accountcode` );

De momento no interesa demasiado eliminar ningún campo porque si no luego podremos tener problemas con el CDRStats, que aun solucionables, no deseamos complicarnos la vida de momento.

Con esto lo introducimos en nuestra base de datos con el sencillo comando, que solo nos pedirá nuestra clave de administrador de MySQL
mysql –p  < dbasterisk.mysql

Lo segundo que necesitamos es instalar el módulo de Asterisk cdr_mysql. Seguramente durante la instalación del Asterisk-Addons (en caso de la versión 1.6.2) o directamente durante la instalación de Asterisk (versión 1.8), con la opción make menuconfig pudimos seleccionar el módulo cdr_mysql. En otro caso nos tocaría volver a recompilar Asterisk-Addons incluyendo este módulo. En caso que no, vamos a donde descomprimimos el tarball de Asterisk-addons, y realizamos la siguiente secuencia:

# make menuconfig (seleccionamos debajo del submenú Call Detail Recording cdr_msql)
# ./configure
# make
# make install

Y ya tendríamos preparado el modulo. Solo quedaría configurarlo para empezar a registrar llamadas en nuestra base de datos. Existe un fichero de configuración en /etc/asterisk llamado cdr_mysql.conf que retocaremos asi:

[global]
hostname=localhost
dbname=asterisk
table=cdr
user=asterisk
// A continuacion crearemos un usuario llamado asterisk desde la interfaz de phpmyadmin
password=contraseñadeasterisk
port=3306
// Puerto por defecto de MySQL y si lo cambiamos tendremos que cambiarlo aquí también

Aparte, bajo el contexto [columns] debemos eliminar todos los comentarios “;” que empiecen por alias y static.

Por otro lado nos toca configurar el nuevo usuario asterisk. Dentro de phpMyadmin accediendo por la interfaz web como comente antes, entramos en la opción Privilegios, seleccionamos el usuario asterisk que en teoría debería haberse creado junto a la base de datos y le damos al botón de edición, o creamos uno nuevo seleccionando “Agregar nuevo usuario”.

Aquí solo tenemos que darle permisos totales para acceder a la base de datos (si es que solo vamos a utilizar esta base de datos para Asterisk, sino, ya seleccionamos privilegios básicos de datos y no de estructura y menos de administración) y damos a Continuar (se actualizan los privilegios). Luego en la contraseña, le ponemos la contraseña que especificamos antes y le volvemos a dar a continuar para actualizar. Esto es todo.

Ahora simplemente accedemos a la CLI y cargamos el módulo mysql con el comando: reload cdr_addon_mysql.so

Aparte podemos comprobar que esta todo OK si ponemos el comando cdr show status en el apartado Registered Backends aparecerá uno que pone “mysql”.

Ya tenemos nuestro Asterisk “registrando” todas las llamadas en nuestra base de datos. Considerar que en función del espacio de nuestro sistema tendremos que purgar eventualmente el registro para no saturar la base de datos en función del uso que le demos a nuestra máquina. Aunque esto ya es administración de SQL y debería ir dedicado en otro capítulo.

Ahora viene la configuración de CDR-Stats para poder ver de forma “bonita” ese registro de llamadas, aunque realmente podríamos crear con lo que tenemos cualquier interfaz en php que acceda a esta tabla (cdr) de la base de datos (asterisk) en función de nuestras necesidades. Quiza algún día próximo haga alguna aproximación a esto para poder crear un sistema muy básico y así generar un informe concreto de rápido acceso desde una interfaz web, ya que he podido observar que CDR-Stats, aún siendo muy bonito, no llega a ser todo lo completo que uno podría llegar a necesitar en un momento determinado, dada su “genericidad” y para obtener información de alta calidad, requiere dar muchos pasos (crear muchos filtros, con la consiguiente pérdida de tiempo si especialmente se trata de un trabajo diario repetitivo), en vez de poder obtener un informe concreto de un solo golpe (por ejemplo número de llamadas atendidas por cada extensión, o número de llamadas salientes por cada extensión y tiempo total consumido). Incluso podríamos filtrar por tipo de llamadas por extensión y tiempo consumido (a móviles, a fijos y demás), al puro estilo “Facturador Telefónico”. Supuestamente existen software muy avanzados de facturación para Locutorios (Asterisk es un sistema ideal para este tipo de negocios de bajo coste) y otros Retailers que se dediquen a este mundillo (Expendedores de tarjetas de llamadas, etc). Este software se llama A2Billing (asterisk2billing), y ha sido creado por la misma empresa que pertenece Areski Belaid, creador de CDR-Stats como comente antes.

En la página web del creador existe documentación sobre su instalación, pero debo decir que es de muy baja calidad, y siguiéndola paso a paso yo no conseguí hacerlo funcionar. Y tengo constancia que muchos otros tampoco lo consiguieron.  Hay que considerar que CDR-Stats no está pensado originalmente, para ser integrado en una maquina Asterisk a modo “Standalone” sino como un módulo de sistemas completos Asterisk tipo FreePBX o Elastix. Pero siguiendo la filosofía de este blog, haciendo esto desde 0 estamos en contacto con la “naturaleza” del sistema Asterisk y estaremos más cubiertos ante la posibilidad de fallos o desastre sin la complejidad de un sistema prefabricado y preconfigurado.

En primer lugar nos toca instalar la última versión de Python, por los tiempos que corren ahora, se trata de la versión 2.6: aptitude install python2.6

Luego viene un modulo de Python utilizado por este sistema muy útil para la creación de sitios web con Python: Django en la web http://www.djangoproject.com/download/

La instalación de este es muy sencilla tras ser descargado:
# wget http://www.djangoproject.com/download/1.2.4/tarball/
// La versión puede variar con el momento también
# tar xzvf Django-1.2.4.tar.gz
// Igual lo que viene va en función de la versión
# cd Django-1.2.4
# pythong setup.py install

Luego necesitamos otro módulo de Python, Dateutils, lo podemos obtener de los repositorios de Python, pero para ello necesitamos la herramienta easy_intall:
# aptitude install python-setuptools
# easy_install DateUtils

Y a continuación, otro llamado South:

# easy_install South

Ahora viene un módulo de Django, llamado Uni Form. En este caso la última versión del módulo se puede descargar de la página del Autor: https://github.com/areski/django-uni-form/downloads

# wget https://github.com/areski/django-uni-form/tarball/0.8.0 –no-check-certificate
# tar xvf 0.8.0
// En estos casos como antes, estamos sujetos a la version, creo que es importante conocer commandos de Linux a la perfeccion para poder adaptarse con comodidad a estos commandos en function del tiempo en el que leamos este articulo
# cd areski-django-uniform-xxxxx…. (aquí viene el directorio recién descomprimido)
# python setup.py build
# python setup.py bdist_egg
# easy_install dist/django_uni_form-0.8.0-py2.6.egg (sujeto a versión de uniform y python también)

Ya tenemos el sistema listo, solo falta descargamos finalmente el personaje principal de tidi esto: CDR-Stats. Tenemos dos opciones, con el tarball, o con la última versión git subida por el autor. Para no complicarnos la vida nada, lo haremos con el Tarball y seguir en la tónica de hasta ahora, aunque invito fervientemente a aprender a utilizar git puesto que es un sistema de Control de Versiones excelente y con 4 comandos básicos, se vuelve muy sencillo de manejar.

# wget https://github.com/areski/cdr-stats/tarball/v1.1.0 –no-check-certificate
# tar xvf v1.1.0
// Y ahora preparamos ya lo descomprimido para ubicarlo en el lugar que sera ejecutado con nuestro Apache automáticamente justo en el ultimo paso
# mkdir /usr/share/django_app
# cp –r areski-cdr-stats-(directorio recién descomprmido)/cdr_stats /usr/share/django_app

Así tendremos preparado el sistema cdr_stats en su directorio de “instalación” como veremos mas adelante. Entramos en esa carpeta /usr/share/django_app/cdr_stats y editamos el fichero settings.py:

En la línea de ADMINS descomentamos y ponemos nuestro nombre y correo electrónico para figurarnos como administrador del sistema CDR-Stats

Luego en las sección Databases, tenemos que poner los parámetros de conexión de nuestro sistema MySQL:
‘ENGINE’:’mysql’,
‘NAME’:’asterisk’,
‘USER’:’asterisk’,
‘PASSWORD’:’contraseña_del_usuario_asterisk’

Seguimos adelante, en la sección LANGUAGE_CODE ponemos ‘es-es’, en TIMEZONE ‘Europe/Madrid’ (si somos de España)
Sino buscamos en http://en.wikipedia.org/wiki/List_of_tz_zones_by_name

Más abajo, en la sección: MEDIA_URL vamos a poner la dirección local de nuestro asterisk y el puerto 9000 quedando algo asi:
MEDIA_URL=’http://ip_del_servidor_web:9000/resources/’ (no dejar localhost porque podremos tener problemas si accedemos desde otro sitio que no sea el servidor con la carga de recursos)

Luego vamos a generar una clave privada única para cambiar la que viene por defecto en la sección SECRET_KEY con el siguiente comando de consola:
tr -dc A-Za-z0-9 < /dev/urandom | (head -c $1 > /dev/null 2>&1 ||head -c 50) && echo

Y finalmente en la parte de este fichero de configuración, en INSTALLED_APPS tenemos que comentar la línea  #’dilla’

Ahora crearemos un enlace simbolico para los elementos media de python que usaremos en nuestro entorno (supuestamente estamos en la carpeta /cdr_stats/admin de /django_app

ln -s  /usr/local/lib/python2.6/dist-packages/django/contrib/admin/media/ /usr/share/django_app/cdr_stats/admin

Finalmente sincronizamos la base de datos con el sistema Python, necesitamos un módulo adicional para poder  trabajar con MySQL y Python conjuntamente:
#aptitude install python-mysqldb
# python manage.py syncdb

Ahora pedirá una serie de datos sobre el primer usuario de Administrador, los rellenamos, nombre de usuario, email, contraseña, etc. Con esto podremos acceder a la interfaz web de CDR-Stats por primera vez. Si queremos crear otros superusuarios basta con que ejecutemos el siguiente comando:
python manage.py createsuperuser –username=usuarioejemplo –email=usuarioejemplo@ejemplo.com

Con esto ya tendremos el sistema base de CDR_Stats configurado por completo. Ahora solo necesitamos probar que el sistema funciona bien, antes de “automatizarlo” en nuestro Apache para futuros usos:
python manage.py runserver 0.0.0.0:9000

Y entramos a la interfaz web http://ip_servidor_web:9000 nos redirigirá a la pagina de CDR-Stats nuestra, ahí accedemos con el usuario y contraseña creados antes. Si podemos verla sin problemas (Recordar que usa Flash asi que necesitaremos el plugin en nuestro navegador adecuado), entonces ya tendremos todo listo.

Finalmente vamos a configurar el servidor Apache para que ejecute el soft ware automáticamente al arrancar nuestro servidor. Necesitamos cargar un modulo de Apache para poder ejecutar programas en Python:
aptitude install libapache2-mod-python

Creamos un fichero llamado cdr_stats.conf dentro de la carpeta /etc/apache2/sites-available/ con la siguiente información:

Listen *:9000
<VirtualHost *:9000>
DocumentRoot /usr/share/django_app/cdr_stats/
ErrorLog /usr/share/django_app/err-cdr_stats.log
<Location “/”>
SetHandler mod_python
PythonHandler django.core.handlers.modpython
PythonPath “[‘/usr/share/django_app/cdr_stats/’,’/usr/share/django_app/’] + sys.path”
SetEnv DJANGO_SETTINGS_MODULE cdr_stats.settings
PythonDebug On
</Location>
<location “/media”>
SetHandler None
</location>
</VirtualHost>

Ahora creamos un enlace simbolico a este fichero, en la carpeta sites-enabled:
ln -s /etc/apache2/sites-available/cdr_stats.conf /etc/apache2/sites-enabled/

Reiniciamos el servidor Apache: service apache2 restart

Y aunque suene poco profesional, como diría nuestro amigo Porky, That’s all Folks! Deberíamos de ver, accediendo de nuevo a la dirección anterior en  nuestro navegador web, el sistema CDR-Stats en funcionamiento.

Si queda algún fleco o alguna duda sin resolver en este mensaje, no duden en ponerme un comentario y actualizare esto para dejarlo lo más completo posible.

23 thoughts on “Obteniendo un control exhaustivo de llamadas con CDR-Stats

  1. Seguí los pasos tal como se indica pero no consigo que arranque el CDR-STAT, me sale que no se puede cargar la pagina

  2. Esto es un poco generico

    Probaste el paso del python manage.py runserver 0.0.0.0:9000 y trataste de entrar en tu servidor http://ip_de_tu_servidor:9000 ?

    Tambien es crucial dentro del settings.py que pongas el MEDIA_URL=’http://ip_del_servidor_web:9000/resources/’ bien

    Si tu servidor es por ejemplo 192.168.1.10 no vale ahi que pongas localhost, 127.0.0.1 ni nada de eso. Tienes que poner 192.168.1.10. De hecho si quieres publicarlo a internet con una IP publica y abriendo el puerto TCP 9000, tambien tendras problemas si tienes una IP dinamica. La verdad es que esto es muy poco flexible, haz estas dos comprobaciones.

  3. Gracias por tu ayuda, efectivamente probe con el comando runserver y en setting.py esta correctamente mi servidor asterisk pero no consigo que arranque. Estoy trabajando en un servidor Centos con asterisk y freepbx 2.8

  4. Cuando dices que no consigues que arranque, te da algun error al lanzar ese comando ?

    Te fue bien cuando lanzaste el comando python manage.py syncdb ? (es decir te salieron los mensajes relacionados a la sincronizacion de la base de datos con el script correctamente?)

  5. si, me pide crear el superusuario y todo lo demas que tu detallas en esta pagina. Pero cuando pongo la direccion en el browser no carga la pagina.

  6. Que navegador utilizas? Prueba con Chrome, curiosamente en uno de los PCs que utilizaba creo que Internet Explorer 7, no me accedia bien a la pagina. Y recuerda lo del puerto en la URL eh?

    Si aun asi tienes problemas, cuando ejecutas python manage.py runserver 0.0.0.0:9000, ¿que te aparece exactamente a continuacion?

  7. sabes todo muy bien hasta tratar de entrar a ver los reportes del dia y no me deja entrar me tira error 500 y cuando doy click en ADMIN me da forbidden que sera?

  8. Hola,
    He llegado a tu pagina tratando de encontrar la solucion a una instalacion de cdr-stats. instale el entorno mas o menos como tu, aunque no desactive dilla, consegui que funcionara el modulo, aunque no se que hace.
    Mi problema es que funciona todo, menos crear customers o nuevos admins, desde el interfaz web. Puesto en modo debug, me suelta un estupendo:
    [u’ManagementForm data is missing or has been tampered with’]

    Tu has conseguido administrar usuarios ??
    Saludos y gracias

  9. Interensante apreciacion. Yo personalmente creo usuarios directamente con el plugin python.
    Acerca de dilla, el propio autor recomienda su desactivacion en su recien terminado script de instalacion
    Creo que cuando tenga un hueco voy a darle una vuelta a esto que me dices, pero en estos momentos no es mi prioridad porque le veo algunas lagunas como comentaba en el mensaje que hacen que cdr-stats aun muy interesante sistema de estadisticas de coste 0, muy poco potente en la generacion de informes.

  10. Como se pueden añadir usuarios no administradores con el script de python? solo encuentro la opcion superuser.
    Otra cosa que pasa, es que el syncdb no crea la tabla cdr_userprofile. He conseguido crearla con python manage.py migrate aunque no se si sera lo mas correcto.

    Por si te sirve de algo el error que me sale es este:

    ValidationError at /admin/auth/staff/add/
    Request Method: POST
    Request URL: http://192:168.0.20:9000/admin/auth/staff/add/
    Django Version: 1.2.4
    Exception Type: ValidationError
    Exception Value:
    Exception Location: /usr/local/lib/python2.6/dist-packages/django/forms/formsets.py in _management_form, line 57
    Python Executable: /usr/bin/python
    Python Version: 2.6.2
    Python Path: [‘/usr/share/django_app/cdr_stats/’, ‘/usr/share/django_app/’, ‘/usr/local/lib/python2.6/dist-packages/DateUtils-0.5.1-py2.6.egg’, ‘/usr/local/lib/python2.6/dist-packages/pytz-2011b-py2.6.egg’, ‘/usr/local/lib/python2.6/dist-packages/python_dateutil-1.5-py2.6.egg’, ‘/usr/local/lib/python2.6/dist-packages/South-0.7.3-py2.6.egg’, ‘/usr/local/lib/python2.6/dist-packages/django_uni_form-0.8.0-py2.6.egg’, ‘/usr/lib/python2.6’, ‘/usr/lib/python2.6/plat-linux2’, ‘/usr/lib/python2.6/lib-tk’, ‘/usr/lib/python2.6/lib-old’, ‘/usr/lib/python2.6/lib-dynload’, ‘/usr/lib/python2.6/dist-packages’, ‘/var/lib/python-support/python2.6’, ‘/var/lib/python-support/python2.6/gtk-2.0’, ‘/usr/local/lib/python2.6/dist-packages’]
    Server time: mié, 23 Feb 2011 13:10:03 +0100

  11. y esto creo que esta mal:

    “Ahora crearemos un enlace simbolico para los elementos media de python que usaremos en nuestro entorno (supuestamente estamos en la carpeta /cdr_stats de /django_app
    ln -s /usr/local/lib/python2.6/dist-packages/django/contrib/admin/media/ admin”

    Tendrias que estar dentro de la carpeta cdr-stats/resources

  12. Es correcto lo que dices, errata mia. Gracias por el Apunte.

    Sobre el tema de la adicion de usuarios, voy a analizarlo con ese error que me das, creo que puede ser util, efectivamente, con el script python se añaden super users. El tema es que yo personalmente no le di un uso mas avanzado del sistema fuera de los “super users”, creo que no tiene tanta potencia como para necesitar multiples tipos de usuarios de momento.

  13. Hola, muy bueno el articulo. Me sale el siguiente error cuando ejecuto: python manage.py syncdb
    /usr/local/lib/python2.6/dist-packages/django/db/__init__.py:60: DeprecationWarning: Short names for ENGINE in database configurations are deprecated. Prepend default.ENGINE with ‘django.db.backends.’
    DeprecationWarning
    Error: No module named admin_tools.dashboard

  14. Excelente, pero me da error de sqlite ¿? Como puede ser si lo modifique para que el engine sea Mysql??? El error que me da es:

    /usr/local/lib/python2.6/dist-packages/django/db/backends/sqlite3/base.p

    Eso significa que me sigue intentando tomar slite3 en vez de Mysql.. alguna idea?

  15. Buenas Martin
    Entiendo yo que sera al reves, has tratado de poner el Engine SQLite 3 y te da ese error.
    La verdad que no lo probe. Y ahora mismo no tengo instalado CDR-Stats. Lo tendre en cuenta para una futura prueba. ¿No lo tienes con MySQL por alguna razon en concreto? Veo SQLite demasiado poco flexible y la diferencia en el rendimiento tampoco es que sea la panacea.

  16. SirLouen, me entendiste mal, yo quiero utilizar CDR-STATS con MySQL, pero me siguen tomando por defecto sqlite3. Ese es el problema.

  17. Much gracias SirLouen! al verdad es que me has solucionado el día, 🙂
    Me funciona todo genial menos la última parte, la de hacer que apache cargue el software automáticamente. Si copio y pego, cuando reinicio apache me da un error diciendo que PythonPath sólo puede recibir un argumento, si quito sys.path, no da problemas pero al intentar entrar en la página me sale un menu html-like con los archivos de python. sabes a qué se puede deber.
    Mil gracias por adelantado
    Carlos

  18. hola amigo nada mas quiero darte las gracias por la intencion pero estoy encontrando errores en tu texto que si revisaras te daras cuenta que podrian llegar a ser un desastre para alguien inexperto como yo el primer error que encontre es el nombre del archivo sql para crear la base y el segundo dentro del archivo la linea USE asterisk; que el comando y como tercer error la sysntaxis correcta seria
    mysql < dbasterisk.sql -p da el sig error ERROR 1064 (42000) at line 2: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'USE asterisk' at line 4
    de todos se te agradece ya que he avansado en otras cosas nada mas falta compilar el cdr stat y lo seguire de unos de los links que aqui dejaron 😀

  19. Aaron, si has copiado el dbasterisk.sql directamente desde la web es posible que no se haya copiado del todo bien. Prueba a poner la linea

    GRANT INSERT ON asterisk.* TO asterisk@localhost USE asterisk;

    Seguida para que no salga ningun end of line durante el copiado ni nada por el estilo

    De cualquier forma te recomiendo que instales ya la ultima version de CDR-Stats siguiendo el siguiente manual:
    http://wikiasterisk.com/index.php/CDR-Stats

  20. No mames, mucho rollo. Me hice una pagina web en php en una hora para visualizar el condensado de las llamadas por extensión, en answered, busy y failed.

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *