#!/bin/sh ## ## fix-active ## ## Made by stransky ## Login stransky ## ## Started on Mon 01 nov 2001 02:40:25 CET stransky ## Last update sam 23 nov 2002 19:15:14 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 # # #exit 0 if [ `id -u` -ne 0 ] ; then echo "Be r00t or die ! (Need to act as news user)" exit 1 elif [ 1 -le "$#" ] ; then echo "erreur : il ne faut pas mettre d'argument" exit 1 elif [ "`cat /usr/scripts/active.template | wc -l`" -ne "`cat /var/lib/news/active | wc -l`" ] ; then echo "Attention, soit le template est obsolète (nouveaux newsgroups ajoutés), soit /var/lib/news/active est corrompu (nb de ligne diffère)." echo "mettre à jour active.template ? (n pour abondonner) y/n" read reply2; case $reply2 in y* | Y* | o* | O*) cp /var/lib/news/active /usr/scripts/active.template echo active.template mis à jour. ;; n* | N*) echo "OK, on laisse active en place ; corriger active.template" exit 0 ;; esac fi INNSTOP () { #/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" sleep 2 sync #### fin du stop personnalisé. } MAKENEWACTIVE () { rm -f /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" = 0 -a "$lo" = 1 ] ; then last=0 lo=0 else last="`ls -1 $d 2>/dev/null | sort -n | tail | grep '^[1-9][0-9]*$' | tail -1`" 2> /dev/null if [ "$last" = '' ] ; then last=$hi fi if [ "$lo" = '' -o "$lo" = 0 ] ; then lo=0 # certains articles sont encore là mais sont expirés (cf. expire.ctl) # else # lo="`ls -1 $d 2>/dev/null | sort -n | head | grep '^[1-9][0-9]*$' | head -1`" 2> /dev/null fi fi md='y' printf "%s %010d %010d %s\n" $gr $last $lo $md >> /tmp/active.new done < /var/lib/news/active } echo "arrêt d'innd..." INNSTOP MAKENEWACTIVE echo "affichage du diff" echo " " diff /tmp/active.new /var/lib/news/active echo " " if ! ( diff -q /tmp/active.new /var/lib/news/active > /dev/null ) ; then 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 else echo "la version générée et la version en place sont identiques : on ne fait rien." ; fi echo "redémarrage d'innd..." /id/inn2 start exit 0