-->
Labs

Solución: Universal Share Downloader en GNU/Linux

Filed under labs
Tagged as , , , , , , ,

 

Imagino que todos conocen este bonito software que desarrolla un ruso que se hace llamar Dimoniusis, que encima tiene su web en ruso (que es comprensible, dado que es ruso el muchacho).

También muchos de ustedes deben conocer otros programas similares como el JDownloader o el Tucan. O a lo mejor incluso piensen que utilizar sitios de descarga directa es muy "leecher" y que sería más cómodo y noble usar eDonkey o BitTorrent.

Pero los cierto es que este programa es bien simple. Para ejecutar en GNU/Linux lo único que se necesita es Wine (el traductor del API de Microsoft Windows) y un sistema de ventanas como Xorg (en esta guía será XVFB, ya vamos a ver por qué).

El objetivo de esta guía es lograr un sistema base basado en Ubuntu Server 9.04 para ejecutar el USDownloader y administrarlo mediante su interfaz web.

Nota: Si bien esta guía se basa en la instalación de un sistema GNU/Linux como es Ubuntu Server, esto mismo podría funcionar para otros sistemas como BSD, OSX, y Solaris. Solo que la instalación de los paquetes, las configuraciones, y el cómo se ejecutan podría requerir que se haga de otra manera. No voy a responder comentarios pidiendo ayuda fuera de la plataforma explicada ya que no lo he probado.

Esta guía está basada en esta otra que encontré[1] replicada en muchos blogs. Lamentablemente no sé bien quién es el autor original.

Además veremos en detalle un script que implementé para iniciar y cerrar el programa facilmente desde la línea de comando  ya que no disponemos de la opción de cerrar en la interfaz web.

Y como anexo veremos cómo agregar una capa de seguridad extra a la interfaz web del USDownloader utilizando el web server Apache.

 

Instalar los paquetes necesarios

Lo primero que vamos a hacer es instalar los paquetes que necesitamos agregar a la instalación base de Ubuntu Server.

Nota: Está fuera del scope de esta guía explica la isntalación de Ubuntu Server. No voy a responder comentarios solicitando ayuda con eso. En Internet hay miles de tutoriales, guías, manuales, etc, que pueden encontrar facilmente con Google o el motor de búsqueda que más les guste.

Una vez dentro del equipo ejecutamos esto:

$ sudo apt-get install xvfb wine cabextract xfs xfonts-scalable xfonts-100dpi xfonts-75dpi xserver-xorg

Si les gusta más antes pueden hacer sudo su – para no tener que poner su password a cada rato (la mía es larga, y molesta jeje).

Bien ahora tenemos instalado todos los paquetes nativos necesarios.

Ahora tenemos que instalar algunas aplicaciones de Windows, ustilizando Wine.

 

Hacking Winetricks

Para facilitarnos la tarea de instalación, vamos a utilizar el script Winetricks.

Pero primero tenemos que hackear un poco el script para que los instaladores que vamos a ejecutar trabajen en modo silent o quiet. Recordemos que estamos trbajando en un ambiente donde no tenemos pantalla, y quiza ni siqueira mouse ni teclado.

Descargamos el script con wget o lo que más les guste:

$ wget  http://winezeug.googlecode.com/svn/trunk/winetricks

Ahora que lo tenemos en nuestro equipo, con nuestro editor favorito (en mi caso vim XD), comenzamos las modificaciones: Cambiar esta línea:

try $WINE "$WINETRICKS_CACHE"/vc6redistsetup_enu.exe "/T:`$WINE winepath -w "$WINETRICKS_TMP"`" /c $WINETRICKS_QUIET

por

try $WINE "$WINETRICKS_CACHE"/vc6redistsetup_enu.exe "/T:`$WINE winepath -w "$WINETRICKS_TMP"`" /c /Q

Cambiar esta línea:

$WINE "$WINETRICKS_CACHE"/vcredist.exe || true

por

$WINE "$WINETRICKS_CACHE"/vcredist.exe /Q || true

Cambiar esta línea:

try $WINE "$WINETRICKS_CACHE"/WindowsXP-Windows2000-Script56-KB917344-x86-enu.exe $WINETRICKS_QUIET

por

