Acelerar descarga de paquetes Debian mediante aria2c

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:

3123238802

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

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s