Thinking on hiring me?

Please read

Fernando Guillén

a Freelance Web Developer

cabecera decorativa

software development as an artistic expression

Archive for the ‘linux’ Category

Sábado, Diciembre 27th, 2008

Shell: script para borrar todos los delete pendientes con GIT

Tengo la mala costumbre de borrar los ficheros desde mi editor de texto así que cuando vuelvo a consola y hago un ‘git status‘ me salen un montón de ficheros borrados y no encuentro el comando de ‘git‘ para decirle: cárgatelos todos en el próximo commit.

Así que me he hecho este script para decirle exactamente eso:

$ git rm `git status | grep "deleted" | cut -f 2 -d ":" | cut -d " " -f 5`

Cuidadín con él eh :).. a ver si no va a estar bien..

Actualización: como dice Juanma en los comentarios podemos hacerlo mucho más elegantemente con:

git add -u
Jueves, Septiembre 18th, 2008

Port Forwarding: accediendo a las máquinas de una intranet desde una sóla máquina pública.

Las redes de los clientes son celosas y normalmente sólo se puede acceder a las máquinas de su red desde dentro de la red misma. Lo que viene a llamarse una intranet.

Pero muchas de mis tareas de mantenimiento requieren acceso a varias máquinas de una intranet y desplazarme al cliente no lo veo una opción factible ni acorde con nuestros tiempos.

Una de las soluciones que más me ha gustado es pedirle al cliente un sólo acceso, una sola máquina con IP pública.

Para dar seguridad se puede configurar para que sólo se pueda acceder desde la IP estática de tu oficina, y, para ofrecer flexibilidad, que también se pueda acceder desde la IP estática de tu servidor en un datacenter. Pero bueno todo este párrafo te lo puedes saltar si no hay mucho inconveniente con la seguridad.

La máquina con la IP pública mola que sea linux, más que nada porque si no lo es ya no hace falta que sigas leyendo pues el resto del artículo sobreentiende esta premisa.

Lo que vamos a hacer es lo que se ve en la ilustración.

port forwarding

Aquí me ves a mí con más pelo y sin barba deseando acceder a todos los servicios de las máquinas de la intranet 10.10.10.* y sin embargo sólo pudiendo acceder a la máquina con la IP pública 205.205.205.205.

Lo que necesito tiene un nombre y este es Port Forwarding, y la implementación de esto más sencilla que he visto se hace mediante IP Tables.

Va a ser más rápido escribir los comandos que hay que ejecutar para que esto funcione que toda la charla previa que te he contado.

Mi máquina con acceso público tiene la distribución de linux Gentoo así que los ejemplos son para esta distro pero no deberían variar mucho para otras distros.

Instalamos iptables (si no está ya)

# emerge iptables

Le decimos al kernel que permita ip-forwarding

# echo 1 > /proc/sys/net/ipv4/ip_forward

Flasheamos toda la configuración de iptables que haya por defecto

# iptables -F
# iptables -t nat -F

Permitimos el forward desde iptables (eth0 es la interface pública)

# iptables -A FORWARD -i eth0 -j ACCEPT
# iptables -A FORWARD -o eth0 -j ACCEPT

Esto hace que las ips se enmascaren para no liar a los routes y saltarse posibles filtros de seguridad por IP

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Y aquí por fín las reglas del Port Forwarding

# iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 213306 -j DNAT --to-destination 10.10.10.21:3306
# iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 2180 -j DNAT --to-destination 10.10.10.21:80
# iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 2280 -j DNAT --to-destination 10.10.10.22:80
# iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 2221 -j DNAT --to-destination 10.10.10.22:21
# iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 2322 -j DNAT --to-destination 10.10.10.23:22

Guardamos la configuración de iptables actual para que no haya que reescribirla al reiniciar

# /etc/init.d/iptables save

Ponemos el servicio de iptables para que arranque al inicio

# rc-update add iptables default

Creo que esto también hay que hacerlo

# vim /etc/sysctl.conf

Añadir/descomentar las siguientes líneas:

net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1

Y ya debería funcionar. Si me voy a mi máquina en mi oficina y accedo a:

$ mysql -h205.205.205.205 -P 213306

Me encontraré con la mysql de la máquina 10.10.10.21.

Si accedo con un navegador a:

http://205.205.205.205:2280

