modified Cisco addition patch for Rancid

Janos Mohacsi janos at budapest.dante.org.uk
Mon Jun 3 17:44:20 UTC 2002


Dear All,
	I have created modified Cisco handler. It was annoying that to be
able to see the configuration you should have the enable password. In the
rancid the 'write term' command to display the currently running
configuration on the terminal and then store in the database. We are using
a 'hack' to remove this limitation:

1. The logged in user, that is collecting the configuration is runnuing on
privilege level 2 e.g. :

	username <user> privilege 2 password <removed>

2. We allow these users to execute show configuration:

	privilege exec level 2 show configuration

This way we don't need the enable password. To support this changes I
invented a new type of rancid command: 'mcrancid' and a corresponding
config entry 'mcisco'. The patch is available in the attachment.

I don't know in detail how the gnu automake was used, so some
changes might happened. Feel free to comment and integrate to the next
version of rancid.

Best Regards,
		Janos Mohacsi
-------------- next part --------------
diff -rcN rancid-2.2.1.orig/bin/Makefile.in rancid-2.2.1/bin/Makefile.in
*** rancid-2.2.1.orig/bin/Makefile.in	Fri May  3 00:08:05 2002
--- rancid-2.2.1/bin/Makefile.in	Mon Jun  3 18:32:22 2002
***************
*** 123,130 ****
  CONFIG_HEADER = ../include/config.h
  CONFIG_CLEAN_FILES =  alogin arancid blogin brancid cat5rancid clogin \
  control_rancid create_cvs do-diffs elogin env erancid f10rancid flogin \
! francid jlogin jrancid hlogin hrancid mrancid par rancid-fe rancid \
! rename rrancid xrancid
  PROGRAMS =  $(bin_PROGRAMS)
  
  
--- 123,130 ----
  CONFIG_HEADER = ../include/config.h
  CONFIG_CLEAN_FILES =  alogin arancid blogin brancid cat5rancid clogin \
  control_rancid create_cvs do-diffs elogin env erancid f10rancid flogin \
! francid jlogin jrancid hlogin hrancid mrancid mcrancid par rancid-fe \
! rancid rename rrancid xrancid
  PROGRAMS =  $(bin_PROGRAMS)
  
  
***************
*** 142,154 ****
  DIST_COMMON =  Makefile.am Makefile.in alogin.in arancid.in blogin.in \
  brancid.in cat5rancid.in clogin.in control_rancid.in create_cvs.in \
  do-diffs.in elogin.in env.in erancid.in f10rancid.in flogin.in \
! francid.in hlogin.in hrancid.in jlogin.in jrancid.in mrancid.in par.in \
! rancid-fe.in rancid.in rename.in rrancid.in xrancid.in
  
  
  DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
  
  GZIP_ENV = --best
  SOURCES = $(hpfilter_SOURCES)
  OBJECTS = $(hpfilter_OBJECTS)
  
--- 142,156 ----
  DIST_COMMON =  Makefile.am Makefile.in alogin.in arancid.in blogin.in \
  brancid.in cat5rancid.in clogin.in control_rancid.in create_cvs.in \
  do-diffs.in elogin.in env.in erancid.in f10rancid.in flogin.in \
! francid.in hlogin.in hrancid.in jlogin.in jrancid.in mcrancid.in \
! mrancid.in par.in rancid-fe.in rancid.in rename.in rrancid.in \
! xrancid.in
  
  
  DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
  
  GZIP_ENV = --best
+ DEP_FILES =  .deps/hpfilter.P
  SOURCES = $(hpfilter_SOURCES)
  OBJECTS = $(hpfilter_OBJECTS)
  
***************
*** 156,164 ****
  .SUFFIXES:
  .SUFFIXES: .S .c .o .s
  $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
! 	cd $(top_srcdir) && $(AUTOMAKE) --foreign --include-deps bin/Makefile
  
! Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
  	cd $(top_builddir) \
  	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
  
--- 158,166 ----
  .SUFFIXES:
  .SUFFIXES: .S .c .o .s
  $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
! 	cd $(top_srcdir) && $(AUTOMAKE) --foreign bin/Makefile
  
! Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
  	cd $(top_builddir) \
  	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
  
***************
*** 202,207 ****
--- 204,211 ----
  	cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
  mrancid: $(top_builddir)/config.status mrancid.in
  	cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+ mcrancid: $(top_builddir)/config.status mcrancid.in
+ 	cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
  par: $(top_builddir)/config.status par.in
  	cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
  rancid-fe: $(top_builddir)/config.status rancid-fe.in
***************
*** 240,248 ****
  	  rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
  	done
  
- .c.o:
- 	$(COMPILE) -c $<
- 
  .s.o:
  	$(COMPILE) -c $<
  
--- 244,249 ----
***************
*** 289,294 ****
--- 290,300 ----
  subdir = bin
  
  distdir: $(DISTFILES)
+ 	here=`cd $(top_builddir) && pwd`; \
+ 	top_distdir=`cd $(top_distdir) && pwd`; \
+ 	distdir=`cd $(distdir) && pwd`; \
+ 	cd $(top_srcdir) \
+ 	  && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --foreign bin/Makefile
  	@for file in $(DISTFILES); do \
  	  d=$(srcdir); \
  	  if test -d $$d/$$file; then \
***************
*** 299,306 ****
  	    || cp -p $$d/$$file $(distdir)/$$file || :; \
  	  fi; \
  	done
- hpfilter.o: hpfilter.c ../include/config.h ../include/version.h
  
  info-am:
  info: info-am
  dvi-am:
--- 305,342 ----
  	    || cp -p $$d/$$file $(distdir)/$$file || :; \
  	  fi; \
  	done
  
+ DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+ 
+ -include $(DEP_FILES)
+ 
+ mostlyclean-depend:
+ 
+ clean-depend:
+ 
+ distclean-depend:
+ 	-rm -rf .deps
+ 
+ maintainer-clean-depend:
+ 
+ %.o: %.c
+ 	@echo '$(COMPILE) -c $<'; \
+ 	$(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ 	@-cp .deps/$(*F).pp .deps/$(*F).P; \
+ 	tr ' ' '\012' < .deps/$(*F).pp \
+ 	  | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ 	    >> .deps/$(*F).P; \
+ 	rm .deps/$(*F).pp
+ 
+ %.lo: %.c
+ 	@echo '$(LTCOMPILE) -c $<'; \
+ 	$(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ 	@-sed -e 's/^\([^:]*\)\.o[ 	]*:/\1.lo \1.o :/' \
+ 	  < .deps/$(*F).pp > .deps/$(*F).P; \
+ 	tr ' ' '\012' < .deps/$(*F).pp \
+ 	  | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ 	    >> .deps/$(*F).P; \
+ 	rm -f .deps/$(*F).pp
  info-am:
  info: info-am
  dvi-am:
***************
*** 338,360 ****
  
  maintainer-clean-generic:
  mostlyclean-am:  mostlyclean-binPROGRAMS mostlyclean-compile \
! 		mostlyclean-tags mostlyclean-generic
  
  mostlyclean: mostlyclean-am
  
! clean-am:  clean-binPROGRAMS clean-compile clean-tags clean-generic \
! 		mostlyclean-am
  
  clean: clean-am
  
  distclean-am:  distclean-binPROGRAMS distclean-compile distclean-tags \
! 		distclean-generic clean-am
  
  distclean: distclean-am
  
  maintainer-clean-am:  maintainer-clean-binPROGRAMS \
  		maintainer-clean-compile maintainer-clean-tags \
! 		maintainer-clean-generic distclean-am
  	@echo "This command is intended for maintainers to use;"
  	@echo "it deletes files that may require special tools to rebuild."
  
--- 374,397 ----
  
  maintainer-clean-generic:
  mostlyclean-am:  mostlyclean-binPROGRAMS mostlyclean-compile \
! 		mostlyclean-tags mostlyclean-depend mostlyclean-generic
  
  mostlyclean: mostlyclean-am
  
! clean-am:  clean-binPROGRAMS clean-compile clean-tags clean-depend \
! 		clean-generic mostlyclean-am
  
  clean: clean-am
  
  distclean-am:  distclean-binPROGRAMS distclean-compile distclean-tags \
! 		distclean-depend distclean-generic clean-am
  
  distclean: distclean-am
  
  maintainer-clean-am:  maintainer-clean-binPROGRAMS \
  		maintainer-clean-compile maintainer-clean-tags \
! 		maintainer-clean-depend maintainer-clean-generic \
! 		distclean-am
  	@echo "This command is intended for maintainers to use;"
  	@echo "it deletes files that may require special tools to rebuild."
  
***************
*** 364,375 ****
  maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
  mostlyclean-compile distclean-compile clean-compile \
  maintainer-clean-compile tags mostlyclean-tags distclean-tags \
! clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
! check-am installcheck-am installcheck install-exec-am install-exec \
! install-data-am install-data install-am install uninstall-am uninstall \
! all-redirect all-am all installdirs mostlyclean-generic \
! distclean-generic clean-generic maintainer-clean-generic clean \
! mostlyclean distclean maintainer-clean
  
  
  install: all
--- 401,413 ----
  maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
  mostlyclean-compile distclean-compile clean-compile \
  maintainer-clean-compile tags mostlyclean-tags distclean-tags \
! clean-tags maintainer-clean-tags distdir mostlyclean-depend \
! distclean-depend clean-depend maintainer-clean-depend info-am info \
! dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
! install-exec install-data-am install-data install-am install \
! uninstall-am uninstall all-redirect all-am all installdirs \
! mostlyclean-generic distclean-generic clean-generic \
! maintainer-clean-generic clean mostlyclean distclean maintainer-clean
  
  
  install: all
diff -rcN rancid-2.2.1.orig/bin/mcrancid.in rancid-2.2.1/bin/mcrancid.in
*** rancid-2.2.1.orig/bin/mcrancid.in	Thu Jan  1 01:00:00 1970
--- rancid-2.2.1/bin/mcrancid.in	Mon Jun  3 17:44:15 2002
***************
*** 0 ****
--- 1,1251 ----
+ #!@PERLV_PATH@
+ ##
+ ##
+ ## Copyright (C) 1997-2001 by Henry Kilmer.
+ ## All rights reserved.
+ ##
+ ## This software may be freely copied, modified and redistributed without
+ ## fee for non-commerical purposes provided that this copyright notice is
+ ## preserved intact on all copies and modified copies.
+ ##
+ ## There is no warranty or other guarantee of fitness of this software.
+ ## It is provided solely "as is". The author(s) disclaim(s) all
+ ## responsibility and liability with respect to this software's usage
+ ## or its effect upon hardware, computer systems, other software, or
+ ## anything else.
+ ##
+ ##
+ #
+ #  RANCID - Really Awesome New Cisco confIg Differ
+ #
+ # usage: rancid [-d] [-l] [-f filename | $host]
+ #
+ use Getopt::Std;
+ getopts('dflm');
+ $log = $opt_l;
+ $debug = $opt_d;
+ $file = $opt_f;
+ $host = $ARGV[0];
+ $clean_run = 0;
+ $found_end = 0;
+ $timeo = 90;			# clogin timeout in seconds
+ 
+ my(%filter_pwds);		# password filtering mode
+ 
+ # This routine is used to print out the router configuration
+ sub ProcessHistory {
+     my($new_hist_tag,$new_command,$command_string, at string)=(@_);
+     if((($new_hist_tag ne $hist_tag) || ($new_command ne $command))
+        && defined %history) {
+ 	print eval "$command \%history";
+ 	undef %history;
+     }
+     if (($new_hist_tag) && ($new_command) && ($command_string)) {
+ 	if ($history{$command_string}) {
+ 	    $history{$command_string} = "$history{$command_string}@string";
+ 	} else {
+ 	    $history{$command_string} = "@string";
+ 	}
+     } elsif (($new_hist_tag) && ($new_command)) {
+ 	$history{++$#history} = "@string";
+     } else {
+ 	print "@string";
+     }
+     $hist_tag = $new_hist_tag;
+     $command = $new_command;
+     1;
+ }
+ 
+ sub numerically { $a <=> $b; }
+ 
+ # This is a sort routing that will sort numerically on the
+ # keys of a hash as if it were a normal array.
+ sub keynsort {
+     local(%lines)=@_;
+     local($i) = 0;
+     local(@sorted_lines);
+     foreach $key (sort numerically keys(%lines)) {
+ 	$sorted_lines[$i] = $lines{$key};
+ 	$i++;
+     }
+     @sorted_lines;
+ }
+ 
+ # This is a sort routing that will sort on the
+ # keys of a hash as if it were a normal array.
+ sub keysort {
+     local(%lines)=@_;
+     local($i) = 0;
+     local(@sorted_lines);
+     foreach $key (sort keys(%lines)) {
+ 	$sorted_lines[$i] = $lines{$key};
+ 	$i++;
+     }
+     @sorted_lines;
+ }
+ 
+ # This is a sort routing that will sort on the
+ # values of a hash as if it were a normal array.
+ sub valsort{
+     local(%lines)=@_;
+     local($i) = 0;
+     local(@sorted_lines);
+     foreach $key (sort values %lines) {
+ 	$sorted_lines[$i] = $key;
+ 	$i++;
+     }
+     @sorted_lines;
+ }
+ 
+ # This is a numerical sort routing (ascending).
+ sub numsort {
+     local(%lines)=@_;
+     local($i) = 0;
+     local(@sorted_lines);
+     foreach $num (sort {$a <=> $b} keys %lines) {
+ 	$sorted_lines[$i] = $lines{$num};
+ 	$i++;
+     }
+     @sorted_lines;
+ }
+ 
+ # This is a sort routine that will sort on the
+ # ip address when the ip address is anywhere in
+ # the strings.
+ sub ipsort {
+     local(%lines)=@_;
+     local($i) = 0;
+     local(@sorted_lines);
+     foreach $addr (sort sortbyipaddr keys %lines) {
+ 	$sorted_lines[$i] = $lines{$addr};
+ 	$i++;
+     }
+     @sorted_lines;
+ }
+ 
+ # These two routines will sort based upon IP addresses
+ sub ipaddrval {
+     my(@a) = ($_[0] =~ m#^(\d+)\.(\d+)\.(\d+)\.(\d+)$#);
+     $a[3]+256*($a[2]+256*($a[1]+256*$a[0]));
+ }
+ sub sortbyipaddr {
+     &ipaddrval($a) <=> &ipaddrval($b);
+ }
+ 
+ # This routine parses "show version"
+ sub ShowVersion {
+     print STDERR "    In ShowVersion: $_" if ($debug);
+ 
+     while (<INPUT>) {
+ 	tr/\015//d;
+ 	study;
+ 	last if(/^$prompt/);
+ 	next if(/^(\s*|\s*$cmd\s*)$/);
+ 	return(-1) if (/command authorization failed/i);
+ 	if (/^Slave in slot (\d+) is running/) {
+ 	    $slave = " Slave:";
+ 	    next;
+ 	}
+ 	/^Cisco Secure PIX /i &&
+ 	    ProcessHistory("COMMENTS","keysort","F1", "!Image: $_") && next;
+ 	/^IOS .* Software \(([A-Za-z-0-9]*)\), .*Version\s+(.*)$/ &&
+ 	    ProcessHistory("COMMENTS","keysort","F1",
+ 		"!Image:$slave Software: $1, $2\n") && next;
+ 	/^([A-Za-z-0-9_]*) Synced to mainline version: (.*)$/ &&
+ 	    ProcessHistory("COMMENTS","keysort","F2",
+ 		"!Image:$slave $1 Synced to mainline version: $2\n") && next;
+ 	/^Compiled (.*)$/ &&
+ 	    ProcessHistory("COMMENTS","keysort","F3",
+ 		"!Image:$slave Compiled: $1\n") && next;
+ 	/^ROM: (System )?Bootstrap.*(Version.*)$/ &&
+ 	    ProcessHistory("COMMENTS","keysort","G1",
+ 		"!ROM Bootstrap: $2\n") && next;
+ 	if (/^Hardware:\s+(.*), (.* RAM), CPU (.*)$/) {
+ 	    ProcessHistory("COMMENTS","keysort","A1",
+ 		"!Chassis type: $1 - a PIX\n");
+ 	    ProcessHistory("COMMENTS","keysort","A2",
+ 		"!CPU: $3\n");
+ 	    ProcessHistory("COMMENTS","keysort","B1", "!Memory: $2\n");
+ 	}
+ 	/^Serial Number:\s+(.*)$/ &&
+ 	    ProcessHistory("COMMENTS","keysort","C1", "!$_") && next;
+ 	/^Activation Key:\s+(.*)$/ &&
+ 	    ProcessHistory("COMMENTS","keysort","C2", "!$_") && next;
+ 	/^ROM: \d+ Bootstrap .*(Version.*)$/ &&
+ 	    ProcessHistory("COMMENTS","keysort","G2",
+ 		"!ROM Image: Bootstrap $1\n!\n") && next;
+ 	/^ROM: .*(Version.*)$/ &&
+ 	    ProcessHistory("COMMENTS","keysort","G3","!ROM Image: $1\n") && next;
+ 	/^BOOTFLASH: .*(Version.*)$/ &&
+ 	    ProcessHistory("COMMENTS","keysort","G4","!BOOTFLASH: $1\n") && next;
+ 	/^BOOTLDR: .*(Version.*)$/ &&
+ 	    ProcessHistory("COMMENTS","keysort","G4","!BOOTLDR: $1\n") && next;
+ 	/^System image file is "([^\"]*)", booted via (\S*)/ &&
+ # removed the booted source due to
+ # CSCdk28131: cycling info in 'sh ver'
+ #	ProcessHistory("COMMENTS","keysort","F4","!Image: booted via $2, $1\n") &&
+ 	    ProcessHistory("COMMENTS","keysort","F4","!Image: booted $1\n") &&
+ 	    next;
+ 	/^System image file is "([^\"]*)"$/ &&
+ 	    ProcessHistory("COMMENTS","keysort","F5","!Image: $1\n") && next;
+ 	if (/(\S+)\s+\((\S+)\)\s+processor.*with (\S+[kK]) bytes/) {
+ 	    my($proc) = $1;
+ 	    my($cpu) = $2;
+ 	    my($mem) = $3;
+ 	    my($device) = "router";
+ 	    if ( $1 eq "CSC") {
+ 		$type = "AGS";
+ 	    } elsif ( $1 eq "CSC4") {
+ 		$type = "AGS+";
+ 	    } elsif ( $1 eq "2511" || $1 eq "2524" || $1 eq "AS2511-RJ") {
+ 		$type = "2500";
+ 	    } elsif ( $1 =~ /261[01]/ || $1 =~ /262[01]/ ) {
+ 		$type = "2600";
+ 	    } elsif ( $1 eq "3620" || $1 eq "3640") {
+ 		$type = "3600";
+ 	    } elsif ( $1 eq "RSP7000") {
+ 		$type = "7500";
+ 	    } elsif ( $1 =~ /RSP\d/) {
+ 		$type = "7500";
+ 	    } elsif ( $1 eq "RP1") {
+ 		$type = "7000";
+ 	    } elsif ( $1 eq "RP") {
+ 		$type = "7000";
+ 	    } elsif ( $1 =~ /720[246]/) {
+ 		$type = "7200";
+ 	    } elsif ( $1 =~ /1200[48]\/GRP/ || $1 =~ /1201[26]\/GRP/) {
+ 		$type = "12000";
+ 	    } elsif ( $1 =~ /1201[26]-8R\/GRP/) {
+ 		$type = "12000";
+ 	    } elsif ( $1 =~ /WS-C29/) {
+ 		$type = "2900XL";
+ 		$device = "switch";
+ 	    } elsif ( $1 =~ /WS-C35/) {
+ 		$type = "3500XL";
+ 		$device = "switch";
+ 	    } elsif ( $1 =~ /6000/) {
+ 		$type = "6000";
+ 		$device = "switch";
+ 	    } else {
+ 		$type = $1;
+ 	    }
+ 	    print STDERR "TYPE = $type\n" if ($debug);
+ 	    ProcessHistory("COMMENTS","keysort","A1",
+ 		"!Chassis type:$slave $proc - a $type $device\n");
+ 	    ProcessHistory("COMMENTS","keysort","B1",
+ 		"!Memory:$slave main $mem\n");
+ 	    ProcessHistory("COMMENTS","keysort","A3","!CPU:$slave $cpu\n");
+ 	    next;
+ 	}
+ 	if (/(\S+) Silicon\s*Switch Processor/) {
+ 	    if (!defined($C0)) {
+ 		$C0=1; ProcessHistory("COMMENTS","keysort","C0","!\n");
+ 	    }
+ 	    ProcessHistory("COMMENTS","keysort","C2","!SSP: $1\n");
+ 	    $ssp = 1;
+ 	    $sspmem = $1;
+ 	    next;
+ 	}
+ 	/^(\d+[kK]) bytes of multibus/ &&
+ 	    ProcessHistory("COMMENTS","keysort","B2",
+ 		"!Memory: multibus $1\n") && next;
+ 	/^(\d+[kK]) bytes of non-volatile/ &&
+ 	    ProcessHistory("COMMENTS","keysort","B3",
+ 		"!Memory: nvram $1\n") && next;
+ 	/^(\d+[kK]) bytes of flash memory/ &&
+ 	    ProcessHistory("COMMENTS","keysort","B5","!Memory: flash $1\n") &&
+ 	    next;
+ 	/^(\d+[kK]) bytes of .*flash partition/ &&
+ 	    ProcessHistory("COMMENTS","keysort","B6",
+ 		"!Memory: flash partition $1\n") && next;
+ 	/^(\d+[kK]) bytes of Flash internal/ &&
+ 	    ProcessHistory("COMMENTS","keysort","B4",
+ 		"!Memory: bootflash $1\n") && next;
+ 	if(/^(\d+[kK]) bytes of (Flash|ATA)?.*PCMCIA .*(slot|disk) ?(\d)/i) {
+ 	    ProcessHistory("COMMENTS","keysort","B7",
+ 		"!Memory: pcmcia $2 $3$4 $1\n");
+ 	    next;
+ 	}
+ 	if(/^WARNING/) {
+ 	    if (!defined($I0)) {
+ 		$I0=1;
+ 		ProcessHistory("COMMENTS","keysort","I0","!\n");
+ 	    }
+ 	    ProcessHistory("COMMENTS","keysort","I1","! $_");
+ 	    # The line after the WARNING is what to do about it.
+ 	    $_ = <INPUT>; tr/\015//d;
+ 	    ProcessHistory("COMMENTS","keysort","I1","!          $_");
+ 	}
+ 	if (/^Configuration register is (.*)$/) {
+ 	    $config_register=$1;
+ 	    next;
+ 	}
+     }
+     return(0);
+ }
+ 
+ # This routine parses "show install active"
+ sub ShowInstallActive {
+     print STDERR "    In ShowInstallActive: $_" if ($debug);
+ 
+     while (<INPUT>) {
+ 	tr/\015//d;
+ 	last if (/^$prompt/);
+ 	next if (/^(\s*|\s*$cmd\s*)$/);
+ 	return(1) if /^\s*\^\s*$/;
+ 	return(1) if /(Invalid input detected|Type help or )/;
+ 	return(-1) if (/command authorization failed/i);
+ 	ProcessHistory("COMMENTS","keysort","F5","!Image: $_") && next;
+     }
+     return(0);
+ }
+ 
+ # This routine parses "show env all"
+ sub ShowEnv {
+     # Skip if this is not a 7500, 7200, or 7000.
+     print STDERR "    In ShowEnv: $_" if ($debug);
+ 
+     while (<INPUT>) {
+ 	tr/\015//d;
+ 	last if (/^$prompt/);
+ 	next if (/^(\s*|\s*$cmd\s*)$/);
+ 	#return(1) if ($type !~ /^7/);
+ 	return(-1) if (/command authorization failed/i);
+ 	if (!defined($E0)) {
+ 	    $E0=1;
+ 	    ProcessHistory("COMMENTS","keysort","E0","!\n");
+ 	}
+ 	if (/^Arbiter type (\d), backplane type (\S+)/) {
+ 	    if (!defined($C0)) {
+ 		$C0=1; ProcessHistory("COMMENTS","keysort","C0","!\n");
+ 	    }
+ 	    ProcessHistory("COMMENTS","keysort","C1",
+ 		"!Enviromental Arbiter Type: $1\n");
+ 	    ProcessHistory("COMMENTS","keysort","A2",
+ 		"!Chassis type: $2 backplane\n");
+ 	    next;
+ 	}
+ 	/^\s*(Power [^:\n]+)$/ &&
+ 	    ProcessHistory("COMMENTS","keysort","E1","!Power: $1\n") && next;
+ 	/^\s*(Lower Power .*)/i &&
+ 	    ProcessHistory("COMMENTS","keysort","E2","!Power: $1\n") && next;
+ 	/^\s*(redundant .*)/i &&
+ 	    ProcessHistory("COMMENTS","keysort","E2","!Power: $1\n") && next;
+     }
+     ProcessHistory("COMMENTS","","","!\n");
+     return(0);
+ }
+ 
+ # This routine parses "show gsr chassis-info" for the gsr
+ # This will create arrays for hw info.
+ sub ShowGSR {
+     # Skip if this is not a 1200n.
+     print STDERR "    In ShowGSR: $_" if ($debug);
+ 
+     while (<INPUT>) {
+ 	tr/\015//d;
+ 	last if (/^$prompt/);
+ 	next if (/^(\s*|\s*$cmd\s*)$/);
+ 	return(-1) if (/command authorization failed/i);
+ 	# return(1) if ($type !~ /^12[40]/);
+ 	/^$/ && next;
+ 	/^\s+Chassis: type (\S+) Fab Ver: (\S+)/ &&
+ 	    ProcessHistory("COMMENTS","keysort","D0","!\n") &&
+ 	    ProcessHistory("COMMENTS","keysort","D1",
+ 				"!GSR Chassis type: $1 Fab Ver: $2\n") &&
+ 	    next;
+ 	/^\s+Chassis S\/N: (.*)$/ &&
+ 	    ProcessHistory("COMMENTS","keysort","D2",
+ 				"!GSR Chassis S/N: $1\n") &&
+ 	    next;
+ 	/^\s+PCA: (\S+)\s*rev: (\S+)\s*dev: \S+\s*HW ver: (\S+)$/ &&
+ 	    ProcessHistory("COMMENTS","keysort","D3",
+ 				"!GSR Backplane PCA: $1, rev $2, ver $3\n") &&
+ 	    next;
+ 	/^\s+Backplane S\/N: (\S+)$/ &&
+ 	    ProcessHistory("COMMENTS","keysort","D4",
+ 				"!GSR Backplane S/N: $1\n") &&
+ 	    next;
+     }
+     ProcessHistory("COMMENTS","","","!\n");
+     return(0);
+ }
+ 
+ # This routine parses "show boot"
+ sub ShowBoot {
+     # Pick up boot variables if 7000/7200/7500/12000/2900/3500;
+     # otherwise pick up bootflash.
+     print STDERR "    In ShowBoot: $_" if ($debug);
+ 
+     while (<INPUT>) {
+ 	tr/\015//d;
+ 	last if (/^$prompt/);
+ 	next if (/^(\s*|\s*$cmd\s*)$/);
+ 	return(1) if /^\s*\^\s*$/;
+ 	return(-1) if (/command authorization failed/i);
+ 	return(1) if /Ambiguous command/i;
+ 	return(1) if /(Invalid input detected|Type help or )/;
+ 	return(1) if /(Open device \S+ failed|Error opening \S+:)/;
+ 	next if /CONFGEN variable/;
+ 	if (!defined($H0)) {
+ 	    $H0=1; ProcessHistory("COMMENTS","keysort","H0","!\n");
+ 	}
+ 	if ($type !~ /^(12[04]|7)/) {
+ 	    if ($type !~ /^(29|35)00/) {
+ 	        ProcessHistory("COMMENTS","keysort","H2","!BootFlash: $_");
+ 	    } else {
+ 	        ProcessHistory("COMMENTS","keysort","H1","!Variable: $_");
+ 	    }
+ 	} elsif (/variable/) {
+ 	    ProcessHistory("COMMENTS","keysort","H1","!Variable: $_");
+ 	}
+     }
+     ProcessHistory("COMMENTS","","","!\n");
+     return(0);
+ }
+ 
+ # This routine parses "show flash"
+ sub ShowFlash {
+     # skip if this is 7000, 7200, 7500, or 12000; else we end up with
+     # redundant data from dir /all slot0:
+     print STDERR "    In ShowFlash: $_" if ($debug);
+ 
+     while (<INPUT>) {
+ 	tr/\015//d;
+ 	last if (/^$prompt/);
+ 	next if (/^(\s*|\s*$cmd\s*)$/);
+ 	return(1) if ($type =~ /^(12[40]|7)/);
+ 	return(-1) if (/command authorization failed/i);
+ 	return(1) if /^\s*\^\s*$/;
+ 	return(1) if /(Invalid input detected|Type help or )/;
+ 	ProcessHistory("FLASH","","","!Flash: $_");
+     }
+     ProcessHistory("","","","!\n");
+     return;
+ }
+ 
+ # This routine parses "dir /all ((disk|slot)N|bootflash|nvram):"
+ sub DirSlotN {
+     # Skip if this is not a 3600, 7000, 7200, 7500, or 12000.
+     print STDERR "    In DirSlotN: $_" if ($debug);
+ 
+     my($dev) = (/\s([^\s]+):/);
+ 
+     while (<INPUT>) {
+ 	tr/\015//d;
+ 	last if (/^$prompt/);
+ 	next if (/^(\s*|\s*$cmd\s*)$/);
+ 	# return(1) if ($type !~ /^(12[40]|7|36)/);
+ 	return(1) if /^\s*\^\s*$/;
+ 	return(1) if /(Invalid input detected|Type help or )/;
+ 	return(1) if /No such device/i;
+ 	return(1) if /\%Error: No such file or directory/;
+ 	return(1) if /No space information available/;
+ 	return(-1) if /\%Error calling/;
+ 	return(-1) if /(: device being squeezed|ATA_Status time out)/i; # busy
+ 	return(-1) if (/command authorization failed/i);
+ 	return(1) if /(Open device \S+ failed|Error opening \S+:)/;
+ 	ProcessHistory("FLASH","","","!Flash: $dev: $_");
+     }
+     ProcessHistory("","","","!\n");
+     return(0);
+ }
+ 
+ # This routine parses "show controllers"
+ sub ShowContAll {
+     # Skip if this is a 70[01]0, 7500, or 12000.
+     print STDERR "    In ShowContAll: $_" if ($debug);
+ 
+     while (<INPUT>) {
+ 	tr/\015//d;
+ 	study;
+ 	last if (/^$prompt/);
+ 	next if (/^(\s*|\s*$cmd\s*)$/);
+ 	# return(1) if ($type =~ /^(12[40]|7[05])/);
+ 	return(-1) if (/command authorization failed/i);
+ 	if (/^Interface ([^ \n(]*)/) { $INT = "$1, "; next; }
+ 	/^(BRI unit \d)/ &&
+ 	    ProcessHistory("INT","","","!Interface: $1\n") && next;
+ 	/^LANCE unit \d, NIM/ &&
+ 	    ProcessHistory("INT","","","!Interface: $_") && next;
+ 	/^(LANCE unit \d)/ &&
+ 	    ProcessHistory("INT","","","!Interface: $1\n") && next;
+ 	/(Media Type is \S+),/ &&
+ 	    ProcessHistory("INT","","","!\t$1\n");
+ 	    if (/(M\dT[^ :]*:) show controller:$/) {
+ 		my($ctlr) = $1;
+ 		$_ = <INPUT>; tr/\015//d; s/ subunit \d,//;
+ 		ProcessHistory("INT","","","!Interface: $ctlr $_");
+ 	    }
+ 	if (/^(\S+) : show controller:$/) {
+ 	    my($ctlr) = $1;
+ 	    $_ = <INPUT>; tr/\015//d; s/ subunit \d,//;
+ 	    ProcessHistory("INT","","","!Interface: $ctlr: $_");
+ 	}
+ 	/^(HD unit \d), idb/ &&
+ 	    ProcessHistory("INT","","","!Interface: $1\n") && next;
+ 	/^HD unit \d, NIM/ &&
+ 	    ProcessHistory("INT","","","!Interface: $_") && next;
+ 	/^buffer size \d+  HD unit \d, (.*)/ &&
+ 	    ProcessHistory("INT","","","!\t$1\n") && next;
+ 	/^AM79970 / && ProcessHistory("INT","","","!Interface: $_") && next;
+ 	/^buffer size \d+  (Universal Serial: .*)/ &&
+ 	    ProcessHistory("INT","","","!\t$1\n") && next;
+ 	/^Hardware is (.*)/ &&
+ 	    ProcessHistory("INT","","","!Interface: $INT$1\n") && next;
+ 	/^(QUICC Serial unit \d),/ &&
+ 	    ProcessHistory("INT","","","!$1\n") && next;
+ 	/^QUICC Ethernet .*/ &&
+ 	    ProcessHistory("INT","","","!$_") && next;
+ 	/^DTE .*\.$/ &&
+ 	    ProcessHistory("INT","","","!\t$_") && next;
+ 	/^(cable type :.*),/ &&
+ 	    ProcessHistory("INT","","","!\t$1\n") && next;
+ 	/^(.* cable.*), received clockrate \d+$/ &&
+ 	    ProcessHistory("INT","","","!\t$1\n") && next;
+ 	/^.* cable.*$/ &&
+ 	    ProcessHistory("INT","","","!\t$_") && next;
+     }
+     return(0);
+ }
+ 
+ # This routine parses "show controllers cbus"
+ # Some of this is printed out in ShowDiagbus.
+ sub ShowContCbus {
+     # Skip if this is not a 7000 or 7500.
+     print STDERR "    In ShowContCbus: $_" if ($debug);
+ 
+     while (<INPUT>) {
+ 	tr/\015//d;
+ 	last if (/^$prompt/);
+ 	next if (/^(\s*|\s*$cmd\s*)$/);
+ 	#return(1) if ($type !~ /^7[05]0/);
+ 	return(-1) if (/command authorization failed/i);
+ 	if (/^\s*slot(\d+): ([^,]+), hw (\S+), sw (\S+), ccb/) {
+ 	    $slot = $1;
+ 	    $board{$slot} = $2;
+ 	    $hwver{$slot} = $3;
+ 	    $hwucode{$slot} = $4;
+ 	} elsif (/^\s*(\S+) (\d+), hardware version (\S+), microcode version (\S+)/) {
+ 	    $slot = $2;
+ 	    $board{$slot} = $1;
+ 	    $hwver{$slot} = $3;
+ 	    $hwucode{$slot} = $4;
+ 	} elsif (/(Microcode .*)/) {
+ 	    $ucode{$slot} = $1;
+ 	} elsif (/(software loaded .*)/) {
+ 	    $ucode{$slot} = $1;
+ 	} elsif (/(\d+) Kbytes of main memory, (\d+) Kbytes cache memory/) {
+ 	    $hwmemd{$slot} = $1;
+ 	    $hwmemc{$slot} = $2;
+ 	} elsif (/byte buffers/) {
+ 	    chop;
+ 	    s/^\s*//;
+ 	    $hwbuf{$slot} = $_;
+ 	} elsif (/Interface (\d+) - (\S+ \S+),/) {
+ 	    $interface = $1;
+ 	    ProcessHistory("HW","","",
+ 		"!\n!Int $interface: in slot $slot, named $2\n"); next;
+ 	} elsif (/(\d+) buffer RX queue threshold, (\d+) buffer TX queue limit, buffer size (\d+)/) {
+ 	    ProcessHistory("HW","","","!Int $interface: rxq $1, txq $2, bufsize $3\n");
+ 	    next;
+ 	}
+     }
+     return(0);
+ }
+ 
+ # This routine parses "show diagbus"
+ # This will create arrarys for hw info.
+ sub ShowDiagbus {
+     # Skip if this is not a 7000, 70[01]0, or 7500.
+     print STDERR "    In ShowDiagbus: $_" if ($debug);
+ 
+     while (<INPUT>) {
+ 	tr/\015//d;
+ 	study;
+ 	last if (/^$prompt/);
+ 	next if (/^(\s*|\s*$cmd\s*)$/);
+ 	#return(1) if ($type !~ /^7[05]/);
+ 	return(-1) if (/command authorization failed/i);
+ 	if (/^\s*Slot (\d+):/i) {
+ 	    $slot = $1;
+ 	    next;
+ 	} elsif (/^\s*Slot (\d+) \(virtual\):/i) {
+ 	    $slot = $1;
+ 	    next;
+ 	} elsif (/^\s*(.*Processor.*|.*controller|.*controler|.*Chassis Interface)(, FRU\s?:.*)?, HW rev (\S+), board revision (\S+)/i) {
+ 	    $board = $1;
+ 	    $hwver = $3;
+ 	    $boardrev = $4;
+ 	    if ($board =~ /Processor/) {
+ 		if ($board =~ /7000 Route\/Switch/) {
+ 		    $board = "RSP7000";
+ 		} elsif ($board =~ /Route\/Switch Processor (\d)/) {
+ 		    $board = "RSP$1";
+ 		} elsif ($board =~ /Route/) {
+ 		    $board = "RP";
+ 		} elsif ($board =~ /Silicon Switch/) {
+ 		    $board = "SSP";
+ 		} elsif ($board =~ /Switch/) {
+ 		    $board = "SP";
+ 		    $board = "SSP $sspmem" if $ssp;
+ 		} elsif ($board =~ /ATM/) {
+ 		    $board = "AIP";
+ 		}
+ 	    } elsif ($board =~ /(.*) controller/i) {
+ 		$board = $1;
+ 	    }
+ 	    # hwucode{$slot} defined in ShowContCbus
+ 	    if (defined $hwucode{$slot}) {
+ 		ProcessHistory("SLOT","","","!\n!Slot $slot/$board: hvers $hwver rev $boardrev ucode $hwucode{$slot}\n");
+ 	    } else {
+ 		ProcessHistory("SLOT","","","!\n!Slot $slot/$board: hvers $hwver rev $boardrev\n");
+ 	    }
+ 	    # These are also from the ShowContCbus
+ 	    ProcessHistory("SLOT","","","!Slot $slot/$board: $ucode{$slot}\n") if (defined $ucode{$slot});
+ 	    ProcessHistory("SLOT","","","!Slot $slot/$board: memd $hwmemd{$slot}, cache $hwmemc{$slot}\n")
+ 	    if ((defined $hwmemd{$slot}) && (defined $hwmemc{$slot}));
+ 	    ProcessHistory("SLOT","","","!Slot $slot/$board: $hwbuf{$slot}\n") if (defined $hwbuf{$slot});
+ 	    next;
+ 	}
+ 	/Serial number: (\S+)\s*Part number: (\S+)/ &&
+ 	    ProcessHistory("SLOT","","",
+ 			"!Slot $slot/$board: part $2, serial $1\n") &&
+ 	    next;
+ 	/^\s*Controller Memory Size: (.*)$/ &&
+ 	    ProcessHistory("SLOT","","","!Slot $slot/$board: $1\n") &&
+ 	    next;
+ 	if (/PA Bay (\d) Information/) {
+ 	    $pano = $1;
+ 	    if ("PA" =~ /$board/) {
+ 		($s,$c) = split(/\//,$board);
+ 		$board = "$s/$c/PA $pano";
+ 	    } else {
+ 		$board =~ s/\/PA \d//;
+ 		$board = "$board/PA $pano";
+ 	    }
+ 	    next;
+ 	}
+ 	/\s+(.*) (IP|PA), (\d) ports?,( \S+,)? (FRU\s?: )?(\S+)/ &&
+ 	    ProcessHistory("SLOT","","","!Slot $slot/$board: type $6, $3 ports\n") &&
+ 	    next;
+ 	/\s+(.*) (IP|PA)( \(\S+\))?, (\d) ports?/ &&
+ 	    ProcessHistory("SLOT","","","!Slot $slot/$board: type $1$3, $4 ports\n") &&
+ 	    next;
+ 	/^\s*HW rev (\S+), Board revision (\S+)/ &&
+ 	    ProcessHistory("SLOT","","","!Slot $slot/$board: hvers $1 rev $2\n") &&
+ 	    next;
+ 	/Serial number: (\S+)\s*Part number: (\S+)/ &&
+ 	    ProcessHistory("SLOT","","","!Slot $slot/$board: part $2, serial $1\n") && next;
+     }
+     return(0);
+ }
+ 
+ # This routine parses "show diag" for the gsr, 7200, 3600, 2600.
+ # This will create arrarys for hw info.
+ sub ShowDiag {
+     # Skip if this is not a 12000.
+     print STDERR "    In ShowDiag: $_" if ($debug);
+ 
+     while (<INPUT>) {
+ 	tr/\015//d;
+ 	study;
+ 	last if (/^$prompt/);
+ 	next if (/^(\s*|\s*$cmd\s*)$/);
+ 	# return(1) if ($type !~ /^(12[40]|720|36|26)/);
+ 	return(-1) if (/command authorization failed/i);
+ 	/^$/ && next;
+ 	s/Port Packet Over SONET/POS/;
+ 	if (/^\s*SLOT\s+(\d+)\s+\((.*)\): (.*)/) {
+ 	    $slot = $1;
+ 	    ProcessHistory("SLOT","","","!\n");
+ 	    ProcessHistory("SLOT","keysort","A","!Slot $slot: $3\n");
+ 	    next;
+ 	}
+ 	if (/^\s+MAIN:\s* type \d+,\s+(.*)/) {
+ 	    ProcessHistory("SLOT","keysort","AM","!Slot $slot/MAIN: part $1\n") && next;
+ 	}
+ 	if (/ Engine:\s+(.*)/) {
+ 	    ProcessHistory("SLOT","keysort","AE","!Slot $slot/Engine: $1\n");
+ 	}
+ 	if (/^\s+PCA:\s+(.*)/) {
+ 	    local($part) = $1;
+ 	    $_ = <INPUT>;
+ 	    /^\s+HW version (\S+)\s+S\/N (\S+)/ &&
+ 		ProcessHistory("SLOT","keysort","C1","!Slot $slot/PCA: part $part, serial $2\n") &&
+ 		ProcessHistory("SLOT","keysort","C2","!Slot $slot/PCA: hvers $1\n");
+ 	    next;
+ 	}
+ 	if (/^\s+MBUS: .*\)\s+(.*)/) {
+ 	    local($tmp) = "!Slot $slot/MBUS: part $1";
+ 	    $_ = <INPUT>;
+ 	    /^\s+HW version (\S+)\s+S\/N (\S+)/ &&
+ 		ProcessHistory("SLOT","keysort","MB1","$tmp, serial $2\n") &&
+ 		ProcessHistory("SLOT","keysort","MB2","!Slot $slot/MBUS: hvers $1\n");
+ 	    next;
+ 	}
+ 	if (/^\s+MBUS Agent Software version (.*)/) {
+ 	    ProcessHistory("SLOT","keysort","MB3","!Slot $slot/MBUS: software $1\n");
+ 	    next;
+ 	}
+ 	if (/^\s+ROM Monitor version (.*)/) {
+ 	    ProcessHistory("SLOT","keysort","R","!Slot $slot/ROM Monitor: version $1\n");
+ 	    next;
+ 	}
+ 	if (/^\s+Fabric Downloader version used (.*)/) {
+ 	    ProcessHistory("SLOT","keysort","Z","!Slot $slot/Fabric Downloader: version $1\n");
+ 	    next;
+ 	}
+ 	if (/^\s+DRAM size: (\d+)/) {
+ 	    local($dram) = $1 / 1048576;
+ 	    $_ = <INPUT>;
+ 	    if (/^\s+FrFab SDRAM size: (\d+)/) {
+ 		ProcessHistory("SLOT","keysort","MB4","!Slot $slot/MBUS: $dram Mbytes DRAM, "
+ 			   . $1 / 1024 . " Kbytes SDRAM\n");
+ 	    } else {
+ 		ProcessHistory("SLOT","keysort","MB4","!Slot $slot/MBUS: $dram Mbytes DRAM\n");
+ 	    }
+ 	    next;
+ 	}
+ 	# 7200 and 3600 stuff
+ 	if (/^(Slot)\s+(\d+(\/\d+)?):/ || /^\s+(WIC|VIC) Slot (\d):/) {
+ 	    if ($1 eq "WIC") {
+ 		$WIC = "/$2";
+ 	    } elsif ($1 eq "VIC") {
+ 		$WIC = "/$2";
+ 	    } else {
+ 		$slot = $2;
+ 		undef($WIC);
+ 	    }
+ 	    $_ = <INPUT>; tr/\015//d;
+ 
+ 	    # clean up hideous 7200 format to look more like 7500 output
+ 	    s/Fast-ethernet on C7200 I\/O card/FE-IO/;
+ 	    s/ with MII or RJ45/-TX/;
+ 	    s/Fast-ethernet /100Base/; s/[)(]//g;
+ 
+ 	    ProcessHistory("SLOT","","","!\n");
+ 	    /\s+(.*) port adapter,?\s+(\d+)\s+/i &&
+ 		ProcessHistory("SLOT","keysort","B","!Slot $slot: type $1, $2 ports\n");
+ 	    # I/O controller with no interfaces
+ 	    /\s+(.*)\s+port adapter\s*$/i &&
+ 		ProcessHistory("SLOT","keysort","B","!Slot $slot: type $1, 0 ports\n");
+ 	    /\s+(.*)\s+daughter card(.*)$/ &&
+ 		ProcessHistory("SLOT","keysort","B","!Slot $slot$WIC: type $1$2\n");
+ 	    /\s+(FT1)$/ &&
+ 		ProcessHistory("SLOT","keysort","B","!Slot $slot$WIC: type $1\n");
+ 	    next;
+ 	}
+ 	/revision\s+(\S+).*revision\s+(\S+)/ &&
+ 	    ProcessHistory("SLOT","keysort","C","!Slot $slot$WIC: hvers $1 rev $2\n") &&
+ 	    next;
+ 	/number\s+(\S+)\s+Part number\s+(\S+)/ &&
+ 	    ProcessHistory("SLOT","keysort","D","!Slot $slot$WIC: part $2, serial $1\n") &&
+ 	    next;
+     }
+     ProcessHistory("SLOT","","","!\n");
+     return(0);
+ }
+ 
+ # This routine parses "show module".
+ sub ShowModule {
+     print STDERR "    In ShowModule: $_" if ($debug);
+ 
+     my(@lines);
+     my($slot);
+ 
+     while (<INPUT>) {
+ 	tr/\015//d;
+ 	return if (/^\s*\^$/);
+ 	last if (/^$prompt/);
+ 	next if (/^(\s*|\s*$cmd\s*)$/);
+ 	return(-1) if (/command authorization failed/i);
+ 
+ 	# match slot/card info line
+ 	if (/^ *(\d+)\s+(\d+)\s+(.*)\s+(\S+)\s+(\S+)\s*$/) {
+ 	    $lines[$1] .= "!Slot $1: type $3, $2 ports\n!Slot $1: part $4, serial $5\n";
+ 	    $lines[$1] =~ s/\s+,/,/g;
+ 	}
+ 	# now match the Revs in the second paragraph of o/p and stick it in
+ 	# the array with the previous bits...grumble.
+ 	if (/^ *(\d+)\s+\S+\s+to\s+\S+\s+(\S+)\s+(\S*)\s+(\S+)(\s+\S+)?\s*$/) {
+ 	    $lines[$1] .= "!Slot $1: hvers $2, firmware $3, sw $4\n";
+ 	    $lines[$1] =~ s/\s+,/,/g;
+ 	}
+     }
+     foreach $slot (@lines) {
+ 	next if ($slot =~ /^\s*$/);
+ 	ProcessHistory("Module","","","$slot!\n");
+     }
+ 
+     return(0);
+ }
+ 
+ # This routine parses "show c7200" for the 7200
+ # This will create arrays for hw info.
+ sub ShowC7200 {
+     # Skip if this is not a 7200.
+     print STDERR "    In ShowC7200: $_" if ($debug);
+ 
+     while (<INPUT>) {
+ 	tr/\015//d;
+ 	last if (/^$prompt/);
+ 	next if (/^(\s*|\s*$cmd\s*)$/);
+ 	#return(1) if ($type !~ /^72/);
+ 	return(-1) if (/command authorization failed/i);
+ 	/^$/ && next;
+ 	if (/^(C7200 )?Midplane EEPROM:/) {
+ 	    $_ = <INPUT>;
+ 	    /revision\s+(\S+).*revision\s+(\S+)/;
+ 	    ProcessHistory("SLOT","","","!Slot Midplane: hvers $1 rev $2\n");
+ 	    $_ = <INPUT>;
+ 	    /number\s+(\S+)\s+Part number\s+(\S+)/;
+ 	    ProcessHistory("SLOT","","","!Slot Midplane: part $2, serial $1\n!\n");
+ 	    next;
+ 	}
+ 	if (/C720\d(VXR)? CPU EEPROM:/) {
+ 	    my ($hvers,$rev,$part,$serial);
+ 	    # npe400s report their cpu eeprom info differently w/ 12.0.21S
+ 	    while (<INPUT>) {
+ 		/Hardware Revision\s+: (\S+)/ && ($hvers = $1) && next;
+ 		/Board Revision\s+: (\S+)/ && ($rev = $1) && next;
+ 		/Part Number\s+: (\S+)/ && ($part = $1) && next;
+ 		/Serial Number\s+: (\S+)/ && ($serial = $1) && next;
+ 		/revision\s+(\S+).*revision\s+(\S+)/ &&
+ 		    ($hvers = $1, $rev = $2) && next;
+ 		/number\s+(\S+)\s+Part number\s+(\S+)/ &&
+ 		    ($serial = $1, $part = $2) && next;
+ 		/^\s*$/ && last;
+ 	    }
+ 	    ProcessHistory("SLOT","","","!Slot CPU: hvers $hvers rev $rev\n");
+ 	    ProcessHistory("SLOT","","","!Slot CPU: part $part, serial $serial\n!\n");
+ 	    next;
+ 	}
+     }
+     return(0);
+ }
+ 
+ # This routine parses "show vtp status"
+ sub ShowVTP {
+     print STDERR "    In ShowVTP: $_" if ($debug);
+ 
+     while (<INPUT>) {
+ 	tr/\015//d;
+ 	last if (/^$prompt/);
+ 	next if (/^(\s*|\s*$cmd\s*)$/);
+ 	return(1) if /^\s*\^\s*$/;
+ 	return(1) if /(Invalid input detected|Type help or )/;
+ 	#return(1) if ($type !~ /^(2900XL|3500XL|6000)$/);
+ 	return(-1) if (/command authorization failed/i);
+ 	next if (/^Configuration last modified by/);
+ 	if (/^VTP Operating Mode\s+:\s+(Transparent|Server)/) {
+ 	    $DO_SHOW_VLAN = 1;
+ 	}
+ 	ProcessHistory("COMMENTS","keysort","I0","!VTP: $_");
+     }
+     ProcessHistory("COMMENTS","keysort","I0","!\n");
+     return(0);
+ }
+ 
+ # This routine parses "show vlan"
+ sub ShowVLAN {
+     print STDERR "    In ShowVLAN: $_" if ($debug);
+ 
+     ($_=<INPUT>,return(1)) if (!$DO_SHOW_VLAN);
+ 
+     while (<INPUT>) {
+ 	tr/\015//d;
+ 	last if (/^$prompt/);
+ 	next if (/^(\s*|\s*$cmd\s*)$/);
+ 	return(1) if /(Invalid input detected|Type help or )/;
+ 	#return(1) if ($type !~ /^(2900XL|3500XL|6000)$/);
+ 	return(-1) if (/command authorization failed/i);
+ 	ProcessHistory("COMMENTS","keysort","IO","!VLAN: $_");
+     }
+     ProcessHistory("COMMENTS","keysort","IO","!\n");
+     return(0);
+ }
+ 
+ # This routine processes a "write term"
+ sub WriteTerm {
+     print STDERR "    In WriteTerm: $_" if ($debug);
+ 
+     while (<INPUT>) {
+ 	tr/\015//d;
+ 	study;
+ 	last if(/^$prompt/);
+ 	return(-1) if (/command authorization failed/i);
+ 	# the pager can not be disabled per-session on the PIX
+ 	s/^<-+ More -+>\s*//;
+ 	/Non-Volatile memory is in use/  && return(-1); # NvRAM is locked
+ 	# skip the crap
+ 	if (/^(##+$|(Building|Current) configuration)/i) {
+ 	    while (<INPUT>) {
+ 		next if (/^Current configuration\s*:/i);
+ 		next if (/^:/);
+ 		next if (/^([%!].*|\s*)$/);
+ 		next if (/^ip add.*ipv4:/);	# band-aid for 3620 12.0S
+ 		last;
+ 	    }
+ 	    if (defined($config_register)) {
+ 		ProcessHistory("","","","!\nconfig-register $config_register\n");
+ 	    }
+ 	    tr/\015//d;
+ 	}
+ 	# some versions have other crap mixed in with the bits in the
+ 	# block above
+ 	/^! (Last configuration|NVRAM config last)/ && next;
+ 
+ 	# Dog gone Cool matches to process the rest of the config
+ 	/^tftp-server flash /   && next; # kill any tftp remains
+ 	/^ntp clock-period /    && next; # kill ntp clock-period
+ 	/^ length /		&& next; # kill length on serial lines
+ 	/^ width /		&& next; # kill width on serial lines
+ 	/^ clockrate /		&& next; # kill clockrate on serial interfaces
+ 	if (/^(enable )?(password|passwd) / && $filter_pwds >= 1) {
+ 	    ProcessHistory("ENABLE","","","!$1$2 <removed>\n");
+ 	    next;
+ 	}
+ 	if (/^(enable secret) / && $filter_pwds >= 2) {
+ 	    ProcessHistory("ENABLE","","","!$1 <removed>\n");
+ 	    next;
+ 	}
+ 	if (/^username (\S+)(\s.*)? secret /) {
+ 	    if ($filter_pwds >= 2) {
+ 		ProcessHistory("USER","keysort","$1","!username $1$2 secret <removed>\n");
+ 	    } else {
+ 		ProcessHistory("USER","keysort","$1","$_");
+ 	    }
+ 	    next;
+ 	}
+ 	if (/^username (\S+)(\s.*)? password ((\d) \S+|\S+)/) {
+ 	    if ($filter_pwds == 2) {
+ 		ProcessHistory("USER","keysort","$1","!username $1$2 password <removed>\n");
+ 	    } elsif ($filter_pwds == 1 && $4 ne "5"){
+ 		ProcessHistory("USER","keysort","$1","!username $1$2 password <removed>\n");
+ 	    } else {
+ 		ProcessHistory("USER","keysort","$1","$_");
+ 	    }
+ 	    next;
+ 	}
+ 	if (/^(\s*)password / && $filter_pwds >= 1) {
+ 	    ProcessHistory("LINE-PASS","","","!$1password <removed>\n");
+ 	    next;
+ 	}
+ 	if (/^\s*neighbor (\S*) password / && $filter_pwds >= 1) {
+ 	    ProcessHistory("","","","! neighbor $1 password <removed>\n");
+ 	    next;
+ 	}
+ 	if (/^(ppp .* password) 7 .*/ && $filter_pwds >= 1) {
+ 	    ProcessHistory("","","","!$1 <removed>\n"); next;
+ 	}
+ 	if (/^(ip ftp password) / && $filter_pwds >= 1) {
+ 	    ProcessHistory("","","","!$1 <removed>\n"); next;
+ 	}
+ 	if (/^( ip ospf authentication-key) / && $filter_pwds >= 1) {
+ 	    ProcessHistory("","","","!$1 <removed>\n"); next;
+ 	}
+ 	# this is reversable, despite 'md5' in the cmd
+ 	if (/^( ip ospf message-digest-key \d+ md5) / && $filter_pwds >= 1) {
+ 	    ProcessHistory("","","","!$1 <removed>\n"); next;
+ 	}
+ 	if (/^((crypto )?isakmp key) \S+ / && $filter_pwds >= 1) {
+ 	    ProcessHistory("","","","!$1 <removed> $'"); next;
+ 	}
+ 	# i am told these are plain-text on the PIX
+ 	if (/^(vpdn username \S+ password)/ && $filter_pwds >= 1) {
+ 	    ProcessHistory("","","","!$1 <removed>\n"); next;
+ 	}
+ 	/fair-queue individual-limit/ && next;
+ 	# sort ip explicit-paths.
+ 	if (/^ip explicit-path name (\S+)/) {
+ 	    my($key) = $1;
+ 	    my($expath) = $_;
+ 	    while (<INPUT>) {
+ 		tr/\015//d;
+ 		last if (/^$prompt/);
+ 		last if (/^$prompt/ || ! /^(ip explicit-path name |[ !])/);
+ 		if (/^ip explicit-path name (\S+)/) {
+ 		    ProcessHistory("EXPATH","keysort","$key","$expath");
+ 		    $key = $1;
+ 		    $expath = $_;
+ 		} else  {
+ 		    $expath .= $_;
+ 		}
+ 	    }
+ 	    ProcessHistory("EXPATH","keysort","$key","$expath");
+ 	}
+ 	# sort route-maps
+ 	if (/^route-map (\S+)/) {
+ 	    my($key) = $1;
+ 	    my($routemap) = $_;
+ 	    while (<INPUT>) {
+ 		tr/\015//d;
+ 		last if (/^$prompt/ || ! /^(route-map |[ !])/);
+ 		if (/^route-map (\S+)/) {
+ 		    ProcessHistory("ROUTEMAP","keysort","$key","$routemap");
+ 		    $key = $1;
+ 		    $routemap = $_;
+ 		} else  {
+ 		    $routemap .= $_;
+ 		}
+ 	    }
+ 	    ProcessHistory("ROUTEMAP","keysort","$key","$routemap");
+ 	}
+ 	# filter out any RCS/CVS tags to avoid confusing local CVS storage
+ 	s/\$(Revision|Id):/ $1:/;
+ 	# order access-lists
+ 	/^access-list\s+(\d\d?)\s+(\S+)\s+(\S+)/ &&
+ 	    ProcessHistory("ACL $1 $2","ipsort","$3","$_") && next;
+ 	# order extended access-lists
+ 	/^access-list\s+(\d\d\d)\s+(\S+)\s+ip\s+host\s+(\S+)/ &&
+ 	    ProcessHistory("EACL $1 $2","ipsort","$3","$_") && next;
+ 	/^access-list\s+(\d\d\d)\s+(\S+)\s+ip\s+(\d\S+)/ &&
+ 	    ProcessHistory("EACL $1 $2","ipsort","$3","$_") && next;
+ 	/^access-list\s+(\d\d\d)\s+(\S+)\s+ip\s+any/ &&
+ 	    ProcessHistory("EACL $1 $2","ipsort","0.0.0.0","$_") && next;
+ 	# order arp lists
+ 	/^arp\s+(\d+\.\d+\.\d+\.\d+)\s+/ &&
+ 	    ProcessHistory("ARP","ipsort","$1","$_") && next;
+ 	/^ip prefix-list\s+(\S+)\s+seq\s+(\d+)\s+(permit|deny)\s+(\d\S+)(\/.*)$/ &&
+ 	    ProcessHistory("PACL $1 $3","ipsort","$4","ip prefix-list $1 $3 $4$5\n")
+ 	    && next;
+ 	# order logging statements
+ 	/^logging (\d+\.\d+\.\d+\.\d+)/ &&
+ 	    ProcessHistory("LOGGING","ipsort","$1","$_") && next;
+ 	# order/prune snmp-server host statements
+ 	# we only prune lines of the form
+ 	# snmp-server host a.b.c.d <community>
+ 	if (/^snmp-server host (\d+\.\d+\.\d+\.\d+) /) {
+ 	    if (defined($ENV{'NOCOMMSTR'})) {
+ 		my($ip) = $1;
+ 		my($line) = "snmp-server host $ip";
+ 		my(@tokens) = split(' ', $');
+ 		my($token);
+ 		while ($token = shift(@tokens)) {
+ 		    if ($token eq 'version') {
+ 			$line .= " " . join(' ', ($token, shift(@tokens)));
+ 		    } elsif ($token =~ /^(informs?|traps?|(no)?auth)$/) {
+ 			$line .= " " . $token;
+ 		    } else {
+ 			$line = "!$line " . join(' ', ("<removed>", join(' ', at tokens)));
+ 			last;
+ 		    }
+ 		}
+ 		ProcessHistory("SNMPSERVERHOST","ipsort","$ip","$line\n");
+ 	    } else {
+ 		ProcessHistory("SNMPSERVERHOST","ipsort","$1","$_");
+ 	    }
+ 	    next;
+ 	}
+ 	if (/^(snmp-server community) (\S+)/) {
+ 	    if (defined($ENV{'NOCOMMSTR'})) {
+ 		ProcessHistory("SNMPSERVERCOMM","keysort","$_","!$1 <removed>$'") && next;
+ 	    } else {
+ 		ProcessHistory("SNMPSERVERCOMM","keysort","$_","$_") && next;
+ 	    }
+ 	}
+ 	# order/prune tacacs/radius server statements
+ 	if (/^(tacacs-server|radius-server) key / && $filter_pwds >= 1) {
+ 	    ProcessHistory("","","","!$1 key <removed>\n"); next;
+ 	}
+ 	# order clns host statements
+ 	/^clns host \S+ (\S+)/ &&
+ 	    ProcessHistory("CLNS","keysort","$1","$_") && next;
+ 	# order alias statements
+ 	/^alias / && ProcessHistory("ALIAS","keysort","$_","$_") && next;
+ 	# delete ntp auth password - this md5 is a reversable too
+ 	if (/^(ntp authentication-key \d+ md5) / && $filter_pwds >= 1) {
+ 	    ProcessHistory("","","","!$1 <removed>\n"); next;
+ 	}
+ 	# order ntp peers/servers
+ 	if (/^ntp (server|peer) (\d+)\.(\d+)\.(\d+)\.(\d+)/) {
+ 	    $sortkey = sprintf("$1 %03d%03d%03d%03d",$2,$3,$4,$5);
+ 	    ProcessHistory("NTP","keysort",$sortkey,"$_");
+ 	    next;
+ 	}
+ 	# order ip host line statements
+ 	/^ip host line(\d+)/ &&
+ 	    ProcessHistory("IPHOST","numsort","$1","$_") && next;
+ 	# order ip nat source static statements
+ 	/^ip nat (\S+) source static (\S+)/ &&
+ 	    ProcessHistory("IP NAT $1","ipsort","$2","$_") && next;
+ 	# order atm map-list statements
+ 	/^\s+ip\s+(\d+\.\d+\.\d+\.\d+)\s+atm-vc/ &&
+ 	    ProcessHistory("ATM map-list","ipsort","$1","$_") && next;
+ 	# order ip rcmd lines
+ 	/^ip rcmd/ && ProcessHistory("RCMD","keysort","$_","$_") && next;
+ 
+ 	# system controller
+ 	/^syscon address (\S*) (\S*)/ &&
+ 	    ProcessHistory("","","","!syscon address $1 <removed>\n") &&
+ 	    next;
+ 	if (/^syscon password (\S*)/ && $filter_pwds >= 1) {
+ 	    ProcessHistory("","","","!syscon password <removed>\n");
+ 	    next;
+ 	}
+ 
+ 	# catch anything that wasnt matched above.
+ 	ProcessHistory("","","","$_");
+ 	# end of config.  the ": " game is for the PIX
+ 	if (/^(: +)?end$/) {
+ 	    $found_end = 1;
+ 	    return(1);
+ 	}
+     }
+     return(0);
+ }
+ 
+ # dummy function
+ sub DoNothing {print STDOUT;}
+ 
+ # Main
+ %commands=(
+ 	'show version'		=> "ShowVersion",
+ 	'show install active'	=> "ShowInstallActive",
+ 	'show env all'		=> "ShowEnv",
+ 	'show gsr chassis'	=> "ShowGSR",
+ 	'show boot'		=> "ShowBoot",
+ 	'show bootvar'		=> "ShowBoot",
+ 	'show variables boot'	=> "ShowBoot",
+ 	'show flash'		=> "ShowFlash",
+ 	'dir /all nvram:'	=> "DirSlotN",
+ 	'dir /all bootflash:'	=> "DirSlotN",
+ 	'dir /all slot0:'	=> "DirSlotN",
+ 	'dir /all disk0:'	=> "DirSlotN",
+ 	'dir /all slot1:'	=> "DirSlotN",
+ 	'dir /all disk1:'	=> "DirSlotN",
+ 	'dir /all slot2:'	=> "DirSlotN",
+ 	'dir /all disk2:'	=> "DirSlotN",
+ 	"dir /all sup-bootflash:"=> "DirSlotN",		# cat 6500-ios
+ 	"dir /all sup-microcode:"=> "DirSlotN",		# cat 6500-ios
+ 	'show controllers'	=> "ShowContAll",
+ 	'show controllers cbus'	=> "ShowContCbus",
+ 	'show diagbus'		=> "ShowDiagbus",
+ 	'show diag'		=> "ShowDiag",
+ 	'show module'		=> "ShowModule",	# cat 6500-ios
+ 	'show c7200'		=> "ShowC7200",
+ 	'show vtp status'	=> "ShowVTP",
+ 	'show vlan'		=> "ShowVLAN",
+ 	'show config'		=> "WriteTerm"
+ );
+ # keys() doesnt return things in the order entered and the order of the
+ # cmds is important (show version first and write term last). pita
+ @commands=(
+ 	"show version",
+ 	"show install active",
+ 	"show env all",
+ 	"show gsr chassis",
+ 	"show boot",
+ 	"show bootvar",
+ 	"show variables boot",
+ 	"show flash",
+ 	"dir /all nvram:",
+ 	"dir /all bootflash:",
+ 	"dir /all slot0:",
+ 	"dir /all disk0:",
+ 	"dir /all slot1:",
+ 	"dir /all disk1:",
+ 	"dir /all slot2:",
+ 	"dir /all disk2:",
+ 	"dir /all sup-bootflash:",
+ 	"dir /all sup-microcode:",
+ 	"show controllers",
+ 	"show controllers cbus",
+ 	"show diagbus",
+ 	"show diag",
+ 	"show module",
+ 	"show c7200",
+ 	"show vtp status",
+ 	"show vlan",
+ 	"show config"
+ );
+ $cisco_cmds=join(";", at commands);
+ $cmds_regexp=join("|", at commands);
+ 
+ open(OUTPUT,">$host.new") || die "Can't open $host.new for writing: $!\n";
+ select(OUTPUT);
+ # make OUTPUT unbuffered if debugging
+ if ($debug) { $| = 1; }
+ 
+ if ($file) {
+     print STDERR "opening file $host\n" if ($debug);
+     print STDOUT "opening file $host\n" if ($log);
+     open(INPUT,"<$host") || die "open failed for $host: $!\n";
+ } else {
+     print STDERR "executing clogin -t $timeo -c\"$cisco_cmds\" $host\n" if ($debug);
+     print STDOUT "executing clogin -t $timeo -c\"$cisco_cmds\" $host\n" if ($log);
+     if (defined($ENV{NOPIPE})) {
+ 	system "clogin -t $timeo -c \"$cisco_cmds\" $host </dev/null > $host.raw 2>&1" || die "clogin failed for $host: $!\n";
+ 	open(INPUT, "< $host.raw") || die "clogin failed for $host: $!\n";
+     } else {
+ 	open(INPUT,"clogin -t $timeo -c \"$cisco_cmds\" $host </dev/null |") || die "clogin failed for $host: $!\n";
+     }
+ }
+ 
+ # determine password filtering mode
+ if ($ENV{"FILTER_PWDS"} =~ /no/i) {  
+ 	$filter_pwds = 0;
+ } elsif ($ENV{"FILTER_PWDS"} =~ /all/i) {
+ 	$filter_pwds = 2;
+ } else {
+ 	$filter_pwds = 1;
+ }
+ 
+ ProcessHistory("","","","!RANCID-CONTENT-TYPE: cisco\n!\n");
+ ProcessHistory("COMMENTS","keysort","B0","!\n");
+ ProcessHistory("COMMENTS","keysort","F0","!\n");
+ ProcessHistory("COMMENTS","keysort","G0","!\n");
+ TOP: while(<INPUT>) {
+     tr/\015//d;
+     if (/\#\s?exit$/) {
+ 	$clean_run=1;
+ 	last;
+     }
+     if (/^Error:/) {
+ 	print STDOUT ("$host clogin error: $_");
+ 	print STDERR ("$host clogin error: $_") if ($debug);
+ 	$clean_run=0;
+ 	last;
+     }
+     while (/#\s*($cmds_regexp)\s*$/) {
+ 	$cmd = $1;
+ 	if (!defined($prompt)) {$prompt = ($_ =~ /^([^#]+#)/)[0]; }
+ 	print STDERR ("HIT COMMAND:$_") if ($debug);
+ 	if (! defined($commands{$cmd})) {
+ 	    print STDERR "$host: found unexpected command - \"$cmd\"\n";
+ 	    $clean_run = 0;
+ 	    last TOP;
+ 	}
+ 	$rval = &{$commands{$cmd}};
+ 	delete($commands{$cmd});
+ 	if ($rval == -1) {
+ 	    $clean_run = 0;
+ 	    last TOP;
+ 	}
+     }
+ }
+ print STDOUT "Done $logincmd: $_\n" if ($log);
+ # Flush History
+ ProcessHistory("","","","");
+ # Cleanup
+ close(INPUT);
+ close(OUTPUT);
+ 
+ if (defined($ENV{NOPIPE})) {
+     unlink("$host.raw") if (! $debug);
+ }
+ 
+ # check for completeness
+ if (scalar(%commands) || !$clean_run || !$found_end) {
+     if (scalar(%commands)) {
+ 	printf(STDOUT "$host: missed cmd(s): %s\n", join(',', keys(%commands)));
+ 	printf(STDERR "$host: missed cmd(s): %s\n", join(',', keys(%commands))) if ($debug);
+     }
+     if (!$clean_run || !$found_end) {
+ 	print STDOUT "$host: End of run not found\n";
+ 	print STDERR "$host: End of run not found\n" if ($debug);
+ 	system("/usr/bin/tail -1 $host.new");
+     }
+     unlink "$host.new" if (! $debug);
+ }
diff -rcN rancid-2.2.1.orig/bin/rancid-fe.in rancid-2.2.1/bin/rancid-fe.in
*** rancid-2.2.1.orig/bin/rancid-fe.in	Fri Feb 15 18:35:56 2002
--- rancid-2.2.1/bin/rancid-fe.in	Mon Jun  3 17:45:53 2002
***************
*** 29,34 ****
--- 29,35 ----
  elsif ($vendor =~ /^baynet$/i)	{ exec('brancid', $router); }
  elsif ($vendor =~ /^cat5$/i)	{ exec('cat5rancid', $router); }
  elsif ($vendor =~ /^cisco$/i)	{ exec('rancid', $router); }
+ elsif ($vendor =~ /^mcisco$/i)	{ exec('mcrancid', $router); }
  elsif ($vendor =~ /^extreme$/i)	{ exec('xrancid', $router); }
  elsif ($vendor =~ /^ezt3$/i)	{ exec('erancid', $router); }
  elsif ($vendor =~ /^force10$/i)	{ exec('f10rancid', $router); }
diff -rcN rancid-2.2.1.orig/configure rancid-2.2.1/configure
*** rancid-2.2.1.orig/configure	Fri Feb 15 18:39:48 2002
--- rancid-2.2.1/configure	Mon Jun  3 18:35:36 2002
***************
*** 2560,2566 ****
  # RD_BIN_PROGS are bin/ .in's that need to be installed with execute perms.
  RD_BIN_PROGS="cat5rancid control_rancid \
  alogin arancid clogin create_cvs blogin brancid do-diffs elogin erancid \
! f10rancid flogin francid jlogin jrancid hlogin hrancid mrancid par rancid-fe \
  rancid rename rrancid xrancid"
  
  rd_cv_rd_bin_progs=$RD_BIN_PROGS
--- 2560,2566 ----
  # RD_BIN_PROGS are bin/ .in's that need to be installed with execute perms.
  RD_BIN_PROGS="cat5rancid control_rancid \
  alogin arancid clogin create_cvs blogin brancid do-diffs elogin erancid \
! f10rancid flogin francid jlogin jrancid hlogin hrancid mrancid mcrancid par rancid-fe \
  rancid rename rrancid xrancid"
  
  rd_cv_rd_bin_progs=$RD_BIN_PROGS
***************
*** 3107,3113 ****
  	bin/clogin bin/control_rancid bin/create_cvs bin/do-diffs bin/elogin \
  	bin/env bin/erancid bin/f10rancid bin/flogin bin/francid bin/jlogin \
  	bin/jrancid bin/hlogin \
! 	bin/hrancid bin/mrancid bin/par bin/rancid-fe bin/rancid bin/rename \
  	bin/rrancid bin/xrancid \
  	man/Makefile man/env.5 man/lg.conf.5 man/lg_intro.1 \
  	include/version.h \
--- 3107,3113 ----
  	bin/clogin bin/control_rancid bin/create_cvs bin/do-diffs bin/elogin \
  	bin/env bin/erancid bin/f10rancid bin/flogin bin/francid bin/jlogin \
  	bin/jrancid bin/hlogin \
! 	bin/hrancid bin/mrancid bin/mcrancid bin/par bin/rancid-fe bin/rancid bin/rename \
  	bin/rrancid bin/xrancid \
  	man/Makefile man/env.5 man/lg.conf.5 man/lg_intro.1 \
  	include/version.h \
***************
*** 3237,3243 ****
  	bin/clogin bin/control_rancid bin/create_cvs bin/do-diffs bin/elogin \
  	bin/env bin/erancid bin/f10rancid bin/flogin bin/francid bin/jlogin \
  	bin/jrancid bin/hlogin \
! 	bin/hrancid bin/mrancid bin/par bin/rancid-fe bin/rancid bin/rename \
  	bin/rrancid bin/xrancid \
  	man/Makefile man/env.5 man/lg.conf.5 man/lg_intro.1 \
  	include/version.h \
--- 3237,3243 ----
  	bin/clogin bin/control_rancid bin/create_cvs bin/do-diffs bin/elogin \
  	bin/env bin/erancid bin/f10rancid bin/flogin bin/francid bin/jlogin \
  	bin/jrancid bin/hlogin \
! 	bin/hrancid bin/mrancid bin/mcrancid bin/par bin/rancid-fe bin/rancid bin/rename \
  	bin/rrancid bin/xrancid \
  	man/Makefile man/env.5 man/lg.conf.5 man/lg_intro.1 \
  	include/version.h \
diff -rcN rancid-2.2.1.orig/configure.in rancid-2.2.1/configure.in
*** rancid-2.2.1.orig/configure.in	Fri Feb 15 18:39:40 2002
--- rancid-2.2.1/configure.in	Mon Jun  3 17:42:56 2002
***************
*** 177,184 ****
  # RD_BIN_PROGS are bin/ .in's that need to be installed with execute perms.
  RD_BIN_PROGS="cat5rancid control_rancid \
  alogin arancid clogin create_cvs blogin brancid do-diffs elogin erancid \
! f10rancid flogin francid jlogin jrancid hlogin hrancid mrancid par rancid-fe \
! rancid rename rrancid xrancid"
  AC_SUBST(RD_BIN_PROGS)
  rd_cv_rd_bin_progs=$RD_BIN_PROGS
  
--- 177,184 ----
  # RD_BIN_PROGS are bin/ .in's that need to be installed with execute perms.
  RD_BIN_PROGS="cat5rancid control_rancid \
  alogin arancid clogin create_cvs blogin brancid do-diffs elogin erancid \
! f10rancid flogin francid jlogin jrancid hlogin hrancid mcrancid mrancid \
! par rancid-fe rancid rename rrancid xrancid"
  AC_SUBST(RD_BIN_PROGS)
  rd_cv_rd_bin_progs=$RD_BIN_PROGS
  
***************
*** 237,244 ****
  	bin/alogin bin/arancid bin/blogin bin/brancid bin/cat5rancid \
  	bin/clogin bin/control_rancid bin/create_cvs bin/do-diffs bin/elogin \
  	bin/env bin/erancid bin/f10rancid bin/flogin bin/francid bin/jlogin \
! 	bin/jrancid bin/hlogin \
! 	bin/hrancid bin/mrancid bin/par bin/rancid-fe bin/rancid bin/rename \
  	bin/rrancid bin/xrancid \
  	man/Makefile man/env.5 man/lg.conf.5 man/lg_intro.1 \
  	include/version.h \
--- 237,244 ----
  	bin/alogin bin/arancid bin/blogin bin/brancid bin/cat5rancid \
  	bin/clogin bin/control_rancid bin/create_cvs bin/do-diffs bin/elogin \
  	bin/env bin/erancid bin/f10rancid bin/flogin bin/francid bin/jlogin \
! 	bin/jrancid bin/hlogin bin/hrancid bin/mrancid bin/mcrancid \
! 	bin/par bin/rancid-fe bin/rancid bin/rename \
  	bin/rrancid bin/xrancid \
  	man/Makefile man/env.5 man/lg.conf.5 man/lg_intro.1 \
  	include/version.h \
diff -rcN rancid-2.2.1.orig/include/Makefile.in rancid-2.2.1/include/Makefile.in
*** rancid-2.2.1.orig/include/Makefile.in	Fri May  3 00:08:05 2002
--- rancid-2.2.1/include/Makefile.in	Mon Jun  3 18:32:22 2002
***************
*** 115,123 ****
  all: all-redirect
  .SUFFIXES:
  $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
! 	cd $(top_srcdir) && $(AUTOMAKE) --foreign --include-deps include/Makefile
  
! Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
  	cd $(top_builddir) \
  	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
  
--- 115,123 ----
  all: all-redirect
  .SUFFIXES:
  $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
! 	cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile
  
! Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
  	cd $(top_builddir) \
  	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
  
***************
*** 178,183 ****
--- 178,188 ----
  subdir = include
  
  distdir: $(DISTFILES)
+ 	here=`cd $(top_builddir) && pwd`; \
+ 	top_distdir=`cd $(top_distdir) && pwd`; \
+ 	distdir=`cd $(distdir) && pwd`; \
+ 	cd $(top_srcdir) \
+ 	  && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --foreign include/Makefile
  	@for file in $(DISTFILES); do \
  	  d=$(srcdir); \
  	  if test -d $$d/$$file; then \
diff -rcN rancid-2.2.1.orig/include/config.h rancid-2.2.1/include/config.h
*** rancid-2.2.1.orig/include/config.h	Thu May  2 22:34:16 2002
--- rancid-2.2.1/include/config.h	Thu Jan  1 01:00:00 1970
***************
*** 1,177 ****
- /* include/config.h.  Generated automatically by configure.  */
- /* include/config.h.in.  Generated automatically from configure.in by autoheader.  */
- #ifndef CONFIG_H
- #define CONFIG_H        1
- 
- 
- /* Define to empty if the keyword does not work.  */
- /* #undef const */
- 
- /* Define if you have the ANSI # stringizing operator in cpp. */
- #define HAVE_STRINGIZE 1
- 
- /* Define as __inline if that's what the C compiler calls it.  */
- /* #undef inline */
- 
- /* Define as the return type of signal handlers (int or void).  */
- #define RETSIGTYPE void
- 
- /* Define to `unsigned' if <sys/types.h> doesn't define.  */
- /* #undef size_t */
- 
- /* Define if you have the ANSI C header files.  */
- #define STDC_HEADERS 1
- 
- /* Define if you have the bcopy function.  */
- #define HAVE_BCOPY 1
- 
- /* Define if you have the bzero function.  */
- #define HAVE_BZERO 1
- 
- /* Define if you have the index function.  */
- #define HAVE_INDEX 1
- 
- /* Define if you have the memcpy function.  */
- #define HAVE_MEMCPY 1
- 
- /* Define if you have the memmove function.  */
- #define HAVE_MEMMOVE 1
- 
- /* Define if you have the memset function.  */
- #define HAVE_MEMSET 1
- 
- /* Define if you have the rindex function.  */
- #define HAVE_RINDEX 1
- 
- /* Define if you have the strchr function.  */
- #define HAVE_STRCHR 1
- 
- /* Define if you have the strerror function.  */
- #define HAVE_STRERROR 1
- 
- /* Define if you have the strrchr function.  */
- #define HAVE_STRRCHR 1
- 
- /* Define if you have the strrtok function.  */
- /* #undef HAVE_STRRTOK */
- 
- /* Define if you have the strstr function.  */
- #define HAVE_STRSTR 1
- 
- /* Define if you have the strtok function.  */
- #define HAVE_STRTOK 1
- 
- /* Define if you have the <errno.h> header file.  */
- #define HAVE_ERRNO_H 1
- 
- /* Define if you have the <fcntl.h> header file.  */
- #define HAVE_FCNTL_H 1
- 
- /* Define if you have the <limits.h> header file.  */
- #define HAVE_LIMITS_H 1
- 
- /* Define if you have the <memory.h> header file.  */
- #define HAVE_MEMORY_H 1
- 
- /* Define if you have the <siginfo.h> header file.  */
- /* #undef HAVE_SIGINFO_H */
- 
- /* Define if you have the <string.h> header file.  */
- #define HAVE_STRING_H 1
- 
- /* Define if you have the <strings.h> header file.  */
- #define HAVE_STRINGS_H 1
- 
- /* Define if you have the <sys/types.h> header file.  */
- #define HAVE_SYS_TYPES_H 1
- 
- /* Define if you have the <sys/wait.h> header file.  */
- #define HAVE_SYS_WAIT_H 1
- 
- /* Define if you have the <sysexits.h> header file.  */
- #define HAVE_SYSEXITS_H 1
- 
- /* Define if you have the <unistd.h> header file.  */
- #define HAVE_UNISTD_H 1
- 
- /* Name of package */
- #define PACKAGE "rancid"
- 
- /* Version number of package */
- #define VERSION "2.2.1"
- 
- /* Define if compiler has function prototypes */
- #define PROTOTYPES 1
- 
- 
- #ifndef __P
- # if STDC_HEADERS
- #  define __P(a)	a
- # else
- #  define __P(a)	()
- # endif
- #endif
- 
- #define BUF_SZ		LINE_MAX	/* (increments of) size of bufs */
- 
- #if HAVE_STDLIB_H
- # include <stdlib.h>
- #endif
- 
- #if HAVE_UNISTD_H       
- # include <unistd.h>    
- # include <sys/types.h>
- #elif HAVE_SYS_TYPES_H 
- # include <sys/types.h>
- #endif  
- 
- #if HAVE_ERRNO_H
- # include <errno.h>
- #endif
- extern int		errno;
- 
- #if HAVE_STRING_H
- # include <string.h>    
- #endif
- #if HAVE_STRINGS_H      
- # include <strings.h>
- #endif 
- 
- #if ! HAVE_STRERROR
- # define strerror(n)	sys_errlist[n];
- #endif
- 
- #if HAVE_SYS_WAIT_H 
- # include <sys/wait.h>
- #endif  
- #ifndef WEXITSTATUS
- # define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
- #endif
- #ifndef WIFEXITED
- # define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
- #endif  
- 
- #if HAVE_MEMSET
- # define bzero(p,s)	memset(p, 0, s)
- # define bcopy(s,d,l)	memcpy(d, s, l)
- #endif
- 
- #if HAVE_INDEX && ! HAVE_STRCHR
- # define index(s,c)	strchr(s,c)
- #endif
- 
- #if HAVE_SYSEXITS_H
- # include <sysexits.h>
- #else
- 					/* missing sysexits.h */
- # define EX_OK		0
- # define EX_USAGE	64		/* command line usage error */
- # define EX_NOINPUT	66		/* cannot open input */
- # define EX_TEMPFAIL	75		/* temp failure */
- # define EX_OSERR	71		/* system error */
- # define EX_CANTCREAT	73		/* can't create (user) output file */
- # define EX_IOERR	74		/* input/output error */
- # define EX_CONFIG	78		/* configuration error */
- #endif
- 
- #endif /* CONFIG_H */
--- 0 ----
diff -rcN rancid-2.2.1.orig/include/version.h rancid-2.2.1/include/version.h
*** rancid-2.2.1.orig/include/version.h	Thu May  2 22:34:16 2002
--- rancid-2.2.1/include/version.h	Thu Jan  1 01:00:00 1970
***************
*** 1,9 ****
- #ifndef VERSION_H
- 
- #define VERSION_H
- 
- /* pkg version */
- char package[] = "rancid";
- char version[] = "2.2.1";
- 
- #endif
--- 0 ----


More information about the Rancid-discuss mailing list