viernes, 23 de marzo de 2012

Apache redireccionar ciertas ip hacia https


Queremos que sólo ciertas ip tengan acceso a contenido con http, y las demás las queremos redirigir a https. ¿Cómo lo hacemos?.

Podemos usar mod_rewrite con estas reglas:

       RewriteEngine On
       RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.4$
       RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

En este caso, sólo la dirección 192.168.1.4 tendría acceso via http, los demás serían redireccionados a https.

Apache redirect some ip to https

We want to allow some ip to http an redirect the rest to https. How can we do it?

We can use mod_rewrite with these rules:

       RewriteEngine On
       RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.4$
       RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}


In this case only 192.168.1.4 gets access to http, other ips will be redirected to https.

jueves, 22 de marzo de 2012

Yet another apache ssl installation manual on debian ubuntu / Aún otro manual de instalación de apache ssl en debian ubuntu

Nunca había instalado apache con SSL en debian. El proceso es muy sencillo:

Activar el módulo ssl:
sudo a2enmod ssl

Crear el certificado; primero lo creamos y luego lo copiamos en el directorio por defecto:

$mkdir ssl
cd ssl
openssl genrsa -des3 -out server.key 1024
openssl rsa -in server.key -out server.key.insecure
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Nota: si no queremos que cada vez que arrancamos el servidor http nos pida la clave del certificado hacemos,

openssl rsa -in server.key -out server.key.nopass

Y ahora "instalamos" el certificado,

sudo cp server.crt /etc/ssl/certs
sudo cp server.key.nopass /etc/ssl/private

En nuestro fichero de configuración de apache tenemos que añadir algo parecido a esto:
virtualhost *:443
DocumentRoot /var/www/blahblah
SSLEngine on
SSLCertificateFile /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key.nopass

....

Ahora rearrancamos el servidor con sudo service apache2 restart, y ya tenemos soporte SSL. Naturalmente, como el certificado lo creamos nosotros, los navegadores nos avisarán de que no ha sido emitido por una entidad de confianza pero tendremos las comunicaciones con el servidor aseguradas por https.

domingo, 11 de marzo de 2012

Usar cliente Mysql python en windows

Si has intentado, sin éxito, instalar el módulo MySQLdb en windows tal vez te interese pasar por este sitio web y bajarte el instalador para windows en vez de tener que compilar las librerías en tu PC ;-)

jueves, 8 de marzo de 2012

Paso de parámetros a programas en python / How to pass parameters to a python program

Para pasar parámetros a los programas se usa el módulo getopt, que nos permite trabajar cómodamente con ellos.

En primer lugar tenemos que saber que el contenido de la línea de comandos nos viene en forma de lista en sys.argv.

Si invocamos un programa en python, como parámetros nos interesará todo lo que venga después de la primera posición, es decir sys.argv[1:], así que en general llamaremos a una función main así
if __name__=='__main__':
 main(sys.argv[1:])

Ahora veremos el funcionamiento de getopt, os paso un ejemplo:
def main(argv): 
 try:      
  opts, args = getopt.getopt(argv, "hps:", 
                                                  ["help", "prn", "server="])
 except getopt.GetoptError:          
  print "Opcion no valida"
  usage()                         
  sys.exit(2)                     
  
Vemos que getopt toma tres argumentos:

  1. El primero es la cadena que le pasamos para analizar
  2. El segundo son las opciones en forma corta, las que se usan con la sintaxis -h, -p, -s="algo"
  3. El tercero son las mismas opciones pero en forma larga que se usan con dos guiones --help, --prn, --server="algo"
Observamos que las opciones en forma corta seguidas de dos puntos o en forma larga seguidas del símbolo igual esperan que les pasemos un argumento. Getopt se encarga de que si al programa le pasamos alguna opción que no esté en la lista salte la excepción GetoptError.

Como ahora ya tenemos las opciones y sus posibles valores, el tratamiento será algo similar a esto
for opt, arg in opts:                
  if opt in ("-h", "--help"):      
   usage()                     
   sys.exit()                  
  elif opt in ('-p', "--prn"):                
   p_pantalla=True             
  elif opt in ("-s", "--server"):          
   r_server=arg            

Si hay algún tipo de error durante el parseado de los argumentos, es una buena idea dar una ayuda al usuario antes de terminar el programa, por ejemplo
def usage():
 print """
Opcions:
--help (-h)\t\tTreu aquesta ajuda
--prn (-p)\t\tTreu impressio de tickets per pantalla
--server (-s)\t\tServidor actualització
"""


Y esto es todo por hoy

miércoles, 7 de marzo de 2012

El cierre de library.nu o la quema de la biblioteca de Alejandría

El cierre por parte de un juez de Munich del sitio web library.nu a instancias de un grupo de 17 editoriales, está siendo comparada por algunos de los partidarios de la web con la quema de la biblioteca de Alejandría. 

library.nu era el sitio web de compartición de ebooks técnico-científicos más importante de Internet.

