# [Guia] Actualizar gentoo 'en diferido'

## RadikalQ3

Guia para actualizar Gentoo 'en diferido' (o cómo no morirse de lentitud mientras tu chisme está compilando cosas)

Actualización del 30/01/2005 (Version 3.0)

Eliminado el uso de -newuse (mejor lo haces a mano...)

Añadido colorines a la salida del programa

Añadidas opciones para saber los programas compilados y sin compilar

Añadida opcion para que no realice el emerge sync

Añadida ayuda mediante la opcion -h

Añadida purga del directorio temporal de compilaciones del portage (sino se llena de ficheros gigas y gigas)

Actualización del 18/01/2005 (Version 2.0)

Añadido el flag -newuse para que se compilen los paquetes que hayan sido afectados por un cambio de tus variables USE

Añadido un nuevo parámetro de configuración: HORA_LIMITE para poder poner freno a las compilaciones en una hora determinada.

De vez en cuando nos toca actualizar nuestra Gentoo (cada cual escoge la frecuencia, yo lo suelo hacer a diario, porque dispongo de ancho de banda)

Aqui propongo una forma de actualizar nuestros equipos, sin tener que andar compilando paquetes precisamente cuando nos sentamos ante nuestro equipo.

Ya me fastidia llegar a casa y ponerme a compilar todo mientras estoy viendo una peli, revisando mi correo o cualquier otra tarea, mientras la CPU consume recursos a montones y hace rascar el disco duro.

¿Como es esto?... pues muy fácil.

Alguno ha tenido la tentación (incluso alguno hasta lo hace) de realizar un emerge sync y un emerge -uD world de manera automática, mediante un evento en el cron, por ejemplo.

El emerge sync... no hay problema, pero el compilar algo de manera desatendida es una práctica que conlleva muchos riesgos, dado que si hay algún problema de compilación, éste nos pasará inadvertido. Además, habrá ciertas configuraciones que necesitarán ser revisadas (mediante etc-update, dispatch-conf o como sea).

En este post, propongo un script que llevo utilizando con éxito desde hace ya varios meses en todos los servidores Gentoo que me toca mantener.

La idea es la siguiente:

Se trata de, mediante un evento cron, realizar un emerge sync, y luego, crear paquetes compilados pero SIN INSTALARLOS, de tal forma que, en cuanto tengamos un rato, podamos efectuar un 

```
emerge -uDk world
```

y realizar la actualización del sistema sin tener que compilar paquetes (dado que ya estarán instalados) y pudiendo observar el proceso, revisar configuraciones, etc.

Aqui está el script que lo hace posible:

```

#! /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

# ----------------------------------------------------------------------------

#**************************************************************

#      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='root'

#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='no'

#**************<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 - "

VERSION="3.0"

#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 | 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

}

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 "     

----------

## focahclero

Muy interesante, gracias  :Smile: 

----------

## RadikalQ3

De nada  :Wink: 

----------

## lunatc

Hablando en plata: cojonudo!!   :Very Happy: 

----------

## MaROtO

Muy interesante!

Ademas de servirme para conocer cut (ni idea de que existiese  :Rolling Eyes:  ), y de conocer algo mas del portage-emerge: hora ya se como usar los paquetes precompilados!

----------

## alexlm78

Por demas interesante, lo pondremos en practica.

gracias por el dato.

----------

## N0V4K

RadikalQ3 muy muy bueno  :Very Happy:  me a gusto bastante

----------

## RadikalQ3

Que lo disfruteis!  :Smile: 

Estoy con la nueva versión... no me gusta que cuando no haya paquetes salga en el reporte el encabezado.

Y a ver si le pongo colorines, como el emerge  :Smile: 

Por cierto... con una versión adaptada de este script se puede hacer cómodamente un emerge -ek world ...  :Smile: 

----------

## djemili

Hola

he tenido la suerte de encontrar este post ya que era un script asi justo lo que estaba buscando. Aunque me gustaria hacer algun cambio y no se del todo como hacerlo ya que los scripts en sh no se me dan muy bien.

El caso es que tengo un servidor web y se trata de un ordenador algo viejo (un pentium 1)  y al tener bastantes visitas se me satura tanto la conexion como el servidor en el momento que quiero hacer un emerge. Se agrava el caso al haber estado fuera un buen tiempo. Al volver, me di cuenta que hacer una actualizacion significaba tener el servidor saturado durante, posiblemente, algunos dias y se me han ido acumulando las actualizaciones de mala manera.

Por todo eso, me gustaria modificar el script de manera que solo se bajara o compilara actualizaciones entre las 2 am y las 9 am que son las horas en que la web tiene menos visitas. Que el cron active el script a las 2 no creo que me suponga muchos dolores de cabeza pero no se como hacer que el script pare a las 9.

He pensado en cambiar el bucle for en el que se compilan los paquetes 

```
for i in ` cat $TMP_NUEVOS_PAKETES ` ;

