Slackware Updates Checker

Introduzione

Chi vuole la propria slackware-current alla -currentissima, si trova a monitorare continuamente il ChangeLog di Slackware mettendolo come home della macchina o lanciando slackpkg ogni ora o altro.

Io mi sono fatto uno script che si lancia come demone e notifica nella system tray di kde la presenza di nuovi aggiornamenti.

Nota: Lo script è studiato per kde; chi usa xfce o altro può comunque provare se funziona; in caso contrario può utilizzare il progetto Updates checker per conky che è simile però usa conky al posto del subsystem di kde

v. la discussione sul forum

Il funzionamento

Lo script si starta come demone ed effettua un controllo periodico (default=1 minuto) con slackpkg per controllare se ci sono aggiornamenti.

In caso positivo viene inviato un avviso nel sistema di notification di kde con la lista degli aggiornamenti disponibili. Dopo aver notificato la cosa, lo script fermerà il check per evitare una successiva notifica ogni minuto.

Lo script NON ESEGUE ALCUN AGGIORNAMENTO!!! L'utente dovrà autonomamente lanciare il classico slackpkg update.

Lo script aspetterà un'ora dopodichè se questo non è stato fatto provvederà a ricordare all'utente che ci sono aggiornamenti.


Tutti i tempi di cui sopra sono parametrizzabili in un file di configurazione esterno.

News

23/09/2010: Versione 1.0 rilasciata.

Lo script

Potete prendere lo script, salvarlo e renderlo eseguibile con chmod +x; io l'ho chiamato 'slack-updates'. Lo potete salvare nella vostra home o in /usr/bin o (consigliato) in $HOME/.kde/Autostart in modo che si avvii automaticamente.

Per avviarlo manualmente lanciare ./slack-updates senza parametri come utente (va lanciato con lo stesso utente con cui kde è running); ritornerà subito il prompt e verrà notificato dall'alerter di sistema che è stato lanciato.

Per fermarlo digitare ./slack-updates stop

#!/bin/bash
 
# slack-updates -> Controlla periodicamente la presenza di aggiornamenti slackware e avvisa tramite kde-alert
 
# by Matteo Rossini ( zerouno @ slacky.it )
#
# versione 1.0
#
# news:
#   1.0: Script rilasciato 
 
# DEFAULT VALUE. DO NOT CHANGE. USE ~/.slack-updates.rc INSTEAD
 
PRGNAME=$(basename $0)
RC=.slack-updates.rc
PIDFILE=/tmp/slack-updates.pid
MIN_INTERVAL=60
MAX_INTERVAL=3600
RETRY_INTERVAL=60
REPEATUPDATES=0
 
ACT="start"
if [ $# -gt 0 ];then
  for P in $*;do
    case $1 in
      "--proxy") shift; export PROXY=$1; shift;;
      "start") ACT="start";;
      "stop") ACT="stop";;
      *) usage; exit 1;;
    esac
  done
fi
 
if [ -e ~/$RC ];then
  . ~/$RC
fi
if [ ! -z "$PROXY" ];then
  export http_proxy=$PROXY
  export https_proxy=$PROXY
  export ftp_proxy=$PROXY
fi
 
function message(){
  TIME=0
  if [ "$1" == "-t" ];then
    TIME=$2
    shift 2
  fi
  if tty 2>/dev/null|grep -q dev;then
    echo "$*"
  else
    kdialog --passivepopup "$*" $TIME
  fi
  sleep $[$TIME+1]
 
}
 
 
 
do_start() {
 
  if [ -e $PIDFILE ];then
    if ps $(cat $PIDFILE) 2>/dev/null|grep -q $PRGNAME;then
      echo "Demone già avviato."
      exit 1
    else
      rm $PIDFILE
    fi
  fi
  LAUNCHDAEMON=$$ 
  export LAUNCHDAEMON
  $0 &
  echo "$!" > $PIDFILE
  exit
}
do_stop(){
  if [ ! -e $PIDFILE ];then
    echo "Demone non avviato"
    exit
  fi
  kill `cat $PIDFILE` 2>/dev/null
  rm $PIDFILE
  exit
}
 
