Buenas, normalmente, en Paraguay cosas como estas no hacen falta, tenes una conexion tercermundista y nada, te resignas a que todo tarde una eternidad, pero ahora, todo cambio …
Redefinamos «todo», lo unico que cambio fue mi conexion a internet, yo sigo siendo el mismo inutil, mi pc sigue siendo la misma tostadora de hace 7 años y mi sistema operativo sigue siendo Debian GNU/Linux (que ahora ya tenemos kfreebsd y tenemos que especificar).
Pase de tener un megabit por ADSL, a tener 10 megabits por ADSL, eso significa que tengo por fin una descarga decente, pero la subida sigue siendo tercermundista, adjunto prueba de velocidad:
Por fin puedo ver porno a 720p, realmente funciona bastante bien, mas al precio que esta (100 pesos / menos de 20 dolares), es de la empresa Arnet y estoy en la zona de Belgrano, si alguien esta por la zona y esta pensando en que ISP ponerse.
El problema
Ninguna alusion a Arjona, lamento informar, cuando tenes 1 megabit, estas mentalizado que descargar algo de internet es toda una aventura, mas que simplemente descargar, pero una vez que tenes 10 megabits, todo cambia, te molesta cuando algo baja a menos de 3 megabits, eso es un problema, mas con los repositorios (no se si aproposito capados, o son simplemente malos) lentos de Debian.
La solucion
Despues de darme cuenta que las descargas de aptitude no pasaban de 120 K, pense, y si descargamos de a 5 archivos juntos? Increible no?
Asi que basicamente es eso, es un script que se vale de un pequeño codigo en python que convierte los links en metalinks y despues los pasa a aria2c para la descarga paralela, el script lo tome prestado de un foro de Ubuntu, la fuente esta citada, funciona, como no esta documentado, no se muy bien que hace (mis habilidades en Python son mas bien basicas), si alguien lo puede optimizar, o almenos documentarlo, esta bienvenido …
El script
Basicamente, funciona asi, es un script en bash, que procesa lo que queremos hacer, instalar paquetes, actualizar el sistema, eliminar / purgar paquetes, basicamente, trabaja solamente con las opciones install y upgrade, todos los otros comandos los pasa directamente a aptitude sin modificarlos …
Este es el codigo Python, que en el script bash lo nombro apt2metalink.py
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import re if __name__ == "__main__": entries = [] while True: line = sys.stdin.readline() if not line: break uri, name, size, chksum = line.split() uri = re.sub(r"^'|'$", "", uri) hashfunc, hashvalue = chksum.split(':') hashfunc = hashfunc.lower() if hashfunc == 'sha256': hashfunc = 'sha-256' entries.append((uri, name, size, hashfunc, hashvalue)) print """<?xml version="1.0" encoding="UTF-8"?> <metalink xmlns="urn:ietf:params:xml:ns:metalink">""" for e in entries: print """<file name="{name}"> <size>{size}</size> <hash type="{hashfunc}">{hashvalue}</hash> <url priority="1">{uri}</url> </file>""".format(uri=e[0],name=e[1], size=e[2], hashfunc=e[3], hashvalue=e[4]) print """</metalink>"""
Y el escript de bash, recomiendo ponerlo en /usr/bin/, asi esta en path y no tenes que buscarlo en algun directorio, aunque ya es eleccion suya …
#Fecha 23/11/2013 #Autor: Alexis Daciuk (a.k.a. Wasmosy) #Script para acelerar las descargas de paquetes de apt/aptitude mediante aria2c #El codigo Python que convierte los links a metalinks lo quite de http://ubuntuforums.org/showthread.php?t=1493421 #Este script se puede modificar / redistribuir/ usar partes a conveniencia citando a su autor y su fuente #!/usr/bin/env bash set -o pipefail set -o errexit # set -o xtrace __DIR__="$(cd "$(dirname "${0}")"; echo $(pwd))" __BASE__="$(basename "${0}")" __FILE__="${__DIR__}/${__BASE__}" ARG1="${1:-Undefined}" # set -o nounset #Primero que nada actualizamos la base de datos de los paquetes #Usamos apt-get en vez de aptitude ya que en mis pruebas fue mas rapido apt-get update #Segundo vemos que quiere hacer el usuario #Solamente upgrade e install se tratan de manera diferente #Obs: upgrade se trata como "dist-upgrade" en apt, para poder actualizar todos los paquetes que aptitude actualizaria de forma normal # $1 siempre va a ser el comando a identificar mediante if's , todos los otros argumentos van a ser simplemente paquetes args=("@") if [ $1 = "install" ]; then apt-get -y --print-uris install "${@:2}" |grep 'ftp:\|http:' |python2 /usr/bin/apt2metalink.py|aria2c -d /var/cache/apt/archives/ -M- -j 10 -x 10 && aptitude install "${@:2}" elif [ $1 = "upgrade" ]; then apt-get -y --print-uris dist-upgrade|grep 'ftp:\|http:' |python2 /usr/bin/apt2metalink.py|aria2c -d /var/cache/apt/archives/ -M- -j 10 -x 10 && aptitude upgrade else aptitude "$1" "${@:2}" fi
Edito, version 0.2 de mi script, añadidas ciertas buenas practicas de Bash, ahora el script funciona con repositorios ftp/http sin problemas,
Realmente el uso no cambia para nada, cuestion de pasarle como si fuera aptitude los argumentos ….
Saludos