Bueno, no sé si a alguien le servirá esto... Lo dudo mucho pero me da igual

Circulan por ahí scripts para hacer lo mismo que hago con los 3 scripts que voy a poner, y probablemente mejor hechos, pero me apetecía hacerlos yo solico para aprender un poquillo, que nunca está de más.
El primero es un script para conky que muesta unas estadísticas de pacman. Muestra el total de paquetes, el total de paquetes instalados explícitamente, la última actualización de la base de datos y la última actualización de paquetes:
- Código: Seleccionar todo
#!/bin/bash
echo " "$(pacman -Q | wc -l) "("$(pacman -Qe | wc -l)") paquetes"
echo " -Sy: " $(cat /var/log/pacman.log | grep sync | tail -n1 | cut -d "[" -f 2 | cut -d "]" -f -1)
echo " -Su: " $(cat /var/log/pacman.log | grep "full system" | tail -n1 | cut -d "[" -f 2 | cut -d "]" -f -1)
echo
El segundo es otro para conky. Mira en la base de datos si hay paquetes actualizables y los muestra línea por línea.
- Código: Seleccionar todo
#!/bin/bash
S=$(pacman -Qu)
L=$(echo $S | grep "Se procesará")
if [ "$L" == "" ]; then
echo " Sistema actualizado."
else
lista=$(echo $L | cut -d ":" -f 2)
t=$(($(echo $lista | wc -w)-4))
if [ $t -eq 1 ]; then
echo " 1 paquete actualizable:"
else
echo " $t paquetes actualizables:"
fi
for i in $(seq 1 $(($(echo $lista | wc -w)-4))); do
echo " ·" $(echo $lista | cut -d " " -f $i)
done
echo
echo " Descarga:" $(echo $L | cut -d ":" -f 3 | cut -d " " -f 1-3)
fi
El resultado puede verse aquí, la parte de la derecha de Pacman:
http://img137.imageshack.us/img137/4950 ... 050ga5.pngEn realidad no son scripts "de conky". Con cron actualizo cada hora la base de datos de paquete y con lo siguiente actualizo conky cada media hora:
- Código: Seleccionar todo
${color white}${font impact:bold size=20}PACMAN$font ${pre_exec pacman -V | grep Pacman | cut -d " " -f 20- | cut -d "-" -f 1 | cut -d " " -f 2}
${texeci 1800 ~/Programas/conkypacstats.sh}
${texeci 1800 ~/Programas/conkypacupdate.sh}
El tercero es el que me ha costado más... Es para recompilar e instalar desde las fuentes todos los paquetes instalados (makeworld recompila todos, instalados o no). Es probable que tenga algunos fallos, bastante probable teniendo en cuenta que lo acabo de hacer