No voy a entrar una vez más en el cansino asunto de si los propietarios legales de los derechos de los textos (no necesariamente los autores) deben poder cerrar un sitio web donde un tercero ha colgado un link. Lo único que si parece probado es que la mayoría de las descargas provenían de países del tercer mundo y ese es el verdadero drama en todo esto.

No estamos hablando de un peliculasyonkis o de un seriespepito, estamos hablando del cierre de un sitio que compartía enlaces a libros de ciencia y tecnología que de ninguna otra manera van a ser accesibles por los habitantes de un tercer mundo hambriento de conocimiento, al que se le van a cortar más si cabe los recursos necesarios para progresar.

Pero es que además la industria editorial sigue sin darse cuenta de que los ricachones del primer mundo van a comprarse el libro en papel si este les es útil. Yo mismo he pedido varios libros en amazon de Estados Unidos que había encontrado y "hojeado" en library.nu. Si no fuera por este sitio nisiquiera tendría idea de su existencia puesto que no se distribuyen en España.

Creedme lectores cuando afirmo que si no se democratiza de alguna forma justa el acceso al conocimiento, e Internet parece el medio idóneo para hacerlo, vamos a observar el aumento de las injusticias en el mundo.

Os dejo este link por si os es de utilidad.

Para leer más:

Artículo de Christopher Kelty, profesor de la U. de California, en Aljazeera: The disappearing virtual library. Donde afirma que "leer será tener una copia ilegal en el cerebro" y que "los bárbaros que pusieron la industria editorial de rodillas no eran otros que estudiantes de cada rincón del planeta".

Artículo del periódico Huffington Post anunciando el cierre: Library.nu, Book Downloading Site, Targeted In Injunctions Requested By 17 Publishers.

lunes, 5 de marzo de 2012

Acceso remoto a servidor Mysql

Para acceder remotamente a un servidor Mysql lo mejor es usar ssh y hacerlo en local desde la shell pero en los casos en que tengamos que conectar necesariamente desde otro host lo podemos hacer de la siguiente forma:

1.- Editamos (/etc/mysql/my.cnf en Debian, /etc/my.cnf en CentOS) y ponemos la bind-address como la IP del propio servidor. Reiniciar el servicio mysql. Esto hará que escuche en el puerto 3306 del propio servidor en vez de sólo el bucle local localhost.

bind-address = ip_servidor

Si está presente la directiva skip-networking hay que comentarla

2.- Crear un usuario remoto. Entar en mysql y hacer

GRANT ALL ON nombre_db.* TO 'usuario'@'ip-usuario' IDENTIFIED BY 'password';

O si queremos otorgar acceso remoto a root:


GRANT ALL PRIVILEGES on *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;


3.- Abrir el puerto 3306 con iptables,
#iptables -A INPUT -i eth0 -s ip_remota -p tcp --destination-port 3306 -j ACCEPT
#service iptables save
O bien, si usamos ufw,
sudo ufw allow proto tcp from ip/mascara to any port 3306

domingo, 4 de marzo de 2012

El ATV3 Edoardo Amaldi, preparado para partir

El Automated Transfer Vehicle 3 (ATV3) "Edoardo Amaldi" está preparado para partir hacia la ISS el día 23 de marzo de 2012 a las 04:31 GMT.

La nave es un cargero espacial de 20 T, con 6.6 T de carga útil que es capaz de navegar por si sola hasta la Espación Espacial Internacional (ISS) y amarrar automáticamente con una precisión inferior a seis centímetros.

El astronauta europeo André Kuipers será el encargado de supervisar la maniobra de atraque.

Siguiendo la estela de sus predecesores, el cargero suministrará a los tripulantes combustible, comida, agua, oxígeno. También se incluye un sistema que recicla la orina en agua potable.

La retirada del transbordador espacial por la NASA ha obligado a la ESA a disponer los procesos de  fabricación de manera que se consiga una cadencia de un cargero al año. Esto es necesario ya que en este momento sólo los ATV y los japoneses HTV están capacitados para llevar grandes cargas hasta la ISS. Junto a las Progress rusas, también pueden aumentar la órbita de la Estación así como hacerla maniobrar en caso de peligro de choque con basura espacial. En estos momentos ya se está trabajando en el ATV4 "Albert Einstein".

El Edoardo Amaldi (bautizado así por el gran físico italiano) será lanzado por un Arianne 5 desde el espaciopuerto de la ESA en la Guayana Francesa. Será la carga más pesada lanzada en toda la larga história del lanzador. Después de 171 días de misión, el ATV3 será desorbitado y se desintegrará en la atmósfera no sin antes haber sido cargado con toda la "basura" que ha ido generado la ISS desde la última visita de un cargero.


jueves, 1 de marzo de 2012

Con qué día empieza la semana en python? What's the first day of the week in python?

Venga, vamos a jugar un poco más con las fechas. ¿Con qué día empezó esta semana?.

d=datetime.date.today()
delta=datetime.timedelta(days=1)
fecha_inicio_semana=d-(delta*(d.isoweekday()-1))

Warning, for the the non-ISO calendars such as UK/USA: the function isoweekday assumes that the first day of the week is Monday.