diff options
author | Tar Committer <tar@ocjtech.us> | 2000-11-24 22:14:14 +0000 |
---|---|---|
committer | Tar Committer <tar@ocjtech.us> | 2000-11-24 22:14:14 +0000 |
commit | 25c2b7c2c8a333b276c3499bcce004137d4b4fe0 (patch) | |
tree | baad136bdfcea88812dd658a682f126d1af4dfc3 /util/lg | |
parent | 1651adc35224e149715bd85af4ba108c5ee184bc (diff) | |
download | rancid-25c2b7c2c8a333b276c3499bcce004137d4b4fe0.tar.gz rancid-25c2b7c2c8a333b276c3499bcce004137d4b4fe0.tar.xz rancid-25c2b7c2c8a333b276c3499bcce004137d4b4fe0.zip |
Imported from rancid-2.1b.tar.gz.rancid-2.1b
Diffstat (limited to 'util/lg')
-rw-r--r-- | util/lg/Makefile.in | 43 | ||||
-rw-r--r-- | util/lg/README | 64 | ||||
-rwxr-xr-x | util/lg/configure | 991 | ||||
-rw-r--r-- | util/lg/configure.in | 27 | ||||
-rw-r--r-- | util/lg/index.html | 9 | ||||
-rwxr-xr-x | util/lg/lg.cgi.in | 449 | ||||
-rw-r--r-- | util/lg/lg.conf.in | 79 | ||||
-rwxr-xr-x | util/lg/lgform.cgi.in | 200 | ||||
-rw-r--r-- | util/lg/lgnotes.html | 52 |
9 files changed, 1914 insertions, 0 deletions
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 <interface></DD> +<dd><input type=radio name="query" value="prefix">show ip bgp <prefix> [netmask]</DD> +<dd><input type=radio name="query" value="regex">show ip bgp regex <reg_exp></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 <list_name></DD> +<dd><input type=radio name="query" value="route">show ip route <prefix> [netmask]</DD> +<dd><input type=radio name="query" value="mbgp">show ip mbgp <prefix> [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 [| <match_string>]</DD> +<dd><input type=radio name="query" value="ping">ping <IP_addr | FQDN></dd> +<dd><input type=radio name="query" value="trace">traceroute <IP_addr | FQDN></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 <IP_addr></dd> +# <dd>show ip bgp neighbor <IP_addr> advertised routes</dd> +# <dd>show ip bgp neighbor <IP_addr> flap statistics</dd> +# <dd>show ip bgp neighbor <IP_addr> received</dd> +# <dd>show ip bgp neighbor <IP_addr> routes</dd> +# +# <dd><input type=radio name="query" value="aspath">sh ip as-path-access-list <list_number></DD> +# <dd><input type="radio" name="query" value="acl">sh access-list <list_number></dd> +# <dd><input type=radio name="query" value="communitylist">sh ip community-list <list_number><DD> +# <dd><input type=radio name="query" value="routemap">sh ip route-map <map_name></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> 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 <something> 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> |