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
('á','Á','é','É','í','Í','ó','Ó','ú','Ú','ñ','º','ª','&','ü');
$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();
?>