```

por un while que se pare si se cumple alguna de las 2 condiciones, es decir, si la variable i alcanza el num de paquetes o si son mas de las 9am. Como podria hacer ese while??

----------

## ackward

Como mejora para que fuera la caña, que compilase los paquetes en otras arquitecturas.

Por ejemplo, tengo un amd64 que se ventila las compilaciones de ebuilds mas rapido que lo que tarda en bajarse un paquete y al lado tengo un athlon a 700 Mhz que cada vez que le tocaba compilar las X tardaba 4h y el record lo tiene con OO que se tiro 18. Lo ideal seria compilar los paquetes en el equipo rapido e instalarlos en el lento. (De hecho esta con debian porque no aguanto no poder actualizarlo diariamente)

----------

## Büldden

Hola, gracias por el script

La verdad es que estoy muy muy interesado en usar este script, pero tengo una serie de dudas/problemillas, los planteo:

1- Dices que esta hecho para ejecutarse con cron, en mi caso esto no mi interesa, pq me gustaria ejecutarlo manualmente cuando a mi me interese, por lo que supongo q tambien se prodra ejecutar manualmente, si no es asi, avisad.

2- Ya que no consigo informacion sobre como usar SMTP con autentificacion y SSL, pues me gustaria si alguien sabe me lo dijese, en este caso seria para usar el smtp de gmail, o en su defecto algun smtp "publico" q no necesite autentificacion y que los mails lleguen, claro.

3- Lo ultimo seria, si hecho a andar el script y por cualquier motivo tengo que pararlo a medio de la compilacion, por ejemplo, tiene q compilar 15 paquetes, y cuando va por el 10 tengo q pararlo forzozamente, ¿que debo hacer?, ¿en que estado quedaria?, ¿que tendria que hacer luego? y por ultimo, ¿igualmente tendria el informe?

Estas son mis dudas, espero que me puedan ayudar, gracias.  :Wink: 

----------

## RadikalQ3

 *Büldden wrote:*   

> 
> 
> 1- me gustaria ejecutarlo manualmente cuando a mi me interese, por lo que supongo q tambien se prodra ejecutar manualmente, si no es asi, avisad.
> 
> 

 

Si, sin problemas.

Yo lo uso con cron porque lo ejecuto en servidores, cuando tienen poca carga.

La ventaja es que cuando quiero actualizarlos, los paquetes (la gran mayoria) ya están compilados, y así no resulta una operación tan tediosa.

 *Büldden wrote:*   

> 
> 
> 3- Lo ultimo seria, si hecho a andar el script y por cualquier motivo tengo que pararlo a medio de la compilacion, por ejemplo, tiene q compilar 15 paquetes, y cuando va por el 10 tengo q pararlo forzozamente, ¿que debo hacer?
> 
> 

 

No hay ningun problema en parar el script y luego retomarlo.

Bueno, solo hay un problema, y es el siguiente: si el script intenta compilar un paquete, y éste falla en su compilacion por cualquier causa, al parar el script y volverlo a ejecutar, volvera a intentar compilar el paquete de nuevo, es decir, hara dos veces el mismo trabajo.

Quitando este comportamiento molesto, el script lo puedes ejecutar cuantas veces quieras, y el informe final será fiel... es decir, te mostrara tanto los paquetes que se han compilado correctamente como los que no, dando igual si lo has parado o no.

----------

## Büldden

he probado el script, habiendo modificado unas cosas en el, las cosas q modifique fueron las siguientes:

- Desactive la opcion sobre el mldonkey, lo demas de la configuracion lo deje tal cual.

- cambié, cuando descarga los paquetes, quedando el comando asi:

```
#Hacemos Download de los paquetes necesarios:

echo " * Descargando los paquetes necesarios ( emerge -uDf world)"

emerge -uDf --newuse world 
```

- Luego tambien cambio esto: añadiendo tb el --newuse

```
#Creamos la lista de los nuevos paquetes a actualizar:

echo " * Creando lista de paquetes a actualizar (emerge -uDp world)"

emerge -uDp --newuse world | grep ebuild | cut -f 2- -d "/" | cut -f 1 -d " " > $TMP_NUEVOS_PAKETES
```

- Tambien quitando la opcion para q compile "en segundo plano" quedaria asi:

```
        then echo "   Compilando: $i"; /usr/bin/emerge -B =$i
```

- Y por ultimo, cambiando las opciones del mail, ya que uso gmail como smtp y necesita SSL y autentificacion:

```
then echo " * Enviando reporte por email a: $EMAIL_DIR"; cat $TMP_REPORT | ssmtp -auUSUARIO@gmail.com -apPASSWD DESTINO@gmail.com
```

en este caso, el usuario y el destino no son los mismo, (esto debiera de funcionar, lo probe a usar por linea de comando y si no mandaba sino un echo "algo" me enviaba el mail vacio, pero si lo hacia con cat (un archivo) lo enviaba bien, bueno lo probe con el archivo de este script y me lo envio bien.

Ahora, los problemas q tengo tras esjetucar el script (como root) son,

1- Compila todo lo que puede, en este caso de cuarenta y pico paquetes creo q no compilo sino dos, pero en el informe final, salen todos como no compilados.

2- El informe final se me envia vacio a la cuenta de mail.

Creo q no me da mas problemas, aun asi, informare si veo algo mas.

Espero q me puedan ayudar, pq realmente esto me quita la preocupacion de estar pendiente a las compilaciones y demas.

Gracias

----------

## Ark del KAOS

Bueno...este script me encanta. Gracias!!!

Pero estoy peleado con el ssmtp.

A ver...me gustaria que me enviase un mail a mi cuenta ark@ellkaos.net...y que utilizase el smtp de ya.com para los dominios, smtp.domadsl.ya.com

¿Que deberia hacer?

Realmente no se por donde pillarlo...ultimamente no doy pie con bola.

Pongo mi configuracion del smtp:

#

# /etc/ssmtp.conf -- a config file for sSMTP sendmail.

#

# The person who gets all mail for userids < 1000

root=postmaster

# The place where the mail goes. The actual machine name is required

# no MX records are consulted. Commonly mailhosts are named mail.domain.com

# The example will fit if you are in domain.com and your mailhub is so named.

# Example for SMTP port number 2525

# mailhub=mail.your.domain:2525

# Example for SMTP port number 25 (Standard/RFC)

mailhub=smtp.domadsl.ya.com        

# Example for SSL encrypted connection

# mailhub=mail.your.domain:465

# Where will the mail seem to come from?

rewriteDomain=shin.elkaos.net

# The full hostname

# Gentoo bug #47562

# Commenting the following line will force ssmtp to figure

# out the hostname itself.

# hostname= _HOSTNAME_

# Set this to never rewrite the "From:" line (unless not given) and to

# use that address in the "from line" of the envelope.

#FromLineOverride=YES

# Use SSL/TLS to send secure messages to server.

UseTLS=YES

# Use SSL/TLS certificate to authenticate against smtp host.

#UseTLSCert=YES

# Use this RSA certificate.

#TLSCert=/etc/ssl/certs/ssmtp.pem

Como veis he cambiado poco, ya que en realidad no sabia lo que estaba haciendo...  :Embarassed: 

----------

## djemili

nadie sabe decirme lo del while hora < 9am ??

quiza se puede hacer mas facil con un IF dentro del bucle que salga del bucle si ya es mas tarde de las 9am.

Si alguien sabe hacer esto en codigo sh me haria un favor:

Si hora_actual > 9:00 entonces Salir del bucle for

saludos!!

----------

## Debcore

 *Quote:*   

> Si alguien sabe hacer esto en codigo sh me haria un favor:
> 
> Si hora_actual > 9:00 entonces Salir del bucle for

 

Te refieres a algo asi?

```
if [ $(date +"%H") -ge 9 ]

