diff options
Diffstat (limited to 'bin/control_rancid.in')
-rw-r--r-- | bin/control_rancid.in | 176 |
1 files changed, 117 insertions, 59 deletions
diff --git a/bin/control_rancid.in b/bin/control_rancid.in index f51a21b..388bbf4 100644 --- a/bin/control_rancid.in +++ b/bin/control_rancid.in @@ -1,8 +1,9 @@ #! /bin/sh ## -## $Id: control_rancid.in,v 1.61 2004/01/11 05:25:13 hank Exp $ +## $Id: control_rancid.in,v 1.80 2006/12/07 21:14:06 heas Exp $ ## -## Copyright (C) 1997-2004 by Terrapin Communications, Inc. +## @PACKAGE@ @VERSION@ +## Copyright (C) 1997-2006 by Terrapin Communications, Inc. ## All rights reserved. ## ## This software may be freely copied, modified and redistributed @@ -24,22 +25,21 @@ # print a usage message to stderr pr_usage() { - echo "usage: $0 [-r device_name] [-m mail rcpt] [group [group ...]]" >&2; + echo "usage: $0 [-V] [-r device_name] [-m mail rcpt] [group [group ...]]" >&2; } # command-line options -# -r <device name> +# -V print version string # -m <mail recipients> +# -r <device name> alt_mailrcpt=0 if [ $# -ge 1 ] ; then while [ 1 ] ; do case $1 in - -r) - shift - # next arg is the device name - device="$1" - shift + -V) + echo "@PACKAGE@ @VERSION@" + exit 0 ;; -m) shift @@ -52,6 +52,12 @@ if [ $# -ge 1 ] ; then fi shift ;; + -r) + shift + # next arg is the device name + device="$1" + shift + ;; --) shift; break; ;; @@ -81,12 +87,33 @@ DIR=$BASEDIR/$GROUP TMP=${TMPDIR:=/tmp}/rancid.$GROUP.$$ trap 'rm -fr $TMP;' 1 2 15 -# the receipient(s) of diffs -mailrcpt=${mailrcpt:-"@MAILPLUS@$GROUP"}; export mailrcpt -adminmailrcpt=${mailrcpt:-"@ADMINMAILPLUS@$GROUP"}; export adminmailrcpt +# disable noclobber +unset noclobber > /dev/null 2>&1 + +# RCS system +RCSSYS=${RCSSYS:=cvs}; +if [ $RCSSYS != "cvs" -a $RCSSYS != "svn" ] ; then + echo "$RCSSYS is not a valid value for RCSSYS." + exit 1 +fi + +# the receipient(s) of diffs & mail options +mailrcpt=${mailrcpt:-"@MAILPLUS@${GROUP}${MAILDOMAIN}"}; export mailrcpt +adminmailrcpt=${adminmailrcpt:-"@ADMINMAILPLUS@${GROUP}${MAILDOMAIN}"}; +export adminmailrcpt +set | grep MAILHEADERS= > /dev/null 2>&1 +if [ $? -ne 0 ] ; then + MAILHEADERS="Precedence: bulk\n"; export MAILHEADERS +fi # Number of things par should run in parallel. PAR_COUNT=${PAR_COUNT:-5} +# Number of times failed collections should be retried. Minimum 1. +MAX_ROUNDS=${MAX_ROUNDS:-4} +if [ $MAX_ROUNDS -lt 1 ] ; then + echo "Error: MAX_ROUNDS must be at least 1." + MAX_ROUNDS=1 +fi # Bail if we do not have the necessary info to run if [ ! -d $DIR ] @@ -96,20 +123,36 @@ then ( echo "To: $adminmailrcpt" echo "Subject: no $GROUP directory" - echo "Precedence: bulk" + echo "$MAILHEADERS" | awk '{L = "";LN = $0;while (LN ~ /\\n/) { I = index(LN,"\\n");L = L substr(LN,0,I-1) "\n";LN = substr(LN,I+2,length(LN)-I-1);}print L LN;}' echo "" echo "$DIR does not exist." echo "Run bin/rancid-cvs $GROUP to make all of the needed directories." ) | sendmail -t exit 1 fi +cd $DIR + +# create a .cvsignore +if [ ! -f .cvsignore ] +then + rm -f .cvsignore + cat >.cvsignore <<EOF +.cvsignore +routers.all +routers.down +routers.up +EOF + if [ $RCSSYS = svn ] + then + svn propset svn:ignore -F .cvsignore . + fi +fi # do cvs update of router.db in case anyone has fiddled. -cd $DIR -cvs update router.db > $TMP 2>&1 +$RCSSYS update router.db > $TMP 2>&1 grep "^C" $TMP > /dev/null if [ $? -eq 0 ] ; then - echo "There were CVS conflicts during update." + echo "There were $RCSSYS conflicts during update." echo "" cat $TMP rm -f $TMP @@ -119,36 +162,34 @@ rm -f $TMP if [ ! -f $DIR/router.db ] then + echo "$DIR/router.db does not exist." ( echo "To: $adminmailrcpt" echo "Subject: no $GROUP/router.db file" - echo "Precedence: bulk" + echo "$MAILHEADERS" | awk '{L = "";LN = $0;while (LN ~ /\\n/) { I = index(LN,"\\n");L = L substr(LN,0,I-1) "\n";LN = substr(LN,I+2,length(LN)-I-1);}print L LN;}' echo "" echo "$DIR/router.db does not exist." ) | sendmail -t exit 1; -elif [ ! -s $DIR/router.db ] -then - exit fi # generate the list of all, up, & down routers cd $DIR trap 'rm -fr routers.db routers.all.new routers.down.new routers.up.new \ routers.mail routers.added routers.deleted $TMP;' 1 2 15 -sed -e '/^#/d' -e 's/^ *//' -e 's/ *$//' -e 's/ *: */:/g' router.db | +sed -e '/^#/d' -e 's/^ *//' -e 's/ *$//' -e 's/ *: */:/g' router.db | sort -u > routers.db cut -d: -f1,2 routers.db > routers.all.new if [ ! -f routers.all ] ; then touch routers.all; fi -diff routers.all routers.all.new > /dev/null 2>&1; RALL=$? +@DIFF_CMD@ routers.all routers.all.new > /dev/null 2>&1; RALL=$? @PERLV@ -F: -ane '{($F[0] =~ tr@A-Z@a-z@,print $_) if ($F[2] !~ /^up$/i);}' routers.db > routers.down.new if [ ! -f routers.down ] ; then touch routers.down; fi -diff routers.down routers.down.new > /dev/null 2>&1; RDOWN=$? +@DIFF_CMD@ routers.down routers.down.new > /dev/null 2>&1; RDOWN=$? @PERLV@ -F: -ane '{($F[0] =~ tr@A-Z@a-z@,print "$F[0]:$F[1]\n") if ($F[2] =~ /^up$/i);}' routers.db > routers.up.new if [ ! -f routers.up ] ; then touch routers.up; fi -diff routers.up routers.up.new > /dev/null 2>&1; RUP=$? +@DIFF_CMD@ routers.up routers.up.new > /dev/null 2>&1; RUP=$? if [ $RALL -ne 0 -o $RDOWN -ne 0 -o $RUP -ne 0 ] then @@ -177,10 +218,10 @@ then WCDOWN=`comm -13 routers.down routers.down.new | wc -l | \ sed -e 's/^ *\([^ ]*\)/\1/'` if [ $WCDOWN -eq 1 ] ; then - echo Routers changed to down: - comm -13 routers.down routers.down.new | \ + echo Routers changed to down: + comm -13 routers.down routers.down.new | \ sed -e 's/^/ /' - echo + echo fi fi fi @@ -195,14 +236,14 @@ then if [ $WCADDED -gt 0 ] then - echo Added routers: - cat routers.added + echo Added routers: + cat routers.added echo fi if [ $WCDELETED -gt 0 ] then - echo Deleted routers: - cat routers.deleted + echo Deleted routers: + cat routers.deleted echo fi @@ -214,7 +255,7 @@ then ( echo "To: $adminmailrcpt" echo "Subject: changes in $GROUP routers" - echo "Precedence: bulk" + echo "$MAILHEADERS" | awk '{L = "";LN = $0;while (LN ~ /\\n/) { I = index(LN,"\\n");L = L substr(LN,0,I-1) "\n";LN = substr(LN,I+2,length(LN)-I-1);}print L LN;}' echo "" cat routers.mail ) | sendmail -t @@ -233,8 +274,12 @@ then router=$1 touch $router - cvs add -ko $router - cvs commit -m 'new router' $router + if [ $RCSSYS = cvs ] ; then + cvs add -ko $router + else + svn add $router + fi + $RCSSYS commit -m 'new router' $router echo "Added $router" done echo @@ -257,23 +302,31 @@ rm -f routers.db trap 'rm -fr $TMP;' 1 2 15 cd $DIR/configs -# check for 'up' routers missing in cvs. no idea how this happens to some folks +# check for 'up' routers missing in RCS. no idea how this happens to some folks for router in `cut -d: -f1 ../routers.up` ; do - cvs status $router | grep -i 'status: unknown' > /dev/null 2>&1 + if [ $RCSSYS = cvs ] ; then + cvs status $router | grep -i 'status: unknown' > /dev/null 2>&1 + else + svn status $router | grep '^?' > /dev/null 2>&1 + fi if [ $? -eq 0 ]; then touch $router - cvs add -ko $router - echo "CVS added missing router $router" + if [ $RCSSYS = cvs ] ; then + cvs add -ko $router + else + svn add $router + fi + echo "$RCSSYS added missing router $router" fi done echo -# cvs delete configs for routers not listed in routers.up. -for router in `find . \( -name \*.new -prune -o -name CVS -prune \) -o -type f -print | sed -e 's/^.\///'` ; do +# delete configs from RCS for routers not listed in routers.up. +for router in `find . \( -name \*.new -prune -o -name CVS -prune -o -name .svn -prune \) -o -type f -print | sed -e 's/^.\///'` ; do grep -i "^$router:" ../router.db > /dev/null 2>&1 if [ $? -eq 1 ]; then rm -f $router - cvs delete $router - cvs commit -m 'deleted router' $router + $RCSSYS delete $router + $RCSSYS commit -m 'deleted router' $router echo "Deleted $router" fi done @@ -283,7 +336,7 @@ cd $DIR if [ ! -s routers.up ] then # commit router.db - cvs commit -m updates router.db > /dev/null + $RCSSYS commit -m updates router.db exit; fi @@ -311,7 +364,7 @@ par -q -n $PAR_COUNT -c "rancid-fe \{}" $devlistfile # This section will generate a list of missed routers # and try to grab them again. It will run through # $pass times. -pass=4 +pass=$MAX_ROUNDS round=1 if [ -f $DIR/routers.up.missed ]; then rm -f $DIR/routers.up.missed @@ -349,10 +402,10 @@ echo # Make sure that no empty configs are accepted. Those that are non-empty # are renamed from device_name.new -> device_name. for router in `cat $devlistfile` -do +do OFS=$IFS IFS=':' - set $router + set $router IFS=$OFS router=$1; @@ -371,8 +424,12 @@ done # Diff the directory and then checkin. trap 'rm -fr $TMP $TMP.diff $DIR/routers.single;' 1 2 15 cd $DIR -cvs -f @DIFF_CMD@ | sed -e '/^RCS file: /d' -e '/^--- /d' \ +if [ $RCSSYS = "cvs" ] ; then + cvs -f @DIFF_CMD@ -ko | sed -e '/^RCS file: /d' -e '/^--- /d' \ -e '/^+++ /d' -e 's/^\([-+ ]\)/\1 /' >$TMP.diff +else + svn diff | sed -e '/^+++ /d' -e 's/^\([-+ ]\)/\1 /' >$TMP.diff +fi if [ $alt_mailrcpt -eq 1 ] ; then subject="router config diffs - courtesy of $mailrcpt" @@ -380,22 +437,23 @@ else subject="router config diffs" fi if [ "X$device" != "X" ] ; then - cvs commit -m "updates - courtesy of $mailrcpt" + $RCSSYS commit -m "updates - courtesy of $mailrcpt" subject="$GROUP/$device $subject" else - cvs commit -m updates + $RCSSYS commit -m updates subject="$GROUP $subject" fi # Mail out the diffs (if there are any). -if [ -s $TMP.diff ]; then - sendmail -t <<EMAIL -To: $mailrcpt -Subject: $subject -Precedence: bulk - -`cat $TMP.diff` -EMAIL +if [ -s $TMP.diff ] +then + ( + echo "To: $mailrcpt" + echo "Subject: $subject" + echo "$MAILHEADERS" | awk '{L = "";LN = $0;while (LN ~ /\\n/) { I = index(LN,"\\n");L = L substr(LN,0,I-1) "\n";LN = substr(LN,I+2,length(LN)-I-1);}print L LN;}' + echo "" + cat $TMP.diff + ) | sendmail -t fi # If any machines have not been reached within the last $OLDTIME @@ -412,7 +470,7 @@ then ( echo "To: $adminmailrcpt" echo "Subject: config fetcher problems - $GROUP" - echo "Precedence: bulk" + echo "$MAILHEADERS" | awk '{L = "";LN = $0;while (LN ~ /\\n/) { I = index(LN,"\\n");L = L substr(LN,0,I-1) "\n";LN = substr(LN,I+2,length(LN)-I-1);}print L LN;}' echo "" echo "The following routers have not been successfully contacted for" echo "more than $OLDTIME hours." @@ -422,5 +480,5 @@ then fi # Cleanup -rm -f $TMP.diff $DIR/routers.single +rm -f $TMP.diff $DIR/routers.single $DIR/routers.failed trap '' 1 2 15 |