30 noviembre 2007

Windows Vista contra Linux, guerra de escritorios...

Aunque alguna vez me he instalado beryl y he estado probando las ventanas en tres dimensiones, no las encuentro de demasiada utilidad, puesto casi siempre estoy con la consola, será cuestión de acostumbrarse a que en un futuro no muy lejano el escritorio se comporte así.

De todos modos he visto este video de cuatro minutos mostrando el escritorio de Windows Vista y el de Ubuntu Linux y me he aquedado asombrado, con Linux por supuesto.

Haz un regalo de Software Libre en Navidad

Si estás buscando el regalo perfecto si en la oficina teneis amigo invisible, la web LinuInsider sugiere hacer el regalo de software libre en Navidad.

Simplemente compra un lápiz USB e incluye algún software ligero en el lápiz, o si quieres ir más allá instala alguna distribución Linux en el lápiz.

Artículo completo
(en inglés)

Comenzando con triggers en zabbix

Cuando he utilizado zabbix en otras ocasiones, suele ocurrir que tengo más que suficiente con los triggers que tiene configurados en las plantillas.

Hoy he tenido que añadir un trigger para monitorizar un servidor web en un puerto diferente y he tenido algún problema más de lo esperado a la hora de configurar el item a monitorizar.

Como no entendía bien lo que estaba escrito sobre los simple checks en la documentación, estuve buscando por los foros.

Finalmente encontré un post que me lo clarificó un poco y en el formulario donde añadimos items (que yo vinculé al servidor que quería monitorizar) seleccioné el tipo de chequeo como simple check y el key que quería monitorizar como tcp.81.

Con el trigger no tuve mayor problema, puesto que la expresión que incluí {host:tcp,81.last(0)}=0, indica simplemente que si no hay acceso al servidor en el puerto 81 se active la alarma.

El estado normal del trigger es 0 (falso), y el estado de alarma es 1 (verdadero).

Voy a continuar ahora con las acciones, espero que esto no lleve demasiado tiempo.

Algo que nginx no puede hacer (aparentemente)

La verdad que no me he puesto a investigar en las listas de correo de nginx, ni rebuscado a fondo en la documentación, pero parece que hay algo que nginx no puede hacer.

Para ciertas peticiones web necesitamos que el servidor responda con el protocolo HTTP/1.0 y no HTTP/1.1 para que el Transfer-Encoding no sea chunked, el servidor hace esto porque comienza a escribir cabeceras antes de poder calcular el tamaño de lo que va a enviar, por eso indica que lo que está enviando está dividido. Es una explicación un poco simple, pero es para tener una cierta idea de por qué lo hacemos.

La explicación completa en inglés aquí.

Después de estar buscándo una solución encontramos cómo se puede hacer en apache de una manera simple.

Utilizamos la directiva BrowserMatch para detectar el navegador, (en nginx también se puede detectar el navegador por supuesto).

Una vez detectado el navegador aplicamos estas directivas:
nokeepalive downgrade-1.0 force-response-1.0


En realidad el nokeepalive no nos debería hacer falta, pero después de varias pruebas nos funcionó con esta configuración, ahora hay que ver por qué con otras configuraciones no funcionaba y para mi lo más importante, si en nginx tenemos manera de cambiar el protocolo a HTTP/1.0.

29 noviembre 2007

Ordenadores con Linux a 280 dólares

Realmente son un poco más caros; tienen ese precio si se compran con una suscripción de soporte que dura dos años a un coste de 15 dólares al mes.

Si no se quiere suscripción cuestan 480 dólares totalmente libres, que sigue siendo un precio barato.

La noticia completa (en inglés)

Hackers utilizan Sony PlayStation 3 para hackear contraseñas

Según leo en PCworld , los hackers (podríamos discutir si son hackers o crackers) utilizan la gran capacidad de cálculo de los procesadores de la PS3 para crackear contraseñas.

Comentan además que de los 10-15 millones de ciclo por segundo de la arquitectura Intel se ha pasado a los 1.400 billones de ciclos por segundo con la arquitectura de la PS3.

Interesante el artículo completo (en inglés)

Aleutia E, ordenador ecológico


Curioso este aparatito que como sistema operativo tiene una versión de Linux, y que funciona con energía solar. En la noticia dicen que lleva la pantalla incorporada, pero yo la verdad dándole vueltas a la foto no sé dónde la puede llevar.

Noticia original

Truco para salir al shell desde vim

¿Cuántas veces estamos editando un fichero con vim y queremos salir al shell, pero no perder la parte donde estamos editando, o bien evitar abrir otro shell?, pues bien, si estamo en el modo comando de vim es tan fácil como teclear :shell, y para volver al fichero que estamos editando tecleamos exit.

Microsoft sigue en el punto de mira en USA

En este interesante artículo en Slashdot, cuentan que los estados federales no las tienen todas con Microsoft y que van a mantener la vigilancia a Microsoft hasta 2012. También comentan que consideran que Google pese a que utiliza tecnología web se ve perjudicada al depender algunas cosas del sistema operativo.

28 noviembre 2007

Cómo instalar Nginx para sustituir a Apache, tercera parte

Primera parte, Segunda parte, Tercera parte, Cuarta parte


En esta tercera parte voy a incluir los ficheros que he escrito para levantar los servicios de nginx y FastCGI al arrancar el sistema en Red Hat o en CentOS.

Lo primero he incluido un fichero en /usr/bin llamado phpfcgi basado en la configuración que muestran en este howto.

El contenido del fichero es el siguiente:

spawn-fcgi -f /opt/php/bin/php-cgi -s /tmp/fcgi.sock -u apache -C 50 -P "/var/run/phpfcgi.pid"


