#!/bin/sh ## ## ## Copyright (C) 1996 by Henry Kilmer. ## All rights reserved. ## ## This software may be freely copied, modified and redistributed without ## fee for non-commerical purposes provided that this copyright notice is ## preserved intact on all copies and modified copies. ## ## There is no warranty or other guarantee of fitness of this software. ## It is provided solely "as is". The author(s) disclaim(s) all ## responsibility and liability with respect to this software's usage ## or its effect upon hardware, computer systems, other software, or ## anything else. ## ## # # control_rancid $GROUP # # Number of things par should run in parallel. PAR_COUNT=5 # Must specify a group to run rancid if [ $# -lt 1 ]; then echo 'must specify group'; exit 1 else GROUP=$1 fi TMP=/var/tmp/rancid.$GROUP.$$ DIR=$BASEDIR/$GROUP # Bail if we do not have the necessary info to run if [ ! -d $DIR ] then ( echo "$DIR does not exist." ) | Mail -s "no $GROUP directory" rancid-admin-$GROUP exit 1 fi if [ ! -f $DIR/router.db ] then ( echo "$DIR/router.db does not exist." ) | Mail -s "no $GROUP/router.db file" rancid-admin-$GROUP exit 1; elif [ ! -s $DIR/router.db ] then exit fi # generate the list of routers we should try to fetch cd $DIR grep -v '^#' router.db > routers.db cut -d: -f1,2 routers.db | sort -u > routers.all.new diff routers.all routers.all.new > /dev/null 2>&1; RALL=$? @PERLV_PATH@ -F: -ane '{($F[0] =~ tr@A-Z@a-z@,print "$F[0]:$F[1]\n") if ($F[2] =~ /^down$/i);}' routers.db | sort -u > routers.down.new diff routers.down routers.down.new > /dev/null 2>&1; RDOWN=$? @PERLV_PATH@ -F: -ane '{($F[0] =~ tr@A-Z@a-z@,print "$F[0]:$F[1]\n") if ($F[2] =~ /^up$/i);}' routers.db | sort -u > routers.up.new diff routers.up routers.up.new > /dev/null 2>&1; RUP=$? if [ $RALL -ne 0 -o $RDOWN -ne 0 -o $RUP -ne 0 ] then ( if [ $RUP -ne 0 ] ; then if [ $RUP -eq 1 ] ; then echo Routers changed to up: comm -13 routers.up routers.up.new | sed -e 's/^/ /' echo elif [ -s routers.up.new ] ; then echo Routers changed to up: sed -e 's/^/ /' routers.up.new echo fi fi if [ $RDOWN -ne 0 ] ; then if [ $RDOWN -eq 1 ] ; then echo Routers changed to down: comm -13 routers.down routers.down.new | sed -e 's/^/ /' echo elif [ -s routers.down.new ] ; then echo Routers changed to down: sed -e 's/^/ /' routers.down.new echo fi fi WC=`wc -l routers.all | sed -e 's/^ *\([^ ]*\) .*$/\1/'` WCNEW=`wc -l routers.all.new | sed -e 's/^ *\([^ ]*\) .*$/\1/'` if [ $RALL -eq 1 -a $WC -gt $WCNEW ] ; then echo Deleted routers: comm -23 routers.all routers.all.new | sed -e 's/^/ /' fi ) > routers.mail if [ -s routers.mail ] ; then Mail -s "changes in $GROUP routers" rancid-admin-$GROUP < routers.mail fi rm -f routers.mail cd $DIR/configs # Add new routers to the CVS structure. for router in `comm -13 $DIR/routers.up $DIR/routers.up.new` do OFS=$IFS IFS=: set $router IFS=$OFS router=$1 touch $router cvs add -ko $router cvs commit -m 'new router' $router echo "Added $router" done echo cd $DIR fi mv routers.all.new routers.all mv routers.down.new routers.down mv routers.up.new routers.up rm -f routers.db # cvs delete configs for routers not listed in routers.up. cd $DIR/configs for router in `find . \( -name \*.new -prune -o -name CVS -prune \) -o -type f -print | sed -e 's/^.\///'` ; do grep "^$router:" ../router.db > /dev/null 2>&1 if [ $? -eq 1 ]; then rm -f $router cvs delete $router cvs commit -m 'deleted router' $router echo "Deleted $router" fi done cd $DIR # no routers, empty list or all 'down' if [ ! -s routers.up ] then # commit router.db cvs commit -m updates router.db > /dev/null exit; fi # Now we can actually try to get the configs cd $DIR/configs # The number of processes running at any given time can be # tailored to the specific installation. echo "Trying to get all of the configs." par -q -n $PAR_COUNT -c "rancid-fe \{}" $DIR/routers.up # This section will generate a list of missed routers # and try to grab them again. It will run through # $pass times. pass=4 round=1 if [ -f $DIR/routers.up.missed ]; then rm -f $DIR/routers.up.missed fi while [ $round -le $pass ] do for router in `cat $DIR/routers.up` do OFS=$IFS IFS=':' set $router IFS=$OFS router=$1; mfg=$2 if [ ! -s $router.new ] then echo "$router:$mfg" >> $DIR/routers.up.missed rm -f $router.new fi done if [ -f $DIR/routers.up.missed ]; then echo "=====================================" echo "Getting missed routers: round $round." par -q -n $PAR_COUNT -c "rancid-fe \{}" $DIR/routers.up.missed rm -f $DIR/routers.up.missed round=`expr $round + 1` else echo "All routers sucessfully completed." round=`expr $pass + 1` fi done echo # Make sure that all of the new configs are not empty. for config in *.new do if [ ! -s $config ] then rm -f $config fi done # Now that we have the new configs, rename them to their proper # name. rename 's/.new$//' *.new # This has been different for different machines... # Diff the directory and then checkin. cd $DIR #cvs diff -c3 >$TMP.diff #cvs diff -C 3 >$TMP.diff # Change the output of a unified diff to make it a bit more readable. cat > $TMP.sedf << EOF /^RCS file: /d #/^retrieving revision /d /^--- /d /^+++ /d s/^\([-+ ]\)/\1 / EOF cvs -f diff -u -4 | sed -f $TMP.sedf >$TMP.diff rm -f $TMP.sedf cvs commit -m updates # Mail out the diffs (if there are any). if [ -s $TMP.diff ]; then sendmail -t <= $OLDTIME*60*60);}" $DIR/routers.up | sort -u > $DIR/routers.failed if [ -s $DIR/routers.failed ] then ( cat <