Dejo esto por aqui:
#!/bin/bash
#Mod seleccionar updates por vk496a
VERSION="0.8"
TITULO="Wifislax Updater GUI $VERSION - By geminis_demon"
TERM="linux"
IMG_ALERT="/usr/share/pixmaps/UpdateALERT.png"
IMG_ERROR="/usr/share/pixmaps/UpdateERROR.png"
IMG_OK="/usr/share/pixmaps/UpdateOK.png"
TMP="/tmp/WifislaxUpdaterGUI"
PKGS="$TMP/PKGS"
UPDATERS="/opt/wifislax-updaters"
CREARXZM="FALSE"
NOINSTALAR="FALSE"
APAGAR="FALSE"
DEBUG="FALSE"
THEME="/usr/share/themes/oxygen-gtk/gtk-2.0/gtkrc"
[ ! -f "$THEME" ] && unset THEME
case "$( uname -m )" in
i?86) ARCH=i486 ;;
arm*) ARCH=arm ;;
*) ARCH=$( uname -m ) ;;
esac
CrearLogPackage() {
PKGNAM="$(basename "$1")"
SIZE="$(du -ch "$1"|tail -1|cut -f1)"
(echo "PACKAGE NAME: $PKGNAM"
echo "COMPRESSED PACKAGE SIZE:"
echo "UNCOMPRESSED PACKAGE SIZE: $SIZE"
echo "PACKAGE LOCATION: $PKGNAM"
echo "PACKAGE DESCRIPTION:"
echo "FILE LIST:"
echo "./"
find "$1"|grep -v "^$"|sed "s#$1/##"
) >"$TMP/$PKGNAM.$$"
mkdir -p "$1/var/log/packages"
mv -f "$TMP/$PKGNAM.$$" "$1/var/log/packages/$PKGNAM"
}
Actualizar() {
echo
echo "######################################"
echo "##"
echo "## Actualizando $PRGNAM"
echo "##"
echo "######################################"
echo
if [ "${UPDATER/*_}" = "updater" ]; then
UPDNAM="${UPDATER/*\/}"
cat "$UPDATER"|\
sed 's/^f_comprobarConexion/:/'|\
sed 's/^f_presentacion/:/'|\
sed 's/^f_comprobarUpdates/:/'|\
sed 's/^f_versionInstalada/:/'|\
sed 's/^f_tareasFinales/:/'|\
sed 's/^f_strip/:/'|\
sed 's#^rm -rf /usr/lib/firefox#:#'\
>"$TMP/$UPDNAM" && chmod +x "$TMP/$UPDNAM"
sh "$TMP/$UPDNAM"
[ $? -ne 0 ] && echo " • $PRGNAM" >>"$TMP/fallidos" && return
ARCH_="$(grep "^f_arquitectura" "$TMP/$UPDNAM"|cut -d' ' -f2)"
[ ! "$ARCH_" ] && ARCH_="$ARCH"
BUILD_DIR="/tmp/build/$PRGNAM/${PRGNAM}-${VERSION}-${ARCH}-1sw"
mv "/tmp/build/$PRGNAM/package-$PRGNAM" "$BUILD_DIR"
stripdir "$BUILD_DIR" >/dev/null 2>&1
cleandir "$BUILD_DIR"
CrearLogPackage "$BUILD_DIR"
[ "$NOINSTALAR" = "FALSE" ] && (removepkg "$(ls /var/log/packages/$PRGNAM-[0-9]*-*|tail -1)"; cp -rfp "$BUILD_DIR"/* /)
[ "$CREARXZM" = "TRUE" ] && MODULO="$PKGS/$(basename "$BUILD_DIR").xzm" && dir2xzm "$BUILD_DIR" "$MODULO" -n
rm -rf "/tmp/build/$PRGNAM" "$TMP/$UPDNAM"
elif [ "$UPDATER" = "slapt-get" ]; then
URL="$(slapt-get --print-uris -i "$PRGNAM"|grep "^http"|tail -1)"
aria2c -x 3 -d "$PKGS" "$URL"
[ $? -ne 0 ] && echo " • $PRGNAM" >>"$TMP/fallidos" && return
TXZ="$(basename "$URL")"
[ "$NOINSTALAR" = "FALSE" ] && (removepkg "$(ls /var/log/packages/$PRGNAM-[0-9]*-*|tail -1)"; installpkg "$PKGS/$TXZ")
[ "$CREARXZM" = "TRUE" ] && MODULO="$PKGS/$(echo "$TXZ"|sed 's/txz$/xzm/')" && txz2xzm "$PKGS/$TXZ" "$MODULO"
rm -f "$PKGS/$TXZ"
fi
[ -f "$MODULO" ] && mkdir -p "$HOME/Desktop/Actualizaciones" && mv "$MODULO" "$HOME/Desktop/Actualizaciones"
unset MODULO
}
MenuActualizando() {
seleccionados=$(echo "$seleccionados" | sed -r 's/([A-Z]+\|[[:alpha:]]+)\|([A-Z]+\|[[:alpha:]]+)\|/\1\n\2/' | grep TRUE | cut -f2 -d\| |rev | cut -d- -f2- | rev | awk '{print $0"|"}')
echo "$seleccionados" >$TMP/losseleccionados
#Es posible que solo haya actualizaciones de los updaters
if [ -f $TMP/wifislax-updates ]; then
grep -f $TMP/losseleccionados $TMP/wifislax-updates |cut -d"|" -f1 > $TMP/coincidencias_updater
grep -f $TMP/coincidencias_updater $TMP/wifislax-updates > $TMP/TMP_wifislax-updates
mv $TMP/TMP_wifislax-updates $TMP/wifislax-updates
#O de ambos
if [ -f $TMP/slackware-updates ]; then #Evitamos que una misma actualizacion se haga de las dos formas
grep -v -f $TMP/coincidencias_updater $TMP/losseleccionados > $TMP/coincidencias_slackware-updates
grep -f $TMP/coincidencias_slackware-updates $TMP/slackware-updates > $TMP/TMP_slackware-updates
mv $TMP/TMP_slackware-updates $TMP/slackware-updates
rm $TMP/TMP_slackware-updates $TMP/coincidencias_slackware-updates
fi
rm $TMP/TMP_wifislax-updates $TMP/coincidencias_updater
#O solo de slapt-get
else
grep -f $TMP/losseleccionados $TMP/slackware-updates |cut -d"|" -f1 > $TMP/coincidencias_slackware-updates
grep -f $TMP/coincidencias_slackware-updates $TMP/slackware-updates > $TMP/TMP_slackware-updates
mv $TMP/TMP_slackware-updates $TMP/slackware-updates
rm $TMP/TMP_slackware-updates $TMP/coincidencias_slackware-updates
fi #Pero en esta funcion siempre hay elmenos uno de alguno
UPDATES="$(cat "$TMP/wifislax-updates" "$TMP/slackware-updates" 2>/dev/null)"
TOTAL=$(echo "$UPDATES"|wc -l)
echo "Ejecutando actualizaciones" >"$TMP/estado"
[ "$DEBUG" = "TRUE" ] && (xterm -T "$TMP/log" -e "tail -F $TMP/log" & echo $! >"$TMP/pid")
N=1
echo "$UPDATES"|\
while read LINE; do
PRGNAM="$(echo "$LINE"|cut -d'|' -f1)"
VERSION="$(echo "$LINE"|cut -d'|' -f2)"
UPDATER="$(echo "$LINE"|cut -d'|' -f3)"
PORCENT=$(($(($N*100))/$TOTAL))
echo "1:$(($PORCENT-1))"
echo "1:#Actualizando ${PRGNAM}... ${N}/${TOTAL}"
Actualizar >>"$TMP/log" 2>&1
[ $PORCENT -eq 100 ] && echo "1:100"
N=$(($N+1))
done|\
yad --center \
--width 600 \
--gtkrc="$THEME" \
--title "$TITULO" \
--window-icon "$IMG_ALERT" \
--image "$IMG_ALERT" \
--button "gtk-cancel:1" \
--text "\n\n\n\n\n\n Ejecutando actualizaciones pendientes \n" \
--multi-progress --bar="":NORM --auto-close
[ $? -ne 0 ] && Salir
echo "Esperando interacción del usuario" >"$TMP/estado"
if [ "$APAGAR" = "TRUE" ]; then
for X in {0..10}; do
SEG=$(($X-10))
SEG=${SEG/-}
PORCENT=$(($X*10))
echo "$PORCENT"
echo "#El sistema se apagará en $SEG segundos"
sleep 1
done|\
yad --center \
--width 600 \
--gtkrc="$THEME" \
--title "$TITULO" \
--window-icon "$IMG_ALERT" \
--image "$IMG_ALERT" \
--button "gtk-cancel:1" \
--progress --auto-close \
--text-align "center" \
--text "\n\n\n\n\n\nLas operaciones han finalizado \n"
[ $? -ne 0 ] && Salir
poweroff
Salir
fi
if [ -f "$TMP/fallidos" ]; then
yad --center \
--width 600 \
--gtkrc="$THEME" \
--title "$TITULO" \
--window-icon "$IMG_ERROR" \
--image "$IMG_ERROR" \
--button "gtk-close:0" \
--text-info --text "\n\nLas operaciones han finalizado con errores, \
los siguientes paquetes no han podido actualizarse: \n" \
--filename "$TMP/fallidos"
else
yad --center \
--width 600 \
--gtkrc="$THEME" \
--title "$TITULO" \
--window-icon "$IMG_OK" \
--image "$IMG_OK" \
--button "gtk-close:0" \
--text "\n\n\n\n\n\n\nLas operaciones han finalizado sin errores, \
todos los paquetes se actualizaron correctamente. \n"
fi
[ "$DEBUG" = "TRUE" ] && kill $(cat "$TMP/pid")
Salir
}
MenuOpciones() {
yad --on-top --center \
--width 600 \
--gtkrc="$THEME" \
--title "$TITULO" \
--window-icon "$IMG_ALERT" \
--image "$IMG_ALERT" \
--button "Guardar:0" \
--button "gtk-close:2" \
--form \
--text "\n\nConfigurar opciones: \n" \
--field "Guardar actualizaciones en módulos XZM":CHK $CREARXZM \
--field "No instalar actualizaciones, solo descargar":CHK $NOINSTALAR \
--field "Apagar sistema al terminar":CHK $APAGAR \
--field "Activar modo debug":CHK $DEBUG \
>"$TMP/return"
[ $? -ne 0 ] && Salir
IFS='|' read CREARXZM NOINSTALAR APAGAR DEBUG <"$TMP/return"
[ "$NOINSTALAR" = "TRUE" -a "$CREARXZM" = "FALSE" ] && CREARXZM="TRUE" && MenuOpciones
MenuActualizaciones
}
MenuActualizaciones() {
TOTAL=$(echo "$UPDATES"|wc -l)
seleccionados=$(yad --on-top --center \
--width 600 \
--gtkrc="$THEME" \
--title "$TITULO" \
--window-icon "$IMG_ALERT" \
--image "$IMG_ALERT" \
--button "Actualizar:0" \
--button "Opciones:1" \
--button "gtk-close:2" \
--text-info --text "\n\n $TOTAL actualizaciones disponibles \n" \
--list \
--multiple \
--column=Selec:CHK --column "Actualizaciones" \
$(cat $TMP/actualizaciones-disponibles) --print-all )
case $? in
0) MenuActualizando;;
1) MenuOpciones;;
*) Salir;;
esac
}
ActualizarUpdater() {
UPDATER_ONLINE="$(timeout -s SIGTERM 3 curl -s "http://downloadwireless.net/${UPDATER#/opt/}"|grep "^SCRIPT_VERSION="|cut -d'=' -f2)"
UPDATER_LOCAL="$(grep "^SCRIPT_VERSION=" "$UPDATER"|cut -d'=' -f2)"
if [ "$UPDATER_ONLINE" ] && [ $UPDATER_LOCAL -lt $UPDATER_ONLINE ]; then
timeout -s SIGTERM 3 curl -s "http://downloadwireless.net/${UPDATER#/opt/}" >"$UPDATER"
fi
}
Salir() {
[ -e "${TMP}.mutex" ] && rm -rf "${TMP}.mutex"
[ -e "$TMP/estado" ] && rm -rf "$TMP/estado"
exit
}
[ "$1" = "--rm-mutex" ] && rm -rf "${TMP}.mutex"
if [ -e "${TMP}.mutex" ]; then
yad --center \
--width 600 \
--gtkrc="$THEME" \
--title "$TITULO" \
--window-icon "$IMG_ERROR" \
--image "$IMG_ERROR" \
--button "gtk-ok:0" \
--text "\n\n\n\n\n\n\n\nEl programa ya se está ejecutando. \nEstado: $(cat "$TMP/estado" 2>/dev/null||echo "desconocido")"
exit
else
touch "${TMP}.mutex"
fi
trap "Salir" SIGHUP SIGILL SIGTERM SIGTSTP
rm -rf "$TMP" && mkdir -p "$TMP" "$PKGS"
if [ "$1" = "--no-tray" ]; then
if [ ! "$(ping google.com -c1 2>/dev/null)" ]; then
yad --center \
--width 600 \
--gtkrc="$THEME" \
--title "$TITULO" \
--window-icon "$IMG_ERROR" \
--image "$IMG_ERROR" \
--button "gtk-ok:0" \
--text "\n\n\n\n\n\n\n\nNo hay conexión a internet, no se puede continuar. \n"
Salir
fi
echo "1" >"$TMP/progress"
(while true; do echo "$(cat "$TMP/progress")"; sleep 1; done|\
yad --center \
--width 600 \
--gtkrc="$THEME" \
--title "$TITULO" \
--window-icon "$IMG_ALERT" \
--image "$IMG_ALERT" \
--button "gtk-cancel:1" \
--text-align "center" \
--text "\n\n\n\n\n\n\nBuscando actualizaciones... \n" \
--progress --pulsate --auto-close \
||touch "$TMP/stop" &)
else
while [ ! "$(ping google.com -c1 2>/dev/null)" ]; do echo "Esperando conexión a internet" >"$TMP/estado"; sleep 60; done
fi
echo "Buscando actualizaciones" >"$TMP/estado"
for UPDATER in $(find "$UPDATERS" -type f -iname "*_updater"); do
[ "$(basename "$UPDATER")" = "wifislax-updaters_updater" ] && continue
grep "PRGNAM=" "$UPDATER" >"$TMP/$$.tmp" && source "$TMP/$$.tmp" 2>/dev/null
INSTALADA="$(ls /var/log/packages/$PRGNAM-[0-9]*-* 2>/dev/null|cut -d '/' -f5-|sed "s/^${PRGNAM}-//"|rev|cut -d'-' -f3-|rev|tail -1)"
if [ "$INSTALADA" ]; then
egrep "WEB=|VERSION=|RAMA=|DOWNLOAD=|ARCHIVO=" "$UPDATER" >"$TMP/$$.tmp" && source "$TMP/$$.tmp" 2>/dev/null
if [ "$VERSION" ]; then
if [ "$VERSION" != "$INSTALADA" ]; then
ActualizarUpdater >/dev/null 2>&1
echo "${PRGNAM}|${VERSION}|$UPDATER"
fi
fi
fi
unset PRGNAM INSTALADA WEB VERSION RAMA DOWNLOAD ARCHIVO
rm -f "$TMP/$$.tmp"
done >"$TMP/wifislax-updates"
if [ ! -f "/var/slapt-get/last_update" ] || [ $(cat "/var/slapt-get/last_update") -lt $(date +%Y%m%d) ]; then
slapt-get --update && echo "$(date +%Y%m%d)" >"/var/slapt-get/last_update"
slapt-get --upgrade --simulate|grep "actualizará "|awk '{print $1" "$7}' |\
while read PRGNAM VERSION; do
VERSION="$(echo "$VERSION"|rev|cut -d'-' -f3-|rev)"
PRGNAM="$(echo "$PRGNAM"|rev|cut -d'-' -f4-|rev)"
echo "${PRGNAM}|${VERSION}|slapt-get"
done >"$TMP/slackware-updates"
fi
[ -f "$TMP/stop" ] && Salir
UPDATES="$(cat "$TMP/wifislax-updates" "$TMP/slackware-updates" 2>/dev/null)"
echo "Esperando interacción del usuario" >"$TMP/estado"
if [ "$1" = "--no-tray" ]; then
echo "100" >"$TMP/progress"
if [ ! "$UPDATES" ]; then
yad --center \
--width 600 \
--gtkrc="$THEME" \
--title "$TITULO" \
--window-icon "$IMG_OK" \
--image "$IMG_OK" \
--button "gtk-ok:0" \
--text "\n\n\n\n\n\n\nNo se encontraron actualizaciones disponibles, el sistema está actualizado. \n"
Salir
fi
else
[ ! "$UPDATES" ] && Salir
yad --notification \
--no-middle \
--gtkrc="$THEME" \
--image "$IMG_ALERT" \
--command "quit" \
--menu "Actualizaciones disponibles" \
--text "Actualizaciones disponibles"
sleep 0.5
fi
echo "$UPDATES"|cut -d '|' -f1,2|tr '|' '-'|sed 's/^/ • /' >"$TMP/actualizaciones-disponibles"
MenuActualizaciones
Salir
Que a nadie se le ocurra cogerlo y usarlo como definitivo. Esta sin acabar y no funciona correctamente por ahora. Sin embargo, lo dejo aqui porque luego se me pierde... y se me quitan las ganas de seguir.
EDITO:
Acabo de darle mas retoques. Ahora mismo deberia poder instalar cualquier actualizacion que provenga de los UPDATERS. Todavia no lo he adaptado a slapt-get.
Mi intencion es hacer lo mismo con las actualizaciones de slapt-get y eliminar la ventana de opciones, para que todo se muestre y configure desde una unica pantalla, la principal (A esto ultimo me gustaria saber tu opinion @geminis_demon )
EDITO2:
Ahora mismo debería funcionar tanto con updates de slackware como con los updaters
EDITO3:
Pequeño cambio para evitar errores de nombres. Es decir, anteriormente, si sleccionabamos un paquete habiendo 2 parecidos (glib y glib-extra), se instaban los 2, aunque hayamos seleccionado solo uno. Ahora mismo no deberia pasar eso.
Salu2