Me encuentro con el Apache de la máquina 10.10.10.22.

Si no te funciona revisa la linkografía:

Viernes, Mayo 23rd, 2008

FireFox comiendo memoria

Y aquí tenemos esta simpática criatureja en su hábitat salvaje dispuesta a saquear todos los recursos del entorno, sin prestar atención a las necesidades de los individuos de las demás especies.

Observémosla detenidamente, esperemos que no se percate de nuestra presencia.

firefox 900 megas de ram

¿Puede querer más?… Sí, sí que puede:

firefox 1,2 gigas de ram

Viernes, Mayo 23rd, 2008

¡Dios mio qué he hecho!

Me alejo un poco de la caja de cartón marrón para tomar aire e intentar salir del embobamiento hipnótico.

Ya son más de 5 años de relación amor odio con escritorios Linux, una relación que me ha endurecido enormemente y de la que tengo un recuerdo entre el orgullo de guerrero y cabreo de caprichoso. Quizás sea esa parte mía caprichosa y mal criada la que se ha hecho fuerte últimamente, esos deseos impulsivos de ¡lo quiero y lo quiero ahora! que hacen que me entren cabreos y rabietas al verme marginado una y otra vez por el propio hardware de mi ordenador.

Hoy es ‘un antes y un después’, hoy abandono ligeramente una comunidad que tanto me ha dado… o de la que tanto he cogido (como dijo alguien).

No sé que será lo que más eche de menos, seguramente sea el pertenecer, de una manera consecuente, a una comunidad tan revolucionaria y hermosa como es la del open source, aunque sé que no me estoy separando del todo pues sus tentáculos llegan también al mundo Mac y en mis servidores seguiré administrando distribuciones Linux.

Lo que tengo claro es lo que no añoraré: las peleas continuas con el hardware y la experiencia de usuario con los sistemas de escritorio. La resignación de que la impresora no imprima a dos caras, las tardes perdidas intentando activar el micro, la lucha a muerta con el X11 y el dualhead, la tosquedad de la wifi, en definitiva el uso agotador de energía que requiere dirigir esta gran orquesta de poderosos y cabezotas componentes.

Esta declaración no la debes tener en cuenta a la hora de decidirte a instalar Linux en tu escritorio, distribuciones como Ubuntu son perfectamente válidas en la mayoría de los casos y sin ninguna duda una alternativa mucho menos problemática que Windows. Sólo te diría que te abstuvieras de instalar Linux si el uso de tu ordenador va a ser para jugar o para diseño gráfico profesional, aunque estos casos se puedan satisfacer con una buena combinación de Linux+Wine ya empiezan a requerir de configuraciones medianamente tediosas.

En definitiva, mi querido confidente, me he pasado a Mac.

Algo curioso está ocurriendo en mi todavía querido Ubuntu sobre el que escribo estas líneas, creo que se ha cabreado, según escribía este post se me ha bloqueado varias veces el Firefox, lo cual no es raro pues es la versión Beta de la 3.0, pero había algo raro, como demasiado empeño en no volver a arrancar, temiendo una pérdida de todo lo escrito he continuado en el gedit y, ahora sí que sorprendiéndome, también se me ha colgado al intentar grabar. Aún no estoy seguro si el Ubuntu del servidor sobre el que corre el WordPress de este blog admitirá la publicación de este texto. ¿Tendrá mi nuevo Mac tanta personalidad?.

Buci, parece que estamos sincronizados :)

Actualizado un rato después:  ¿Esto es?… ¿ya está?, ¿esto es todo?, me siento como una quinceañera desvirgada por el guapo de clase.

Martes, Abril 29th, 2008

Conjuros de teclado.

En un rincón de los Mac modernos y más a la vista en los Linux de toda la vida existe un lugar donde se pueden realizar los llamados “conjuros de teclado”, este lugar es la consola, una estancia normalmente negra apta sólo para hechiceros.

En la consola nuestro ordenador es altamente vulnerable y también muy obediente, si somos conocedores de las claves podremos convencerle de hacer cosas que sería complicadísimo explicárselo con el ratón.

Por eso cuando veas a uno de estos hechiceros delante de una pantalla negra llena de letras ten por seguro que está preparando un “conjuro de teclado“.

Un buen libro de hechizos es el que está preparando la gente de shell-fu de los que ya te hablé no hace mucho.

