<?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>Mi Brain-Training Personal &#187; Python</title>
	<atom:link href="http://saghul.net/blog/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://saghul.net/blog</link>
	<description>Para que no se me olviden las cosas...</description>
	<lastBuildDate>Mon, 06 Feb 2012 10:49:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Probando el framework de comunicaciones Plivo</title>
		<link>http://saghul.net/blog/2011/08/29/probando-el-framework-de-comunicaciones-plivo/</link>
		<comments>http://saghul.net/blog/2011/08/29/probando-el-framework-de-comunicaciones-plivo/#comments</comments>
		<pubDate>Sun, 28 Aug 2011 23:13:17 +0000</pubDate>
		<dc:creator>saghul</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[FreeSWITCH]]></category>
		<category><![CDATA[Plivo]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[VoIP]]></category>

		<guid isPermaLink="false">http://saghul.net/blog/?p=1433</guid>
		<description><![CDATA[Plivo es un framework de comunicaciones creado alrededor de FreeSWITCH con la intención de proporcionar un entorno en el que desarrollar aplicaciones multimedia. Puede compararse con Twilio, pero con una importante diferencia: es Open Source. Para hacernos una idea de la arquitectura del sistema completo podemos consultar la sección overview de su página web. Aquí [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://plivo.org">Plivo</a> es un framework de comunicaciones creado alrededor de FreeSWITCH con la intención de proporcionar un entorno en el que desarrollar aplicaciones multimedia. Puede compararse con <a href="http://www.twilio.com/">Twilio</a>, pero con una importante diferencia: <strong>es Open Source</strong>.</p>
<p>Para hacernos una idea de la arquitectura del sistema completo podemos consultar la sección <em>overview</em> de su <a href="http://www.plivo.org/overview/">página web</a>. Aquí una de las imágenes a modo resumen:</p>
<p align="center">
<a href="http://saghul.net/blog/wp-content/uploads/2011/08/plivo_arch_1.png"><img src="http://saghul.net/blog/wp-content/uploads/2011/08/plivo_arch_1-300x102.png" alt="" title="plivo_arch_1" width="300" height="102" class="alignnone size-medium wp-image-1434" /></a>
</p>
<p>Ya que Plivo es una solución <em>hosted</em>, es decir, tenemos que instalar nuestro propio servidor, tendremos que hacer algo de trabajo antes de poder probar una aplicación hola-mundo, pero afortunadamente Plivo viene con unos cuantos scripts que nos harán la vida muy fácil. ¡Al tema!</p>
<p><strong>Paso 1: Instalar FreeSWITCH</strong></p>
<p>Partiremos de una Debian Squeeze recién instalada y utilizaremos el script de instalación provisto por Plivo. La razón es que necesitamos una configuración específica para trabajar con Plivo y el script ya lo hace todo solo <img src='http://saghul.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  Podemos consultar algo más de documentación en la sección <a href="http://www.plivo.org/get-started/">get started</a>.</p>
<pre>
# wget --no-check-certificate https://github.com/plivo/plivo/raw/master/freeswitch/install.sh
# chmod +x install.sh
# ./install.sh
</pre>
<p>Una vez tenemos FreeSWITCH instalado (estará en <em>/usr/lcoal/freeswitch/</em>) podemos arrancarlo en <em>background</em> ejecutando:</p>
<pre>
# ./usr/local/freeswitch/bin/freeswitch -nc
</pre>
<p>Y podemos conectarnos a un CLI interactivo así:</p>
<pre>
# ./usr/local/freeswitch/bin/fs_cli
</pre>
<p><strong>Paso 2: Instalar Plivo</strong></p>
<p>Para instalar Plivo también utilizaremos un script y lo instalaremos en <em>/opt/plivo/</em>:</p>
<pre>
# wget --no-check-certificate https://github.com/plivo/plivo/raw/master/scripts/plivo_install_beta.sh
# chmod +x plivo_install_beta.sh
# ./plivo_install_beta.sh
</pre>
<p><strong>Paso 3: Configurar Plivo</strong></p>
<p>Una vez tenemos instalados FreeSWITCH y Plivo vamos a modificar ligeramente la condifuración de Plivo. Por defecto escucha peticiones del API REST en 127.0.0.1 (no <a href="http://mikeljimenez.net">Mike</a>, creo que aún no soporta IPv6) así que lo cambiaremos para poder desarrollar en otra máquina.</p>
<p>Editamos el fichero <code>/opt/plivo/etc/plivo/default.conf</code> y configuramos la IP de la máquina donde tendremos nuestra aplicación escuchando:</p>
<pre>
...
DEFAULT_ANSWER_URL = http://192.168.99.53:5000/answered/
DEFAULT_HANGUP_URL = http://192.168.99.53:5000/hangup/
...
ALLOWED_IPS = 127.0.0.1,192.168.99.53
...
HTTP_ADDRESS = 0.0.0.0:8088
...
CALL_HEARTBEAT_URL = http://192.168.99.53:5000/heartbeat/
</pre>
<p>Ya estamos listos para arrancar Plivo:</p>
<pre>
/opt/plivo/bin/plivo start
</pre>
<p><strong>Paso 4: Hola mundo</strong></p>
<p>Ya tenemos todo listo ahora veámoslo en acción. El ejemplo a continuación está hecho echo en Python con Flask (un framework web) y hará que al llamar a sip:cualquiercosa@IP_de_nuestro_servidor:5080 se escuche <em>&#8220;hello world&#8221;</em> utilizando Text-To-Speech.</p>
<div id="gist-1177331" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="c">############################################</span></div><div class='line' id='LC2'><span class="c"># host/port binding for http server</span></div><div class='line' id='LC3'><span class="n">HOST</span> <span class="o">=</span> <span class="s">&#39;0.0.0.0&#39;</span></div><div class='line' id='LC4'><span class="n">PORT</span> <span class="o">=</span> <span class="mi">5000</span></div><div class='line' id='LC5'><span class="c">############################################</span></div><div class='line' id='LC6'><br/></div><div class='line' id='LC7'><span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span><span class="p">,</span> <span class="n">render_template</span></div><div class='line' id='LC8'><span class="kn">import</span> <span class="nn">plivohelper</span></div><div class='line' id='LC9'><span class="kn">import</span> <span class="nn">os</span></div><div class='line' id='LC10'><br/></div><div class='line' id='LC11'><br/></div><div class='line' id='LC12'><span class="n">response_server</span> <span class="o">=</span> <span class="n">Flask</span><span class="p">(</span><span class="s">&quot;ResponseServer&quot;</span><span class="p">)</span></div><div class='line' id='LC13'><span class="n">response_server</span><span class="o">.</span><span class="n">debug</span> <span class="o">=</span> <span class="bp">True</span></div><div class='line' id='LC14'><br/></div><div class='line' id='LC15'><span class="sd">&quot;&quot;&quot;</span></div><div class='line' id='LC16'><span class="sd">This is a simple example which demonstrate how easy you can build a light HTTP</span></div><div class='line' id='LC17'><span class="sd">server using Flask which will return formatted XML to command the Plivo Server</span></div><div class='line' id='LC18'><br/></div><div class='line' id='LC19'><span class="sd">By default the HTTP Server will be listening on http://127.0.0.1:5000</span></div><div class='line' id='LC20'><br/></div><div class='line' id='LC21'><span class="sd">The following URLs are implemented:</span></div><div class='line' id='LC22'><span class="sd">    * /answered/</span></div><div class='line' id='LC23'><span class="sd">    * /hangup/</span></div><div class='line' id='LC24'><span class="sd">&quot;&quot;&quot;</span></div><div class='line' id='LC25'><br/></div><div class='line' id='LC26'><br/></div><div class='line' id='LC27'><span class="nd">@response_server.route</span><span class="p">(</span><span class="s">&#39;/heartbeat/&#39;</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s">&#39;POST&#39;</span><span class="p">])</span></div><div class='line' id='LC28'><span class="k">def</span> <span class="nf">heartbeat</span><span class="p">():</span></div><div class='line' id='LC29'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="s">&quot;OK&quot;</span></div><div class='line' id='LC30'><br/></div><div class='line' id='LC31'><span class="nd">@response_server.route</span><span class="p">(</span><span class="s">&#39;/hangup/&#39;</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s">&#39;POST&#39;</span><span class="p">])</span></div><div class='line' id='LC32'><span class="k">def</span> <span class="nf">hangup</span><span class="p">():</span></div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="s">&quot;OK&quot;</span></div><div class='line' id='LC34'><br/></div><div class='line' id='LC35'><span class="nd">@response_server.route</span><span class="p">(</span><span class="s">&#39;/answered/&#39;</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s">&#39;POST&#39;</span><span class="p">])</span></div><div class='line' id='LC36'><span class="k">def</span> <span class="nf">answered</span><span class="p">():</span></div><div class='line' id='LC37'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">r</span> <span class="o">=</span> <span class="n">plivohelper</span><span class="o">.</span><span class="n">Response</span><span class="p">()</span></div><div class='line' id='LC38'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">r</span><span class="o">.</span><span class="n">addSpeak</span><span class="p">(</span><span class="s">&quot;Hello world&quot;</span><span class="p">)</span></div><div class='line' id='LC39'><br/></div><div class='line' id='LC40'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="s">&quot;RESTXML Response =&gt; </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">r</span></div><div class='line' id='LC41'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">&#39;response_template.xml&#39;</span><span class="p">,</span> <span class="n">response</span><span class="o">=</span><span class="n">r</span><span class="p">)</span></div><div class='line' id='LC42'><br/></div><div class='line' id='LC43'><br/></div><div class='line' id='LC44'><span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span></div><div class='line' id='LC45'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="s">&quot;templates/response_template.xml&quot;</span><span class="p">):</span></div><div class='line' id='LC46'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="s">&quot;Error : Can&#39;t find the XML template : templates/response_template.xml&quot;</span></div><div class='line' id='LC47'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">else</span><span class="p">:</span></div><div class='line' id='LC48'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">response_server</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="n">HOST</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="n">PORT</span><span class="p">)</span></div><div class='line' id='LC49'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1177331/56f3b8987a5a3447685c984c51ecb6dc4fd8993a/helloworld.py" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1177331#file_helloworld.py" style="float:right;margin-right:10px;color:#666">helloworld.py</a>
            <a href="https://gist.github.com/1177331">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Esto tiene pinta de que me va a tener muy entretenido, ya iré posteando algo más a medida que lo vaya conociendo mejor.</p>
]]></content:encoded>
			<wfw:commentRss>http://saghul.net/blog/2011/08/29/probando-el-framework-de-comunicaciones-plivo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mandando comandos a OpenSIPS con mi_datagram</title>
		<link>http://saghul.net/blog/2011/08/22/mandando-comandos-a-opensips-con-mi_datagram/</link>
		<comments>http://saghul.net/blog/2011/08/22/mandando-comandos-a-opensips-con-mi_datagram/#comments</comments>
		<pubDate>Mon, 22 Aug 2011 22:56:52 +0000</pubDate>
		<dc:creator>saghul</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[OpenSIPS]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Twisted]]></category>
		<category><![CDATA[VoIP]]></category>

		<guid isPermaLink="false">http://saghul.net/blog/?p=1428</guid>
		<description><![CDATA[OpenSIPS dispone de diversos módulos mediante los cuales podemos enviar comandos para realizar determinadas acciones o consultar información. Podemos interactuar con OpenSIPS mediante un socket (mi_datagram) un fifo (mi_fifo) o XML-RPC (mi_xmlrpc). Para mandar comandos sencillos podemos utilizar la herramienta de consola que ya viene con OpenSIPS opensipsctl, pero el fifo al que nos conectamos [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://opensips.org">OpenSIPS</a> dispone de diversos módulos mediante los cuales podemos enviar comandos para realizar determinadas acciones o consultar información. Podemos interactuar con OpenSIPS mediante un socket (mi_datagram) un fifo (mi_fifo) o XML-RPC (mi_xmlrpc).</p>
<p>Para mandar comandos sencillos podemos utilizar la herramienta de consola que ya viene con OpenSIPS <em>opensipsctl</em>, pero el fifo al que nos conectamos viene dado por el valor almacenado en un fichero (por defecto en /etc/opensips/opensipsctlrc), por lo tanto no es muy flexible si tenemos varias instancias de OpenSIPS corriendo en la misma máquina.</p>
<p>En <a href="http://mediaproxy.ag-projects.com/">MediaProxy</a> y <a href="http://callcontrol.ag-projects.com/">CallControl</a> hacemos uso del módulo mi_datagram, para comunicarnos con OpenSIPS e indicarle que ha de terminar un diálogo, por ejemplo, por lo que pensé en reutilizar ese código para poder mandar comandos más fácilmente desde una interfaz de consola.</p>
<p>El resultado:</p>
<div id="gist-1163719" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="c"># coding=utf-8</span></div><div class='line' id='LC2'><br/></div><div class='line' id='LC3'><span class="c"># Copyright (C) 2011 Saúl Ibarra Corretgé &lt;saghul@gmail.com&gt;</span></div><div class='line' id='LC4'><span class="c">#</span></div><div class='line' id='LC5'><br/></div><div class='line' id='LC6'><span class="c"># Based on callcontrol/opensips.py, Copyright (C) 2006-2011 AG Projects.</span></div><div class='line' id='LC7'><br/></div><div class='line' id='LC8'><span class="c"># OpenSIPS configuration example:</span></div><div class='line' id='LC9'><span class="c"># loadmodule &quot;mi_datagram.so&quot;</span></div><div class='line' id='LC10'><span class="c"># modparam(&quot;mi_datagram&quot;, &quot;socket_name&quot;, &quot;/var/run/opensips/socket&quot;)</span></div><div class='line' id='LC11'><span class="c"># modparam(&quot;mi_datagram&quot;, &quot;unix_socket_user&quot;, &quot;opensips&quot;)</span></div><div class='line' id='LC12'><span class="c"># modparam(&quot;mi_datagram&quot;, &quot;unix_socket_group&quot;, &quot;opensips&quot;)</span></div><div class='line' id='LC13'><br/></div><div class='line' id='LC14'><br/></div><div class='line' id='LC15'><span class="kn">import</span> <span class="nn">os</span></div><div class='line' id='LC16'><span class="kn">import</span> <span class="nn">socket</span></div><div class='line' id='LC17'><br/></div><div class='line' id='LC18'><span class="kn">from</span> <span class="nn">application.process</span> <span class="kn">import</span> <span class="n">process</span></div><div class='line' id='LC19'><span class="kn">from</span> <span class="nn">application.system</span> <span class="kn">import</span> <span class="n">unlink</span></div><div class='line' id='LC20'><span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">count</span></div><div class='line' id='LC21'><br/></div><div class='line' id='LC22'><span class="kn">from</span> <span class="nn">twisted.internet</span> <span class="kn">import</span> <span class="n">reactor</span><span class="p">,</span> <span class="n">defer</span><span class="p">,</span> <span class="n">stdio</span></div><div class='line' id='LC23'><span class="kn">from</span> <span class="nn">twisted.internet.protocol</span> <span class="kn">import</span> <span class="n">DatagramProtocol</span></div><div class='line' id='LC24'><span class="kn">from</span> <span class="nn">twisted.internet.error</span> <span class="kn">import</span> <span class="n">CannotListenError</span></div><div class='line' id='LC25'><span class="kn">from</span> <span class="nn">twisted.protocols.basic</span> <span class="kn">import</span> <span class="n">LineReceiver</span></div><div class='line' id='LC26'><span class="kn">from</span> <span class="nn">twisted.python.failure</span> <span class="kn">import</span> <span class="n">Failure</span></div><div class='line' id='LC27'><br/></div><div class='line' id='LC28'><br/></div><div class='line' id='LC29'><br/></div><div class='line' id='LC30'><span class="k">class</span> <span class="nc">Error</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span> <span class="k">pass</span></div><div class='line' id='LC31'><span class="k">class</span> <span class="nc">CommandError</span><span class="p">(</span><span class="n">Error</span><span class="p">):</span> <span class="k">pass</span></div><div class='line' id='LC32'><span class="k">class</span> <span class="nc">TimeoutError</span><span class="p">(</span><span class="n">Error</span><span class="p">):</span> <span class="k">pass</span></div><div class='line' id='LC33'><span class="k">class</span> <span class="nc">NegativeReplyError</span><span class="p">(</span><span class="n">Error</span><span class="p">):</span> <span class="k">pass</span></div><div class='line' id='LC34'><br/></div><div class='line' id='LC35'><br/></div><div class='line' id='LC36'><span class="k">class</span> <span class="nc">Request</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span></div><div class='line' id='LC37'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">command</span><span class="p">):</span></div><div class='line' id='LC38'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="bp">self</span><span class="o">.</span><span class="n">command</span> <span class="o">=</span> <span class="n">command</span></div><div class='line' id='LC39'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="bp">self</span><span class="o">.</span><span class="n">deferred</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span></div><div class='line' id='LC40'><br/></div><div class='line' id='LC41'><br/></div><div class='line' id='LC42'><span class="k">class</span> <span class="nc">UNIXSocketProtocol</span><span class="p">(</span><span class="n">DatagramProtocol</span><span class="p">):</span></div><div class='line' id='LC43'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">noisy</span> <span class="o">=</span> <span class="bp">False</span></div><div class='line' id='LC44'><br/></div><div class='line' id='LC45'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">def</span> <span class="nf">datagramReceived</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">address</span><span class="p">):</span></div><div class='line' id='LC46'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">deferred</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">deferred</span></div><div class='line' id='LC47'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span> <span class="n">deferred</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">deferred</span><span class="o">.</span><span class="n">called</span><span class="p">:</span></div><div class='line' id='LC48'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span></div><div class='line' id='LC49'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c"># accumulate in a buffer until message end (do this later when implemented by opensips) -Dan</span></div><div class='line' id='LC50'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span> <span class="ow">not</span> <span class="n">data</span><span class="p">:</span></div><div class='line' id='LC51'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">failure</span> <span class="o">=</span> <span class="n">Failure</span><span class="p">(</span><span class="n">CommandError</span><span class="p">(</span><span class="s">&quot;Empty reply from OpenSIPS&quot;</span><span class="p">))</span></div><div class='line' id='LC52'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">deferred</span><span class="o">.</span><span class="n">errback</span><span class="p">(</span><span class="n">failure</span><span class="p">)</span></div><div class='line' id='LC53'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span></div><div class='line' id='LC54'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">try</span><span class="p">:</span></div><div class='line' id='LC55'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">status</span><span class="p">,</span> <span class="n">msg</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div><div class='line' id='LC56'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span></div><div class='line' id='LC57'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">failure</span> <span class="o">=</span> <span class="n">Failure</span><span class="p">(</span><span class="n">CommandError</span><span class="p">(</span><span class="s">&quot;Missing line terminator after status line in OpenSIPS reply&quot;</span><span class="p">))</span></div><div class='line' id='LC58'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">deferred</span><span class="o">.</span><span class="n">errback</span><span class="p">(</span><span class="n">failure</span><span class="p">)</span></div><div class='line' id='LC59'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span></div><div class='line' id='LC60'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span> <span class="n">status</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="o">==</span> <span class="s">&#39;200 OK&#39;</span><span class="p">:</span></div><div class='line' id='LC61'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">deferred</span><span class="o">.</span><span class="n">callback</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span></div><div class='line' id='LC62'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">else</span><span class="p">:</span></div><div class='line' id='LC63'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">deferred</span><span class="o">.</span><span class="n">errback</span><span class="p">(</span><span class="n">Failure</span><span class="p">(</span><span class="n">NegativeReplyError</span><span class="p">(</span><span class="n">status</span><span class="p">)))</span></div><div class='line' id='LC64'><br/></div><div class='line' id='LC65'><br/></div><div class='line' id='LC66'><span class="k">class</span> <span class="nc">UNIXSocketConnection</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span></div><div class='line' id='LC67'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">timeout</span> <span class="o">=</span> <span class="mi">3</span></div><div class='line' id='LC68'><br/></div><div class='line' id='LC69'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">opensips_socket_path</span><span class="p">):</span></div><div class='line' id='LC70'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="bp">self</span><span class="o">.</span><span class="n">_initialized</span> <span class="o">=</span> <span class="bp">False</span></div><div class='line' id='LC71'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="bp">self</span><span class="o">.</span><span class="n">opensips_socket_path</span> <span class="o">=</span> <span class="n">opensips_socket_path</span></div><div class='line' id='LC72'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">transport</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">initialize_local_socket</span><span class="p">()</span></div><div class='line' id='LC73'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">reactor</span><span class="o">.</span><span class="n">addSystemEventTrigger</span><span class="p">(</span><span class="s">&#39;during&#39;</span><span class="p">,</span> <span class="s">&#39;shutdown&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">close</span><span class="p">)</span></div><div class='line' id='LC74'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">deferred</span> <span class="o">=</span> <span class="bp">None</span> <span class="c">## placeholder for the deferred used by a request</span></div><div class='line' id='LC75'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="bp">self</span><span class="o">.</span><span class="n">_initialized</span> <span class="o">=</span> <span class="bp">True</span></div><div class='line' id='LC76'><br/></div><div class='line' id='LC77'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">def</span> <span class="nf">initialize_local_socket</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span></div><div class='line' id='LC78'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">counter</span> <span class="o">=</span> <span class="n">count</span><span class="p">()</span></div><div class='line' id='LC79'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">while</span> <span class="bp">True</span><span class="p">:</span></div><div class='line' id='LC80'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">i</span> <span class="o">=</span> <span class="n">counter</span><span class="o">.</span><span class="n">next</span><span class="p">()</span></div><div class='line' id='LC81'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">socket_name</span> <span class="o">=</span> <span class="s">&quot;opensips_</span><span class="si">%02d</span><span class="s">.sock&quot;</span> <span class="o">%</span> <span class="n">i</span></div><div class='line' id='LC82'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">socket_path</span> <span class="o">=</span> <span class="n">process</span><span class="o">.</span><span class="n">runtime_file</span><span class="p">(</span><span class="n">socket_name</span><span class="p">)</span></div><div class='line' id='LC83'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">socket_path</span><span class="p">):</span></div><div class='line' id='LC84'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">continue</span></div><div class='line' id='LC85'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">try</span><span class="p">:</span></div><div class='line' id='LC86'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">transport</span> <span class="o">=</span> <span class="n">reactor</span><span class="o">.</span><span class="n">listenUNIXDatagram</span><span class="p">(</span><span class="n">socket_path</span><span class="p">,</span> <span class="n">UNIXSocketProtocol</span><span class="p">())</span></div><div class='line' id='LC87'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">except</span> <span class="n">CannotListenError</span><span class="p">:</span></div><div class='line' id='LC88'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">pass</span></div><div class='line' id='LC89'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">else</span><span class="p">:</span></div><div class='line' id='LC90'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">socket_path</span><span class="p">,</span> <span class="n">transport</span></div><div class='line' id='LC91'><br/></div><div class='line' id='LC92'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span></div><div class='line' id='LC93'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_initialized</span><span class="p">:</span></div><div class='line' id='LC94'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">stopListening</span><span class="p">()</span></div><div class='line' id='LC95'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">unlink</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">)</span></div><div class='line' id='LC96'><br/></div><div class='line' id='LC97'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">def</span> <span class="nf">_get_deferred</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span></div><div class='line' id='LC98'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">deferred</span></div><div class='line' id='LC99'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">def</span> <span class="nf">_set_deferred</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">d</span><span class="p">):</span></div><div class='line' id='LC100'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">deferred</span> <span class="o">=</span> <span class="n">d</span></div><div class='line' id='LC101'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">deferred</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_get_deferred</span><span class="p">,</span> <span class="n">_set_deferred</span><span class="p">)</span></div><div class='line' id='LC102'><br/></div><div class='line' id='LC103'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">def</span> <span class="nf">_did_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">deferred</span><span class="p">):</span></div><div class='line' id='LC104'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span> <span class="n">deferred</span><span class="o">.</span><span class="n">called</span><span class="p">:</span></div><div class='line' id='LC105'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span></div><div class='line' id='LC106'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">deferred</span><span class="o">.</span><span class="n">errback</span><span class="p">(</span><span class="n">Failure</span><span class="p">(</span><span class="n">TimeoutError</span><span class="p">(</span><span class="s">&quot;OpenSIPS command did timeout&quot;</span><span class="p">)))</span></div><div class='line' id='LC107'><br/></div><div class='line' id='LC108'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">def</span> <span class="nf">send</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span></div><div class='line' id='LC109'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="bp">self</span><span class="o">.</span><span class="n">deferred</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">deferred</span></div><div class='line' id='LC110'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">try</span><span class="p">:</span></div><div class='line' id='LC111'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">command</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">opensips_socket_path</span><span class="p">)</span></div><div class='line' id='LC112'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span></div><div class='line' id='LC113'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="bp">self</span><span class="o">.</span><span class="n">deferred</span><span class="o">.</span><span class="n">errback</span><span class="p">(</span><span class="n">Failure</span><span class="p">(</span><span class="n">CommandError</span><span class="p">(</span><span class="s">&quot;Cannot send request to OpenSIPS: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">e</span><span class="p">)))</span></div><div class='line' id='LC114'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">else</span><span class="p">:</span></div><div class='line' id='LC115'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">reactor</span><span class="o">.</span><span class="n">callLater</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">timeout</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_did_timeout</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">deferred</span><span class="p">)</span></div><div class='line' id='LC116'><br/></div><div class='line' id='LC117'><br/></div><div class='line' id='LC118'><span class="k">class</span> <span class="nc">ManagementInterface</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span></div><div class='line' id='LC119'><br/></div><div class='line' id='LC120'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">opensips_socket_path</span><span class="p">):</span></div><div class='line' id='LC121'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="bp">self</span><span class="o">.</span><span class="n">conn</span> <span class="o">=</span> <span class="n">UNIXSocketConnection</span><span class="p">(</span><span class="n">opensips_socket_path</span><span class="p">)</span></div><div class='line' id='LC122'><br/></div><div class='line' id='LC123'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">def</span> <span class="nf">_RH_command</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">):</span></div><div class='line' id='LC124'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">Failure</span><span class="p">):</span></div><div class='line' id='LC125'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="s">&quot;failed to execute command: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">result</span><span class="o">.</span><span class="n">value</span></div><div class='line' id='LC126'><br/></div><div class='line' id='LC127'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">def</span> <span class="nf">send_command</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">command</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span></div><div class='line' id='LC128'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">_parts</span> <span class="o">=</span> <span class="n">command</span><span class="o">.</span><span class="n">split</span><span class="p">()</span></div><div class='line' id='LC129'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">cmd</span><span class="p">,</span> <span class="n">rest</span> <span class="o">=</span> <span class="n">_parts</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">_parts</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span></div><div class='line' id='LC130'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">cmd</span> <span class="o">=</span> <span class="s">&#39;:</span><span class="si">%s</span><span class="s">:</span><span class="se">\n</span><span class="si">%s</span><span class="se">\n</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">rest</span><span class="p">))</span></div><div class='line' id='LC131'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">request</span> <span class="o">=</span> <span class="n">Request</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span></div><div class='line' id='LC132'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">request</span><span class="o">.</span><span class="n">deferred</span><span class="o">.</span><span class="n">addBoth</span><span class="p">(</span><span class="n">callback</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_RH_command</span><span class="p">)</span></div><div class='line' id='LC133'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">request</span><span class="p">)</span></div><div class='line' id='LC134'><br/></div><div class='line' id='LC135'><br/></div><div class='line' id='LC136'><span class="k">class</span> <span class="nc">StandardIOProtocol</span><span class="p">(</span><span class="n">LineReceiver</span><span class="p">):</span></div><div class='line' id='LC137'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">delimiter</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span></div><div class='line' id='LC138'><br/></div><div class='line' id='LC139'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">opensips_socket</span><span class="p">):</span></div><div class='line' id='LC140'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="bp">self</span><span class="o">.</span><span class="n">opensips_socket</span> <span class="o">=</span> <span class="n">opensips_socket</span></div><div class='line' id='LC141'><br/></div><div class='line' id='LC142'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">def</span> <span class="nf">connectionMade</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span></div><div class='line' id='LC143'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="bp">self</span><span class="o">.</span><span class="n">management</span> <span class="o">=</span> <span class="n">ManagementInterface</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">opensips_socket</span><span class="p">)</span></div><div class='line' id='LC144'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;&gt;&gt;&gt; &#39;</span><span class="p">)</span></div><div class='line' id='LC145'><br/></div><div class='line' id='LC146'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">def</span> <span class="nf">lineReceived</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">line</span><span class="p">):</span></div><div class='line' id='LC147'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span> <span class="n">line</span><span class="p">:</span></div><div class='line' id='LC148'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="bp">self</span><span class="o">.</span><span class="n">management</span><span class="o">.</span><span class="n">send_command</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_command_cb</span><span class="p">)</span></div><div class='line' id='LC149'><br/></div><div class='line' id='LC150'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">def</span> <span class="nf">_command_cb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">):</span></div><div class='line' id='LC151'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">Failure</span><span class="p">):</span></div><div class='line' id='LC152'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">data</span> <span class="o">=</span> <span class="s">&quot;failed to execute command: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">result</span><span class="o">.</span><span class="n">value</span></div><div class='line' id='LC153'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">else</span><span class="p">:</span></div><div class='line' id='LC154'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">data</span> <span class="o">=</span> <span class="n">result</span></div><div class='line' id='LC155'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">delimiter</span><span class="p">)</span></div><div class='line' id='LC156'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;&gt;&gt;&gt; &#39;</span><span class="p">)</span></div><div class='line' id='LC157'><br/></div><div class='line' id='LC158'><br/></div><div class='line' id='LC159'><span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span></div><div class='line' id='LC160'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kn">from</span> <span class="nn">optparse</span> <span class="kn">import</span> <span class="n">OptionParser</span></div><div class='line' id='LC161'><br/></div><div class='line' id='LC162'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">parser</span> <span class="o">=</span> <span class="n">OptionParser</span><span class="p">()</span></div><div class='line' id='LC163'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&#39;--socket&#39;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&#39;socket_file&#39;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s">&#39;/var/run/opensips/socket&#39;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&#39;File&#39;</span><span class="p">)</span></div><div class='line' id='LC164'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">options</span><span class="p">,</span> <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span></div><div class='line' id='LC165'><br/></div><div class='line' id='LC166'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">stdio</span><span class="o">.</span><span class="n">StandardIO</span><span class="p">(</span><span class="n">StandardIOProtocol</span><span class="p">(</span><span class="n">options</span><span class="o">.</span><span class="n">socket_file</span><span class="p">))</span></div><div class='line' id='LC167'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">reactor</span><span class="o">.</span><span class="n">run</span><span class="p">()</span></div><div class='line' id='LC168'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1163719/a9b3b662fcd1b805b38a8cb3bbeb4b5f68f4b71e/opensips-scket-sender.py" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1163719#file_opensips_scket_sender.py" style="float:right;margin-right:10px;color:#666">opensips-scket-sender.py</a>
            <a href="https://gist.github.com/1163719">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Un script que toma el comando que le pasemos por la línea de comando, lo formatea correctamente y lo envía al socket de OpenSIPS. Es bastante simple, pero nunca había probado el módulo <em>stdio</em> de <a href="http://twistedmatrix.com">Twisted</a>, que permite hacer IO asíncrona de la entarda estándar, y ésta era una buena ocasión para probarlo. <img src='http://saghul.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://saghul.net/blog/2011/08/22/mandando-comandos-a-opensips-con-mi_datagram/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Jugando con Python en Android</title>
		<link>http://saghul.net/blog/2010/03/20/jugando-con-python-en-android/</link>
		<comments>http://saghul.net/blog/2010/03/20/jugando-con-python-en-android/#comments</comments>
		<pubDate>Sat, 20 Mar 2010 18:18:43 +0000</pubDate>
		<dc:creator>saghul</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[ASE]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://saghul.net/blog/?p=1108</guid>
		<description><![CDATA[Prácticamente todo lo que hay para Android esta hecho en Java, pero para los que nos dejó de molar hay alternativa: Android Scripting Environment. ASE es una aplicación de Google gracias a la cual podemos instalar diversos lenguajes de scripting como Python, Perl, Lua, etc&#8230; Hasta ahora parece que la tenían un poco abandonada, pero [...]]]></description>
			<content:encoded><![CDATA[<p>Prácticamente todo lo que hay para Android esta hecho en Java, pero para los que nos dejó de molar hay alternativa: <a href="http://code.google.com/p/android-scripting/" target="_blank">Android Scripting Environment</a>.</p>
<p>ASE es una aplicación de Google gracias a la cual podemos instalar diversos lenguajes de scripting como Python, Perl, Lua, etc&#8230; Hasta ahora parece que la tenían un poco abandonada, pero han sacado dos versiones en la última semana, y por fin funciona sin tener que hacer nada a mano <img src='http://saghul.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Para instalarla basta con acceder a la web y <a href="http://code.google.com/p/android-scripting/downloads/list" target="_blank">bajarse el apk</a>. Una vez instalamos la aplicación nos da la opción de instalar los diversos intérpretes, así que escogemos Python <img src='http://saghul.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Además del propio intérprete se instalan varios scripts de demostración para empezar a jugar.</p>
<p>Happy coding!</p>
<p style="text-align: center; "><a href="http://saghul.net/blog/wp-content/uploads/2010/03/4448535314_8f4d1998ca_o.jpg"><img class="size-medium wp-image-1109 aligncenter" title="4448535314_8f4d1998ca_o" src="http://saghul.net/blog/wp-content/uploads/2010/03/4448535314_8f4d1998ca_o-180x300.jpg" alt="4448535314_8f4d1998ca_o" width="180" height="300" /></a></p>
<p style="text-align: center; "><a href="http://saghul.net/blog/wp-content/uploads/2010/03/4447762215_cc5b507710_o.jpg"><img class="size-medium wp-image-1110 aligncenter" title="4447762215_cc5b507710_o" src="http://saghul.net/blog/wp-content/uploads/2010/03/4447762215_cc5b507710_o-180x300.jpg" alt="4447762215_cc5b507710_o" width="180" height="300" /></a></p>
<p style="text-align: center; "><a href="http://saghul.net/blog/wp-content/uploads/2010/03/4448540138_4649853595_o.jpg"><img class="size-medium wp-image-1111 aligncenter" title="4448540138_4649853595_o" src="http://saghul.net/blog/wp-content/uploads/2010/03/4448540138_4649853595_o-180x300.jpg" alt="4448540138_4649853595_o" width="180" height="300" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://saghul.net/blog/2010/03/20/jugando-con-python-en-android/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

