Instalar WordPress con Python

Script para instalar WordPress con Python

Hace algún tiempo me hice un script en Python con el objetivo de tener una instalación del CMS WordPress en poco tiempo, el script está bastante verde y lo realicé en pocas horas con el objetivo de facilitarme la tarea de montar un website en un servidor.  Está escrito para funcionar en sistemas Debian. A lo largo de este post iré explicando las funciones que le he incluido y qué hace cada una de ellas, hay todavía muchas partes que se pueden añadir en este script como por ejemplo la creación del virtual host en Apache ( que no la tengo implementada ) o eliminar los archivos de configuración de ejemplo y el archivo readme de WordPress.

El script descarga la última versión de WordPress, necesita ser ejecutado en localhost, se conecta a la base de datos (en localhost) y la crea en función al nombre que hayamos introducido, una vez hecho esto descomprime la versión descargada, retoca el fichero de configuración y copia todo el contenido al directorio público (el directorio de destino lo creará en /var/www/nombre-que-hemos-introducido), por último elimina los ficheros temporales de instalación. Después de ejecutar el script sólo tenemos que crear nuestro host virtual en nuestro Apache y acceder a la url (el script devuelve la url con localhost, si necesitáis acceder desde vuestro dominio.com, tan sólo cambiad la dirección de localhost por la de vuestro dominio).

¿ Cómo descargamos y desempaquetamos WordPress con Python ?

Para ello he creado las funciones descargawp, status y extraertar, las dos primeras se encargan de la descarga mientras que la última función nos desempaqueta el fichero que hemos descargado, el funcionamiento de dichas funciones es bastante sencillo de comprender. La función descargawp no tiene ningún argumento de entrada, se limita a consultar la url y a lanzar urlretrieve para descargarnos el fichero, aquí os dejo la función de descarga:

def descargawp():
    #Aquí tenemos la url de descarga de la última versión de WordPress
    url = ("http://wordpress.org/latest.tar.gz")
    #En esta variable extraemos el nombre del fichero desde la variable url
    filename = url[url.rfind("/") + 1:]
    #El siguiente bucle comprueba que el nombre del fichero no esté vacío, lo usé para detectar errores encontrando el nombre del fichero...
    while not filename:
        filename = raw_input("====> No se ha podido obtener el nombre del "
                                "archivo.\nEspecifique uno: ")
    print ("====> Descargando %s..." % filename)
    #Usamos urlretrieve para descargar el archivo, como argumentos le pasamos la url, el nombre del fichero y el status, que es una función que se activará cuando recibamos un paquete de datos  a través de urlretrieve
    urlretrieve(url, filename, status)
    urlcleanup()
    print ("====> %s descargado correctamente." % filename)

En la función status tuve un pequeño problema: A la hora de imprimir por pantalla el porcentaje de descarga me di cuenta que mostraba tres veces el mismo porcentaje, debido a que en cada paquete refrescaba el estado, ¿Cómo controlamos esto? Muy sencillo, yo lo he hecho con una estructura condicional y un contador, en los bucles “if” pregunto si ha llegado a determinado porcentaje, de ser así lo almaceno en el contador y pregunto por el siguiente porcentaje, de esta forma no nos satura la pantalla con la descarga. Ahora os muestro el código de la función status:

def status(count, data_size, total_data):
    #almacenamos el porcentaje, mas abajo tengo comentadas las variables que use para calcularlo
    procent = int(count * data_size * 100 / total_data)
    #print count, file_size_dl, data_size, total_data
    #Defino una variable contador
    global con
    #Aquí comienza la estructura condicional
    if procent == 10:
        if con == 0:
            con = 1
            print "====> Descargando " + (str(procent) + "%")
    if procent == 27:
        if con == 1:
            con = 2
            print "====> Descargando " + (str(procent) + "%")
    if procent == 52:
        if con == 2:
            con = 3
            print "====> Descargando " + (str(procent) + "%")
    if procent == 76:
        if con == 3:
            con = 4
            print "====> Descargando " + (str(procent) + "%")
    if procent == 98:
        if con == 4:
            con = 5
            print "====> Descargando " + (str(procent) + "%")
    if procent == 100:
        if con == 5:
            con = 0
            print "====> ¡" + (str(procent) + "% Completado!")

Una vez hayamos conseguido descargar el fichero, debemos descomprimirlo y desempaquetarlo, en este caso viene comprimido en tar.gz, el cual podemos descomprimir directamente con las librerias “tar” de Python, aquí os dejo el código explicado:

def extraertar():
 print("====> Extrayendo...")
 # Abrimos el fichero que vamos a extraer
 tar = tarfile.open("latest.tar.gz")
 #Extraemos todo el contenido
 tar.extractall()
  #Por ultimo cerramos el fichero
 tar.close()
 print("====> Extraido")

Una vez extraído podemos trabajar ya con los ficheros de configuración de WordPress, buscar cadenas y reemplazarlas, eliminar ficheros inservibles…

En la segunda parte de este post veremos cómo buscar y reemplazar determinadas cadenas en un fichero, comprobar si el script se ejecuta con permisos de root y terminar de instalar WordPress con Python.