<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>I+D =&#62; Imaginación+Diversión</title>
	<atom:link href="http://blogs.diaple.com/roberto/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.diaple.com/roberto</link>
	<description>Trasteando en la informática</description>
	<pubDate>Wed, 06 Jan 2010 13:39:29 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Exportando usuarios y permisos de MySql</title>
		<link>http://blogs.diaple.com/roberto/2010/01/exportando-usuarios-y-permisos-de-mysql/</link>
		<comments>http://blogs.diaple.com/roberto/2010/01/exportando-usuarios-y-permisos-de-mysql/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 13:39:29 +0000</pubDate>
		<dc:creator>roberto</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[Sistemas]]></category>

		<category><![CDATA[Software Libre]]></category>

		<category><![CDATA[mysql]]></category>

		<category><![CDATA[script]]></category>

		<guid isPermaLink="false">http://blogs.diaple.com/roberto/?p=21</guid>
		<description><![CDATA[Casi siempre que he tenido que migrar un servidor a otro nuevo, y he preferido usar los dumps de MySql en lugar de los binarios, me he encontrado con algún problemilla con los usuarios, passwords y permisos.
Esta última vez, al migrar una BD que estaba en 5.0 a la versión 5.1, las tablas mysql.user y [...]]]></description>
			<content:encoded><![CDATA[<p>Casi siempre que he tenido que migrar un servidor a otro nuevo, y he preferido usar los dumps de MySql en lugar de los binarios, me he encontrado con algún problemilla con los usuarios, passwords y permisos.</p>
<p>Esta última vez, al migrar una BD que estaba en 5.0 a la versión 5.1, las tablas mysql.user y mysql.db no eran compatibles, por lo que había que conseguir los grant&#8217;s. La solución la verdad es que no es bastante compleja, pero encontré un script que me ahorró media horilla de haber estado jugando con el CLI de mysql, y nuestro amigo <em>sed</em></p>
<p><span id="more-21"></span>La solución es bastante sencilla y pasa por concatenar la salida de un show grants para cada uno de los usuarios de la tabla mysql.user. Es una función de BASH a la que sólo hay que pasar como parámetros los mismos que le pasaríamos al CLI de Mysql:</p>
<pre>mygrants()</pre>
<pre>{</pre>
<pre><span style="white-space:pre">	</span>mysql -B -N $@ -e &#8220;SELECT DISTINCT CONCAT(</pre>
<pre><span style="white-space:pre">		</span>&#8216;SHOW GRANTS FOR &#8221;&#8217;, user, &#8221;&#8217;@&#8221;&#8217;, host, &#8221;&#8217;;&#8217;</pre>
<pre><span style="white-space:pre">		</span>) AS query FROM mysql.user&#8221; |</pre>
<pre><span style="white-space:pre">	</span>mysql $@ |</pre>
<pre><span style="white-space:pre">	</span>sed &#8217;s/(GRANT .*)/1;/;s/^(Grants for .*)/## 1 ##/;/##/{x;p;x;}&#8217;</pre>
<pre>}</pre>
<p>Simplemente para sacar los grants del host local usando el usuario administrador de la BD y como password pwd, llamaríamos a la función desde cualquier script BASH tal que así:</p>
<pre>mygrants --host=localhost --user=root --password=pwd</pre>
<div>La salida de este comando se la podemos pasar por una tubería a otro cliente de mysql contra la BD de destino, o volcarla a un fichero para hacer después lo que queramos con ella.</div>
<div>Simple y rápido:</div>
<div><a href="http://serverfault.com/questions/8860/how-can-i-export-the-privileges-from-mysql-and-then-import-to-a-new-server">http://serverfault.com/questions/8860/how-can-i-export-the-privileges-from-mysql-and-then-import-to-a-new-server</a></div>
]]></content:encoded>
			<wfw:commentRss>http://blogs.diaple.com/roberto/2010/01/exportando-usuarios-y-permisos-de-mysql/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Asterisk 1.6.2 publicado</title>
		<link>http://blogs.diaple.com/roberto/2009/12/asterisk-162-publicado/</link>
		<comments>http://blogs.diaple.com/roberto/2009/12/asterisk-162-publicado/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 13:12:01 +0000</pubDate>
		<dc:creator>roberto</dc:creator>
		
		<category><![CDATA[Asterisk]]></category>

		<category><![CDATA[Software Libre]]></category>

		<guid isPermaLink="false">http://blogs.diaple.com/roberto/?p=19</guid>
		<description><![CDATA[Por fin ha sido publicada la versión 1.6.2.0 de Asterisk: http://www.asterisk.org/node/49881, y por qué me hace tanta ilusión, pues porque como podemos ver en las notas de la versión, se ha introducido la aplicación Originate, que complementa lo que ya teníamos en el AMI y en el AGI, y que surge de un pequeño y [...]]]></description>
			<content:encoded><![CDATA[<p>Por fin ha sido publicada la versión 1.6.2.0 de Asterisk: <a href="http://www.asterisk.org/node/49881">http://www.asterisk.org/node/49881</a>, y por qué me hace tanta ilusión, pues porque como podemos ver en las notas de la versión, se ha introducido la aplicación Originate, que complementa lo que ya teníamos en el AMI y en el AGI, y que surge de un pequeño y chapucerillo parche que envié en su día al SVN.</p>
<p>Es una tontadica, pero hace ilusión ver el nombre de uno en el app_originate.c</p>
<p>Bueno, y dejándonos de tanta autofelación, tengo 7 posts más en los borradores pendientes de publicar, así que voy a intentar ir sacando un rato cada semana o dos semanas para ir dando un poco de vida a esto.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.diaple.com/roberto/2009/12/asterisk-162-publicado/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Conversión entre códecs de audio</title>
		<link>http://blogs.diaple.com/roberto/2009/01/conversion-entre-codecs-de-audio/</link>
		<comments>http://blogs.diaple.com/roberto/2009/01/conversion-entre-codecs-de-audio/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 12:17:47 +0000</pubDate>
		<dc:creator>roberto</dc:creator>
		
		<category><![CDATA[Asterisk]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[Sistemas]]></category>

		<guid isPermaLink="false">http://blogs.diaple.com/roberto/?p=13</guid>
		<description><![CDATA[De cuando en cuando, en el día a día con Asterisk, todos nos encontramos con la necesidad de transformar el códec de audio de alguna de nuestras locuciones (fundamentalmente por el G.729). En la fantástica página de Asterisk Guru tienen una herramienta que nos realiza esta tarea:
http://www.asteriskguru.org/tools/audio_conversion.php

Sin embargo, cuando tenemos que convertir un número elevado [...]]]></description>
			<content:encoded><![CDATA[<p>De cuando en cuando, en el día a día con Asterisk, todos nos encontramos con la necesidad de transformar el códec de audio de alguna de nuestras locuciones (fundamentalmente por el G.729). En la fantástica página de <a href="http://www.asteriskguru.org/">Asterisk Guru</a> tienen una herramienta que nos realiza esta tarea:</p>
<p><a href="http://www.asteriskguru.org/tools/audio_conversion.php">http://www.asteriskguru.org/tools/audio_conversion.php</a></p>
<p><span id="more-13"></span></p>
<p>Sin embargo, cuando tenemos que convertir un número elevado de ficheros, puede convertirse en una tarea tediosa. Es por ello, que usando curl he creado un sencillo script que convierte desde consola los ficheros haciendo una llamada a la web tal y como la haría un navegador. El código del script es el siguiente:</p>
<blockquote><p>#!/bin/bash</p>
<p>filename=`echo $1 | cut -d&#8217;.&#8217; -f1`<br />
codec=`echo $1 | cut -d&#8217;.&#8217; -f2`</p>
<p>curl -o $filename.$2 -Finput_codec=$codec -Foutput_codec=$2 -F_is_submitted=1</p>
<p>-FMAX_FILE_SIZE=104857600 -Ffile=@$1</p>
<p>http://www.asteriskguru.org/tools /audio_conversion.php</p></blockquote>
<p>Es algo muy sencillito (no se pueden usar nombres de fichero con más de un &#8216;.&#8217;), pero funciona bien. La forma de usarlo es pasando como primer parámetro el nombre del fichero origen (la extensión debe coincidir con el códec en el que está), y como segundo parámetro el códec de destino.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.diaple.com/roberto/2009/01/conversion-entre-codecs-de-audio/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Cisco va a comprar a Jabber</title>
		<link>http://blogs.diaple.com/roberto/2008/09/cisco-va-a-comprar-a-jabber/</link>
		<comments>http://blogs.diaple.com/roberto/2008/09/cisco-va-a-comprar-a-jabber/#comments</comments>
		<pubDate>Mon, 22 Sep 2008 08:08:19 +0000</pubDate>
		<dc:creator>roberto</dc:creator>
		
		<category><![CDATA[Internet]]></category>

		<category><![CDATA[Networking]]></category>

		<category><![CDATA[Sistemas]]></category>

		<category><![CDATA[Software Libre]]></category>

		<category><![CDATA[cisco jabber]]></category>

		<guid isPermaLink="false">http://blogs.diaple.com/roberto/?p=11</guid>
		<description><![CDATA[Vía Faq-Mac me entero de una adquisición que no me termina de gustar. La razón es muy simple, Jabber es el único estándar abierto de mensajería instantánea y aunque hay muchas aplicaciones independientes de la empresa que implementan tanto la parte cliente (Kopete, &#8230;), como la parte servidor (mi preferido es el magnífico Openfire del [...]]]></description>
			<content:encoded><![CDATA[<p>Vía <a href="http://www.faq-mac.com/noticias/32397/cisco-compra-jabber">Faq-Mac</a> me entero de una adquisición que no me termina de gustar. La razón es muy simple, Jabber es el único estándar abierto de mensajería instantánea y aunque hay muchas aplicaciones independientes de la empresa que implementan tanto la parte cliente (Kopete, &#8230;), como la parte servidor (mi preferido es el magnífico Openfire del que probablemente escribiré un artículo próximamente), no deja de fastidiarme que una empresa como Cisco, muy dada a la mejora de protocolos abiertos con funcionalidades más o menos cerradas (VRRP, IPsec, &#8230;) se haga con el control de la empresa madre.<span id="more-11"></span></p>
<p>Veremos en qué queda todo esto, pero me imagino que en poco tiempo, será complicado interoperar con clientes que utilicen el protocolo que implemente Cisco en sus soluciones. algo que utiliza la empresa americana para obligar a todo el mundo a usar sus sistemas para poder trabajar con sitios donde ya tienen Cisco.</p>
<p>Esperemos que me equivoque, y dentro de poco vea alguna actualización del firmware de los magníficos teléfonos IP Linksys que permita usar Jabber desde ellos para aprovecharnos de res_jabber en nuestros Asterisk, o para poder controlar también la presencia (o el estado) mediante dicho protocolo.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.diaple.com/roberto/2008/09/cisco-va-a-comprar-a-jabber/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Asterisk Manager Interface (AMI) desde Java mediante asterisk-java</title>
		<link>http://blogs.diaple.com/roberto/2008/09/asterisk-manager-interface-ami-desde-java-mediante-asterisk-java/</link>
		<comments>http://blogs.diaple.com/roberto/2008/09/asterisk-manager-interface-ami-desde-java-mediante-asterisk-java/#comments</comments>
		<pubDate>Fri, 19 Sep 2008 16:08:31 +0000</pubDate>
		<dc:creator>roberto</dc:creator>
		
		<category><![CDATA[Asterisk]]></category>

		<category><![CDATA[Networking]]></category>

		<category><![CDATA[Sistemas]]></category>

		<category><![CDATA[Software Libre]]></category>

		<category><![CDATA[asterisk-java java AMI]]></category>

		<guid isPermaLink="false">http://blogs.diaple.com/roberto/?p=10</guid>
		<description><![CDATA[Tras haber hablado del uso del AGI para ejecutar aplicaciones externas en nuestro Asterisk, hoy toca hablar de como hacer que aplicaciones externas interactúen con nuestro Asterisk a través del AMI (en este caso para obtener datos, aunque también se puede usar el AMI para efectuar acciones sobre nuestra centralita favorita).
Como hay por Internet bastante [...]]]></description>
			<content:encoded><![CDATA[<p>Tras haber hablado del uso del AGI para ejecutar aplicaciones externas en nuestro Asterisk, hoy toca hablar de como hacer que aplicaciones externas interactúen con nuestro Asterisk a través del AMI (en este caso para obtener datos, aunque también se puede usar el AMI para efectuar acciones sobre nuestra centralita favorita).</p>
<p>Como hay por Internet bastante ejemplos de como acceder al AMI desde scripts BASH o desde lenguajes interpretados tipo PHP o python, he decidido preparar un pequeño ejemplo para acceder desde Java. Para ello es necesario utilizar la librería <a href="http://asterisk-java.org">asterisk-java</a> (que también se puede usar para hacer AGI&#8217;s), de cuya documentación he modificado ligeramente uno de sus ejemplos para adaptarlo a un uso mucho más útil en la vida real.</p>
<p><span id="more-10"></span></p>
<p>En primer lugar tendremos que habilitar el AMI, para lo que es necesario editar el fichero <em>manager.conf</em> en nustro <em>/etc/asterisk</em> poniendo <strong>enabled</strong> a <strong>yes</strong> en la zona general, y añadiendo un usuario tal que así:</p>
<blockquote><p>[general]<br />
enabled=yes</p>
<p>[admin]<br />
write=system,call,log,verbose,command,agent,user<br />
read=system,call,log,verbose,command,agent,user<br />
secret=admin</p></blockquote>
<p>Con el usuario creado recargamos la configuración de nuestro Asterisk, y ya podemos empezar a acceder desde nuestro programa en Java. Para conseguir lo que queremos, hemos hecho que sólo se tengan en cuenta los eventos de tipo <em>Dial</em>, y una vez obtenidos sacamos por pantalla el CallerId y el canal de destino. El código resultante sería el siguiente:</p>
<blockquote><p>import java.io.IOException;</p>
<p>import org.asteriskjava.manager.AuthenticationFailedException;<br />
import org.asteriskjava.manager.ManagerConnection;<br />
import org.asteriskjava.manager.ManagerConnectionFactory;<br />
import org.asteriskjava.manager.ManagerEventListener;<br />
import org.asteriskjava.manager.TimeoutException;<br />
import org.asteriskjava.manager.action.StatusAction;<br />
import org.asteriskjava.manager.event.ManagerEvent;<br />
import org.asteriskjava.manager.event.DialEvent;</p>
<p>public class DialEvents implements ManagerEventListener<br />
{<br />
private ManagerConnection managerConnection;</p>
<p>public DialEvents() throws IOException<br />
{<br />
ManagerConnectionFactory factory = new ManagerConnectionFactory(<br />
&#8220;1.2.3.4&#8243;, &#8220;admin&#8221;, &#8220;admin&#8221;);</p>
<p>this.managerConnection = factory.createManagerConnection();<br />
}</p>
<p>public void run() throws IOException, AuthenticationFailedException,<br />
TimeoutException, InterruptedException<br />
{<br />
// register for events<br />
managerConnection.addEventListener(this);</p>
<p>// connect to Asterisk and log in<br />
managerConnection.login();</p>
<p>// request channel state<br />
managerConnection.sendAction(new StatusAction());</p>
<p>// wait 10 seconds for events to come in<br />
Thread.sleep(60000);</p>
<p>// and finally log off and disconnect<br />
managerConnection.logoff();<br />
}</p>
<p>public void onManagerEvent(ManagerEvent event)<br />
{<br />
// just print received events<br />
<strong> if(event instanceof DialEvent) {<br />
DialEvent de = (DialEvent) event;<br />
System.out.println(de.getCallerId() + &#8221; llamando a &#8221; + de.getDestination());<br />
}</strong><br />
}</p>
<p>public static void main(String[] args) throws Exception<br />
{<br />
DialEvents helloEvents;</p>
<p>dialEvents = new DialEvents();<br />
dialEvents.run();</p>
<p>}<br />
}</p></blockquote>
<p>Sólo nos queda compilar, ejecutar el programa y empezar a monitorizar las llamadas que se realizan en nuestra centralita:</p>
<blockquote><p>$ java DialEvents</p>
<p>19-sep-2008 17:50:01 org.asteriskjava.manager.internal.ManagerConnectionImpl connect<br />
INFO: Connecting to 192.168.2.99:5038<br />
19-sep-2008 17:50:02 org.asteriskjava.manager.internal.ManagerConnectionImpl setProtocolIdentifier<br />
INFO: Connected via Asterisk Call Manager/1.0<br />
19-sep-2008 17:50:02 org.asteriskjava.manager.internal.ManagerConnectionImpl doLogin<br />
INFO: Successfully logged in<br />
19-sep-2008 17:50:02 org.asteriskjava.manager.internal.ManagerConnectionImpl doLogin<br />
INFO: Determined Asterisk version: Asterisk 1.4<br />
<strong>119 llamando a SIP/110-082121e8</strong></p></blockquote>
<p>Una vez que tenemos estos datos dentro de nuestro programa en Java, ya podemos proceder a realizar cualquier cosa que se nos ocurra, desde simplemente mostrarlos como hacemos aquí, hasta llegar a niveles de <a href="http://es.wikipedia.org/wiki/Computer_Telephony_Integration">CTI</a> y comunícarselo a otros programas en Java para que actualicen con la información que se crea relevante conocer sobre el llamante.</p>
<p>Bueno, y de momento eso es todo, tengo varios artículos en el tintero sobre varias cosas, a ver si tengo algo de tiempo para ir escribiéndolos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.diaple.com/roberto/2008/09/asterisk-manager-interface-ami-desde-java-mediante-asterisk-java/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Mi primer AGI en PHP para login/logout múltiple en colas</title>
		<link>http://blogs.diaple.com/roberto/2008/07/mi-primer-agi-en-php-para-loginlogout-multiple-en-colas/</link>
		<comments>http://blogs.diaple.com/roberto/2008/07/mi-primer-agi-en-php-para-loginlogout-multiple-en-colas/#comments</comments>
		<pubDate>Mon, 28 Jul 2008 09:24:19 +0000</pubDate>
		<dc:creator>roberto</dc:creator>
		
		<category><![CDATA[Asterisk]]></category>

		<category><![CDATA[Sistemas]]></category>

		<category><![CDATA[Software Libre]]></category>

		<category><![CDATA[AGI Asterisk queues php]]></category>

		<guid isPermaLink="false">http://blogs.diaple.com/roberto/?p=8</guid>
		<description><![CDATA[Uno de los mayores problemas con las colas de llamadas en la versión 1.4, es que la aplicación AgentLogin está desaconsejada (deprecated). La alternativa es no usar agentes y en su lugar usar las nuevas aplicaciones dinámicas AddQueueMember y RemoveQueueMember. Estás dos aplicaciones tienen una desventaja respecto al uso de los agentes, y es que [...]]]></description>
			<content:encoded><![CDATA[<p>Uno de los mayores problemas con las colas de llamadas en la versión 1.4, es que la aplicación AgentLogin está desaconsejada (deprecated). La alternativa es no usar agentes y en su lugar usar las nuevas aplicaciones dinámicas AddQueueMember y RemoveQueueMember. Estás dos aplicaciones tienen una desventaja respecto al uso de los agentes, y es que en caso de que un usuario pertenezca a más de una cola de llamadas tiene que o bien loguearse en todas, o bien tenemos que tener un sitio donde relaciones las colas con los usuarios y preparar algo que nos permita facilitar la tarea.</p>
<p><span id="more-8"></span></p>
<p>Es por ello, que aprovechando la base de datos SQLite que tenemos enlazada con nuestro Asterisk, podemos aprovechar y crear una tabla que simule los Agentes de Asterisk:</p>
<blockquote><p>CREATE TABLE queue_agent_table(<br />
uniqueid integer not null primary key autoincrement,<br />
membername varchar(40),<br />
queue_name varchar(128),<br />
interface varchar(128),<br />
penalty INT(11),<br />
UNIQUE (queue_name, interface)<br />
);</p></blockquote>
<p>Suponiendo que tenemos una cola llamada Pruebas, para añadirle un agente que sea un usuario SIP llamado &#8216;agente&#8217;, simplemente añadiríamos lo siguiente:</p>
<blockquote><p>insert into queue_member_table(queue_name,interface,penalty) values(&#8217;Pruebas&#8217;,'SIP/agente&#8217;,1);</p></blockquote>
<p>Ahora, para permitir la conexión/desconexión a más de 1 cola, es necesario recorrer varias filas de una consulta la tabla creada, por lo que la manera más cómoda es usar un AGI. Para ello creamos el programa queue-loginout.php (que dejaremos en el directorio /var/lib/asterisk/agi-bin) y que contendrá lo siguiente:</p>
<blockquote><p>#!/usr/bin/php -q<br />
&lt;?php<br />
require(&#8221;/var/www/db.php&#8221;);</p>
<p>$dbfile = &#8220;/var/lib/asterisk/asteriskdb-sqlite.db&#8221;;</p>
<p>$results = execute_query($dbfile, &#8220;select queue_name,penalty from queue_agent_table where interface=&#8217;SIP/$argv[2]&#8216;&#8221;);</p>
<p>$stdout = fopen(&#8217;php://stdout&#8217;, &#8216;w&#8217;);</p>
<p>for($i = 0; $i &lt; count($results); $i ++) {<br />
$name = $results[$i]['queue_name'];<br />
$pen = $results[$i]['penalty'];</p>
<p>if($argv[1] == &#8220;login&#8221;) {<br />
fputs($stdout,&#8221;EXEC AddQueueMember $name|SIP/$argv[2]|$pen<br />
&#8220;);<br />
} else if($argv[1] == &#8220;logout&#8221;) {<br />
fputs($stdout,&#8221;EXEC RemoveQueueMember $name|SIP/$argv[2]<br />
&#8220;);<br />
} else if($argv[1] == &#8220;pause&#8221;) {<br />
fputs($stdout,&#8221;EXEC PauseQueueMember $name|SIP/$argv[2]<br />
&#8220;);<br />
} else if($argv[1] == &#8220;unpause&#8221;) {<br />
fputs($stdout,&#8221;EXEC UnpauseQueueMember $name|SIP/$argv[2]<br />
&#8220;);<br />
}<br />
}<br />
fflush($stdout);<br />
?&gt;</p></blockquote>
<p>El script de AGI recibe dos argumentos, el primero es la operación que se quiere realizar, y el segundo el nombre del usuario SIP. El fichero que se incluye simplemente tiene unas funciones de ayuda para hacer consultas a la BD.</p>
<p>Ahora simplemente nos quedaría hacer uso de este script de AGI desde nuestro dialplan. Para ello podemos crear por ejemplo la extensión *10 que es la que gestionará todo lo relacionado con las colas de llamadas (en el ejemplo lo único que hacemos es saltar a un contexto, donde se recupera el usuario SIP que hace la llamada, y se espera un número del 1 al 4 que es el que indica la operación a hacer):</p>
<blockquote><p>exten =&gt; *10,1,Goto(queue-loginout,s,1)</p>
<p>[queue-loginout]<br />
exten =&gt; s,1,Set(foo=${CUT(CHANNEL,,1)})<br />
exten =&gt; s,n,Set(username=${CUT(foo,/,2)})<br />
exten =&gt; s,n,Read(opt,,1)<br />
exten =&gt; s,n,Goto(${opt},1)</p>
<p>exten =&gt; 1,1,AGI(queue-loginout.php,login,${username})<br />
exten =&gt; 1,n,Hangup</p>
<p>exten =&gt; 2,1,AGI(queue-loginout.php,logout,${username})<br />
exten =&gt; 2,n,Hangup</p>
<p>exten =&gt; 3,1,AGI(queue-loginout.php,pause,${username})<br />
exten =&gt; 3,n,Hangup</p>
<p>exten =&gt; 4,1,AGI(queue-loginout.php,unpause,${username})<br />
exten =&gt; 4,n,Hangup</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blogs.diaple.com/roberto/2008/07/mi-primer-agi-en-php-para-loginlogout-multiple-en-colas/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Uniendo SQLite con Asterisk</title>
		<link>http://blogs.diaple.com/roberto/2008/07/uniendo-sqlite-con-asterisk/</link>
		<comments>http://blogs.diaple.com/roberto/2008/07/uniendo-sqlite-con-asterisk/#comments</comments>
		<pubDate>Mon, 28 Jul 2008 09:00:36 +0000</pubDate>
		<dc:creator>roberto</dc:creator>
		
		<category><![CDATA[Asterisk]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[Sistemas]]></category>

		<category><![CDATA[Software Libre]]></category>

		<category><![CDATA[sqlite3 odbc asterisk realtime cdr]]></category>

		<guid isPermaLink="false">http://blogs.diaple.com/roberto/?p=6</guid>
		<description><![CDATA[En un artículo anterior, aprendimos a utilizar un poco por encima SQLite y a acceder a una BD de este tipo mediante unixODBC. En este artículo veremos como utilizar esto para acceder a una BD SQLite desde Asterisk.
Para poder acceder a una BD externa desde Asterisk mediante ODBC, necesitamos tener cargado el módulo res_odbc.so que [...]]]></description>
			<content:encoded><![CDATA[<p>En un <a href="http://blogs.diaple.com/roberto/2008/07/sqlite-odbc-linux/">artículo anterior</a>, aprendimos a utilizar un poco por encima SQLite y a acceder a una BD de este tipo mediante unixODBC. En este artículo veremos como utilizar esto para acceder a una BD SQLite desde Asterisk.</p>
<p>Para poder acceder a una BD externa desde Asterisk mediante ODBC, necesitamos tener cargado el módulo res_odbc.so que se configura mediante el fichero <em>/etc/asterisk/res_odbc.conf</em></p>
<p><span id="more-6"></span></p>
<p>Si hemos creado una entrada en <em>/etc/odbc.ini</em> con el nombre <strong>asteriskdb-sqlite</strong>, podemos usar esto poniendo otra entrada en el fichero res_odbc.conf tal que así:</p>
<blockquote><p>[asteriskdb]<br />
enabled =&gt; yes<br />
dsn =&gt; <strong>asteriskdb-sqlite</strong></p></blockquote>
<p>A partir de aquí ya podemos empezar a usar desde Asterisk nuestra BD SQLite.</p>
<p>Como ejemplo, vamos a ver como enlazarla para ser usada desde el CDR y desde Realtime, para ello tenemos un fichero sql con las tablas necesarias preparadas para SQLite <a href="http://www.diaple.com/voip/downloads/asterisk-sqlite.sql">aquí</a>.</p>
<p>Una vez creada la estructura de la base de datos, vamos a enlazar en primer lugar el CDR, para ello únicamente tenemos que editar el fichero <em>/etc/asterisk/cdr_odbc.conf </em>y añadir lo siguiente:</p>
<blockquote><p>[global]<br />
dsn=asteriskdb-sqlite<br />
table=cdr</p></blockquote>
<p>A partir de esto, los detalles de las llamadas de nuestra centralita se irán almacenando en la tabla cdr de nuestra base de datos SQLite.</p>
<p>Ahora, vamos a hacer que la configuración de usuarios SIP, conferencias, buzones de voz y colas de llamadas, estén en el resto de tablas que hemos creado en nuestra base de datos. Para ello, editaremos el fichero <em>/etc/asterisk/extconfig.conf </em>y lo dejaremos tal que así:</p>
<blockquote><p>[settings]<br />
sipusers =&gt; odbc,asteriskdb,sip_buddies<br />
sippeers =&gt; odbc,asteriskdb,sip_buddies<br />
voicemail =&gt; odbc,asteriskdb,voicemail_users<br />
meetme =&gt; odbc,asteriskdb,meetme<br />
queues =&gt; odbc,asteriskdb,queue_table<br />
queue_members =&gt; odbc,asteriskdb,queue_member_table</p></blockquote>
<p>Para probar que esto funciona, podemos añadir un usuario SIP a nuestra tabla:</p>
<blockquote><p>sqlite&gt; insert into sip_buddies(name,secret) values(&#8217;prueba&#8217;,'prueba&#8217;);</p></blockquote>
<p>Y comprobamos que existe desde el CLI:</p>
<blockquote><p>CLI&gt; sip show peer prueba load</p>
<p>* Name       : prueba<br />
Realtime peer: No<br />
Secret       : &lt;Set&gt;<br />
MD5Secret    : &lt;Not set&gt;<br />
Context      : default<br />
Subscr.Cont. : internal<br />
Language     : es<br />
AMA flags    : Unknown<br />
Transfer mode: open<br />
CallingPres  : Presentation Allowed, Not Screened<br />
Callgroup    :<br />
Pickupgroup  :<br />
Mailbox      :<br />
VM Extension : asterisk<br />
LastMsgsSent : 32767/65535<br />
Call limit   : 0<br />
Dynamic      : No<br />
Callerid     : &#8220;&#8221; &lt;&gt;<br />
MaxCallBR    : 384 kbps<br />
Expire       : -1<br />
Insecure     : no<br />
Nat          : RFC3581<br />
ACL          : No<br />
T38 pt UDPTL : No<br />
CanReinvite  : Yes<br />
PromiscRedir : No<br />
User=Phone   : No<br />
Video Support: No<br />
Trust RPID   : No<br />
Send RPID    : No<br />
Subscriptions: Yes<br />
Overlap dial : Yes<br />
DTMFmode     : rfc2833<br />
LastMsg      : 0<br />
ToHost       :<br />
Addr-&gt;IP     : (Unspecified) Port 0<br />
Defaddr-&gt;IP  : 0.0.0.0 Port 0<br />
Def. Username:<br />
SIP Options  : (none)<br />
Codecs       : 0&#215;3f1fff (g723|gsm|ulaw|alaw|g726|adpcm|slin|lpc10|g729|speex|ilbc|g726aal2|g722|jpeg|png|h261|h263|h263p|h264)<br />
Codec Order  : (none)<br />
Auto-Framing:  No<br />
Status       : UNKNOWN<br />
Useragent    :<br />
Reg. Contact :</p></blockquote>
<p>Y de momento esto es todo.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.diaple.com/roberto/2008/07/uniendo-sqlite-con-asterisk/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Asus EEE PC, mucho por poco</title>
		<link>http://blogs.diaple.com/roberto/2008/07/asus-eee-pc-mucho-por-poco/</link>
		<comments>http://blogs.diaple.com/roberto/2008/07/asus-eee-pc-mucho-por-poco/#comments</comments>
		<pubDate>Fri, 11 Jul 2008 11:09:46 +0000</pubDate>
		<dc:creator>roberto</dc:creator>
		
		<category><![CDATA[Hardware]]></category>

		<category><![CDATA[Internet]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[asus eee umpc]]></category>

		<guid isPermaLink="false">http://blogs.diaple.com/roberto/?p=5</guid>
		<description><![CDATA[Hasta ayer he podido disfrutar durante una semana de un Asus EEE PC con Linux por gentileza de faqmac.com y voy a contar a grandes rasgos las cosas que más me han gustado, y las que más he echado en falta en este gadget tan apetecible.
Para el que aún no haya oído hablar de él, [...]]]></description>
			<content:encoded><![CDATA[<p>Hasta ayer he podido disfrutar durante una semana de un <a title="Asus EE PC" href="http://es.asus.com/products.aspx?l1=24&amp;l2=163&amp;l3=0&amp;l4=0&amp;model=2279&amp;modelmenu=1">Asus EEE PC</a> con Linux por gentileza de <a href="http://www.faq-mac.com">faqmac.com</a> y voy a contar a grandes rasgos las cosas que más me han gustado, y las que más he echado en falta en este gadget tan apetecible.</p>
<p>Para el que aún no haya oído hablar de él, y si está leyendo este blog será raro, se trata de un portátil ultramóvil (que mal suena la traducción de UMPC :-D) de bajo coste (menos de 300€)  y con la posibilidad de comprarlo con Linux. Además, lleva un disco SSD (de estado sólido, como las memorias de las cámaras de fotos) lo que mejora los tiempos de acceso al mismo.</p>
<p><span id="more-5"></span></p>
<p>La primera y grata impresión en cuanto lo enciendes, es lo rápido que puedes empezar a trabajar con él. Acostumbrado a tiempos de arranque mucho más elevados, prácticamente parece que esté más en standby que apagado. No me he puesto a cronométrarlo, pero por ahí se comenta que está en torno a 15 segundos. Esto se debe fundamentalmente a su disco SSD.</p>
<p>El sistema operativo que ejecuta la versión de Linux se trata de <a href="http://www.xandros.com"> </a><a href="http://www.xandros.com">Xandros</a> y carga un entorno gráfico muy orientado a personas que puede que no se hayan acercado a Linux en su vida. En primer lugar, ese me parece uno de los puntos fuertes, la facilidad y usabilidad para un usuario novel de su interfaz gráfico, todo muy bien ordenado y a golpe de como mucho un par de clicks.</p>
<p>Una vez cargado el entorno, la primera prueba era obligada, conociendo sus especificaciones técnicas (menos de 1GHz de velocidad de procesador y 512MB de RAM), había que probar como se desenvolvía ejecutando OpenOffice. Una nueva sorpresa derivada de su disco SSD, el programa se abre más rápido que lo que lo hace en otros equipos con mucho más procesador y memoria.</p>
<p>Este entorno gráfico es posible cambiarlo por un KDE estándar para los usuarios que lo prefieran. En mi caso preferí no hacer cambios pero no es demasiado complicado de hacer, aunque para ello deberemos hacer uso del terminal (que está accesible mediante la combinación Ctrl+Alt+T).</p>
<p>La interacción con el dispositivo, en líneas generales no es mala, aunque habría detalles mejorables tanto del teclado (¿dónde se ha visto que la tecla grande del Shift sea la de la izquierda y no la de la derecha?) como del touchpad, que no es del todo preciso en todas las ocasiones.</p>
<p>Otra de las sorpresas fue la webcam integrada, sobre la que no tenía muchas expectativas, y que sin embargo daba bastante buena calidad de imagen (mejor que webcams USB de precio medio), y que además viene perfectamente configurada para empezar a usarla sin saber nada de kernels y módulos de Linux ni cosas así. Aunque no sea un usuario de este tipo de dispositivos, sí que creo que es un punto a favor si busca el mercado de gente que usa el ordenador básicamente para navegar, leer el correo y chatear.</p>
<p>Desde el punto de vista de la conectividad, algo básico en un dispositivo así, no conseguí conectarlo a redes inalámbricas protegidas con WPA2 ni WPA. Con WEP no pude probar. Esto es algo que se debería mejorar de manera urgente.</p>
<p>Respecto a la autonomía de la batería, Asus dice que son unas 3 horas, aunque como en todos estos dispositivos, la cosa depende de si empezamos a usar la tarjeta wifi, o conectamos un monitor externo al puerto VGA.</p>
<p>Y empecemos con las cosas que creo que harían de este dispositivo una solución aún mucho mejor (de hecho alguna de ellas se han incorporado en el hermano mayor, que a saber cuando llegar a España). En primer lugar se echa en falta conectividad Bluetooth, básica por ejemplo para conectar con un móvil 3G y tener acceso a Internet allí donde no haya redes Wifi disponibles.</p>
<p>Otra cosa que debería mejorar es la resolución máxima de la tarjeta gráfica, ya que aunque para la pantalla integrada es suficiente, en cuanto conectas la salida a un monitor externo, el 1024&#215;768 que da se queda corto en la mayoría de monitores que hay hoy en el mercado, lo que es un verdadero problema al tener que usarlos a una resolución no nativa, lo que provoca la consiguiente pérdida de calidad de imagen.</p>
<p>El disco incluido de 4GB se queda un pelín corto, tal vez con uno de 8GB sería más que suficiente para la mayoría de usos que se pueden hacer de este portátil. Sí, tenemos el lector de tarjetas, pero veo más eso como una forma de poder pasar nuestras fotos desde cámaras digitales que como un almacenamiento real.</p>
<p>Pocas pegas más se le pueden poner a este dispositivo, y más teniendo en cuenta el precio por el que podemos tenerlo. Desde mi punto de vista es perfecto como dispositivo para acceder a Internet desde cualquier sitio y sobretodo para situaciones donde la movilidad es muy importante, como por ejemplo poderte mover por un CPD con cierta soltura. En definitica, que se trata de un soplo de aire fresco para los que pensábamos que el mercado de portátiles se estaba desmadrando con la tendencia hacia lo que yo llamo &#8220;portables&#8221; o &#8220;ordenadores de sobremesa plegables&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.diaple.com/roberto/2008/07/asus-eee-pc-mucho-por-poco/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SQLite y ODBC en Linux</title>
		<link>http://blogs.diaple.com/roberto/2008/07/sqlite-odbc-linux/</link>
		<comments>http://blogs.diaple.com/roberto/2008/07/sqlite-odbc-linux/#comments</comments>
		<pubDate>Fri, 11 Jul 2008 10:13:14 +0000</pubDate>
		<dc:creator>roberto</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[Sistemas]]></category>

		<category><![CDATA[Software Libre]]></category>

		<category><![CDATA[sqlite unixodbc]]></category>

		<guid isPermaLink="false">http://blogs.diaple.com/roberto/?p=4</guid>
		<description><![CDATA[Bueno, tras la presentación, empecemos a hablar de cosas interesantes.
Como base para futuros artículos donde hablaré de como aprovechar lo aprendido aquí, y como quiero empezar muy poco a poco para no hacer artículos especialmente farragosos, a continuación explicaré como conectar mediante unixODBC (el middleware equivalente en Linux al famoso ODBC de Windows) a una [...]]]></description>
			<content:encoded><![CDATA[<p>Bueno, tras la presentación, empecemos a hablar de cosas interesantes.</p>
<p>Como base para futuros artículos donde hablaré de como aprovechar lo aprendido aquí, y como quiero empezar muy poco a poco para no hacer artículos especialmente farragosos, a continuación explicaré como conectar mediante <a title="unixODBC" href="http://www.unixodbc.org">unixODBC</a> (el middleware equivalente en Linux al famoso ODBC de Windows) a una BD <a title="SQLite" href="http://www.sqlite.org/">SQLite</a>.</p>
<p>SQLite es un sistema gestor de BD que requiere muy poco espacio en disco, y que es muy simple de utilizar, ya que las BD son directamente un fichero. Por su simplicidad, son perfectas para su uso en sistemas empotrados o appliances.</p>
<p><span id="more-4"></span></p>
<p>Para instalar ambos paquetes, en Ubuntu lo podemos hacer directamente con nuestro querido apt-get (en otras distribuciones podrá variar el nombre del paquete, pero seguro que estarán disponibles ambos también):</p>
<blockquote><p># apt-get install sqlite3 libsqliteodbc unixodbc</p></blockquote>
<p>Una vez instalados ambos paquetes, y la librería que permite el acceso a SQLite desde unixODBC, tenemos que configurar el uso de dicha librería. Para ello, en unixODBC se usa el fichero <em>/etc/odbcinst.ini </em>en el que añadiremos los dos siguientes bloques:</p>
<blockquote><p>[SQLite]<br />
Description = SQLite ODBC Driver<br />
Driver = /usr/lib/odbc/libsqliteodbc.so<br />
Setup = /usr/lib/odbc/libsqliteodbc.so<br />
UsageCount = 1</p>
<p>[SQLite3]<br />
Description = SQLite3 ODBC Driver<br />
Driver = /usr/lib/odbc/libsqlite3odbc.so<br />
Setup = /usr/lib/odbc/libsqlite3odbc.so<br />
UsageCount = 1</p></blockquote>
<p>Una vez hecho esto, ya podemos crear nuestra primera BD, para ello simplemente crearemos el fichero vacío:</p>
<blockquote><p># touch /tmp/mibd</p></blockquote>
<p>Para configurar el acceso a esta BD, usaremos el fichero <em>/etc/odbc.ini </em>donde pondremos los siguiente (el valor entre corchetes es el DSN que utilizaremos para conectarnos):</p>
<blockquote><p>[mibd-sqlite]<br />
Description = My SQLite test database<br />
Driver = SQLite3<br />
Database = /tmp/mibd<br />
Timeout = 2000</p></blockquote>
<p>Para probar que tenemos acceso a nuestra BD, podemos probar con lo siguiente:</p>
<blockquote><p># isql midb-sqlite</p></blockquote>
<p>Que nos devolverá un prompt donde podremos escribir nuestras consulta SQL al servidor.</p>
<p>El control de acceso y autorización es tan sencillo como el control de permisos y de usuario del fichero que contiene la BD. Así que a jugar con <em>chmod</em> y <em>chown</em>.</p>
<p>Por el momento nada más, a disfrutar de esta magnífica solución para almacenamiento de datos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.diaple.com/roberto/2008/07/sqlite-odbc-linux/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Empiezo mi blog</title>
		<link>http://blogs.diaple.com/roberto/2008/07/empiezo-mi-blog/</link>
		<comments>http://blogs.diaple.com/roberto/2008/07/empiezo-mi-blog/#comments</comments>
		<pubDate>Thu, 03 Jul 2008 16:28:51 +0000</pubDate>
		<dc:creator>roberto</dc:creator>
		
		<category><![CDATA[Sin categoría]]></category>

		<guid isPermaLink="false">http://blogs.diaple.com/roberto/?p=3</guid>
		<description><![CDATA[Bueno, pues después de pensarlo durante mucho tiempo, por fin me he decidido, he instalado un wordpress para la empresa, y he creado mi blog personal donde ir compartiendo mis experiencias diarias dentro del mundo de las nuevas tecnologías.

Para empezar la primera ha sido con el wordpress, que yo creía que sería más sencillo montarlo en castellano, y preparado para multiusuario, pero ya he podido ver que no es así. De momento la interfaz se queda en inglés, y cuando tenga un rato traduciré el tema que he usado a nuestro idioma.]]></description>
			<content:encoded><![CDATA[<p>Bueno, pues después de pensarlo durante mucho tiempo, por fin me he decidido, he instalado un wordpress para la empresa, y he creado mi blog personal donde ir compartiendo mis experiencias diarias dentro del mundo de las nuevas tecnologías.</p>
<p>Para empezar la primera ha sido con el wordpress, que yo creía que sería más sencillo montarlo en castellano, y preparado para multiusuario, pero ya he podido ver que no es así. De momento la interfaz se queda en inglés, y cuando tenga un rato traduciré el tema que he usado a nuestro idioma.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.diaple.com/roberto/2008/07/empiezo-mi-blog/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

