<?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>tail -f &#124; sysadmin &#187; HTTP</title>
	<atom:link href="http://www.tail-f.com.ar/tag/http/feed" rel="self" type="application/rss+xml" />
	<link>http://www.tail-f.com.ar</link>
	<description>Noticias y recursos para sysadmins Unix</description>
	<lastBuildDate>Mon, 28 Nov 2011 21:44:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Python BaseHTTPServer: un servidor HTTP en unas pocas líneas</title>
		<link>http://www.tail-f.com.ar/programacion/python/python-basehttpserver-un-servidor-http-en-unas-pocas-lineas.html</link>
		<comments>http://www.tail-f.com.ar/programacion/python/python-basehttpserver-un-servidor-http-en-unas-pocas-lineas.html#comments</comments>
		<pubDate>Thu, 15 Jul 2010 20:25:01 +0000</pubDate>
		<dc:creator>elbarto</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Load average]]></category>
		<category><![CDATA[Servidor HTTP]]></category>
		<category><![CDATA[Status]]></category>

		<guid isPermaLink="false">http://www.tail-f.com.ar/?p=384</guid>
		<description><![CDATA[Python es un lenguaje tan poderoso que me sorprende constantemente. Particularmente su librería standard incluye tantas cosas maravillosas que lleva tiempo ir descubriéndolas todas. Hoy voy a hablar de BaseHTTPServer un módulo de Python 2.x (en 3.x se llama http.server) que nos permite implementar un servidor web en muy pocas líneas de código. Es la [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_386" class="wp-caption alignright" style="width: 277px"><a href="http://www.tail-f.com.ar/wp-content/uploads/python.png"><img class="size-full wp-image-386" title="python" src="http://www.tail-f.com.ar/wp-content/uploads/python.png" alt="Python" width="267" height="235" /></a><p class="wp-caption-text">Python</p></div>
<p>Python es un lenguaje tan poderoso que me sorprende constantemente. Particularmente su librería standard incluye tantas cosas maravillosas que lleva tiempo ir descubriéndolas todas.</p>
<p>Hoy voy a hablar de <a href="http://docs.python.org/library/basehttpserver.html">BaseHTTPServer</a> un módulo de Python 2.x (en 3.x se llama http.server) que nos permite implementar un servidor web en muy pocas líneas de código. Es la base de otros dos módulos muy interesantes, <a href="http://docs.python.org/library/simplehttpserver.html">SimpleHTTPServer</a> y <a href="http://docs.python.org/library/cgihttpserver.html">CGIHTTPServer</a>. El primero implementa un muy simple servidor web que sirve archivos y el segundo es un servidor que ejecuta script CGI en entornos Unix.</p>
<p>Por ejemplo, con SimpleHTTPServer podemos hacer algo tan maravilloso como esto:</p>
<pre>$ cd ~/musica
$ python -m SimpleHTTPServer
</pre>
<p>Y con sólo eso tenemos montado un servidor web escuchando en 0.0.0.0:8000 y sirviendo todos nuestros archivos de la carpeta ~/musica.</p>
<p>Pero la clase BaseHTTPServer es más poderosa porque nos permite implementar nuestros propios RequestHandlers, es decir, clases que extiendan <a href="http://docs.python.org/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler">BaseHTTPRequestHandler</a> y hagan lo que nosotros queramos en cada petición para cada método HTTP. Por ejemplo, para implementar el método GET solamente hace falta crear una clase que extienda BaseHTTPRequestHandler y sobrecargar el método do_GET.</p>
<p>Por ejemplo, si yo quisiera implementar un muy básico servidor que me diga el <a href="http://en.wikipedia.org/wiki/Load_%28computing%29">load average</a> del sistema sería tan sencillo como poner:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="co1">#!/usr/bin/env python</span><br />
<span class="co1"># -*- coding: utf-8 -*-</span><br />
<span class="kw1">import</span> <span class="kw3">os</span><br />
<span class="kw1">import</span> <span class="kw3">sys</span><br />
<span class="kw1">import</span> <span class="kw3">BaseHTTPServer</span></p>
<p><span class="kw1">class</span> RequestHandler <span class="br0">&#40;</span><span class="kw3">BaseHTTPServer</span>.<span class="me1">BaseHTTPRequestHandler</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">def</span> do_GET <span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">send_response</span><span class="br0">&#40;</span><span class="nu0">200</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">end_headers</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">wfile</span>.<span class="me1">write</span><span class="br0">&#40;</span><span class="kw2">self</span>._get_status<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><br />
&nbsp; &nbsp; <span class="kw1">def</span> _get_status <span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="st0">&quot;Status:<span class="es0">\n</span>&quot;</span> \<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&quot;&#8212;&#8212;-<span class="es0">\n</span>&quot;</span> \<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&quot;Load average: %s<span class="es0">\n</span>&quot;</span> % \<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="st0">&quot;%01.2f, %01.2f, %01.2f&quot;</span> % \<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">os</span>.<span class="me1">getloadavg</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</p>
<p><span class="kw1">def</span> main <span class="br0">&#40;</span>args<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; httpd = <span class="kw3">BaseHTTPServer</span>.<span class="me1">HTTPServer</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="st0">&#8216;localhost&#8217;</span>, <span class="nu0">8000</span><span class="br0">&#41;</span>, RequestHandler<span class="br0">&#41;</span><br />
&nbsp; &nbsp; httpd.<span class="me1">serve_forever</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p><span class="kw1">if</span> __name__ == <span class="st0">&quot;__main__&quot;</span>:<br />
&nbsp; &nbsp; <span class="kw3">sys</span>.<span class="me1">exit</span><span class="br0">&#40;</span>main<span class="br0">&#40;</span><span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp;</div>
<p>Y al entrar a http://localhost:8000 vería algo así:</p>
<pre>Status:
-------
Load average: 0.26, 0.35, 0.40
</pre>
<p>A esta altura creo que se hace bastante evidente el potencial de esta clase BaseHTTPServer. Piensen lo sencillo que sería hacer un servidor para un <a href="http://en.wikipedia.org/wiki/Representational_State_Transfer#RESTful_web_services">web service REST (RESTful web service)</a> implementando métodos do_GET, do_DELETE, do_POST etc.</p>
<p>Para jugar un poco hice una versión un poco más completa de este servidor de status. Al correrlo lanza el servidor HTTP, al cual podemos acceder para pedirle un status general del sistema en tres formatos: texto plano (plain), HTML y JSON. También le agregué un <a href="http://docs.python.org/library/optparse.html">OptionParser</a> para poder configurar el host y puerto en el cual el servidor deberá escuchar. Con comentarios y todo ocupa 149 líneas.</p>
<p>Pueden ver el código aquí: <a href="http://pastebin.com/G5FgTDiv">http://pastebin.com/G5FgTDiv</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tail-f.com.ar/programacion/python/python-basehttpserver-un-servidor-http-en-unas-pocas-lineas.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>httping: herramienta para medir la latencia de un servidor web</title>
		<link>http://www.tail-f.com.ar/servicios/httpd/httping-herramienta-para-medir-la-latencia-de-un-servidor-web.html</link>
		<comments>http://www.tail-f.com.ar/servicios/httpd/httping-herramienta-para-medir-la-latencia-de-un-servidor-web.html#comments</comments>
		<pubDate>Mon, 08 Mar 2010 19:40:58 +0000</pubDate>
		<dc:creator>elbarto</dc:creator>
				<category><![CDATA[httpd]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[httping]]></category>
		<category><![CDATA[latencia]]></category>
		<category><![CDATA[troubleshooting]]></category>

		<guid isPermaLink="false">http://www.tail-f.com.ar/?p=343</guid>
		<description><![CDATA[El otro día, Pablo Morales me pasó el dato de httping. Se trata de una herramienta similar al ping, pero que en vez de enviar paquetes por ICMP a una IP, envía peticiones HTTP a un servidor web. De esta forma podemos medir la latencia del servicio. Instalación En Debian/Ubuntu podemos instalar el paquete httping: [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.tail-f.com.ar/wp-content/uploads/web_server.jpg"><img class="alignright size-medium wp-image-344" title="Web server" src="http://www.tail-f.com.ar/wp-content/uploads/web_server-300x225.jpg" alt="" width="240" height="180" /></a>El otro día, <a href="http://blog.pablo-morales.com/">Pablo Morales</a> me pasó el dato de <a href="http://www.vanheusden.com/httping/">httping</a>. Se trata de una herramienta similar al <a href="http://es.wikipedia.org/wiki/Ping">ping</a>, pero que en vez de enviar paquetes por ICMP a una IP, envía peticiones HTTP a un servidor web. De esta forma podemos medir la <a href="http://es.wikipedia.org/wiki/Latencia">latencia</a> del servicio.</p>
<p><strong>Instalación</strong></p>
<p>En Debian/Ubuntu podemos instalar el paquete httping:</p>
<pre># sudo apt-get install httping</pre>
<p>Para otras distribuciones, accediendo a la <a href="http://www.vanheusden.com/httping/">página de httping</a> encontrarán RPMs y el tar.gz con los fuentes. Descargando los fuentes solamente hace falta descomprimirlo y darle &#8220;make &amp;&amp; make install&#8221;.</p>
<p><strong>Ejemplo de uso</strong></p>
<p>Usarlo es muy sencillo. Por ejemplo, para pingear un servidor local:</p>
<pre>elbarto@tarantino:~$ httping -c 5 -g http://localhost
PING localhost:80 (http://localhost):
connected to localhost:80, seq=0 time=1.56 ms
connected to localhost:80, seq=1 time=1.30 ms
connected to localhost:80, seq=2 time=1.30 ms
connected to localhost:80, seq=3 time=1.27 ms
connected to localhost:80, seq=4 time=1.19 ms
--- http://localhost ping statistics ---
5 connects, 5 ok, 0.00% failed
round-trip min/avg/max = 1.2/1.3/1.6 ms</pre>
<p>El parámetro &#8220;-c 5&#8243; define la cantidad de pings a realizar. Esto es igual que el ping de Linux.</p>
<p>También puedo pingear esta web.</p>
<pre>httping -c 5 -g http://www.tail-f.com.ar
PING www.tail-f.com.ar:80 (http://www.tail-f.com.ar):
connected to www.tail-f.com.ar:80, seq=0 time=55.48 ms
connected to www.tail-f.com.ar:80, seq=1 time=45.74 ms
connected to www.tail-f.com.ar:80, seq=2 time=34.24 ms
connected to www.tail-f.com.ar:80, seq=3 time=41.79 ms
connected to www.tail-f.com.ar:80, seq=4 time=40.31 ms
--- http://www.tail-f.com.ar ping statistics ---
5 connects, 5 ok, 0.00% failed
round-trip min/avg/max = 34.2/43.5/55.5 ms</pre>
<p>En este caso los tiempos son mayores, y tenemos que tener en cuenta dos cosas. En primer lugar, hay una diferencia por la conexión (no es lo mismo conectarme a localhost que a un servidor externo). En segundo lugar, este blog es un sitio dinámico hecho en PHP que realiza una serie de operaciones antes de mostrar el resultado. Pero, ¿cómo sabemos qué toma más tiempo, si la conexión o el procesamiento del sitio?. Para ello podemos separar ambos tiempos con el parámetro -S.</p>
<pre>httping -c 5 -Sg http://www.tail-f.com.ar
PING www.tail-f.com.ar:80 (http://www.tail-f.com.ar):
connected to www.tail-f.com.ar:80, seq=0 time=25.96+22.93=48.89 ms
connected to www.tail-f.com.ar:80, seq=1 time=22.74+17.37=40.11 ms
connected to www.tail-f.com.ar:80, seq=2 time=21.90+20.39=42.29 ms
connected to www.tail-f.com.ar:80, seq=3 time=25.36+18.01=43.37 ms
connected to www.tail-f.com.ar:80, seq=4 time=27.81+15.85=43.66 ms
--- http://www.tail-f.com.ar ping statistics ---
5 connects, 5 ok, 0.00% failed
round-trip min/avg/max = 40.1/43.7/48.9 ms</pre>
<p>Aquí vemos primero el tiempo de conexión, luego el de procesamiento y por último el total. En este caso, por lo general toma un poco más la conexión que el procesamiento, aunque es bastante parejo.</p>
<p>Otra cosa a tener en cuenta es que en este tipo de pruebas que venimos haciendo, el httping envía una petición HEAD al servidor. Para enviar un GET (que obtenga todo el contenido de la página), debemos agregar el parámetro &#8220;-G&#8221;. Por ejemplo:</p>
<pre>elbarto@tarantino:~$ httping -c 5 -Gg http://www.tail-f.com.ar
PING www.tail-f.com.ar:80 (http://www.tail-f.com.ar):
connected to www.tail-f.com.ar:80, seq=0 time=210.41 ms
connected to www.tail-f.com.ar:80, seq=1 time=211.78 ms
connected to www.tail-f.com.ar:80, seq=2 time=194.49 ms
connected to www.tail-f.com.ar:80, seq=3 time=184.41 ms
connected to www.tail-f.com.ar:80, seq=4 time=210.62 ms
--- http://www.tail-f.com.ar ping statistics ---
5 connects, 5 ok, 0.00% failed
round-trip min/avg/max = 184.4/202.3/211.8 ms</pre>
<p>Aquí los tiempos se incrementan, lógicamente, porque el tamaño de los paquetes traficados es mucho mayor.</p>
<p>Por último, podemos usar httping para hacer pruebas de stressing, con la opción &#8220;flood connect&#8221; (-f) que envía peticiones sin esperar respuesta.</p>
<pre>elbarto@tarantino:~$ httping -fg http://www.tail-f.com.ar
PING www.tail-f.com.ar:80 (http://www.tail-f.com.ar):
connected to www.tail-f.com.ar:80, seq=0 time=51.54 ms
connected to www.tail-f.com.ar:80, seq=1 time=48.47 ms
connected to www.tail-f.com.ar:80, seq=2 time=56.07 ms
connected to www.tail-f.com.ar:80, seq=3 time=55.58 ms
connected to www.tail-f.com.ar:80, seq=4 time=55.99 ms
connected to www.tail-f.com.ar:80, seq=5 time=52.46 ms
connected to www.tail-f.com.ar:80, seq=6 time=56.06 ms
connected to www.tail-f.com.ar:80, seq=7 time=52.99 ms
connected to www.tail-f.com.ar:80, seq=8 time=52.54 ms
connected to www.tail-f.com.ar:80, seq=9 time=76.56 ms
connected to www.tail-f.com.ar:80, seq=10 time=63.04 ms
connected to www.tail-f.com.ar:80, seq=11 time=53.01 ms
connected to www.tail-f.com.ar:80, seq=12 time=36.00 ms
connected to www.tail-f.com.ar:80, seq=13 time=48.93 ms
connected to www.tail-f.com.ar:80, seq=14 time=42.78 ms
connected to www.tail-f.com.ar:80, seq=15 time=44.82 ms
connected to www.tail-f.com.ar:80, seq=16 time=52.41 ms
connected to www.tail-f.com.ar:80, seq=17 time=56.62 ms
connected to www.tail-f.com.ar:80, seq=18 time=48.44 ms
connected to www.tail-f.com.ar:80, seq=19 time=53.05 ms
connected to www.tail-f.com.ar:80, seq=20 time=54.13 ms
^Cconnected to www.tail-f.com.ar:80, seq=21 time=60.53 ms
--- http://www.tail-f.com.ar ping statistics ---
22 connects, 22 ok, 0.00% failed
round-trip min/avg/max = 36.0/53.3/76.6 ms</pre>
<p>Luego tiene muchas otras opciones interesantes, como configuración de la salida para integrarse con Nagios y la posibilidad de definir un User-Agent y un Referer específicos en los requests. Les recomiendo instalarlo y hacer &#8220;man httping&#8221; para ver todas las opciones.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tail-f.com.ar/servicios/httpd/httping-herramienta-para-medir-la-latencia-de-un-servidor-web.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Python-Directadmin: API para conectarse a Directadmin desde Python</title>
		<link>http://www.tail-f.com.ar/paneles-de-control/directadmin/python-directadmin-api-para-conectarse-a-directadmin-desde-python.html</link>
		<comments>http://www.tail-f.com.ar/paneles-de-control/directadmin/python-directadmin-api-para-conectarse-a-directadmin-desde-python.html#comments</comments>
		<pubDate>Sun, 14 Feb 2010 21:47:26 +0000</pubDate>
		<dc:creator>elbarto</dc:creator>
				<category><![CDATA[Directadmin]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[HTTP]]></category>

		<guid isPermaLink="false">http://www.tail-f.com.ar/?p=302</guid>
		<description><![CDATA[En esta entrada presento la librería python-directadmin: una implementación en Python de la API de Directadmin.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.tail-f.com.ar/wp-content/uploads/direct_admin.gif"><img class="size-full wp-image-22 alignright" title="DirectAdmin" src="http://www.tail-f.com.ar/wp-content/uploads/direct_admin.gif" alt="" /></a></p>
<p>Este post viene un poco postergado. Hace algún tiempo que empecé con un pequeño proyecto y tenía pensado escribir una entrada en el blog para presentarlo, pero por distintos compromisos no he podido hacerlo hasta ahora, así que aquí va.</p>
<p>Para los que no lo sepan, <a href="http://www.directadmin.com/">Directadmin</a> tiene una <a href="http://www.directadmin.com/api.html">API</a> para realizar distintas operaciones en el panel de control desde otra aplicación. La API no es más que una serie de URLs que reciben información por HTTP POST, ejecutan una acción y devuelven un resultado. De esa forma se pude acceder a muchas de las operaciones que uno realiza manualmente a través del panel (salvo algunas que parecen no estar muy bien implementadas/probadas).</p>
<p>En el <a href="http://www.directadmin.com/forum">foro de Directadmin</a> existe una <a href="http://www.directadmin.com/forum/showthread.php?t=258">clase hecha en PHP</a> a la que se le da bastante crédito, que lo que hace es abrir un socket y enviar requests HTTP a un servidor Directadmin y devolver la respuesta. Personalmente me parece que la clase es bastante mala y pobre, por las siguientes razones:</p>
<ul>
<li>Está pensada para PHP 4.</li>
<li>No utiliza cURL, con lo cual hay demasiado código para hacer tareas que ya están implementadas en otras librerías.</li>
<li>Tiene un manejo de errores muy pobre</li>
<li>No es una implementación de la API de Directadmin (no implementa comandos específicos), sino que, como su nombre lo indica, se limita a crear un socket a un puerto HTTP y enviar requests (nuevamente&#8230; cURL).</li>
<li>El código no sigue ningún estándar de formato y &#8220;mejores prácticas&#8221;.</li>
</ul>
<p>A pesar de todos estos problemas, tampoco me parecía un aporte muy interesante reescribir esa clase utilizando cURL. Además no tenía ganas de programar en PHP. Por lo tanto, lo que hice fue crear una implementación de la API en Python. Es decir, una librería que se ocupe de conectarse a un servidor Directadmin, enviar comandos, procesar sus respuestas y ofrecer una interfaz de programación cómoda para el desarrollador. De paso, el proyecto me sirvió para aprender un poco más de Python que es un lenguaje que me gusta mucho.</p>
<p>El resultado fue este proyecto que alojé en Google Code: <a href="http://code.google.com/p/python-directadmin/">http://code.google.com/p/python-directadmin/</a></p>
<p>El código es bastante sencillo (e incluso un poco tosco). Si ven el <a href="http://code.google.com/p/python-directadmin/source/browse/trunk/directadmin.py">código del módulo directadmin</a>, van a ver que hay una serie de clases. La más importante es la clase Api, que implementa los distintos métodos de la API de Directadmin (salvo algunos que no implementé aún). Esa clase hace uso de ApiConnector que es una clase muy sencilla que resume en unas pocas líneas lo que hacía la clase de PHP, utilizando <a href="http://docs.python.org/library/urllib2.html">urllib2</a>. Luego hay un par de clases más para representar los tipos de usuarios, que no revisten mayor interés.</p>
<p><strong>Posibles implementaciones</strong></p>
<p>Cuando publiqué mi contribución en el foro de Directadmin obtuve una respuesta bastante poco amistosa de un usuario que no le veía utilidad a mi aporte. Más allá de esa persona, que afirma no conocer a nadie que programe en Python (sin comentarios&#8230;), yo creo que hay al menos tres vías de implementación de esta librería:</p>
<ul>
<li>La más básica: crear scripts de consola para automatizar tareas (ver ejemplos más adelante).</li>
<li>Desarrollo web: así como el principal objetivo de la clase en PHP era que las empresas de hosting pudieran integrar sus sitios institucionales con el panel de control, esta implementación en Python permite el mismo tipo de integración para sitios desarrollados en Python (por ejemplo usando frameworks como Django, web2py, TurboGears, Pylons, etc.).</li>
<li>Aplicaciones de escritorio: no hay ni punto de comparación entre el soporte que ofrece Python para aplicaciones de escritorio con el que ofrece PHP. Hoy por hoy, un porcentaje muy alto de las aplicaciones de escritorio para Linux se escriben en Python y librerías como PyQt permiten hacer software desktop para Linux, Windows y Mac. Una aplicación de escritorio para monitorear y administrar múltiples servidores Directadmin se podría hacer sencillamente utilizando esta librería.</li>
</ul>
<p><strong>Ejemplos</strong></p>
<p>Utilizar la API es bastante sencillo. En la página del proyecto podrán ver algunos ejemplos básicos como éste, para listar todos los usuarios del panel.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">import</span> directadmin</p>
<p>api = directadmin.<span class="me1">Api</span><span class="br0">&#40;</span><span class="st0">&quot;admin&quot;</span>, <span class="st0">&quot;password&quot;</span>, <span class="st0">&quot;hostname.com&quot;</span>, <span class="nu0">2222</span><span class="br0">&#41;</span><br />
<span class="kw1">print</span> api.<span class="me1">list_all_users</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
<p>Además en el paquete incluí un archivo de ejemplo que se llama <a href="http://code.google.com/p/python-directadmin/source/browse/trunk/suspension.py">suspension.py</a>. Este script utiliza la API para suspender/desuspender usuarios desde la consola. Se utiliza de la siguiente forma:</p>
<pre>./suspension.py suspend</pre>
<p>Tiene algunas otras opciones para especifiar host, puerto, usuario y password para conectarse Directadmin. Para ver las opciones disponibles pueden poner:</p>
<pre>./suspension.py --help</pre>
<p><strong>Pendientes</strong></p>
<p>Aún quedan varias cosas pendientes por hacer. Hay algunos métodos que no he implementado aún. Hay otros que los he probado y no funcionan, pero porque obtengo errores de parte de Directadmin y todavía nadie me ha sabido contestar por qué. También me gustaría crear un script de instalación con <a href="http://pypi.python.org/pypi/setuptools">setuptools</a>, pero todavía debo interiorizarme un poco más en el tema. Por último, me gustaría también hacer una implementación de más alto nivel, pues ahora la clase Api es una especie de bolsa de funciones que no me convence del todo.</p>
<p><strong>Links</strong></p>
<ul>
<li><a href="http://code.google.com/p/python-directadmin/">Página del proyecto</a></li>
<li><a href="http://code.google.com/p/python-directadmin/downloads/list">Descargar python-directadmin</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.tail-f.com.ar/paneles-de-control/directadmin/python-directadmin-api-para-conectarse-a-directadmin-desde-python.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Sistemas de control con Asterisk</title>
		<link>http://www.tail-f.com.ar/servicios/asterisk/sistemas-de-control-con-asterisk.html</link>
		<comments>http://www.tail-f.com.ar/servicios/asterisk/sistemas-de-control-con-asterisk.html#comments</comments>
		<pubDate>Thu, 08 Jan 2009 13:40:49 +0000</pubDate>
		<dc:creator>elbarto</dc:creator>
				<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[DTMF]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[SIP]]></category>
		<category><![CDATA[sistemas de control]]></category>

		<guid isPermaLink="false">http://www.tail-f.com.ar/?p=185</guid>
		<description><![CDATA[Reproduzco un artículo encontrado a través de Barrapunto en Bytecoders. Es muy interesante la cantidad de cosas que se están haciendo con Asterisk, sin lugar a dudas el softswitch open source más importante. &#8220;Se suele decir que Asterisk es mucho más que una PBX, ya que las funcionalidades que podemos incorporar a un sistema Asterisk [...]]]></description>
			<content:encoded><![CDATA[<p>Reproduzco un artículo encontrado a través de <a href="http://softlibre.barrapunto.com/article.pl?sid=09/01/08/0829232&amp;from=rss">Barrapunto</a> en <a href="http://bytecoders.homelinux.com/content/sistemas-de-control-con-asterisk.html">Bytecoders</a>. Es muy interesante la cantidad de cosas que se están haciendo con Asterisk, sin lugar a dudas el softswitch open source más importante.</p>
<div id="attachment_186" class="wp-caption alignright" style="width: 310px"><a href="http://www.tail-f.com.ar/wp-content/uploads/asterisk.png"><img class="size-medium wp-image-186" title="asterisk" src="http://www.tail-f.com.ar/wp-content/uploads/asterisk-300x168.png" alt="Asterisk" width="300" height="168" /></a><p class="wp-caption-text">Asterisk</p></div>
<p>&#8220;Se suele decir que Asterisk es mucho más que una PBX, ya que las funcionalidades que podemos incorporar a un sistema Asterisk suelen ir mucho más allá de lo que entendemos por una simple PBX. Asterisk ha sido capaz de integrar la VoIP con gran cantidad de sistemas, entre ellos los sistemas de control.</p>
<p>Hace un tiempo ya vimos la integración con sistemas de riego (<a title="BotaniCalls" href="http://www.asteriskvoipnews.com/asterisk_news/asterisk_based_plant_assistance_pick_up_its_your_plant_calling.html" target="_blank">BotaniCalls</a>), tal y como nos contaba <a title="Elio" href="http://www.sinologic.net/2007-07/a-las-plantas-les-gusta-hablar-con-asterisk/" target="_blank">Elio</a> se trata de un sistema con sensores de humedad, de movimiento, micrófonos, bases de datos de tipos de plantas, estadísticas de humedad y movimiento, avisos por SMS &#8230;</p>
<p>Obviamente otro uso práctico y más común es el control de aplicaciones en una computadora. James Forman detalla un sistema para <a title="controlar aplicaciones con Asterisk" href="http://blog.jamesforman.co.nz/2009/01/controlling-applications-with-asterisk/" target="_blank">controlar aplicaciones con Asterisk</a>, con un ejemplo para traducir dígitos DTMF a combinaciones de teclas que le permiten controlar un reproductor VLC Media Player usando el siguiente esquema:</p>
<p style="text-align: center;">DTMF -&gt; SIP -&gt; HTTP -&gt; PHP -&gt; VBS -&gt; VLC</p>
<p>Pasamos los tonos DTMF del teléfono a Asterisk usando SIP, el servidor ejecuta un script PHP que a su vez ejecuta un Visual Basic Script encargado de controlar VLC.</p>
<p>Por otro lado Michael Graves está actualmente trabajando en un <a title="sistema de control domótico" href="http://www.mgraves.org/voip/2009/01/controlling-applications-from-asterisk/" target="_blank">sistema de control domótico</a> que le permita controlar ciertas partes automatizadas de la casa. Es una aproximación muy similar donde el proceso IVR llama a scripts <a title="AGI" href="http://www.voip-info.org/wiki-Asterisk+AGI" target="_blank">AGI</a> que mandan comandos predefinidos a un ejecutable (xsend.exe) para que esté actúe sobre módulos <a title="X10" href="http://es.wikipedia.org/wiki/X10" target="_blank">X10</a> de automatización domésticos (aunque parece que actualmente existen sistemas de automatización más fiables que X10). Por otro lado el proyecto también implica hacer accesible el control de ciertas partes usando el microbrowser disponible en los teléfonos Polycom IP650. Se trata de un sistema inspirado en BotaniCalls a raíz de la charla de Mark Spencer sobre nuevos usos de Asterisk.</p>
<p>En nuestro país, existe un interesante proyecto que está llevando a cabo el genial equipo de desarrolladores de <a title="VoIPminic" href="http://voipminic.com/" target="_blank">VoIPminic</a>. Ya existe un <a title="prototipo" href="http://blog.voipminic.com/2008/12/prototipo/" target="_blank">prototipo</a> basado en la placa que se presentó en el VoIP2day capaz de controlar una regleta de enchufes usando Asterisk o un interfaz web, ganador del <em>Primer Premio del área tecnológica de telecomunicaciones, multimedia e informática </em>de la edición XX de los premios nacionales Don Bosco. El sistema puede interactuar usando cualquier lenguaje de programación además de ser independiente del sistema operativo al no depender de la máquina.&#8221;</p>
<p>Artículo original: <a href="http://bytecoders.homelinux.com/content/sistemas-de-control-con-asterisk.html">http://bytecoders.homelinux.com/content/sistemas-de-control-con-asterisk.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tail-f.com.ar/servicios/asterisk/sistemas-de-control-con-asterisk.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