try $WINE "$WINETRICKS_CACHE"/WindowsXP-Windows2000-Script56-KB917344-x86-enu.exe /Q

Cambiar esta línea:

try $WINE "$WINETRICKS_CACHE"/mono-2.2-gtksharp-2.12.7-win32-5.exe

por

try $WINE "$WINETRICKS_CACHE"/mono-2.2-gtksharp-2.12.7-win32-5.exe /SP- /VERYSILENT /SUPPRESSMSGBOXES

Nota: Esta última línea no la probé (yo instalé mono en modo normal en un Ubuntu con escritorio gráfico) pero según este reporte de bug[2] debería funcionar.

 

Instalar Windows Scripting Host y Mono.net

Ahora vamos a usar Winetricks para instalar los runtimes de VBS y Mono.net (el runtime libre de .net). Mono.net es necesario para ejecutar el OCR del Captcha de Megaupload, anda muy bien aunque consume DEMASIADO CPU (ya veremos como manejar esto más delante).

$ ./winetricks -v wsh56 mono22

 

Instalar USDownloader

Bajamos el Universal Share Downloader del sitio de su autor (está en ruso):

http://www.dimonius.ru/dusd.php

Si tienen una PC con Windows a mano pueden instalarlo ahí y después simplemente copar el directorio de instalación al directorio ~/.wine/drive_c

 

Configurar Xorg

Bien antes hablamos de que no ibamos a usar una pantalla ni X, ni mouse, ni teclado, NADA, simplemente emular un entorno gráfico con xvfb. Bueno eso es cierto, sin embargo es necesario tener X.org instalado y un archivo xorg.conf. Lo generamos:

$ Xorg -configure

Bien, ya tenemos un archivo de configuración válido para xvfb…¡BIEN ya tenemos TODO instalado para arrancar!

 

Iniciar Xvfb

Ahora para darle a Wine y USDownloader un entorno gráfico donde ser felices :p iniciamos el xvfb:

$ /usr/bin/X11/Xvfb :10.10 -screen 10 800x600x16 -ac -br -kb -c -fbdir /var/tmp/ &

Esportamos la variable DYSPLAY para que las aplicaciones gráficas sepan a dónde dibujar las ventanas:

$ export DISPLAY=:10.10

Por las dudas verificamos que haya quedado bien:

$ echo $DISPLAY

Probamos si Xvfb está funcionando como debería. La mejor manera es iniciar alguna aplicación con Wine y si no da un critical error, listo, quedó joya. Si da algún error de fuentes o algo así no es problema, eso no molesta al USDownloader.

Para probar, por ejemplo ejecutamos notepad y lo mandamos al background:

$ wine notepad.exe &

Y chequeamos que efectivamente esté corriendo :p:

$ ps -C notepad.exe

Listo, si todo anduvo bien, estamos en condiciones de seguir, y si no…¡bueno así se aprende! XD

 

Iniciar USDownloader

Solo nos resta iniciar el USDownloader para probar que funcione (lo mandamos al background también para independizarlo de la terminal):

$ wine C:\\usd\\USDownloader.exe &

Verificamos que el proceso esté corriendo:

$ ps -C USDownloader.exe

Ahora solo tenemos que probar la interfaz web del USDownloader con nuestro browser preferido:

http://nuestro_server:8088

Nos fijamos cómo funciona, ponemos un par de links a descargar, y mientras miramos el log:

$ tail -f ~/.wine/drive_c/usd/USDownloader.log

Si todo camina y empieza a descargar los links que cargamos, entonces quedó todo funcionando.

¡Y listo, eso es todo!

 

Segurizar la intefaz web con Apache

Nota: De acá en adelante vamos a ver algo un poco más avanzado. Asumo que están familiarizados con Apache 2.X.

Instalar Apache y configurarlo para que funcione como una especia de proxy con ssl. Así evitamos exponer al USDownloader directamente a internet y sus peligros.

Instalamos Apache:

$ sudo apt-get install apache2

Instalamos OpenSSL:

$ sudo apt-get install openssl ssl-cert

Generamos un certificado:

$ sudo openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/apache.pem -keyout /etc/apache2/apache.pem

Cambiamos los permisos del certificado:

$ sudo chmod 600 /etc/apache2/apache.pem

Hacemos que Apache escuche en el puerto 443:

$ echo "Listen 443" >> /etc/apache2/ports.conf

Habilitamos los módulos:

$ sudo a2enmod ssl proxy_http proxy

Lo reiniciamos para que tome los cambios:

$ sudo /etc/init.d/apache2 restart

Probamos https://nuestroserver para verificar que funcione.

Configuramos un virtual host para que apunte al USDownloader con nuestro editor favorito y lo guardamos en /etc/apache2/sites-available:

NameVirtualHost *:443
<VirtualHost *:443>
    ServerName usd.nuestroserver.com
    SSLEngine On
    SSLCertificateKeyFile ssl/apache.pem
    SSLCertificateFile ssl/apache.pem
    ProxyRequests Off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyPass / http://nuestroserver:4080/
    ProxyPassReverse / http://nuestroserver/
    ErrorLog /var/log/apache2/error.log
    CustomLog /var/log/apache2/access.log common
</VirtualHost>

Habilitamos el viertual host que configuramos:

$ a2ensite nuestro_archivo

Reiniciamos nuevamente Apache para que tome los cambios (como les indicará el comando anterior cando termine).

$ /etc/init.d/apache2 reload

Y listo ya tenemos USDownloader funcionando y encima segurizado con SSL gracias a Apache.

 

Todavía hay más: Un script para levantar y bajar USDownloader

Nota: Acá vamos a ver detalles de un script de bash. Asumo que están familiarizados con shellscripting.
Necesitarán tener instalado el multiplexor de terminales screen. Viene por default en la mayoría de las distros modernas.

Bien ya tenemos nuestro USDownloader instalado y funcionando maravillosamente. Sin embargo siempre existe la necesidad de cerrarlo y de que se inicie solo al reiniciar nuestro equipo.
Bueno, para esto escribí un script que vamos a ver ahora:

#! /bin/bash

### BEGIN INIT INFO
# Provides:          Universal Share Downloader
# Required-Start:    $local_fs $remote_fs $network $named $time
# Required-Stop:     $local_fs $remote_fs $network $named $time
# Should-Start:      $syslog
# Should-Stop:       $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Starts The Universal Share Downloader unser Wine as a daemon
# Description:       Start The Universal Share Downloader, a download
#                    manager for unattended download of files from several
#                    web filesharing services as Megaupload or Rapidhare.
### END INIT INFO

set -e

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON="/usr/bin/wine C:\\\usd\\\USDownloader.exe"
NAME="USDownloader.exe (through wine)"
DESC="Universal Share Downloader as hybrid daemon"
USDPIDDIR=/var/run/usd
USDPID=$USDPIDDIR/usd.pid
DAEMON_USER=mldonkey
DAEMON_NAME=USDownloader.exe
WAITFORDAEMON=60
HACK=hack.txt
NICE="-15"
ARGS=""
XVFB=1

test -x $UPATH/$USD || exit 0

wait_for_deaddaemon () {
    pid=$1
    sleep 1
    if test -n "$pid"
    then
        if kill -0 $pid 2>/dev/null
        then
            echo -n "."
            cnt=0
            while kill -0 $pid 2>/dev/null
            do
                cnt=`expr $cnt + 1`
                if [ $cnt -gt $WAITFORDAEMON ]
                then
                    echo " FAILED."
                    return 1
                fi
                sleep 1
                echo -n "."
            done
        fi
    fi
    return 0
}

check_usdpiddir () {
    if test ! -d $USDPIDDIR; then
        echo "There is no $USDPIDDIR directory.  Creating one for you."
        mkdir -m 02700 "$USDPIDDIR"
        chown mldonkey:mldonkey "$USDPIDDIR"
    fi

    if test ! -x $USDPIDDIR; then
        echo "Cannot access $USDPIDDIR directory, are you root?" >&2
        exit 1
    fi
}

## Sucede que el OCR que se utilzia para descifrar el captcha de Megaupload consume mucho CPU, y a veces se demora mucho tiempo. USDownloader tiene un timeout para esperar la respuesta del OCR y muchas veces esa respuesta no llega en tiempo. Esto causa que USDownloader incie nuevamente el programa de OCR provocando que el CPU se sobrecargue y ningúno de los procesos de OCR termine. Como consecuencia la descarga queda colgada.
## Para solucionar este problema escribí la siguiente función que funciona como un daemon que cada cinco segundos revisa que no haya más de dos procesos del OCR y si hay reinicia el USDownloader.