then

         break

fi
```

----------

## RadikalQ3

Acabo de editar el post inicial.

He incorporado el limite horario y lo del -newuse al script.

----------

## Büldden

Nose si habeis entendido cual es mi principal problema (tampoco es muy muy  importante) pero le quita utilidad al script, aqui os dejo el reporte que muestra en consola despues de una actualizacion:

```
 * Creando reporte

        ------------------------------------------------------------

               Reporte de actualización del equipo: gentoo

        ------------------------------------------------------------

 * Nuevos paquetes YA COMPILADOS y listos para instalar con emerge -uDk :

 * Nuevos paqutes que NO HAN SIDO COMPILADOS. (Se recomienda compilación manual) :

    - gentoo-dev-sources-2.6.10-r6

    - cups-1.1.23-r1

    - nvidia-kernel-1.0.6629-r1

    - nvidia-glx-1.0.6629-r1

    - imagemagick-6.1.8.8

    - koffice-1.3.5-r2

    - openmotif-2.1.30-r6

    - xpdf-3.00-r8

    - kdegraphics-3.3.2-r2

 * Enviando reporte por mail a: root

 * Actualizacion completada
```

Ese es el resulatado de mi ultima actualizacion, aun cuando realmente los ha compilado todos exitosamente, y no hablemos del mail, porque ese lo envia completamente vacio.

Pues me gustaria que alguien me hechase una mano, pq yo no entiendo mucho de scripts

----------

## RadikalQ3

El problema de que no envie el email, es producido porque estas usando equivocadamente el ssmtp.

El ssmtp, si lo quieres usar desde una linea de script, has de enviarle todas las cabeceras de un email bien conformadas, es decir, casi que has de reproducir el diálogo que hay que hacer cuando uno habla con un servidor smtp.

Para evitar esto, se usa el programilla mail.

El problema es que al parecer, si necesitas autentificarte en el servidor smtp que utilices, el ssmtp no admite pasarle un login y una password de usuario desde su fichero de configuracion, parece que solo lo admite como parámetros desde la linea de comandos.

Para enviar un email a traves de un server smtp con autentificacion, hay otros métodos, por ejemplo, instalarte el mailwrap, que te permite configurar el comando para enviar el email, y ahí mismo, en su fichero de configuración, poner como comando de envio el ssmtp con sus parámetros para que envie el login y el password.

La pega de este metodo es que tu clave quedaria ahí, visible, sin encriptar...

Tienes una explicación de este método en este mensaje

Respecto a lo que de que te informe mal de los paquetes compilados o no... solo te recomiendo que revises tu make.conf, a ver donde defines que tienen que ir los paquetes compilados y, que uses el codigo del script sin modificar... o bien cojas la copia original y cambies solo lo del envio del email, por si hubieras cambiado algo que no tocaba...

El script sabe si el paquete ha sido o no compilado porque busca el paquete en el directorio de paquetes del portage, que es definido en el make.conf con la variable PKGDIR.

Y por ultimo... la cosa esta de incluir el --newuse al final no tiene mucha utilidad en el script, ya que... imaginate que tienes ya creado un paquete del programa, cambias los uses, el script detecta que hay que compilarlo (porque le hemos dicho --newuse) pero a la hora de ver si esta o no ya creado ese paquete, al estarlo previamente no lo compilara de nuevo.

Es decir, el rollo del --newuse sirve si vacias el directorio de paquetes de tu portage, sino no sirve de nada, y a mi no me gusta borrar el directorio de paquetes, ya que uno de mis servers puede completar una compilacion con muchos cambios en varias ejecuciones del script... o bien puedo pararlo si me molesta y continuar en otro momento o... y si borro esos paquetes, me tocara compilar todo de nuevo.

----------

## RadikalQ3

Acabo de encontrar otra solución para el temilla, que es renombrar el ssmtp, y substituirlo por un script en el que llames al ssmtp renombrado y ahí mismo le pases los parámetros de login y clave.

Lo tienes en este otro mensaje:

ssmtp: login to send mail

----------

## chencho

mano de santo el mailwrap, gracias

----------

## Büldden

Pues lo de que el reporte saliera mal, era solo poner en el make.conf el PKGDIR, gracias.

Pero aun usando el mailwrao no consigo q lo envie por mail como es debido, checho si es posible me gustaria q postearas todos los pasos que seguistes, pq yo segui lo que habia en ingles y nada de nada.

gracias

----------

## chencho

pues creo que lo que hice fue emerger mailx ssmtp y mailwrap

/etc/ssmtp/ssmtp.conf:

root=postmaster

mailhub=smtp.gmail.com:465

hostname=el_nombre_asignado_a_tu_ip(vease p.ej  no-ip.com)

UseTLS=YES

/etc/mail/mailer.conf:

sendmail        /usr/sbin/ssmtp -au login -ap pass

send-mail       /usr/sbin/ssmtp -au login -ap pass

mailq           /usr/sbin/ssmtp -au login -ap pass

newaliases      /usr/sbin/ssmtp -au login -ap pass

no se si se me olvida algo, prueba cuando termines:$ mail direccion@recibir.mail

PD:man mail

----------

## Büldden

Gracias, ya me funciona.   :Wink: 

----------

## RadikalQ3

He editado el post inicial, para colocar una nueva versión.

Actualización del 30/01/2005 (Version 3.0)

Eliminado el uso de -newuse (mejor lo haces a mano...)

Añadido colorines a la salida del programa

Añadidas opciones para saber los programas compilados y sin compilar

Añadida opcion para que no realice el emerge sync

Añadida ayuda mediante la opcion -h

Añadida purga del directorio temporal de compilaciones del portage (sino se llena de ficheros gigas y gigas)

En definitiva: cambios estéticos y unas cuantas nuevas opciones para saber en cualquier momento que paquetes están compilados ya y listos para instalar y que paquetes aún no han sido compilados y convertidos en binarios.

Ah, y tambien he eliminado el uso del flag --newuse para que compile los paquetes afectados por un cambio en los flags USE

El asunto es que si un paquete ya fué creado con este script, por mucho que usemos el --newuse el script pensará que ya lo ha compilado (dado que el paquete está en el fichero de paquetes compilados del portage), así que no tenia mucho sentido usar dicho flag en este script, a no ser que borres el directorio de paquetes para que los re-compile de nuevo.

----------

## Büldden

RadikalQ3, tu script promete, y cada vez más, ¿no has pensado en dedicarle una web donde poder seguir los avances de este?, solo es una idea...   :Wink: 

----------

## RadikalQ3

¿Y que tiene de malo ésta? (salvo lo horrible que se vuelve la edicion de un post largo, y mas con el bbcode que falla en Mozilla...aunque ya he buscado una  solucion para el problema... hasta que no recompilen la version CVS de estos foros no estará disponible...

Editado:

Está ya funcionando mi modificación de los foros  :Smile: 

----------

## Büldden

bueno solo era una idea, donde podrias tener una seccion en la posteases tus noticias, descargas del script en ficheros de diferentes versiones .... no se, he visto web de proyectos menos "utiles" que tu script, como dije antes, solo era una idea, si a ti te gusta llevarlo por el foro, adelante tampoco es mala idea y lo tienes en la web oficial de gentoo   :Wink: 

----------

## tomasecastro

Hola RadikalQ3, tengo un error al ejecutar tu script me dice que la sintaxis es invalida en la ultima linea del script, por favor si puedes verificalo, parece que necesitara un final de archivo o algo parecido, Gracias

----------

## RadikalQ3

A ver... la última línea es:

```

