Actualización dinámica del "Asterisk CallerID" y de la agenda en XML desde una BBDD en MySQL

Visto 345 veces
Saltar al primer mensaje no leído

ru0...@gmail.com

no leída,
26 jun 2007, 7:15:5426/6/07
a aster...@googlegroups.com
Como la "Asterisk CallerID database" es algo engorrosa de manejar, y me
parece más sencillo manejar una BBDD en MySQL (tienes un montón de
gestores libres o puedes programar uno fácilmente en php), he decidido
crear un código que lo sincronice y de paso te cree el XML para el
teléfono.

Espero que os sirva, el código no está demasiado comentado, así que si
tenéis alguna duda o alguna idea para mejorarlo...


El código a partir de una BBDD en MySQL, crea:

* el archivo XML: "gs_phonebook.xml" con la agenda para el
teléfono, en mi caso un GPX2000. Sólo pasará los contactos cuyo
nombre empiece por "*", no se cuanto es el límite de contactos
para este teléfono, pero la agenda completa no me la acepta.

* el script "/tmp/phonebook.sh" que pasa los contactos al Asterisk
CallerID database.

Los datos los guardará con lo siguiente al inicio de cada contacto:
* (T): Para los teléfonos fijos.
* (M): Para los teléfonos móviles.
* (F): Para los Faxes. (Estos por lógica no se pasarán al XML)

De esta forma que cuando nos llamen, añadiendo:
* "exten=> s,n,LookupCIDName(${CALLERIDNUM})" para Asterisk1.2
* "exten = s,n,Set(CALLERID(name)=
${DB(cidname/${CALLERID(num)})})" para Asterisk1.4
al dialplan tendremos el nombre de quien nos llama en la pantalla de
nuestro teléfono y lo guardará en el CDR.

*Podemos usar "cron" para automatizar la tarea:

crontab -l
# m h dom mon dow command
#0 4 * * * curl http://localhost/gs.php >/dev/null 2>&1 /dev/null
#15 4 * * * sh /tmp/phonebook.sh >/dev/null 2>&1 /dev/null

* Script en php principal: gs.php:

<?php

//Cambiar los **** por los datos de vuestra BBDD
$host = "******";
$user = "******";
$pass = "******";
$database = "******";
$linkID = mysql_connect($host, $user, $pass) or die("Could not connect
to host.");
mysql_select_db($database, $linkID) or die("Could not find database.");

//Cambiar los campos de vuestra BBDD,
//pero acordaros de hacerlo en todo el código
//fn: Nombre
//org_name: Empresa
//tel_work: Número fijo
//tel_cell: Número móvil
//tel_fax: Número de Fax
$query = "SELECT fn, org_name, tel_work, tel_cell, tel_fax FROM
egw_addressbook ORDER BY fn";

$resultID = mysql_query($query, $linkID) or die("Data not found.");
print("<?xml version=\"1.0\"?>\n");
$xml_output = "<?xml version=\"1.0\"?>\n";
$xml_output .= "<AddressBook>\n";
$sh_output = "#!/bin/bash\n";

for($x = 0 ; $x < mysql_num_rows($resultID) ; $x++){
//le damos "forma" a los datos
$row = mysql_fetch_assoc($resultID);
$msg = trim($row['fn']);
$msg = ereg_replace("[[:space:]]","_",$msg);
$msg = ereg_replace("_+","_",$msg);
$msg2 = trim($row['org_name']);
$msg2 = ereg_replace("[[:space:]]","_",$msg2);
$msg2 = ereg_replace("_+","_",$msg2);
$msg3 = substr($msg,1);
$busqueda=array
('&aacute;','&Aacute;','&eacute;','&Eacute;','&iacute;','&Iacute;','&oacute;','&Oacute;','&uacute;','&Uacute;','&ntilde;','&ordm;','&ordf;','&amp;','&uuml;');
$reemplazar=array
('a','A','e','E','i','I','o','O','u','U','n','o','a','&','u');

//comprobamos el campo del teléfono móvil
if(is_numeric($row['tel_cell'])){
$num = trim($row['tel_cell']);
$cadena3='(M)'.$msg3.'-'.$msg2;
$cadena='(M)'.$msg.'-'.$msg2;
$cadena2 = htmlentities($cadena);
$cadena2 = str_replace($busqueda, $reemplazar, $cadena2);

//si empieza por "*" lo añadimos al XML sin el "*"
if (eregi("^[*]",$msg)){
$xml_output .= "\t<Contact>\n";
$xml_output .= "\t\t<LastName>" . $cadena3 .
"</LastName>\n";
$xml_output .= "\t\t\t<Phone>\n\t\t\t\t<phonenumber>" .
$num . "</phonenumber>\n";
$xml_output .= "\t\t\t
\t<accountindex>0</accountindex>\n";
$xml_output .= "\t\t\t</Phone>\n";
$xml_output .= "\t</Contact>\n";
}else{}
$sh_output .= "/usr/sbin/asterisk -rx \"database put cidname $num
$cadena2\"\n";
}else{}

//comprobamos el campo del teléfono fijo
if(is_numeric($row['tel_work'])){
$num = trim($row['tel_work']);
$cadena3='(T)'.$msg3.'-'.$msg2;
$cadena='(T)'.$msg.'-'.$msg2;
$cadena2 = htmlentities($cadena);
$cadena2 = str_replace($busqueda, $reemplazar, $cadena2);

//si empieza por "*" lo añadimos al XML sin el "*"
if (eregi("^[*]",$msg)){
$xml_output .= "\t<Contact>\n";
$xml_output .= "\t\t<LastName>" . $cadena3 .
"</LastName>\n";
$xml_output .= "\t\t\t<Phone>\n\t\t\t\t<phonenumber>" .
$num . "</phonenumber>\n";
$xml_output .= "\t\t\t
\t<accountindex>0</accountindex>\n";
$xml_output .= "\t\t\t</Phone>\n";
$xml_output .= "\t</Contact>\n";
}else{}
$sh_output .= "/usr/sbin/asterisk -rx \"database put cidname $num
$cadena2\"\n";
}else{}

//comprobamos el campo del fax
if(is_numeric($row['tel_fax'])){
$num = trim($row['tel_fax']);
$cadena='(F)'.$msg.'-'.$msg2;
$cadena2 = htmlentities($cadena);
$cadena2 = str_replace($busqueda, $reemplazar, $cadena2);
$sh_output .= "/usr/sbin/asterisk -rx \"database put cidname $num
$cadena2\"\n";
}else{}

}
$xml_output .= "</AddressBook>\n";

//creamos el archivo XML para el teléfono
$fp = fopen('gs_phonebook.xml', 'wb');
fwrite($fp, $xml_output);
fclose($fp);

//creamos el script para actualizar "Asterisk CallerID database"
$fs = fopen('/tmp/phonebook.sh', 'wb');
fwrite($fs, $sh_output);
fclose($fs);

echo $xml_output;
?>

* Script en php para pasar el XML al teléfono por HTTP en vez de
usar el FTP:

<?php
ob_start();
set_time_limit(5);
$fd=fopen("gs_phonebook.xml","r");
while ($line=fgets($fd,1000))
{
//print($line);
echo($line);

}
fclose ($fd);
header('Content-Length: ' . ob_get_length());
ob_end_flush();
?>


Responder a todos
Responder al autor
Reenviar
0 mensajes nuevos