En este fichero simplemente indicamos cómo arrancamos php-cgi, que se cree un socket de unix, con qué usuario deben correr las instancias, el número de instancias y el pid que se debe crear.

Después me he basado en el fichero de arranque de lighttpd, y convenientemente modificado he escrito estos dos ficheros, el primero es para el arranque de nginx, y el segundo para el arranque de FastcGI. Si nginx no está arrancado, el segundo no arranca

Este es el fichero para arrancar nginx:

#!/bin/sh
#
# nginx Startup script for the nginx server
#
# chkconfig: - 85 15
# description: Nginx fast webserver with light system requirements
#
# processname: nginx
# config: /user/local/nginx/conf/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/ngnix.pid
#
# Note: pidfile is assumed to be created
# by nginx (config: server.pid-file).
# If not, uncomment 'pidof' line.

# Source function library
. /etc/rc.d/init.d/functions

if [ -f /etc/sysconfig/nginx ]; then
. /etc/sysconfig/nginx
fi

if [ -z "$NGINX_CONF_PATH" ]; then
NGINX_CONF_PATH="/usr/local/nginx/conf/nginx.conf"
fi

prog="nginx"
nginx="/usr/local/nginx/sbin/nginx"
RETVAL=0
RETVAL1=0

start() {
echo -n $"Starting $prog: "
daemon $nginx
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
return $RETVAL
}

stop() {
echo -n $"Stopping $prog: "
killproc $nginx
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
return $RETVAL
}

reload() {
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
return $RETVAL
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
condrestart)
if [ -f /var/lock/subsys/$prog ]; then
stop
start
fi
;;
reload)
reload
;;
status)
status $nginx
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|reload|status}"
RETVAL=1
esac

exit $RETVAL




Y para FastCGI:

#!/bin/sh
#
# fastcgi Startup script for the fastcgi server
#
# chkconfig: - 87 15
# description: start fastcgi
#
# processname: phpfcgi
# config: /etc/sysconfig/phpfcgi
# pidfile: /var/run/phpfcgi.pid
#
# Note: pidfile is assumed to be created
# by fastcgi (config: server.pid-file).
# If not, uncomment 'pidof' line.

# Source function library
. /etc/rc.d/init.d/functions

prog="phpfcgi"
phpfcgi="/usr/bin/phpfcgi"
RETVAL=0

[ -e /var/run/nginx.pid ] || exit 0

start() {

echo -n $"Starting $prog: "
daemon $phpfcgi
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
return $RETVAL
}

stop() {
echo -n $"Stopping $prog: "
killproc $phpfcgi
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
return $RETVAL
}


case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
condrestart)
if [ -f /var/lock/subsys/$prog ]; then
stop
start
fi
;;
reload)
stop
start
;;
status)
status $phpfcgi
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|reload|status}"
RETVAL=1
esac

exit $RETVAL


En fin, supongo que podría darle más vueltas, pero estos dos funcionan, ahora simplemente hay que añadirlos al arranque con chkinstall y cuidar de que no se arranque apache también.

Primera parte, Segunda parte, Tercera parte, Cuarta parte

Advertencia sobre comandos peligrosos en los foros de Ubuntu

Interesante advertencia en los foros de Ubuntu sobre comandos que están proliferando en estos foros y que pueden ser peligrosos y dañar el sistema.

Tengamos el sistema que tengamos instalado no está mal tenerlos en cuenta.

Este es el post

Los problemas con Hotmail, II

Realmente desesperante, ayer me pasé varias horas "luchando" contra hotmail.
Conseguí incluir mis servidores en listas blancas, comprobé que no estaban en listas negras, comprobé que los registros spf estaban correctamente en DNS, ..., de todo y para nada. Hotmail sigue tragándose los correos que le envío desde algunos servidores.

No me envían un mensaje diciendo que ha sido rechazado por alguna razón, ni lo incluye en el buzón de correo no deseado, simplemente no llegan.

Lo curioso es que desde otro servidor enío correo escribiendo una dirección que no se corresponde con el dominio y llega como correo no deseado.

Me di de alta en un par de servicios de enví de mails que con la inscripción permiten una demo, y el mismo problema.

Comienzo a odiar a hotmail

Rastreo de dispositivos USB robados

Interesante noticia en Kriptopolis que nos cuenta cómo Mat Mullen ha conseguido recuperar su iPod robado mediante un software que detecta cuando se conecta a un ordenador.

Noticia completa

27 noviembre 2007

Curioso bug en la implementación de ext2/3/4 de Linux

Es curioso porque es un bug del sistema de archivos de Linux, pero no es un bug, es decir, se sabe de su existencia desde 2005, pero parece que no hay muchas ganas de corregirlo.

La noticia completa aquí.

Probando ScribeFire

Estoy probando ScribeFire, que es un addon para Firefox y la verdad parece bastante interesante. El interfaz de blogger está bastante bien, pero quizás la ventana es demasiado pequeña para mi gusto, y esto se parece más a un editor con la ventaja de que no hay que estar online para editar.

Desde luego muy recomendable su utilización.


Powered by ScribeFire.

Cómo instalar Nginx para sustituir a Apache, segunda parte

Primera parte, Segunda parte, Tercera parte, Cuarta parte

El fichero de configuración de nginx es bastante autoexplicativo aunque su sintaxis es más parecida a la de C que a la de apache, comenzando con la finalización de las lineas con punto y coma.

Si hemos realizado la instalación por defecto tendremos el fichero ubicado en el directorio /usr/local/nginx/conf , el fichero con el que vamos a trabajar es nginx.conf.