rm -f ${TMP_NO_COMPILADOS}
```

Sólo es una linea para borrar un fichero temporal (la lista de los paquetes que no han sido compilados).

A mi no me da ningún error... no sé que decirte... ¿lo has grabado bien?  :Smile: 

----------

## jhigueros

Gracias por el How to buenisimo  :Mr. Green: 

----------

## tomasecastro

No se trabajar muy bien con los script, pero copie textualmente el script en un archivo llamado /bin/pupdate, pero me sigue generenado problemas.

----------

## RadikalQ3

¿Que problemas?

Si te sirve de consuelo, ese script es ejecutado en 6 servidores que administro y nunca me ha dado el mas mínimo problema.

----------

## capira

Hola RadikalQ3.

Llevo usando tu script un tiempo y tengo que decir que es muy bueno y que me ha salvado de muchas horas de trabajo. Aprovecho el momento para darte la gracias.

Por necesidades del trabajo, le he hecho algunas modificaciones que paso a comentarte por si quieres inclurlo en tu script y en el hilo.Posibilidad de hacer 'emerge-webrsync' en lugar de 'emerge --sync'. Donde trabajo sólo está abierto el puerto 80 y sólo podía hacer webrsync

```
...

#Hacer emerge-webrsync y bajar fuentes de golpe al principio

