gentoo-util-scripts

gentoo-util-scripts es un set de utilidades enfocadas en cubrir o mejorar pequeños detalles de Portage, ya sea por su inexistencia o por falta de velocidad en su ejecución. Varios de estos scripts son made by ferdy, aunque tambien hay otros hechos por devs y users.

Como la teoria es muy bonita pero todo Cristo ya está apunto de cerrar la pestaña del navegador, vamos a hacer una review práctica para ver de que va la cosa.

Dentro del paquete nos encontramos esto:

Shinra hades # equery files gentoo-util-scripts
[ Searching for packages matching gentoo-util-scripts... ]
app-portage/gentoo-util-scripts-0.3
* Contents of app-portage/gentoo-util-scripts-0.3:
/usr
/usr/bin
/usr/bin/PkgXmlExport
/usr/bin/built-with-use
/usr/bin/distfiles-clean
/usr/bin/eshowkw
/usr/bin/overlay
/usr/bin/rebuild-kernel-mods
/usr/share
/usr/share/doc
/usr/share/doc/gentoo-util-scripts-0.3
/usr/share/doc/gentoo-util-scripts-0.3/README.gz
/usr/share/gentoo-util-scripts
/usr/share/gentoo-util-scripts/output.xsl


Veamos a que se dedica cada script:

rebuild-kernel-mods
Los que por ejemplo usen los drivers de nvidia sabrán que despues de un kernel nuevo tienen que reemerger de nuevo los drivers, así como cualquier paquete que sea sensible a un cambio de kernel.
Este script buscará estos paquetes y nos dará la opción de emerger o no. Veamos que hace en mi máquina:

Shinra hades # rebuild-kernel-mods -va
* Building a list of packages to rebuild... [ ok ]

These are the packages that I would merge, in order:

Calculating dependencies ...done!
[ebuild R ] media-video/nvidia-kernel-1.0.7676 0 kB

Total size of downloads: 0 kB

Do you want me to merge these packages? [Yes/No] No

Quitting.


En mi caso el único paquete sensible a cambios de kernel son los drivers de nvidia, por lo que con un cambio de kernel bastaría ejecutar el script para reemerger todas estas aplicaciones de nuevo y así poder funcionar en el nuevo kernel.

eshowkw
Este script cuyo nombre es cuanto menos peculiar, se dedica a mostrarnos las keywords de un ebuild concreto. Su uso es muy simple: eshowkw
Veamos otro ejemplo:

Shinra hades # eshowkw rxvt-unicode
Keywords for x11-terms/rxvt-unicode:

| a a a h i m m p p p p s s s x x x
| l m r p a 6 i p p p p 3 h p 8 8 8
| p d m p 6 8 p c c c c 9 a 6 6 6
| h 6 a 4 k s 6 - - 0 r - -
| a 4 4 m o c f o
| a d b d
| c s
| o d
| s
----+----------------------------------
3.0 | + + + + +
4.0 | + ~ ~ ~ + + +
5.1 | ~ ~ ~ ~ ~ ~
5.3 | ~ ~ + + + +
5.7 | ~ ~ ~ ~ ~ ~ ~


Intuyo que aquí la salida quedará muy torcida, en una terminal queda mucho mejor :-p

distfiles-clean
Este script está pensado para eliminar los paquetes que habitan en distfiles y que no están instalados en nuestra máquina (ya sea por que haya una versión más nueva en el sistema o por que simplemente los borrasemos).
Veamos de nuevo la salida:

Shinra hades # distfiles-clean
NVIDIA-Linux-x86-1.0-6629-pkg1.run dhcpcd-1.3.22_p4-keepCacheAndResolv.diff.bz2 dhcpcd-1.3.22_p4.diff.bz2 genpatches-2.6-8.55-base.tar.bz2 genpatches-2.6-8.55-extras.tar.bz2 gentoolkit-0.2.0_pre8.tar.gz glext.h-20040830.bz2 glext.h-26.bz2 linux-2.6.11.tar.gz linux-2.6.9-buildfix.patch pptp-command wvdial-1.53.tar.gz xorg-x11-6.8.0-files-0.4.tar.bz2 xorg-x11-6.8.0-patches-0.2.2.1.tar.bz2 xorg-x11-6.8.2-files-0.1.tar.bz2 xorg-x11-6.8.2-patches-0.1.1.tar.bz2 xorg-x11-6.8.2-patches-0.1.2.tar.bz2


No quiere decir que estos paquetes no estén instalados, pero las versiones que aquí aparecen no estan instaladas.

En el uso a lo 'pretend' distfiles-clean solo muestra que paquetes serán eliminados (sin eliminar). Si tenemos ganas de juerga y eliminar en serio pues algo tan simple como "sudo rm $(distfiles-clean)".

built-with-use
Es una forma rápida de ver con que USE's compilamos un paquete concreto, sin recurir a equery ni zambullirse por /var/db/pkg. Uso muy simple: built-with-use

