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
