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

Herramientas personales