HACER_RSYNC='si'

...

#Actualizamos arbol del portage:

echo " ${VE}*${NO} Sinconizando portage (${AZ}emerge --sync${NO})"

if [ ${HACER_RSYNC} = 'no' ]

then emerge --sync

else emerge-webrsync

fi

...
```

He ampliado el nombre del paquete para incluir la categoría. Algunos paquetes son ambiguos porque tienen el mismo nombre que otro perteneciente a una categoría diferente (como últimamente están cambiando los USE_FLAGS en algunos paquetes, he incluido la opción '-N' pero puedes eliminarla)

```
...

#emerge -uDp world | grep ebuild | cut -f 2- -d "/" | cut -f 1 -d " " > ${TMP_NUEVOS_PAKETES}

emerge -NuDp world > ${TMP_EMERGE}

cat ${TMP_EMERGE} | grep ebuild | cut -f 2- -d "]" | cut -f 2 -d " " > ${TMP_NUEVOS_PAKETES}

...
```

Al cambiar el punto anterior, he cambiado también la forma de comprobar los paquetes compilados. Este cambio lo he hecho en diferentes partes del código porque se repite

```
...

#     if [ ! -f ${PKGDIR}/All/$i.tbz2 ]

      if [ ! -f ${PKGDIR}/$i.tbz2 ]

...
```

He ampliado la descripción de los paquetes NO compilados, incluyendo que paquetes son necesarios que estén instalados para que estos se compilen

```
...

echo "  - $i" >> ${TMP_NO_COMPILADOS}

PARTE_DCHA=` echo $i | cut -f 2 -d "/" `

for j in ` emerge -vp =$i | grep ebuild | cut -f 2- -d "]" | cut -f 2 -d " " | grep -v "${PARTE_DCHA}" `

