Sencillo script para los frikis del kernel xD

He escrito un mini-script para ser los primeros en enterarnos de que sale un nuevo kernel y asi poder bajarlo (y mirrorearlo [ginyo] ) antes de la tipica saturacion de kernel.org
Tan solo teneis que ponerlo en el cron para que se ejecute regularmente y usar root-tail para mostrarlo en la pantalla.
Aqui esta el código
#Variables
WWW="http://www.kernel.org/kdist/finger_banner"
DIR="$HOME/.kernelog"
LOGFILE="/tmp/log"

if ! [ -d $DIR ]; then #si el directorio del script no existe
  mkdir $HOME/.kernelog #se crea
fi
cd $DIR
wget $WWW -O wgetkernel.log #Descarga el fichero y lo guarda con el nombre especificado
if ! [ -e kernel* ]; then #si no existe el registro anterior
  cat wgetkernel.log >> $LOGFILE #se mete todo en el $LOG
  mv wgetkernel.log kernel`date +%T_%F`.log #y el otro se le pone la fecha (aunque me acabo de dar cuenta que sobra, ya que el ls -l tambien lo podria hacer :P)
else
  diff wgetkernel.log kernel* #Esto mira si hay lineas distintas
#Observad que $? vale 1 si hay diferencias y 0 si no las hay
  if [ $? -eq 1 ]; then #si las hay, entonces escribimos en el log
    echo "Actualización del kernel `date`" >> $LOGFILE #Pone fecha
    diff wgetkernel.log kernel* | grep "<" >> $LOGFILE #Pone las diferencias
  fi
  rm kernel* #un poco de limpieza
  mv wgetkernel.log kernel`date +%T_%F`.log
fi


Apuntes:
- Solo lo he probado con fluxbox, en xfce4 no me funciona O_o Tened en cuenta que es posible que no funcione en los escritorios que usen iconos :(
- el comando de root-tail supongo que podreis lanzarlo en el .xinitrc. Si teneis algun problema, notificadlo aqui o en mi web ^^

Saludos
Edito: se me olvidaba el comando de root-tail xD
root-tail -g 80x10+20+20 /tmp/log,green
Experimentad con el para obtener el resultado deseado ;)

Vuelvo a editar: He añadido algunos comentarios rapidos, si alguien quiere preguntar alguna cuestion de scripting que no se corte ;)
Acabas de llevarte el nº1 en la competicion oficial de EOL de scripts frikis :D :D :D :D
un consejo y q sirva para possibles nuevos scripts. Intentar en lo q sea posible explicar para q sirve cada comando o almenos comentar un poco el codigo. Hay mucha gente q aunque vea el codigo no entendera q es lo q hace y podria ser interesante q la gente se enterara de cosas como q wget sirve para descargar webs via http o ftp o q la opcion "-o wgetkernel.log
" Escribe los ficheros de log en wgetkernel.log en vez de stdout

Es simplemente un consejo y en el caso q nos ocupa, el script no es tan largo para comentarlo un poquito. La gente se abruma cuando ve un script, y no se dan cuenta de q el scrpiting es un arte muy facil y util


Saludos
- Solo lo he probado con fluxbox, en xfce4 no me funciona O_o Tened en cuenta que es posible que no funcione en los escritorios que usen iconos

No entiendo a que te refieres con esto. ¿No estamos hablando de un script shell? Explícate pofavó ein?
He añadido unos cuantos comentarios ^^U si alguien tiene alguna duda que pregunte, que no le voy a cortar la cabeza por eso xD, para todo lo demas master man.
Respecto a que no funciona en xfce4 es el root-tail, el script va bien, pero si tienes que ver el fichero a mano no tiene mucha gracia el asunto XD

Saludos
Escrito originalmente por Raharu
He añadido unos cuantos comentarios ^^U


Mucho mejor, en nombre de la comunidad.... Gracias
Escrito originalmente por Raharu
He añadido unos cuantos comentarios ^^U si alguien tiene alguna duda que pregunte, que no le voy a cortar la cabeza por eso xD, para todo lo demas master man.
Respecto a que no funciona en xfce4 es el root-tail, el script va bien, pero si tienes que ver el fichero a mano no tiene mucha gracia el asunto XD

Saludos


Un par de apuntes/ideas, aunque a lo mejor me equivoco, porque soy un poco malo para seguir programas sin probarlos:

La ventanita sale siempre que se arrancan las X, haya o no cambios, ¿no sería mejor que sólo saliese un aviso, si ha salido un nuevo kernel.

Abundando en esto, no sería mejor que en el propio script incluyeses la llamada a root-tail (si las X están en marcha) y que, además, si en vez de volcar todo el log, sólo das un aviso de actualización uses festival para leerlo. Así, si no estás en las X o estás pero el root-tail no va, al menos escucharás el aviso.
perfecto auxiliar... mejoremos el script. Si puedes y raharu te lo permite, da unas pinceladas al codigo