Lunes, Abril 21st, 2008

El atajo shell del día.

Monitoreando un fichero y enviando alertas por email

Este script envía un email cada vez que aparece la palabra ‘now’ en el fichero stuff.

$ tail -f stuff | awk ' /now/ { system("mail -s \"Now Occured\"  mail@foo.com < msg") }'

Hay quién se anima el día leyendo la frase zen diaria en su calendario, o el consejo cristiano, o el chiste del pajares, son buenos recursos para comentar con los compañeros en la hora del café.

Y los hay quienes se activan con el comando o atajo shell del día.

[shell-fu]$, Recopilatorio de comandos y atajos shell.

Ya estás alimentando tu lector de feeds :)

Vía GenBeta.

Viernes, Abril 18th, 2008

Tomcat 5.5 nuevas features: no funciona nada.

¿Dónde demonios se ha metido todo? ¿El webapps? ¿El /manager? ¿El log? ¿Que demonios pasa con los VirtualHosts?

Todas estas preguntas que arrastro desde hace tiempo, desde que Tomcat 5.0 ya no está soportado en Ubuntu.

La 5.5 viene con un montón de features, la principal es que no funciona nada de lo que me funcionaba antes.

Alguna luz se me ha abierto.

Para que funcione el /manager hay que instalar:

$ sudo aptitude install tomcat5.5 tomcat5.5-admin tomcat5.5-webapps

Y lo encontrarás en:

http://localhost:8180/manager/html/

La seguridad como siempre nos juega una mala pasada y hay que mandarla a freir lechugas:

$ sudo vim /etc/default/tomcat5.5
TOMCAT5_SECURITY=no

El webapps se encuentra aquí:

/usr/share/tomcat5.5/webapps/

Este tutorial está bastante bien.

Actualizado 2008-05-14:

En Ubuntu 8.04 vuelve a fallar todo y aunque reinstale todo el tomcat no arranca

Solución: seguir este tutorial.

Si en el  /usr/share/tomcat5.5/logs/catalina.out te aparece algo así como esto:

java.lang.ClassNotFoundException: org.apache.catalina.startup.Bootstrap

Debes reinstalar libtomcat5.5-java:

 $ sudo aptitude reinstall libtomcat5.5-java

Suerte.. mucha suerte :)

Martes, Abril 8th, 2008

Poner una aplicación Rails en producción.

Esto no es un tutorial, es una nota mental.

Entorno
  • Ubuntu 7.10
  • MySql 5.0
Instalar capistrano

Tanto en cliente como en servidor.

$ gem install capistrano
Configurar aplicación rails para Capistrano

En cliente.

$ cd #{RAILS_ROOT}
$ capify .

Editar fichero /config/deploy.rb:

require 'mongrel_cluster/recipes'

set :user, "username"
set :runner, "username"

set :application, "miaplicacion"
set :repository,  "http://www.mirepositorio.com/svn/trunk/"
set :scm_username, "username"
set :scm_password, "userpass"

set :deploy_to, "/var/www/railsapps/#{application}"  # path en el servidor
set :mongrel_conf, "#{current_path}/config/mongrel_cluster.yml"  # no tocar

role :app, "miservidor.com"       # si quieres indicar puerto miservidor.com:puerto
role :web, "miservidor.com"       # si quieres indicar puerto miservidor.com:puerto
role :db,  "miservidor.com", :primary => true # si quieres indicar puerto miservidor.com:puerto

Tuve problemas con el username y el userpass y al final les puse el mismo username y pass al usuario del sistema como al usuario del svn.

Editar /config/mongrel_cluster.yml:

---
cwd: /var/www/railsapps/miaplicacion"  # path en el servidor
log_file: log/mongrel.log
port: "5000"
environment: production
address: 127.0.0.1
pid_file: tmp/pids/mongrel.pid
servers: 2      # puertos 5000 y 5001
Preparar servidor

En servidor.

Preparamos el directorio:

$ sudo mkdir -p /var/www/railsapps
$ sudo chown username /var/www/railsapps

Fichero configuración de VirtualHost /etc/apache/sites-available/miaplicacion.miservidor.com:

#we need this as on Ubuntu by default Proxy is not allowed
<Proxy *>
  Order allow,deny
  Allow from all
</Proxy>