do

   if [ -f ${PKGDIR}/$j.tbz2 ]

   then echo "     depende de: [*] $j" >> ${TMP_NO_COMPILADOS}

   else echo "     depende de: [ ] $j" >> ${TMP_NO_COMPILADOS}

   fi

done

...
```

Lo siguiente que quiero incluir en el script sería poder detectar cuando hay otros conflictos: paquetes MASKED y paquetes BLOCKED, de manera que se pueda avisar. Ahora mismo da un error y envia un reporte vacío.

Saludos.

----------

## ekz

Capira, tambien puedes probar emerge-delta-webrsync, que solo añade los cambios realizados por dia al arbol de portage bajando un pequeño fichero.

----------

## capira

Hola a todos.

He revisado el script he intentado mejorarlo de distintas maneras (algunas ya las publiqué en este mismo hilo). Me he puesto en contacto con RadikalQ3 y me ha comentado que él ya no esta involucrado en Gentoo (  :Crying or Very sad:  ) y que podía cambiar el script a mi criterio.

Ahora mismo estoy usando una versión del script mejorada que os pongo a continuación. He respetado el trabajo anterior en la medida de lo posible y he comentado algunas líneas que ahora mismo no se utilizan.

```
#! /bin/sh

# ----------------------------------------------------------------------------

# pupdate

# Script para actualizar el portage mediante un evento desatendido

# Se trata de realizar el quivalente a:

#   emerge sync ; emerge -NvuDp 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.3-r1 alfa 04/12/2006 capira

# - Mejora del algoritmo para la gestión de los paquetes que hay

#   que reconstruir

#

# Version 3.3 alfa 25/11/2006 capira

# - Detección de paquetes que hay que reconstruir pero que fallan

#   porque ya hay un paquete binario contruido previamente

#

# Version 3.2 alfa 19/10/2006 capira

# - Añadido detección de bloqueos (pendiente de probar y mejorar)

#

# Version 3.1 alfa 11/10/2006 capira

# - Añadido una variable, HACER_RSYNC, para hacer 'emerge --sync' o

#   'emerge-webrsync'

# - Modificada la llamada para obtener la lista de paquetes a compilar,

#   añadiendo la opcion 'N' (comprobación de USE_FLAGS nuevas)

# - Ampliado el nombre del paquete: <categoría>/<paquete>-<version>

#

# 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

# ----------------------------------------------------------------------------

#**************************************************************

#      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 conteniendo la lista de los paquetes recompilados:

TMP_NUEVOS_REBUILD='/tmp/pupdate-rebuild'

#Fichero temporal para albergar la lista de paquetes ya compilados

TMP_COMPILADOS='/tmp/pupdate-c'

#Fichero temporal para albergar la lista de paquetes ya compilados

TMP_EMERGE='/tmp/pupdate-emerge'

#Fichero temporal para albergar la lista de paquetes sin compilar

TMP_NO_COMPILADOS='/tmp/pupdate-sc'

#Fichero para no borrar paquetes que van a ser recompilados, pero

#que ya han sido recompilados previamente

PUPDATE_REBUILD='/var/log/pupdate/emerge_rebuild'

#Hacer emerge sync y bajar fuentes de golpe al principio:

HACER_SYNC='si'

#Hacer emerge-webrsync y bajar fuentes de golpe al principio

HACER_RSYNC='no'

#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=''

#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='no'

#**************<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 - "

VERSION="3.3-r1 alfa"

#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 | 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

}

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})"

   if [ ${HACER_RSYNC} = 'no' ]

   then emerge --sync

   else emerge-webrsync

   fi

   #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 purga_rebuild {

   echo " ${VE}*${NO} Limpiando todos los paquetes que hay que recompilar:"

   touch ${PUPDATE_REBUILD}

   for i in ` cat ${TMP_EMERGE} | grep ' R ' | cut -f 2- -d "]" | cut -f 2 -d " " ` ;

   do

