La configuracion de ODBC para usar MySQL es un poco confusa a vote pronto, se han de tocar unos cuantos ficheros y usar el concepto DSN:Data Source Name
Lo primero vamos a crear un usuario y una DDBB, para ese usuario, la forma de hacerlo por phpmyadmin, es simple, y no tiene mucho misterio, primero creamos el usuario y le decimos que nos cree una DDBB con el mismo nombre. Si por contra lo queremos hacer por consola osea por SQL, la cosa seria de este modo.
root@Asterisk02:/# mysql -p (ponemos la p para que nos pida la pass, en nuentro caso la que pusimos cuando nos la pidio al instalar mysql-server y si no la cambiamos con el scrypt de seguridad.)
Enter password:*********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 40
Server version: 5.5.50-0+deb8u1 (Debian)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
Una vez dentro de mysql, creamos una BBDD la llamaremos asteriskdb
mysql>CREATE DATABASE asteriskdb;
Query OK, 0 rows affected (0.01 sec)
Luego crearemos el usuario le llamaremos asteriskco y la contraseña sera LaClave
mysql>CREATE USER 'asteriskco'@'localhost' IDENTIFIED BY "LaClave";
Query OK, 0 rows affected (0.01 sec)
Nos toca relacionar al usuario con la DDBB y darle privilegios.
mysql>GRANT ALL PRIVILEGES ON asteriskdb.* TO 'asteriskco'@'localhost';
Query OK, 0 rows affected (0.01 sec)
mysql> exit
Bye
root@Asterisk02:/#
Pruebas de que todo salio bien.
Nos intentamos auntenticas con el usuario dado a y la contaseña definida.
root@Asterisk02:/#mysql -u asteriskco -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 66
Server version: 5.5.50-0+deb8u1 (Debian)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| asteriskdb |
+--------------------+
2 rows in set (0.00 sec)
mysql>exit
Como vemos se autentica y se ve la DDBB que se creo.
Configurando ODBC
Dentro de /etc hay un par de ficheros, odbc.ini y odbcinst.ini que se tendran que tocar.
odbcinst.ini
Abrimos el fichero y no tiene nada configurado crearemos el driver para ODBC y lo llamaremos DrvMySQL
[DrvMySQL]
Description = Driver ODBC Para MySQL
Driver = /usr/lib/i386-linux-gnu/odbc/libmyodbc.so
Setup = /usr/lib/i386-linux-gnu/odbc/libodbcmyS.so
FileUsage = 1
Las rutas de libmyodbc.so y libodbcmyS.so son para mi sistema Debian 8.5 (32bits.) si usais otro tendreis que saberlas o buscarlos.
odbc.ini
Abrimos el fichero y no tiene nada configurado, tendremos que crear el conector de esta manera. Lo llamaremos Conector el conector usar el driver efinido en odbcinst.ini y nos relaciona la base de datos definida para asterisk "asteriskdb"
[Conector]
Description = Cenexion para asterisk a la DDBB (asteriskdb) en MySQL
Driver = DrvMySQL
Database = asteriskdb
Server = localhost
Port = 3306
Socket = /run/mysqld/mysqld.sock
Ojito con el socket, en cada distribución y dentro de ellas en cada versión (en mi caso debian 8.5 )puede cambiar el lugar donde esté definido, con un simple find / -name mysqld.sock daremos con ello.
Ya tenemos lo esencial, hagamos pruebas de operación, mediante estos comandos.
Primero el Driver.
root@Asterisk02:/etc# odbcinst -q -d
[DrvMySQL]
Nos ve el driver, perfecto, probemos el conector de este modo, tenemos que meter credenciales de lo contrario no podra conectar con asteriskdb.
root@Asterisk02:/etc#isql -v Conector asteriskco LaClave
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>quit
Perfecto nos conecta con la DDBB.
Configurando la parte de Asterisk
rest_odbc.conf
Es un fichero que viene con ejemplos, que nos pueden dar una idea de como van los "tiros", en nuestro caso crearemos un "contexto" al final y lo definiremos ajustándose a lo que ya tenemos. A resaltar el "dsn" que define el conector que se definio en odbc.ini y las credenciales y usuario de la DDBB creadas en MySQL.
[asterisk]
enabled => yes
dsn => Conector
username => asteriskco
password => LaClave
pre-connect => yes
La forma de probar esto es mediante la consola de Asterisk, recargando el modulo y viendo que pasa.
root@Asterisk02:/etc#asterisk -r
Asterisk02*CLI> module reload res_odbc.so
[Aug 18 14:35:09] NOTICE[23600]: res_odbc.c:616 load_odbc_config: Registered ODBC class 'asteriskdb' dsn->[Conector]
Parece que todo funciona.
Bien, alimentemos la DDBB, mi idea es crear una tabla que contenga nombres, apellidos, email, telefonos, moviles y extensiones, la idea de esta tabla, es relacionar el numero de fijo o movil a una extensión, mi objetivo es que si el numero que aparece de fijo o movil está en la tabla pase a identificar con que extensión conectar.(El concepto es que el mismo cliente hable siempre con el mismo comercial)
Creamos la tabla con estas premisas, un ID indice, Nombre, Apellidos, Telefono, Movil, Email, Extensión, Esto lo desarrollamos en este otro Post.
Asterisk CDR Viewer
Configurando CDR para que se guarde la info en una DDBB, en nuestro caso "asterisdb" .
Antes que nada tendremos que crear la tabla que llamaremos "cdr" para ello, inyectamos estas lineas en la consola de mysql.
https://wiki.asterisk.org/wiki/display/AST/MySQL+CDR+Backend
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 '',
uniqueid varchar(32) NOT NULL default '',
userfield varchar(255) NOT NULL default ''
);
Una vez la tabla creada, continuaremos usando ODBC, y para ello editamos:
cdr_adaptive_odbc.conf que usara el recurso creado en res_odbc.conf en nuestro caso lo llamamos [asterisk]
Incluimos estas lineas:
[CDR]
connection=asterisk
table=cdr
alias start => calldate
(alias start => calldate Ojo con esto, si no ponemos este alias, nunca aparecerán las "horas" de inicio de las llamadas puesto que asterisk llama a eso "calldate")
Ya solo nos queda probar que a hacer una llamada y ver si en la tabla cdr se empieza a llenar con la información que asterisk genera.
Una vez visto esto pasamos a usar
Asterisk-CDR-Viewer
Como ya tenemos Apache2 y php5,(arrastrado por phpmyadmin) solo nos queda descargar la aplicación y darle unos retoques para que se ponga en marcha mostrando todas las llamadas
Lo descargamos la ultima versión de:
https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/asterisk-cdr-viewer/asterisk-cdr-viewer-1.0.2.tgz
Lo descargamos en /usr/srv/
Descomprimimos con:
root@Asterisk02:/usr/src# tar -zxvf asterisk-cdr-viewer-1.0.2.tgz
quedando el directorio asterisk-cdr-viewer, que moveremos a /var/www/html/ (Donde apache muestra contenido)
root@Asterisk02:/usr/src# mv asterisk-cdr-viewer /var/www/html/
Tendremos que hacer unos retoques para que lea la tabla cdr y ya lo tendremos listo, el fichero a editar se llama, config.inc.php que se encuentra dentro del directorio /include
root@Asterisk02: vim /var/www/html/asterisk-cdr-viewer/include/config.inc.php
Este fichero al principio contiene una serie de variables que se han de adaptar,y para que en nuestro caso funcione tendremos que dejarlo como esto.
$db_type = 'mysql';
$db_host = 'localhost';
$db_port = '3306';
$db_user = 'asteriskco';
$db_pass = 'LaClave';
$db_name = 'asteriskdb';
$db_table_name = 'cdr';
Guardamos el fichero y hacediendo mediante http://servidor_o_IP/asterisk-cdr-viewer/ le damos a buscar y ya se muestrar las llamadas de pruebas que se vieron antes.
Preparamos el Alias, para no tener que escribir asterisk-cdr-viewer, y con un simple http://ip/acdr/ tendremos el mismo efecto, para esto copiamos el fichero que tenemos en /var/www/html/asterisk-cdr-viewer/contrib/httpd/asterisk-cdr-viewer.conf y lo meteremos en /etc/apache2/conf-aviable/ de este modo.
root@Asterisk02:# cp /var/www/html/asterisk-cdr-viewer/contrib/httpd/asterisk-cdr-viewer.conf /etc/apache2/conf-aviable/
Creamos un enlace simbolico para activarlo en:
root@Asterisk02:#ln -s /etc/apache2/conf-aviable/asterisk-cdr-viewer.conf /etc/apache2/conf-enabled/asterisk-cdr-viewer.conf
Tenemos que editar el fichero asterisk-cdr-viewer.conf para modificar el "path" del alias, porque por defecto no está en el lugar correcto para una Debian 8.5, tenemos que intercalar el "html" la cosa quedaria asi:
Alias /acdr/ "/var/www/html/asterisk-cdr-viewer/"
Con esto ya tendriamos finiquitado el asunto, solo queda reiniciar Apache2 para que coja esos nuevos configs y listo.
Pero podemos dar una vuelta de rosca mas, hacer que el acceso a http://ip/acdr/ sea mediante usuario y contraseña, ¿¿como hacemos esto??
Si nos percatamos, y miramos con detalle el ficherito asterisk-cdr-viewer.conf incorpora esta información:
Alias /acdr/ "/var/www/html/asterisk-cdr-viewer/"
#<Location "/acdr/">
# AuthName "Asterisk-CDR-Stat"
# AuthType Basic
# AuthUserFile /var/www/asterisk-cdr-viewer/.htpasswd
# AuthGroupFile /dev/null
# require valid-user
#</Location>
Descometamos todo MENOS "# AuthGroupFile /dev/null" fijemonos que el Location es /acdr/ y no /asterisk-cdr-viewer/ luego comentamos este dato. Guardamos el fichero descomentado lo dicho.
El fichero en mi caso quedara de este modo
Alias /acdr/ "/var/www/html/asterisk-cdr-viewer/"
<Location "/acdr/">
AuthName "Asterisk-CDR-Stat"
AuthType Basic
AuthUserFile /var/www/html/asterisk-cdr-viewer/.htpasswd
# AuthGroupFile /dev/null
require valid-user
</Location>
Ahora pasamos a crear un o varios usuarios y meterlos en .htpasswd, yo solo creare uno, lo llamare AsterisK13, esto se hace mediante:
root@Asterisk02:# htpasswd -c /var/www/html/asterisk-cdr-viewer/.htpasswd AsterisK
Nos solicitara una contraseña (no es necesario meter mas de 8 caracteres no se tendran en cuenta, solo se usaran los 8 primeros), la introducimos, y ya tendremos creado .htpasswd en /var/www/html/asterisk-cdr-viewer/, un remate final, tendremos que editar el fichero /var/www/html/asterisk-cdr-viewer/include/config.inc.php
buscaremos la linea que "reza" $admin_user_names = '*' y la comentamos, para mayor limpieza, y crearemos otra que diga:
$admin_user_names = 'AsterisK';
Guardamos y reiniciamos Apache2, e intentaremos acceder a http://ip/acdr/, y cual sera nuestra sorpresa que nos saldra un cartel, para autenticarnos, si introducimos como usuario AsterisK y con la password que pusimos al crear el usuario con htpasswd podremos acceder.
PEROOOOO, si nos metemos por http://ip/asterisk-cdr-viewer/ entraremos sin credenciales, esto puede ser bueno o malo, para hacer que este "fallo" no haga una entrada al registro sin credenciales, tan sencillo como añadir al asterisk-cdr-viewer.conf otra "Location" conteniendo "asterisk-cdr-viewer", la cosa quedaria de este modo:
Alias /acdr/ "/var/www/html/asterisk-cdr-viewer/"
<Location "/acdr/">
AuthName "Asterisk-CDR-Stat"
AuthType Basic
AuthUserFile /var/www/html/asterisk-cdr-viewer/.htpasswd
# AuthGroupFile /dev/null
require valid-user
</Location>
<Location "/asterisk-cdr-viewer/">
AuthName "Asterisk-CDR-Stat"
AuthType Basic
AuthUserFile /var/www/html/asterisk-cdr-viewer/.htpasswd
# AuthGroupFile /dev/null
require valid-user
</Location>
Se entre por donde se entre siempre pedira credenciales.
Fin de esta parte.