<?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>El blog de Lucas &#187; SysAdmin</title>
	<atom:link href="http://lucas.di-pentima.com.ar/wordpress/category/sysadmin/feed/" rel="self" type="application/rss+xml" />
	<link>http://lucas.di-pentima.com.ar/wordpress</link>
	<description>Software Libre, Aikido, y demás cosas interesantes...</description>
	<lastBuildDate>Tue, 18 May 2010 18:22:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Sólo un SysAdmin puede entender a otro SysAdmin&#8230;</title>
		<link>http://lucas.di-pentima.com.ar/wordpress/2009/07/24/fiesta-sysadmin/</link>
		<comments>http://lucas.di-pentima.com.ar/wordpress/2009/07/24/fiesta-sysadmin/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 14:51:44 +0000</pubDate>
		<dc:creator>Lucas Di Pentima</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[sysadmin day]]></category>

		<guid isPermaLink="false">http://lucas.di-pentima.com.ar/wordpress/?p=292</guid>
		<description><![CDATA[&#8230;y es por eso que en Capital Federal están organizando una fiesta especial para celebrar el día del Administrador de Sistemas! Lástima que estoy levemente lejos, pero pienso que ningún SysAdmin capitalino que se precie, debería faltar a semejante evento. Un buen SysAdmin es aquel que es invisible a sus usuarios, y eso es una [...]]]></description>
			<content:encoded><![CDATA[<p>&#8230;y es por eso que en Capital Federal están organizando una <a href="http://administradoresanonimos.org/">fiesta especial</a> para celebrar el día del Administrador de Sistemas!</p>
<p>Lástima que estoy levemente lejos, pero pienso que ningún SysAdmin capitalino que se precie, debería faltar a semejante evento.</p>
<p>Un buen SysAdmin es aquel que es invisible a sus usuarios, y eso es una maldición ya que nadie aprecia realmente el trabajo de un SysAdmin y sólo nos dedican pensamientos (de enojo) cuando las cosas van mal, es por eso que el próximo Viernes 31 de Julio, si estás leyendo esta página, al menos sentí gratitud porque lo estás haciendo gracias al buen trabajo de uno o más SysAdmins.</p>
<p>Si querés realmente demostrar tu aprecio hacia nosotros, lo que podés hacer es simple: aparecete en la fiesta y pagale unas buenas birras al SysAdmin que te parezca!</p>
<p>Dejo un video alusivo para sensibilizar a la población&#8230;</p>
<div class="wpv_videoc">
<div class="wpv_self"><a href="http://www.skarcha.com/wp-plugins/wpvideo/">WPvideo 1.10</a></div>
<div class="wpv_video"><object data="http://www.youtube.com/v/dkgvOA55JZ8" type="application/x-shockwave-flash" width="100%" height="100%"><param name="movie" value="http://www.youtube.com/v/dkgvOA55JZ8"></param></object></div>
<div class="wpv_titleauthor"></div>
<div class="wpv_download"><a target="_blank" href="http://downthisvideo.com/?url=http://www.youtube.com/watch?v=dkgvOA55JZ8">Download!</a></div>
</div>
<p><em>PD: Gracias Nelson por la noticia!</em></p>
]]></content:encoded>
			<wfw:commentRss>http://lucas.di-pentima.com.ar/wordpress/2009/07/24/fiesta-sysadmin/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Despliegue de aplicaciones web Rails con Puppet y Capistrano (parte I)</title>
		<link>http://lucas.di-pentima.com.ar/wordpress/2009/05/15/despliegue-de-aplicaciones-web-rails-con-puppet-y-capistrano-parte-i/</link>
		<comments>http://lucas.di-pentima.com.ar/wordpress/2009/05/15/despliegue-de-aplicaciones-web-rails-con-puppet-y-capistrano-parte-i/#comments</comments>
		<pubDate>Fri, 15 May 2009 19:33:43 +0000</pubDate>
		<dc:creator>Lucas Di Pentima</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[capistrano]]></category>
		<category><![CDATA[puppet]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://lucas.di-pentima.com.ar/wordpress/?p=265</guid>
		<description><![CDATA[Hace algunas semanas me puse a investigar un poco sobre el despliegue de aplicaciones hechas con Ruby on Rails, ya que en mi laburo vamos a comenzar a desarrollar algunas apps en esta plataforma, y quería tener cocinado el tema de infraestructura antes que sea necesario ponerlas en producción. Leyendo variados artículos en la blogósfera, [...]]]></description>
			<content:encoded><![CDATA[<p>Hace algunas semanas me puse a investigar un poco sobre el despliegue de aplicaciones hechas con <a href="http://rubyonrails.org/">Ruby on Rails</a>, ya que en mi laburo vamos a comenzar a desarrollar algunas apps en esta plataforma, y quería tener cocinado el tema de infraestructura antes que sea necesario ponerlas en producción.</p>
<p>Leyendo variados artículos en la blogósfera, he visto que una buena dupla como software <em>&#8220;plataforma base de Rails&#8221;</em> es el uso de <a href="http://mongrel.rubyforge.org/">Mongrel</a> y <a href="http://wiki.nginx.org/Main">Nginx</a>, siendo el primero el servidor de aplicaciones y el último el frontend HTTP. Esta combinación nos permite instalar una aplicación web en un servidor de recursos no muy abundantes, y aún así servir a una buena cantidad de usuarios concurrentes. Obvio que no he hecho métricas propias, pero Internet está lleno de este tipo de análisis.</p>
<p>El problema entonces se divide en dos:</p>
<ul>
<li>Instalar el software base necesario en los servidores</li>
<li>Realizar el despliegue (deploy) de la aplicación en si</li>
</ul>
<p>En este artículo vamos a ver cómo hago yo para mantener el software base (mongrel, nginx, gemas, &#8230;) instalado y configurado en los servidores que correspondan. Esta tarea la hago con <a href="http://reductivelabs.com/products/puppet/">Puppet</a>, una herramienta que <a href="http://lucas.di-pentima.com.ar/wordpress/2007/10/11/manejando-los-hilos-de-nuestra-infraestructura-it/">en un artículo anterior he comentado</a> que me permite administrar una gran cantidad de servidores sin tener que volverme un esclavo.<span id="more-265"></span>A modo de preámbulo, les voy a contar que mis servidores son todos <a href="http://www.debian.org">Debian</a> Lenny (stable) y usamos Rails 2.3.x.</p>
<p>Como primera medida, vamos a definir en Puppet lo necesario para que Ruby y Rails estén instalados, ya que son <em>el sistema operativo</em> de nuestra aplicación web.</p>
<p>Para poder instalar Rails 2.3.x desde el instalador de gemas, tenemos primero que instalar <em>rubygems </em>y<em> rubygems1.8</em>, pero Debian Lenny no trae la versión 1.3.1 que es la necesaria, por lo tanto acá es el único lugar donde vamos a hacer un poco de trampa, y vamos a instalar el paquete que podemos bajar desde la versión experimental <a href="http://packages.debian.org/experimental/all/rubygems/download">acá</a> y <a href="http://packages.debian.org/experimental/all/rubygems1.8/download">acá</a>.</p>
<p>¿Cómo instalar un paquete que no está en la distribución actual? Mi solución seguro no fue la mejor, pero anduvo! Lo que hago es vía Puppet envío el paquete al servidor en cuestión y después le digo que lo instale usando <em>dpkg</em>, de esta manera:</p>
<pre># Instalamos rubygems 1.3.1 desde paquetes de experimental, ya que Lenny no lo tiene
# La versión 1.3.1 es necesaria para rails 2.3.x

class rubygems {
    file {
        "/usr/src/rubygems1.8_1.3.1-1_all.deb":
            source =&gt; "puppet://puppet.marketingsur.com/files/packages/rubygems1.8_1.3.1-1_all.deb",
            owner =&gt; root,
            group =&gt; root,
            mode =&gt; 0644;
        "/usr/src/rubygems_1.3.1-1_all.deb":
            source =&gt; "puppet://puppet.marketingsur.com/files/packages/rubygems_1.3.1-1_all.deb",
            owner =&gt; root,
            group =&gt; root,
            mode =&gt; 0644;
    }

    package {
        "ruby1.8":
            ensure =&gt; installed;
        "ruby1.8-dev":
            ensure =&gt; installed;
        "make":
            ensure =&gt; installed;
        "rubygems1.8_1.3.1":
            source =&gt; "/usr/src/rubygems1.8_1.3.1-1_all.deb",
            provider =&gt; dpkg,
            ensure =&gt; installed,
            require =&gt; File["/usr/src/rubygems1.8_1.3.1-1_all.deb"];
        "rubygems_1.3.1":
            source =&gt; "/usr/src/rubygems_1.3.1-1_all.deb",
            provider =&gt; dpkg,
            ensure =&gt; installed,
            require =&gt; [ Package["ruby1.8"], Package["rubygems1.8_1.3.1"],
                         File["/usr/src/rubygems_1.3.1-1_all.deb"] ];
    }
}</pre>
<p>Con esto ya puedo definir la clase que me va a mantener instalado rails desde gemas:</p>
<pre># Instalamos rails desde gems porque la versión Debian es muy vieja
class rails {

    include rubygems

    package {
        "rails":
            provider =&gt; gem,
            ensure =&gt; installed,
            require =&gt; Package["rubygems_1.3.1"];
    }
}</pre>
<p>Nótese la libertad que Puppet no provee al mantenerse independiente del sistema de paquetes, mediante la palabra clave <em>provider</em> puedo decirle que instale paquetes desde otras fuentes, permitiendonos seguir tratando a ese recurso como un paquete abstracto.</p>
<p>Hasta aquí tenemos entonces el lenguaje ruby 1.8 instalado, y rails 2.3.x listo para ser usado.</p>
<h2>Mongrel Cluster</h2>
<p>Mongrel es una biblioteca Ruby que se usa para armar servidores web, está diseñada para tener buena performance sirviendo contenido dinámico, pero no estático&#8230; es por eso que lo último se lo dejamos a Nginx, como explico más abajo.</p>
<p>Volviendo a mongrel, la distribución Debian tiene un paquete llamado mongrel-cluster que nos deja todo bastante listo para usar, con scripts de inicio y apagado de los clusters, por lo que el trabajo adicional que hay que hacer es relativamente poco.</p>
<p>Primero armamos una clase para instalar el software y mantener funcionando el servicio:</p>
<pre>class mongrel {
    include rails

    package {
        "mongrel-cluster":
            ensure =&gt; installed,
            require =&gt; Package["rails"];
    }

    service {
        "mongrel-cluster":
            ensure =&gt; running,
            enable =&gt; true,
            hasrestart =&gt; true,
            hasstatus =&gt; true,
            require =&gt; Package["mongrel-cluster"];
    }
}</pre>
<p>Luego escribimos la definición que va a permitir dar vida a varios clusters mongrel:</p>
<pre>define mongrel-cluster-app ( $ipaddr="127.0.0.1",
                             $appdir="",
                             $port=8000,
                             $servers=3) {
    $root = $appdir ? {
        "" =&gt; "/var/www/${name}",
        default =&gt; "${appdir}",
    }

    include mongrel

    file {
        "/etc/mongrel-cluster/sites-available/${name}.conf":
            owner =&gt; root,
            group =&gt; root,
            mode =&gt; 0644,
            content =&gt; template("mongrel/cluster-app.conf.erb"),
            require =&gt; Package["mongrel-cluster"],
            notify =&gt; Service["mongrel-cluster"];

        "/etc/mongrel-cluster/sites-enabled/${name}.conf":
            ensure =&gt; "/etc/mongrel-cluster/sites-available/${name}.conf",
            require =&gt; File["/etc/mongrel-cluster/sites-available/${name}.conf"],
            notify =&gt; Service["mongrel-cluster"];
    }
}</pre>
<p>Esto configura el cluster mongrel en cuestión, activándolo y escribiendo el archivo de configuración a partir del siguiente simple template:</p>
<pre>---
address: &lt;%= ipaddr %&gt;
log_file: log/mongrel.log
port: "&lt;%= port %&gt;"
cwd: &lt;%= root %&gt;/current
environment: production
pid_file: tmp/pids/mongrel.pid
servers: &lt;%= servers %&gt;</pre>
<p>Con esto, tenemos el software mongrel-cluster instalado, y el cluster específico que va a ejecutar nuestra aplicación configurado y corriendo, listo para atender los requerimientos de los usuarios cuando le lleguen a través de nginx.</p>
<h2>Nginx</h2>
<p>Primero vamos a empezar con el webserver, el que se encarga de atender a los requests de los usuarios. Éste es un proyecto Ruso que está ganando popularidad por su gran velocidad y poco consumo de memoria. Mi anterior favorito era lighttpd, pero he tenido varios problemas de uso de memoria, y por lo que vi el proyecto está bastante frenado.</p>
<p>Del lado de Puppet, primero defino una clase que mantiene instalado y corriendo el servidor nginx, nada del otro mundo:</p>
<pre>class nginx {
    package {
        "nginx":
            ensure =&gt; installed;
    }

    service {
        "nginx":
            ensure =&gt; running,
            enable =&gt; true,
            hasrestart =&gt; true,
            hasstatus =&gt; false,
            require =&gt; Package["nginx"];
    }
}</pre>
<p>Luego, tengo una definición que me permite generar varias configuraciones de sitios basados en nginx y mongrel:</p>
<pre>define nginx-railsapp ( $rootdir="",
                        $ipaddr="",
                        $port=80,
                        $mongrels=["127.0.0.1, 8000, 3"] ) {
    $root = $rootdir ? {
        "" =&gt; "/var/www/${name}",
        default =&gt; "${rootdir}",
    }
    $listen = $ipaddr ? {
        "" =&gt; "${port}",
        default =&gt; "${ipaddr}:${port}",
    }
    $upstream_name = "mongrel-${name}"

    include nginx

    file {
        "${root}":
            ensure =&gt; directory,
            owner =&gt; www-data,
            group =&gt; www-data,
            mode =&gt; 0755;
        "/etc/nginx/sites-available/${name}":
            content =&gt; template("nginx/railsapp.conf.erb"),
            owner =&gt; root,
            group =&gt; root,
            mode =&gt; 0644,
            require =&gt; Package["nginx"],
            notify =&gt; Service["nginx"];
        "/etc/nginx/sites-enabled/${name}":
            ensure =&gt; "/etc/nginx/sites-available/${name}",
            require =&gt; File["/etc/nginx/sites-available/${name}"],
            notify =&gt; Service["nginx"];
    }
}</pre>
<p>Esta definición acepta 4 parámetros: el directorio raíz donde va a estar la app, la dirección IP en la que va a atender el webserver, su puerto, y las instancias mongrel que van a darle vida a la aplicación. Noten que por defecto todos los parámetros tienen un valor configurado, por lo que son opcionales.</p>
<p>Otro detalle a tener en cuenta es el parámetro <em>mongrels</em>, se puede ver que es una lista de <em>strings</em>, esa string define una tupla de 3 valores separados por coma, el primero corresponde al IP donde los mongrels atienden, el segundo es el puerto inicial, y el tercer valor la cantidad de instancias.</p>
<p>La receta configura un par de directorios y además el archivo de configuración de la aplicación, que obtiene a partir de un template (railsapp.conf.erb) que incluyo acá abajo:</p>
<pre>###
# ATENCION: Archivo de configuración manejado por Puppet!
###

upstream &lt;%= upstream_name %&gt; {
    #fair;
&lt;% mongrels.each do |mongrel| -%&gt;
&lt;% mongrel_ip, mongrel_port, mongrel_qty = mongrel.gsub(' ', '').split(',') -%&gt;
&lt;% mongrel_qty.to_i.times do |n| -%&gt;
    server &lt;%= mongrel_ip %&gt;:&lt;%= mongrel_port.to_i + n %&gt;;
&lt;% end -%&gt;
&lt;% end -%&gt;
}

server {
    listen &lt;%= listen %&gt;;
    server_name &lt;%= name %&gt; www.&lt;%= name %&gt;;
    charset off;

    # this rewrites all the requests to the maintenance.html
    # page if it exists in the doc root. This is for capistrano’s
    # disable web task
    if (-f &lt;%= root %&gt;/system/maintenance.html) {
        rewrite ^(.*)$ /system/maintenance.html last;
        break;
    }

    location / {
        root &lt;%= root %&gt;/current;
        index index.html index.htm;
    }

    # / -&gt; first search for local index.html then go to &lt;%= upstream_name %&gt;
    location ~ ^/$ {
        if (-f /index.html) {
            rewrite (.*) /index.html last;
        }
        proxy_pass http://&lt;%= upstream_name %&gt;;
    }

    # rails caching: searching first for $action.html local pages
    location / {
        if (!-f $request_filename.html) {
            proxy_pass http://&lt;%= upstream_name %&gt;;
        }
        rewrite (.*) $1.html last;
    }

    # serve static files directly
    location ~ .html {
        root &lt;%= root %&gt;/current/public;
    }

    location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|mov)$ {
        root &lt;%= root %&gt;/current/public;
    }

    # resend everything else to &lt;%= upstream_name %&gt;
    location / {
        proxy_pass  http://&lt;%= upstream_name %&gt;;
        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
}</pre>
<p>Éste es un archivo de configuración que encontré <em>por ahi</em> y que lo adapté al formato de templates de ERB. Básicamente lo que hace es servir todo lo que sea contenido estático, y para lo dinámico (la aplicación web en si) hace de proxy ruteando los requests a el o los clusters mongrel que hayamos definido. Esto nos permitiría tener varios servidores atendiendo a la aplicación web, para repartir la carga.</p>
<h2>El toque final</h2>
<p>Luego de definir todos estos recursos, no nos queda más que usarlos. Ésto lo podemos hacer con una clase que defina la aplicación en cuestión, de la siguiente manera:</p>
<pre># midominio.com Web App (proxy balancer + backend)
class midominio-webapp {
    include rails
    include mongrel

    $mongrel_ipaddr = "127.0.0.1"
    $mongrel_port = 8000
    $mongrel_servers = 5

    $needed_gems = ["gema1", "gema2", "gema3"]

    nginx-railsapp {
        "midominio.com":
            ipaddr =&gt; "1.2.3.4",
            mongrels =&gt; ["${mongrel_ipaddr}, ${mongrel_port}, ${mongrel_servers}"];
    }
    mongrel-cluster-app {
        "midominio.com":
            ipaddr =&gt; "${mongrel_ipaddr}",
            port =&gt; "${mongrel_port}",
            servers =&gt; "${mongrel_servers}";
    }

    package {
        $needed_gems:
            provider =&gt; gem,
            ensure =&gt; installed,
            require =&gt; Package["rails"];
    }
}</pre>
<p>Luego esta clase la incluímos en el nodo que corresponda, y listo&#8230; al rato tenemos instalada la infraestructura para hostear nuestra aplicación web.</p>
<p>Espero se animen a usar Puppet si aún no lo han hecho. Su sintaxis no es de lo mas hermoso que puede existir, pero los beneficios que trae hacen ese tema algo insignificante.</p>
<p>En la segunda parte vamos a hablar de cómo automatizar la instalación de la aplicación en los servidores, usando <a href="http://www.capify.org/">Capistrano</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://lucas.di-pentima.com.ar/wordpress/2009/05/15/despliegue-de-aplicaciones-web-rails-con-puppet-y-capistrano-parte-i/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cerrando la puerta a los crackers</title>
		<link>http://lucas.di-pentima.com.ar/wordpress/2009/05/13/cerrando-la-puerta-a-los-crackers/</link>
		<comments>http://lucas.di-pentima.com.ar/wordpress/2009/05/13/cerrando-la-puerta-a-los-crackers/#comments</comments>
		<pubDate>Wed, 13 May 2009 20:24:44 +0000</pubDate>
		<dc:creator>Lucas Di Pentima</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[bot]]></category>
		<category><![CDATA[fail2ban]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://lucas.di-pentima.com.ar/wordpress/?p=255</guid>
		<description><![CDATA[No es noticia nueva que tener una computadora conectada a Internet la deja expuesta a una serie de riesgos de seguridad, y es por eso que los administradores de sistemas, normalmente tomamos una serie de medidas básicas preventivas para evitar un disgusto posterior. Si bien mis servidores normalmente tienen un nivel de seguridad más que [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-256" title="cyber-criminal" src="http://lucas.di-pentima.com.ar/wordpress/wp-content/uploads/2009/05/cyber-criminal.jpg" alt="cyber-criminal" width="600" height="400" /></p>
<p>No es noticia nueva que tener una computadora conectada a Internet la deja expuesta a una serie de riesgos de seguridad, y es por eso que los administradores de sistemas, normalmente tomamos una serie de medidas básicas preventivas para evitar un disgusto posterior.</p>
<p>Si bien mis servidores normalmente tienen un nivel de seguridad más que aceptable, los molestos <em>bots</em> de estas personas no dejan de intentar adivinar las claves de mis cuentas para poder acceder con privilegios de administrador a los servidores. Esto me causa un problema, pero no de seguridad, sino que me ocupan los recursos que tengo para otras cosas y a veces hasta producen enlentecimientos notables en los servidores virtuales mas pequeños.</p>
<p>Es por esto que me puse manos a la obra, a averiguar alguna manera de mantener a raya a estos muchachos, y lo que me encontré fue con un software pensado justamente para esto: <a href="http://www.fail2ban.org/">fail2ban</a>.</p>
<p>Este programa está ya listo para ser instalado y usado en mi <a href="http://www.debian.org">distribución favorita (Debian GNU/Linux)</a>, y al instalarse comienza a chequear los accesos fallidos de conexión por SSH, dejando 6 intentos y prohibiendo el acceso por IP por 10 minutos. Para prohibir el acceso utiliza reglas de iptables, y su funcionamiento es en modo <em>daemon</em>, un pequeño programa queda corriendo (muy chiquito, sirve hasta en VPS de 256 MB de RAM) revisando los distintos archivos de registros de sistema.</p>
<p>Lo interesante además es que trae una serie de plantillas para poder chequear otros tipos de servicios como FTP, SMTP, Web, etc. todo esto mediante reglas de análisis y acciones acordes, que se pueden personalizar para un uso específico.</p>
<p>En resumen, una muy simpática herramienta para los administradores de sistemas GNU/Linux, fácil de instalar y poner a funcionar, y el beneficio es enorme.</p>
<p>¡Que la disfruten!</p>
]]></content:encoded>
			<wfw:commentRss>http://lucas.di-pentima.com.ar/wordpress/2009/05/13/cerrando-la-puerta-a-los-crackers/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>¿Cómo seleccionar el browser web por defecto en Debian?</title>
		<link>http://lucas.di-pentima.com.ar/wordpress/2007/12/03/%c2%bfcomo-seleccionar-el-browser-web-por-defecto-en-debian/</link>
		<comments>http://lucas.di-pentima.com.ar/wordpress/2007/12/03/%c2%bfcomo-seleccionar-el-browser-web-por-defecto-en-debian/#comments</comments>
		<pubDate>Mon, 03 Dec 2007 15:55:35 +0000</pubDate>
		<dc:creator>Lucas Di Pentima</dc:creator>
				<category><![CDATA[GNOME]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[thunderbird]]></category>

		<guid isPermaLink="false">http://lucas.di-pentima.com.ar/wordpress/2007/12/03/%c2%bfcomo-seleccionar-el-browser-web-por-defecto-en-debian</guid>
		<description><![CDATA[Te puede estar pasando que cuando haces click en algún enlace desde Thunderbird (ejem, Icedove&#8230;) en Debian, te cargue el navegador Epiphany por más que hayas configurado en &#8220;aplicaciones preferidas&#8221; que use Firefox (cof, Iceweasel&#8230;). Esto es porque Icedove no tiene en cuenta esas configuraciones de GNOME, mas bien hay que configurar a nivel sistema [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://lucas.di-pentima.com.ar/wordpress/wp-content/uploads/2007/10/tux-mago.jpg" alt="Tux Mago" align="left" />Te puede estar pasando que cuando haces click en algún enlace desde Thunderbird (ejem, Icedove&#8230;) en Debian, te cargue el navegador Epiphany por más que hayas configurado en &#8220;aplicaciones preferidas&#8221; que use Firefox (cof, Iceweasel&#8230;). Esto es porque Icedove no tiene en cuenta esas configuraciones de GNOME, mas bien hay que configurar a nivel sistema que Iceweasel sea el navegador web por defecto, ¿cómo hacemos esto?</p>
<p>En Debian  disfrutamos de una herramienta muy útil llamada &#8220;update-alternatives&#8221;, que nos permite configurar la aplicación favorita a partir de una lista de opciones. Como root nos logueamos y ejecutamos lo siguiente:</p>
<pre>computita:~# update-alternatives --config x-www-browser

Hay 2 alternativas que proveen `x-www-browser'.

  Selección     Alternativa
-----------------------------------------------
*+        1    /usr/bin/epiphany
          2    /usr/bin/iceweasel

Pulse &lt;Intro&gt; para mantener el valor por omisión [*] o pulse un número de selección:</pre>
<p>Seleccionamos la opción &#8220;2&#8243; y listo, mágicamente el icedove comienza a funcionar como debería: abriendo páginas en nuevas pestañas del iceweasel activo.</p>
]]></content:encoded>
			<wfw:commentRss>http://lucas.di-pentima.com.ar/wordpress/2007/12/03/%c2%bfcomo-seleccionar-el-browser-web-por-defecto-en-debian/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cómo comprobar la configuración de un servidor DNS</title>
		<link>http://lucas.di-pentima.com.ar/wordpress/2007/11/17/como-comprobar-la-configuracion-de-un-servidor-dns/</link>
		<comments>http://lucas.di-pentima.com.ar/wordpress/2007/11/17/como-comprobar-la-configuracion-de-un-servidor-dns/#comments</comments>
		<pubDate>Sat, 17 Nov 2007 18:35:34 +0000</pubDate>
		<dc:creator>Lucas Di Pentima</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[dns report]]></category>

		<guid isPermaLink="false">http://lucas.di-pentima.com.ar/wordpress/2007/11/17/como-comprobar-la-configuracion-de-un-servidor-dns</guid>
		<description><![CDATA[Internet funciona gracias a un servicio, el más importante de todos: DNS (Domain Name Service). DNS no es más que una base de datos jerárquica y distribuída que permite a personas de distintos puntos del globo aportar datos de tal manera que los servicios que todos conocemos, funcionen correctamente. Gracias al DNS los servidores de [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Internet" href="http://lucas.di-pentima.com.ar/wordpress/wp-content/uploads/2007/11/internet_map_1024.jpg"><img style="margin-left: 6px; margin-right: 6px;" src="http://lucas.di-pentima.com.ar/wordpress/wp-content/uploads/2007/11/internet_map_1024.thumbnail.jpg" alt="Internet" hspace="5" width="128" height="128" align="left" /></a>Internet funciona gracias a un servicio, el más importante de todos: <strong>DNS (Domain Name Service)</strong>.</p>
<p>DNS no es más que una base de datos jerárquica y distribuída que permite a personas de distintos puntos del globo aportar datos de tal manera que los servicios que todos conocemos, funcionen correctamente. Gracias al DNS los servidores de correo electrónico pueden intercambiar mensajes, los navegadores web pueden encontrar los servidores donde pedir las páginas, etc.<span id="more-168"></span></p>
<p>Los administradores de sistemas tenemos como tarea, la de configurar los servidores de nombres para que los datos de nuestros dominios sean correctamente publicados en Internet. Lo cierto es que muy pocos administradores de sistemas conocen realmente la manera correcta de configurar un servidor de nombres, y muchas veces caemos en errores que luego sufrimos por cortes de servicio de correos y otros similares.</p>
<p>Por suerte, en GNU/Linux contamos con varias herramientas que nos ayudan a corroborar que la configuración de un dominio está correcta, hoy voy a comentar <a href="http://www.zonecheck.fr/"><em>&#8220;zonecheck&#8221;</em></a> una herramienta que tiene la particularidad de no necesitar analizar un archivo de configuración, sino que hace las consultas a los servidores de nombres públicos en Internet.</p>
<p>Zonecheck <a href="http://packages.debian.org/zonecheck">viene en Debian</a>, así que para aquellos felices usuarios de esta maravillosa distribución de Linux, solo hace falta ejecutar &#8220;apt-get install zonecheck&#8221; y comenzar a utilizarlo. El comando posee muchas opciones y realmente es conveniente leer con detenimiento su páginal de manual, pero para aquellas personas ansiosas, acá les va un ejemplo:</p>
<pre>$ zonecheck -4 -q -vi,x,d fileextensionunknown.com
ZONE  : fileextensionunknown.com.
NS &lt;= : ns1.name.com. [4.79.81.159]
NS    : ns2.name.com. [38.97.225.164]
NS    : ns4.name.com. [38.97.225.165]
NS    : ns3.name.com. [4.79.81.160]

w&gt; The format of the serial number is not YYYYMMDDnn
 | Ref: RFC1912 (p.3)
 |   The recommended syntax is YYYYMMDDnn (YYYY=year, MM=month, DD=day,
 | nn=revision number).
 `----- -- -- - -  -
 :   The serial 1 doesn't seem to be in the YYYYMMDDnn format.
 `..... .. .. . .  .
=&gt; ns2.name.com./38.97.225.164
=&gt; ns4.name.com./38.97.225.165
=&gt; ns3.name.com./4.79.81.160
=&gt; ns1.name.com./4.79.81.159

w&gt; [TEST delegated domain is not an open relay]: No route to host - connect(2)
=&gt; generic

w&gt; [TEST can deliver email to 'postmaster']: No route to host - connect(2)
=&gt; generic

w&gt; [TEST domain of the hostmaster email is not an open relay]: No route to host - connect(2)
=&gt; generic

f&gt; [TEST can deliver email to hostmaster]: No route to host - connect(2)
=&gt; generic

==&gt; FAILURE (and 7 warning(s))</pre>
<p>Zonecheck realiza numerosas pruebas, y nos va diciendo cuales son advertencias, cuales son errores fatales y en algunas ocasiones, cómo solucionarlo.</p>
<p>Además, para aquellos administradores que no usen GNU/Linux, acabo de poner en línea una herramienta web que utiliza zonecheck de fondo, para poder acceder a esta ventaja aún estando en un Windows: <a href="http://dnsreport.cooltoolonline.com">Free DNS Report</a>. ¡Que la disfruten!</p>
]]></content:encoded>
			<wfw:commentRss>http://lucas.di-pentima.com.ar/wordpress/2007/11/17/como-comprobar-la-configuracion-de-un-servidor-dns/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Cannot bind: address already in use</title>
		<link>http://lucas.di-pentima.com.ar/wordpress/2007/11/05/cannot-bind-address-already-in-use/</link>
		<comments>http://lucas.di-pentima.com.ar/wordpress/2007/11/05/cannot-bind-address-already-in-use/#comments</comments>
		<pubDate>Mon, 05 Nov 2007 22:31:26 +0000</pubDate>
		<dc:creator>Lucas Di Pentima</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[fuser]]></category>
		<category><![CDATA[oneliner]]></category>

		<guid isPermaLink="false">http://lucas.di-pentima.com.ar/wordpress/2007/11/05/cannot-bind-address-already-in-use</guid>
		<description><![CDATA[Ya sea que estemos intentando iniciar algún servicio, o quizás desarrollando alguna aplicación de red, el mensaje del título tarde o temprano se nos presenta, a veces dejandonos dubitativos. El mensaje en cuestión significa que el proceso que acabamos de ejecutar intentó reservar algún puerto ya reservado por otro proceso, ¿pero cual será el usurpador [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://lucas.di-pentima.com.ar/wordpress/wp-content/uploads/2007/10/tux-mago.jpg" alt="Tux Mago" align="left" />Ya sea que estemos intentando iniciar algún servicio, o quizás desarrollando alguna aplicación de red, el mensaje del título tarde o temprano se nos presenta, a veces dejandonos dubitativos.</p>
<p>El mensaje en cuestión significa que el proceso que acabamos de ejecutar intentó reservar algún puerto ya reservado por otro proceso, ¿pero cual será el usurpador de puertos?</p>
<p>Por suerte, tenemos una manera de saberlo de forma fácil.<span id="more-165"></span></p>
<p>Gracias al comando <em>fuser</em>, podemos darnos cuenta muy fácilmente de cual es el número de proceso que nos da problemas. Supongamos que necesito saber qué proceso está ocupando ese puerto UDP número 53 que yo quiero usar para mi servidor de juegos de canasta por Internet, debería ejecutar como root:</p>
<pre># fuser 53/udp
53/udp:               2946</pre>
<p>Claramente vemos que el proceso cuyo número es 2946 es el que está estorbandonos.</p>
<p>Para no quedarnos fuera de la temática mágica de esta serie de artículos, combinemos este comando con un poco de otros ingredientes:</p>
<pre># ps ax | grep `fuser 53/udp`
53/udp:
 2946 ?        Ssl    0:02 /usr/sbin/named -u bind</pre>
<p>Bien, es el proceso del BIND. Como un servidor de DNS es algo no tan importante como un buen juego de canasta, si o si necesitamos eliminar ese proceso que nos molesta, la pócima final que nos salva de este problema es:</p>
<pre># kill `ps ax | grep $(fuser 53/udp) | awk '{print $1}'`</pre>
<p>He aqui una manera de divertirse matando procesos, existe otra <a href="http://www.cs.unm.edu/~dlchao/flake/doom/chi/chi.html">mucho más interesante</a>, pero como no es orientada a la línea de comandos, no la vamos a ver por el momento.</p>
<p>Como recomendación: dejemos los servidores de juego de canasta y otros servicios similares para los puertos mayores a 1024 <img src='http://lucas.di-pentima.com.ar/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://lucas.di-pentima.com.ar/wordpress/2007/11/05/cannot-bind-address-already-in-use/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cómo liberar espacio en disco</title>
		<link>http://lucas.di-pentima.com.ar/wordpress/2007/10/31/como-liberar-espacio-en-disco/</link>
		<comments>http://lucas.di-pentima.com.ar/wordpress/2007/10/31/como-liberar-espacio-en-disco/#comments</comments>
		<pubDate>Wed, 31 Oct 2007 23:17:27 +0000</pubDate>
		<dc:creator>Lucas Di Pentima</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[find command]]></category>
		<category><![CDATA[magia]]></category>
		<category><![CDATA[oneliner]]></category>

		<guid isPermaLink="false">http://lucas.di-pentima.com.ar/wordpress/2007/10/31/como-liberar-espacio-en-disco</guid>
		<description><![CDATA[El día de hoy comienzo una serie de artículos &#8220;de divulgación científica&#8221; para algunos, o &#8220;de magia negra&#8221;, para aquellos que no conozcan la flexibilidad que nos da la línea de comandos. Trataré de publicar usos prácticos de nuestro día a día en el uso de GNU/Linux como sistema operativo hogareño y por que no, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://lucas.di-pentima.com.ar/wordpress/wp-content/uploads/2007/10/tux-mago.jpg" alt="Tux Mago" align="left" />El día de hoy comienzo una serie de artículos <em>&#8220;de divulgación científica&#8221;</em> para algunos, o <em>&#8220;de magia negra&#8221;</em>, para aquellos que no conozcan la flexibilidad que nos da la línea de comandos. Trataré de publicar usos prácticos de nuestro día a día en el uso de GNU/Linux como sistema operativo hogareño y por que no, también de trabajo.</p>
<p>El caso concreto de hoy es el contínuo llenado de nuestro disco con archivos que desconocemos o que no recordamos: un buen día llega y vemos que nuestra partición de datos, que tiene más de 100 GB de capacidad, está al tope. ¿Cómo hacemos para liberar espacio?<span id="more-163"></span></p>
<p>Una de las formas posibles es la búsqueda de archivos &#8220;viejos&#8221;, que no usemos más y que realmente deberían ser parte de algún DVD juntando tierra en nuestra estantería en vez de ocupar nuestros preciosos bytes. Por suerte existe el comando find!</p>
<pre>$ find $HOME -type f -atime +365 | wc -l</pre>
<p>El número resultante es la cantidad de archivos que tenemos en nuestro directorio personal que no hemos accedido en el último año. ¿Y que puedo hacer para saber cuanto espacio me ocupan esos archivos?</p>
<pre>$ find $HOME -type f -atime +365 -exec ls -l {} \; | awk '{suma += $5} END {print suma}'</pre>
<p>Lo que nos devuelve este comando es la cantidad de bytes ocupados por los archivos que hace más de un año que no utilizamos. ¿Bueno, y que tal si quiero ver el <em>&#8220;top 10&#8243; </em>de archivos viejos más grandes?</p>
<pre>$ find $HOME -type f -atime +365 -exec ls -l {} \; | cut -d" " -f5,8- | sort -nr | head -n 10</pre>
<p>Finalmente con este comando que sigue, eliminamos cualquier archivo que no haya sido usado en los últimos 3 años:</p>
<pre>$ find $HOME -type f -atime +1095 -exec rm {} \;</pre>
<p>Esto es todo, ¡a limpiar esos discos! <img src='http://lucas.di-pentima.com.ar/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://lucas.di-pentima.com.ar/wordpress/2007/10/31/como-liberar-espacio-en-disco/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