usage(){
  echo "Usage: $0 { start | stop }"
}
 
if [ -z "$LAUNCHDAEMON" ];then
  ## LAUNCHER
 
  if [ "$ACT" == "start" ];then do_start
  elif [ "$ACT" == "stop" ];then do_stop
  else usage
  fi
  exit
 
fi
 
 
 
 
 
## DEMONE VERO E PROPRIO
 
if [ ! -z "$LAUNCHDAEMON" ];then
  INTERVAL=$MIN_INTERVAL
 
  MSG="Check Update started. "
  if [ ! -z "$http_proxy" ];then
    MSG="$MSG Using proxy $http_proxy."
  fi
  message -t 2 "$MSG"
 
  NEWUPDATE=0
 
  while true;do
    PID=$(ls /var/lock/slackpkg.* 2>/dev/null|sed 's/^.*\.\([0-9]*\)$/\1/'|head -1)
    if [ ! -z "$PID" ];then
      if ps $PID 2>/dev/null|grep -q slackpkg ;then
       sleep $RETRY_INTERVAL
       continue
      else
       rm -f /var/lock/slackpkg.* >/dev/null 2>&1
       rm -f /tmp/slackpkg.* >/dev/null 2>&1
       sleep $RETRY_INTERVAL
       continue
      fi
    fi
    U=$(slackpkg check-updates)
    if [ $? -ne 0 ];then
      sleep $RETRY_INTERVAL
      continue
    fi
    echo $U|grep -q "News on ChangeLog.txt"
    NEWS=$?
 
    DATE="$(date '+%a %H:%M')"
    if [ $NEWS -eq 0 ];then
      if [ $NEWUPDATE -ne 0 ];then
       message -t 3 "$DATE: Sono stati trovati aggiornamenti per slackware"
      else
       message -t 7 "$DATE: Trovati nuovi aggiornamenti per slackware:
 
$(wget -q -O - $(grep -v \# /etc/slackpkg/mirrors)/ChangeLog.txt 2>/dev/null| diff - /var/lib/slackpkg/ChangeLog.txt|grep '^<'|cut -c3-|grep ^[a-z])"
 
      fi
      INTERVAL=$MAX_INTERVAL
      NEWUPDATE=$[1-$REPEATUPDATES]
    else
      NEWUPDATE=0
      INTERVAL=$MIN_INTERVAL
    fi
 
    sleep $INTERVAL
  done
fi

Configurazione

Questo script consente la personalizzazione di alcuni parametri con un file di configurazione .slack-update.rc da inserire nella propria home.

## Il path del pidfile.
#default /tmp/slack-updates.pid
#PIDFILE=/tmp/slack-updates.pid

## il tempo tra un controllo e l'altro.
#default 60 secondi
#MIN_INTERVAL=60

## se ci sono nuovi aggiornamenti ricordamelo più tardi.
#default 3600 secondi
#MAX_INTERVAL=3600

## se fallisce il check riprova dopo.
#default 60 secondi
#RETRY_INTERVAL=60 

## usa il proxy. se vuoto usa le variabili di ambiente http_proxy e ftp_proxy
#default vuoto
#PROXY=

## negli avvisi di update trovati ripeti la lista dei pacchetti
#default 0 (no)
REPEATUPDATES=1

PIDFILE: Il pidfile del processo; default /tmp/slack-updates

MIN_INTERVAL: Il tempo tra un controllo e un altro; default 60 secondi

MAX_INTERVAL: Il tempo di "ricordamelo più tardi"; default 3600 secondi

PROXY: Specifica il proxy da usare; se non specificato usa le variabili di ambiente http_proxy/ftp_proxy; se non settate non usa il proxy; default vuoto

REPEATUPDATES: Quando lo script ti ricorda che ci sono aggiornamenti, di default non ti dice quali. Settando ad 1, oltre alla segnalazione ti ripete anche la lista; default 0 (non ripetere)