Shinra hades # built-with-use xorg-x11
x11-base/xorg-x11 : -3dfx +3dnow +bitmap-fonts +cjk -debug -dlloader -dmx +doc -font-server -insecure-drivers +ipv6 -minimal -mmx +nls -nocxx +opengl +pam -sdk -sse -static +truetype-fonts +type -fonts -uclibc +xprint +xv


PkgXmlExport
Este script genera un fichero html que contiene todos los paquetes que están actualmente en nuestro sistema. La utilidad básica del mismo es ofrecer un vistazo general de nuestros paquetes. También como herramiente de 'pre-desinstalación' (más de una vez me he topado con un paquete que no utilizo y que pensaba que ya no estaba en el sistema [borracho] ). Su uso es muy simple: PkgXmlExport donde arch es opcional y por defecto se usa x86. No hay muestra porque no corre sobre terminal, si eso despues subo imagen a imageshack y linko.


El lector avispado se percatará que falta por descubrir overlay. La finalidad de este script es gestionar un overlay. Sin embargo como es un tanto más complejo en uso que los demás scripts mejor que se pase su creador y nos comente un poco su funcionamiento (/me invoca a ferdy).

Bueno, ya por último solo faltará emergerlo (en el caso que se esté interesado por supuesto :-P). Bastará con usar el overlay de ferdy. Para quien no sepa como funciona el tema de los overlays aquí se explica todo todo y todo. Solo falta nombrar la dirección de rsync que se habrá de añadir al syncsource: rsync="rsync://gentoo-es.org/overlay-ferdy"

Creo que no me he dejado nada en el tintero, y si no fuera así viva el edit.

Saludos
quelcom escribió:Como la teoria es muy bonita pero todo Cristo ya está apunto de cerrar la pestaña del navegador, vamos a hacer una review práctica para ver de que va la cosa.
[qmparto][qmparto][qmparto] se te pira mucho tío... XD.

La verdad es que yo soy de esa clase de tipos a los que siempre se les pasan estas cosas y nunca las descubren. Ahora de repente... oooh! Así que muchas gracias por el reportaje, te lo has currado mucho y ahora en un rato me pondré a probar todas estas utilidades.

La verdad es que hay multitud de scripts interesantes corriendo por los foros de gentoo que mejoran ó rellenan lagunas de portage, pero luego nunca los acabo utilizando. A ver si poquito a poquito van introduciendo esto en portage... :).

Gracias! Un saludo!
Woohoo... thanks por tomarte el tiempo quelcom.

overlay
overlay comenzó como una función en mi bash_profile que me permitiera firmar un 'paquete' antes de hacer un commit a mi CVS [ donde tengo mi overlay ]. Sin embargo esto es un problema porque los ebuilds tienen en la cabecera esto:

# $Header$


Que es una etiqueta especial de CVS, al hacer el commit el CVS modifica el ebuild y por tanto el Manifest queda roto. Hacía falta regenerar el Manifest una vez CVS ha modificado el ebuild, volver a firmarlo y hacer commit del Manifest. Esto es lo que en gentoo conocemos como 'Manifest recommit'.

Una vez que 'overlay' era capaz de firmar un paquete y mandarlo al CVS sin que nada se rompiera surgía la necesidad de compartir este overlay con todo el mundo. En mi caso además subirlo a mano es una pesadez dado que el servidor rsync (gentoo-es.org) no es el mismo que el servidor que lo 'muestra por web' (dev.gentoo.org).

Así que fui incrementando la función con más y más código hasta que se hizo imposible de mantener como función y la convertí en un script a parte.

¿Cómo funciona? No es dificil... aunque tampoco especialmente intuitivo. Lo primero configuramos nuestro .overlayrc. El mío es algo así:

# GPG key to sign manifests
OVERLAY_SIGN_KEY=0x47F5241D
# Where is it located
OVERLAY_DIR=/home/ferdy/gentoo/overlay/
# Use CVS or SVN or GIT?
OVERLAY_SCM=cvs
# CVS module name
OVERLAY_MODULE=overlay

## Servers section; synopsis and example
# server_identifier=("uri" "path/" "rm" "extracmds" ...)
server_toucan=("dev.gentoo.org" "public_html/" "1" "chmod a+r public_html/overlay")
server_pas=("gentoo-es.org" "" "1")


Quizá la parte más dificil sean los 'server_*'; sin embargo es realmentes simple. Imaginemos que queremos publicar nuestro overlay en otro servidor más que se llama perico. Y vamos a publicarlo en la ruta 'public_html/gentoo/overlay'. Además queremos notificar al servidor de que hemos actualizado nuestro overlay haciendo un 'touch updated/my-very-own-overlay' (esto puede ser util para un cron por ejemplo); pues hacemos:

server_perico=("perico.host.name.org" "public_html/gentoo/" "1" "touch updated/my-very-own-overlay")


Ese '1' que hay ahí es para que overlay borre el directorio antes de subir los archivos, es muy util y nadie debería tenerlo en '0' si no quiere que ebuilds que borre de su overlay sigan apareciendo por ahí.

