Nos mudamos de yaourt para aurman y te cuento porqué

Yaourt-830x415-1.jpg

Hace tiempo que yaourt ya dejó de utilizar por los motivos que desarrollaré en ésta entrada. Luego de varios planteos, discusiones, insultos, etc. En diferentes grupos de telegram, como por ejemplo en ArchlinuxLatinoamerica de que conviene usar para la instalación de paquetes desde AUR, hay que destacar que no se está entendiendo la importancia de utilizar un buen AUR helper y la incidencia que tienen estos en nuestro sistema. Por éso más que nada decidí crear éste tema para sacar dudas e informar como corresponde y promover el uso de aurman.

¿Que es un AUR helper?

Es un script o varios de ellos que nos ayudan a realizar la instalación de paquetes que se encuentran en AUR de manera prácticamente automática. Llámese automática a la resolucón de dependencias de paquetes que a su ve dependen de otros que se encuentran en el mismo AUR y que pacman no puede hacer nada debido que no tiene soporte ahí ya que no fué creado con esa finalidad.

Ahora, Yaourt fue el primer AUR helper que usé, seguramente ustedes también comenzaron con el mismo, la verdad que hasta el día de la fecha, y si hubiera querido más tiempo también, me funciona bien aparentemente. Pero luego de investigar y revisar un poco su código fuente, uno se da cuenta que se podría decir que es un pleno desastre en su código. Y el que que mejor lo reemplaza es aurman y por lo tanto lo recomiendo a pleno.

Comparaciones Yaourt vs Aurman

Seguridad

Yaourt

Es inseguro desde su misma creación, si miran bién en este fragmento de código podemos observar como convierte un fichero PKGBUILD en un “script inofensivo“, pero eso no es lo grave del tema, lo realmente grave es que una vez descargado el PKGBUILD éste ejecuta el comando source al PKGBUILD antes de que nosotros podamos revisar lo que hay dentro del mismo PKGBUILD, ósea que si un usuario cualquiera introduce dentro del PKGBUILD una línea como por ejemplo:

rm -r $HOME

Éste se ejecutará tal cual y borrará todo lo que tengan en su disco y una vez que haya hecho éso, te dejará ver el contenido del PKGBUILD lo cual debe ser al contrario!

