summaryrefslogtreecommitdiffstats
path: root/bin/control_rancid
diff options
context:
space:
mode:
Diffstat (limited to 'bin/control_rancid')
-rwxr-xr-xbin/control_rancid107
1 files changed, 78 insertions, 29 deletions
diff --git a/bin/control_rancid b/bin/control_rancid
index 89ec0df..0728e7e 100755
--- a/bin/control_rancid
+++ b/bin/control_rancid
@@ -52,26 +52,58 @@ fi
# generate the list of routers we should try to fetch
cd $DIR
-rm -f $DIR/allrouters.new
+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=$?
perl -F: -ane '{($F[0] =~ tr@A-Z@a-z@,print "$F[0]:$F[1]\n")
- if ($F[2] =~ /^up$/i);}' $DIR/router.db | sort -u > $DIR/allrouters.new
+ if ($F[2] =~ /^down$/i);}' routers.db | sort -u > routers.down.new
+diff routers.down routers.down.new > /dev/null 2>&1; RDOWN=$?
+perl -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 diff $DIR/allrouters $DIR/allrouters.new > $DIR/allrouters.diffs
+if [ $RALL -ne 0 -o $RDOWN -ne 0 -o $RUP -ne 0 ]
then
- rm -f $DIR/allrouters.new
-else
(
- echo New routers:
- comm -13 $DIR/allrouters $DIR/allrouters.new | sed -e 's/^/ /' -e 's/:.*$//'
- echo
- echo Deleted routers:
- comm -23 $DIR/allrouters $DIR/allrouters.new | sed -e 's/^/ /' -e 's/:.*$//'
- ) | Mail -s "changes in $GROUP routers" rancid-admin-$GROUP
+ 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/^/ /' -e 's/:.*$//'
+ echo
+ elif [ -s routers.up.new ] ; then
+ echo Routers changed to up:
+ sed -e 's/^/ /' -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/^/ /' -e 's/:.*$//'
+ echo
+ elif [ -s routers.down.new ] ; then
+ echo Routers changed to down:
+ sed -e 's/^/ /' -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/^/ /' -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/allrouters $DIR/allrouters.new`
+ for router in `comm -13 $DIR/routers.up $DIR/routers.up.new`
do
OFS=$IFS
IFS=:
@@ -87,14 +119,31 @@ else
echo
cd $DIR
- mv $DIR/allrouters.new $DIR/allrouters
fi
-rm -f $DIR/allrouters.diffs $DIR/allrouters.new
+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 $DIR/allrouters ]
+if [ ! -s routers.up ]
then
- exit;
+ # commit router.db
+ cvs commit -m updates router.db > /dev/null
+ exit;
fi
# Now we can actually try to get the configs
@@ -103,22 +152,19 @@ 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/allrouters
+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/allrouters.missed ]; then
- rm -f $DIR/allrouters.missed
+if [ -f $DIR/routers.up.missed ]; then
+ rm -f $DIR/routers.up.missed
fi
while [ $round -le $pass ]
do
- echo "====================================="
- echo "Getting missed routers: round $round."
-
- for router in `cat $DIR/allrouters`
+ for router in `cat $DIR/routers.up`
do
OFS=$IFS
IFS=':'
@@ -126,15 +172,17 @@ do
IFS=$OFS
router=$1; mfg=$2
- if [ ! -f $DIR/configs/$router.new ]
+ if [ ! -f $router.new ]
then
- echo "$router:$mfg" >> $DIR/allrouters.missed
+ echo "$router:$mfg" >> $DIR/routers.up.missed
fi
done
- if [ -f $DIR/allrouters.missed ]; then
- par -q -n $PAR_COUNT -c "rancid-fe \{}" $DIR/allrouters.missed
- rm -f $DIR/allrouters.missed
+ 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."
@@ -152,6 +200,7 @@ rename 's/.new$//' *.new
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
@@ -180,7 +229,7 @@ fi
cd $DIR/configs
rm -f $DIR/routers.failed
perl -F: -ane '{$t = (stat($F[0]))[9]; print `ls -ld $F[0]`
- if (time() - $t >= 86400);}' $DIR/allrouters | sort -u > $DIR/routers.failed
+ if (time() - $t >= 86400);}' $DIR/routers.up | sort -u > $DIR/routers.failed
if [ -s $DIR/routers.failed ]
then
(