saludos
Basicamente es que tenia en mente ir haciendo mas scripts para crear un /tmp/log a mi gusto. El root-tail se carga al arrancar las X y tengo ahi todas las cositas que me interesen. De todas formas, esta claro que podria ser mucho mas espectacular, usando el speechd, podria avisarme una seductora voz :O Haciendo un echo al /dev/speechd creo que ya se conseguia :)
De todas formas, no lo he pulido mucho, lo he hecho funcionar y punto, pero sois libres de modificarlo

Saludos
Escrito originalmente por Raharu
De todas formas, no lo he pulido mucho, lo he hecho funcionar y punto, pero sois libres de modificarlo


La verdad es que soy de los que no se toma muchas prisas en cambiar el kernel, si funciona y no necesito más, no me preocupo. De todos modos ahí va mi versión del script:

#!/bin/sh

FILE="finger_banner"
WWW="http://www.kernel.org/kdist/$FILE"
DIR="$HOME/.kernelog"

[ -d $DIR ] || mkdir $DIR  # En caso de que no exista el directorio

# Bajamos finger_banner sólo si hay una versión nueva en el servidor
cd $DIR
LC_ALL="en" wget -o wget.log -N $WWW

# Si en el log aparece "saved", ha habido cambios en finger_banner
if grep "$FILE.*saved" wget.log > /dev/null; then
   if ps ax | grep /usr/bin/X11/X > /dev/null; then   # X en marcha
      root-tail -g 80x10+20+20 "$DIR/$FILE"
   fi
   echo "Actualización en el kérnel" | festival --tts --language spanish
fi


Algunas notas:

  • He cambiado un poco la forma de comprobar si hay una actualización. En vez de bajar el fichero y hacer un diff, le indico a wget (con la opción -N) que sólo baje finger_banner si hay una versión más nueva en el servidor de la que tengo yo. Luego, mirando el log (wget.log) puedo llegar a saber qué ha hecho wget.
  • No doy información sobre la hora, porque la idea es meterlo en el cron y que festival y root-tail avisen instantáneamente (y no al iniciar las X); Por esto, el cambio se ha debido producir recientemente: todo depende del intervalo de tiempo que pongamos en el cron.
  • El root-tail ni lo tengo instalado, así que supongo que funcionará lo que he puesto (fusilado de Raharu).
  • Evidentemente hace falta tener instalado festival, que es un programa de sintetización de la voz, y el hablante castellano (aunque a lo mejor os mola que se dé el aviso a lo "Bush"). Supongo que estará en las principales distribuciones. Para debian basta hacer: "apt-get install festival festvox-ellpc11k"
#!/bin/sh

ups :P

vaya, veo que lo has mejorado bastante :) Esa opción del wget no la conocia y parece bastante interesante (-N) Lo que no acabo de ver es porque defines el LC_ALL antes del wget (algun lio de locales que no entenderé seguramente XD)

Saludos
auxiliar veo por esta vez y por otras q has posteado, q eres muy refinado y preciso haciendo scripts. Gracias por postear en esta comunidad y contribui a su mejora.

Muchos años de experiencia?
Un par de mejoras...

#!/bin/sh

FILE="finger_banner"
WWW="http://www.kernel.org/kdist/$FILE"
DIR="$HOME/.kernelog"
use_mail = 1

[ -d $DIR ] || mkdir $DIR  # En caso de que no exista el directorio

# Bajamos finger_banner sólo si hay una versión nueva en el servidor
cd $DIR
LC_ALL="en" wget -o wget.log -N $WWW

# Si en el log aparece "saved", ha habido cambios en finger_banner
if grep "$FILE.*saved" wget.log > /dev/null; then
   if ps ax | grep /usr/bin/X11/X > /dev/null; then   # X en marcha
      root-tail -g 80x10+20+20 "$DIR/$FILE"
   fi
        # En caso de que no tengamos festival, no lo ejecutamos
        if test (-x "`which festival`") -o ($use_mail -eq 1)
        then
           echo "Actualización en el kérnel" | festival --tts --language spanish
        # Si tenemos mutt, podemos mandarnos un mail
        else if test (-x "`which mutt`") -o ($use_mail -eq 1)
        then
                echo "Actualizaión en el kernel" | mutt -s "Actualización en el kernel" `whoami`@`hostname -d`
        fi
fi

un par de comprobaciones simples, no mas...

Salu2.Ferdy
tendremos un script cojonudo al final :P
Para aquellos que usan/usamos {flux,black,open}box. En el fichero de menu ponemos algo parecido a:

[submenu] (Kernel)
        [include] (~/.fluxbox/kernel.menu)
[end]


