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

<channel>
	<title>blog.voz-ip.com: el blog de voz-IP del equipo de Irontec</title>
	<atom:link href="http://blog.voz-ip.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.voz-ip.com</link>
	<description>El blog de voz-IP del equipo de Irontec.</description>
	<lastBuildDate>Thu, 12 May 2011 13:53:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.3</generator>
		<item>
		<title>Recibiendo datos de la calidad del audio tras una llamada</title>
		<link>http://blog.voz-ip.com/2011/recibiendo-datos-de-la-calidad-del-audio-tras-una-llamada/</link>
		<comments>http://blog.voz-ip.com/2011/recibiendo-datos-de-la-calidad-del-audio-tras-una-llamada/#comments</comments>
		<pubDate>Thu, 12 May 2011 13:51:35 +0000</pubDate>
		<dc:creator>aizurza</dc:creator>
				<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Howto]]></category>
		<category><![CDATA[Teléfonos IP]]></category>

		<guid isPermaLink="false">http://blog.voz-ip.com/?p=483</guid>
		<description><![CDATA[A menudo (o siempre) es interesante recibir datos sobre la calidad de audio de una llamada que ha procesado nuestro Asterisk. Hablamos del Jitter, PacketLoss, MOS (Mean Opinion Score)&#8230; Aunque hay otras opciones como utilizar los RTCP Stats de Asterisk (Mejorado a partir de 1.6, pero en desuso) donde se establecen variables de canal con [...]]]></description>
			<content:encoded><![CDATA[<p>A menudo (o siempre) es interesante recibir datos sobre la calidad de audio de una llamada que ha procesado nuestro Asterisk. Hablamos del Jitter, PacketLoss, MOS (Mean Opinion Score)&#8230; Aunque hay otras opciones como utilizar los RTCP Stats de Asterisk (Mejorado a partir de 1.6, pero en desuso) donde se establecen variables de canal con los datos de la calidad de audio de la llamada, hoy vamos a probar las opciones que nos dan los propios terminales SIP (¡Inteligencia en los terminales!).</p>
<p>Las últimas versiones del firmware de Cisco para sus terminales Spa5xx (+7.4.7), nos permiten configurar un parámetro con el que podremos enviar toda la información relativa a la calidad del audio a un servidor tras finalizar una llamada (Terminales Snom con firmware +v8 parece que también lo soportan, pero no lo hemos probado). Se configura desde la propia web de forma muy sencilla: <a rel="attachment wp-att-515" href="http://blog.voz-ip.com/2011/recibiendo-datos-de-la-calidad-del-audio-tras-una-llamada/vqm/"><img class="aligncenter size-large wp-image-515" title="VQM" src="http://blog.voz-ip.com/wp-content/uploads/2011/05/VQM-620x329.png" alt="" width="620" height="329" /></a></p>
<p>Lo que hace el terminal en si es, enviar un mensaje SIP <strong>PUBLISH</strong> al servidor definido (P.Ej: collector@192.168.1.1:5060) conteniendo en el <em>body </em>datos relacionados de la llamada y la calidad de ésta.<br />
Estos eventos están definidos en el <a href="http://tools.ietf.org/search/rfc6035">RFC6035: <em>Session Initiation Protocol Event Package for Voice Quality Reporting</em></a>. Por si queréis echar un vistazo&#8230; ;P</p>
<p>Un ejemplo del mensaje que envía el terminal:<br />
<code><br />
PUBLISH sip:collector@10.1.100.190:7060 SIP/2.0.<br />
Via: SIP/2.0/UDP 10.10.0.180:5060;branch=z9hG4bK-e20d9c33.<br />
From: &lt;sip:terminalSIP@10.1.100.190&gt;;tag=f23bbd323541b235.<br />
To: &lt;sip:terminalSIP@10.1.100.190&gt;.<br />
Call-ID: a01e12b6-6eb5ba81@10.10.0.180.<br />
CSeq: 64175 PUBLISH.<br />
Max-Forwards: 70.<br />
Contact: &lt;sip:terminalSIP@10.10.0.180:5060&gt;.<br />
Accept: application/sdp, message/sipfrag.<br />
Event: vq-rtcpxr.<br />
User-Agent: Cisco/SPA504G-7.4.7.<br />
Content-Length: 802.<br />
Content-Type: application/vq-rtcpxr.<br />
.<br />
VQSessionReport: CallTerm.<br />
LocalMetrics:.<br />
Timestamps:START=2011-5-11T11:20:18Z STOP=2011-5-11T11:20:19Z.<br />
SessionDesc:PT=8 PD=PCMA SR=8000 FD=20 FO=8 FPP=10 PPS=100 PLC=3 SSUP=off.<br />
CallID: e850c0fe-1e19aa0f@10.10.0.180.<br />
FromID: &lt;sip:terminalSIP@10.10.0.180:5060&gt;.<br />
ToID: &lt;sip:5998@10.1.100.190:5060&gt;.<br />
OrigID: &lt;sip:terminalSIP@10.10.0.180:5060&gt;.<br />
LocalAddr: IP=10.10.0.180 PORT=16824 SSRC=467580294.<br />
LocalMAC: 00:02:fd:ff:d3:5a.<br />
RemoteAddr: IP=10.1.100.190 PORT=13914 SSRC=510.<br />
RemoteMAC: 0.<br />
<strong> JitterBuffer:JBA=3 JBR=15 JBN=171 JBM=171 JBX=300.<br />
PacketLoss:NLR=0 JDR=255.<br />
BurstGapLoss:BLD=0 BD=0 GLD=0 GD=0 GMIN=16.<br />
Delay:RTD=0 ESD=177 SOWD=88.<br />
Signal:RERL=127.<br />
QualityEst:RLQ=22 RCQ=20 MOSLQ=1.2 MOSCQ=1.2 QoEEstAlg=P.564.</strong><br />
DialogID:e850c0fe-1e19aa0f@10.10.0.180;to-tag=as0df6f540;from-tag=ea2ec326d50586bo0.<br />
</code></p>
<p>Si os fijáis, el servidor que recibe este PUBLISH está escuchando en el 5070 mientras la señalización de las llamadas (SIP) está en el puerto 5060. Sí, mientras Asterisk gestiona las llamadas necesitamos un OpenSIPS/Kamailio para gestionar estos PUBLISH.<br />
¿Por qué?<br />
Porque Asterisk hasta la versión 1.8 (quizá alguna versión de 1.6?¿) ni siquiera soportaba mensajes del tipo PUBLISH y a partir de la 1.8 los soporta pero no para estos eventos concretos (vq-rtcpxr). La respuesta de un Asterisk:   <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /><br />
<code><br />
SIP/2.0 489 Bad Event.<br />
Via: SIP/2.0/UDP 10.10.0.177:5061;branch=z9hG4bK-aea9a42c;received=10.10.0.177.<br />
From: ;tag=11636c9b167e05fa.<br />
To: ;tag=as0d04d7f8.<br />
Call-ID: ae68d5ef-aadd8cb6@10.10.0.177.<br />
CSeq: 1316 PUBLISH.<br />
Server: "Irontec IVOZ".<br />
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH.<br />
Supported: replaces, timer.<br />
Content-Length: 0.<br />
</code></p>
<p>A lo que vamos&#8230; vamos a configurar un OpenSIPS/Kamailio para recibir estos mensajes y hacer después con ellos lo que creamos oportuno (guardarlo en BBDD, ejecutar un script&#8230;).<br />
No vamos a explicar como instalar el software ya que hay multitud de &#8216;HowTo&#8217;-s disponibles en la red. Vamos directamente a lo que nos interesa, el fichero de configuración. En este caso se ha utilizado OpenSIPS pero con Kamailio debería ser muy parecido si no igual. Es una instalación básica sin ningún módulo extra, ya que en este caso lo único que haremos será recibir los datos, ejecutar un script y responder con un OK.<br />
&#8220;<em>Dialplan</em>&#8221; de opensips.cfg:</p>
<blockquote><p>####### Routing Logic ########</p>
<p>route{</p>
<p style="padding-left: 30px;">if (!mf_process_maxfwd_header(&#8220;10&#8243;)) {</p>
<p style="padding-left: 60px;">sl_send_reply(&#8220;483&#8243;,&#8221;Too Many Hops&#8221;);<br />
exit;</p>
<p style="padding-left: 30px;">}</p>
<p style="padding-left: 30px;">if (!is_method(&#8220;PUBLISH&#8221;))  ## Solo gestionaremos PUBLISH<br />
{</p>
<p style="padding-left: 60px;">sl_send_reply(&#8220;503&#8243;,&#8221;Not here please&#8221;);<br />
exit;</p>
<p style="padding-left: 30px;">}<br />
if (!uri==myself)<br />
{</p>
<p style="padding-left: 60px;">sl_send_reply(&#8220;503&#8243;,&#8221;SIP Publish ok, but please use our domain&#8221;);<br />
exit;</p>
<p style="padding-left: 30px;">}<br />
if (is_method(&#8220;PUBLISH&#8221;))<br />
{</p>
<p style="padding-left: 60px;">if (!$(hdr(Event)[-1]) == &#8220;vq-rtcpxr&#8221;)  ## Solo gestionamos este evento concreto. Audio quality<br />
{</p>
<p style="padding-left: 90px;">sl_send_reply(&#8220;503&#8243;,&#8221;Not here please&#8221;);<br />
exit;</p>
<p style="padding-left: 60px;">}</p>
<p style="padding-left: 60px;">xlog(&#8220;EVENT: $(hdr(Event)[-1])&#8221;);   ##Un poco de log&#8230;<br />
xlog(&#8220;Got a PUBLISH: $rb&#8221;);</p>
<p style="padding-left: 60px;">exec_avp(&#8220;/root/testing/test.sh &#8216;$rb&#8217;&#8221;);  ##Ejecutamos un Script pasándole como variable el <em>body </em>del PUBLISH recibido. También se puede utilizar la función exec_msg<br />
sl_send_reply(&#8220;200&#8243;, &#8220;Thanks for this stats&#8221;);  ##Respondemos con un 200<br />
exit;</p>
<p style="padding-left: 30px;">}</p>
<p>}</p></blockquote>
<p>Como se puede ver en los comentarios del código anterior, es posible utilizar, además de &#8216;exec_avp&#8217;, la función &#8216;exec_msg&#8217;. La diferencia es que, en un caso se procesa la salida del comando (exec_avp) y en el otro no (exec_msg). Detalle <strong>importante</strong>: la variable &#8216;$rb&#8217; (reference to message body) tiene que pasarse al script entre comillas, porque el cuerpo del mensaje contiene caracteres especiales y necesitamos que nuestro script los pueda interpretar. Más info al respecto <a href="http://www.kamailio.org/docs/modules/1.4.x/exec.html#id2453001">aquí</a> y <a href="http://www.opensips.org/Resources/DocsCoreVar">aquí</a>.</p>
<p>¿Que podemos hacer en este script externo? Pues, todo lo que necesitemos/queramos y nuestra imaginación nos permita. Por ejemplo, sacar informes de calidad de audio de llamadas representando estos datos en gráficas creadas con RRDtool&#8230;</p>
<p>Happy VoIP hacking !!! ;P</p>



Te ha gustado? Compartelo:


	<a rel="nofollow"  href="http://www.printfriendly.com/print?url=http%3A%2F%2Fblog.voz-ip.com%2F2011%2Frecibiendo-datos-de-la-calidad-del-audio-tras-una-llamada%2F&amp;partner=sociable" title="Print"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/printfriendly.png" title="Print" alt="Print" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.voz-ip.com%2F2011%2Frecibiendo-datos-de-la-calidad-del-audio-tras-una-llamada%2F&amp;title=Recibiendo%20datos%20de%20la%20calidad%20del%20audio%20tras%20una%20llamada&amp;notes=A%20menudo%20%28o%20siempre%29%20es%20interesante%20recibir%20datos%20sobre%20la%20calidad%20de%20audio%20de%20una%20llamada%20que%20ha%20procesado%20nuestro%20Asterisk.%20Hablamos%20del%20Jitter%2C%20PacketLoss%2C%20MOS%20%28Mean%20Opinion%20Score%29...%20Aunque%20hay%20otras%20opciones%20como%20utilizar%20los%20RTCP%20Stats%20de%20Aster" title="del.icio.us"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.voz-ip.com%2F2011%2Frecibiendo-datos-de-la-calidad-del-audio-tras-una-llamada%2F&amp;t=Recibiendo%20datos%20de%20la%20calidad%20del%20audio%20tras%20una%20llamada" title="Facebook"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.voz-ip.com%2F2011%2Frecibiendo-datos-de-la-calidad-del-audio-tras-una-llamada%2F&amp;title=Recibiendo%20datos%20de%20la%20calidad%20del%20audio%20tras%20una%20llamada&amp;annotation=A%20menudo%20%28o%20siempre%29%20es%20interesante%20recibir%20datos%20sobre%20la%20calidad%20de%20audio%20de%20una%20llamada%20que%20ha%20procesado%20nuestro%20Asterisk.%20Hablamos%20del%20Jitter%2C%20PacketLoss%2C%20MOS%20%28Mean%20Opinion%20Score%29...%20Aunque%20hay%20otras%20opciones%20como%20utilizar%20los%20RTCP%20Stats%20de%20Aster" title="Google Bookmarks"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://barrapunto.com/submit.pl?subj=Recibiendo%20datos%20de%20la%20calidad%20del%20audio%20tras%20una%20llamada&amp;story=http%3A%2F%2Fblog.voz-ip.com%2F2011%2Frecibiendo-datos-de-la-calidad-del-audio-tras-una-llamada%2F" title="BarraPunto"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/barrapunto.png" title="BarraPunto" alt="BarraPunto" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://meneame.net/submit.php?url=http%3A%2F%2Fblog.voz-ip.com%2F2011%2Frecibiendo-datos-de-la-calidad-del-audio-tras-una-llamada%2F" title="Meneame"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/meneame.png" title="Meneame" alt="Meneame" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://twitter.com/home?status=Recibiendo%20datos%20de%20la%20calidad%20del%20audio%20tras%20una%20llamada%20-%20http%3A%2F%2Fblog.voz-ip.com%2F2011%2Frecibiendo-datos-de-la-calidad-del-audio-tras-una-llamada%2F" title="Twitter"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blog.voz-ip.com/2011/recibiendo-datos-de-la-calidad-del-audio-tras-una-llamada/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Queuerules en Asterisk 1.8</title>
		<link>http://blog.voz-ip.com/2011/queuerules-en-asterisk-1-8/</link>
		<comments>http://blog.voz-ip.com/2011/queuerules-en-asterisk-1-8/#comments</comments>
		<pubDate>Fri, 11 Mar 2011 11:49:57 +0000</pubDate>
		<dc:creator>voz-ip.com</dc:creator>
				<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[Colas]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Irontec]]></category>

		<guid isPermaLink="false">http://blog.voz-ip.com/?p=429</guid>
		<description><![CDATA[Queuerules en Asterisk 1.8 Aunque la funcionalidad de queuerules se aplicó en la versión de asterisk 1.6, como tantos otros, nosotros hemos empezado a utilizar las nuevas posibilidades que nos encontramos al migrar desde asterisk 1.4 (en nuestro caso 1.4-rsp) a la nueva versión 1.8. Hoy en día cuando configuramos colas, estas están compuestas por [...]]]></description>
			<content:encoded><![CDATA[<p>Queuerules en Asterisk 1.8</p>
<p>Aunque la funcionalidad de queuerules se aplicó en la versión de asterisk 1.6, como tantos otros, nosotros hemos empezado a utilizar las nuevas posibilidades que nos encontramos al migrar desde asterisk 1.4 (en nuestro caso 1.4-rsp) a la nueva versión 1.8.</p>
<p>Hoy en día cuando configuramos colas, estas están compuestas por miembros que las atienden.  En las colas estos miembros están ordenados para atender llamadas y asterisk decide a quien debe de enviarle la llamada. Esta decisión la toma en base a unos parámetros como la estrategia, o la prioridad de los miembros en la cola.  Para el caso que nos atañe, lo que nos interesa es la prioridad o penalty.</p>
<p>Gracias a la prioridad,  podemos priorizar quien atenderá las llamadas. La forma común de comportarse una cola sería la siguiente:</p>
<p>Primero atenderán la llamada loa miembros que estén con prioridad “1”, si no hay nadie disponible con esta prioridad, atendrán la llamada los miembros con prioridad “2”, si no los de prioridad “3”, y así sucesivamente.</p>
<p><a href="http://blog.voz-ip.com/2011/queuerules-en-asterisk-1-8/sin_queuerules/" rel="attachment wp-att-432"><img src="http://blog.voz-ip.com/wp-content/uploads/2011/03/sin_queuerules.png" alt="" title="sin_queuerules" width="391" height="389" class="aligncenter size-full wp-image-432" /></a></p>
<p>El problema está en colas con muchas llamadas. En este caso casi siempre los miembros con prioridad 1 están ocupados con lo que saltan a los miembros con prioridad 2. Si queremos que no les entre la llamada a los miembros con prioridad 2 hasta pasados X segundos, solo podíamos dirigirlos hacia otras colas con otros miembros con distinta prioridad, pero esto hace que la persona que ha entrado en la cola pierda su puesto en ella, ya que le mandamos a otra cola.</p>
<p>Pero ahora con podemos hacer que esa prioridad máxima y mínima de atención en la cola varíe en el transcurso de la llamada. Para esto tenemos las reglas de cambio de prioridad definidas en  “queuerules.conf” y las variables de canal QUEUE_MIN_PENALTY QUEUE_MAX_PENALTY. Las variables definen la prioridad máxima y mínima de los agentes que atenderán la llamada y esta regla se puede aplicar de dos formas, en la opción “rule” de la aplicación Queue o bien en la opción de cola “defaultrule”.</p>
<blockquote><p>Queuerules.conf</p>
<p>En este archivo de configuración  podemos crear reglas para modificar las prioridades máxima y mínima que atenderán en la cola. Solo los miembros que estén entre estas prioridades máxima y mínima podrán recibir llamadas de la cola. Estas reglas se definen de la siguiente manera en queuerules.conf</p>
<p>; sintaxis<br />
; penaltychange => <número de segundos en la llamada encolada>,<cambio absoluto o relativo de  QUEUE_MAX_PENALTY>[,cambio absoluto o relativo de QUEUE_MIN_PENALTY]<br />
[myrule]<br />
penaltychange => 30,+1 ; después de 30 segundos, incrementa QUEUE_MAX_PENALTY en 1 y deja QUEUE_MIN_PENALTY igual .<br />
penaltychange => 45,5,2; después de 45 segundos, pone QUEUE_MAX_PENALTY a 5  y QUEUE_MIN_PENALTY lo pone a 2.<br />
penaltychange => 75,,1; después de 30 segundos, deja QUEUE_MAX_PENALTY como estaba y QUEUE_MIN_PENALTY lo pone a 1.</p></blockquote>
<p>Un ejemplo lógico sería:</p>
<p>Creamos una cola</p>
<p><code>[COLA1]<br />
musicclass=default<br />
strategy=rrmemory<br />
joinempty=no<br />
leavewhenempty=yes<br />
ringinuse=no<br />
defaultrule=miembros-prio</code></p>
<p><code>member => SIP/0000FFFF0001,0,Miembro 1         ; Prioridad 1<br />
member => SIP/0000FFFF0002,1,Miembro 2         ; Prioridad 2<br />
member => SIP/0000FFFF0003,2,Miembro 3 		; Prioridad 3</code></p>
<p>Tenemos como regla de prioridades en queuerules.conf lo siguiente:</p>
<p><code>[miembros-prio]<br />
penaltychange => 30,+1<br />
penaltychange => 60,+1</code> </p>
<p>En el dialpan tendríamos esto:</p>
<p><code>[entrantes]<br />
exten => X.,1,NoOp(Llamada entrante de ${CALLERID(num)})<br />
exten => X.,n,Set(QUEUE_MIN_PENALTY=1)<br />
exten => X.,n,Set(QUEUE_MAX_PENALTY=1)<br />
;Queue(queuename[,options[,URL[,announceoverride[,timeout[,AGI[,macro[,gosub[,rule[,position]]]]]]]]]) con lo que se podría aplicarse la “rule” miembros-prio en esta aplicación ejem: exten => X.,n,Queue(COLA1,,,,,,,,miembros-prio). Como en queues.conf ya la hemos definido como regla por defecto, no hace falta.<br />
exten => X.,n,Queue(COLA1)<br />
</code><br />
Esto hará que primero busque a los miembros con prioridad 1, si están ocupados no busca a miembros con mayor prioridad hasta que pase 30 segundos que es cuando la regla que hemos definido aumenta el QUEUE_MAX_PENALTY a 2. En este momento buscará miembros con prioridad 2 y si están también ocupados no buscará los de más prioridad hasta pasados otros 30 segundos como está definido en la regla miembros-prio.</p>
<p><a href="http://blog.voz-ip.com/2011/queuerules-en-asterisk-1-8/con_queuerules/" rel="attachment wp-att-431"><img src="http://blog.voz-ip.com/wp-content/uploads/2011/03/con_queuerules-507x620.png" alt="" title="con_queuerules" width="507" height="620" class="aligncenter size-large wp-image-431" /></a></p>



Te ha gustado? Compartelo:


	<a rel="nofollow"  href="http://www.printfriendly.com/print?url=http%3A%2F%2Fblog.voz-ip.com%2F2011%2Fqueuerules-en-asterisk-1-8%2F&amp;partner=sociable" title="Print"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/printfriendly.png" title="Print" alt="Print" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.voz-ip.com%2F2011%2Fqueuerules-en-asterisk-1-8%2F&amp;title=Queuerules%20en%20Asterisk%201.8&amp;notes=Queuerules%20en%20Asterisk%201.8%0D%0A%0D%0AAunque%20la%20funcionalidad%20de%20queuerules%20se%20aplic%C3%B3%20en%20la%20versi%C3%B3n%20de%20asterisk%201.6%2C%20como%20tantos%20otros%2C%20nosotros%20hemos%20empezado%20a%20utilizar%20las%20nuevas%20posibilidades%20que%20nos%20encontramos%20al%20migrar%20desde%20asterisk%201.4%20%28en%20nuestro" title="del.icio.us"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.voz-ip.com%2F2011%2Fqueuerules-en-asterisk-1-8%2F&amp;t=Queuerules%20en%20Asterisk%201.8" title="Facebook"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.voz-ip.com%2F2011%2Fqueuerules-en-asterisk-1-8%2F&amp;title=Queuerules%20en%20Asterisk%201.8&amp;annotation=Queuerules%20en%20Asterisk%201.8%0D%0A%0D%0AAunque%20la%20funcionalidad%20de%20queuerules%20se%20aplic%C3%B3%20en%20la%20versi%C3%B3n%20de%20asterisk%201.6%2C%20como%20tantos%20otros%2C%20nosotros%20hemos%20empezado%20a%20utilizar%20las%20nuevas%20posibilidades%20que%20nos%20encontramos%20al%20migrar%20desde%20asterisk%201.4%20%28en%20nuestro" title="Google Bookmarks"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://barrapunto.com/submit.pl?subj=Queuerules%20en%20Asterisk%201.8&amp;story=http%3A%2F%2Fblog.voz-ip.com%2F2011%2Fqueuerules-en-asterisk-1-8%2F" title="BarraPunto"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/barrapunto.png" title="BarraPunto" alt="BarraPunto" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://meneame.net/submit.php?url=http%3A%2F%2Fblog.voz-ip.com%2F2011%2Fqueuerules-en-asterisk-1-8%2F" title="Meneame"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/meneame.png" title="Meneame" alt="Meneame" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://twitter.com/home?status=Queuerules%20en%20Asterisk%201.8%20-%20http%3A%2F%2Fblog.voz-ip.com%2F2011%2Fqueuerules-en-asterisk-1-8%2F" title="Twitter"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blog.voz-ip.com/2011/queuerules-en-asterisk-1-8/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>TLS+SRTP en Asterisk 1.8 (Especial Cisco SPA5xx)</title>
		<link>http://blog.voz-ip.com/2011/tlssrtp-en-asterisk-1-8/</link>
		<comments>http://blog.voz-ip.com/2011/tlssrtp-en-asterisk-1-8/#comments</comments>
		<pubDate>Fri, 25 Feb 2011 09:31:52 +0000</pubDate>
		<dc:creator>voz-ip.com</dc:creator>
				<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[Digium]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Howto]]></category>
		<category><![CDATA[Irontec]]></category>
		<category><![CDATA[Teléfonos IP]]></category>

		<guid isPermaLink="false">http://blog.voz-ip.com/?p=388</guid>
		<description><![CDATA[Volvemos a la carga con un pequeño post sobre como configurar otra de las nuevas features que nos trae Asterisk 1.8: TLS y SRTP, audio (y video) cifrado y seguro. Estos tests se han realizado con terminales Cisco SPA5XX, que supone tener que aplicar un pequeño parche en el código de Asterisk (luego veremos el [...]]]></description>
			<content:encoded><![CDATA[<p>Volvemos a la carga con un pequeño post sobre como configurar otra de las nuevas features que nos trae Asterisk 1.8: TLS y SRTP, audio (y video) cifrado y seguro.<br />
Estos tests se han realizado con terminales Cisco SPA5XX, que supone tener que aplicar un pequeño parche en el código de Asterisk (luego veremos el porque), pero funciona exactamente igual para terminales Snom y softphones como <a href="http://icanblink.com/">Blink</a><br />
La parte de configuración se explicará bastante rápido, ya que está explicado en varios sitios en la web.</p>
<p>Empezamos:<br />
1. Es necesario compilar la librería libSRTP para que Asterisk tenga el soporte SRTP.<br />
<code><br />
wget http://srtp.sourceforge.net/srtp-1.4.2.tgz<br />
tar zxvf srtp-1.4.2.tgz<br />
cd srtp/<br />
CFLAGS="-Wall -O4 -fexpensive-optimizations -funroll-loops -fPIC" ./configure<br />
make &#038;&#038; make install<br />
</code></p>
<p>2. Descargamos y Compilamos Asterisk: (Para este Post se utiliza la versión 1.8.2.3)<br />
<code><br />
svn co http://svn.asterisk.org/svn/asterisk/tags/1.8.2.3/ asterisk18<br />
cd asterisk18<br />
./configure<br />
make menuselect <em>(nos aseguramos de que esté res_srtp activado en 'Resource Modules')</em><br />
</code><br />
**Ahora es cuando tenemos que aplicar el parche anteriormente mencionado**<br />
¿Porque? Es necesario parchear el código porque los terminales SPA5xx envían dos líneas con el atributo crypto, tal que:<br />
<code><br />
a=crypto:1 AES_CM_128_HMAC_SHA1_32 inline:Ud154Hz42jLai6YI7RBcKtctTHBzIKjiHM6nGD36.<br />
a=crypto:2 AES_CM_128_HMAC_SHA1_80 inline:Ud154Hz42jLai6YI7RBcKtctTHBzIKjiHM6nGD36.<br />
</code><br />
y Asterisk no es capaz de negociar cual de los métodos (AES_32 o AES_80) se va a utilizar para la encriptación. De hecho, sólo escoge el primero y como podéis ver, los Cisco envían primero el AES_32.<br />
Aquí está el problema. Asterisk es capaz de manejar ambos tipos, pero sólo ofrece uno de ellos, el AES_80. Por tanto, tenemos que parchear el código para que Asterisk ofrezca en la señalización encriptación AES_32. Si no, se cifrará el Audio en las dos patas con un tipo diferente y nos quedamos sin audio y con  un mensaje eterno (30 por Seg.) en el CLI:<br />
<code><br />
WARNING[25205]: res_srtp.c:338 ast_srtp_unprotect: SRTP unprotect: authentication failure<br />
</code><br />
Más info al respecto en el <a href="https://issues.asterisk.org/view.php?id=18674">Bugtracker de Digium</a><br />
Un poco de SIP para ver &#8220;claro&#8221; el problema (primer INVITE e INVITE de Asterisk al destino):<br />
<code><br />
INVITE sip:200@10.10.0.165 SIP/2.0.<br />
From: <sip:100@10.10.0.165>;tag=630e30c1d5621880o3.<br />
To: "200" <sip:200@10.10.0.165>.<br />
m=audio 16890 RTP/SAVP 8 0 9 18.<br />
a=crypto:1 AES_CM_128_HMAC_SHA1_32 inline:hE+4XPMbPaF9/XEgIek7rUJiqoTEpLGZ1YXNiJhS.<br />
a=crypto:2 AES_CM_128_HMAC_SHA1_80 inline:hE+4XPMbPaF9/XEgIek7rUJiqoTEpLGZ1YXNiJhS.</p>
<p><strong>INVITE sip:200@10.10.0.177:5063 SIP/2.0.<br />
From: "100" <sip:100@10.10.0.165>;tag=as72caceda.<br />
To: <sip:200@10.10.0.177:5063>.<br />
Contact: <sip:100@10.10.0.165:5060>.<br />
User-Agent: Asterisk PBX 1.8.2.3.<br />
Remote-Party-ID: "100" <sip:100@10.10.0.165>;party=calling;privacy=off;screen=no.<br />
m=audio 12202 RTP/SAVP 8.<br />
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:5uWtfxfK0vE90lTrgLTr83bRWTL2nCEFJ6NlXWjq.</strong><br />
</code></p>
<p>El parche es bien simple:<br />
<code><br />
--- channels/sip/sdp_crypto.c	2010-06-08 07:29:08.708826000 +0200<br />
+++ channels/sip/sdp_crypto.c	2011-02-24 17:37:00.514711568 +0100<br />
@@ -287,7 +287,8 @@<br />
 int sdp_crypto_offer(struct sdp_crypto *p)<br />
 {<br />
 	char crypto_buf[128];<br />
-	const char *crypto_suite = "AES_CM_128_HMAC_SHA1_80"; /* Crypto offer */<br />
+	//const char *crypto_suite = "AES_CM_128_HMAC_SHA1_80"; /* Crypto offer */<br />
+	const char *crypto_suite = "AES_CM_128_HMAC_SHA1_32"; /* Crypto offer */</p>
<p> 	if (p->a_crypto) {<br />
 		ast_free(p->a_crypto);<br />
</code><br />
Aplicamos el parche (lo hemos nombrado como sdp_crypto.patch):<br />
<code><br />
patch -p0 < sdp_crypto.patch (<em>suponiendo que estamos en /usr/src/asterisk18 y tenemos el parche en la misma carpeta</em>)<br />
</code><br />
Asterisk is patched!!! <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /><br />
Ya podemos compilar e instalar:<br />
<code><br />
make &#038;&#038; make install<br />
</code></p>
<p>3. Configuración (tanto para TLS como para SRTP)<br />
<strong>**TLS**</strong><br />
-Primero nos generamos una clave pública y otra privada, las fusionamos en un único fichero y la guardamos en algún sitio conocido.<br />
Hay formas mucho mejores y elegantes de hacerlo (<a href="https://wiki.asterisk.org/wiki/display/AST/Secure+Calling+Tutorial">léeme</a>), pero esto sólo es para testing! <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /><br />
<code><br />
openssl genrsa 1024 > host.key<br />
openssl req -new -x509 -nodes -sha1 -days 365 -key host.key > host.cert<br />
cat host.cert host.key > asterisk.pem<br />
mv asterisk.pem /etc/asterisk/keys/<br />
</code></p>
<p>-Configuramos <strong>sip.conf</strong> para poder utilizar TLS:<br />
<code><br />
tlsenable=yes<br />
tlsbindaddr=0.0.0.0<br />
tlscertfile=/etc/asterisk/keys/asterisk.pem<br />
</code></p>
<p>-Configuramos los peers para que trabajen con TLS. Tanto en realtime como en raw en sip.conf hay que añadir:<br />
<code><br />
transport=tls  <em>(por defecto es UDP)</em><br />
</code></p>
<p>-Configuramos nuestro SPA5XX para que utilice TLS:<br />
<a href="http://blog.voz-ip.com/2011/tlssrtp-en-asterisk-1-8/spa-settings/" rel="attachment wp-att-397"><img src="http://blog.voz-ip.com/wp-content/uploads/2011/02/spa-settings.jpg" alt="" title="spa-settings" width="541" height="250" class="aligncenter size-full wp-image-397" /></a></p>
<p>Ya tenemos señalización segura entre Asterisk y los terminales!! ;P<br />
Para asegurarnos capturamos en el puerto 5061 y no vemos &#8220;nada&#8221;:<br />
<code><br />
....J...F..Mg|.L^<br />
...E}.....A...d.|.~...... l..i9.j,..q"..............&#038;./....5................0..~0...................0...*.H........0..1.0...U....ES1.0...U....Vizcaya1.0...U....Erandio1.0...U.<br />
..Irontec1.0...U....VozIP1.0...U....Irontec1 0...*.H........vozip@irontec.com0...110215125446Z..210212125446Z0..1.0...U....ES1.0...U....Vizcaya1.0...U....Erandio1.0...U.<br />
..Irontec1.0...U....VozIP1.0...U....Irontec1 0...*.H........vozip@irontec.com0..0...*.H............0........>.S.51...bND.J..Q..O.).-t.."~x..g&#038;^t....E.*..@..n.jF...v.t.<....Zf...%Y.......[...[....HE.e....9..8...qc..|(...P.....*.c4>.V..........0..0...U.........En?.0.%.^......<br />
.0....U.#...0.......En?.0.%.^......<br />
.......0..1.0...U....ES1.0...U....Vizcaya1.0...U....Erandio1.0...U.<br />
..Irontec1.0...U....VozIP1.0...U....Irontec1 0...*.H........vozip@irontec.com...........0...U....0....0...*.H............T.-F....R..2%.....T......=9.ye.z..6.0............i...O;.../s..e.........S.6.31......!iT......N....]........>XNt....Z...MHKH3...K.........<br />
</code></p>
<p><strong>**SRTP**</strong><br />
-Para configurar SRTP tenemos que poner la directiva &#8216;encryption&#8217; en los peers (ya sean realtime o en sip.conf)<br />
<code><br />
encryption=yes<br />
</code><br />
-En los SPA5XX hay que tocar 3 valores. Esto es configurable al menos, desde la versión 7.4.3 del firmware (OJO! que se aplica para todas las líneas configuradas):<br />
  +SRTP Method: <em>s-descriptor</em><br />
<a href="http://blog.voz-ip.com/2011/tlssrtp-en-asterisk-1-8/spa-srtp-2/" rel="attachment wp-att-409"><img src="http://blog.voz-ip.com/wp-content/uploads/2011/02/SPA-SRTP1-620x255.png" alt="" title="SPA-SRTP" width="620" height="255" class="aligncenter size-large wp-image-409" /></a><br />
  +Secure Call Serv: <em>yes</em><br />
<a href="http://blog.voz-ip.com/2011/tlssrtp-en-asterisk-1-8/spa-srtp2/" rel="attachment wp-att-410"><img src="http://blog.voz-ip.com/wp-content/uploads/2011/02/SPA-SRTP2-620x216.png" alt="" title="SPA-SRTP2" width="620" height="216" class="aligncenter size-large wp-image-410" /></a><br />
  +Secure Call Setting: <em>yes</em><br />
<a href="http://blog.voz-ip.com/2011/tlssrtp-en-asterisk-1-8/spa-srtp3/" rel="attachment wp-att-411"><img src="http://blog.voz-ip.com/wp-content/uploads/2011/02/SPA-SRTP3-620x310.png" alt="" title="SPA-SRTP3" width="620" height="310" class="aligncenter size-large wp-image-411" /></a></p>
<p>Voilá! Ya tenemos SRTP configurado!<br />
DETALLE: No hay modo opcional de SRTP para Asterisk, es decir, si está encryption activado en el peer no aceptará audio no cifrado y al contrario. En los terminales en cambio, si está el cifrado configurado, pero no el peer como tal, las llamadas entrantes se establecerán sin problemas. No así, las salientes, porque el terminal hemos dicho que tenía SRTP activo y para Asterisk no. En los Snom se puede utilizar también el modo &#8216;Optional&#8217; para el SRTP (envía dos atributos m=audio con y sin SRTP), pero Asterisk no sabe manejar estos SDP&#8230; :S</p>
<p>4. Pruebas<br />
Para probar todo esto lo más fácil es capturar tráfico en la red y después verificar con WireShark, OmniPeek o cualquier otro software si vemos la señalización en claro y si podemos escuchar las conversaciones.<br />
En los test realizados en nuestro lab, nos encontramos con un Warning (no siempre) en el CLI, pero en principio todo funciona como debe.<br />
<code><br />
WARNING[25205]: res_srtp.c:338 ast_srtp_unprotect: SRTP unprotect: authentication failure<br />
</code><br />
Estamos debuggeando este último punto para ver que puede estar provocándolo&#8230;</p>
<p><strong>**Curiosidad**</strong><br />
Los CiscoSPA5XX cuando están con SRTP activado, reproducen una especie de &#8220;beep&#8221; tres veces al principio de la conversación y muestran en pantalla un $ como símbolo de conversación encriptada. Un ejemplo:<br />
<a href="http://blog.voz-ip.com/2011/tlssrtp-en-asterisk-1-8/la-foto-1/" rel="attachment wp-att-423"><img src="http://blog.voz-ip.com/wp-content/uploads/2011/02/la-foto-1-620x463.jpg" alt="" title="la foto (1)" width="620" height="463" class="aligncenter size-large wp-image-423" /></a></p>
<p>Al final ha quedado un post un tanto largo&#8230; pero bueno, esperemos que sirva a alguien! ;P<br />
Como siempre, cualquier duda/consulta/crítica será bienvenida.</p>
<p>Un saludo!</p>



Te ha gustado? Compartelo:


	<a rel="nofollow"  href="http://www.printfriendly.com/print?url=http%3A%2F%2Fblog.voz-ip.com%2F2011%2Ftlssrtp-en-asterisk-1-8%2F&amp;partner=sociable" title="Print"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/printfriendly.png" title="Print" alt="Print" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.voz-ip.com%2F2011%2Ftlssrtp-en-asterisk-1-8%2F&amp;title=TLS%2BSRTP%20en%20Asterisk%201.8%20%28Especial%20Cisco%20SPA5xx%29&amp;notes=Volvemos%20a%20la%20carga%20con%20un%20peque%C3%B1o%20post%20sobre%20como%20configurar%20otra%20de%20las%20nuevas%20features%20que%20nos%20trae%20Asterisk%201.8%3A%20TLS%20y%20SRTP%2C%20audio%20%28y%20video%29%20cifrado%20y%20seguro.%0D%0AEstos%20tests%20se%20han%20realizado%20con%20terminales%20Cisco%20SPA5XX%2C%20que%20supone%20tener%20que%20aplica" title="del.icio.us"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.voz-ip.com%2F2011%2Ftlssrtp-en-asterisk-1-8%2F&amp;t=TLS%2BSRTP%20en%20Asterisk%201.8%20%28Especial%20Cisco%20SPA5xx%29" title="Facebook"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.voz-ip.com%2F2011%2Ftlssrtp-en-asterisk-1-8%2F&amp;title=TLS%2BSRTP%20en%20Asterisk%201.8%20%28Especial%20Cisco%20SPA5xx%29&amp;annotation=Volvemos%20a%20la%20carga%20con%20un%20peque%C3%B1o%20post%20sobre%20como%20configurar%20otra%20de%20las%20nuevas%20features%20que%20nos%20trae%20Asterisk%201.8%3A%20TLS%20y%20SRTP%2C%20audio%20%28y%20video%29%20cifrado%20y%20seguro.%0D%0AEstos%20tests%20se%20han%20realizado%20con%20terminales%20Cisco%20SPA5XX%2C%20que%20supone%20tener%20que%20aplica" title="Google Bookmarks"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://barrapunto.com/submit.pl?subj=TLS%2BSRTP%20en%20Asterisk%201.8%20%28Especial%20Cisco%20SPA5xx%29&amp;story=http%3A%2F%2Fblog.voz-ip.com%2F2011%2Ftlssrtp-en-asterisk-1-8%2F" title="BarraPunto"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/barrapunto.png" title="BarraPunto" alt="BarraPunto" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://meneame.net/submit.php?url=http%3A%2F%2Fblog.voz-ip.com%2F2011%2Ftlssrtp-en-asterisk-1-8%2F" title="Meneame"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/meneame.png" title="Meneame" alt="Meneame" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://twitter.com/home?status=TLS%2BSRTP%20en%20Asterisk%201.8%20%28Especial%20Cisco%20SPA5xx%29%20-%20http%3A%2F%2Fblog.voz-ip.com%2F2011%2Ftlssrtp-en-asterisk-1-8%2F" title="Twitter"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blog.voz-ip.com/2011/tlssrtp-en-asterisk-1-8/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Algunas experiencias con Asterisk 1.8.x</title>
		<link>http://blog.voz-ip.com/2010/365/</link>
		<comments>http://blog.voz-ip.com/2010/365/#comments</comments>
		<pubDate>Thu, 23 Dec 2010 16:13:31 +0000</pubDate>
		<dc:creator>voz-ip.com</dc:creator>
				<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[Asterisk 1.8]]></category>

		<guid isPermaLink="false">http://blog.voz-ip.com/?p=365</guid>
		<description><![CDATA[Muy buenas, Como muchos sabéis, el tema de Asterisk 1.8 está todavía calentando motores, aunque al contrario que la serie 1.6 que no fue del todo aceptada por la comunidad, parece que está vez, tanto por features como por estabilidad / ciclo de desarrollo, la gente se lo está planteando. Por nuestra parte, todas las [...]]]></description>
			<content:encoded><![CDATA[<p>Muy buenas,<br />
Como muchos sabéis, el tema de Asterisk 1.8 está todavía calentando motores, aunque al contrario que la serie 1.6 que no fue del todo aceptada por la comunidad, parece que está vez, tanto por features como por estabilidad / ciclo de desarrollo, la gente se lo está planteando.</p>
<p>Por nuestra parte, todas las instalaciones y proyectos que realizamos los basamos (entre otros temas) en <a href="http://www.asterisk-es-rsp.org/"> Asterisk RSP </a>, que funciona a las mil maravillas.</p>
<p>En las instalaciones grandes, hay muchos puntos que deben ser controlados al milímetro, para que salga a la perfección, pero a parte de &#8220;funcionar&#8221;, la preocupación obvia es la estabilidad. Así que hemos decidido ir publicando un poco nuestros pasos y experiencias, que estamos teniendo en &#8220;pequeños&#8221; proyectos, que no utilizan todo Asterisk en sí o no son permanentes.</p>
<p>Por el momento, hemos utilizado Asterisk 1.8 en dos proyectos:</p>
<ul>
<li> Votaciones para <a href="http://www.bandenlehia.com/"> Bandenlehia 2010 </a> </li>
<li> Karaoke 2.0 multitudinario 2.0 en Santo Tomás  para <a href="http://www.xaramela.net"> Xaramela </a> </li>
</ul>
<p>La experiencia ha sido muy positiva, no hemos tenido ningún problema especial. Eso si, no utilizábamos ni real time, ni CDR de transferidas, ni pickup, ni mil BLFs, ni nada típico de PBX &#8230;</p>
<p>Lo que hemos utilizado en el primer caso ha sido:</p>
<ul>
<li> Recepción vía ITSP (SIP) de varios números (vinculados a 900). </li>
<li> AGI&#8217;s simples para guardar / checkear intervalos, etc &#8230; </li>
<li> En total, se recibieron 41.300 llamadas aprox en apenas 3 horas. </li>
</ul>
<p>En el segundo caso:</p>
<ul>
<li> Recepción vía TDM, de 16 PRIs (EuroISDN). </li>
<li> Grabación concurrente simúltaneas de todas las llamadas (utilizando Ramdisk a tope). </li>
<li>(luego todo un tema de ffmpeg/sox del mágico <a href="http://bellard.org">Fabrice Bellard</a>, pero no es de Asterisk <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  )</li>
</ul>
<p>Como véis, la experiencia no es que sea totalmente concluyente y todos a migrar a 1.8, pero es un primer pasito, para ir viendo datos de lo que se puede hacer. La verdad, es que ambos casos eran para eventos muy concretos y nos la jugamos un poco, pero todo salió bien, con fé ciega <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Las funciones o módulos involucrados no son numerosos, pero la cantidad de llamadas procesadas sí. Está claro que es cuando mezclas muchas partes de Asterisk cuando puedes tener una race condition, un memory leak perdido o algo díficil de detectar, pero bueno, vamos viendo luz <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>De cara a ir migrando nuestra solución <a href="http://ivoz.irontec.com"> IVOZ </a>, e ir haciendo proyectos de IP PBX Corporativo o Callcenter, todavía queda mucho (CEL, TLS/SRTP, &#8230;), pero poco a poco iremos testeando cada parte, para ver si podemos llegar a tener ciertas certezas:)</p>



Te ha gustado? Compartelo:


	<a rel="nofollow"  href="http://www.printfriendly.com/print?url=http%3A%2F%2Fblog.voz-ip.com%2F2010%2F365%2F&amp;partner=sociable" title="Print"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/printfriendly.png" title="Print" alt="Print" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.voz-ip.com%2F2010%2F365%2F&amp;title=Algunas%20experiencias%20con%20Asterisk%201.8.x&amp;notes=Muy%20buenas%2C%0D%0AComo%20muchos%20sab%C3%A9is%2C%20el%20tema%20de%20Asterisk%201.8%20est%C3%A1%20todav%C3%ADa%20calentando%20motores%2C%20aunque%20al%20contrario%20que%20la%20serie%201.6%20que%20no%20fue%20del%20todo%20aceptada%20por%20la%20comunidad%2C%20parece%20que%20est%C3%A1%20vez%2C%20tanto%20por%20features%20como%20por%20estabilidad%20%2F%20ciclo%20de%20" title="del.icio.us"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.voz-ip.com%2F2010%2F365%2F&amp;t=Algunas%20experiencias%20con%20Asterisk%201.8.x" title="Facebook"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.voz-ip.com%2F2010%2F365%2F&amp;title=Algunas%20experiencias%20con%20Asterisk%201.8.x&amp;annotation=Muy%20buenas%2C%0D%0AComo%20muchos%20sab%C3%A9is%2C%20el%20tema%20de%20Asterisk%201.8%20est%C3%A1%20todav%C3%ADa%20calentando%20motores%2C%20aunque%20al%20contrario%20que%20la%20serie%201.6%20que%20no%20fue%20del%20todo%20aceptada%20por%20la%20comunidad%2C%20parece%20que%20est%C3%A1%20vez%2C%20tanto%20por%20features%20como%20por%20estabilidad%20%2F%20ciclo%20de%20" title="Google Bookmarks"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://barrapunto.com/submit.pl?subj=Algunas%20experiencias%20con%20Asterisk%201.8.x&amp;story=http%3A%2F%2Fblog.voz-ip.com%2F2010%2F365%2F" title="BarraPunto"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/barrapunto.png" title="BarraPunto" alt="BarraPunto" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://meneame.net/submit.php?url=http%3A%2F%2Fblog.voz-ip.com%2F2010%2F365%2F" title="Meneame"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/meneame.png" title="Meneame" alt="Meneame" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://twitter.com/home?status=Algunas%20experiencias%20con%20Asterisk%201.8.x%20-%20http%3A%2F%2Fblog.voz-ip.com%2F2010%2F365%2F" title="Twitter"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blog.voz-ip.com/2010/365/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Nuevas funcionalidades de Asterisk 1.8: Update de CallerID</title>
		<link>http://blog.voz-ip.com/2010/jugando-con-las-nuevas-funcionalidades-de-asterisk-18/</link>
		<comments>http://blog.voz-ip.com/2010/jugando-con-las-nuevas-funcionalidades-de-asterisk-18/#comments</comments>
		<pubDate>Wed, 22 Dec 2010 17:26:16 +0000</pubDate>
		<dc:creator>voz-ip.com</dc:creator>
				<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[Digium]]></category>
		<category><![CDATA[Howto]]></category>

		<guid isPermaLink="false">http://blog.voz-ip.com/?p=279</guid>
		<description><![CDATA[La versión 1.8 de Asterisk ha aportado nuevas features interesantes, como por ejemplo, CEL, SRTP, soporte para fax, calendarios compartidos, soporte IPv6&#8230; En este caso nos vamos a centrar en una feature simple pero que los clientes que provienen de centralitas comerciales suelen echar en falta. La actualización del CLID en transferencias. Hablamos en todo [...]]]></description>
			<content:encoded><![CDATA[<p>La versión 1.8 de Asterisk ha aportado nuevas features interesantes, como por ejemplo, CEL, SRTP, soporte para fax, calendarios compartidos, soporte IPv6&#8230;</p>
<p>En este caso nos vamos a centrar en una feature simple pero que los clientes que provienen de centralitas comerciales suelen echar en falta. La <strong>actualización del CLID en transferencias</strong>. Hablamos en todo momento de transferencias atendidas y realizadas mediante REFER-s, es decir, transferencias a través del propio terminal y no a través de las features nativas de Asterisk.<br />
Para que funcione, hay que configurar un par de cosas en sip.conf:</p>
<ul>
<li>Si queremos utilizar la cabecera SIP <em>Remote-Party-ID</em>:<br />
<code>sendrpid=yes o sendrpid=rpid (es lo mismo)</code></li>
<li>Si queremos utilizar la cabecera SIP <em>P-Asserted-Identity</em>:<br />
<code>sendrpid=pai</code></li>
<li>Obligatoriamente:<br />
 <code>directmedia=update</code></li>
</ul>
<p>Es necesario configurar directmedia a update (además del sendrpid) para que Asterisk envíe mensajes SIP de tipo UPDATE ya que si envía INVITE-s (re-invites para decir que el audio está en otro punto) recibimos un mensaje 500 (Internal Server Error) por parte del terminal de destino final. Es decir, cuando se hace el REFER Asterisk le envía un INVITE al destino final diciendo que el audio lo tiene él, para acto seguido enviarle otro INVITE (CSeq+1) diciendo que el audio está en otro terminal (PtP audio). A este segundo INVITE es al que el terminal responde con un 500.<br />
Espero que en la siguiente imagen se entienda mejor:</p>
<p>
<a href="http://blog.voz-ip.com/2010/jugando-con-las-nuevas-funcionalidades-de-asterisk-18/500error/" rel="attachment wp-att-316"><img src="http://blog.voz-ip.com/wp-content/uploads/2010/12/500error-1024x447.png" alt="" title="500error" width="620" height="270" class="alignnone size-large wp-image-316" /></a></p>
<p>Ahora la captura SIP completa con &#8220;directmedia=yes&#8221; &#038; &#8220;sendrpid=yes&#8221; donde:</p>
<ol>Asterisk => 10.10.0.165</ol>
<ol>C phone (300) => 10.10.0.142</ol>
<ol>B phone (200) => 10.10.0.177</ol>
<ol>A phone (100) => 10.10.0.167</ol>
<p>
<a href="http://blog.voz-ip.com/2010/jugando-con-las-nuevas-funcionalidades-de-asterisk-18/sipsession/" rel="attachment wp-att-325"><img src="http://blog.voz-ip.com/wp-content/uploads/2010/12/sipsession-412x1024.png" alt="" title="sipsession" width="249" height="620" class="alignnone size-large wp-image-325" /></a></p>
<p>Esta vez, la captura SIP completa con Ngrep y &#8220;directmedia=update&#8221; &#038; &#8220;sendrpid=yes/pai&#8221; donde:</p>
<ol>Asterisk => 10.10.0.165</ol>
<ol>C phone (300) => 10.10.0.142</ol>
<ol>B phone (200) => 10.10.0.177</ol>
<ol>A phone (100) => 10.10.0.167</ol>
<p>
No me es posible presentar la captura con una imagen como la superior (el software omnipeek no &#8220;ve&#8221; los UPDATE-s), así que os dejo unas trazas en los siguientes enlaces:<br />
Traza SIP con <a href="http://blog.voz-ip.com/UpdateCLID-RPID">sendrpid=yes</a><br />
Traza SIP con <a href="http://blog.voz-ip.com/UpdateCLID-PAI">sendrpid=pai</a></p>
<p>Después de tanta traza SIP, comentar también que no sirve cualquier terminal (o mejor dicho cualquier firmware¿?), tiene que aceptar UPDATEs. Con los Cisco SPA5xx funciona a la perfección. Los Linksys SPA9xx no aceptan Updates y algunos Snom y Aastra tampoco&#8230; aunque tampoco me he puesto a jugar demasiado con la configuración de estos últimos.</p>
<p>Como se ha comentado en la entradilla del post, aquí se habla en todo momento de transferencias atendidas. En el caso de transferencias semi-atendidas (xfer->dial->xfer sin haber establecido la segunda llamada) funciona a la perfección en cualquier caso. Me explico, utilicemos audio PtP o no, bien con UPDATEs, bien con INVITEs, Asterisk envía un UPDATE para actualizar los datos de sesión cuando la segunda llamada no ha sido establecida, por lo que el CLID se actualiza sin problemas. Las transferencias ciegas también funcionan correctamente (en la versión 1.8.0 había un Bug que se solucionó más tarde).</p>
<p>Espero haberme explicado bien. Estamos aquí para cualquier duda/sugerencia o corrección.</p>
<p>Un saludo.</p>



Te ha gustado? Compartelo:


	<a rel="nofollow"  href="http://www.printfriendly.com/print?url=http%3A%2F%2Fblog.voz-ip.com%2F2010%2Fjugando-con-las-nuevas-funcionalidades-de-asterisk-18%2F&amp;partner=sociable" title="Print"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/printfriendly.png" title="Print" alt="Print" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.voz-ip.com%2F2010%2Fjugando-con-las-nuevas-funcionalidades-de-asterisk-18%2F&amp;title=Nuevas%20funcionalidades%20de%20Asterisk%201.8%3A%20Update%20de%20CallerID&amp;notes=La%20versi%C3%B3n%201.8%20de%20Asterisk%20ha%20aportado%20nuevas%20features%20interesantes%2C%20como%20por%20ejemplo%2C%20CEL%2C%20SRTP%2C%20soporte%20para%20fax%2C%20calendarios%20compartidos%2C%20soporte%20IPv6...%0D%0A%0D%0AEn%20este%20caso%20nos%20vamos%20a%20centrar%20en%20una%20feature%20simple%20pero%20que%20los%20clientes%20que%20proviene" title="del.icio.us"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.voz-ip.com%2F2010%2Fjugando-con-las-nuevas-funcionalidades-de-asterisk-18%2F&amp;t=Nuevas%20funcionalidades%20de%20Asterisk%201.8%3A%20Update%20de%20CallerID" title="Facebook"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.voz-ip.com%2F2010%2Fjugando-con-las-nuevas-funcionalidades-de-asterisk-18%2F&amp;title=Nuevas%20funcionalidades%20de%20Asterisk%201.8%3A%20Update%20de%20CallerID&amp;annotation=La%20versi%C3%B3n%201.8%20de%20Asterisk%20ha%20aportado%20nuevas%20features%20interesantes%2C%20como%20por%20ejemplo%2C%20CEL%2C%20SRTP%2C%20soporte%20para%20fax%2C%20calendarios%20compartidos%2C%20soporte%20IPv6...%0D%0A%0D%0AEn%20este%20caso%20nos%20vamos%20a%20centrar%20en%20una%20feature%20simple%20pero%20que%20los%20clientes%20que%20proviene" title="Google Bookmarks"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://barrapunto.com/submit.pl?subj=Nuevas%20funcionalidades%20de%20Asterisk%201.8%3A%20Update%20de%20CallerID&amp;story=http%3A%2F%2Fblog.voz-ip.com%2F2010%2Fjugando-con-las-nuevas-funcionalidades-de-asterisk-18%2F" title="BarraPunto"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/barrapunto.png" title="BarraPunto" alt="BarraPunto" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://meneame.net/submit.php?url=http%3A%2F%2Fblog.voz-ip.com%2F2010%2Fjugando-con-las-nuevas-funcionalidades-de-asterisk-18%2F" title="Meneame"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/meneame.png" title="Meneame" alt="Meneame" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://twitter.com/home?status=Nuevas%20funcionalidades%20de%20Asterisk%201.8%3A%20Update%20de%20CallerID%20-%20http%3A%2F%2Fblog.voz-ip.com%2F2010%2Fjugando-con-las-nuevas-funcionalidades-de-asterisk-18%2F" title="Twitter"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blog.voz-ip.com/2010/jugando-con-las-nuevas-funcionalidades-de-asterisk-18/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<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 [...]]]></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 &#8216;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>



Te ha gustado? Compartelo:


	<a rel="nofollow"  href="http://www.printfriendly.com/print?url=http%3A%2F%2Fblog.voz-ip.com%2F2010%2Fnuevas-funcionalidades-de-callcenter-en-asterisk-es-rsp%2F&amp;partner=sociable" title="Print"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/printfriendly.png" title="Print" alt="Print" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.voz-ip.com%2F2010%2Fnuevas-funcionalidades-de-callcenter-en-asterisk-es-rsp%2F&amp;title=Nuevas%20funcionalidades%20de%20Callcenter%20en%20Asterisk-ES-RSP&amp;notes=%0D%0A%0D%0ATal%20y%20como%20coment%C3%A1bamos%20en%20su%20inicio%2C%20Asterisk-ES-RSP%20continua%20aportando%20su%20granito%20de%20arena%20corrigiendo%20bugs%20que%20reporta%20la%20comunidad%20e%20implementando%20funcionalidades%20interesantes%2C%20inexistentes%20en%20la%20versi%C3%B3n%20base%20de%20esta%20release.%0D%0APara%20aquellos" title="del.icio.us"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.voz-ip.com%2F2010%2Fnuevas-funcionalidades-de-callcenter-en-asterisk-es-rsp%2F&amp;t=Nuevas%20funcionalidades%20de%20Callcenter%20en%20Asterisk-ES-RSP" title="Facebook"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.voz-ip.com%2F2010%2Fnuevas-funcionalidades-de-callcenter-en-asterisk-es-rsp%2F&amp;title=Nuevas%20funcionalidades%20de%20Callcenter%20en%20Asterisk-ES-RSP&amp;annotation=%0D%0A%0D%0ATal%20y%20como%20coment%C3%A1bamos%20en%20su%20inicio%2C%20Asterisk-ES-RSP%20continua%20aportando%20su%20granito%20de%20arena%20corrigiendo%20bugs%20que%20reporta%20la%20comunidad%20e%20implementando%20funcionalidades%20interesantes%2C%20inexistentes%20en%20la%20versi%C3%B3n%20base%20de%20esta%20release.%0D%0APara%20aquellos" title="Google Bookmarks"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://barrapunto.com/submit.pl?subj=Nuevas%20funcionalidades%20de%20Callcenter%20en%20Asterisk-ES-RSP&amp;story=http%3A%2F%2Fblog.voz-ip.com%2F2010%2Fnuevas-funcionalidades-de-callcenter-en-asterisk-es-rsp%2F" title="BarraPunto"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/barrapunto.png" title="BarraPunto" alt="BarraPunto" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://meneame.net/submit.php?url=http%3A%2F%2Fblog.voz-ip.com%2F2010%2Fnuevas-funcionalidades-de-callcenter-en-asterisk-es-rsp%2F" title="Meneame"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/meneame.png" title="Meneame" alt="Meneame" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://twitter.com/home?status=Nuevas%20funcionalidades%20de%20Callcenter%20en%20Asterisk-ES-RSP%20-%20http%3A%2F%2Fblog.voz-ip.com%2F2010%2Fnuevas-funcionalidades-de-callcenter-en-asterisk-es-rsp%2F" title="Twitter"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blog.voz-ip.com/2010/nuevas-funcionalidades-de-callcenter-en-asterisk-es-rsp/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</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>



Te ha gustado? Compartelo:


	<a rel="nofollow"  href="http://www.printfriendly.com/print?url=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Fbye-sipastricon209%2F&amp;partner=sociable" title="Print"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/printfriendly.png" title="Print" alt="Print" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Fbye-sipastricon209%2F&amp;title=BYE%20sip%3AAstriCon209...&amp;notes=Por%20fin%20e%20conseguido%20algo%20de%20Internet%20%28en%20Las%20Vegas%20mucho%20casino%20pero%20poco%20WiFi%20%3A%28%20%29%20y%20puedo%20comentar%20lo%20que%20viv%C3%AD%20durante%20tres%20d%C3%ADas%20en%20el%20AstriCon.%0D%0A%0D%0AEn%20una%20palabra%20%28en%20ingl%C3%A9s%29%3A%20awesome%21%20Creo%20que%20no%20pod%C3%ADa%20haber%20estado%20mejor.%20Me%20lo%20he%20pasado%20en%20g" title="del.icio.us"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Fbye-sipastricon209%2F&amp;t=BYE%20sip%3AAstriCon209..." title="Facebook"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Fbye-sipastricon209%2F&amp;title=BYE%20sip%3AAstriCon209...&amp;annotation=Por%20fin%20e%20conseguido%20algo%20de%20Internet%20%28en%20Las%20Vegas%20mucho%20casino%20pero%20poco%20WiFi%20%3A%28%20%29%20y%20puedo%20comentar%20lo%20que%20viv%C3%AD%20durante%20tres%20d%C3%ADas%20en%20el%20AstriCon.%0D%0A%0D%0AEn%20una%20palabra%20%28en%20ingl%C3%A9s%29%3A%20awesome%21%20Creo%20que%20no%20pod%C3%ADa%20haber%20estado%20mejor.%20Me%20lo%20he%20pasado%20en%20g" title="Google Bookmarks"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://barrapunto.com/submit.pl?subj=BYE%20sip%3AAstriCon209...&amp;story=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Fbye-sipastricon209%2F" title="BarraPunto"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/barrapunto.png" title="BarraPunto" alt="BarraPunto" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://meneame.net/submit.php?url=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Fbye-sipastricon209%2F" title="Meneame"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/meneame.png" title="Meneame" alt="Meneame" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://twitter.com/home?status=BYE%20sip%3AAstriCon209...%20-%20http%3A%2F%2Fblog.voz-ip.com%2F2009%2Fbye-sipastricon209%2F" title="Twitter"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blog.voz-ip.com/2009/bye-sipastricon209/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</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">&#8216;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 (&#8216;%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 <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> mmysql:<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.* <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> mmysql:<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.* <img src='http://blog.voz-ip.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> mmysql:<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>
<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>



Te ha gustado? Compartelo:


	<a rel="nofollow"  href="http://www.printfriendly.com/print?url=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Flog-en-asterisk%2F&amp;partner=sociable" title="Print"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/printfriendly.png" title="Print" alt="Print" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Flog-en-asterisk%2F&amp;title=Log%20en%20Asterisk&amp;notes=A%20menudo%20cuando%20una%20centralita%20tiene%20alta%20carga%2C%20ver%20la%20consola%20o%20los%20logs%20que%20genera%20Asterisk%20en%20%2Fvar%2Flog%2Fasterisk%2Fmessages%20no%20es%20suficiente.%20Porque%20se%20genera%20gran%20cantidad%20de%20informaci%C3%B3n%2C%20porque%20al%20tener%20muchas%20llamadas%20concurrentes%20seguir%20una%20lla" title="del.icio.us"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Flog-en-asterisk%2F&amp;t=Log%20en%20Asterisk" title="Facebook"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Flog-en-asterisk%2F&amp;title=Log%20en%20Asterisk&amp;annotation=A%20menudo%20cuando%20una%20centralita%20tiene%20alta%20carga%2C%20ver%20la%20consola%20o%20los%20logs%20que%20genera%20Asterisk%20en%20%2Fvar%2Flog%2Fasterisk%2Fmessages%20no%20es%20suficiente.%20Porque%20se%20genera%20gran%20cantidad%20de%20informaci%C3%B3n%2C%20porque%20al%20tener%20muchas%20llamadas%20concurrentes%20seguir%20una%20lla" title="Google Bookmarks"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://barrapunto.com/submit.pl?subj=Log%20en%20Asterisk&amp;story=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Flog-en-asterisk%2F" title="BarraPunto"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/barrapunto.png" title="BarraPunto" alt="BarraPunto" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://meneame.net/submit.php?url=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Flog-en-asterisk%2F" title="Meneame"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/meneame.png" title="Meneame" alt="Meneame" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://twitter.com/home?status=Log%20en%20Asterisk%20-%20http%3A%2F%2Fblog.voz-ip.com%2F2009%2Flog-en-asterisk%2F" title="Twitter"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blog.voz-ip.com/2009/log-en-asterisk/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</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 demasiadas [...]]]></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>



Te ha gustado? Compartelo:


	<a rel="nofollow"  href="http://www.printfriendly.com/print?url=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Fastricon-2009-%25c2%25a1empieza-la-cuenta-atras%2F&amp;partner=sociable" title="Print"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/printfriendly.png" title="Print" alt="Print" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Fastricon-2009-%25c2%25a1empieza-la-cuenta-atras%2F&amp;title=AstriCon%202009%3A%20%C2%A1empieza%20la%20cuenta%20atr%C3%A1s%21&amp;notes=Ya%20solo%20quedan%20unas%20pocas%20horas%20para%20que%20de%20comienzo%20el%20d%C3%A9cimo%20AstriCon%2C%20el%20AstriCon%202009%20y%20he%20de%20confesar%20que%20algo%20nervioso%C2%A0s%C3%AD%20que%20me%20encuentro.%20%3A%29%0D%0A%0D%0A%C3%89ste%20a%C3%B1o%20se%20celebra%20la%20d%C3%A9cima%20edici%C3%B3n%2C%20por%20lo%20que%20el%20evento%20promete.%20Habr%C3%A1%20charlas%20%28como%20s" title="del.icio.us"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Fastricon-2009-%25c2%25a1empieza-la-cuenta-atras%2F&amp;t=AstriCon%202009%3A%20%C2%A1empieza%20la%20cuenta%20atr%C3%A1s%21" title="Facebook"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Fastricon-2009-%25c2%25a1empieza-la-cuenta-atras%2F&amp;title=AstriCon%202009%3A%20%C2%A1empieza%20la%20cuenta%20atr%C3%A1s%21&amp;annotation=Ya%20solo%20quedan%20unas%20pocas%20horas%20para%20que%20de%20comienzo%20el%20d%C3%A9cimo%20AstriCon%2C%20el%20AstriCon%202009%20y%20he%20de%20confesar%20que%20algo%20nervioso%C2%A0s%C3%AD%20que%20me%20encuentro.%20%3A%29%0D%0A%0D%0A%C3%89ste%20a%C3%B1o%20se%20celebra%20la%20d%C3%A9cima%20edici%C3%B3n%2C%20por%20lo%20que%20el%20evento%20promete.%20Habr%C3%A1%20charlas%20%28como%20s" title="Google Bookmarks"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://barrapunto.com/submit.pl?subj=AstriCon%202009%3A%20%C2%A1empieza%20la%20cuenta%20atr%C3%A1s%21&amp;story=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Fastricon-2009-%25c2%25a1empieza-la-cuenta-atras%2F" title="BarraPunto"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/barrapunto.png" title="BarraPunto" alt="BarraPunto" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://meneame.net/submit.php?url=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Fastricon-2009-%25c2%25a1empieza-la-cuenta-atras%2F" title="Meneame"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/meneame.png" title="Meneame" alt="Meneame" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://twitter.com/home?status=AstriCon%202009%3A%20%C2%A1empieza%20la%20cuenta%20atr%C3%A1s%21%20-%20http%3A%2F%2Fblog.voz-ip.com%2F2009%2Fastricon-2009-%25c2%25a1empieza-la-cuenta-atras%2F" title="Twitter"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blog.voz-ip.com/2009/astricon-2009-%c2%a1empieza-la-cuenta-atras/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</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 &#8211; -username guest &#8211; -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  &#8211; -username guest &#8211; -password guest</span></p>
<p>http://asterisk-es-rsp.irontec.com</p>



Te ha gustado? Compartelo:


	<a rel="nofollow"  href="http://www.printfriendly.com/print?url=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Fasterisk-es-rsp%2F&amp;partner=sociable" title="Print"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/printfriendly.png" title="Print" alt="Print" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Fasterisk-es-rsp%2F&amp;title=Asterisk-ES-RSP&amp;notes=Los%20lectores%20que%20segu%C3%ADs%20de%20forma%20activa%20las%20noticias%20de%20la%20comunidad%20de%20Asterisk%20habr%C3%A9is%20le%C3%ADdo%20las%20discusiones%20suscitadas%20por%20las%20%C3%BAltimas%20versiones%20publicadas.%20Las%20versiones%201.4.2X%20han%20resultado%20ser%20bastante%20decepcionantes%20en%20cuando%20a%20estabilidad" title="del.icio.us"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Fasterisk-es-rsp%2F&amp;t=Asterisk-ES-RSP" title="Facebook"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Fasterisk-es-rsp%2F&amp;title=Asterisk-ES-RSP&amp;annotation=Los%20lectores%20que%20segu%C3%ADs%20de%20forma%20activa%20las%20noticias%20de%20la%20comunidad%20de%20Asterisk%20habr%C3%A9is%20le%C3%ADdo%20las%20discusiones%20suscitadas%20por%20las%20%C3%BAltimas%20versiones%20publicadas.%20Las%20versiones%201.4.2X%20han%20resultado%20ser%20bastante%20decepcionantes%20en%20cuando%20a%20estabilidad" title="Google Bookmarks"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://barrapunto.com/submit.pl?subj=Asterisk-ES-RSP&amp;story=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Fasterisk-es-rsp%2F" title="BarraPunto"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/barrapunto.png" title="BarraPunto" alt="BarraPunto" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://meneame.net/submit.php?url=http%3A%2F%2Fblog.voz-ip.com%2F2009%2Fasterisk-es-rsp%2F" title="Meneame"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/meneame.png" title="Meneame" alt="Meneame" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://twitter.com/home?status=Asterisk-ES-RSP%20-%20http%3A%2F%2Fblog.voz-ip.com%2F2009%2Fasterisk-es-rsp%2F" title="Twitter"><img src="http://blog.voz-ip.com/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blog.voz-ip.com/2009/asterisk-es-rsp/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

