<?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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>blog.voz-ip.com</title>
	<atom:link href="http://blog.voz-ip.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.voz-ip.com</link>
	<description>Tu blog de Voz Ip y Asterisk</description>
	<pubDate>Fri, 20 Aug 2010 08:39:46 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Nuevas funcionalidades de Callcenter en Asterisk-ES-RSP</title>
		<link>http://blog.voz-ip.com/2010/nuevas-funcionalidades-de-callcenter-en-asterisk-es-rsp/</link>
		<comments>http://blog.voz-ip.com/2010/nuevas-funcionalidades-de-callcenter-en-asterisk-es-rsp/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 09:49:23 +0000</pubDate>
		<dc:creator>Jose Millan</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.voz-ip.com/?p=248</guid>
		<description><![CDATA[
Tal y como comentábamos en su inicio, Asterisk-ES-RSP continua aportando su granito de arena corrigiendo bugs que reporta la comunidad e implementando funcionalidades interesantes, inexistentes en la versión base de esta release.
Para aquellos que aún no lo sepáis, el código fuente de Asterisk se descarga ahora del repositorio de Digium y después son aplicados los [...]]]></description>
			<content:encoded><![CDATA[<p style="margin-bottom: 0cm;">
<p>Tal y como comentábamos en su inicio, Asterisk-ES-RSP continua aportando su granito de arena corrigiendo bugs que reporta la comunidad e implementando funcionalidades interesantes, inexistentes en la versión base de esta release.</p>
<p style="margin-bottom: 0cm;">Para aquellos que aún no lo sepáis, el código fuente de Asterisk se descarga ahora del repositorio de Digium y después son aplicados los parches creados por el grupo. Todo esto se lleva a cabo a través del <a title="autopatcher" href="http://asterisk-es-rsp.org/doku.php/instalacion:autopatcher" target="_blank">autopatcher</a>. Después de la descarga del código y la aplicación de parches, la instalación de Asterisk no varía con respecto al método habitual.</p>
<p style="margin-bottom: 0cm;">Recién salidos del horno, comentamos tres nuevos parches ya commiteados y otros dos a la espera de ser probados por todo aquel que esté interesado en ellos. Esta vez nos hemos centrado en la cara más &#8216;callcenter&#8217; de Asterisk.  Los últimos parches commiteados son los siguientes:</p>
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm;">- Bugfix: <strong>Solución del segfault generado al hacer una transferencia en asterisk-es-rsp desde una sala de conferencias</strong>.</p>
<p style="margin-bottom: 0cm;">Una pequeña modificación en el parche chan_sip-ironxfers.patch evita los segmentation faults en este escenario.</p>
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm;">- Feature<strong>: Backport del soporte de shared_lastcall para colas.</strong></p>
<p style="margin-bottom: 0cm;">Seguramente más de uno de vosotros ha tenido problemas al tener un agente atendiendo varias colas  con diferente tiempo administrativo. Asterisk consulta el tiempo de la última llamada atendida por el agente y verifica si éste es superior al tiempo administrativo (wrapuptime) de la cola que se tiene que atender ahora, sin tener en cuenta el wrapuptime de la cola donde fue atendida.</p>
<p style="margin-bottom: 0cm;">Desde las versiones más recientes de Asterisk, nos hemos traído esta funcionalidad que hace cuadrar los tiempos administrativos de los agentes en este escenario.</p>
<p style="margin-bottom: 0cm;">Esta funcionalidad hace que la disponibilidad del agente sea calculada en función del tiempo administrativo de la última cola atendida y no aquel de la cola que se quiere atender.</p>
<p style="margin-bottom: 0cm;">1 Point!</p>
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm;">- Feature: <strong>Backport de la opción &#8216;R&#8217; de la aplicación &#8216;Queue&#8217;</strong>.</p>
<p style="margin-bottom: 0cm;">Para aquellos que buscáis el comportamiento de los callcenters tradicionales, esta funcionalidad hace que el llamante escuche tono de llamada en lugar de música en espera cuando el terminal del agente está sonando.</p>
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm;">Ya podéis disfrutar de estás funcionalidades siguiendo estas <a title="autopatcher_howto" href="http://asterisk-es-rsp.org/doku.php/instalacion:autopatcher#instalacion" target="_blank">instrucciones</a>.</p>
<p style="margin-bottom: 0cm;">Recordad que el branch a descargar sería el siguiente: <em>http://asterisk-es-rsp.irontec.com/svn/asterisk-es-rsp/branches/asterisk/1.4.24.1/autopatcher/ </em></p>
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm;">A continuación listamos los nuevos parches subidos al team doktore y que están siendo probados  antes de ser commiteados:</p>
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm;">- Feature:<strong> Backport de la función QUEUE_MEMBER</strong>.</p>
<p style="margin-bottom: 0cm;">Nos gusta saber si hay agentes disponibles antes de meter la llamada en cola. Por ello hemos añadido esta funcionalidad. Si conocemos la disponibilidad de los agentes antes de entrar en cola, podemos mandar la llamada a otra cola donde sí pueda ser atendida inmediatamente y así mejorar el nivel de servicio. Por otra parte, si sabemos antes de entrar en la cola que todos los agentes están ocupados podemos advertírselo al llamante con una locución antes de ejecutar la aplicación &#8216;Queue&#8217;.</p>
<p style="margin-bottom: 0cm;">Como aditivo a la función original, este parche hace uso de la funcionalidad shared_lastcall comentada anteriormente para tener en cuenta los escenarios de agentes atendiendo múltiples colas.</p>
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm;">- Feature: <strong>Mostrar el &#8217;state_interface&#8217; del miembro de la cola al hacer un &#8216;queue show&#8217; desde el CLI</strong>.</p>
<p style="margin-bottom: 0cm;">Esteroides para complementar el primer parche de asterisk-rsp (app_queue-state_interface.patch). El nuevo parche (app_queue-state_interface-queueshow.patch) nos permite ver desde consola el interfaz de estado de un miembro definido como Local/ y así conocer el terminal desde donde está atendiendo las llamadas. Supongo que aquellos que trabajéis con grandes callcenters lo agradeceréis!</p>
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm;">Para aquellos que queráis probar estos dos últimos parches podéis descargaros este <a title="autopatcher_doktore" href="http://asterisk-es-rsp.irontec.com/svn/asterisk-es-rsp/team/doktore/autopatcher_new" target="_blank">autopatcher</a> modificado que los aplica y después instalar Asterisk  del mismo modo que siempre.</p>
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm;">Esto es todo! Felicidades a asterisk-es-rsp y gracias por vuestro feedback y vuestros bug reports!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.voz-ip.com/2010/nuevas-funcionalidades-de-callcenter-en-asterisk-es-rsp/feed/</wfw:commentRss>
		</item>
		<item>
		<title>BYE sip:AstriCon209&#8230;</title>
		<link>http://blog.voz-ip.com/2009/bye-sipastricon209/</link>
		<comments>http://blog.voz-ip.com/2009/bye-sipastricon209/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 05:53:12 +0000</pubDate>
		<dc:creator>saghul</dc:creator>
		
		<category><![CDATA[Asterisk]]></category>

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

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

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

		<guid isPermaLink="false">http://blog.voz-ip.com/?p=240</guid>
		<description><![CDATA[Por fin e conseguido algo de Internet (en Las Vegas mucho casino pero poco WiFi  ) y puedo comentar lo que viví durante tres días en el AstriCon.
En una palabra (en inglés): awesome! Creo que no podía haber estado mejor. Me lo he pasado en grande y he tenido la ocasión de conocer a [...]]]></description>
			<content:encoded><![CDATA[<p>Por fin e conseguido algo de Internet (en Las Vegas mucho casino pero poco WiFi <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> ) y puedo comentar lo que viví durante tres días en el <a href="http://www.astricon.net" target="_blank">AstriCon</a>.</p>
<p><img class="alignnone size-medium wp-image-241" title="4013543198_dd22dc90cb_b" src="http://blog.voz-ip.com/wp-content/uploads/2009/10/4013543198_dd22dc90cb_b-300x225.jpg" alt="4013543198_dd22dc90cb_b" width="300" height="225" />En una palabra (en inglés): awesome! Creo que no podía haber estado mejor. Me lo he pasado en grande y he tenido la ocasión de conocer a gente muy interesante y de poder intercambiar experiencias con otros tantos AstriFrikis.</p>
<p>El plato fuerte del AstriCon suelen ser las charlas y así ha sido éste año. No obstante, éste año no han ido tan ligadas al lado técnico y he tenido la ocasión de asistir a charlas <em>extrañamente interesantes</em> como por ejemplo chan_skype + Google Wave (con IAX2 de por medio) y el API de calendarios de Asterisk. He podido comprobar (con alegría) que finalmente el API de calendarios de Asterisk no es nada intrusivo con el core y se ha quedado en cuatro <em>resource modules</em>. Bien. También me sorprendió mucho la charla sobre <a href="http://openbts.sourceforge.net/" target="_blank">OpenBTS</a>, pero hay charlas y charlas y esa si que era de las segundas. <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Otro de los puntos importantes era el hecho de que Asterisk cumpliera 10 años. Se armó una buena fiesta, con concurso, tarta, ¡y salchichas para todos! No faltó de nada, hasta nos dieron una medalla y un collar a lo hawaiano <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Por último he de agradecer a todos el apoyo mostrado antes y tras el par de charlas que tuve la ocasión de dar. No me lo esperaba así ni en el mejor de mis sueños, ¡gracias!</p>
<p>A todo esto, ¿ya sabréis donde hay que ir de vacaciones el año que viene no? ¡Al AstriCon 2010!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.voz-ip.com/2009/bye-sipastricon209/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Log en Asterisk</title>
		<link>http://blog.voz-ip.com/2009/log-en-asterisk/</link>
		<comments>http://blog.voz-ip.com/2009/log-en-asterisk/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 09:31:52 +0000</pubDate>
		<dc:creator>Jon Bonilla</dc:creator>
		
		<category><![CDATA[Asterisk]]></category>

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

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

		<guid isPermaLink="false">http://blog.voz-ip.com/?p=173</guid>
		<description><![CDATA[A menudo cuando una centralita tiene alta carga, ver la consola o los logs que genera Asterisk en /var/log/asterisk/messages no es suficiente. Porque se genera gran cantidad de información, porque al tener muchas llamadas concurrentes seguir una llamada en concreto a través de saltos en un fichero es complicado, porque a medida que integramos más [...]]]></description>
			<content:encoded><![CDATA[<p>A menudo cuando una centralita tiene alta carga, ver la consola o los logs que genera Asterisk en <em>/var/log/asterisk/messages</em> no es suficiente. Porque se genera gran cantidad de información, porque al tener muchas llamadas concurrentes seguir una llamada en concreto a través de saltos en un fichero es complicado, porque a medida que integramos más y más herramientas con Asterisk las llamadas ya no se controlan o se localizan en un único punto&#8230;</p>
<p>Lo que vamos a intentar es tener controlado el log de todo el sistema, incluyendo Asterisk, su dialplan, los agis y cualesquira herramientas que usemos. Los objetivos son claros:</p>
<ul>
<li>Tener todos los logs relevantes en un lugar unificado de tal forma que podamos seguir la pista a las llamadas o a los errores sin tener que hacer merges mentales de múltiples fuentes.</li>
<li>Tener los logs marcados y clasificados de tal forma que podamos encontrar de forma cómoda y sencilla cualquier información puntual que necesitemos.</li>
<li>Loguear todo lo que ocurre en la plataforma remotamente relacionado con el flujo de las llamadas y el correcto funcionamiento de las mismas.</li>
</ul>
<p>En este post vamos a ver un ejemplo de cómo hacer esto con un criterio arbitrario. Se pretende que cualquira pueda adaptar este ejemplo a sus necesidades. En este ejemplo vamos a querer:</p>
<ol>
<li>Los logs generales del sistema para ver que todo es correcto. Esto es, el syslog. Deberemos filtrar cúales de los servicios del sistema que loguean al syslog queremos ver y cuáles no.</li>
<li>Los logs relacionados con el flujo de una llamada. En este caso vamos a suponer que dialplan y agis.</li>
</ol>
<p>Todo esto lo vamos a hacer a través del syslog del sistema y las opciones que nos brinda para filtrar y etiquetar los logs.  ¡Manos a la obra!</p>
<p><span id="more-173"></span></p>
<h2>Logger de Asterisk</h2>
<p>Asterisk tiene una herramienta para configurar los logs que genera. Se configura en el fichero <em>logger.conf</em>. En el fichero podemos configurar los niveles de log que queremos que asterisk muestre en consola, en el fichero <em>messages</em> y en el syslog. Independientemente de lo que habilitemos para consola y para el fichero <em>messages</em> -nunca hay suficientes logs- vamos a activar y configurar el logging a syslog de tal forma que asterisk loguee ahí los errores y los warnigs. No nos interesa más información porque el log de los flujos de llamada lo vamos a gestionar de forma manual a fin de tener la información que nosotros deseamos de una forma más limpia.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0"><span class="br0">&#91;</span>general<span class="br0">&#93;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0"><span class="br0">&#91;</span>logfiles<span class="br0">&#93;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">console </span>=<span class="re2">&gt; notice,warning,error,verbose</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">messages </span>=<span class="re2">&gt; notice,warning,error,verbose,debug,dtmf</span></div>
</li>
<li class="li2">
<div class="de2">syslog.<span class="re1">local5 </span>=<span class="re2">&gt; warning,error</span></div>
</li>
</ol>
</div>
<p>Como se puede ver, las dos primeras líneas hacen referencia al CLI y al log normal de Asterisk. La última línea, que es la que usaremos, indica a Asterisk que loguee los mensajes de severidad Error y Warning a syslog con la facility Local5. De esta forma ya podremos ver en el syslog errores de parseo, de los channels, si no hemos cerrado un paréntesis y demás. Pero no podremos seguir el flujo de las llamadas ya que no tenemos ni verbose ni debug.</p>
<p>Este sería un ejemplo de lo que aparece en syslog cuando se hace un <em>dialplan reload</em> de Asterisk:</p>
<pre>Oct 16 09:51:35 callcenter asterisk[15238]: WARNING[15309]: pbx_config.c:2276 in pbx_load_config: No closing parenthesis found? 'Macro(setgroup-in'</pre>
<p>En vez de ver todo el reload en la consola con todas las extensiones, veo que me he dejado un paréntesis sin cerrar en el dialplan. Lo mismo pasaría para el resto de errores y warnings comunes durante las llamadas.</p>
<h2>Log de los Agis</h2>
<p>Cada vez más, a medida que desarrollamos nuestro Asterisk para darle más funcionalidades, debemos ejecutar más Agis. Los Agis son parte normal del flujo de una llamada y por tanto es de esperar que si queremos seguir la pista a cuanto ocurre en las llamadas de la centralita, sepamos lo que pasa dentro de esos Agi.</p>
<p>Todos los leguajes de programación tienen sus funciones para loguear a syslog. En este ejemplo vamos a usar Agis escritos en PHP. Generamos una pequeña clase que gestione los logs tal y como queremos que aparezcan en nuestros ficheros:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> ivLogger <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <a href="http://www.php.net/static"><span class="kw3">static</span></a> <span class="kw2">function</span> doLog<span class="br0">&#40;</span><span class="re0">$uid</span>, <span class="re0">$file</span>, <span class="re0">$ref</span>, <span class="re0">$level</span>, <span class="re0">$str</span> = <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$ftmp</span> = <a href="http://www.php.net/explode"><span class="kw3">explode</span></a><span class="br0">&#40;</span><span class="st0">&quot;/&quot;</span>, <span class="re0">$file</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$f</span> = <span class="re0">$ftmp</span><span class="br0">&#91;</span><a href="http://www.php.net/count"><span class="kw3">count</span></a><span class="br0">&#40;</span><span class="re0">$ftmp</span><span class="br0">&#41;</span><span class="nu0">-1</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$uid</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$logmsg</span> = <span class="st0">&quot;[$f][$ref] $str&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$logmsg</span> = <span class="st0">&quot;[$uid][$f][$ref] $str&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/openlog"><span class="kw3">openlog</span></a><span class="br0">&#40;</span><span class="st0">&quot;ivozlog&quot;</span>, LOG_ODELAY, LOG_LOCAL6<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @<a href="http://www.php.net/syslog"><span class="kw3">syslog</span></a><span class="br0">&#40;</span><span class="re0">$level</span>, <span class="re0">$logmsg</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/closelog"><span class="kw3">closelog</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$level</span> != LOG_DEBUG<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$host</span> = <a href="http://www.php.net/file_get_contents"><span class="kw3">file_get_contents</span></a><span class="br0">&#40;</span><span class="st0">&quot;/etc/hostname&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @<a href="http://www.php.net/mail"><span class="kw3">mail</span></a><span class="br0">&#40;</span><span class="st0">&quot;vozip@irontec.com&quot;</span>, <span class="st0">&quot;i::voz Logger [&quot;</span>.<a href="http://www.php.net/trim"><span class="kw3">trim</span></a><span class="br0">&#40;</span><span class="re0">$host</span><span class="br0">&#41;</span>.<span class="st0">&quot;]&quot;</span>, <span class="re0">$logmsg</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Tenemos una función doLog a la que podremos llamar para que loguee lo que nosotros le pasemos como parámetro al Syslog. Además, enviará un correo por todo mensaje que no sea de tipo DEBUG para avisar de que algo no funciona como debería. Sólo queda ver hacer llamadas de log en los Agi para tener el flujo controlado y logueado. Por ejemplo:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><a href="http://www.php.net/define"><span class="kw3">define</span></a><span class="br0">&#40;</span><span class="st0">&quot;CHK_KARMA&quot;</span>, <span class="st0">&quot;1&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/define"><span class="kw3">define</span></a><span class="br0">&#40;</span><span class="st0">&quot;DB_CON&quot;</span>, <span class="st0">&quot;asterisk&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st0">&quot;lib/autoload.php&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$uniqueid</span> = <span class="re0">$fastagi</span>-&gt;<span class="me1">request</span><span class="br0">&#91;</span><span class="st0">&#8216;agi_uniqueid&#8217;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* En FastAGI no tenemos que instanciar el AGI, nos viene dado en $fastagi */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/count"><span class="kw3">count</span></a><span class="br0">&#40;</span><span class="re0">$argx</span><span class="br0">&#41;</span> != <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; ivLogger::<span class="me2">doLog</span><span class="br0">&#40;</span><span class="re0">$uniqueid</span>,<span class="kw2">__FILE__</span>,<span class="kw2">__LINE__</span>,LOG_ERR,<span class="st0">&quot;El número de parámetros no coincide. Se han pasado &quot;</span>.<a href="http://www.php.net/count"><span class="kw3">count</span></a><span class="br0">&#40;</span><span class="re0">$argx</span><span class="br0">&#41;</span>.<span class="st0">&quot; parámetros.&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/exit"><span class="kw3">exit</span></a><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$usuario</span> = <span class="re0">$argx</span><span class="br0">&#91;</span><span class="st0">&#8216;usuario&#8217;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$fastagi</span>-&gt;<span class="me1">set_variable</span><span class="br0">&#40;</span><span class="st0">&quot;EXISTE_USUARIO&quot;</span>, <span class="st0">&quot;NO&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$sql</span> = <span class="st0">&quot;SELECT id_usuario FROM tablausuarios WHERE login = &#8216;&quot;</span>.<span class="re0">$usuario</span>.<span class="st0">&quot;&#8217; LIMIT 1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$con</span> = <span class="kw2">new</span> con<span class="br0">&#40;</span><span class="re0">$sql</span>, DB_CON<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">if</span> <span class="br0">&#40;</span>!<span class="re0">$con</span>-&gt;<span class="me1">getError</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$con</span>-&gt;<span class="me1">getNumRows</span><span class="br0">&#40;</span><span class="br0">&#41;</span> == <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$fastagi</span>-&gt;<span class="me1">set_variable</span><span class="br0">&#40;</span><span class="st0">&quot;EXISTE_USUARIO&quot;</span>, <span class="st0">&quot;SI&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ivLogger::<span class="me2">doLog</span><span class="br0">&#40;</span><span class="re0">$uniqueid</span>,<span class="kw2">__FILE__</span>,<span class="kw2">__LINE__</span>,LOG_DEBUG,<span class="st0">&quot;Existe el usuario &quot;</span>.<span class="re0">$usuario</span>.<span class="st0">&quot;.&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/exit"><span class="kw3">exit</span></a><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ivLogger::<span class="me2">doLog</span><span class="br0">&#40;</span><span class="re0">$uniqueid</span>,<span class="kw2">__FILE__</span>,<span class="kw2">__LINE__</span>,LOG_DEBUG,<span class="st0">&quot;No existe el usuario &quot;</span>.<span class="re0">$usuario</span>.<span class="st0">&quot;.&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/exit"><span class="kw3">exit</span></a><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; ivLogger::<span class="me2">doLog</span><span class="br0">&#40;</span><span class="re0">$uniqueid</span>,<span class="kw2">__FILE__</span>,<span class="kw2">__LINE__</span>,LOG_WARNING,<span class="st0">&quot;Ha ocurrido un error en la conexión a la base de datos en la consulta &quot;</span>.<span class="re0">$sql</span>.<span class="st0">&quot;El error devuelto ha sido &quot;</span>.<span class="re0">$con</span>-&gt;<span class="me1">getError</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/exit"><span class="kw3">exit</span></a><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">ivLogger::<span class="me2">doLog</span><span class="br0">&#40;</span><span class="re0">$uniqueid</span>,<span class="kw2">__FILE__</span>,<span class="kw2">__LINE__</span>,LOG_WARNING,<span class="st0">&quot;Hemos llegado a un punto del AGI al que probablemente no deberíamos haber llegado&#8230;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/exit"><span class="kw3">exit</span></a><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Este sencillo Agi, comprueba si un usuario dado como parámetro existe en la tabla <em>tablausuarios </em>y setea la variable de canal <em>EXISTE_USUARIO</em> a &#8220;SI&#8221; o &#8220;NO&#8221;. Como podemos ver, se hacen múltiples llamadas a la clase de log a lo largo del Agi para poder seguir el flujo de la llamada en el mismo y no hacer que éste sea una caja negra desde que se le llama en el Dialplan hasta que termina y devuelve el control. Las llamadas a la función de log reciben como parámetros:</p>
<ul>
<li>Uniqueid de la llamada para poder discriminar fácilmente entre las mismas. Ya samos que no es único pero también sabemos que es lo bastante único.</li>
<li>Nombre del fichero Agi.</li>
<li>Línea en el fichero Agi en el que se encuentra el log.</li>
<li>Severidad del mensaje. Cuando no hay un problema ponemos LOG_DEBUG ya que en nuestro caso cualquier otro causa además del log, un envío de correo avisando de que algo ha ido mal. Existen diferentes niveles de severidad que vienen dados por las funciones de llamada a syslog del lenguaje en particular.</li>
<li>Mensaje que queremos que se grabe.</li>
</ul>
<p>Una vez tenemos los Agi bien comentados y las llamadas al log bien pensadas, podemos ver cuanto pasa en un Agi mirando el Syslog:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">Oct 16 10:34:53 callcenter ivozlog: [1255682093.0][pbx_DoesUserExist.php][40] No existe el usuario</div>
</li>
</ol>
</div>
<p>Como podemos ver, hemos llamado al Agi y le hemos preguntado por un usuario que no existe. En el log podemos ver:</p>
<ul>
<li>Fecha del log.</li>
<li>Nombre del host.</li>
<li>SyslogTag, una marca para poder clasificar los logs, en este caso &#8220;ivozlog&#8221;.</li>
<li>Uniqueid de la llamada, para poder trackear una llamada en concreto.</li>
<li>Nombre del fichero de Agi que ha generado este log.</li>
<li>Línea dentro del Agi donde estaba el mensaje de log, muy útil en Agis grandes.</li>
<li>Mensaje informativo.</li>
</ul>
<p>Como podemos ver, tenemos toda la información necesaria para poder ver el flujo que ha seguido una llamada en concreto en los Agi por los que ha pasado. Sin embargo, no hemos terminado con los Agi ya que sólo hemos controlado errores de programación y de conexión. Tenemos controlados los errores y los flujos pero no estamos aún preparados para los errores incontrolados tales como excepciones.</p>
<p>La librería de Agi más popular es sin duda <em>phpagi</em>. Esta librería permite además avisar de errores incontrolados y fallos en la comunicación con Asterisk mediante un correo electrónico. Es muy sencillo modificar la función de manejo de errores de phpagi.php para que loguee a syslog con el tag y el facility que nosotros queramos:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&#8230;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span><a href="http://www.php.net/ini_get"><span class="kw3">ini_get</span></a><span class="br0">&#40;</span><span class="st0">&#8216;error_reporting&#8217;</span><span class="br0">&#41;</span> == <span class="nu0">0</span><span class="br0">&#41;</span> <span class="kw1">return</span>; <span class="co1">// this happens with an @</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">+ &nbsp; &nbsp;<a href="http://www.php.net/openlog"><span class="kw3">openlog</span></a><span class="br0">&#40;</span><span class="st0">&quot;phpagi&quot;</span>, LOG_ODELAY, LOG_LOCAL6<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">+ &nbsp; &nbsp;@<a href="http://www.php.net/syslog"><span class="kw3">syslog</span></a><span class="br0">&#40;</span>LOG_WARNING, <span class="re0">$file</span> . <span class="st0">&#8216;['</span> . <span class="re0">$line</span> . <span class="st0">']: &#8216;</span> . <span class="re0">$message</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">+ &nbsp; &nbsp;<a href="http://www.php.net/closelog"><span class="kw3">closelog</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<a href="http://www.php.net/global"><span class="kw3">global</span></a> <span class="re0">$phpagi_error_handler_email</span>;</div>
</li>
<li class="li1">
<div class="de1">&#8230;</div>
</li>
</ol>
</div>
<p>Y por fin lo único que quedaría sería decir al propio PHP que loguease los errores propios del lenguaje en syslog para de esta forma terminar de controlar todo lo que puede pasar en un AGI. Esto ya es propio de cada instalación de php en cada distribución así que símplemente lo dejamos como comentario.</p>
<h2>Log del dialplan de Asterisk</h2>
<p>Como hemos comentado, sólo tenemos de Asterisk los errores y los warnings. No tenemos información detallada de lo que pasa con una llamada ya que en alta carga el log de Asterisk y la consola se vuelven a efectos prácticos, inusables. Casi todos hemos usado la aplicación NoOp para ir poniendo mensajes que más tarde nos ayuden a debuguear visualmente el flujo de las llamadas. En este caso y dado que lo que queremos es unificar los logs en el syslog, vamos a reemplazar Noop por una aplicación que loguee a Syslog.<br />
Asterisk dispone de la aplicación Log, que usa el logger de Asterisk para hacer sus cosas. Sin embargo, esta función nos deja poco control y es poco flexible para nuestras necesidades. En su lugar vamos a usar una aplicación  que aunque no es oficial de asterisk,  es fácilmente integrable en cualquier asterisk 1.4 y además ya viene se serie en <a href="http://www.asterisk-es-rsp.org/doku.php">asterisk-es-rsp</a>: <a href="http://www.asterisk-es-rsp.org/doku.php/aplicaciones:syslog">app_syslog</a>.<br />
La función app_syslog se pensó para poder loguear al Syslog directamente desde dialplan. Acepta gran cantidad de parámetros y al llamar directamente a Syslog y no usar el log de asterisk es enormemente rápida, ligera y flexible. Para instalarla símplemente hay que copiar el app_syslog.c a la carpeta apps de Asterisk (a no ser que tengamos las últimas versiones del branch principal de asterisk-es-rsp) y escoger su compilación al hacer &#8220;make menuconfig&#8221;, ya que al no ser una aplicación oficial de asterisk se decidió que no se compilase por defecto.</p>
<p>El uso de la aplicación es bastante sencilla:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> &nbsp;-= Info about application <span class="st0">&#8216;Syslog&#8217;</span> =-</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>Synopsis<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">Syslog a given text</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>Description<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">Syslog<span class="br0">&#40;</span>message|<span class="br0">&#91;</span>severity|facility|syslogtag|setuniqueid<span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; severity must be one of ERROR, WARNING, NOTICE, DEBUG, INFO, CRIT, ALERT, EMERG. Defaults to DEBUG</div>
</li>
<li class="li1">
<div class="de1">&nbsp; facility must be local0&#8230;local7. Defaults to USER</div>
</li>
<li class="li2">
<div class="de2">&nbsp; syslogtag <span class="kw1">if</span> not present defaults to <span class="st0">&quot;asterisk&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; setuniqueid is a <span class="nu0">0</span><span class="nu0">-1</span> boolean that prepends or not channel<span class="st0">&#8217;s uniqueid to logging message. Defaults to 0</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"</span></div>
</li>
</ol>
</div>
<p>En este caso, no vamos a cambiar de facility, ni de tag&#8230; por lo que los parámetros los guardaremos en variables globales y haremos las llamadas a Syslog desde nuestro dialplan de forma sencilla:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&#8230;</div>
</li>
<li class="li1">
<div class="de1">exten =&gt; s,<span class="nu0">1</span>,Syslog<span class="br0">&#40;</span>Macro de llamar a usuario <span class="re0">$<span class="br0">&#123;</span>ARG1<span class="br0">&#125;</span></span>,<span class="re0">$<span class="br0">&#123;</span>SYSLOG_SEVERITY<span class="br0">&#125;</span></span>,<span class="re0">$<span class="br0">&#123;</span>SYSLOG_FACILITY<span class="br0">&#125;</span></span>,<span class="re0">$<span class="br0">&#123;</span>SYSLOGTAG<span class="br0">&#125;</span></span>,<span class="re0">$<span class="br0">&#123;</span>SYSLOG_SETUNIQUEID<span class="br0">&#125;</span></span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">exten =&gt; s,n,AGI<span class="br0">&#40;</span>agi://<span class="re0">$<span class="br0">&#123;</span>FASTAGI_SERVER<span class="br0">&#125;</span></span>/pbx_DoesUserExist.php?<span class="re2">usuario=</span><span class="re0">$<span class="br0">&#123;</span>ARG1<span class="br0">&#125;</span></span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">exten =&gt; s,n,GotoIf<span class="br0">&#40;</span>$<span class="br0">&#91;</span><span class="st0">&quot;${EXISTE_USUARIO}&quot;</span> != <span class="st0">&quot;SI&quot;</span><span class="br0">&#93;</span>?nouser<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&#8230;</div>
</li>
</ol>
</div>
<p>Y El resultado en el Syslog sería tal que:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&#8230;</div>
</li>
<li class="li1">
<div class="de1">Oct <span class="nu0">16</span> <span class="nu0">08</span>:<span class="nu0">07</span>:<span class="nu0">44</span> callcenter asterisk: <span class="br0">&#91;</span><span class="nu0">1255673264.14291</span><span class="br0">&#93;</span> Macro de llamar a usuario <span class="nu0">22109</span></div>
</li>
<li class="li1">
<div class="de1">Oct <span class="nu0">16</span> <span class="nu0">08</span>:<span class="nu0">07</span>:<span class="nu0">44</span> callcenter ivozlog: <span class="br0">&#91;</span><span class="nu0">1255673264.14291</span><span class="br0">&#93;</span><span class="br0">&#91;</span>pbx_DoesUserExist.php<span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">36</span><span class="br0">&#93;</span> Existe el usuario <span class="nu0">22109</span>.</div>
</li>
<li class="li1">
<div class="de1">Oct <span class="nu0">16</span> <span class="nu0">08</span>:<span class="nu0">07</span>:<span class="nu0">44</span> callcenter ivozlog: <span class="br0">&#91;</span><span class="nu0">1255673264.14291</span><span class="br0">&#93;</span><span class="br0">&#91;</span>pbx_CheckStatusUsuario.php<span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">42</span><span class="br0">&#93;</span> SET de DESVIO_INCONDICIONAL a NO</div>
</li>
<li class="li2">
<div class="de2">Oct <span class="nu0">16</span> <span class="nu0">08</span>:<span class="nu0">07</span>:<span class="nu0">44</span> callcenter ivozlog: <span class="br0">&#91;</span><span class="nu0">1255673264.14291</span><span class="br0">&#93;</span><span class="br0">&#91;</span>pbx_CheckStatusUsuario.php<span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">52</span><span class="br0">&#93;</span> SET de DESVIO_NOANSWER a NO</div>
</li>
<li class="li1">
<div class="de1">Oct <span class="nu0">16</span> <span class="nu0">08</span>:<span class="nu0">07</span>:<span class="nu0">44</span> callcenter ivozlog: <span class="br0">&#91;</span><span class="nu0">1255673264.14291</span><span class="br0">&#93;</span><span class="br0">&#91;</span>pbx_CheckStatusUsuario.php<span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">61</span><span class="br0">&#93;</span> SET de DESVIO_BUSY a NO</div>
</li>
<li class="li1">
<div class="de1">Oct <span class="nu0">16</span> <span class="nu0">08</span>:<span class="nu0">07</span>:<span class="nu0">44</span> callcenter ivozlog: <span class="br0">&#91;</span><span class="nu0">1255673264.14291</span><span class="br0">&#93;</span><span class="br0">&#91;</span>pbx_CheckStatusUsuario.php<span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">68</span><span class="br0">&#93;</span> SET de DND a NO</div>
</li>
<li class="li1">
<div class="de1">Oct <span class="nu0">16</span> <span class="nu0">08</span>:<span class="nu0">07</span>:<span class="nu0">44</span> callcenter ivozlog: <span class="br0">&#91;</span><span class="nu0">1255673264.14291</span><span class="br0">&#93;</span><span class="br0">&#91;</span>pbx_CheckStatusUsuario.php<span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">69</span><span class="br0">&#93;</span> SET de USERTIMEOUT a <span class="nu0">40</span></div>
</li>
<li class="li1">
<div class="de1">Oct <span class="nu0">16</span> <span class="nu0">08</span>:<span class="nu0">07</span>:<span class="nu0">44</span> callcenter ivozlog: <span class="br0">&#91;</span><span class="nu0">1255673264.14291</span><span class="br0">&#93;</span><span class="br0">&#91;</span>pbx_CheckStatusUsuario.php<span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">70</span><span class="br0">&#93;</span> SET de MAX_CALLS a <span class="nu0">2</span></div>
</li>
<li class="li2">
<div class="de2">Oct <span class="nu0">16</span> <span class="nu0">08</span>:<span class="nu0">07</span>:<span class="nu0">44</span> callcenter ivozlog: <span class="br0">&#91;</span><span class="nu0">1255673264.14291</span><span class="br0">&#93;</span><span class="br0">&#91;</span>pbx_CheckStatusUsuario.php<span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">71</span><span class="br0">&#93;</span> SET de IDUSER a <span class="nu0">759</span></div>
</li>
<li class="li1">
<div class="de1">Oct <span class="nu0">16</span> <span class="nu0">08</span>:<span class="nu0">07</span>:<span class="nu0">44</span> callcenter ivozlog: <span class="br0">&#91;</span><span class="nu0">1255673264.14291</span><span class="br0">&#93;</span><span class="br0">&#91;</span>pbx_CheckStatusUsuario.php<span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">72</span><span class="br0">&#93;</span> SET de VOICEMAIL_HABILITADO a <span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1">Oct <span class="nu0">16</span> <span class="nu0">08</span>:<span class="nu0">07</span>:<span class="nu0">44</span> callcenter ivozlog: <span class="br0">&#91;</span><span class="nu0">1255673264.14291</span><span class="br0">&#93;</span><span class="br0">&#91;</span>pbx_CheckStatusUsuario.php<span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">89</span><span class="br0">&#93;</span> Buscando interfaces para el usuario&#8230;</div>
</li>
<li class="li1">
<div class="de1">Oct <span class="nu0">16</span> <span class="nu0">08</span>:<span class="nu0">07</span>:<span class="nu0">44</span> callcenter ivozlog: <span class="br0">&#91;</span><span class="nu0">1255673264.14291</span><span class="br0">&#93;</span><span class="br0">&#91;</span>pbx_CheckStatusUsuario.php<span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">93</span><span class="br0">&#93;</span> Encontradas <span class="nu0">1</span> interfaces</div>
</li>
<li class="li1">
<div class="de1">Oct <span class="nu0">16</span> <span class="nu0">08</span>:<span class="nu0">07</span>:<span class="nu0">44</span> callcenter ivozlog: <span class="br0">&#91;</span><span class="nu0">1255673264.14291</span><span class="br0">&#93;</span><span class="br0">&#91;</span>pbx_CheckStatusUsuario.php<span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">100</span><span class="br0">&#93;</span> SET de INTERFACES a SIP/telf0459</div>
</li>
<li class="li2">
<div class="de2">Oct <span class="nu0">16</span> <span class="nu0">08</span>:<span class="nu0">07</span>:<span class="nu0">55</span> callcenter asterisk: <span class="br0">&#91;</span><span class="nu0">1255673264.14291</span><span class="br0">&#93;</span> Colgando en contexto macro de llamar usuario</div>
</li>
<li class="li1">
<div class="de1">&#8230;</div>
</li>
</ol>
</div>
<p>De tal forma que ahora sí que podemos seguir un flujo de llamada de forma ordenada desde el Syslog del sistema.</p>
<h2>Poniendo orden en el Syslog</h2>
<p>Hemos hecho que nuestra centralita loguee todo al Syslog del sistema. Tenemos enormes cantidades de información en el fichero <em>/var/log/syslog</em>, pero esa información únicamente está marcada. Aún nos queda poder filtrarla (sin greps por favor), y tenerla en tamaños manejables ya que la inspección del fichero de syslog va a ser un caos mucho mayor que mirar la consola de asterisk, cosa que queríamos evitar desde un inicio.<br />
Como herramienta de Syslog vamos a usar <a href="http://www.rsyslog.com/">rsyslog</a>, el programa de viene por defecto en Debian. Vamos a repartir los logs entre diferentes ficheros de tal forma que tengamos todo un poco más repartido. ¿Repartido? ¿No queríamos unificar todo?<br />
En estos momentos tenemos los siguientes logs marcados de la siguiente manera:</p>
<ul>
<li>Log de errores de Asterisk con facility Local5, tag &#8220;asterisk&#8221;.</li>
<li>Log de los agis con facility Local6, tag &#8220;ivozlog&#8221;.</li>
<li>Log de errores de phpagi con facility Local6 y tag &#8220;phpagi&#8221;</li>
<li>Log del dialplan de Asterisk con facility Local5 y tag &#8220;asterisk&#8221;</li>
<li>Todos los demás logs del sistema con sus facilitys, y sus tags</li>
</ul>
<p>Vamos a hacer que los errores (Local6) vayan a un fichero y los mensajes de flujo de llamadas (Local5) vayan a otro fichero. De esta forma tendremos más separado lo que es el error incontrolado de lo que es un debug o error controlado (que por otra parte ya se nos notifica por correo).</p>
<p>En el fichero <em>/etc/rsyslog.conf</em> tenemos la configuración por defecto de un syslog. No vamos a comentar todo lo que hace el sistema ya que el manejo de syslog es algo que todos los administradores de sistemas conocen a la perfección. Símplemente modificaremos las líneas necesarias para que los logs con determinada <em>facility</em> sean desviados a otros ficheros y no aparezcan en el log principal mezclados con todo lo demás.<br />
Localizamos la línea</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">*.*;auth,authpriv.none &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-/var/log/syslog</div>
</li>
</ol>
</div>
<p>Y la reemplazamos por</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">*.*;auth,authpriv.none;local6.none;local5.none;local0.none &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-/var/log/syslog</div>
</li>
<li class="li1">
<div class="de1">local6.* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-/var/log/ivozng/dialplan.log</div>
</li>
<li class="li1">
<div class="de1">local5.* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-/var/log/ivozng/asterisk.log</div>
</li>
<li class="li1">
<div class="de1">local0.* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-/var/log/ivozng/terminales.log</div>
</li>
</ol>
</div>
<p>De esta forma hacemos que todos los logs con facility Local5, Local6, Local0 no aparezcan en el fichero de syslog y cada uno se escriba en su propio fichero. Tenemos las cosas más separadas pero aún así podemos ver el flujo de llamadas y errores de forma ordenada y cada uno en su sitio.<br />
¡No hemos acabado! Tenemos ingentes cantidades de información que van a generar ficheros enormes que van a acabar por hacerse demasiado pesados amén de llenarnos el disco duro. Los logs hay que rotarlos. Nada más sencillo que crear unas rotaciones con el fichero <em>/etc/logrotate.d/asterisk</em> :</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">root@callcenter:/etc/logrotate.d<span class="re3"># <span class="kw2">cat</span> ivozng</span></div>
</li>
<li class="li1">
<div class="de1">/var/log/ivozng/dialplan.log <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; daily</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; missingok</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; rotate <span class="nu0">60</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; compress</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; copytruncate</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; notifempty</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; create <span class="nu0">640</span> root adm</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">/var/log/ivozng/asterisk.log <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; daily</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; missingok</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; rotate <span class="nu0">60</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; compress</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; copytruncate</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; notifempty</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; create <span class="nu0">640</span> root adm</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">/var/log/ivozng/terminales.log <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; daily</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; missingok</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; rotate <span class="nu0">60</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; compress</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; copytruncate</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; notifempty</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; create <span class="nu0">640</span> root adm</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">/var/log/asterisk/messages <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; daily</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; missingok</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; rotate <span class="nu0">30</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; compress</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; copytruncate</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; notifempty</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; create <span class="nu0">640</span> root adm</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Esto ya va tomando forma <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Del mismo modo que hemos marcado y desviado los logs de Asterisk y de nuestra programación, podemos hacer lo propio con otros servicios de tal forma que la ingente cantidad de información -nunca hay demasiada- pueda ser más manejable y tratable. Podemos quedarnos aquí o podemos ir a hacerlo mejor:</p>
<h2>Syslog a Mysql</h2>
<p>¿No sería mucho más manejable disponer de todos los logs en una base de datos? De esta forma podríamos integrar visores y filtros en webs de gestión de una forma mucho más sencilla, amén de hacer todas las tareas de mantenimiento más sencillas al pobre administrador que no va a tener que lidiar con docenas de ficheros o dar acceso a los logs a gente que no debe tener acceso al sistema.<br />
Rsyslog hace esto sencillo. Lo que vamos a necesitar es:</p>
<ol>
<li>Dar soporte mysql a rsyslog.</li>
<li>Crear la base de datos y hacer que rsyslog escriba en ella lo que nosotros queramos.</li>
<li>Hacer que la base de datos sea manejable.</li>
</ol>
<p>Lo primero no puede ser más sencillo:<br />
<code>apt-get install rsyslog-mysql</code></p>
<p>Durante la instalación de rsyslog-mysql nos saldra un “ncurses” donde nos preguntará si queremos configurar una bases de datos … le decimos que no, que lo haremos manualmente ya que nos vamos a crear una tabla normal sino una tabla del tipo <a href="http://dev.mysql.com/doc/refman/5.0/es/merge-storage-engine.html">merge</a>. Esto lo explicamos más adelante.</p>
<p>Vamos a crear digamos 28 tablas  <em>se1-se28</em> idénticas en todo excepto en el nombre, en una base de datos llamada <em>log</em> y creada para este propósito:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="st0">`se1`</span> <span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`ID`</span> bigint<span class="br0">&#40;</span><span class="nu0">20</span><span class="br0">&#41;</span> <span class="kw1">UNSIGNED</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">AUTO_INCREMENT</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`CustomerID`</span> bigint<span class="br0">&#40;</span><span class="nu0">20</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`ReceivedAt`</span> datetime <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="st0">`DeviceReportedTime`</span> datetime <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`Facility`</span> smallint<span class="br0">&#40;</span><span class="nu0">6</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`Priority`</span> smallint<span class="br0">&#40;</span><span class="nu0">6</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`FromHost`</span> varchar<span class="br0">&#40;</span><span class="nu0">60</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`Message`</span> text,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="st0">`NTSeverity`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`Importance`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`EventSource`</span> varchar<span class="br0">&#40;</span><span class="nu0">60</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`EventUser`</span> varchar<span class="br0">&#40;</span><span class="nu0">60</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`EventCategory`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="st0">`EventID`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`EventBinaryData`</span> text,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`MaxAvailable`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`CurrUsage`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`MinUsage`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="st0">`MaxUsage`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`InfoUnitID`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`SysLogTag`</span> varchar<span class="br0">&#40;</span><span class="nu0">60</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`EventLogType`</span> varchar<span class="br0">&#40;</span><span class="nu0">60</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`GenericFileName`</span> varchar<span class="br0">&#40;</span><span class="nu0">60</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="st0">`SystemID`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> &nbsp;<span class="br0">&#40;</span><span class="st0">`ID`</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span> ENGINE=MyISAM <span class="kw1">DEFAULT</span> CHARSET=utf8</div>
</li>
</ol>
</div>
<p>Después creamos la tabla SystemEvents que es una tabla merge de las 28 anteriores:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="st0">`SystemEvents`</span> <span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`ID`</span> bigint<span class="br0">&#40;</span><span class="nu0">20</span><span class="br0">&#41;</span> <span class="kw1">UNSIGNED</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">AUTO_INCREMENT</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`CustomerID`</span> bigint<span class="br0">&#40;</span><span class="nu0">20</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`ReceivedAt`</span> datetime <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="st0">`DeviceReportedTime`</span> datetime <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`Facility`</span> smallint<span class="br0">&#40;</span><span class="nu0">6</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`Priority`</span> smallint<span class="br0">&#40;</span><span class="nu0">6</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`FromHost`</span> varchar<span class="br0">&#40;</span><span class="nu0">60</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`Message`</span> text,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="st0">`NTSeverity`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`Importance`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`EventSource`</span> varchar<span class="br0">&#40;</span><span class="nu0">60</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`EventUser`</span> varchar<span class="br0">&#40;</span><span class="nu0">60</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`EventCategory`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="st0">`EventID`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`EventBinaryData`</span> text,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`MaxAvailable`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`CurrUsage`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`MinUsage`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="st0">`MaxUsage`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`InfoUnitID`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`SysLogTag`</span> varchar<span class="br0">&#40;</span><span class="nu0">60</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`EventLogType`</span> varchar<span class="br0">&#40;</span><span class="nu0">60</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">`GenericFileName`</span> varchar<span class="br0">&#40;</span><span class="nu0">60</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="st0">`SystemID`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> &nbsp;<span class="br0">&#40;</span><span class="st0">`ID`</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span> ENGINE=MRG_MyISAM <span class="kw1">DEFAULT</span> CHARSET=utf8 INSERT_METHOD=FIRST UNION=<span class="br0">&#40;</span><span class="st0">`se1`</span>,<span class="st0">`se2`</span>,<span class="st0">`se3`</span>,<span class="st0">`se4`</span>,<span class="st0">`se5`</span>,<span class="st0">`se6`</span>,<span class="st0">`se7`</span>,<span class="st0">`se8`</span>,<span class="st0">`se9`</span>,<span class="st0">`se10`</span>,<span class="st0">`se11`</span>,<span class="st0">`se12`</span>,<span class="st0">`se13`</span>,<span class="st0">`se14`</span>,<span class="st0">`se15`</span>,<span class="st0">`se16`</span>,<span class="st0">`se17`</span>,<span class="st0">`se18`</span>,<span class="st0">`se19`</span>,<span class="st0">`se20`</span>,<span class="st0">`se21`</span>,<span class="st0">`se22`</span>,<span class="st0">`se23`</span>,<span class="st0">`se24`</span>,<span class="st0">`se25`</span>,<span class="st0">`se26`</span>,<span class="st0">`se27`</span>,<span class="st0">`se28`</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>¿Qué hemos hecho? Hemos creado una tabla que es una unión de otras 28 tablas. Cuando hagamos un SELECT de la tabla <em>SystemEvents</em>, estaremos buscando en las 28 tablas y cuando hagamos un INSERT en la tabla estremos escribiendo en la tabla <em>se1</em> (la primera).<br />
Ya tenemos la tabla, ahora toca hacer que rsyslog escriba en ella los logs del sistema que nosotros queremos. Para ello vamos a crear un fichero de configuración aparte <em>/etc/rsyslog.d/mysql.conf</em>. Lo primero de todo es decirle a rsyslog que incluya la configuración de ese fichero. Vamos al final del fichero /etc/rsyslog.conf y añadimos (si no la tenemos ya) la línea<br />
<code>$IncludeConfig /etc/rsyslog.d/*.conf</code><br />
En el nuevo fichero le diremos a rsyslog que cargue el módulo mysql y que loguee ciertas cosas a la base de datos log, tabla SystemEvents:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$template</span> tp1,<span class="st0">&quot;insert into SystemEvents (Message, Facility, FromHost, Priority, DeviceReportedTime, ReceivedAt, InfoUnitID, SysLogTag) values (&#8217;%msg%&#8217;, %syslogfacility%, &#8216;%fromhost%&#8217;, %syslogpriority%, &#8216;%timereported:::date-mysql%&#8217;, &#8216;%timegenerated:::date-mysql%&#8217;, %iut%, &#8216;%syslogtag%&#8217;)&quot;</span>,SQL</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$ModLoad</span> ommysql</div>
</li>
<li class="li1">
<div class="de1">*.*;auth,authpriv.none;local6.none;local5.none;cron.none;local0.none :ommysql:<span class="nu0">127.0</span><span class="nu0">.0</span><span class="nu0">.1</span>,log,rsysloguser,rsyslogpass;tp1</div>
</li>
<li class="li2">
<div class="de2">local6.* :ommysql:<span class="nu0">127.0</span><span class="nu0">.0</span><span class="nu0">.1</span>,log,rsysloguser,rsyslogpass;tp1</div>
</li>
<li class="li1">
<div class="de1">local5.* :ommysql:<span class="nu0">127.0</span><span class="nu0">.0</span><span class="nu0">.1</span>,log,rsysloguser,rsyslogpass;tp1</div>
</li>
</ol>
</div>
<p>Este fichero loguea todo lo que iría al fichero normal de syslog más los facility 5 y 6 a la base de datos. Se podría haber hecho todo en una sola línea y el uso del template no es en realidad necesario (ya que usamos el esquema estandar para las tablas, el que rsyslog usa por defecto) pero de esta forma se puede tocar después de una forma más cómoda. En la web de rsyslog hay mucha documentación acerca de cómo configurar este comportamiento.<br />
Sólo nos queda dar permisos al usuario &#8220;rsysloguser&#8221; con contraseña &#8220;rsyslogpass&#8221; en la base de datos &#8220;log&#8221; para poder reiniciar rsyslog y ver los logs en la base de datos.<br />
¡Tampoco hemos terminado!<br />
Por lo que hemos visto, los INSERT de Mysql se hacen en la tabla se1, por lo que las otras 27 tablas están vacías y no sirven de nada. Además, a medida que pasa el tiempo y los logs se acumulan, la tabla SystemEvents se va haciendo más y más grande y el rendimiento empieza a degradarse. Para eso hemos hecho 28 tablas: Al igual que rotamos los ficheros de log vamos a rotar las tablas de log de tal forma que todos los días vamos a:</p>
<ul>
<li>Eliminar la tabla se28</li>
<li>Rotar todas las tablas una posición a la derecha</li>
<li>Volver a crear la tabla se1</li>
</ul>
<p>De esta forma consevaremos en base de datos los logs de las últimas 4 semanas siempre, una tabla por cada día. Además borrar una tabla es mucho más eficiente que borrar sus registros. Un pequeño script puesto en cron nos va a permitir hacer esto de forma automática:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re3">#!/bin/bash</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re3">#Rotar tablas merge del syslog</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">PATH=</span><span class="st0">&quot;/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin&quot;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw3">export</span> PATH</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">ROTATION=</span><span class="nu0">28</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">SQL=</span><span class="st0">&quot;mysql -ursysloguser -prsyslogpass log -Be&quot;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$SQL</span> <span class="st0">&quot;DROP TABLE se$ROTATION;&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">let</span> <span class="re2">ROTATION=</span><span class="re1">$ROTATION</span><span class="nu0">-1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">while</span> &nbsp;<span class="br0">&#91;</span> <span class="re1">$ROTATION</span> -ge <span class="nu0">1</span> <span class="br0">&#93;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">do</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">let</span> <span class="re2">X=</span><span class="re1">$ROTATION</span><span class="nu0">+1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$SQL</span> <span class="st0">&quot;ALTER TABLE se$ROTATION RENAME TO se$X;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">let</span> <span class="re2">ROTATION=</span><span class="re1">$ROTATION</span><span class="nu0">-1</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">done</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$SQL</span> <span class="st0">&quot;CREATE TABLE se1 LIKE se2;&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$SQL</span> <span class="st0">&quot;FLUSH TABLES;&quot;</span></div>
</li>
</ol>
</div>
<p>Nota: El usuario <em>rsyslog</em> ha de tener el privilegio global RELOAD para que esta rotación funcione correctamente.</p>
<p>¿Hemos acabado ya? Realmente&#8230; sí.<br />
Ya sólo nos quedaría usar una aplicación que nos permita ver y filtrar los logs de una forma sencilla. Podemos usar nuestra propia aplicación o usar alguna ya hecha a tal efecto como <a href="http://www.phplogcon.org/">phplogcon</a>. Este programa, no vamos a meternos en su instalación ya que es bastante sencilla y sería repetir lo que ya está explicado en su web, dispone de una potente interfaz para ver y gestionar los logs. Cada uno que use el que más le guste <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><div id="attachment_216" class="wp-caption alignright" style="width: 1034px"><img class="size-large wp-image-216" title="phplogcon" src="http://blog.voz-ip.com/wp-content/uploads/2009/10/phplogcon-1024x640.png" alt="phplogcon" width="1024" height="640" /><p class="wp-caption-text">phplogcon</p></div></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.voz-ip.com/2009/log-en-asterisk/feed/</wfw:commentRss>
		</item>
		<item>
		<title>AstriCon 2009: ¡empieza la cuenta atrás!</title>
		<link>http://blog.voz-ip.com/2009/astricon-2009-%c2%a1empieza-la-cuenta-atras/</link>
		<comments>http://blog.voz-ip.com/2009/astricon-2009-%c2%a1empieza-la-cuenta-atras/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 08:36:38 +0000</pubDate>
		<dc:creator>saghul</dc:creator>
		
		<category><![CDATA[Asterisk]]></category>

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

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

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

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

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

		<guid isPermaLink="false">http://blog.voz-ip.com/?p=167</guid>
		<description><![CDATA[Ya solo quedan unas pocas horas para que de comienzo el décimo AstriCon, el AstriCon 2009 y he de confesar que algo nervioso sí que me encuentro.  
Éste año se celebra la décima edición, por lo que el evento promete. Habrá charlas (como siempre) pero se ha reducido la concurrencia, ya que el año pasado había [...]]]></description>
			<content:encoded><![CDATA[<p>Ya solo quedan unas pocas horas para que de comienzo el décimo <a href="http://www.astricon.net" target="_blank">AstriCon</a>, el AstriCon 2009 y he de confesar que algo nervioso <span style="background-color: #ffffff; ">sí que me encuentro. <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <img class="alignnone size-full wp-image-168" title="astricon-speaking-sm" src="http://blog.voz-ip.com/wp-content/uploads/2009/10/astricon-speaking-sm.jpg" alt="astricon-speaking-sm" width="207" height="216" /></span></p>
<p><span style="background-color: #ffffff; ">Éste año se celebra la décima edición, por lo que el evento promete. Habrá charlas (como siempre) pero se ha reducido la concurrencia, ya que el año pasado había demasiadas a la vez. También tendrá su sección de expositores, donde diversas empresas expondrán sus productos y servicios. ¡Y el <a href="http://blogs.digium.com/2009/10/07/astricontest/" target="_blank">AstriContest</a>!, el concurso de dialplan que éste año se realizará con terminales analógicos (are you from the past?!) y que como primer premio tendrá un terminal con Android libre. ¡Habrá que intentarlo!</span></p>
<p><span style="background-color: #ffffff; ">Además de porque es la décima edición y porque repito (<a href="http://www.saghul.net/blog/2008/09/22/astrivacaciones/" target="_blank">el año pasado</a> también tuve la suerte de poder venir) éste año el AstriCon me hace especial ilusión, porque <a href="http://www.saghul.net/blog/2009/08/03/astrivacaciones-reloaded/" target="_blank">en el call for papers me aceptaron ¡dos charlas!</a> ¡El día que recibí el mail de John Todd no pude ni dormir! Por suerte las tengo el segundo y el tercer día, así mañana puedo ir viendo cómo va el tema <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </span></p>
<p>Aprovechando que he venido sólo (éste año <a href="http://sipdoc.net" target="_blank">Manwe</a> no me acompaña y he venido con familia, pero se quedan en San Francisco) voy a <span style="background-color: #ffffff; ">sacar el <em>FanBoy</em> que hay en mi, que una vez al año no hace daño. <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </span></p>
<p>Subiré fotos, twittearé, bloguaré, &#8230; vamos un eco-pack del Web2.0, stay tuned!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.voz-ip.com/2009/astricon-2009-%c2%a1empieza-la-cuenta-atras/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Asterisk-ES-RSP</title>
		<link>http://blog.voz-ip.com/2009/asterisk-es-rsp/</link>
		<comments>http://blog.voz-ip.com/2009/asterisk-es-rsp/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 10:39:45 +0000</pubDate>
		<dc:creator>Jon Bonilla</dc:creator>
		
		<category><![CDATA[Asterisk]]></category>

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

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

		<guid isPermaLink="false">http://blog.voz-ip.com/?p=151</guid>
		<description><![CDATA[Los lectores que seguís de forma activa las noticias de la comunidad de Asterisk habréis leído las discusiones suscitadas por las últimas versiones publicadas. Las versiones 1.4.2X han resultado ser bastante decepcionantes en cuando a estabilidad y la comunidad hispana, en la que nos hallamos la mayoría de integradores de Asterisk, se ha revolucionado bastante [...]]]></description>
			<content:encoded><![CDATA[<p>Los lectores que seguís de forma activa las noticias de la comunidad de Asterisk habréis leído las discusiones suscitadas por las últimas versiones publicadas. Las versiones 1.4.2X han resultado ser bastante decepcionantes en cuando a estabilidad y la comunidad hispana, en la que nos hallamos la mayoría de integradores de Asterisk, se ha revolucionado bastante con interminables discusiones sobre el modelo de desarrollo de Asterisk, el control de calidad de las versiones y la inversión en tiempo==dinero empleados cercando y solventando estos problemas.</p>
<p>Es por ello, que a raíz de unas de estas discusiones se decidió crear el grupo de asterisk-es-rsp, como un proyecto de la comunidad hispana para unificar nuestros esfuerzos en tener una solución común probada, estable y participada por todos.<img class="alignright size-full wp-image-164" title="asterisk-rsp1" src="http://blog.voz-ip.com/wp-content/uploads/2009/06/asterisk-rsp1.jpg" alt="asterisk-rsp1" width="240" height="180" /></p>
<p>Asterisk-RSP <strong>NO </strong>es un fork de Asterisk. Es un branch en el que empresas y particulares aportamos parches y testing con el fin de disponer de una versión base de Asterisk realmente testeada y adaptada a las necesidades de la comunidad.</p>
<p>Después de varias semanas de desarrollo, el proyecto comienza a dar sus frutos. Actualmente existe un branch principal de Asterisk 1.4.24 y dahdi-linux+dahdi-tools que incluye bastantes bugfixes y funcionalidades extra respecto a la versión 1.4.24 original. Algunas de ellas contemplan:</p>
<ul>
<li>Soporte de RDSI BRI (tarjetas Digium, OpenVox, Beronet y Junghanns) mediante DAHDI.</li>
</ul>
<ul>
<li>App_pickup2</li>
</ul>
<ul>
<li>Queue_log realtime mediante UnixODBC</li>
</ul>
<ul>
<li>Montones de bugfixes portados de las versiones 1.4.25, 1.4.26RC1 y svn-trunk</li>
</ul>
<ul>
<li>func_devstate</li>
</ul>
<ul>
<li>PickUp en terminales Thomson</li>
</ul>
<p>Para aquellos que quieran participar o informarse sobre el proyecto existe una <a title="Lista de correo Asterisk-es-rsp" href="http://groups.google.com/group/asterisk-es-rsp" target="_self">lista de correo</a> en la que se discute el desarrollo del mismo. Un <a title="Asterisk-es-esrsp Wiki" href="http://www.asterisk-es-rsp.org" target="_self">wiki</a> está en construcción (aún está muy verde) para documentarlo, pero como siempre el log de svn es lo más actualizado que se puede encontrar.</p>
<p>Para descargar las fuentes:</p>
<p><span style="text-decoration: line-through;">svn co http://dev2.irontec.com/svn/asterisk-es-rsp/branches asterisk-es-rsp - -username guest - -password guest</span></p>
<p>svn co http://asterisk-es-rsp.irontec.com/svn/branches asterisk-rsp</p>
<p>Para ver el log:</p>
<p><span style="text-decoration: line-through;">svn log http://dev2.irontec.com/svn/asterisk-es-rsp/branches  - -username guest - -password guest</span></p>
<p>http://asterisk-es-rsp.irontec.com</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.voz-ip.com/2009/asterisk-es-rsp/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Asterisk Advanced - Final Countdown</title>
		<link>http://blog.voz-ip.com/2009/asterisk-advanced-final-countdown/</link>
		<comments>http://blog.voz-ip.com/2009/asterisk-advanced-final-countdown/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 10:36:34 +0000</pubDate>
		<dc:creator>saghul</dc:creator>
		
		<category><![CDATA[Asterisk]]></category>

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

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

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

		<guid isPermaLink="false">http://blog.voz-ip.com/?p=145</guid>
		<description><![CDATA[Se acabó. El Asterisk Advanced toca a su fin. Mientras escribo estas líneas los alumnos están concentrados es sus pantallas o tests teóricos dispuestos a aprobar el dCAP.
Ya que habíamos terminado el temario, hemos aprovechado la mañana para dudas y para comentarios acerca de temas que no se ven con mucha profundidad: hemos hablado de [...]]]></description>
			<content:encoded><![CDATA[<p>Se acabó. El Asterisk Advanced toca a su fin. Mientras escribo estas líneas los alumnos están concentrados es sus pantallas o tests teóricos dispuestos a aprobar el dCAP.<a href="http://blog.voz-ip.com/wp-content/uploads/2009/04/3469956463_470cf07846_b.jpg"><img class="alignnone size-medium wp-image-146" title="3469956463_470cf07846_b" src="http://blog.voz-ip.com/wp-content/uploads/2009/04/3469956463_470cf07846_b-300x225.jpg" alt="3469956463_470cf07846_b" width="300" height="225" /></a></p>
<p>Ya que habíamos terminado el temario, hemos aprovechado la mañana para dudas y para comentarios acerca de temas que no se ven con mucha profundidad: hemos hablado de faxing, de seguridad&#8230;</p>
<p>Si no nos han mentido en las encuestas <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> los alumnos han quedado muy contentos y muchos de ellos comentaban que una semana es poco tiempo para todo lo que es Asterisk. ¡Estáis locos! Una semana más de curso y seguido me encierran en alguna institución mental <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Siendo serios, ha sido una semana muy intensa pero muy gratificante: mola ver cómo la gente va aprendiendo y va resolviendo los problemas.</p>
<p>Ya solo me queda dar las gracias a todos los asistentes y a los que se examinan ¡Mucha suerte! ¡Que el RFC3261 os acompañe y los terminales os sean compatibles! <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>PD: Migel, ¿¡Dónde estabas que no has salido en la foto!?</p>
<p>PPD: Tenéis todas las fotos <a href="http://www.flickr.com/photos/saghul/sets/72157617119265298/" target="_blank">en Flickr.</a></p>
<p>Disclaimer: Post corregido por Jon &#8216;Reverte&#8217; Bonilla.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.voz-ip.com/2009/asterisk-advanced-final-countdown/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Asterisk Advanced - Día 4</title>
		<link>http://blog.voz-ip.com/2009/asterisk-advanced-dia-4/</link>
		<comments>http://blog.voz-ip.com/2009/asterisk-advanced-dia-4/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 07:06:44 +0000</pubDate>
		<dc:creator>saghul</dc:creator>
		
		<category><![CDATA[Asterisk]]></category>

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

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

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

		<guid isPermaLink="false">http://blog.voz-ip.com/?p=141</guid>
		<description><![CDATA[Día largo el de ayer, ¡tan largo que duró hasta bien entrada la noche!  
Como no podía ser de otra manera todos los alumnos estuvieron de acuerdo en tener una edición nocturna del Asterisk Advanced así que durante las prácticas que los alumnos realizaban Elio y yo preparamos algunos ejercicios con &#8220;truco&#8221;. Tras estrujarse [...]]]></description>
			<content:encoded><![CDATA[<p>Día largo el de ayer, ¡tan largo que duró hasta bien entrada la noche! <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <a href="http://blog.voz-ip.com/wp-content/uploads/2009/04/3469634238_00210b84de_b.jpg"><img class="alignnone size-medium wp-image-142" title="3469634238_00210b84de_b" src="http://blog.voz-ip.com/wp-content/uploads/2009/04/3469634238_00210b84de_b-300x225.jpg" alt="3469634238_00210b84de_b" width="300" height="225" /></a></p>
<p>Como no podía ser de otra manera todos los alumnos estuvieron de acuerdo en tener una edición nocturna del Asterisk Advanced así que durante las prácticas que los alumnos realizaban Elio y yo preparamos algunos ejercicios con &#8220;truco&#8221;. Tras estrujarse un poco el cerebro y a veces con alguna pista pudiéron resolverlos y comprobar lo versátil que Asterisk puede llegar a ser.</p>
<p>Hoy es un día un poco más corto, ya que se realizará el exámen para la obtención de la <strong>certificación oficial dCAP</strong> y luego toca desmontar todo el asunto <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>PD: Ánimo Jose!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.voz-ip.com/2009/asterisk-advanced-dia-4/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Asterisk Advanced  - Día 3</title>
		<link>http://blog.voz-ip.com/2009/asterisk-advanced-dia-3/</link>
		<comments>http://blog.voz-ip.com/2009/asterisk-advanced-dia-3/#comments</comments>
		<pubDate>Thu, 23 Apr 2009 07:34:06 +0000</pubDate>
		<dc:creator>saghul</dc:creator>
		
		<category><![CDATA[Asterisk]]></category>

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

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

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

		<guid isPermaLink="false">http://blog.voz-ip.com/?p=138</guid>
		<description><![CDATA[Día de cacharreo y dialplan el de ayer. Por la mañana profundizamos en diversos aspectos del dialplan y por la tarde jugamos a McGyver con las tarjetas  
Aunque la instalación y configuración de tarjetas es algo que se aprende relativamente rápido, requiere mucho movimiento por parte de los alumnos y se alborota un poco [...]]]></description>
			<content:encoded><![CDATA[<p>Día de cacharreo y dialplan el de ayer. Por la mañana profundizamos en diversos aspectos del dialplan y por la tarde jugamos a McGyver con las tarjetas <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <a href="http://blog.voz-ip.com/wp-content/uploads/2009/04/3467927870_ec5909e777_b.jpg"><img class="alignnone size-medium wp-image-139" title="3467927870_ec5909e777_b" src="http://blog.voz-ip.com/wp-content/uploads/2009/04/3467927870_ec5909e777_b-300x225.jpg" alt="3467927870_ec5909e777_b" width="300" height="225" /></a></p>
<p>Aunque la instalación y configuración de tarjetas es algo que se aprende relativamente rápido, requiere mucho movimiento por parte de los alumnos y se alborota un poco la cosa, pero eso a Elio y a mi nos da tiempo para buscar nuestros nombres en Google <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Tras aprender a instalar y configurar las tarjetas vinieron las pruebas: enlaces con cables PRI cross-over, teléfonos analógicos, simulaciones de líneas analógicas&#8230; vamos, un poco de todo.</p>
<p>Hoy toca dialplan de nuevo, que es en lo que más se profundiza a lo largo de todo el Asterisk Advanced, pero tal vez tengamos alguna sorpresa&#8230; ¿habrá un Asterisk Advanced Night Edition? <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.voz-ip.com/2009/asterisk-advanced-dia-3/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Asterisk Advanced - Día 2</title>
		<link>http://blog.voz-ip.com/2009/asterisk-advanced-dia-2/</link>
		<comments>http://blog.voz-ip.com/2009/asterisk-advanced-dia-2/#comments</comments>
		<pubDate>Wed, 22 Apr 2009 07:16:40 +0000</pubDate>
		<dc:creator>saghul</dc:creator>
		
		<category><![CDATA[Asterisk]]></category>

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

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

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

		<guid isPermaLink="false">http://blog.voz-ip.com/?p=133</guid>
		<description><![CDATA[Día durillo y lleno de conceptos el de ayer. Día de SIP. Día de IAX2. Día de aprender de VoIP más que de Asterisk.
Uno de los problemas con los que se encuentra mucha gente es que aunque en Asterisk se mueve bien, le flaquean conceptos de VoIP. Por ello el Asterisk Advanced incluye casi un [...]]]></description>
			<content:encoded><![CDATA[<p>Día durillo y lleno de conceptos el de ayer. Día de SIP. Día de IAX2. Día de aprender de VoIP más que de Asterisk.</p>
<p>Uno de los problemas con los que se encuentra mucha gente es que aunque en Asterisk se mueve bien, le flaquean conceptos de VoIP. Por ello el Asterisk Advanced incluye casi un día completo de teoría y práctica sobre SIP e IAX2. Fuimos viendo los protocolos de uno en uno y haciendo prácticas en medio, y los alumnos comprobaron que aunque la teoría esté clara siempre puede surgir algún problemilla <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <a href="http://blog.voz-ip.com/wp-content/uploads/2009/04/3465189646_64177a9d16_b.jpg"><img class="alignnone size-medium wp-image-134" title="3465189646_64177a9d16_b" src="http://blog.voz-ip.com/wp-content/uploads/2009/04/3465189646_64177a9d16_b-300x225.jpg" alt="3465189646_64177a9d16_b" width="300" height="225" /></a></p>
<p>Se va notando que hay cada vez más ganas de aprender, ya que varios alumnos se quedaron un rato más haciendo pruebas, capturas de tráfico, etc. Nosotros probamos a ver si las IAX transfers funionaban, y sorprendentemente ¡lo hacen! Aunque eso no quita para que SIP sea *el* protocolo a utilizar <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Hoy día de dialplan a muerte&#8230; ¿aguantarán hasta la noche?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.voz-ip.com/2009/asterisk-advanced-dia-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Asterisk Advanced - Día 1</title>
		<link>http://blog.voz-ip.com/2009/asterisk-advanced-dia-1/</link>
		<comments>http://blog.voz-ip.com/2009/asterisk-advanced-dia-1/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 07:40:30 +0000</pubDate>
		<dc:creator>saghul</dc:creator>
		
		<category><![CDATA[Asterisk]]></category>

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

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

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

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

		<guid isPermaLink="false">http://blog.voz-ip.com/?p=127</guid>
		<description><![CDATA[Al igual que el año pasado, iré posteando a día vencido las idas y venidas de los alumnos y de los &#8220;infiltrados&#8221; para que los que no hayan podido venir se hagan una idea de lo que por aquí se cuece.
Ayer fue el primer día, día de presentaciones. Los alumnos no se conocían los unos [...]]]></description>
			<content:encoded><![CDATA[<p>Al igual que el año pasado, iré posteando a día vencido las idas y venidas de los alumnos y de <a href="http://www.sinologic.net/2009-04/asterisk-advanced-bilbao-dia-1/" target="_blank">los &#8220;infiltrados&#8221;</a> para que los que no hayan podido venir se hagan una idea de lo que por aquí se cuece.</p>
<p>Ayer fue el primer día, día de presentaciones. Los alumnos no se conocían los unos a los otros pero al estar sentados juntos a medida que avanzaba la clase se hacían preguntas entre ellos y cooperaban en la resolución de problemas, eso mola <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <a href="http://blog.voz-ip.com/wp-content/uploads/2009/04/img_0019.jpg"><img class="alignnone size-medium wp-image-129" title="img_0019" src="http://blog.voz-ip.com/wp-content/uploads/2009/04/img_0019-300x225.jpg" alt="img_0019" width="300" height="225" /></a></p>
<p>Espero que hayan dormido bien, porque hoy empieza lo duro: dialplan a tope, y conceptos más profundos de VoIP, ya que ayer sólo vimos lo imprescindible como para configurar un Asterisk con dos terminales que pudieran llamarse entre ellos.</p>
<p>He de decir que el nuevo temario está bastante bien y se tratan con mayor profundidad algunos temas como el NAT, que cuando yo hice el BootCamp ni me mencionaron. También vamos metiendo algún bonus como el uso de ngrep para examinar trazas SIP, y así la cosa se pone más interesante <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Seguiremos informando&#8230;</p>
<p>PD: Tenéis todas la fotos que vaya sacando <a href="http://www.flickr.com/photos/saghul/sets/72157617119265298/" target="_blank">en Flickr</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.voz-ip.com/2009/asterisk-advanced-dia-1/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