#Proxy balancer section (create one for each ruby app cluster)
<Proxy balancer://miaplicacion.miservidor.com_cluster>
  BalancerMember http://127.0.0.1:5000
  BalancerMember http://127.0.0.1:5001
</Proxy>

#Virtual host section (create one for each ruby app you need to publish)
<VirtualHost *:80>
  ServerName miaplicacion.miservidor.com
  DocumentRoot /var/www/railsapps/miaplicacion/current/public/

  <Directory /var/www/railsapps/miaplicacion/current/public/ >
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    allow from all
  </Directory>

  ErrorLog /var/log/apache2/error_miaplicacion.miservidor.com_log
  CustomLog /var/log/apache2/access_miaplicacion.miservidor.com_log combined

  #Rewrite stuff
  RewriteEngine On

  # Check for maintenance file and redirect all requests
  RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
  RewriteCond %{SCRIPT_FILENAME} !maintenance.html
  RewriteRule ^.*$ /system/maintenance.html [L]

  # Rewrite index to check for static
  RewriteRule ^/$ /index.html [QSA]

  # Rewrite to check for Rails cached page
  RewriteRule ^([^.]+)$ $1.html [QSA]

  # Redirect all non-static requests to cluster
  RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
  RewriteRule ^/(.*)$ balancer://miaplicacion.miservidor.com_cluster%{REQUEST_URI} [P,QSA,L]
</VirtualHost>

Activamos el VirtualHost:

$ sudo a2ensite miaplicacion.miservidor.com

Recargamos Apache:

$ sudo /etc/init.d/apache reload
Subir primera versión a servidor

En cliente.

$ cap deploy:setup
Preparar BD en servidor

En servidor.

Esto seguro que se puede hacer desde Capistrano:

$ mysql> create database midatabase;
$ mysql> grant all privileges on midatabase.* to username@localhost identified by 'userpass';
$ rake db:migrate
Próximos despliegues

En cliente.

$ cap deploy

Y si hay migraciones entonces hay que ejecutarlas en el servidor (aunque seguro que se puede hacer con el Capistrano).

Viernes, Marzo 14th, 2008

Crear otro repositorio subversion.

Esto no es un How-To, es una nota mental.

Creando el repositorio

$ sudo svnadmin create  /home/svn/mirepositorio
$ sudo chown www-data.svn -R /home/svn/mirepositorio

Configuración del apache para el nuevo repositorio:

$ sudo vim /etc/apache2/mods-available/dav_svn.conf
<Location /svn/mirepositorio>
  DAV svn
  SVNPath /home/svn/mirepositorio
  AuthType Basic
  AuthName "mirepositorio's Subversion Repository"
  AuthUserFile /etc/apache2/htpasswd
  Require valid-user
</Location>

Añadimos un usuario:

$ sudo htpasswd -b /etc/apache2/htpasswd usuario clave

Recargamos apache:

$ sudo /etc/init.d/apache2 reload

Comprobamos:

navegador: http://fernandoguillen.info/svn/mirepositorio/
consola:  $ svn checkout http://fernandoguillen.info/svn/mirepositorio

Crear las carpetas iniciales:

$ svn mkdir http://fernandoguillen.info/svn/mirepositorio/trunk
$ svn mkdir http://fernandoguillen.info/svn/mirepositorio/branches
$ svn mkdir http://fernandoguillen.info/svn/mirepositorio/tags

Primer import:

$ svn import http://fernandoguillen.info/svn/mirepositorio/trunk

Mi sistema:

Ubuntu Gutsy Gibon 7.10
Subversion version 1.4.4
Apache 2
Jueves, Marzo 13th, 2008

Munin la bestia parda del monitoreo de servicios

Asistí a una de las aulas The Cocktail sobre Munin.

Me quedé impresionado, ahora mismo acabo de terminar de instalar y me ha costado 15 minuntos.

Es la gran bestia parda:

1) Apenas requiere configuración.

2) Permite sistema de nodos y master.

3) Monitorea cosas que nisiquiera entiendo como es capaz de monitorear.

4) Te autodetecta todo lo que tiene el servidor y se pone a monitorearlo todo sin que le tengas que explicar nada.

Increible, una joya.

a Freelance Web Developer is proudly powered by WordPress
Entries (RSS) and Comments (RSS).

Creative Commons License
Fernando Guillen's blog by Fernando Guillen is licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License.