#      TMP_I=` grep $i ${TMP_EMERGE} `

      if [ ` grep ${TMP_EMERGE} ${PUPDATE_REBUILD} | wc -l ` = '0' ]

      then

         if [ -f ${PKGDIR}/$i.tbz2 ]

#            then echo "Limpiando el paquete ${TMP_I}"

         then

            echo "    - Borramos el paquete ${AZ}${PKGDIR}/$i.tbz2${NO}"

            rm -f ${PKGDIR}/$i.tbz2

            rm -f ${PKGDIR}/All/$i.tbz2

         fi

      fi

   done

}

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 ]

      if [ ! -f ${PKGDIR}/$i.tbz2 ]

      then

         if [ $(date +"%H:%M") \< $HORA_LIMITE ]

         then

            echo "   Compilando: $i"

            /usr/bin/nice -n +19 /usr/bin/emerge -B =$i

            TMP_I=` grep $i ${TMP_EMERGE} `

            if [ ` echo ${TMP_I} | grep ' R ' | wc -l ` = 1 ]

            then

               echo $i >> ${TMP_NUEVOS_REBUILD}

               echo ${TMP_I} >> ${PUPDATE_REBUILD}

            fi

         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 "     

----------

## LinuxBlues

 *capira wrote:*   

> Me he puesto en contacto con RadikalQ3 y me ha comentado que él ya no esta involucrado en Gentoo (  ) y que podía cambiar el script a mi criterio.

 

Tal y como comenta: vive en el planeta tierra.   :Laughing: 

Te recomiendo ututo.

----------

## pacho2

Ah, otra distribución basada en gentoo   :Cool:  , se ve que gentoo es una buena base  :Wink: 

----------

## Palmax Maverick

Buenos días

En primer lugar, he regresado jejeje. Ahora en serio, la verdad es que me conecté en el foro porque estaba buscando algo similar a esto. Yo me hice un update.sh y luego puse que el anacron (http://anacron.sourceforge.net/) lo lanzara 5 minutos después de iniciar y/o diariamente.

El problema es que lo perdí y me dije alguien habrá hecho un paquete que haga esto.

La pregunta es ¿existe? Lo más parecido que he encontrado ha sido este script, pero como tiene mucho tiempo siempre da un poco de cosa probarlo, aunque bueno parece que hace lo que debe hacer. La verdad es que mi niveles de bash scriptting no son tan avanzados para entenderlo jejeje.

De todas formas, creo que siempre es mejor utilizar anacron que cualquier otro cron, ya que la ventaja de que se te pudiera caer la máquina o simplemente que la apagues y luego la enciendas es enorme.

Un saludo

Palmax

----------

## capira

Buenas.

Yo sigo utilizando el script que publiqué en este mismo foro sin problemas.

Saludos

----------

## Palmax Maverick

¿No hay que hacer un revdep-rebuild por si acaso?

----------

## capira

Pues la verdad es que sí, quizás debería, pero como realmente no instala, sino que prepara los paquetes para su instalación puede que no tenga el efecto deseado. Se puede modificar para que haga una instalación desasistida si no hay conflictos y que luego haga revdep-rebuild ... Voy a mirar como sería y te cuento

----------

## Palmax Maverick

¿Ha habido suerte?

----------

## cpasoft

Hola a todos...

Este script es muy interesante, gracias a los que os lo habéis currado...

Sin embargo hay un pequeño "gazapo"...

En este trozito de código:

```

#Si no está definida la variable PKGDIR, no continuamos

if [ ${PKGDIR}NORL = 'NORL' ]

then

  echo "${RO}ERROR:${NO} Debes setear la variable PKDGIR 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: PKDGIR=/usr/portage/packages"

  exit 1

fi 

```

... donde pone PKDGIR, debería poner PKGDIR... Es una chorraica, pero ahí está...  :Wink: 

----------

