#!/bin/sh ## ## fix-active ## ## Made by stransky ## Login stransky ## ## Started on Mon 01 nov 2001 02:40:25 CET stransky ## Last update sam 05 jan 2002 14:20:25 CET stransky ## # # à utiliser en cas de plantage et de non synchro de /var/lib/news/active. # # V 2.0 : # à lancer tel quel. théoriquement le script s'occuppe de tout. # # V 1.0 : # ctlinnd throttle '' # à ce niveau, il est TRES important de vérifier que l'on ne peut plus poster de messages. # puis il faut vérifier que le fichier active a la bonne syntaxe du début à la fin, i-e : # newsgroup nombre nombre y # sinon, il faut corriger à la main. # ./fix-active < /var/lib/news/active > active.new # cp active.new /var/lib/news/active # ctlinnd go '' # le 1/11/01 2h40 -- Nico # # if [ 1 -le "$#" ] ; then echo "erreur : il ne faut pas mettre d'argument" exit 1 fi if [ -f /tmp/active.new ] ; then echo "/tmp/active.new: le fichier existe déjà ! Effacer ? y/n" read reply1; case $reply1 in y* | Y* | o* | O*) echo "OK, on le remplace avec une version toute neuve" rm -f /tmp/active.new ;; n* | N*) echo "OK, on le laisse" exit 0 ;; esac fi if [ "`cat /usr/scripts/active.template | wc -l`" -ne "`cat /var/lib/news/active | wc -l`" ] ; then echo "Attention, soit le template est obsolète, soit /var/lib/news/active est corrompu (nb de ligne diffère)" echo "continuer ? y/n" read reply2; case $reply2 in y* | Y* | o* | O*) echo "OK, on écrase le active corrompu" mv /var/lib/news/active /var/lib/news/active.bak echo active sauvé en /var/lib/news/active.bak ;; n* | N*) echo "OK, on laisse active en place ; corriger active.template" exit 0 ;; esac fi echo "arrêt d'innd..." #ctlinnd throttle 'COUPURE TEMPORAIRE - fix-active' #ctlinnd shutdown 'fix-active' # #/id/inn2 stop #### Pour avoir des logs plus clairs, on remplace stop par un message personnalisé. # su news -c '/usr/lib/news/bin/ctlinnd shutdown 'réparation active'' # Stop innwatch (if running) if [ -f /var/run/news/innwatch.pid ]; then su news -c 'kill `cat /var/run/news/innwatch.pid`' rm -f /var/run/news/innwatch.pid fi # wait for innd to exit (up to 60 sec) printf "Stopping innd: " /bin/su news -c 'i=12 while [ $i -gt 0 ]; do pid=`cat /var/run/news/innd.pid 2>/dev/null` [ "$pid" = "" ] && break kill -0 $pid 2>/dev/null || break sleep 5 printf "." i=`expr $i - 1` done' printf "\n" #### fin du stop personnalisé. sleep 2 sync touch /tmp/active.new cd /var/spool/news/articles while read gr hi lo md do d="`echo $gr | tr . /`" hi="`echo $hi | sed -e 's/^00*//'`" lo="`echo $lo | sed -e 's/^00*//'`" if [ "$hi" = '' ] ; then hi=0 fi if [ $hi -eq 0 -a $lo -eq 1 ] ; then last=0 else last="`ls -1 $d 2>/dev/null | sort -n | grep '^[1-9][0-9]*$' | tail -1`" if [ "$last" = '' ] ; then last=$hi fi fi printf "%s %010d %010d %s\n" $gr $last $lo $md >> /tmp/active.new done < /var/lib/news/active echo "affichage du diff" echo " " diff /tmp/active.new /var/lib/news/active echo " " diff /tmp/active.new /var/lib/news/active > /dev/null && { echo "la version générée et la version en place sont identiques : on ne fait rien." ; echo "redémarrage d'innd..." /id/inn2 start #ctlinnd go '' exit 0 } diff /tmp/active.new /var/lib/news/active > /dev/null || { echo "la version générée et la version en place diffèrent : il faut la remplacer" ; echo "souhaitez-vous remplacer le fichier actuellement en place ? y/n" ; read reply3; case $reply3 in y* | Y* | o* | O*) echo "OK, on le remplace" cp /tmp/active.new /var/lib/news/active chown news.news /var/lib/news/active chmod 664 /var/lib/news/active ;; n* | N*) echo "OK, on le laisse, mais il faut corriger cela !" ;; esac } echo "redémarrage d'innd..." #ctlinnd go '' /id/inn2 start exit 0