# sanitize_pkgbuild(pkgbuild)
# Turn a PKGBUILD into a harmless script (at least try to)
sanitize_pkgbuild() {
local file=”$1″
local tmpfile=$(mktemp –tmpdir=”$YAOURTTMPDIR”)
sed -n -e ‘/\$(\|`\|[><](\|[&|]\|;/d' \
-e ‘/ *[a-zA-Z0-9_\-]\+ *( *)/q’ \
-e ‘s/^ *[a-zA-Z0-9_]\+=/declare &/’ \
-e ‘p’ “$file” > “$tmpfile”
sed -n -e ‘1,/^\r$/ d’ \
-e ‘/^declare *[a-zA-Z0-9_]\+=(.*) *\(#.*\|$\)/{p;d}’ \
-e ‘/^declare *[a-zA-Z0-9_]\+=(.*$/ {:a;N;$bb;/.*) *\(#.*\|$\)/!ba;s/\n/ /g;p;d;:b}’ \
-e ‘/^declare *[a-zA-Z0-9_]\+=.*[^\\]$/{p;d}’ “$tmpfile”
sed -n -e ‘/^declare *[a-zA-Z0-9_]\+=.*\\$/ {:a;N;$bb;/.*[^\\]$/!ba;s/\n/ /g;p;d;:b}’ “$tmpfile”
rm “$tmpfile”
}

# Source a PKGBUILD and return a declare var list:
# Call in a sub process:
# . <(source_pkgbuild file var1 var2)
source_pkgbuild() {
local file=”$1″; shift; local vars=$*
{ sanitize_pkgbuild “$file” | grep -E “declare (${vars// /|})”; } 2> /dev/null
}

Aurman

Éste AUR helper cumple de manera correcta con las políticas que hacen totalmente inseguro a Yaourt (teniendo en cuenta que usar AUR no es muy seguro tampoco), una vez que descarga el PKGBUILD este permanece intacto y nos pregunta si deseamos ver el contenido, cuando el usuario toma la decisión que necesita, recién se procede con la ejecución del contenido dentro del PKGBUILD. Se entiende?

Entorno de construcción (build)

Yaourt

Mi querido yaourt tampoco cumple con las condiciones que se necesitan para establecer un entorno de creación. Por ejemplo, el script:

/usr/lib/yaourt/pkgbuild.sh

“Exporta” la variable BUILDDIR (para darle a makepkg) cuando está manejando los archivos makefile y utilizan esa variable. La verdad que no estoy muy seguro de porqué yaourt necesitaría hacer éso, porque makepkg es bastante capaz de manejarlo y ya. Entonces yaourt sólo está dando prioridad al archivo del sistema makepkg.conf básicamente. Ósea que si es así y yaourt falla en la instalación de varios paquetes, pero si lo hacemos manualmente usando makepkg el resultado puede ser todo lo contrario.

Aurman 

También resuelve el problema anterior dejando el trabajo a MAKEPKG:

package.build(ignore_arch, rebuild)
if package.name in sanitized_names \
and package.name not in sanitized_not_to_be_removed \
and package.name not in replaces_dict \
or (package.name in installed_system.all_packages_dict
and installed_system.all_packages_dict[package.name].install_reason
== ‘explicit’) \
or (package.name in replaces_dict
and installed_system.all_packages_dict[replaces_dict[package.name]].install_reason
== ‘explicit’):

package.install(args_for_explicit, use_ask=use_ask)
else:
package.install(args_for_dependency, use_ask=use_ask)
except InvalidInput:
sys.exit(1)

Uso nativo de pacman

Yaourt

No usa el estilo nativo y correcto en el que debe ser usado pacman, éste ejecuta pacman en una serie de comandos divididos y que podrían llegar a romper el sistema en lugar de usar la orden:

pacman -Syu

Por ejemplo:

# `pacman -Spu` fails in some cases (e.g: when a package is replaced
# by another one)
if pacman_parse -Sp –noconfirm –print-format “## %n” $_arg \
“${PACMAN_S_ARG[@]}” “${pkg_up[@]}” >”$YAOURTTMPDIR/sysupgrade”; then
packages=($(sed -n ‘s/^## \(.*\)/\1/p’ “$YAOURTTMPDIR/sysupgrade” | sort))
rm “$YAOURTTMPDIR/sysupgrade”
[[ $packages ]] && upgrade_needed=1 || { upgrade_needed=0; return 0; }
else
# `pacman -Spu` failed so we don’t know which packages
# will be updated
DETAILUPGRADE=0; upgrade_needed=1; return 1
fi

# package-query invocations are expensive, hence, the result is saved
# in a global variable which can be used later by format_update().
mapfile pkgs_repo_up_info < <(pkgquery -1Sif "%n %r %v %l %d" "${packages[@]}")

while read pkgname repo unused; do
if (( BUILD )) || custom_pkg “$pkgname”; then
pkgs_src+=(“$repo/$pkgname”)
else
pkgs_repo+=(“$repo/$pkgname”)
fi
done < <(echo -n "${pkgs_repo_up_info[@]}")
}

Aurman

Siempre utiliza la sentencia correcta, aunque usemos:

$ aurman -Su

$ aurman -S

$ aurman $PAQUETE

Por lo tanto también queda resuelto, se podría decir, el problema anterior.

Resolviendo dependencias

Yaourt

Para ser un AUR helper tan usado, yaourt rompe muchas de las reglas básicas, por ejemplo, supongamos que un paquete A, depende de un paquete B y otro C, la manera correcta de hacerlo es, instalando B y C previamente ya que son dependencias y luego A, pero yaourt hace totalmente lo contrario. Instala el paquete A, luego B y C, o también instala B primero, después A, finalmente C, lo cual no es muy recomendable.

Aurman

Aurman omite totalmente lo anterior nombrado tratando a las dependencias como palabras, strings y entonces si un paquete A, depende del paquete B, entonces se busca el paquete B y sus dependencias, se instala y luego al final se instala A, ésto se repite tanto para los paquetes requeridos a instalar como para las dependencias requeridas por estos paquetes.

Dependencias especificas de paquetes

Yaourt

Éste no es capaz de instalar/construir un paquete si este contiene dependencias que requieran de una versión en específico. Es decir, si el paquete A, depende del B, con una versión C, yaourt no es capaz de instalar ése paquete.

Aurman

Al contrario que yaourt, aurman es capaz de solucionar ése problema de manera correcta debido a su sistema de resolución de dependencias que posee y como mencionamos anteriormente.

Uso de Git

Yaourt

Usa por defecto ABS en lugar de git, aunque se puede especificar con la opción -git para que lo use. El hecho de que use ABS por defecto, permite que operaciones como la descarga del codigo fuente de un paquete con la opción yaourt -G, no funcione.

Aurman

Ya utiliza git por defecto, de hecho es una dependencia obligatoria del paquete, con eso resuelve problemas que suceden en yaourt.

Vista de diferencias en los PKGBUILD

Yaourt

Por naturaleza yaourt maneja muy mal los PKGBUILD, de una manera insegura para nuestro sistema, pero ademas, por defecto tampoco da la opción para ver lo que ha cambiado entre la versión anterior y la nueva de un PKGBUILD, ósea que expone aún más al usuario. Cabe mencionar que existe una opción para que muestre las diferencias entre los commits del PKGBUILD.

Aurman

Siempre te va a preguntar si deseas ver las dependencias, depende de nuestra decisión el que aurman continúe con un proceso de instalación.

Instalando aurman

Recuerden que si necesitan con detalle todo lo que hace éste AUR helper, por favor pueden ver aquí toda lo necesario.

Instalar aurman desde yaourt

1 – Cargamos la llave necesaria para no tener errores en la instalación:

$ gpg –recv-keys 465022E743D71E39

2 – Instalamos aurman

$ yaourt -S aurman

Instalar aurman manualmente

1 – Cargamos la llave necesaria para no tener errores en la instalación:

$ gpg –recv-keys 465022E743D71E39

2 – Clonamos el repo de aurman en nuestro equipo

$ git clone https://aur.archlinux.org/aurman.git

3 – Ingresamos al directorio aurman que se creó y ejecutamos:

$ makepkg -si

Comandos básicos

Actualizar sistema:

$ aurman -Syu

Buscar un paquete:

$ aurman -Ss paquete

Instalar un paquete

$ aurman -S paquete

Eliminar un paquete

$ aurman -R paquete

NOTA: Luego que finalice el proceso de instalación de aurman, les recomiendo eliminar el paquete yaourt y el repositorio también que se encuentra en /etc/pacman.conf.

$ sudo pacman -Rscn yaourt

[archlinuxfr]
SigLevel = Never
Server = http://repo.archlinux.fr/$arch

Video de instalación:

Ya que la instalación es bastante sencilla vía yaourt, dejo el paso un poco más avanzado, para que vean lo simple que es también.

Bueno finalizando con ésta entrada, espero realmente que quede claro lo que hace y lo que no hace yaourt y con lo que podemos reemplazarlo tranquilamente. Espero que les sirva y compartan así sigo creciendo

Un abrazo!Nos mudamos de yaourt para aurman y te cuento porqué

Anuncios

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s