Discusión:HOWTO Actualizar Gentoo 'en diferido'
De Gentoo Linux Wiki
[editar] Tras cierto tiempo de inactividad
Hola: A veces estaría bien que el actualizador se pusiera a trabajar con prioridad muy pobre cuando detecta que hay mucha inactividad. Esto parecería muy útil, ya que si el ordenador no está haciendo nada irá actualizándose. Un saludo Palmax
[editar] Revisión de corrección
Hola, veréis, utilizo el script desde mis principios con gentoo, felicidades por él, y también a Radikal que no me deja de sorprender (q3.nu)
Trabajo con:
GNU bash, version 3.00.16(1)-release (x86_64-pc-linux-gnu)
en una gentoo 2005.1 pero con lo de los caracters de redirección y la tubería a mi me ocurre al contrario, sólo me muestra correctamente la ayuda si está como estaba en un principio
cat <<End-of-message | colorea_ayuda
he probado el script en un debian a 32 que tengo aquí al lado con
GNU bash, version 3.1.11(1)-release (i486-pc-linux-gnu)
y funciona bien sin los ^
Por lo que deduzco que la shell utilizada por Franco Gotusso debe ser otra diferente a bash (revisar link /bin/sh). y bash es la que se instala con gentoo.
yo empezé a utilizar este script en noviembre del 2005 y me daba los errores que describe Franco. Hoy lo he revisado y corregido, que ya me picaba la curiosidad y me extrañaba mucho que me apareciese el error sólo en la opción de ayuda, por lo demás funcionaba la mar de bien.
Le añado también una pequeña modifición a la variable PROG, por si quien utiliza el script, lo nombra con un nombre diferente al suyo pupdate
Atentamente AnimAlf@engendro.sytes.net
[editar] Mensaje de Franco
Buenas RadikalQ3
He empezado a utilizar el script que propones en este articulo y me he topado con un problemilla en la funcion muestra_ayuda que me ha dado varios quebraderos de cabeza que me ha llevado a una solucion aproximada.
| Código: Script: Funcion muestra_ayuda |
function muestra_ayuda {
#Muestra la ayuda del script
cat ^<^<End-of-message ^| colorea_ayuda
${NE}${PROG} ${NO}v. ${RO}${VERSION} ${AZ}"${TAG}"
${RO}${DESC}
${NO}
Utilización: ${PROG} [OPCION]
Actualiza el árbol de paquetes de Portage, creando paquetes compilados
de manera desatendida, que después podrán ser instalados mediante:
${AZ}portage -k${NO}
El script por defecto efectua todas las operaciones \(si estan activadas
dentro de la configuracion del propio script\), que son
- emerge sync
- emerge -uDf world
- Compila todo creando paketes binarios pero sin instalarlos
- Crea un reporte y lo envia por email
- Purga los directorios temporales de compilacion de portage
a no ser que usemos algunas de las siguientes opciones:
Opciones disponibles:
-h, --help Muestra esta ayuda
-s, --nosync No hacer el emerge sync
-p, --nopurge No hacer la purga final
-c, --vercompilados Ver los paquetes compilados listos para instalar
-n, --vernocompilados Ver los paquetes que faltan por compilar
Configuración:
El script ha de configurarse antes de ser utilizado, editando las variables situadas
en su interior.
Una vez configurado, debes poner CONFIGURADO='si' \(dentro del script\) para comenzar
a utilizarlo sin ver este texto de ayuda.
Ejemplos de uso:
- Saber lo que falta por compilar \(sin hacer emerge sync\) \> pupdate -sn
- Saber lo que ya está compilado \(sin hacer emerge sync\) \> pupdate -sc
- Operación habitual completa \> pupdate
End-of-message
}
|
El problema ocurria cuando la Bash intentaba tratar a los parentesis como caracteres especiales de una funcion en lugar de texto plano, lo mismo ocurre con los direccionadores y el pipe.
Tambien he corregido una variable que figuraba en la ayuda como PKDGIR y el script buscaba la variable PKGDIR en definitiva, para aquellos que les haya fallado la version original v3.0 del 30/1/2005 (fecha de mi cumpleaños) ahora tienen a continuación la version 3.0.r1 del 12/8/2005 (la fecha de algunos otros cumpleaños) :p.
| Archivo: Script: Pupdate.sh entero v3.0.r1 |
#! /bin/sh
# ----------------------------------------------------------------------------
# pupdate
# Script para actualizar el portage mediante un evento desatendido
# Se trata de realizar el quivalente a:
# emerge sync ; emerge -uDp world
# y tras esto, compilar las novedades pero SIN INSTALARLAS, es decir,
# se crean los paquetes compilados en $PKGDIR para tenerlos ahí
# ya compilados, y, a la hora de actualizar el sitema, poder hacerlo
# mediante un:
# emerge -uDk world
# en un periodo breve de tiempo, mientras se supervisa la operacion,
# utilizando los paquetes binarios creados de antemano por el script.
#
#El script puede enviar por email un reporte con el resultado
#y tambien tiene en cuenta a los usuarios del MLDonkey
#frenando su consumo de ancho de banda mientras dure la actualizacion.
#
# Por RadikalQ3 para todos los colegas de Gentoo
#
# Version 3.0 30/01/2005
# - Eliminado el '--newuse' incorporado en la version 2.0
# - Añadidos colores a la salida del programa
# - Añadida opcion para que no realice el emerge sync
# - Añadida opcion para ver los paquetes que faltan por compilar
# - Añadida opcion para ver los paquetes ya compilados listos para instalar
# - Añadida purga del directorio temporal de compilaciones del portage
# - Añadida opcion para que no realice la purga
# Version 3.0.r1 12/08/2005
# - Corregidos ciertos problemas con el texto y los metacaracteres con el parser BASH en la funcion muestra_ayuda
# ----------------------------------------------------------------------------
#**************************************************************
# Configuración inicial:
#******************************
#Fichero temporal para crear el informe de la actualizacion (se borrará al terminar):
TMP_REPORT='/tmp/pupdate-report'
#Fichero temporal conteniendo la lista de los paquetes nuevos a actualizar:
TMP_NUEVOS_PAKETES='/tmp/pupdate-nuevos'
#Fichero temporal para albergar la lista de paquetes ya compilados
TMP_COMPILADOS='/tmp/pupdate-c'
#Fichero temporal para albergar la lista de paquetes sin compilar
TMP_NO_COMPILADOS='/tmp/pupdate-sc'
#Hacer emerge sync y bajar fuentes de golpe al principio:
HACER_SYNC='si'
#Hacer purga final de temporales de compilacion:
HACER_PURGA='si'
#Si queremos frenar el MLDonkey antes de sincronizar el portage
# Posibles valores: si ó no
MLDONKEY_SLOW='no'
#Si queremos que nos envie un email con un reporte de lo realizado
# Posibles valores: si ó no
EMAIL_REPORT='si'
#Dirección de email a la que enviar el reporte
#NOTA: Debe funcionar el comando 'mail' en tu sistema (emerge mailx te ayudara)
EMAIL_DIR='the.real.sentinel@gmail.com'
#Hora límite para terminar la compilacion
#Despues de esta hora, el script deja de compilar hasta la próxima ejecución
#Usar formato de 24 horas, por ejemplo, 21:30 para las nueve y media de la noche
#Si no se quiere limite, poner 99:99
HORA_LIMITE='99:99'
#Una vez configurado el script, poner CONFIGURADO='si'
CONFIGURADO='si'
#**************<Fin de la configuracion inicial>******************
#Datos de esta versión del script
PROG="pupdate"
TAG="Compila, si, pero no me molestes..."
DESC="Portage Update. Para compilar Gentoo en diferido. - RadikalQ3 - \n Revision 1 the.real.sentinel"
VERSION="3.0.r1"
#Defición de colores
NO=$'\x1b[0;0m'
NE=$'\x1b[0;01m'
RO=$'\x1b[31;01m'
VE=$'\x1b[00;32m'
AZ=$'\x1b[34;01m'
#**************************************************************
# Funciones del script:
#******************************
function colorea_ayuda {
#Colorea el texto de ayuda del script
sed -r "
s/^[^[:space:]].*:/$VE\\0$NO/
s/[[:space:]]-[][[:alpha:]?-]+/${AZ}\\0${NO}/g
s/\\(default\\)/${BR}\\0${NO}/
"
}
function muestra_ayuda {
#Muestra la ayuda del script
cat ^<^<End-of-message ^| colorea_ayuda
${NE}${PROG} ${NO}v. ${RO}${VERSION} ${AZ}"${TAG}"
${RO}${DESC}
${NO}
Utilización: ${PROG} [OPCION]
Actualiza el árbol de paquetes de Portage, creando paquetes compilados
de manera desatendida, que después podrán ser instalados mediante:
${AZ}portage -k${NO}
El script por defecto efectua todas las operaciones \(si estan activadas
dentro de la configuracion del propio script\), que son
- emerge sync
- emerge -uDf world
- Compila todo creando paketes binarios pero sin instalarlos
- Crea un reporte y lo envia por email
- Purga los directorios temporales de compilacion de portage
a no ser que usemos algunas de las siguientes opciones:
Opciones disponibles:
-h, --help Muestra esta ayuda
-s, --nosync No hacer el emerge sync
-p, --nopurge No hacer la purga final
-c, --vercompilados Ver los paquetes compilados listos para instalar
-n, --vernocompilados Ver los paquetes que faltan por compilar
Configuración:
El script ha de configurarse antes de ser utilizado, editando las variables situadas
en su interior.
Una vez configurado, debes poner CONFIGURADO='si' \(dentro del script\) para comenzar
a utilizarlo sin ver este texto de ayuda.
Ejemplos de uso:
- Saber lo que falta por compilar \(sin hacer emerge sync\) \> pupdate -sn
- Saber lo que ya está compilado \(sin hacer emerge sync\) \> pupdate -sc
- Operación habitual completa \> pupdate
End-of-message
}
function baja_todo {
#Frena el edonkey, hace emerge sync, baja los paquetes necesarios
#con emerge -uDf world y vuelve a acelerar el mldonkey
#Si utilizamos MLDonkey, lo ponemos a 'Slow' para que no chupe todo el ancho de banda
if [ ${MLDONKEY_SLOW} = 'si' ]
then echo " ${VE}*${NO} Reduciendo el consumo de ancho de banda de MLDonkey"; /etc/init.d/mldonkey slow
fi
#Actualizamos arbol del portage:
echo " ${VE}*${NO} Sinconizando portage (${AZ}emerge sync${NO})"
emerge sync
#Hacemos Download de los paquetes necesarios:
echo " ${VE}*${NO} Descargando los paquetes necesarios (${AZ}emerge -uDf world${NO})"
emerge -uDf world
#Aceleramos el MLDonkey
if [ ${MLDONKEY_SLOW} = 'si' ]
then echo " ${VE}*${NO} Acelerando MLDonkey"; /etc/init.d/mldonkey fast
fi
}
function compila_todo {
#Compila los paquetes que faltan por compilar.
#Deja de compilar si se llega a la hora límite (configurable)
echo " ${VE}*${NO} Compilando los paquetes que falten por compilar:"
#Compilamos los que no estén ya compilados:
for i in ` cat ${TMP_NUEVOS_PAKETES} ` ;
do
if [ ! -f ${PKGDIR}/All/$i.tbz2 ]
then
if [ $(date +"%H:%M") \< $HORA_LIMITE ]
then echo " Compilando: $i"; /usr/bin/nice -n +19 /usr/bin/emerge -B =$i
else echo " NO Compilando, por Hora Límite: $i"
fi
fi
done
}
function crea_reporte {
#Crea un reporte que muestra los paquetes compilados y no instalados
#y los paquetes no compilados
echo " ${VE}*${NO} Creando reporte"
rm -f ${TMP_COMPILADOS}
#Creamos un reporte con lo realizado:
echo " " > ${TMP_REPORT}
echo " _______________________________________________________" >> ${TMP_REPORT}
echo " Reporte de actualización del equipo: "$HOSTNAME >> ${TMP_REPORT}
echo " _______________________________________________________" >> ${TMP_REPORT}
echo " " >> ${TMP_REPORT}
echo " * Nuevos paquetes YA COMPILADOS y listos para instalar con emerge -uDk :" >> ${TMP_REPORT}
echo " " >> ${TMP_REPORT}
for i in ` cat ${TMP_NUEVOS_PAKETES} ` ;
do
if [ -f ${PKGDIR}/All/$i.tbz2 ]
then echo " - $i" >> ${TMP_COMPILADOS}
fi
done
if [ -f ${TMP_COMPILADOS} ]
then cat ${TMP_COMPILADOS} >> ${TMP_REPORT}
else echo " - No hay ningún paquete ya compilado pendiente de instalar" >> ${TMP_REPORT}
fi
rm -f ${TMP_COMPILADOS}
echo " " >> ${TMP_REPORT}
echo " " >> ${TMP_REPORT}
echo " * Nuevos paquetes que NO HAN SIDO COMPILADOS. (Se recomienda compilación manual) :" >> ${TMP_REPORT}
echo " " >> ${TMP_REPORT}
for i in ` cat ${TMP_NUEVOS_PAKETES} ` ;
do
if [ ! -f ${PKGDIR}/All/$i.tbz2 ]
then echo " - $i" >> ${TMP_NO_COMPILADOS}
fi
done
if [ -f ${TMP_NO_COMPILADOS} ]
then cat ${TMP_NO_COMPILADOS} >> ${TMP_REPORT}
else echo " - No hay ningún paquete nuevo sin compilar" >> ${TMP_REPORT}
fi
echo " " >> ${TMP_REPORT}
cat ${TMP_REPORT}
}
function purga_compilaciones {
#Si el emerge no está siendo ejecutado, borra el directorio temporal
#de compilaciones usado por portage, definido en el fichero /etc/make.conf
#en la variable PORTAGE_TMPDIR
echo " ${VE}*${NO} Borrando directorio temporal compilación emerge si este no se esta ejecutando"
ps -a | grep emerge > /dev/null
if [ $? -eq 1 ]; then
rm -rf ${PORTAGE_TMPDIR}/*
fi
}
#**************************************************************
# Entrada del script:
#******************************
#Hasta que sea configurado el script, mostramos la ayuda y salimos
#Asi, por lo menos te lees las opciones una vez...
if [ $CONFIGURADO != 'si' ]
then
muestra_ayuda;
echo "${RO}NOTA:${NO} Debes poner CONFIGURADO='si' en el script para que el script funcione...";
exit 0
fi
#Actualizamos las variables de directorios del portage:
# En concreto, nos interesa PKGDIR y PORTAGE_TMPDIR
source /etc/make.conf
#Si no está definida la variable PKGDIR, no continuamos
if [ ${PKGDIR}NORL = 'NORL' ]
then
echo "${RO}ERROR:${NO} Debes setear la variable PKGDIR en el fichero /etc/make.conf"
echo " Su valor por defecto es /usr/portage/packages"
echo " Es decir, añade en tu /etc/make.conf una linea con: PKGDIR=/usr/portage/packages"
exit 1
fi
#Si no está definida la variable PORTAGE_TMPDIR, no continuamos
if [ ${PORTAGE_TMPDIR}NORL = 'NORL' ]
then
echo "${RO}ERROR:${NO} Debes setear la variable PORTAGE_TMPDIR en el fichero /etc/make.conf"
echo " Su valor por defecto es /var/tmp/portage"
echo " Es decir, añade en tu /etc/make.conf una linea con: PORTAGE_TMPDIR=/var/tmp/portage"
exit 1
fi
#Por defecto, no queremos ver las listas, queremos compilar...
VER_COMPILADOS="no"
VER_NO_COMPILADOS="no"
#Capturamos las opciones de linea de comandos:
while getopts ":hspcn-" OPT; do
case $OPT in
h ) muestra_ayuda; exit 0;;
s ) HACER_SYNC='no';;
p ) HACER_PURGA='no';;
c ) VER_COMPILADOS='si';;
n ) VER_NO_COMPILADOS='si';;
- ) break;;
esac
done
for ((i=$OPTIND; i<=$#; ++i)); do
case ${!i} in
--help ) muestra_ayuda; exit 0;;
--nosync ) HACER_SYNC='no';;
--nopurge ) HACER_PURGA='no';;
--vercompilados ) VER_COMPILADOS='si';;
--vernocompilados ) VER_NO_COMPILADOS='si';;
* ) OPTIND=$i; break;;
esac
done
echo "${NE}${PROG} ${NO}v. ${RO}${VERSION}${NO}"
echo "Actualización automática de paquetes del equipo ${NE}$HOSTNAME${NO}"
echo " "
#Emerge sync y bajar los fuentes (frenando el mldonkey)
if [ ${HACER_SYNC} = 'si' ]
then
baja_todo
fi
#Creamos la lista de los nuevos paquetes a actualizar:
echo " ${VE}*${NO} Creando lista de paquetes a actualizar (${AZ}emerge -uDp world${NO})"
emerge -uDp world | grep ebuild | cut -f 2- -d "/" | cut -f 1 -d " " > ${TMP_NUEVOS_PAKETES}
#Si queremos ver la lista de programas compilados:
if [ ${VER_COMPILADOS} = 'si' ]; then
rm -f ${TMP_COMPILADOS}
for i in ` cat ${TMP_NUEVOS_PAKETES} ` ;
do
if [ -f ${PKGDIR}/All/$i.tbz2 ]
then echo " - $i" >> ${TMP_COMPILADOS}
fi
done
echo " "
echo " ${AZ}Nuevos paquetes YA COMPILADOS y listos para instalar con ${VE}emerge -uDk ${NO}:"
echo " "
if [ -f ${TMP_COMPILADOS} ]
then cat ${TMP_COMPILADOS}
else echo " - No hay ningún paquete ya compilado pendiente de instalar"
fi
fi
#Si queremos ver la lista de programas NO compilados:
if [ ${VER_NO_COMPILADOS} = 'si' ]
then
rm -f ${TMP_NO_COMPILADOS}
for i in ` cat ${TMP_NUEVOS_PAKETES} ` ;
do
if [ ! -f ${PKGDIR}/All/$i.tbz2 ]
then echo " - $i" >> ${TMP_NO_COMPILADOS}
fi
done
echo " "
echo " ${AZ}Nuevos paquetes NO COMPILADOS aún:${NO}"
echo " "
if [ -f ${TMP_NO_COMPILADOS} ]
then cat ${TMP_NO_COMPILADOS}
else echo " - No hay ningún paquete nuevo sin compilar"
fi
fi
#Compilamos los paquetes que faltan por compilar, sólo si
#no hemos pedido alguna de las listas de paquetes
if [ ! ${VER_COMPILADOS} = 'si' ] && [ ! ${VER_NO_COMPILADOS} = 'si' ]; then
compila_todo
crea_reporte
#Enviamos el reporte por email
if [ ${EMAIL_REPORT} = 'si' ]; then
echo " ${VE}*${NO} Enviando reporte por email a: ${EMAIL_DIR}";
cat ${TMP_REPORT} | mail -s "Informe de Actualizacion de portage del equipo: ${HOSTNAME}" ${EMAIL_DIR}
fi
#Purgamos temporales de compilacion del portage:
if [ ${HACER_PURGA} = 'si' ]; then
purga_compilaciones
fi
echo " ${VE}*${NO} Actualizacion completada"
echo " "
fi
#Borramos ficheros temporales:
rm -f ${TMP_REPORT}
rm -f ${TMP_NUEVOS_PAKETES}
rm -f ${TMP_COMPILADOS}
rm -f ${TMP_NO_COMPILADOS}
|
Gracias, RadikalQ3 , por un trabajo bien hecho ;)
the.real.sentinel@gmail.com
Puesto que los cambios parecen correctos voy a agragar las modificaciones al articulo original. Franco Gotusso