Tenemos que tener en cuenta cómo está estructurado el fichero de configuración de nginx: hay cuatro contextos (llamados main, server, upstream, y location) los cuales contienen directivas con uno o más argumentos. Las directivas en el contexto main se aplican a todo el fichero; las directivas en el contexto server se aplican a un host/puerto en particular; las directivas en el contexto upstream se aplican a un conjunto de hosts; las directivas en el contexto location se aplican al directorio web específico al que se refieran.

Aquí muestro el fichero de configuración que he preparado y a continuación paso a comentarlo:

user  apache;
worker_processes 4;

pid /var/run/nginx.pid;

events {
worker_connections 1024;
}


http {
include conf/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';


sendfile on;
keepalive_timeout 60;

gzip on;

server {
listen 81;
server_name www.dominio.com ;
access_log /var/log/nginx/dominio-access.log main;
error_log /var/log/nginx/dominio-error.log info;

location / {
root /var/www/html/dominioapp;
index index.php index.htm index.html;
error_page 404 /index.html;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

location ~ \.php$|\.htm$ {
fastcgi_pass unix:/tmp/fcgi.sock;
fastcgi_index index.htm;
fastcgi_param SCRIPT_FILENAME /var/www/html/dminio/app$fastcgi_script_name;
fastcgi_intercept_errors on;
include /usr/local/nginx/conf/fastcgi.conf;
}
}
}


En la primera parte del fichero nos podemos encontar algunas configuraciones genéricas del servidor independientemente de las configuraciones de los host:

user  apache;
worker_processes 4;

pid /var/run/nginx.pid;

events {
worker_connections 1024;
}



  • user es el usuario con el que queremos que corra nginx, en nuestro caso apache
  • worker_processes el número de hilos que queremos que abra nginx.
  • pid el pid que va a tener nuestro servidor
  • worker_connections el número de conexiones máximo que vamos a permitir que tengan los hilos.

A partir de aquí comienzan las configuraciones como servidor http, por eso mismo comienzan con la directiva http. Como podemos observar, en función de que parte se está configurando, vamos anidando las directivas entre llaves.

http {
include conf/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';


sendfile on;
keepalive_timeout 60;

gzip on;



  • include; esta directiva se puede poner en cualquier parte del fichero para incluir un fichero externo de configuración, en este caso incluimos los tipos mime.
  • default_type; es el tipo por defecto de dato.
  • log_format; es la directiva en la que configuramos el formato de log.
  • sendfile; qué utilizamos para proporcionar los ficheros que se solicitan.
  • keep_alive_timeout; el tiempo de vida de una conexión keepalive.
  • gzip; está activada la compresión de páginas

Con la directiva server ya se puede decir que comienza la definición de un host:

server {
listen 81;
server_name www.dominio.com ;
access_log /var/log/nginx/app.access.log main;
error_log /var/log/nginx/app-error.log info;

location / {
root /var/www/html/dominio/app;
index index.php index.htm index.html;
error_page 404 /index.html;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

location ~ \.php$|\.htm$ {
fastcgi_pass unix:/tmp/fcgi.sock;
fastcgi_index index.htm;
fastcgi_param SCRIPT_FILENAME /var/www/html/dominio/app$fastcgi_script_name;
fastcgi_intercept_errors on;
include /usr/local/nginx/conf/fastcgi.conf;
}
}

  • server; como decíamos, es el comienzo de la configuración del host virtual.
  • listen; el puerto donde va a escuchar el servidor, en este caso como estamos haciendo pruebas, tenemos escrito el 81.
  • server_name; nombre del servidor.
  • acess_log; dónde vamos a escribir el log de acceso.
  • error_log; dónde vamos a escribir el log de error.
  • root; directorio raíz del host.
  • index; qué ficheros van a parsearse como index.
  • error_page; a qué página redireccionamos cuando se produce el error indicado.
error_page soporta la redirección en función de si el error es un 404 o un 500, como está indicado en el fichero de configuración.

La configuración de FastCGI que tenemos ahí funciona correctamente. A continuación mostraremos el significado de todas las directivas:

  • location ~ \.php$|\.htm ; estamos indicando que las directivas de este contexto se aplicarán para los ficheros que termien en php o en htm.
  • fastcgi_pass; es la directiva que indica cómo nos conectaremos a FastCGI, en este caso utilizaremos un socket de unix.
  • fastcgi_index; si la petición se hace a una url finalizada con "/", se añadirá el nombre de fichero que indicamos aquí
  • fastcgi_param; asignamos parámetros que serán transferidos al servidor de FastCGI
  • fastcgi_intercept_errors; indicamos si transmitimos los errorers 4xx ó 5xx a nginx para que los gestione él.
Para no hacer más grande el fichero de configuración el resto de las directivas de FastCGI las incluimos en un fichero separado. En realidad son todos parámetros que son recomendables tener en la configuración.

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;

fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;

fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param REDIRECT_STATUS 200;

Los tres primeros son importantes si hacemos peticiones POST.
El último es necesario si hemos compilado php con la directiva "force redirect", aunque por la configuración que tenemos no nos es muy necesaria.

En las siguientes entregas veremos un poco el manejo de nginx, así como opciones de configuración con reescrituras.

Una referencia de nginx con FastCGI
(en inglés).

Primera parte, Segunda parte, Tercera parte, Cuarta parte

26 noviembre 2007

Windows para superordenadores consume menos RAM que Windows Vista

Como poco esta noticia es curiosa.

Yo utilicé Windows Vista un par de veces y me desesperé, y como en la oficina me dejaron instalar Linux pues lo tengo un poco olvidado.

Compilacion de php5 como cgi IV, SOLUCIONADO

Después de estar dándole muchas vueltas y de estar apunto de cambiar a lighttpd, y después de consultar el problema de php con Igor Sysoev, el desarrollador de nginx, descubrí finalmente el problema, y era una mezcla, me faltaban unos parámetros de FastCGI y además estaba haciendo la petición post, ahora me funciona perfectamente.


Entradas relacionadas:

25 noviembre 2007

Tuxinfo, nueva revista de sobre Linux en formato PDF

Desde Argentina surge una revista dedicada a Linux.

Aquí está el número uno.

Ataque directo contra Digg?

Parece ser que muchos usuarios descontentos con Digg están migrando hacia un rival llamado Mixx. Están descontentos con Digg y se están quejando públicamente. No deja de ser curioso los ataques entre webs de éxito.
Aquí hay información en inglés sobre este tema, y aquí en español.

23 noviembre 2007

El botón de "Voy a tener suerte" le puede estar costando a Google un montón de dinero

Curioso esta noticia que he leído en Slashdot. El famoso botón de "Voy a tener suerte" le puede estar costando a Google unos 110 millones de dólares por el 1% de gente que pulsando ahí se salta la publicidad.

¿Será verdad que prefieren dejar de ganar y no perder una de sus señas de identidad?

Artículo de Slashdot

Mysql con python (migración de UNB a phpBB)

Esta entrada está relacionada con ésta otra cómo migrar los usuarios de UNB forms a phpBB.

Para terminar con la migración del foro de UNB a phpBB aprovechamos para recordar cómo se puede acceder desde Pyhon a MySQL.

En nuestro caso el usuario solicitaba darse de alta, pero no utilizábamos el sistema del foro, por lo cual del usuario sólo sabíamos la dirección de correo electrónico.

Lo que tenemos que migrar es el nombre de usuario y la dirección de correo electrónico de registro, pero tenemos que hacer tres comprobaciones de datos que no existen en la base de datos nueva; la dirección de correo como nombre de usuario, la dirección de correo como dirección de email como email
registrado, el nombre de usuario como nombre de usuario.

Lo primero que hacemos es exportar los datos que necesitamos de la base de datos de UNB, para ello ejecutamos esta sentencia en MySQL:


mysql> SELECT  Name, RegEmail, Password  INTO outfile 'lista' FIELDS TERMINATED BY ';'from unb1_Users ;


Una vez que tenemos la lista de nombres la copiamos al directorio de trabajo donde tengamos el script migracion.py que es el script que vamos a utilizar para migrar los datos.

El script es el siguiente:

#!/usr/bin/env python

# importamos el modulo MySQLdb
import MySQLdb
# importamos el modulo string poder pasar a minusculas los strings
import string


# Definimos una funcion en la que definimos una consulta simple a la base de datos


def ConsultaSql(consulta, dato):
cursor.execute("SELECT "+consulta+" FROM phpbb_users WHERE "+consulta+"=\""+string.lower(dato)+"\"")
result=cursor.fetchone()
if (result):
return True
else:
return False

# Definimos la funcion en con la que relizaremos las inserciones pertinentes en la base de datos

def InsercionSql(nombre, correo, contras):
cursor.execute("SELECT user_id from phpbb_users")
numcolumnas=int(cursor.rowcount)
numid=int(numcolumnas)+1
print numid
cursor.execute("INSERT INTO phpbb_users(user_id, user_active, username, user_password, user_regdate, user_level, user_style, user_email) VALUES (%s,1,%s,%s,1194441299,0,8,%s)", (numid, nombre, contras, correo))
cursor.execute("INSERT INTO phpbb_user_group(group_id, user_id, user_pending) VALUES (5,%s,0)", (numid))
cursor.execute("INSERT INTO phpbb_user_group(group_id, user_id, user_pending) VALUES (6,%s,0)", (numid))


# Conexion a la base de datos
db = MySQLdb.connect(host="localhost", user="jose",passwd="pruebas",db="pruebas")

# Creamos un cursor
cursor=db.cursor()

# Abrimos el fichero donde tenemos los valores exportados de la base de datos
fichero=open("lista")

# Creamos una lista con las lineas del fichero
leerfichero=fichero.readlines()

# iteramos sobre la lista
for linea in leerfichero:
# Ponemos lo que extraemos en minusculas para tenerlo todo igual y suprimimos el salto de linea del final
# Ademas creamos una lista por linea que contiene los tres valores
lineasinfin=string.lower(linea.rstrip('\n')).split(";")

# Iteramos para ver que ninguno de los valores esta insertado en la base de datos, si no estan llamamos a la funcion de ejecucion
for elemento in lineasinfin:
if(ConsultaSql("user_email", elemento)):
break
elif (ConsultaSql("username", elemento)):
break
else:
InsercionSql(lineasinfin[0],lineasinfin[1],lineasinfin[2])



Para poder ejecutarlo necesitamos el módulo MySQLdb de Python que no viene por defecto en la distribución.

Vamos a explicar paso a paso el script:

 1 #!/usr/bin/env python
2
3 # importamos el modulo MySQLdb
4 import MySQLdb
5 # importamos el modulo string poder pasar a minusculas los strings
6 import string
7
8
9 # Definimos una funcion en la que definimos una consulta simple a la base de datos
10
11
12 def ConsultaSql(consulta, dato):
13 cursor.execute("SELECT "+consulta+" FROM phpbb_users WHERE "+consulta+"=\""+string.lower(dato)+"\"")
14 result=cursor.fetchone()
15 if (result):
16 return True
17 else:
18 return False



Obviamente en la primera línea llamamos al intérprete de Python y después en la línea 4 y 6 importamos los módulos que vamos a necesitar.

En la línea 12 definimos un función que va a necesitar que se le pasen dos valores. Esta función va a comprobar si el dato que hemos extraido del fichero está en la base de datos, en caso positivo devuelve verdadero, en caso negativo devuelve falso. La consulta la hemos realizado escapando las comillas para variable, en la siguiente función veremos que se puede incluir las variables en las sentencias SQL de la otra manera que permite Python.


 # Definimos la funcion en con la que relizaremos las inserciones pertinentes en la base de datos
21
22 def InsercionSql(nombre, correo, contras):
23 cursor.execute("SELECT user_id from phpbb_users")
24 numcolumnas=int(cursor.rowcount)
25 numid=int(numcolumnas)+1
26 print numid
27 cursor.execute("INSERT INTO phpbb_users(user_id, user_active, username, user_password, user_regdate, user_level, user_style, user_email) VALUES (%s,1,%s,% s,1194441299,0,8,%s)", (numid, nombre, contras, correo))
28 cursor.execute("INSERT INTO phpbb_user_group(group_id, user_id, user_pending) VALUES (5,%s,0)", (numid))
29 cursor.execute("INSERT INTO phpbb_user_group(group_id, user_id, user_pending) VALUES (6,%s,0)", (numid))



Definimos una función para insertar los datos necesarios. Una vez comparados los datos, insertamos los valores que necesitamos en los campos correspondientes. Aquí tenemos que pasar a la función los valores que vamos a insertar.

En la línea 24 contamos el número de columnas y luego en la 25 sumamos una, para poder poner el id correspondiente.
En la línea 27 podemos ver la otra manera de incluir las variables en las sentencias SQL, aunque tenemos que tener en cuenta una cosa, y es que aunque numid sea un entero, hay que llamarlo como si fuera un string, luego supongo que internamente se hace el cambio a la hora de insertar.


 # Conexion a la base de datos
33 db = MySQLdb.connect(host="localhost", user="jose", passwd= "pruebas" db="pruebas")
34 # creamos un cursor
35 cursor=db.cursor()
36
37 # Abrimos el fichero donde tenemos los valores exportados de la base de datos
38 fichero=open("lista")
39
40 # Creamos una lista con las lineas del fichero
41 leerfichero=fichero.readlines()



Creamos el cursor de MySQL, abrimos el fichero y metemos cada línea del fichero en una lista.

 # iteramos sobre  la lista
44 for linea in leerfichero:
45 # Ponemos lo que extraemos en minusculas para tenerlo todo igual y suprimimos el salto de linea del final
46 # Ademas creamos una lista por linea que contiene los tres valores
47 lineasinfin=string.lower(linea.rstrip('\n')).split(";")
48
49 # Iteramos para ver que ninguno de los valores esta insertado en la base de datos, si no estan llamamos a la funcion de ejecucion
50 for elemento in lineasinfin:
51 if(ConsultaSql("user_email", elemento)):
52 break
53 elif (ConsultaSql("username", elemento)):
54 break
55 else:
56 InsercionSql(lineasinfin[0],lineasinfin[1],lineasinfin[2])




Esta es la última parte, lo primero que hacemos es iterar sobre la lista para extraer cada línea.
Una vez extraida podemos ver en la línea 47 que ponemos todas los caracteres en minúscula, quitamos el fin de línea y creamos una nueva lista separando los datos que teníamos, pero eliminando el separador ";".

En la línea 50 volvemos a iterar, pero esta vez aplicamos las funciones con los datos obtenidos y de ese modo realizamos la inserción de datos.


Supongo que se puede hacer de otro modo, y seguramente más rápido, pero para mí ha sido una buena manera de familiarizarme un poco con el módulo MySQLdb.

22 noviembre 2007

Cómo saber qué versión de Red Hat o de CentOS tenemos instalada

Es muy fácil en ambas, si escribimos cat /etc/redhat-release nos mostrará la salida de la versión de Red Hat o de CentOS:

[jose@two jose]$ cat /etc/redhat-release
CentOS release 5 (Final)

Compilación de php5 como cgi, III, el problema era nginx

Otro día dándole a php y al array $_POST, otro día pensando que había algún error en php, y finalmente llegué a la determinación de que los problems venían de nginx.

Es un poco decepcionante porque realmente nginx me gusta mucho como servidor ligero para reemplazar a apache.

Otra vez comprobé que los formularios que tenía, a los que accedía a través de un dominio funcionaban; efectivamente era así y el array $_POST contenía datos.

El problema surgió cuando intentaba pasar datos por "POST" mediante un fichero html en el que tenía un formulario y que estaba ubicado en mi ordenador local.

La variable pasaba vacía; puse el mismo formulario en el servidor y comprobé que efectivamente también pasaba vacía.
La diferencia con respecto a una petición normal es que en lugar de hacer la petición a un nombre de dominio hacemos la petición a la dirección ip, con lo cual en el fichero de configuración de nginx en el primer host no configuramos nombre de dominio.
Si en lugar del contenido del fichero que tenía que ejecutarse escribía simplemente la función phpinfo() vi que efectivamente php sí que estaba funcionando, pero si volvía a poner el fichero original con "echos" para comprobar si había algo en el array, descubrí que $_POST viajaba vacía.

Instalé la última versión de lighttpd sin recompilar php, y efectivamente los formularios funcionaban como tenían que funcionar.

No me gusta demasiado lighttpd porque trata los errores 404 de una manera un poco especial, y o bien logueo todas las variables de debug de error, o bien no me escribe nada si simplemente tengo activado el debug 404.

Seguramente algo se me escapa y tendré que investigarlo

Voy a poner después este problema en el foro de nginx, no estoy seguro de que sea nginx propiamente o FastCGI, bueno, a ver si alguien me puede iluminar, mientras tanto trataré reemplazar las configuraciones de nginx con lighttpd.


Entradas relacionadas:

21 noviembre 2007

Compilación de php5 como cgi, II

Menudo día, esto parecía un culebrón. Tras descubrir el problema que tenía con las librerías GD, y después de estar medio día recompilando versiones de php y de nginx y "googleando" buscando gente que tuviera el mismo problema, no salía del atolladero y no sabía qué pasaba.

El problema era que tenía un formulario en html, y cuando hacía "submit" el array $_POST estaba vacío y no pasaba ningún dato.

Le estuve dando mil vueltas hasta que a última hora de la tarde, por probar algo, probé en borrar el directorio donde instalé php, /opt/php, y volver a compilar.

Funcionó. Más que contento me sentía un poco contrariado por todo el tiempo que perdí para que me funcionara php con nginx correctamente.

La línea de configuración que utilicé finalmente fue ésta:
./configure --prefix=/opt/php --enable-fastcgi --enable-sysvsem --enable-sysvshm --with-gd --with-freetype-dir=/usr/include/freetype2 --with-ttf  --with-jpeg-dir=/usr/lib --enable-gd-native-tt


Entradas relacionadas:

20 noviembre 2007

Compilación de php5 como cgi

Las veces que he instalado nginx como cgi necesitaba la librería gd para un pequeño captcha muy simple por eso no había tenido ningún problema.

Ayer después de hacer una pequeña guía y compilarlo para otro servidor, tuve varios problemas con el captcha que utilizamos.

Después de estar dándole vueltas, porque me decía que no incluía una función, en lugar de escribir la línea de compilación simple, tuve que añadir el directorio de freetype2 (el de freetype version 1 hacía que no se escribiera texto, comprobado) y también añadidos para que se compilara el soporte ttf.

Al final funcionó escribiendo esta línea en la configuración:
./configure --prefix=/opt/php --with-gd --enable-fastcgi --enable-sysvsem --enable-sysvshm --with-freetype-dir=/usr/include/freetype2 --with-ttf  --with-jpeg-dir=/usr/lib --enable-gd-native-ttf


Ahora estoy a vuelta con las sesiones que no sé si las estoy cogiendo bien...


Entradas relacionadas:

19 noviembre 2007

Cómo instalar Nginx para sustituir a Apache, primera parte

Primera parte, Segunda parte, Tercera parte, Cuarta parte

Hasta hace poco tiempo estábamos utilizando apache en todos nuestros servidores para servir páginas web. Nuestros servidores tienen un gran componente estático y un pequeño componente dinámico mediante php. El gran problema que nos planteaba apache es que nuestras páginas sirven varios cientos de miles de páginas diarias, y en momentos de gran tráfico las máquinas estaban al borde del bloqueo, debido a que los procesos de apache ocupan la misma cantidad de memoria independientemente de que la página servida sea estática o dinámica. Por esa misma razón no podíamos activar el keepalive de apache generándose un nuevo proceso con cada petición.

Buscando una solución encontramos varios servidores ligeros optimizados páginas estáticas que podían servir páginas dinámicas activando la extensión FastCGI.
Probamos lighttpd, cherokee y nginx. De todos ellos finalmente nos quedamos con enginex.

Aquí vamos a mostrar cómo instalar nginx con FastCGI en un servidor que no tiene conexión a base de datos, pero en el caso de necesitar conexión a base de datos la instalación es exactamente igual, simplemente hay que añadir en la compilación de php el flag "--with-mysql", (o lo que sea pertinente en el caso de utilizar otro sistema de bases de datos).

La instalación se hace en tres pasos, primero la instalación de php, segundo la instalación de nginx, y tercero la configuración y conectar nginx con php.

1.- Instalación de php

Decidimos compilar php para no interferir con la instalación que pudiera tener el sistema, de ese modo, si algo fuera mal, siempre podemos volver atrás, levantar apache y seguir funcionando como lo estuviéramos haciendo hasta estos momentos.

  • Descargamos la última versión de php en un directorio, en nuestro caso elegimos /usr/local/src:
root@one src]# wget "http://es2.php.net/get/php-5.2.5.tar.gz/from/this/mirror"


  • Descomprimimos, cambiamos el propietario del nuevo directorio al usuario sin privilegios que elijamos, hacemos su a ese usuario.
[root@one src]# tar xvfz php-5.2.5.tar.gz
[root@one src]# chown -R jose:jose php-5.2.5
[root@one src]# cd php-5.2.5
[root@one php-5.2.5]# su jose

  • Compilamos
[jose@one php-5.2.5]$ ./configure --prefix=/opt/php --with-gd --enable-fastcgi --enable-sysvsem --enable-sysvshm


--prefix es el directorio donde queremos que se instale.
--enable-fastcgi para que genere el fichero con soprote para fastcgi
--enable-sysvsem para que tenga las funciones de php deacceso a semáforos.
--enable-sysvshm para que tenga las funciones de php de acceso a la memoria compartida.
[jose@one php-5.2.5]$ make
[jose@one php-5.2.5]$ make test


Si el test sale correcto, o simplemente nos muestra algún pequeño bug de cosas que probablemente nosotros no vamos a utilizar podemos pasar a compilar.

[jose@one php-5.2.5]$ exit
[root@one php-5.2.5]# make install

(He hecho la misma instalación en un fichero en el que tenemos un captcha y no funcionaba, aquí la aclaración).

Ya tenemos el fichero instalado

2.- Instalación de nginx

  • Descargamos la última versión en un directorio, de nuevo elegimos /usr/local/src:
[root@one src]# wget http://sysoev.ru/nginx/nginx-0.5.33.tar.gz


  • Descomprimimos, cambiamos el propietario del nuevo directorio al usuario sin privilegios que elijamos, hacemos su a ese usuario.
[root@one src]# tar xvfz nginx-0.5.33.tar.gz
[root@one src]# chown -R jose:jose nginx-0.5.33
[root@one src]# cd nginx-0.5.33
[root@one src]# su jose


  • Compilamos
[jose@one nginx-0.5.33]$ ./configure --with-http_stub_status_module
[jose@one nginx-0.5.33]$ make
[jose@one nginx-0.5.33]$ exit
[root@blubbster nginx-0.5.33]# make install


El stub_status es un módulo para ver las visitas, keepalive, etc,... similar al status de apache aunque con menos funcionalidades.

No le hemos puesto parámetros de compilación de debug, ni hemos cambiado el prefix, por lo cual el directorio por defecto es /usr/local/nginx/ .

Aquí los directorios más importantes que tenemos son el directorio conf donde se situan los directorios de configuración y el directorio sbin donde está el binario de nginx. El fichero de configuración principal que tenemos es el nginx.conf.

3.- Conexión nginx con php mediante FastCGI


Hay dos maneras de activar el servidor fastcgi:
  • Ejecutar el servidor FastCGI que se ha compilado con php - este método no requiere de software de terceros.
  • Ejecutar PHP con software de terceros. Este método es más cómodo que el primero porque tiene más flexibilidad.
En nuestro caso hemos elegido el segundo método por que es más fácil levantar el servidor simplemente con un comando. Para ello necesitamos el programa spawn-fcgi de lighttpd, si no queremos complicarnos la vida basta con instalar el lighttpd en un directorio que no moleste. Lo único que vamos a utilizar de esta instalación es el spawn-fcgi.
De este modo ejecutamos la siguiente línea:

/usr/local/lighttpd/bin/spawn-fcgi -f /opt/php/bin/php-cgi -s /tmp/fcgi.sock -u apache -C 25



-f para indicar el binario de php compilado con soporte cgi
-s para indicar la conexión por sockets (también se puede conectar por ip)
-u para indicar el usuario que va a correr el servidor FastCGI
-C para indicar el número de instancias de FastCGI que vamos a abrir

Tenemos que editar el fichero de configuración de nginx y indicar cómo vamos a acceder a FastCGI.

En nuestro caso ésta es la configuración que tenemos:

location ~ \.php$|\.htm$ {
#fastcgi_pass localhost:10005;
fastcgi_pass unix:/tmp/nginx-fcgi;
fastcgi_index index.htm;
fastcgi_param SCRIPT_FILENAME /var/www/html/blubster.com$fastcgi_script_name;
fastcgi_intercept_errors on;
#include /usr/local/nginx/conf/fastcgi.conf;
}




Después de cambiar el fichero de configuración de nginx ya podríamos arrancar el servidor para ver qué todo funciona correctamente.
En otro post profundizaré un poco en la configuración y comandos de nginx

Primera parte, Segunda parte, Tercera parte, Cuarta parte

Obtener hash de md5 con google

En este enlace nos muestran cómo se puede tener un gran diccionario de contraseñas simplemente con tener conexión a internet y acceso a google. Da miedo.

16 noviembre 2007

Brasil calcula que podría ahorrar 540 millones de euros utilizando software libre

Una noticia muy interesante, ya que echa por tierra las teorías de las consultoras con informes sesgados dictados por microsoft.

Bueno, también habrá que saber si todo es software libre, o incluye software gratis, pero no libre.

A ver si va hacia adelante y les dan una lección a otros gobiernos.

Leer más

15 noviembre 2007

Los problemas con hotmail I

Llevamos unos días por no decir meses detectando problemas con los mails que enviamos a hotmail desde uno de nuestros servidores, desde que nos catalogara como spam, a que a veces no llegara el mensaje.

Finalmente lo hemos comprobado con un nuevo servidor. Estamos haciendo pruebas porque tenemos que enviar un mailing a 25.000 usuarios, mail arriba o abajo. Tengo mi cuenta de hotmail de toda la vida para hacer pruebas. Comencé a enviar correos a mi cuenta, a otra de yahoo, a otra de gmail, y a la de la oficina. Todas llegaban menos las de hotmail.

Miré los logs, y aparentemente todo era normal, los correos salían normal, pero a hotmail seguían sin llegar.

Con todo esto empecé a recurrir al amigo Google, que me mostró valiosos enlaces de gente que sufre el mismo problema.

Entre otras pistas que daban estaba la de cambiar los registros spf de las DNS, lo hice añadiendo más servidores, pese a que lo tenía bien. Luego tenía que enviar un correo senderid@microsoft.com con los dominios actualizados. Por fin y sin que valga de precedente me llegó un mensaje de soporte de microsoft:

Thank you for contacting Sender ID support. We are in the process of providing a more robust support experience for the Sender ID Framework program. You can reach the support and submission form by submitting your request at our website: http://support.msn.com/default.aspx?productKey=senderid&mkt=en-us.
This is now an unmonitored alias - please use the above website to submit your request.
Thank you -
The Sender ID Framework Support Team
Total, que he seguido las instrucciones, y de momento estoy a la espera. Desde luego todavía no entiendo cómo la gente sigue utilizando hotmail, habiendo alternativas muy buenas por ahí que tienen controlado el spam sin denegar dominios expresamente. En fin, cuando tenga contestación publicaré la segunda y espero que feliz parte.

14 noviembre 2007

Cambia el nombre de tu equipo sin reiniciar en Red Hat

Es simple, sólo tenemos que tocar dos ficheros.

Primero tenemos que editar /etc/sysconfig/network. Ahí escribimos el nombre del sistema que queramos.

Lo siguiente es cambiar el nombre en /etc/hosts.

El siguiente paso es reiniciar la red para ver si los cambios son visibles, pero si no podemos y necesitamos cambiar el nombre podemos utilizar el comando hostname para cambiar el nombre; este cambio será válido hasta que reiniciemos el equipo.

Juegos Libres para Linux

La gente dice de Linux que le faltan juego. En realidad hay juegos, no tanto como en Windows, pero sí que hay.
En Linux Journal tenemos un interesante artículo con algunos juegos.

Leer más...

13 noviembre 2007

Se libera Android, el SDK para móviles

Google ha liberado Android. En su página dicen "es abierto, todas las aplicaciones son iguales, tiene un desarrollo rápido y fácil"

También incluyen un vídeo



Technorati Profile

12 noviembre 2007

Discos duros fabricados en Taiwan con caballo de troya

Large-capacity hard disks often used by government agencies were found to contain Trojan horse viruses, Investigation Bureau officials warned
Se han encontrado caballos de troya en discos duros de gran capacidad utilizados generalmente por agencias gubernamentales.

http://www.taipeitimes.com/News/taiwan/archives/2007/11/11/2003387202

Buena web con información sobre Linux

Ésta es una buena página de información en inglés de linux, tanto para novatos como para expertos.

Tratamiento de Microsoft a los desertores de Google

Leo en slashdot un artículo bastante interesante sobre cómo trata Microsoft a la gente que piensa en irse a Google.

08 noviembre 2007

Máquina pequeña; con Linux por supuesto

Esta es una máquina muy interesante diseñada para correr GoogleApps. Por supuesto la máquina tiene linux.

Este es el link al artículo.

Cómo migrar los usuarios de UNB forums a phpbb

(English Version)
Si tienes un UNB forum instalado con cantidad de usuarios y quieres cambiar el sistema a phpbb, te encontrarás con que la contraseña no funciona debido al sistema kmd5 en UNB.

Encontré este problema con nuestros foros, y estuve trabajando en ello, y finalmente creo que funciona, pero necesito probarlo, y probarlo...

Estos son los pasos que seguí para hacerlo

1.- Cambié el tamaño de la columna password en la tabla phpbb_users ejecutando la siguiente sentencia SQL:

 ALTER TABLE phpbb_users MODIFY user_password varchar(32);

2.- Cambié al directorio raíz de phpbb y abrí el fichero login.php. Ahí incluí la función unbCheckUserPassword del fichero session.lib.php de UNB forums. En login.php llamé a la función checkUserPassword.

function checkUserPassword($hashed, $stored)
{
// update old hashes
if (strlen($stored) == 34)
{
$stored = '{kmd5}' . $stored;
}

// compare passwords based on used hash method
if (substr($stored, 0, 6) == '{kmd5}')
{
// input password must be an MD5 hash
$stored = substr($stored, 6); // remove identifier
#$key = substr($stored, 0, 2);
#return $key . strtolower(md5($key . $hashed)) == $stored;

// retrieve key
$key = substr($stored, 16, 2);
// build keyed hash
$hash1 = strtolower(md5($key . $hashed));
$hash2 = substr($hash1, 0, 16) . $key . substr($hash1, 16);
return $hash2 == $stored;
}
return false;
}

3.- En la línea 124 cambié la condición. Antes del cambio la condición era:

if( (md5($password) == $row['user_password'] && $row['user_active'])


Ahora la condición es (la escribí en una línea):

if( (md5($password) == $row['user_password'] && $row['user_active']) || (checkUserPassword(md5($password),$row['user_password ']) && $row['user_active']))



4.-Cambié al directorio includes, ahí abrí usercp_register.php. He vuelto a incluir la función userCheckPassword. Aproximadamente en la línea 395 cambiamos la condición. La condición antigua era:

if ( $row['user_password'] == md5($password) ]



Ahora la condición es:

if ( ( checkUserPassword(md5($cur_password),$row['user_password'])!=1) xor ($row['user_password'] == md5($cur_password)))



Es un poco raro, pero tenemos que utilizar XOR porque si ambas condiciones son verdad, no es cierto para nosotros. Lo probé de esta manera, y aparentemente funciona.

07 noviembre 2007

Eye os

Eyeos es una interesante iniciativa de unos programadores españoles. No es propiamente un sistema operativo, sino un entorno de escritorio, pero que corre sobre un entorno web.

Es interesante, porque haría indiferente en qué plataforma estamos trabajando, ya que el único requisito sería tener un navegador.

Algunas capturas de pantalla.

06 noviembre 2007

Plantilla Vim

Por no hacerme yo una hoja con las cosas que más utilizo de vim he estado buscando cheatsheets (plantillas) y he encontrado una que cumple con bastantes de mis expectativas

El enlace es éste: http://www.fprintf.net/vimCheatSheet.html

Aunque bien podría comprarme una taza como ésta:


El enlace original para comprar la taza es:
http://www.thinkgeek.com/homeoffice/mugs/7bbe/

Manejando la consola con atajos de teclado de vi

Por defecto la consola de linux tiene configurados los atajos de teclado de emacs. Para activar los atajos de teclado de vi simplemente hay que teclear set -o vi. Una vez lo tenemos hay que pulsar la tecla esc para utilizar el modo comando y la i para volver al bash

Si queremos volver a los de emacs simplemente tecleamos set -o emacs. Esto es muy útil para los negados como yo que somos incapaces de aprender emacs