¿Y cómo se usa? Pues lo primero es crearse un overlay y para eso necesitamos un sistema de control de versiones. Como poner un CVS/SVN es un poco pesado, vamos a usar GIT para el ejemplo:

[ $ ~ ] cat .overlayrc
# GPG key to sign manifests
OVERLAY_SIGN_KEY=0x47F5241D
# Where is it located
OVERLAY_DIR=/home/ferdy/git/overlay/
# Use CVS or SVN or GIT?
OVERLAY_SCM=git


Tenemos que crear el sistema de ficheros GIT antes:

[ $ ~ ] mkdir -p git/overlay
[ $ ~ ] cd git/overlay
[ $ ~/git/overlay ] git init-db
defaulting to local storage area
[ $ ~/git/overlay ] echo "initial commit" | git-commit-tree $(git-write-tree) > .git/HEAD


Para hacernos la vida más fácil y poder utilizar 'echangelog' [ parte de gentoolkit-dev ] vamos a copiar skel.ChangeLog y a añadirlo a nuestro overlay:

[ $ ~/git/overlay ] cp /usr/portage/skel.ChangeLog .
[ $ ~/git/overlay ] git add skel.ChangeLog
[ $ ~/git/overlay ] git commit -m "add ChangeLog skeleton to keep echangelog happy" skel.ChangeLog


Ahora empezaremos por crearnos un paquete chorra, en nuestro caso será el mismo gentoo-util-scripts:

[ $ ~/git/overlay ] mkdir -p app-portage/gentoo-util-scripts/files/
[ $ ~/git/overlay ] git add app-portage
[ $ ~/git/overlay ] git add app-portage/gentoo-util-scripts
[ $ ~/git/overlay ] git add app-portage/gentoo-util-scripts/files
[ $ ~/git/overlay ] cd app-portage/gentoo-util-scripts/
[ $ ~/git/overlay/app-portage/gentoo-util-scripts ] vim gentoo-util-scripts-0.4.ebuild


Una vez tenemos el ebuild creamos el 'digest' y añadimos ambos ficheros a GIT:

[ $ ~/git/overlay/app-portage/gentoo-util-scripts ] ebuild gentoo-util-scripts-0.4.ebuild digest
>>> Generating digest file...
<<< gentoo-util-scripts-0.4.tar.bz2
>>> Generating manifest file...
<<< gentoo-util-scripts-0.4.ebuild
<<< files/digest-gentoo-util-scripts-0.4
>>> Computed message digests.

[ $ ~/git/overlay/app-portage/gentoo-util-scripts ] git add gentoo-util-scripts-0.4.ebuild files/digest-gentoo-util-scripts-0.4


Ahora creamos el metadata.xml; luego creamos la primera entrada del ChangeLog y añadimos todos los ficheros al GIT. Para dejar las cosas bien regeneramos el Manifest:

[ $ ~/git/overlay/app-portage/gentoo-util-scripts ] vim metadata.xml
[ $ ~/git/overlay/app-portage/gentoo-util-scripts ] echangelog "initial import"
( Salida diciéndonos que hay cosas que no fueron bien, esto es porque echangelog solo sabe de CVS ; pero nos vale igual )
[ $ ~/git/overlay/app-portage/gentoo-util-scripts ] git add ChangeLog Manifest metadata.xml


Una vez que está todo listo, podemos hacer 'overlay commit' y pasarle un mensaje:

[ $ ~/git/overlay/app-portage/gentoo-util-scripts ] overlay commit -m "initial import"
(blablabla)


Siempre podemos comprobar el estado de las firmas de nuestros Manifests con 'overlay check'. Además podemos subir nuestro overlay a los servidores que especifiquemos con 'overlay upload'.

'overlay' funciona bien con CVS y GIT, con svn 'debería' pero quizá necesite tweakearlo. Habrá bugs y no es 'idiot-proof' así que si alguien quiere romper algo, será capaz de hacerlo, overlay no se lo va a impedir :)

ATENCIÓN: Con funciona significa que a MI me funciona... tiene mil bugs y estaré encantado de arreglarlos si alguien los reporta.

Un saludo a todos.
Ferdy

PD: Si usais git: Utilizad la versión ~arch de dev-util/git. La estable no vale para nada. Además 'gitk' es una 'cómoda' utilidad gráfica para ver repositorios GIT.
Si señor, muy currado. [ok]

¿ El script distfiles-clean es el mismo que aparece aquí ?
No, no es el mismo. Ese es algo (bastante) más lento.

Saludos.Ferdy
Felicidades, cosas asi siempre se agradecen :)

Salu2!
Se agradece vuestra dedicacion y esfuerzo quelcom y Ferdy [Ooooo]

Salu2
Joder cómo sus lo currais... En la explicación de Ferdy por momentos me he perdido un poco por mi desconocimiento y leerlo rápido, así que luego lo leeré con más dedicación.

De verdad, muchas gracias.

Un saludo!
7 respuestas