Luego en el script ponemos algo parecido a esto:
cat $FILE | sed -e 's:^:[exec] (:g' -e 's:$:) { echo n > /dev/null }:g' > ~/.fluxbox/kernel.menu


Y se mostrará un perfectisimo submenu del fluxbox muy friki pa aquellos que quieran jeje :)

Salu2.Ferdy
joer Ferdy, asi da gusto hacer cualquier cosa, porque al cabo de unas horas lo tengo con el doble de prestaciones [Alaa!] Mañana a ver si los pruebo todos xD

Saludos
El LC_ALL="en" lo hago para asegurarme de que wget me va a responder en inglés, no vaya a ser en algún idioma no ponga "saved", sino otra palabra.

Muy buena la aportación de Ferdy de mandar un correo. Es lo más evidente. De todos modos, yo no usaría mutt, porque puede que no esté en todos los ordenadores. En vez de mutt usaría mail que sí suele estar instalado siempre. Incluso si se me apura, directamente sendmail. Las dos alternativas en código son:

echo -e "To: `whoami`@`hostname`\nSubject:Actualización del kernel\n\n" | /usr/sbin/sendmail -t


o bien,
echo | mail -s "Actualización del kernel" `whoami`@`hostname`


Cualquiera de estas alternativas sustituiría a la parte referente a mutt en el código de Ferdy. Se puede si se quiere (como propone Ferdy), hacer comprobaciones de que existe el ejecutable con un if.

Con una de estas dos líneas (sobre todo la primera) casi nos podemos asegurar que llegará el correo: casi todos (¿todos?) los ordenadores unix tienen un servidor de correo, aunque no se use.
Escrito originalmente por Ferdy
Un par de mejoras...


Me acabo de mirar mejor tu script y creo que se te ha colado un fallo en los if con test: requieren condiciones copulativas (y/and), no disyuntivas.

Lo que sí que me parece que no sobra en absoluto es el mensaje de correo. En cambio festival es más bien una frivolidad. En fin, que con estas ideas y las que ya expuse yo lo dejaría así:

#!/bin/sh

FILE="finger_banner"
SENDMAIL="/usr/sbin/sendmail"
WWW="http://www.kernel.org/kdist/$FILE"
DIR="$HOME/.kernelog"
PARLANCHIN=1  # 0 si no queremos aviso sonoro

[ -d $DIR ] || mkdir $DIR  # En caso de que no exista el directorio

# Bajamos finger_banner sólo si hay una versión nueva en el servidor
cd $DIR
LC_ALL="en" wget -o wget.log -N $WWW

# Si en el log aparece "saved", ha habido cambios en finger_banner
if grep "$FILE.*saved" wget.log > /dev/null; then
   if ps ax | grep /usr/bin/X11/X > /dev/null; then
      root-tail -g 80x10+20+20 "$DIR/$FILE"
   fi
   if [ -x $SENDMAIL ]; then  # Enviamos un correo
      echo -e "To: `whoami`@`hostname`\nSubject: Actualización del kernel\n\n" | $SENDMAIL -t
   fi
   if [ -x `which festival` ] && [ $PARLANCHIN -eq 1 ]; then  # Aviso sonoro
      echo "Actualización en el kérnel" | festival --tts --language spanish
   fi
fi
¿Me haceís uno para cuando suba el pan? Me vendría muy bien, es que suelo ir con el dinero justo... XD
Sóis unos fieras.
PD: Si me mandase un mensaje al móvil mejor que mejor.[qmparto]

Un saludo
Escrito originalmente por musikal
¿Me haceís uno para cuando suba el pan? Me vendría muy bien, es que suelo ir con el dinero justo... XD


#!/bin/sh

FILE="ultipc.xls"
WWW="http://www.ine.es/daco/daco42/daco421/$FILE"

cd /tmp
if LC_ALL="en" wget -o wget.log $WWW; then
   if grep "$FILE.*saved" wget.log > /dev/null; then
      PAN=$(xlhtml -nc $FILE | w3m -cols 500 -T text/html -dump | awk '/02\..*Pan/ {print $3}' FS="| [ |]+" | tr -cd /0-9-/)
      if [ $PAN -gt 0 ]; then
         echo "Lo siento, `whoami`, pero vamos a tener que apretarnos el cinturón"
      else
         echo "Este mes ha habido suertecilla y el pan no ha subido"
      fi
   fi
else
   echo "No ha sido posible encontrar $WWW/$FILE"
   echo "Puede deberse a un problema con su red o"
   echo "a un cambio en el servidor del INE."
   echo "Compruébelo en [url]http://www.ine.es[/url]"
fi
auxiliar, tienes toda la razon, los condicionales mios estaban mal :)


Salu2.Ferdy
Escrito originalmente por escufi

Muchos años de experiencia?


No, en realidad fueron muchos meses de no decidirme a aprender perl.
21 respuestas