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 -> Check for slackware upgrades using slackpkg
# Send alert in system tray
#
# by Matteo Rossini ( zerouno @ slacky.it )
#
#
# 23/09/2010 - Version 1.0
#   Released on slacky.eu
#
# 05/09/2013 - Version 1.1
#   Some fix
#
# 22/05/2015 - Version 1.2
#   Translated in english
#
 
 
# DEFAULT VALUES. DO NOT CHANGE. USE ~/.slack-updates.rc INSTEAD
 
PRGNAME=$(basename $0)
RC=.slack-updates.rc
PIDFILE=/tmp/slack-updates.pid
MIN_INTERVAL=3600
MAX_INTERVAL=3600
RETRY_INTERVAL=600
REPEATUPDATES=0
FIRSTRUN=1
 
 
function message(){
  TIME=0
  if [ "$1" == "-t" ];then
    TIME=$2
    shift 2
  fi
  if tty 2>/dev/null|grep -q dev;then
    kdialog --passivepopup "$*" $TIME
    echo "$*"
  else
    kdialog --passivepopup "$*" $TIME
  fi
  sleep $[$TIME+1]
 
}
 
 
function check_module() {
    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
        echo "slackpkg already running"
        sleep $RETRY_INTERVAL
        return 2
      else
        echo "removing pidfile"
        rm -rf /var/lock/slackpkg.* # >/dev/null 2>&1
        rm -rf /tmp/slackpkg.* # >/dev/null 2>&1
        sleep $RETRY_INTERVAL
        return 2
      fi
    fi
 
    U=$(/usr/sbin/slackpkg check-updates)
    if [ $? -ne 0 ];then
      message "check-updates error"
      sleep $RETRY_INTERVAL
      return 2
    fi
    echo $U|grep -q "News on ChangeLog.txt"
    NEWS=$?
 
    DATE="$(date '+%a %H:%M')"
    if [ $NEWS -eq 0 ];then
      message -t 3 "$DATE: News on ChangeLog."
      cp /var/lib/slackpkg/ChangeLog.txt /tmp/ChangeLog.txt.orig
      echo "$DATE: Download ChangeLog... wait"
      echo "N"|sudo slackpkg update >/dev/null 2>&1
      echo "$DATE: Download Done."
      message -t 10 "$DATE: ChangeLog:
 
$(diff /tmp/ChangeLog.txt.orig /var/lib/slackpkg/ChangeLog.txt |grep '^>'|cut -c3-)"
    fi
    if [ $NEWS -eq 0 -o $FIRSTRUN -eq 1 ];then
      FIRSTRUN=0
      echo "$DATE: Check system updates"
      UPPKG="$(echo n|sudo slackpkg -dialog=off install-new|grep \.t.z$|sed 's/^/New:      /'; echo n|sudo slackpkg -dialog=off upgrade-all|grep \.t.z$|sed 's/^/Upgraded: /')"
      if [ -z "$UPPKG" ];then
        message -t 3 "$DATE: System is uptodated"
      else
        message -t 50 "$DATE: available packages:
$UPPKG"
      fi
      return $NEWS
    else
      #message "$DATE: Nessun nuovo changelog"
      return 3
    fi
}
 
 
 
 
function do_start() {
 
  if [ -e $PIDFILE ];then
    if ps $(cat $PIDFILE) 2>/dev/null|grep -q $PRGNAME;then
      echo "Daemon already running"
      exit 1
    else
      rm $PIDFILE
    fi
  fi
  LAUNCHDAEMON=$$ 
  export LAUNCHDAEMON
  $0 &
  echo "$!" > $PIDFILE
  exit
}
function do_stop(){
  if [ ! -e $PIDFILE ];then
    echo "Daemon not running"
    exit
  fi
  kill `cat $PIDFILE` 2>/dev/null
  rm $PIDFILE
  exit
}
 
function do_restart(){
  if [ ! -e $PIDFILE ];then
    echo "Daemon not running"
    exit
  fi
  kill `cat $PIDFILE` 2>/dev/null
  rm $PIDFILE
 
  if [ -e $PIDFILE ];then
    if ps $(cat $PIDFILE) 2>/dev/null|grep -q $PRGNAME;then
      echo "Daemon already running"
      exit 1
    else
      rm $PIDFILE
    fi
  fi
  LAUNCHDAEMON=$$ 
  export LAUNCHDAEMON
  $0 &
  echo "$!" > $PIDFILE
  exit
}
 
function usage(){
  echo "Usage: $0 { start | stop | restart }"
}
 
 
 
function old_check_module(){
 
    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
        return 2
      else
        rm -f /var/lock/slackpkg.* >/dev/null 2>&1
        rm -f /tmp/slackpkg.* >/dev/null 2>&1
        sleep $RETRY_INTERVAL
        return 2
      fi
    fi
    U=$(/usr/sbin/slackpkg check-updates)
    if [ $? -ne 0 ];then
      sleep $RETRY_INTERVAL
      return 2
    fi
    echo $U|grep -q "News on ChangeLog.txt"
    NEWS=$?
    if [ $NEWS -eq 0 ];then
      if [ $NEWUPDATE -ne 0 ];then
        message -t 3 "$DATE: Found slackware updates:"
      else
        message -t 7 "$DATE: Found new slackware updates:
 
$(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
    fi
    return $NEWS
}
 
 
function launch_daemon(){
 
## THE DAEMON
 
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
    check_module
    NEWS=$?
 
    if [ $NEWS -eq 0 ];then
      INTERVAL=$MAX_INTERVAL
      NEWUPDATE=$[1-$REPEATUPDATES]
    elif [ $NEWS -eq 1 ];then
      NEWUPDATE=0
      INTERVAL=$MIN_INTERVAL
    elif [ $NEWS -eq 2 ];then
      continue
    fi
 
    sleep $INTERVAL
  done
fi
 
}
 
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";;
      "restart") ACT="restart";;
      *) 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
 
if [ -z "$LAUNCHDAEMON" ];then
  ## LAUNCHER
 
  if [ "$ACT" == "start" ];then do_start
  elif [ "$ACT" == "stop" ];then do_stop
  elif [ "$ACT" == "restart" ];then ( do_restart )
  else usage
  fi
  exit
 
fi
 
launch_daemon

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)