Una opción para listar todos los paquetes y su directorio en abs, otra para compilar, otra para instalar. Como mi ordenador es muy lento (comparado con los de ahora, claro, que a mí me va perfecto) en la función de compilar paso como parámetro el número de paquetes a construir. No hay opción para construir todos (dudo que la use), pero sólo hay que indicarle el número de líneas del fichero y ya.
Más que nada es una prueba, para ver si lo conseguía hacer y ver qué problemas me iba encontrando. Dudo que lo use mucho, compilar 760 paquetes seguramente le costaría bastante. Uso sudo para actualizar abs y la base de datos, se puede omitir esa parte.
Teniendo en cuenta que los paquetes de arch están construidos para i686, dudo que note alguna diferencia en mi p4 aún con las cflags bien puestas. Con un procesador más nuevo tal vez se notara algo, ni idea.
En fin, ahí va:
- Código: Seleccionar todo
#!/bin/bash
# Compila los paquetes instalados desde las fuentes
# Se necesitan abs, pacman y sudo
# Ejemplo:
# $ rebuild.sh -l lista # saca lista
# $ rebuild.sh -c lista 10 paquetes # compila 10
# $ rebuild.sh -c lista wc -l pkgs.lst | cut -d " " -f 1 # compila resto
# # rebuild.sh -i paquetes # instala todos
# Sale si NO se es root
function permisosroot {
if [ $UID -ne "0" ]; then
echo "Error: Necesitas permisos de root para realizar esta operación."
exit
fi
}
# Sale si SÍ se es root
function permisosnoroot {
if [ $UID -eq "0" ]; then
echo "Error: No debes realizar esta operación como root."
exit
fi
}
# Comprueba parámetros
function parametros {
if [ $1 -ne $2 ]; then
echo "Error: Número de parámetros incorrecto."
exit
fi
}
# Actualiza abs y base de datos de paquetes
function actualizar {
echo "Se actualizará el árbol de abs y la base de datos de paquetes."
sudo abs
sudo pacman -Sy
}
# Genera un fichero con "nombre_paquete ruta_en_abs\n" por paquete construíble
# $1 = fichero destino
function listar {
# Lista de paquetes
pkglist=`pacman -Q | cut -d' ' -f1 | paste -s`
pkgnum=`pacman -Q | wc -l`
# Localiza cada paquete en el árbol de abs
i=0
for pkg in $pkglist; do
i=$((i+1))
aux="($i / $pkgnum) $pkg"
echo -n "$aux"
for (( j=${#aux}; j<40; j++)); do echo -n " "; done
search=`find /var/abs/core/ /var/abs/extra/ /var/abs/community/ -type d -name $pkg | cut -d " " -f 1`
# Lo añade a makelist o norebuildlist
pkgbuild="$search/PKGBUILD"
if [ -f "$pkgbuild" ] ; then
makelist="$makelist $pkg"
echo "$search"
echo "$pkg $search" >> $1
else
norebuildlist="$norebuildlist $pkg"
echo "-- Incorrecto --"
fi
done
# Resumen
echo
echo "Lista de paquetes generada en el fichero '$PWD/$1'"
echo `cat $1 | wc -l` "paquetes a construir."
echo
echo "Paquetes que no serán reconstruídos: $norebuildlist"
}
# Borra $2 líneas del fichero $1
function borra_lineas {
ftemp=`mktemp`
tail -n $((`cat $1 | wc -l`-$2)) $1 > $ftemp
mv $ftemp $1
}
# Main
case "$1" in
"-l")
permisosnoroot
parametros $# 2
actualizar
listar $2
;;
"-c")
parametros $# 4
permisosnoroot
echo
echo -n "Se construirán los siguientes paquetes en '$4':"
head -n $3 $2 | (while read f; do
echo -n " "
echo -n `echo $f | cut -d " " -f 1`
done)
echo
echo
dtemp=`mktemp -d`
mkdir -p $4
head -n $3 $2 | (while read f; do
cd $dtemp
rm -rf *
cp `echo $f | cut -d " " -f 2`/* .
makepkg -c -A
cd $OLDPWD
mv $dtemp/`echo $f | cut -d " " -f 1`*.pkg.tar.gz $4
borra_lineas $2 1
done)
rm -r $dtemp
echo
echo "Construídos $3 paquetes en '$4'"
;;
"-i")
permisosroot
parametros $# 2
cd $2
pacman -U *.pkg.tar.gz
cd $OLDPWD
;;
*)
echo "uso: $0 <opción> [parámetros]"
echo " -l <fichero> Crea la lista en <fichero>"
echo " -c <fichero> <n> <destino> Compila los primeros <n> paquetes y los"
echo " borra de la lista"
echo " -i <directorio> Instala todos los paquetes de <directorio>"
echo " de la lista <fichero> en <directorio>"
esac
Lo acabo de probar y funciona bien

No sé por qué me gusta tanto hacer estas frikadas

Edito: Creo que se ha perdido algún ` al editar, lo he vuelto a pegar a ver si salen...