megaupload_hack () {
    HACK=hack.txt
    pid=`ps ax | grep USDownloader.exe | grep -v grep | grep -v SCREEN | awk '{print$1}'`
    while [ `cat $HACK` == 1 ]; do
        if [ `(ps ax | grep symseek_uf.exe | grep -v grep) | wc -l` -gt 2 ]; then
            /etc/init.d/usdownloader restart
            exit
        fi
        sleep 5
    done
}

## Esta función inicia xvfb si no estaba ya levantado.

xvfb_init() {
    if [ $XVFB ]; then
        if [ `ps ax | grep Xvfb |grep -v grep | wc -l` ]; then
            /usr/bin/X11/Xvfb :10.10 -screen 10 800x600x16 -ac -br -kb -c -fbdir /var/tmp/ >/dev/null 2>&1 &
        fi
    fi
}

case "$1" in
  start)
    echo 1 > $HACK        # Indica al daemon de Megaupload que USDownloader fue iniciado.
    check_usdpiddir
    xvfb_init

    echo "Starting $DESC: $NAME..."

    su - mldonkey -c "/usr/bin/screen -L -l -d -m -s /bin/bash $DAEMON"
    sleep 10
    pid=`ps ax | grep USDownloader.exe | grep -v grep | grep -v SCREEN | awk '{print$1}'`
    echo $pid > $USDPID
    renice $NICE $pid    # Le damos altísima prioridad al árbol de procesos de USDownloader (lo necesita el OCR de Megaupload).

    echo "done."
    megaupload_hack &    # Lanzamos el pequeño daemon para mantener el OCR de Megaupload.
    ;;
  stop)
      echo 2 > $HACK        # Le indicamos al daemon de Megaupload que deje de correr porque USDownloader se va a cerrar.
    echo -n "Stopping $DESC: "
    pid=`cat $USDPID 2>/dev/null` || true

    if test ! -f $USDPID -o -z "$pid"; then
        echo "not running (there is no $USDPID)."
        exit 0
    fi

    if ps -p $pid; then
        su - mldonkey -c "/usr/bin/wineboot -k"
        su - mldonkey -c "/usr/bin/wineboot"
        wait_for_deaddaemon $pid
        echo "$NAME."
    elif kill -0 $pid $hack_pid 2>/dev/null
    then
        echo "FAILED (Is $pid not $DAEMON_NAME or not running as $DAEMON_USER?)."
    else
        echo "FAILED ($DAEMON_NAME died: process $pid not running; or permission denied)."
    fi
    ;;
  restart)
    $0 stop
    sleep 20
    $0 start
    ;;
  *)
    echo "Usage: $0 {start|stop|restart}" >&2
    exit 1
    ;;
esac

exit 0

 

Por último habilitar el arranque y apagado automático

Ya que tenemos el script, vamos a configura el equipo para que inicie automáticamente el USDownloader al rranque y lo apague al reiniciar o apagar el sistema.

Copiamo el script y lo ponemos guardamos como /etc/init.d/usdownloader (o el nombre que quieran,s iempr en /etc/init.d/). Esto lo pueden hacer con su editor de texto preferido, siempre con privilegios de root.

Le damos permiso de ejecución al script:

$ chmod +x usdownloader

Ahora lo habilitamos:

$ update-rc.d usdownloader defaults

 

Listo con esto ya tenemos USDownloader instalado, segurizado con Apache SSL, y un script para bajarlo y subirlo cuando queramos.

¡Hasta la próxima!

 

[1] http://www.howtoforge.com/how-to-run-usdownloader-on-ubuntu-server-8.10

[2] https://bugzilla.novell.com/show_bug.cgi?id=450347

Si te gustó esta nota, podés invitarme una cerveza en agradecimiento. Y algún día quizá pueda yo invitarte una :D

Post a Comment

Your email is never published nor shared. Required fields are marked *

*
*

Enviando un comentario, usted acepta que sus palabras serán publicadas bajo la licencia: Atribución-Compartir Obras Derivadas Igual 2.5 Argentina. http://creativecommons.org/licenses/by-sa/2.5/ar/