summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGES7
-rw-r--r--Makefile.am2
-rw-r--r--Makefile.in6
-rw-r--r--Todo5
-rw-r--r--bin/Makefile.in4
-rwxr-xr-xbin/clogin.in5
-rwxr-xr-xbin/configure349
-rw-r--r--bin/configure.in25
-rwxr-xr-xbin/elogin.in5
-rw-r--r--bin/env.in1
-rwxr-xr-xbin/flogin.in5
-rwxr-xr-xbin/jlogin.in5
-rwxr-xr-xbin/rancid.in11
-rwxr-xr-xconfigure417
-rw-r--r--configure.in61
-rw-r--r--util/Makefile.in10
-rw-r--r--util/README5
-rwxr-xr-xutil/configure107
-rw-r--r--util/configure.in2
-rw-r--r--util/lg/Makefile.in43
-rw-r--r--util/lg/README64
-rwxr-xr-xutil/lg/configure991
-rw-r--r--util/lg/configure.in27
-rw-r--r--util/lg/index.html9
-rwxr-xr-xutil/lg/lg.cgi.in449
-rw-r--r--util/lg/lg.conf.in79
-rwxr-xr-xutil/lg/lgform.cgi.in200
-rw-r--r--util/lg/lgnotes.html52
28 files changed, 2547 insertions, 399 deletions
diff --git a/CHANGES b/CHANGES
index 762f07b..f3838f5 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,10 @@
+2.1b
+ add looking glass utility based on Ed Kern's original source. Thanks
+ to Ed for permission to include it with rancid. this is only partially
+ tested.
+
+ fixed expect foo in *login when .cloginrc is unreadable.
+
2.0
Better formatting for cisco catalyst [non-ios] switches.
diff --git a/Makefile.am b/Makefile.am
index efcd8b0..d75decf 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -15,7 +15,7 @@ SUBDIRS = . bin util
all:
install-exec-local:
- $(mkinstalldirs) $(prefix) $(prefix)/bin $(prefix)/util
+ $(mkinstalldirs) $(prefix) $(prefix)/bin $(prefix)/util $(prefix)/util/lg
install:
for file in CHANGES README cloginrc.sample ; do \
diff --git a/Makefile.in b/Makefile.in
index 35ba7ee..c79ec4f 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -62,16 +62,20 @@ COMM = @COMM@
CVS = @CVS@
DIFF = @DIFF@
DIRNAME = @DIRNAME@
+ENV_PATH = @ENV_PATH@
EXPECT_PATH = @EXPECT_PATH@
INST_PROGS = @INST_PROGS@
+LG_PING_CMD = @LG_PING_CMD@
MAINT = @MAINT@
MAKE = @MAKE@
MAKEINFO = @MAKEINFO@
MKDIR = @MKDIR@
PACKAGE = @PACKAGE@
PERLV_PATH = @PERLV_PATH@
+PING_PATH = @PING_PATH@
RD_BIN_DATAS = @RD_BIN_DATAS@
RD_BIN_PROGS = @RD_BIN_PROGS@
+RD_UTIL_LG_PROGS = @RD_UTIL_LG_PROGS@
RD_UTIL_PROGS = @RD_UTIL_PROGS@
SENDMAIL = @SENDMAIL@
SORT = @SORT@
@@ -340,7 +344,7 @@ mostlyclean distclean maintainer-clean
all:
install-exec-local:
- $(mkinstalldirs) $(prefix) $(prefix)/bin $(prefix)/util
+ $(mkinstalldirs) $(prefix) $(prefix)/bin $(prefix)/util $(prefix)/util/lg
install:
for file in CHANGES README cloginrc.sample ; do \
diff --git a/Todo b/Todo
index be38291..5f194d8 100644
--- a/Todo
+++ b/Todo
@@ -1,7 +1,10 @@
+- better error loggin in the looking glass
+- why do 'make distclean' & 'make dist' fail on fbsd 3.3?
+- handle foundry and reback in the looking glass
+- implement the bits marked unimplemented in lg.conf
- need to strip community strings from foundry, redback
- detect 'same' vty configs
- ignoring length/width/passwd is a start, but need more
-- add .cloginrc var to say to use ssh or telnet
- merge clogin and jlogin into one. possible?
- rancid needs to treat the 3600s like the 7Ks and 12Ks...
- Also, need to allow 12012s, and force 700s to not be treated like 7Ks.
diff --git a/bin/Makefile.in b/bin/Makefile.in
index ca5616b..8a97def 100644
--- a/bin/Makefile.in
+++ b/bin/Makefile.in
@@ -3,8 +3,8 @@ PREFIX = @prefix@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
-BIN_PROGS = @RD_BIN_PROGS@
-BIN_DATAS = @RD_BIN_DATAS@
+BIN_PROGS=@RD_BIN_PROGS@
+BIN_DATAS=@RD_BIN_DATAS@
all:
diff --git a/bin/clogin.in b/bin/clogin.in
index bfe3ae1..e239d50 100755
--- a/bin/clogin.in
+++ b/bin/clogin.in
@@ -248,7 +248,10 @@ proc source_password_file { } {
send_user "Error: $password_file must not be world readable/writable\n"
exit 1
}
- source $password_file
+ if [ catch {source $password_file} reason ] {
+ send_user "Error: $reason\n"
+ exit 1
+ }
}
# Log into the router.
diff --git a/bin/configure b/bin/configure
index b586b8d..b0770e7 100755
--- a/bin/configure
+++ b/bin/configure
@@ -619,345 +619,7 @@ PERLV_PATH=$ac_cv_path_PERLV_PATH
EXPECT_PATH=$ac_cv_path_EXPECT_PATH
-# locate tools to build $PATH for env. order is significant. want to be
-# sure that we pick up the the proper diff and ucbmail in bin/env.
-unset ENV_PATH
-# Extract the first word of "diff", so it can be a program name with args.
-set dummy diff; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:629: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_DIFF'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- case "$DIFF" in
- /*)
- ac_cv_path_DIFF="$DIFF" # Let the user override the test with a path.
- ;;
- ?:/*)
- ac_cv_path_DIFF="$DIFF" # Let the user override the test with a dos path.
- ;;
- *)
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_path_DIFF="$ac_dir/$ac_word"
- break
- fi
- done
- IFS="$ac_save_ifs"
- test -z "$ac_cv_path_DIFF" && ac_cv_path_DIFF="no"
- ;;
-esac
-fi
-DIFF="$ac_cv_path_DIFF"
-if test -n "$DIFF"; then
- echo "$ac_t""$DIFF" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
-
-ENV_PATH=`dirname $ac_cv_path_DIFF`
-# Extract the first word of "Mail", so it can be a program name with args.
-set dummy Mail; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:666: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_UCBMAIL'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- case "$UCBMAIL" in
- /*)
- ac_cv_path_UCBMAIL="$UCBMAIL" # Let the user override the test with a path.
- ;;
- ?:/*)
- ac_cv_path_UCBMAIL="$UCBMAIL" # Let the user override the test with a dos path.
- ;;
- *)
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_path_UCBMAIL="$ac_dir/$ac_word"
- break
- fi
- done
- IFS="$ac_save_ifs"
- test -z "$ac_cv_path_UCBMAIL" && ac_cv_path_UCBMAIL="no"
- ;;
-esac
-fi
-UCBMAIL="$ac_cv_path_UCBMAIL"
-if test -n "$UCBMAIL"; then
- echo "$ac_t""$UCBMAIL" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
-
-ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_UCBMAIL`"
-# Extract the first word of "cvs", so it can be a program name with args.
-set dummy cvs; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:703: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_CVS'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- case "$CVS" in
- /*)
- ac_cv_path_CVS="$CVS" # Let the user override the test with a path.
- ;;
- ?:/*)
- ac_cv_path_CVS="$CVS" # Let the user override the test with a dos path.
- ;;
- *)
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_path_CVS="$ac_dir/$ac_word"
- break
- fi
- done
- IFS="$ac_save_ifs"
- test -z "$ac_cv_path_CVS" && ac_cv_path_CVS="no"
- ;;
-esac
-fi
-CVS="$ac_cv_path_CVS"
-if test -n "$CVS"; then
- echo "$ac_t""$CVS" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
-
-ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_CVS`"
-# Extract the first word of "comm", so it can be a program name with args.
-set dummy comm; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:740: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_COMM'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- case "$COMM" in
- /*)
- ac_cv_path_COMM="$COMM" # Let the user override the test with a path.
- ;;
- ?:/*)
- ac_cv_path_COMM="$COMM" # Let the user override the test with a dos path.
- ;;
- *)
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_path_COMM="$ac_dir/$ac_word"
- break
- fi
- done
- IFS="$ac_save_ifs"
- test -z "$ac_cv_path_COMM" && ac_cv_path_COMM="no"
- ;;
-esac
-fi
-COMM="$ac_cv_path_COMM"
-if test -n "$COMM"; then
- echo "$ac_t""$COMM" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
-
-ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_COMM`"
-# Extract the first word of "mkdir", so it can be a program name with args.
-set dummy mkdir; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:777: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_MKDIR'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- case "$MKDIR" in
- /*)
- ac_cv_path_MKDIR="$MKDIR" # Let the user override the test with a path.
- ;;
- ?:/*)
- ac_cv_path_MKDIR="$MKDIR" # Let the user override the test with a dos path.
- ;;
- *)
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_path_MKDIR="$ac_dir/$ac_word"
- break
- fi
- done
- IFS="$ac_save_ifs"
- test -z "$ac_cv_path_MKDIR" && ac_cv_path_MKDIR="no"
- ;;
-esac
-fi
-MKDIR="$ac_cv_path_MKDIR"
-if test -n "$MKDIR"; then
- echo "$ac_t""$MKDIR" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
-
-ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_MKDIR`"
-# Extract the first word of "dirname", so it can be a program name with args.
-set dummy dirname; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:814: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_DIRNAME'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- case "$DIRNAME" in
- /*)
- ac_cv_path_DIRNAME="$DIRNAME" # Let the user override the test with a path.
- ;;
- ?:/*)
- ac_cv_path_DIRNAME="$DIRNAME" # Let the user override the test with a dos path.
- ;;
- *)
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_path_DIRNAME="$ac_dir/$ac_word"
- break
- fi
- done
- IFS="$ac_save_ifs"
- test -z "$ac_cv_path_DIRNAME" && ac_cv_path_DIRNAME="no"
- ;;
-esac
-fi
-DIRNAME="$ac_cv_path_DIRNAME"
-if test -n "$DIRNAME"; then
- echo "$ac_t""$DIRNAME" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
-
-ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_DIRNAME`"
-# Extract the first word of "touch", so it can be a program name with args.
-set dummy touch; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:851: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_TOUCH'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- case "$TOUCH" in
- /*)
- ac_cv_path_TOUCH="$TOUCH" # Let the user override the test with a path.
- ;;
- ?:/*)
- ac_cv_path_TOUCH="$TOUCH" # Let the user override the test with a dos path.
- ;;
- *)
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_path_TOUCH="$ac_dir/$ac_word"
- break
- fi
- done
- IFS="$ac_save_ifs"
- test -z "$ac_cv_path_TOUCH" && ac_cv_path_TOUCH="no"
- ;;
-esac
-fi
-TOUCH="$ac_cv_path_TOUCH"
-if test -n "$TOUCH"; then
- echo "$ac_t""$TOUCH" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
-
-ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_TOUCH`"
-# Extract the first word of "sendmail", so it can be a program name with args.
-set dummy sendmail; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:888: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_SENDMAIL'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- case "$SENDMAIL" in
- /*)
- ac_cv_path_SENDMAIL="$SENDMAIL" # Let the user override the test with a path.
- ;;
- ?:/*)
- ac_cv_path_SENDMAIL="$SENDMAIL" # Let the user override the test with a dos path.
- ;;
- *)
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_path_SENDMAIL="$ac_dir/$ac_word"
- break
- fi
- done
- IFS="$ac_save_ifs"
- test -z "$ac_cv_path_SENDMAIL" && ac_cv_path_SENDMAIL="no"
- ;;
-esac
-fi
-SENDMAIL="$ac_cv_path_SENDMAIL"
-if test -n "$SENDMAIL"; then
- echo "$ac_t""$SENDMAIL" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
-
-ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_SENDMAIL`"
-# Extract the first word of "sort", so it can be a program name with args.
-set dummy sort; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:925: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_SORT'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- case "$SORT" in
- /*)
- ac_cv_path_SORT="$SORT" # Let the user override the test with a path.
- ;;
- ?:/*)
- ac_cv_path_SORT="$SORT" # Let the user override the test with a dos path.
- ;;
- *)
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_path_SORT="$ac_dir/$ac_word"
- break
- fi
- done
- IFS="$ac_save_ifs"
- test -z "$ac_cv_path_SORT" && ac_cv_path_SORT="no"
- ;;
-esac
-fi
-SORT="$ac_cv_path_SORT"
-if test -n "$SORT"; then
- echo "$ac_t""$SORT" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
-
-ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_SORT`"
-ENV_PATH="$ENV_PATH:/usr/local/bin:/usr/bin"
-
-ENV_PATH=`echo $ENV_PATH | $PERLV_PATH -e 'foreach $x(split(":",<>)){next unless (length($x));push(@F, $x),$seen{$x}=1 unless (defined $seen{$x});}print join(":",@F);'`
+ENV_PATH=$ac_cv_env_path
trap '' 1 2 15
@@ -1112,15 +774,6 @@ s%@RD_BIN_DATAS@%$RD_BIN_DATAS%g
s%@RD_BIN_PROGS@%$RD_BIN_PROGS%g
s%@PERLV_PATH@%$PERLV_PATH%g
s%@EXPECT_PATH@%$EXPECT_PATH%g
-s%@DIFF@%$DIFF%g
-s%@UCBMAIL@%$UCBMAIL%g
-s%@CVS@%$CVS%g
-s%@COMM@%$COMM%g
-s%@MKDIR@%$MKDIR%g
-s%@DIRNAME@%$DIRNAME%g
-s%@TOUCH@%$TOUCH%g
-s%@SENDMAIL@%$SENDMAIL%g
-s%@SORT@%$SORT%g
s%@ENV_PATH@%$ENV_PATH%g
CEOF
diff --git a/bin/configure.in b/bin/configure.in
index cdade86..02b7d71 100644
--- a/bin/configure.in
+++ b/bin/configure.in
@@ -17,30 +17,7 @@ AC_SUBST(PERLV_PATH)
EXPECT_PATH=$ac_cv_path_EXPECT_PATH
AC_SUBST(EXPECT_PATH)
-# locate tools to build $PATH for env. order is significant. want to be
-# sure that we pick up the the proper diff and ucbmail in bin/env.
-unset ENV_PATH
-AC_PATH_PROG(DIFF,diff,no)
-ENV_PATH=`dirname $ac_cv_path_DIFF`
-AC_PATH_PROG(UCBMAIL,Mail,no)
-ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_UCBMAIL`"
-AC_PATH_PROG(CVS,cvs,no)
-ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_CVS`"
-AC_PATH_PROG(COMM,comm,no)
-ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_COMM`"
-AC_PATH_PROG(MKDIR,mkdir,no)
-ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_MKDIR`"
-AC_PATH_PROG(DIRNAME,dirname,no)
-ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_DIRNAME`"
-AC_PATH_PROG(TOUCH,touch,no)
-ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_TOUCH`"
-AC_PATH_PROG(SENDMAIL,sendmail,no)
-ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_SENDMAIL`"
-AC_PATH_PROG(SORT,sort,no)
-ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_SORT`"
-ENV_PATH="$ENV_PATH:/usr/local/bin:/usr/bin"
-
-ENV_PATH=`echo $ENV_PATH | $PERLV_PATH -e 'foreach $x(split(":",<>)){next unless (length($x));push(@F, $x),$seen{$x}=1 unless (defined $seen{$x});}print join(":",@F);'`
+ENV_PATH=$ac_cv_env_path
AC_SUBST(ENV_PATH)
AC_OUTPUT(Makefile env $RD_BIN_DATAS $RD_BIN_PROGS)
diff --git a/bin/elogin.in b/bin/elogin.in
index e75efed..5ef908b 100755
--- a/bin/elogin.in
+++ b/bin/elogin.in
@@ -234,7 +234,10 @@ proc source_password_file { } {
send_user "Error: $password_file must not be world readable/writable\n"
exit 1
}
- source $password_file
+ if [ catch {source $password_file} reason ] {
+ send_user "Error: $reason\n"
+ exit 1
+ }
}
# Log into the router.
diff --git a/bin/env.in b/bin/env.in
index 37e9a8b..1a34ce3 100644
--- a/bin/env.in
+++ b/bin/env.in
@@ -15,7 +15,6 @@ TERM=network;export TERM
TMPDIR=/tmp; export TMPDIR
BASEDIR=@prefix@; export BASEDIR
PATH=$BASEDIR/bin:@ENV_PATH@; export PATH
-#PATH=$BASEDIR/bin:/usr/local/bin:/usr/ucb:/usr/bin:/bin:/usr/lib:/usr/sbin;export PATH
CVSROOT=$BASEDIR/CVS; export CVSROOT
#
# if NOPIPE is set, temp files will be used instead of a cmd pipe during
diff --git a/bin/flogin.in b/bin/flogin.in
index 0419bb6..a43ddda 100755
--- a/bin/flogin.in
+++ b/bin/flogin.in
@@ -242,7 +242,10 @@ proc source_password_file { } {
send_user "Error: $password_file must not be world readable/writable\n"
exit 1
}
- source $password_file
+ if [ catch {source $password_file} reason ] {
+ send_user "Error: $reason\n"
+ exit 1
+ }
}
# Log into the router.
diff --git a/bin/jlogin.in b/bin/jlogin.in
index 0718321..28e773b 100755
--- a/bin/jlogin.in
+++ b/bin/jlogin.in
@@ -221,7 +221,10 @@ proc source_password_file { } {
send_user "Error: $password_file must not be world readable/writable\n"
exit 1
}
- source $password_file
+ if [ catch {source $password_file} reason ] {
+ send_user "Error: $reason\n"
+ exit 1
+ }
}
# Log into the router.
diff --git a/bin/rancid.in b/bin/rancid.in
index d7b5fbf..24b9d14 100755
--- a/bin/rancid.in
+++ b/bin/rancid.in
@@ -210,6 +210,9 @@ sub ShowVersion {
} elsif ( $1 =~ /WS-C29/) {
$type = "2900XL";
$device = "switch";
+ } elsif ( $1 =~ /WS-C35/) {
+ $type = "3500XL";
+ $device = "switch";
} else {
$type = $1;
}
@@ -352,7 +355,7 @@ sub ShowGSR {
# This routine parses "show boot"
sub ShowBoot {
- # Pick up boot variables if 7000/7200/7500/12000/2900;
+ # Pick up boot variables if 7000/7200/7500/12000/2900/3500;
# otherwise pick up bootflash.
print STDERR " In ShowBoot: $_" if ($debug);
@@ -369,7 +372,7 @@ sub ShowBoot {
$H0=1; ProcessHistory("COMMENTS","keysort","H0","!\n");
}
if ($type !~ /^(120|7)/) {
- if ($type !~ /^2900/) {
+ if ($type !~ /^(29|35)00/) {
ProcessHistory("COMMENTS","keysort","H2","!BootFlash: $_");
} else {
ProcessHistory("COMMENTS","keysort","H1","!Variable: $_");
@@ -825,8 +828,8 @@ sub WriteTerm {
/^(enable )?(password|passwd) / &&
ProcessHistory("ENABLE","","","!$1$2 <removed>\n") &&
next;
- /^username (\S+) password /&&
- ProcessHistory("USER","keysort","$1","!username $1 password <removed>\n") && next;
+ /^username (\S+)(\s.*)? password /&&
+ ProcessHistory("USER","keysort","$1","!username $1$2 password <removed>\n") && next;
/^\s*password / &&
ProcessHistory("LINE-PASS","","","! password <removed>\n") && next;
/^\s*neighbor (\S*) password / &&
diff --git a/configure b/configure
index be66c88..bcb66c1 100755
--- a/configure
+++ b/configure
@@ -790,9 +790,9 @@ subdirs="bin util"
PACKAGE=rancid
# VERSION needs to be updated such that 'make dist' uses the correct
-# filename for the direcotyr name and tarball.
+# filename for the directory name and tarball.
-VERSION=2.0
+VERSION=2.1b
echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
echo "configure:799: checking whether to enable maintainer-specific portions of Makefiles" >&5
@@ -1576,6 +1576,66 @@ if test $EXPECT_PATH = no; then
fi
+# locate ping and it's syntax
+# Extract the first word of "ping", so it can be a program name with args.
+set dummy ping; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1584: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_PING_PATH'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$PING_PATH" in
+ /*)
+ ac_cv_path_PING_PATH="$PING_PATH" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_PING_PATH="$PING_PATH" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_PING_PATH="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_PING_PATH" && ac_cv_path_PING_PATH="no"
+ ;;
+esac
+fi
+PING_PATH="$ac_cv_path_PING_PATH"
+if test -n "$PING_PATH"; then
+ echo "$ac_t""$PING_PATH" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test $PING_PATH = no; then
+ { echo "configure: error: can't locate ping." 1>&2; exit 1; }
+ exit 1
+fi
+# ping seems to take one of two formats for count (N)
+# BSD: ping -c N host
+# SVR: ping host N
+$PING_PATH -c 1 -v 127.0.0.1 > /dev/null 2>&1
+if test $? -ne 0 ; then
+ $PING_PATH 127.0.0.1 56 1 > /dev/null 2>&1
+ if test $? -ne 0 ; then
+ { echo "configure: error: can't figure out how to pass count == 1 to $PING_PATH." 1>&2; exit 1; }
+ exit 1
+ else
+ LG_PING_CMD="$PING_PATH"
+
+ fi
+else
+ LG_PING_CMD="$PING_PATH -c 1"
+
+fi
+rd_cv_lg_ping_cmd=$LG_PING_CMD
+
# RD_BIN_DATAS are bin/ .in's that need to be installed without execute
# perms.
RD_BIN_DATAS=""
@@ -1590,14 +1650,361 @@ rancid rename rrancid"
rd_cv_rd_bin_progs=$RD_BIN_PROGS
-# RD_BIN_PROGS are util/ .in's that need to be installed with execute perms.
+# RD_UTIL_PROGS are util/ .in's that need to be installed with execute perms.
RD_UTIL_PROGS="rtrfilter"
rd_cv_rd_util_progs=$RD_UTIL_PROGS
+# RD_UTIL_LG_PROGS are util/lg .in's that need to be installed with execute
+# perms.
+RD_UTIL_LG_PROGS="lg.cgi lgform.cgi"
+
+rd_cv_rd_util_lg_progs=$RD_UTIL_LG_PROGS
+
INST_PROGS=$progs
+# locate tools to build $PATH for env. order is significant. want to be
+# sure that we pick up the the proper diff and ucbmail in bin/env.
+unset ENV_PATH
+# Extract the first word of "diff", so it can be a program name with args.
+set dummy diff; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1674: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_DIFF'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$DIFF" in
+ /*)
+ ac_cv_path_DIFF="$DIFF" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_DIFF="$DIFF" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_DIFF="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_DIFF" && ac_cv_path_DIFF="no"
+ ;;
+esac
+fi
+DIFF="$ac_cv_path_DIFF"
+if test -n "$DIFF"; then
+ echo "$ac_t""$DIFF" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ENV_PATH=`dirname $ac_cv_path_DIFF`
+# Extract the first word of "Mail", so it can be a program name with args.
+set dummy Mail; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1711: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_UCBMAIL'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$UCBMAIL" in
+ /*)
+ ac_cv_path_UCBMAIL="$UCBMAIL" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_UCBMAIL="$UCBMAIL" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_UCBMAIL="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_UCBMAIL" && ac_cv_path_UCBMAIL="no"
+ ;;
+esac
+fi
+UCBMAIL="$ac_cv_path_UCBMAIL"
+if test -n "$UCBMAIL"; then
+ echo "$ac_t""$UCBMAIL" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_UCBMAIL`"
+# Extract the first word of "cvs", so it can be a program name with args.
+set dummy cvs; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1748: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_CVS'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$CVS" in
+ /*)
+ ac_cv_path_CVS="$CVS" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_CVS="$CVS" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_CVS="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_CVS" && ac_cv_path_CVS="no"
+ ;;
+esac
+fi
+CVS="$ac_cv_path_CVS"
+if test -n "$CVS"; then
+ echo "$ac_t""$CVS" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_CVS`"
+# Extract the first word of "comm", so it can be a program name with args.
+set dummy comm; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1785: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_COMM'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$COMM" in
+ /*)
+ ac_cv_path_COMM="$COMM" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_COMM="$COMM" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_COMM="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_COMM" && ac_cv_path_COMM="no"
+ ;;
+esac
+fi
+COMM="$ac_cv_path_COMM"
+if test -n "$COMM"; then
+ echo "$ac_t""$COMM" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_COMM`"
+# Extract the first word of "mkdir", so it can be a program name with args.
+set dummy mkdir; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1822: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_MKDIR'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$MKDIR" in
+ /*)
+ ac_cv_path_MKDIR="$MKDIR" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_MKDIR="$MKDIR" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_MKDIR="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_MKDIR" && ac_cv_path_MKDIR="no"
+ ;;
+esac
+fi
+MKDIR="$ac_cv_path_MKDIR"
+if test -n "$MKDIR"; then
+ echo "$ac_t""$MKDIR" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_MKDIR`"
+# Extract the first word of "dirname", so it can be a program name with args.
+set dummy dirname; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1859: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_DIRNAME'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$DIRNAME" in
+ /*)
+ ac_cv_path_DIRNAME="$DIRNAME" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_DIRNAME="$DIRNAME" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_DIRNAME="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_DIRNAME" && ac_cv_path_DIRNAME="no"
+ ;;
+esac
+fi
+DIRNAME="$ac_cv_path_DIRNAME"
+if test -n "$DIRNAME"; then
+ echo "$ac_t""$DIRNAME" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_DIRNAME`"
+# Extract the first word of "touch", so it can be a program name with args.
+set dummy touch; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1896: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_TOUCH'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$TOUCH" in
+ /*)
+ ac_cv_path_TOUCH="$TOUCH" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_TOUCH="$TOUCH" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_TOUCH="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_TOUCH" && ac_cv_path_TOUCH="no"
+ ;;
+esac
+fi
+TOUCH="$ac_cv_path_TOUCH"
+if test -n "$TOUCH"; then
+ echo "$ac_t""$TOUCH" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_TOUCH`"
+# Extract the first word of "sendmail", so it can be a program name with args.
+set dummy sendmail; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1933: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_SENDMAIL'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$SENDMAIL" in
+ /*)
+ ac_cv_path_SENDMAIL="$SENDMAIL" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_SENDMAIL="$SENDMAIL" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_SENDMAIL="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_SENDMAIL" && ac_cv_path_SENDMAIL="no"
+ ;;
+esac
+fi
+SENDMAIL="$ac_cv_path_SENDMAIL"
+if test -n "$SENDMAIL"; then
+ echo "$ac_t""$SENDMAIL" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_SENDMAIL`"
+# Extract the first word of "sort", so it can be a program name with args.
+set dummy sort; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1970: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_SORT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$SORT" in
+ /*)
+ ac_cv_path_SORT="$SORT" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_SORT="$SORT" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_SORT="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_SORT" && ac_cv_path_SORT="no"
+ ;;
+esac
+fi
+SORT="$ac_cv_path_SORT"
+if test -n "$SORT"; then
+ echo "$ac_t""$SORT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_SORT`"
+ENV_PATH="$ENV_PATH:/usr/local/bin:/usr/bin"
+
+ENV_PATH=`echo $ENV_PATH | $PERLV_PATH -e 'foreach $x(split(":",<>)){next unless (length($x));push(@F, $x),$seen{$x}=1 unless (defined $seen{$x});}print join(":",@F);'`
+ac_cv_env_path=$ENV_PATH
+
trap '' 1 2 15
cat > confcache <<\EOF
@@ -1772,10 +2179,14 @@ s%@MAKE@%$MAKE%g
s%@TAR@%$TAR%g
s%@PERLV_PATH@%$PERLV_PATH%g
s%@EXPECT_PATH@%$EXPECT_PATH%g
+s%@PING_PATH@%$PING_PATH%g
+s%@LG_PING_CMD@%$LG_PING_CMD%g
s%@RD_BIN_DATAS@%$RD_BIN_DATAS%g
s%@RD_BIN_PROGS@%$RD_BIN_PROGS%g
s%@RD_UTIL_PROGS@%$RD_UTIL_PROGS%g
+s%@RD_UTIL_LG_PROGS@%$RD_UTIL_LG_PROGS%g
s%@INST_PROGS@%$INST_PROGS%g
+s%@ENV_PATH@%$ENV_PATH%g
CEOF
EOF
diff --git a/configure.in b/configure.in
index fde93cd..039662f 100644
--- a/configure.in
+++ b/configure.in
@@ -14,7 +14,7 @@ PACKAGE=rancid
# VERSION needs to be updated such that 'make dist' uses the correct
# filename for the directory name and tarball.
AC_SUBST(VERSION)
-VERSION=2.0
+VERSION=2.1b
AM_MAINTAINER_MODE()
@@ -92,6 +92,31 @@ if test $EXPECT_PATH = no; then
fi
AC_SUBST(EXPECT_PATH)
+# locate ping and it's syntax
+AC_PATH_PROG(PING_PATH,ping,no)
+if test $PING_PATH = no; then
+ AC_MSG_ERROR([can't locate ping.])
+ exit 1
+fi
+# ping seems to take one of two formats for count (N)
+# BSD: ping -c N host
+# SVR: ping host N
+$PING_PATH -c 1 -v 127.0.0.1 > /dev/null 2>&1
+if test $? -ne 0 ; then
+ $PING_PATH 127.0.0.1 56 1 > /dev/null 2>&1
+ if test $? -ne 0 ; then
+ AC_MSG_ERROR([can't figure out how to pass count == 1 to $PING_PATH.])
+ exit 1
+ else
+ LG_PING_CMD="$PING_PATH"
+ AC_SUBST(LG_PING_CMD)
+ fi
+else
+ LG_PING_CMD="$PING_PATH -c 1"
+ AC_SUBST(LG_PING_CMD)
+fi
+rd_cv_lg_ping_cmd=$LG_PING_CMD
+
# RD_BIN_DATAS are bin/ .in's that need to be installed without execute
# perms.
RD_BIN_DATAS=""
@@ -106,14 +131,46 @@ rancid rename rrancid"
AC_SUBST(RD_BIN_PROGS)
rd_cv_rd_bin_progs=$RD_BIN_PROGS
-# RD_BIN_PROGS are util/ .in's that need to be installed with execute perms.
+# RD_UTIL_PROGS are util/ .in's that need to be installed with execute perms.
RD_UTIL_PROGS="rtrfilter"
AC_SUBST(RD_UTIL_PROGS)
rd_cv_rd_util_progs=$RD_UTIL_PROGS
+# RD_UTIL_LG_PROGS are util/lg .in's that need to be installed with execute
+# perms.
+RD_UTIL_LG_PROGS="lg.cgi lgform.cgi"
+AC_SUBST(RD_UTIL_LG_PROGS)
+rd_cv_rd_util_lg_progs=$RD_UTIL_LG_PROGS
+
AC_SUBST(INST_PROGS)
INST_PROGS=$progs
+# locate tools to build $PATH for env. order is significant. want to be
+# sure that we pick up the the proper diff and ucbmail in bin/env.
+unset ENV_PATH
+AC_PATH_PROG(DIFF,diff,no)
+ENV_PATH=`dirname $ac_cv_path_DIFF`
+AC_PATH_PROG(UCBMAIL,Mail,no)
+ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_UCBMAIL`"
+AC_PATH_PROG(CVS,cvs,no)
+ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_CVS`"
+AC_PATH_PROG(COMM,comm,no)
+ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_COMM`"
+AC_PATH_PROG(MKDIR,mkdir,no)
+ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_MKDIR`"
+AC_PATH_PROG(DIRNAME,dirname,no)
+ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_DIRNAME`"
+AC_PATH_PROG(TOUCH,touch,no)
+ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_TOUCH`"
+AC_PATH_PROG(SENDMAIL,sendmail,no)
+ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_SENDMAIL`"
+AC_PATH_PROG(SORT,sort,no)
+ENV_PATH="$ENV_PATH:`dirname $ac_cv_path_SORT`"
+ENV_PATH="$ENV_PATH:/usr/local/bin:/usr/bin"
+
+ENV_PATH=`echo $ENV_PATH | $PERLV_PATH -e 'foreach $x(split(":",<>)){next unless (length($x));push(@F, $x),$seen{$x}=1 unless (defined $seen{$x});}print join(":",@F);'`
+ac_cv_env_path=$ENV_PATH
+AC_SUBST(ENV_PATH)
AC_OUTPUT(Makefile)
diff --git a/util/Makefile.in b/util/Makefile.in
index bf41c54..2432c26 100644
--- a/util/Makefile.in
+++ b/util/Makefile.in
@@ -11,14 +11,17 @@ install: all
for file in $(UTIL_PROGS) ; do \
$(INSTALL) $$file $(PREFIX)/util; \
done; \
- for file in *README* ; do \
+ for file in *README*; do \
$(INSTALL_DATA) $$file $(PREFIX)/util; \
- done
+ done; \
+ cd lg; $(MAKE) -e install
clean:
+ cd lg; $(MAKE) -e clean; \
rm -f Makefile $(UTIL_PROGS)
distclean: clean
+ cd lg; $(MAKE) -e distclean; \
rm -f config.log config.status
distdir:
@@ -27,4 +30,5 @@ distdir:
done; \
for file in configure $(UTIL_PROGS:=.in) ; do \
$(INSTALL) $$file $(distdir); \
- done
+ done; \
+ cd lg; $(MAKE) -e distdir
diff --git a/util/README b/util/README
index 5a4005c..cecb9df 100644
--- a/util/README
+++ b/util/README
@@ -2,5 +2,6 @@ rancid/util includes some utilities that either don't seem to belong
in rancid/bin (ie: not part of the core pkg), contributed sources, or
sources included for convenience.
-README - This file.
-rtrfilter - mail filter for diffs
+README This file.
+lg looking glass pkg
+rtrfilter mail filter for diffs
diff --git a/util/configure b/util/configure
index 598f74f..8d59fa6 100755
--- a/util/configure
+++ b/util/configure
@@ -523,8 +523,6 @@ fi
-
-
ac_aux_dir=
for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
if test -f $ac_dir/install-sh; then
@@ -544,6 +542,11 @@ ac_config_guess=$ac_aux_dir/config.guess
ac_config_sub=$ac_aux_dir/config.sub
ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+subdirs="lg"
+
+
+
+
# Find a good install program. We prefer a C program (faster),
# so one script is as good as another. But avoid the broken or
# incompatible versions:
@@ -556,7 +559,7 @@ ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# ./install, which can be erroneously created by make from ./install.sh.
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:560: checking for a BSD compatible install" >&5
+echo "configure:563: checking for a BSD compatible install" >&5
if test -z "$INSTALL"; then
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -762,6 +765,7 @@ s%@includedir@%$includedir%g
s%@oldincludedir@%$oldincludedir%g
s%@infodir@%$infodir%g
s%@mandir@%$mandir%g
+s%@subdirs@%$subdirs%g
s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
s%@INSTALL_DATA@%$INSTALL_DATA%g
@@ -880,6 +884,103 @@ chmod +x $CONFIG_STATUS
rm -fr confdefs* $ac_clean_files
test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+if test "$no_recursion" != yes; then
+
+ # Remove --cache-file and --srcdir arguments so they do not pile up.
+ ac_sub_configure_args=
+ ac_prev=
+ for ac_arg in $ac_configure_args; do
+ if test -n "$ac_prev"; then
+ ac_prev=
+ continue
+ fi
+ case "$ac_arg" in
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ ;;
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ ;;
+ *) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;;
+ esac
+ done
+
+ for ac_config_dir in lg; do
+
+ # Do not complain, so a configure script can configure whichever
+ # parts of a large source tree are present.
+ if test ! -d $srcdir/$ac_config_dir; then
+ continue
+ fi
+
+ echo configuring in $ac_config_dir
+
+ case "$srcdir" in
+ .) ;;
+ *)
+ if test -d ./$ac_config_dir || mkdir ./$ac_config_dir; then :;
+ else
+ { echo "configure: error: can not create `pwd`/$ac_config_dir" 1>&2; exit 1; }
+ fi
+ ;;
+ esac
+
+ ac_popdir=`pwd`
+ cd $ac_config_dir
+
+ # A "../" for each directory in /$ac_config_dir.
+ ac_dots=`echo $ac_config_dir|sed -e 's%^\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'`
+
+ case "$srcdir" in
+ .) # No --srcdir option. We are building in place.
+ ac_sub_srcdir=$srcdir ;;
+ /*) # Absolute path.
+ ac_sub_srcdir=$srcdir/$ac_config_dir ;;
+ *) # Relative path.
+ ac_sub_srcdir=$ac_dots$srcdir/$ac_config_dir ;;
+ esac
+
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_sub_srcdir/configure; then
+ ac_sub_configure=$ac_sub_srcdir/configure
+ elif test -f $ac_sub_srcdir/configure.in; then
+ ac_sub_configure=$ac_configure
+ else
+ echo "configure: warning: no configuration information is in $ac_config_dir" 1>&2
+ ac_sub_configure=
+ fi
+
+ # The recursion is here.
+ if test -n "$ac_sub_configure"; then
+
+ # Make the cache file name correct relative to the subdirectory.
+ case "$cache_file" in
+ /*) ac_sub_cache_file=$cache_file ;;
+ *) # Relative path.
+ ac_sub_cache_file="$ac_dots$cache_file" ;;
+ esac
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo "running ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir"
+ # The eval makes quoting arguments work.
+ if eval ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir
+ then :
+ else
+ { echo "configure: error: $ac_sub_configure failed for $ac_config_dir" 1>&2; exit 1; }
+ fi
+ fi
+
+ cd $ac_popdir
+ done
+fi
+
# fix permissions on scripts.
for file in $RD_UTIL_PROGS; do chmod a+x $file; done
diff --git a/util/configure.in b/util/configure.in
index 4861771..17f7b4e 100644
--- a/util/configure.in
+++ b/util/configure.in
@@ -1,6 +1,8 @@
dnl Process this file with autoconf to produce a configure script.
AC_INIT()
+AC_CONFIG_SUBDIRS(lg)
+
dnl default install location
AC_PREFIX_DEFAULT(/usr/local/rancid)
diff --git a/util/lg/Makefile.in b/util/lg/Makefile.in
new file mode 100644
index 0000000..274fa5a
--- /dev/null
+++ b/util/lg/Makefile.in
@@ -0,0 +1,43 @@
+PREFIX = @prefix@
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+UTIL_LG_PROGS = @RD_UTIL_LG_PROGS@
+
+DISTDIR=../$(distdir)/lg
+
+all:
+
+install: all
+ for file in $(UTIL_LG_PROGS) ; do \
+ $(INSTALL) $$file $(PREFIX)/util/lg; \
+ done; \
+ if test -f $(PREFIX)/util/lg/lg.conf ; then \
+ echo "WARNING: *** $(PREFIX)/util/lg/lg.conf exists: installing as lg.conf.new."; \
+ echo " *** review lg.conf.new for new/deprecated switches"; \
+ $(INSTALL_DATA) lg.conf $(PREFIX)/util/lg/lg.conf.new; \
+ else \
+ $(INSTALL_DATA) lg.conf $(PREFIX)/util/lg; \
+ fi; \
+ for file in *README* *.html; do \
+ $(INSTALL_DATA) $$file $(PREFIX)/util/lg; \
+ done
+
+clean:
+ rm -f Makefile $(UTIL_LG_PROGS) lg.conf
+
+distclean: clean
+ rm -f config.log config.status
+
+distdir:
+ test -d $(DISTDIR) \
+ || mkdir $(DISTDIR) \
+ || exit 1; \
+ chmod 777 $(DISTDIR); \
+ for file in Makefile.in configure.in *README* *.html lg.conf.in ; do \
+ $(INSTALL_DATA) $$file $(DISTDIR); \
+ done; \
+ for file in configure $(UTIL_LG_PROGS:=.in) ; do \
+ $(INSTALL) $$file $(DISTDIR); \
+ done
diff --git a/util/lg/README b/util/lg/README
new file mode 100644
index 0000000..f574278
--- /dev/null
+++ b/util/lg/README
@@ -0,0 +1,64 @@
+This is a looking glass based on Ed Kern's which can be found on
+http://nitrous.digex.net/. This version supports cisco and
+juniper, uses rancid's [cj]login to login (so rcmd is not necessary,
+it can use telnet, ssh, or rsh), and has some additional commands
+implemented. There are a few cisco commands where either no juniper
+exists or we have not had time to implement yet.
+
+packing list:
+README This file.
+index.html often the default document the server will load, contains
+ an html redirect to load lgform.cgi
+lg.conf looking glass configuration file
+lg.cgi work horse of the looking glass
+lgform.cgi front-end form for the looking glass engine
+lgnotes.html manual for the looking glass
+
+the looking glass requires the CGI and LockFile-Simple perl modules.
+these can be retrieved from CPAN, http://www.cpan.org/. CGI's home is
+ftp://ftp-genome.wi.mit.edu/pub/software/WWW/. it also requires
+the POSIX module (for strftime) and Sys::Syslog, which i believe come
+with perl5.
+
+basic installation instructions:
+
+The configure and make install process will make variable substitutions
+and install bits in /usr/local/rancid/util/lg (or <prefix>/util/lg).
+
+1) make the scripts/html available to your server (httpd) by
+ creating a directory in your server's document root directory
+ (apache's httpd.conf "DocumentRoot" variable).
+ eg: assuming the default in freebsd's apache pkg
+ mkdir /usr/local/www/data/lg
+
+ then either:
+ - copy the files {lgnotes.html, lg.cgi, lgform.cgi} to
+ /usr/local/www/data/lg
+ OR
+ - create symlinks from /usr/local/www/data/lg to each of {lgnotes.html,
+ lg.cgi, lgform.cgi} in /usr/local/rancid/util/lg
+
+ note on links: if you use symlinks, you have to configure apache to
+ allow following symlinks. eg:
+ % cat /usr/local/www/data/lg/.htaccess
+ Options FollowSymLinks ExecCGI
+
+2) the LG needs to be able to find and read lg.conf. by default this
+ is installed as <PREFIX>/util/lg/lg.conf and the LG will look there.
+ however, LG_CONF environment variable can be used to move it elsewhere.
+
+ to get LG_CONF into the enviroment, you can SetEnvIf in apache's
+ httpd.conf like this for example:
+ SetEnvIf Request_URI "\/lg/.*.cgi" LG_CONF=/usr/local/util/lg/lg.conf
+
+3) edit <PREFIX>/util/lg/lg.conf.
+
+4) set-up cron jobs to rotate the log file and clean out old cache files.
+ see LG_CACHE_DIR & LG_LOG in lg.conf. something like (YMMV):
+
+ # rotate lookingglass log
+ #0 0 * * * cd /usr/local/www/data/lg/tmp; /usr/local/etc/savelog -m 666 -c14 lg.log
+ 0 0 * * * cd /usr/local/www/data/lg/tmp; /bin/mv lg.log lg.log.0
+ # clean out the lookingglass cache
+ 0 0 * * * cd /usr/local/www/data/lg/tmp; /usr/local/bin/find . -type f -maxdepth 1 \( \! -name lg.log\* \) -mtime +1 -exec rm -f {} \;
+
diff --git a/util/lg/configure b/util/lg/configure
new file mode 100755
index 0000000..e41f619
--- /dev/null
+++ b/util/lg/configure
@@ -0,0 +1,991 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_default_prefix=/usr/local/rancid
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.13"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+subdirs="lg"
+
+
+
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:563: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
+ for ac_dir in $PATH; do
+ # Account for people who put trailing slashes in PATH elements.
+ case "$ac_dir/" in
+ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ if test -f $ac_dir/$ac_prog; then
+ if test $ac_prog = install &&
+ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+ IFS="$ac_save_IFS"
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL="$ac_cv_path_install"
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL="$ac_install_sh"
+ fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+RD_UTIL_LG_PROGS=$rd_cv_rd_util_lg_progs
+
+
+PERLV_PATH=$ac_cv_path_PERLV_PATH
+
+
+LG_PING_CMD=$rd_cv_lg_ping_cmd
+
+
+ENV_PATH=$ac_cv_env_path
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+cat > conftest.defs <<\EOF
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
+s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g
+s%\[%\\&%g
+s%\]%\\&%g
+s%\$%$$%g
+EOF
+DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
+rm -f conftest.defs
+
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile lg.conf $RD_UTIL_LG_PROGS" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@subdirs@%$subdirs%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@RD_UTIL_LG_PROGS@%$RD_UTIL_LG_PROGS%g
+s%@PERLV_PATH@%$PERLV_PATH%g
+s%@LG_PING_CMD@%$LG_PING_CMD%g
+s%@ENV_PATH@%$ENV_PATH%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile lg.conf $RD_UTIL_LG_PROGS"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
+if test "$no_recursion" != yes; then
+
+ # Remove --cache-file and --srcdir arguments so they do not pile up.
+ ac_sub_configure_args=
+ ac_prev=
+ for ac_arg in $ac_configure_args; do
+ if test -n "$ac_prev"; then
+ ac_prev=
+ continue
+ fi
+ case "$ac_arg" in
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ ;;
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ ;;
+ *) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;;
+ esac
+ done
+
+ for ac_config_dir in lg; do
+
+ # Do not complain, so a configure script can configure whichever
+ # parts of a large source tree are present.
+ if test ! -d $srcdir/$ac_config_dir; then
+ continue
+ fi
+
+ echo configuring in $ac_config_dir
+
+ case "$srcdir" in
+ .) ;;
+ *)
+ if test -d ./$ac_config_dir || mkdir ./$ac_config_dir; then :;
+ else
+ { echo "configure: error: can not create `pwd`/$ac_config_dir" 1>&2; exit 1; }
+ fi
+ ;;
+ esac
+
+ ac_popdir=`pwd`
+ cd $ac_config_dir
+
+ # A "../" for each directory in /$ac_config_dir.
+ ac_dots=`echo $ac_config_dir|sed -e 's%^\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'`
+
+ case "$srcdir" in
+ .) # No --srcdir option. We are building in place.
+ ac_sub_srcdir=$srcdir ;;
+ /*) # Absolute path.
+ ac_sub_srcdir=$srcdir/$ac_config_dir ;;
+ *) # Relative path.
+ ac_sub_srcdir=$ac_dots$srcdir/$ac_config_dir ;;
+ esac
+
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_sub_srcdir/configure; then
+ ac_sub_configure=$ac_sub_srcdir/configure
+ elif test -f $ac_sub_srcdir/configure.in; then
+ ac_sub_configure=$ac_configure
+ else
+ echo "configure: warning: no configuration information is in $ac_config_dir" 1>&2
+ ac_sub_configure=
+ fi
+
+ # The recursion is here.
+ if test -n "$ac_sub_configure"; then
+
+ # Make the cache file name correct relative to the subdirectory.
+ case "$cache_file" in
+ /*) ac_sub_cache_file=$cache_file ;;
+ *) # Relative path.
+ ac_sub_cache_file="$ac_dots$cache_file" ;;
+ esac
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo "running ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir"
+ # The eval makes quoting arguments work.
+ if eval ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir
+ then :
+ else
+ { echo "configure: error: $ac_sub_configure failed for $ac_config_dir" 1>&2; exit 1; }
+ fi
+ fi
+
+ cd $ac_popdir
+ done
+fi
+
+
+# fix permissions on scripts.
+for file in $RD_UTIL_LG_PROGS; do chmod a+x $file; done
diff --git a/util/lg/configure.in b/util/lg/configure.in
new file mode 100644
index 0000000..445b74d
--- /dev/null
+++ b/util/lg/configure.in
@@ -0,0 +1,27 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT()
+
+AC_CONFIG_SUBDIRS(lg)
+
+dnl default install location
+AC_PREFIX_DEFAULT(/usr/local/rancid)
+
+dnl install program(s)
+AC_PROG_INSTALL
+
+RD_UTIL_LG_PROGS=$rd_cv_rd_util_lg_progs
+AC_SUBST(RD_UTIL_LG_PROGS)
+
+PERLV_PATH=$ac_cv_path_PERLV_PATH
+AC_SUBST(PERLV_PATH)
+
+LG_PING_CMD=$rd_cv_lg_ping_cmd
+AC_SUBST(LG_PING_CMD)
+
+ENV_PATH=$ac_cv_env_path
+AC_SUBST(ENV_PATH)
+
+AC_OUTPUT(Makefile lg.conf $RD_UTIL_LG_PROGS)
+
+# fix permissions on scripts.
+for file in $RD_UTIL_LG_PROGS; do chmod a+x $file; done
diff --git a/util/lg/index.html b/util/lg/index.html
new file mode 100644
index 0000000..0087a90
--- /dev/null
+++ b/util/lg/index.html
@@ -0,0 +1,9 @@
+<!--
+ this is just a redirection page to load lg.cgi - is there a way to
+ make the server load a .cgi as it's default document?
+ this can also be done with a redirect (which is supposedly more universally
+ supported. something like <redirect URL=lgform.cgi>. not sure...i'm not
+ a web person. but this works for netscape.
+-->
+
+<meta http-equiv=Refresh content="0; URL=lgform.cgi">
diff --git a/util/lg/lg.cgi.in b/util/lg/lg.cgi.in
new file mode 100755
index 0000000..0320b7d
--- /dev/null
+++ b/util/lg/lg.cgi.in
@@ -0,0 +1,449 @@
+#!@PERLV_PATH@
+# Looking glass
+# vars: query, router, args
+
+BEGIN {
+$me = $0;
+$me =~ s/.*\/(\S+)$/$1/;
+}
+
+use CGI qw/:standard/;
+use POSIX qw(strftime);
+use Sys::Syslog;
+use LockFile::Simple qw(lock trylock unlock);
+
+my($BASEDIR) = "@prefix@";
+my($pingcmd) = "@LG_PING_CMD@";
+
+my($query, $max_time_diff, $cache_dir, $cloginrc, @results);
+my($type, $router_param, $remote_user, $arg, $router, $mfg);
+
+if (!defined($ENV{HOME})) { $ENV{HOME} = "."; }
+
+# read LG configuration file
+sub readconf
+{
+ my($conffile, $cmds);
+ local(*CONF);
+ if (defined($env{LG_CONF})) {
+ $conffile = $env{LG_CONF};
+ } else {
+ $conffile = "$BASEDIR/util/lg/lg.conf";
+ }
+
+ if (! -f $conffile) {
+ return;
+ }
+
+ if (open(CONF, "< $conffile")) {
+ while (<CONF>) {
+ next if (/^\s*(#|$)/);
+ $cmds .= $_;
+ }
+ close(CONF);
+ eval $cmds;
+ } else {
+ printf(STDERR "ERROR: couldn\'t open the configuration file: $conffile: $!\n");
+ exit(255);
+ }
+
+ return;
+}
+# logging
+sub dolog
+{
+ my($level, $msg) = @_;
+
+ if (defined($LG_LOG) && $LG_LOG !~ /\//) {
+ openlog($me, "pid", $LG_LOG);
+ syslog($level, "%s", $msg);
+ closelog;
+ } else {
+ local(*LOG);
+ my($file);
+ if (defined($LG_LOG)) {
+ $file = $LG_LOG;
+ } else {
+ $file = "$cache_dir/lg.log";
+ }
+ # log date, hostname, query, addr
+ open(LOG,">>$file") ;
+ printf(LOG "$msg");
+ close(LOG);
+ }
+ return;
+}
+# run commands on the router
+sub DoRsh
+{
+ my ($router, $mfg, $type, $arg) = @_;
+ my($ctime) = time();
+
+ my($lckobj) = LockFile::Simple->make(-delay => $lock_int,
+ -max => $max_lock_wait, -hold => $max_lock_hold);
+
+ if ($pingcmd =~ /\d$/) {
+ `$pingcmd $router`;
+ } else {
+ `$pingcmd $router 56 1`;
+ }
+ if ($?) {
+ return ("$router is unreachable. Try again later.\n");
+ }
+ if (! $lckobj->lock("$cache_dir/$router")) {
+ return ("$router is busy. Try again later.\n");
+ }
+ @results = &DoCmd($router, $mfg, $type, $arg);
+ $lckobj->unlock("$cache_dir/$router");
+ return (@results);
+}
+sub DoCmd
+{
+ my($rtr, $mfg, $type, $arg) = @_;
+ local(*CMD);
+
+ if ($mfg =~ /juniper/i) {
+ open(CMD, "jlogin -f $cloginrc -c \'$juniperCmd{$type} $arg\' $rtr |");
+ $cmd = $juniperCmd{$type};
+ } else {
+ open(CMD, "clogin -noenable -f $cloginrc -c \'$ciscoCmd{$type} $arg\' $rtr |");
+ $cmd = $ciscoCmd{$type};
+ }
+ while (<CMD>) {
+ tr/\015//d;
+ if (/^error:/i) {
+ dolog(LOG_ERR, $_);
+ return ($_);
+ }
+# push(@results, $_);
+ if (/$cmd/) {
+ ($prompt) = /^(\S*)[\#>]/;
+# push(@results, "prompt = $prompt\n\n");
+ last;
+ }
+ }
+ while (<CMD>) {
+ last if /^$prompt[\#>]/;
+ tr/\015//d;
+ push(@results, $_);
+ }
+ while (<CMD>) {}
+ close(CMD);
+ return @results;
+}
+# convert a ipv4 address mask to prefix length
+sub mask2len {
+ my($mask) = shift;
+ my($a, $b, $c, $d) = split('\.', $mask);
+ my($p, $len);
+
+ $p = ~ (($a << 24) + ($b << 16) + ($c << 8) + $d);
+ for ($len = 32; $p > 0; $len --) {
+ $p = $p >> 1;
+ }
+
+ return($len);
+}
+# create the page and log the transaction...
+sub print_results {
+
+ my($timestr) = strftime("%a %b %e %H:%M:%S %Y %Z", gmtime);
+ dolog(LOG_INFO, sprintf("%s %s %s %s\n",
+ $ENV{REMOTE_HOST}, $ENV{REMOTE_ADDR}, $ENV{REMOTE_USER},
+ "- - [$timestr] $type $router $arg"));
+ print $query->header;
+ print $query->start_html("Looking Glass Results - $router");
+
+ $timestr = strftime("%a %b %e %H:%M:%S %Y %Z", gmtime);
+
+ # add the company image, LG_IMAGE
+ print $LG_IMAGE;
+
+ print <<HEAD ;
+ </b></font>
+ <font size=+3><b><h1>Looking Glass Results - $router
+ </b></h1></font>
+ <hr>
+
+ <center>
+ <b>Date:</b> $timestr
+ <p>
+ <b>Query:</b> $cmdDisp{$type}
+ <br>
+HEAD
+
+ if ($arg) { print "<b>Argument(s):</b> $arg\n"; }
+ print "</center>\n";
+
+ print <<END ;
+ <!--$cached-->
+ </center>
+ <p>
+ <pre>
+END
+
+ if ($seconds) { print "<b>From cache (number of seconds old (max $max_time_diff)):</b> $seconds\n\n" ; }
+
+ print @results;
+
+ print <<END ;
+ </pre>
+ <!--- end page content --->
+ </body>
+END
+
+ print $query->end_html;
+ exit;
+
+} #end sub print_results
+
+
+# read the configuration file if it exists.
+readconf();
+
+## The script will now cache the results as simple files in the $cache_dir,
+## named after the type of query (queries must, of course, be one word no
+## spaces). Modify $max_time_diff to set the lifetime for each cache.
+## Currently, cache lifetime is the same for all queries.
+# for most web servers, cache_dir must be writable by uid nobody
+if (defined($LG_CACHE_DIR)) {
+ $cache_dir = $LG_CACHE_DIR;
+} else {
+ $cache_dir = "./tmp";
+}
+
+# when to display cache? max time difference (in seconds)
+if (defined($LG_CACHE_TIME)) {
+ $max_time_diff = $LG_CACHE_TIME;
+} else {
+ $max_time_diff = "600" ;
+}
+
+# max seconds to wait for a 'router' lock to free up
+$max_lock_wait = 30;
+$lock_int = 5;
+$max_lock_hold = 300;
+
+# clogin setup
+if (defined($LG_CLOGINRC)) {
+ $cloginrc = $LG_CLOGINRC;
+} else {
+ $cloginrc = "$BASEDIR/.cloginrc";
+}
+
+$query = new CGI;
+
+# get form data and validate
+$type = ($query->param('query'))[0];
+$router_param = ($query->param('router'))[0];
+$remote_user = $ENV{REMOTE_USER};
+$arg = ($query->param('args'))[0];
+# handle multiple args
+@arg = split(' ', $arg);
+
+# verify commands, arguments, etc.
+($router, $mfg) = split(':', $router_param);
+if (!defined($type) || !defined($router)) {
+ $results[0] = "You must at least choose a Query and a router. Try buying a clue.\n";
+ &print_results;
+}
+
+# conversion of command "type" passed from lgform.cgi to the vendor's syntax.
+%ciscoCmd = (
+ #acl => "sh access-list",
+ #aspath => "sh ip as-path-access-list",
+ #communitylist => "sh ip community-list",
+ damp => "sh ip bgp dampened-paths",
+ framerelay => "sh frame-relay pvc",
+ interface => "sh interface",
+ intbrief => "sh ip interface",
+ log => "sh logging",
+ mbgp => "sh ip mbgp",
+ mbgpsum => "sh ip mbgp summary",
+ regex => "sh ip bgp regex",
+ route => "sh ip route",
+ #routemap => "sh route-map",
+ ping => "ping",
+ prefix => "sh ip bgp",
+ prefixlist => "sh ip prefix-list",
+ summary => "sh ip bgp summary",
+ trace => "traceroute"
+ );
+%juniperCmd = (
+ #acl => "sh access-list",
+ #aspath => "sh ip as-path-access-list",
+ #communitylist => "sh ip community-list",
+ damp => "show route damping suppressed terse table inet.0",
+ interface => "sh interface",
+ log => "show log messages",
+ mbgp => "sh route table inet.2 terse",
+ mbgpsum => "sh bgp summary",
+ #regex => "sh route table inet.0 aspath-regex",
+ route => "sh route table inet.0",
+ #routemap => "sh route-map",
+ ping => "ping rapid count 5",
+ prefix => "sh route table inet.0",
+ #prefixlist => "sh ip prefix-list",
+ summary => "sh bgp summary",
+ trace => "traceroute"
+ );
+%cmdDisp = (
+ #acl => "show access-list",
+ #aspath => "show ip as-path-access-list",
+ #communitylist => "show ip community-list",
+ damp => "show ip bgp dampened-paths",
+ log => "show logging",
+ mbgp => "show ip mbgp",
+ mbgpsum => "show ip mbgp summary",
+ regex => "show ip bgp regex",
+ route => "show ip route",
+ #routemap => "show route-map",
+ ping => "ping",
+ prefix => "show ip bgp",
+ prefixlist => "show ip prefix-list",
+ summary => "show ip bgp summary",
+ trace => "traceroute"
+ );
+
+# not all cmds/queries are implemented for junipers
+if ($mfg =~ /juniper/ && ! defined($juniperCmd{$type})) {
+ $results[0] = "$cmdDisp{$type} not implemented for junipers. sorry.\n";
+ &print_results;
+}
+
+
+if ($type eq "prefix" || $type eq "mbgp" || $type eq "route" ) {
+ if ($arg[0] !~ /^\d+\.\d+\.\d+\.\d+$/) {
+ $results[0] = "The IP address \"$arg[0]\" is not valid and lacking an address would over-burden our router.\n";
+ &print_results;
+ } elsif (defined($arg[1]) && $arg[1] !~ /^\d+\.\d+\.\d+\.\d+$/) {
+ $results[0] = "The IP netmask \"$arg[1]\" is not valid.\n";
+ &print_results;
+ }
+ if ($mfg =~ /juniper/i && defined($arg[1])) {
+ $arg = $arg[0] . "/" . mask2len($arg[1]);
+ }
+} elsif ($type eq "framerelay") {
+ if ($arg[0] > 15 && $arg[0] < 1024) {
+ $arg = $arg[0];
+ } else {
+ undef($arg);
+ }
+} elsif ($type eq "interface") {
+ if ($arg[1] =~ /[-\/0-9:.]+/) {
+ $arg = $arg[0] . " " . $arg[1];
+ } else {
+ if ($arg[0] =~ /^b/i && $mfg =~ /cisco/i) {
+ $type = "intbrief";
+ $arg = "brief";
+ } else {
+ $arg = $arg[0];
+ }
+ }
+} elsif ($type eq "log") {
+ $arg[0] =~ s/^\s*|//;
+ if ($arg[0] =~ /^\s*$/) {
+ shift(@arg);
+ }
+ if ($arg[0] !~ /^\s*$/) {
+ if ($mfg =~ /cisco/i) {
+ $arg = " | include " . join(' ', @arg);
+ } elsif ($mfg =~ /juniper/i) {
+ $arg = " | match \"" . join(' ', @arg) . "\"";
+ }
+ } else {
+ undef($arg);
+ }
+} elsif ($type eq "ping" || $type eq "trace") {
+ if ($arg[0] !~ /^\d+\.\d+\.\d+\.\d+$/) {
+ if ($arg[0] !~ /([A-Za-z0-9-]*.)*[A-Za-z0-9-]*.(com|edu|net|org)/) {
+ $results[0] = "That argument ($arg[0]) is not valid.\n";
+ &print_results;
+ }
+ }
+ $arg = $arg[0];
+} elsif ($type eq "aspath" || $type eq "communitylist") {
+ if ($arg[0] !~ /^\d+$/ || ($arg[0] < 1 && $arg[0] > 199)) {
+ $results[0] = "That argument ($arg[0]) is not valid.\n";
+ &print_results;
+ }
+ $arg = $arg[0];
+} elsif ($type eq "acl") {
+ if ($arg[0] !~ /^\d+$/ || ($arg[0] < 100 && $arg[0] > 199) ||
+ ($arg[0] < 1300 && $arg[0] > 2699)) {
+ $results[0] = "That argument ($arg[0]) is not valid.\n";
+ &print_results;
+ }
+ $arg = $arg[0];
+ # don't show the jewels
+ &print_results if ($arg == 98 || $arg == 99);
+} elsif ($type eq "prefixlist" || $type eq "routemap") {
+ if ($arg[0] !~ /^[A-Za-z][^\s\"]*$/) {
+ $results[0] = "That argument ($arg[0]) is not valid.\n";
+ &print_results;
+ }
+ $arg = $arg[0];
+} elsif ($type eq "regex") {
+ $arg = $arg[0];
+ if ($#arg > 1) {
+ for ($n = 1; $n <= $#arg - 1; $n++) { $arg .= " " . $arg[$n]; }
+ }
+ if ($arg !~ /^[0-9_ ^.*+?[\])\(-]*\$?$/ || $arg =~ /^\s*$/) {
+ $results[0] = "That argument ($arg[0]) is not valid.\n";
+ &print_results;
+ }
+ # pathetic excuses for lookups
+ if ($arg =~ /^[_.* ^]*(\*|1|701|1239|1280|1740|3561|5462|10303)+[_\$]*$/ ||
+ $arg =~ /^[_.* ^]*(1|701|1239|1280|1740|3561|5462|10303)+[_ .]*[\[*.]/) {
+ $results[0] = "Get real. Such a query has potential to over-burden our router.\nLook that up on your own router.\n";
+ &print_results;
+ }
+ # escape any ()
+ $arg =~ s/([\(\)])/\\$1/g;
+} elsif ($type eq "damp" || $type eq "summary" || $type eq "mbgpsum") {
+ undef($arg);
+}
+
+# cache the following
+if ($type eq "summary" || $type eq "mbgpsu" || $type eq "damp" || $type eq "log") {
+ if (!$arg) {
+ # cache requests with no addr/argument
+ local(*CACHE);
+
+ my($file) = "$cache_dir/$type" ;
+ $file =~ s/\s+/_/g;
+ $file .= "_$router";
+
+ if (-e $file) {
+ # see if cache exists
+ @stat = stat($file);
+ $ftime = $stat[9] ;
+ $dtime = time - $stat[9] ;
+
+ # see if we are within cache time
+ if ($dtime <= $max_time_diff) {
+ open(CACHE,"$file") ;
+ while (<CACHE>) { push(@results, $_); }
+ close CACHE ;
+ $seconds = $dtime;
+ &print_results ;
+ }
+ }
+
+ # else, execute command and save to a new cache file
+ open(CACHE,">$file") || die "couldnt create cache file $file" ;
+
+ @results = &DoRsh($router, $mfg, $type, $arg);
+
+ print CACHE "@results";
+ close CACHE ;
+ } else {
+ @results = &DoRsh($router, $mfg, $type, $arg);
+ }
+ &print_results ;
+} # end dampened-paths/flap-statistics
+
+@results = &DoRsh($router, $mfg, $type, $arg);
+&print_results ;
+
+exit ;
diff --git a/util/lg/lg.conf.in b/util/lg/lg.conf.in
new file mode 100644
index 0000000..7e8a96f
--- /dev/null
+++ b/util/lg/lg.conf.in
@@ -0,0 +1,79 @@
+# configuration file for the looking glass
+#
+# note: these are perl statements! mind the syntax
+#
+# adjust the path to find [cj]login, telnet, ssh, rsh, etc.
+#
+$ENV{PATH}="@prefix@/bin:@ENV_PATH@";
+#
+#
+# LG_IMAGE is the filename of an image you wish to appear at the top
+# of the LG pages. it can also be other html goo, like
+# the first example. this is just handed to print, so \n and
+# the like will work.
+#
+#$LG_IMAGE="<img src=/icons/rancid.gif hspace=0>\n <font size=+2>FOO</font>";
+#$LG_IMAGE="<img src=rancid.gif hspace=0>\n";
+#
+#
+# LG_ROUTERDB is the router.db in rancid's router.db format, listing
+# the routers and their platform that should be available to
+# the looking glass. if defined, the LG will use this variable
+# to find the router.db. if not defined, it will look for it
+# at <prefix>/util/lg/router.db. if it does not exist, it will
+# build the list from <prefix>/*/router.db (ie: the router.db's
+# from all your groups). note that if you choose this last
+# option; the group directories and router.db files' modes may
+# have to be changed, depending upon the UID/GID of the user
+# your server (httpd) runs under, since rancid's default mask
+# is 007 (see bin/env). routers marked 'down' are skipped.
+#
+#$LG_ROUTERDB="@prefix@/util/lg/router.db";
+#
+#
+# LG_CLOGINRC is the .cloginrc that the LG should use. it defaults to
+# <prefix>/.cloginrc. note that the .cloginrc must readable
+# by the user or group (UID / GID) that will be running the CGI
+# and the clogin (and friends) will not allow a world readable
+# .cloginrc. this is normally the user the server (httpd) runs
+# under.
+#
+#$LG_CLOGINRC="@prefix@/.cloginrc";
+#
+#
+# LG_SINGLE *** not implemented.
+#$LG_SINGLE=0;
+#
+#
+# LG_CACHE_DIR is the location of the cache directory. the LG uses this
+# to hold lock files, lg.log log file, and o/p from commands
+# that can be very verbose. it defaults to "tmp", ie: relative
+# to the directory where lg.cgi runs in your server's (httpd's)
+# DocumentRoot (eg: /usr/local/www/data/lg/tmp).
+#
+#$LG_CACHE_DIR="./tmp";
+#
+#
+# LG_CACHE_TIME is the number of seconds the LG should cache o/p from certain
+# commands; those that tend to produce a lot of o/p, such as
+# 'show ip bgp dampened-paths'. it defaults to 600 seconds
+# (10 minutes).
+#
+#$LG_CACHE_TIME=600;
+#
+#
+# LG_LOG is either a FQPN (fully qualified path name) the syslog
+# facility to use for logging. if not defined, the LG
+# will log to LG_CACHE_DIR/lg.log. possible syslog facility
+# values are from the facility codes in /usr/include/syslog.h
+# minus the 'LOG_' and lower case.
+#
+#$LG_LOG="$LG_CACHE_DIR/lg.log";
+#$LG_LOG="/tmp/lg.log";
+#$LG_LOG="local0";
+#
+#
+# LG_AS_REG *** not implemented.
+#
+#@LG_AS_REG=();
+#
diff --git a/util/lg/lgform.cgi.in b/util/lg/lgform.cgi.in
new file mode 100755
index 0000000..762c9d8
--- /dev/null
+++ b/util/lg/lgform.cgi.in
@@ -0,0 +1,200 @@
+#!@PERLV_PATH@
+# lgform.cgi - Looking glass front-end
+# produces html form for calling lg.cgi
+
+use CGI qw/:standard/;
+
+my(@rtrlist, %rtrlabels);
+my($BASEDIR) = "@prefix@";
+
+
+# read LG configuration file
+sub readconf
+{
+ my($conffile, $cmds);
+ local(*CONF);
+ if (defined($env{LG_CONF})) {
+ $conffile = $env{LG_CONF};
+ } else {
+ $conffile = "$BASEDIR/util/lg/lg.conf";
+ }
+
+ if (! -f $conffile) {
+ return;
+ }
+
+ if (open(CONF, "< $conffile")) {
+ while (<CONF>) {
+ next if (/^\s*(#|$)/);
+ $cmds .= $_;
+ }
+ close(CONF);
+ eval $cmds;
+ } else {
+ printf(STDERR "ERROR: couldn\'t open the configuration file: $conffile: $!\n");
+ exit(255);
+ }
+
+ return;
+}
+# read router.db file
+sub readrouters
+{
+ my($rtrdb);
+ local(*RTR);
+
+ if (defined($LG_ROUTERDB)) {
+ $rtrdb = $LG_ROUTERDB;
+ } else {
+ $rtrdb = "$BASEDIR/util/lg/router.db";
+ }
+
+ if (! -f $rtrdb) {
+ my(@dirs, $dir);
+ # if the router.db file does not exist, try to compile from
+ # the rancid group's router.db files.
+ local(*DIR);
+ if (! opendir(DIR, $BASEDIR)) {
+ printf(STDERR "ERROR: couldn\'t read $BASEDIR: $!\n");
+ } else {
+ while ($dir = readdir(DIR)) {
+ next if ($dir =~ /^(\.|\.\.|CVS|bin|logs|util)$/);
+ push(@dirs, $dir) if (-d "$BASEDIR/$dir");
+ }
+ closedir(DIR);
+
+ foreach $dir (@dirs) {
+ if (! opendir(DIR, "$BASEDIR/$dir")) {
+ printf(STDERR "ERROR: couldn\'t read $BASEDIR/$dir: $!\n");
+ next;
+ }
+ closedir(DIR);
+ next if (! -f "$BASEDIR/$dir/router.db");
+ if (open(RTR, "< $BASEDIR/$dir/router.db")) {
+ while (<RTR>) {
+ next if (/^\s*(#|$)/);
+ # fqdn:mfg:state
+ @record = split('\:', $_);
+ next if ($record[2] !~ /up/i || $record[1] !~ /(cisco|juniper)/);
+ push(@rtrlist, join(':', ($record[0], $record[1])));
+ $rtrlabels{join(':', ($record[0], $record[1]))} = $record[0];
+ }
+ close(RTR);
+ } else {
+ printf(STDERR "ERROR: couldn\'t open the router.db file: $BASEDIR/$dir/router.db: $!\n");
+ }
+ }
+ }
+ } else {
+ if (open(RTR, "< $rtrdb")) {
+ while (<RTR>) {
+ next if (/^\s*(#|$)/);
+ # fqdn:mfg:state
+ @record = split('\:', $_);
+ next if ($record[2] !~ /up/i || $record[1] !~ /(cisco|juniper)/);
+ push(@rtrlist, join(':', ($record[0], $record[1])));
+ $rtrlabels{join(':', ($record[0], $record[1]))} = $record[0];
+ }
+ close(RTR);
+ } else {
+ printf(STDERR "ERROR: couldn\'t open the router.db file: $rtrdb: $!\n");
+ exit(255);
+ }
+ }
+
+ return;
+}
+
+# read the configuration file if it exists.
+readconf();
+
+$query = new CGI;
+
+print $query->header;
+print $query->start_html("LookingGlass form");
+
+print "<BODY>";
+
+# add the company image, LG_IMAGE
+print $LG_IMAGE;
+
+print <<HEAD ;
+<br>
+<B><FONT SIZE=+2>Looking Glass</FONT></B>
+<br>
+<hr>
+HEAD
+
+# start table, etc here
+print <<DOTABLE ;
+<form action=lg.cgi method=GET>
+<center>
+<table border cellspacing=0 width=575 align=center>
+
+DOTABLE
+
+# available query types here
+print <<QTYPES ;
+<tr valign=top>
+ <TD><B>Query:</B>
+<dd><input type=radio name="query" value="framerelay">show frame-relay pvc [DLCI]</DD>
+<dd><input type=radio name="query" value="interface">show interface &lt;interface&gt;</DD>
+<dd><input type=radio name="query" value="prefix">show ip bgp &lt;prefix&gt; [netmask]</DD>
+<dd><input type=radio name="query" value="regex">show ip bgp regex &lt;reg_exp&gt;</DD>
+<dd><input type=radio name="query" value="summary">show ip bgp summary</DD>
+<dd><input type=radio name="query" value="damp">show ip bgp dampened-paths</DD>
+<dd><input type=radio name="query" value="prefixlist">show ip prefix-list &lt;list_name&gt;</DD>
+<dd><input type=radio name="query" value="route">show ip route &lt;prefix&gt; [netmask]</DD>
+<dd><input type=radio name="query" value="mbgp">show ip mbgp &lt;prefix&gt; [netmask]</dd>
+<dd><input type=radio name="query" value="mbgpsum">show ip mbgp summary</dd>
+<dd><input type=radio name="query" value="log">show logging [| &lt;match_string&gt;]</DD>
+<dd><input type=radio name="query" value="ping">ping &lt;IP_addr | FQDN&gt;</dd>
+<dd><input type=radio name="query" value="trace">traceroute &lt;IP_addr | FQDN&gt;</DD>
+
+<P><B>Argument(s):</B> <INPUT name="args" size=30></P>
+ </TD>
+ <td ALIGH=left VALIGN=top>
+ <b>Router:</B>
+
+<dd>
+QTYPES
+
+# unimplemented/disabled/removed query types.
+#
+# <dd>show ip bgp neighbor &lt;IP_addr&gt;</dd>
+# <dd>show ip bgp neighbor &lt;IP_addr&gt; advertised routes</dd>
+# <dd>show ip bgp neighbor &lt;IP_addr&gt; flap statistics</dd>
+# <dd>show ip bgp neighbor &lt;IP_addr&gt; received</dd>
+# <dd>show ip bgp neighbor &lt;IP_addr&gt; routes</dd>
+#
+# <dd><input type=radio name="query" value="aspath">sh ip as-path-access-list &lt;list_number&gt;</DD>
+# <dd><input type="radio" name="query" value="acl">sh access-list &lt;list_number&gt;</dd>
+# <dd><input type=radio name="query" value="communitylist">sh ip community-list &lt;list_number&gt;<DD>
+# <dd><input type=radio name="query" value="routemap">sh ip route-map &lt;map_name&gt;</DD>
+
+# read routers table and create the scrolling list
+readrouters();
+print $query->scrolling_list(-name => 'router',
+ -values => \@rtrlist,
+ -size => 20,
+ -labels => \%rtrlabels);
+
+# end
+print <<TAIL ;
+</dd>
+</td>
+</TABLE>
+<p><input type=submit value=Submit> <INPUT type=reset value=Reset></FORM>
+</center>
+<br>
+<a href=lgnotes.html>Looking Glass notes</a>
+TAIL
+
+print <<TAIL ;
+<p>
+</body>
+TAIL
+
+print $query->end_html;
+
+exit 0;
diff --git a/util/lg/lgnotes.html b/util/lg/lgnotes.html
new file mode 100644
index 0000000..5fa2336
--- /dev/null
+++ b/util/lg/lgnotes.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+
+<head>
+<meta http-equiv="Content-Type"
+content="text/html; charset=iso-8859-1">
+<title>Looking Glass Notes</title>
+</head>
+
+</strong></font><font face="Arial"> </font><font
+size=+3><strong>&nbsp;&nbsp;&nbsp;Looking Glass Notes
+</strong></font></p>
+<br>
+<p>
+<ul>
+Just a few straight forward notes on our implementation of
+Ed Kern's looking glass. See the "real thing" at
+<a href=http://nitrous.digex.net>http://nitrous.digex.net</a>.
+</ul>
+</p>
+<p>
+<UL>
+<li>Items in the queries column which do not have radio buttons
+ are not yet implemented but are on the list of things to do.</li>
+<li>Some items are not implemented for the junipers yet (so, as i get
+ to it) or no equivalent exists.
+<li>If there is something which you feel is missing, feel free to ask
+ and/or send comments to the <a href=mailto:rancid@shrubbery.net>maintainer
+ </a> to implement it. No guarantees.</li>
+<li>Only one query per router allowed at any given time. This is to avoid
+ resource deprivation. The looking glass will attempt to serialize
+ queries.</li>
+<li>The looking glass will ping a router prior to querying it to avoid
+ trying to query routers which are down or otherwise inaccessible.</li>
+<li>Login failures can be intermittent or permanent, either due to the
+ router being inaccessible from the looking glass machine,
+ or authorization failure(s). Contact your local network engineering
+ folks to resolve login failures.</li>
+<li>Queries followed by &lt;something&gt; require an argument(s) in the text
+ window below the query list. Some queries take optional arguments
+ denoted by [something]. Multiple arguments should be separated by a
+ space.</li>
+<li>Note that output from certain queries is cached by the server and may
+ be slightly out of date. These queries will be noted as such in the
+ output. This is limited to queries which could produce lots of output,
+ such as 'sh ip bgp dampened-paths'.</li>
+<li>Note that some queries have potential to produce great load on the router
+ and produce lots of output, such as 'sh ip bgp' or 'sh ip bgp reg '^3561'.
+ The looking glass attempts to deny such commands.</li>
+</ul>
+</body>
+</html>