#!/bin/sh
##
## fix-active
##
## Made by stransky
## Login stransky <stransky@crans.org>
##
## 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/news/active.template | wc -l`" -ne "`cat /var/lib/news/active | wc -l`" ] ; then
	echo "Attention, soit le template est obsolète (nouveaux newsgroups ajeouté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/news/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




