summaryrefslogtreecommitdiffstats
path: root/bin
diff options
context:
space:
mode:
authorTar Committer <tar@ocjtech.us>2007-01-14 05:39:54 +0000
committerTar Committer <tar@ocjtech.us>2007-01-14 05:39:54 +0000
commitac54243f382e817c08c1f895ccfdc05dcacdb044 (patch)
tree1c9b224e2714d9a6fd0ba8a7b211e287d3f8c9b9 /bin
parent1a7c45398738cdb4eaafdc9e0962272f19d54816 (diff)
downloadrancid-ac54243f382e817c08c1f895ccfdc05dcacdb044.tar.gz
rancid-ac54243f382e817c08c1f895ccfdc05dcacdb044.tar.xz
rancid-ac54243f382e817c08c1f895ccfdc05dcacdb044.zip
Imported from rancid-2.3.2a7.tar.gz.rancid-2.3.2a7
Diffstat (limited to 'bin')
-rw-r--r--bin/Makefile.am4
-rw-r--r--bin/Makefile.in14
-rw-r--r--bin/agmrancid.in5
-rw-r--r--bin/blogin.in7
-rw-r--r--bin/clogin.in9
-rw-r--r--bin/control_rancid.in5
-rw-r--r--bin/flogin.in7
-rw-r--r--bin/hlogin.in7
-rw-r--r--bin/jrancid.in30
-rw-r--r--bin/nlogin.in5
-rw-r--r--bin/nslogin.in5
-rw-r--r--bin/rancid-fe.in3
-rw-r--r--bin/rivlogin.in5
-rwxr-xr-xbin/srancid.in404
14 files changed, 472 insertions, 38 deletions
diff --git a/bin/Makefile.am b/bin/Makefile.am
index 8490805..b7fc75f 100644
--- a/bin/Makefile.am
+++ b/bin/Makefile.am
@@ -1,7 +1,7 @@
## Process this file with automake to produce Makefile.in
## A Makefile.in is supplied, in case you do not have automake.
-## $Id: Makefile.am,v 1.35 2006/11/23 20:26:47 heas Exp $
+## $Id: Makefile.am,v 1.36 2007/01/13 22:01:53 heas Exp $
##
## Copyright (C) 1997-2006 by Terrapin Communications, Inc.
## All rights reserved.
@@ -30,7 +30,7 @@ bin_SCRIPTS = cat5rancid control_rancid \
hlogin hrancid htlogin htrancid \
jerancid jlogin jrancid \
mrancid nlogin nrancid nslogin nsrancid par prancid \
- rancid rancid-fe rivlogin rivrancid rrancid \
+ rancid rancid-fe rivlogin rivrancid rrancid srancid \
tntlogin tntrancid xrancid zrancid
bin_SCRIPTS += lg.cgi lgform.cgi rancid-cvs rancid-run
diff --git a/bin/Makefile.in b/bin/Makefile.in
index ba3d44e..ca80b2a 100644
--- a/bin/Makefile.in
+++ b/bin/Makefile.in
@@ -48,9 +48,9 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
$(srcdir)/nsrancid.in $(srcdir)/par.in $(srcdir)/prancid.in \
$(srcdir)/rancid-fe.in $(srcdir)/rancid.in \
$(srcdir)/rivlogin.in $(srcdir)/rivrancid.in \
- $(srcdir)/rrancid.in $(srcdir)/tntlogin.in \
- $(srcdir)/tntrancid.in $(srcdir)/xrancid.in \
- $(srcdir)/zrancid.in
+ $(srcdir)/rrancid.in $(srcdir)/srancid.in \
+ $(srcdir)/tntlogin.in $(srcdir)/tntrancid.in \
+ $(srcdir)/xrancid.in $(srcdir)/zrancid.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
$(top_srcdir)/configure.in
@@ -63,7 +63,7 @@ CONFIG_CLEAN_FILES = control_rancid par rancid-fe agmrancid alogin \
elogin erancid f10rancid flogin francid fnrancid jlogin \
jrancid jerancid hlogin hrancid htlogin htrancid mrancid \
nlogin nrancid nslogin nsrancid prancid rivlogin rivrancid \
- rrancid tntlogin tntrancid xrancid zrancid
+ rrancid srancid tntlogin tntrancid xrancid zrancid
am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)"
binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
PROGRAMS = $(bin_PROGRAMS)
@@ -209,8 +209,8 @@ bin_SCRIPTS = cat5rancid control_rancid agmrancid alogin arancid \
flogin francid fnrancid hlogin hrancid htlogin htrancid \
jerancid jlogin jrancid mrancid nlogin nrancid nslogin \
nsrancid par prancid rancid rancid-fe rivlogin rivrancid \
- rrancid tntlogin tntrancid xrancid zrancid lg.cgi lgform.cgi \
- rancid-cvs rancid-run
+ rrancid srancid tntlogin tntrancid xrancid zrancid lg.cgi \
+ lgform.cgi rancid-cvs rancid-run
EXTRA_DIST = lg.cgi.in lgform.cgi.in rancid-cvs.in rancid-run.in
#dist_bin_SCRIPTS= $(bin_SCRIPTS:%=%.in)
CLEANFILES = lg.cgi lgform.cgi rancid-cvs rancid-run
@@ -345,6 +345,8 @@ rivrancid: $(top_builddir)/config.status $(srcdir)/rivrancid.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
rrancid: $(top_builddir)/config.status $(srcdir)/rrancid.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+srancid: $(top_builddir)/config.status $(srcdir)/srancid.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
tntlogin: $(top_builddir)/config.status $(srcdir)/tntlogin.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
tntrancid: $(top_builddir)/config.status $(srcdir)/tntrancid.in
diff --git a/bin/agmrancid.in b/bin/agmrancid.in
index 9f3166d..0542bd2 100644
--- a/bin/agmrancid.in
+++ b/bin/agmrancid.in
@@ -1,6 +1,6 @@
#! @PERLV_PATH@
##
-## $Id: agmrancid.in,v 1.1 2006/11/23 20:20:16 heas Exp $
+## $Id: agmrancid.in,v 1.2 2006/12/06 00:40:54 heas Exp $
##
## @PACKAGE@ @VERSION@
## Copyright (C) 1997-2006 by Terrapin Communications, Inc.
@@ -43,6 +43,9 @@ $found_env = 0;
$found_diag = 0;
$timeo = 90; # clogin timeout in seconds
+# the AGM kicks us off if it does not know our terminal type
+$ENV{'TERM'} = "dumb";
+
my(@commandtable, %commands, @commands);# command lists
my(%filter_pwds); # password filtering mode
diff --git a/bin/blogin.in b/bin/blogin.in
index 9c19de9..37c28e8 100644
--- a/bin/blogin.in
+++ b/bin/blogin.in
@@ -1,6 +1,6 @@
#! @EXPECT_PATH@ --
##
-## $Id: blogin.in,v 1.33 2006/12/05 16:50:52 heas Exp $
+## $Id: blogin.in,v 1.36 2006/12/08 21:28:25 heas Exp $
##
## @PACKAGE@ @VERSION@
## Copyright (C) 1997-2006 by Terrapin Communications, Inc.
@@ -532,6 +532,9 @@ foreach router [lrange $argv $i end] {
}
set passwd [join [lindex $pswd 0] ""]
set enapasswd [join [lindex $pswd 1] ""]
+ } else {
+ set passwd $userpasswd
+ set enapasswd $enapasswd
}
# Figure out username
@@ -605,7 +608,7 @@ foreach router [lrange $argv $i end] {
if { $enable } {
if {[do_enable $enauser $enapasswd]} {
if { $do_command || $do_script } {
- close; wait
+ catch {close}; catch {wait}
continue
}
}
diff --git a/bin/clogin.in b/bin/clogin.in
index 81c654e..99a0874 100644
--- a/bin/clogin.in
+++ b/bin/clogin.in
@@ -1,6 +1,6 @@
#! @EXPECT_PATH@ --
##
-## $Id: clogin.in,v 1.103 2006/12/05 16:50:52 heas Exp $
+## $Id: clogin.in,v 1.107 2006/12/08 21:28:25 heas Exp $
##
## @PACKAGE@ @VERSION@
## Copyright (C) 1997-2006 by Terrapin Communications, Inc.
@@ -754,6 +754,9 @@ foreach router [lrange $argv $i end] {
}
set passwd [join [lindex $pswd 0] ""]
set enapasswd [join [lindex $pswd 1] ""]
+ } else {
+ set passwd $userpasswd
+ set enapasswd $enapasswd
}
# Figure out username
@@ -822,13 +825,13 @@ foreach router [lrange $argv $i end] {
# Login to the router
if {[login $router $ruser $userpswd $passwd $enapasswd $cmethod $cyphertype]} {
- # if login failed or rsh was successful, move on to the next device
+ # if login failed or rsh was unsuccessful, move on to the next device
continue
}
if { $enable } {
if {[do_enable $enauser $enapasswd]} {
if { $do_command || $do_script } {
- close; wait
+ catch {close}; catch {wait}
continue
}
}
diff --git a/bin/control_rancid.in b/bin/control_rancid.in
index 69ff911..388bbf4 100644
--- a/bin/control_rancid.in
+++ b/bin/control_rancid.in
@@ -1,6 +1,6 @@
#! /bin/sh
##
-## $Id: control_rancid.in,v 1.79 2006/10/05 04:27:42 heas Exp $
+## $Id: control_rancid.in,v 1.80 2006/12/07 21:14:06 heas Exp $
##
## @PACKAGE@ @VERSION@
## Copyright (C) 1997-2006 by Terrapin Communications, Inc.
@@ -87,6 +87,9 @@ DIR=$BASEDIR/$GROUP
TMP=${TMPDIR:=/tmp}/rancid.$GROUP.$$
trap 'rm -fr $TMP;' 1 2 15
+# disable noclobber
+unset noclobber > /dev/null 2>&1
+
# RCS system
RCSSYS=${RCSSYS:=cvs};
if [ $RCSSYS != "cvs" -a $RCSSYS != "svn" ] ; then
diff --git a/bin/flogin.in b/bin/flogin.in
index 4e93e35..5c8813d 100644
--- a/bin/flogin.in
+++ b/bin/flogin.in
@@ -1,6 +1,6 @@
#! @EXPECT_PATH@ --
##
-## $Id: flogin.in,v 1.44 2006/12/05 16:50:52 heas Exp $
+## $Id: flogin.in,v 1.47 2006/12/08 21:28:26 heas Exp $
##
## @PACKAGE@ @VERSION@
## Copyright (C) 1997-2006 by Terrapin Communications, Inc.
@@ -564,6 +564,9 @@ foreach router [lrange $argv $i end] {
}
set passwd [join [lindex $pswd 0] ""]
set enapasswd [join [lindex $pswd 1] ""]
+ } else {
+ set passwd $userpasswd
+ set enapasswd $enapasswd
}
# Figure out username
@@ -637,7 +640,7 @@ foreach router [lrange $argv $i end] {
if { $enable } {
if {[do_enable $enauser $enapasswd]} {
if { $do_command || $do_script } {
- close; wait
+ catch {close}; catch {wait}
continue
}
}
diff --git a/bin/hlogin.in b/bin/hlogin.in
index 1eabd5c..8777021 100644
--- a/bin/hlogin.in
+++ b/bin/hlogin.in
@@ -1,6 +1,6 @@
#! @EXPECT_PATH@ --
##
-## $Id: hlogin.in,v 1.37 2006/12/05 16:50:52 heas Exp $
+## $Id: hlogin.in,v 1.40 2006/12/08 21:28:26 heas Exp $
##
## @PACKAGE@ @VERSION@
## Copyright (C) 1997-2006 by Terrapin Communications, Inc.
@@ -623,6 +623,9 @@ foreach router [lrange $argv $i end] {
}
set passwd [join [lindex $pswd 0] ""]
set enapasswd [join [lindex $pswd 1] ""]
+ } else {
+ set passwd $userpasswd
+ set enapasswd $enapasswd
}
# Figure out username
@@ -702,7 +705,7 @@ foreach router [lrange $argv $i end] {
if { $enable } {
if {[do_enable $enauser $enapasswd]} {
if { $do_command || $do_script } {
- close; wait
+ catch {close}; catch {wait}
continue
}
}
diff --git a/bin/jrancid.in b/bin/jrancid.in
index 73dc5fa..252b1a3 100644
--- a/bin/jrancid.in
+++ b/bin/jrancid.in
@@ -1,6 +1,6 @@
#! @PERLV_PATH@
##
-## $Id: jrancid.in,v 1.79 2006/10/05 04:27:43 heas Exp $
+## $Id: jrancid.in,v 1.80 2006/12/05 17:14:27 heas Exp $
##
## @PACKAGE@ @VERSION@
## Copyright (C) 1997-2006 by Terrapin Communications, Inc.
@@ -183,7 +183,7 @@ sub ShowChassisClocks {
}
ProcessHistory("","","","# $_");
}
- return;
+ return(0);
}
# This routine parses "show chassis environment"
@@ -216,7 +216,7 @@ sub ShowChassisEnvironment {
ProcessHistory("","","","# $1\n") && next;
ProcessHistory("","","","# $_");
}
- return;
+ return(0);
}
# This routine parses "show chassis firmware"
@@ -240,7 +240,7 @@ sub ShowChassisFirmware {
ProcessHistory("","","","# $_");
}
- return;
+ return(0);
}
# This routine parses "show chassis fpc detail"
@@ -267,7 +267,7 @@ sub ShowChassisFpcDetail {
/ Uptime/ && next;
ProcessHistory("","","","# $_");
}
- return;
+ return(0);
}
# This routine parses "show chassis hardware"
@@ -291,7 +291,7 @@ sub ShowChassisHardware {
ProcessHistory("","","","# $_");
}
- return;
+ return(0);
}
# This routine parses "show chassis routing-engine"
@@ -323,7 +323,7 @@ sub ShowChassisRoutingEngine {
/ Serial ID/ && ProcessHistory("","","","# $_") && next;
/^\s*$/ && ProcessHistory("","","","# $_") && next;
}
- return;
+ return(0);
}
# This routine parses "show chassis cfeb", "show chassis feb", "show
@@ -358,7 +358,7 @@ sub ShowChassisSCB {
ProcessHistory("","","","# $_");
}
$ShowChassisSCB = 1;
- return;
+ return(0);
}
# This routine parses "show chassis alarms"
@@ -380,7 +380,7 @@ sub ShowChassisAlarms {
ProcessHistory("","","","# $_");
}
- return;
+ return(0);
}
# This routine parses "show system autoinstallation status"
@@ -402,7 +402,7 @@ sub ShowSystemAutoinstall {
ProcessHistory("","","","# $_");
}
- return;
+ return(0);
}
sub ShowSystemCoreDumps {
@@ -444,7 +444,7 @@ sub ShowSystemLicense {
ProcessHistory("","","","# $_");
}
- return;
+ return(0);
}
# This routine parses "show system license keys"
@@ -466,7 +466,7 @@ sub ShowSystemLicenseKeys {
ProcessHistory("","","","# $_");
}
- return;
+ return(0);
}
# This routine parses "show system boot-messages"
@@ -493,7 +493,7 @@ sub ShowSystemBootMessages {
/^\/dev\// && next;
ProcessHistory("","","","# $_");
}
- return;
+ return(0);
}
# This routine parses "show version"
@@ -514,7 +514,7 @@ sub ShowVersion {
}
ProcessHistory("","","","#\n");
- return;
+ return(0);
}
# This routine parses "show configuration"
@@ -588,7 +588,7 @@ sub ShowConfiguration {
return(-1);
}
- return;
+ return(0);
}
###
diff --git a/bin/nlogin.in b/bin/nlogin.in
index 153d0ba..53e8812 100644
--- a/bin/nlogin.in
+++ b/bin/nlogin.in
@@ -1,6 +1,6 @@
#! @EXPECT_PATH@ --
##
-## $Id: nlogin.in,v 1.32 2006/12/05 16:50:52 heas Exp $
+## $Id: nlogin.in,v 1.33 2006/12/08 21:28:26 heas Exp $
##
## @PACKAGE@ @VERSION@
## Copyright (C) 1997-2006 by Terrapin Communications, Inc.
@@ -453,6 +453,9 @@ foreach firewall [lrange $argv $i end] {
}
set passwd [join [lindex $pswd 0] ""]
set enapasswd [join [lindex $pswd 1] ""]
+ } else {
+ set passwd $userpasswd
+ set enapasswd $enapasswd
}
# Figure out username
diff --git a/bin/nslogin.in b/bin/nslogin.in
index 10be62b..6cf4188 100644
--- a/bin/nslogin.in
+++ b/bin/nslogin.in
@@ -1,6 +1,6 @@
#! @EXPECT_PATH@ --
##
-## $Id: nslogin.in,v 1.21 2006/12/05 16:50:53 heas Exp $
+## $Id: nslogin.in,v 1.22 2006/12/08 21:28:26 heas Exp $
##
## @PACKAGE@ @VERSION@
## Copyright (C) 1997-2006 by Terrapin Communications, Inc.
@@ -546,6 +546,9 @@ foreach router [lrange $argv $i end] {
}
set passwd [join [lindex $pswd 0] ""]
set enapasswd [join [lindex $pswd 1] ""]
+ } else {
+ set passwd $userpasswd
+ set enapasswd $enapasswd
}
# Figure out username
diff --git a/bin/rancid-fe.in b/bin/rancid-fe.in
index 3e60783..bed4129 100644
--- a/bin/rancid-fe.in
+++ b/bin/rancid-fe.in
@@ -1,6 +1,6 @@
#! @PERLV_PATH@
##
-## $Id: rancid-fe.in,v 1.44 2006/11/23 20:26:47 heas Exp $
+## $Id: rancid-fe.in,v 1.45 2007/01/13 22:01:53 heas Exp $
##
## @PACKAGE@ @VERSION@
## Copyright (C) 1997-2006 by Terrapin Communications, Inc.
@@ -52,6 +52,7 @@ $vendor =~ tr/[A-Z]/[a-z]/;
'procket' => 'prancid',
'redback' => 'rrancid',
'riverstone' => 'rivrancid',
+ 'smc' => 'srancid',
'tnt' => 'tntrancid',
'zebra' => 'zrancid'
);
diff --git a/bin/rivlogin.in b/bin/rivlogin.in
index 6dc6afb..2d80217 100644
--- a/bin/rivlogin.in
+++ b/bin/rivlogin.in
@@ -1,6 +1,6 @@
#! @EXPECT_PATH@ --
##
-## $Id: rivlogin.in,v 1.25 2006/12/05 16:50:53 heas Exp $
+## $Id: rivlogin.in,v 1.26 2006/12/08 21:28:26 heas Exp $
##
## @PACKAGE@ @VERSION@
## Copyright (C) 1997-2006 by Terrapin Communications, Inc.
@@ -906,6 +906,9 @@ set router [string tolower $router]
set passwd [join [lindex $pswd 0] ""]
set enapasswd [join [lindex $pswd 1] ""]
+ } else {
+ set passwd $userpasswd
+ set enapasswd $enapasswd
}
# Figure out user to login with if necessary
diff --git a/bin/srancid.in b/bin/srancid.in
new file mode 100755
index 0000000..63c2e92
--- /dev/null
+++ b/bin/srancid.in
@@ -0,0 +1,404 @@
+#! @PERLV_PATH@
+##
+## Pretty huge hack to take care of Dell Switch configs
+## d_pfleger@juniper.net
+##
+## @PACKAGE@ @VERSION@
+## Copyright (C) 1997-2006 by Henry Kilmer.
+## All rights reserved.
+##
+## This software may be freely copied, modified and redistributed
+## fee for non-commerical purposes provided that this copyright notice
+## 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 [-dV] [-l] [-f filename | hostname]
+#
+use Getopt::Std;
+getopts('dflV');
+if ($opt_V) {
+ print "@PACKAGE@ @VERSION@\n";
+ exit(0);
+}
+$log = $opt_l;
+$debug = $opt_d;
+$file = $opt_f;
+$host = $ARGV[0];
+$found_end = 0;
+$timeo = 90; # hlogin timeout in seconds
+
+my(@commandtable, %commands, @commands);# command lists
+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,@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 routine 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 routine 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 routine 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 routine (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 "dir"
+sub Dir {
+ print STDERR " In Dir: $_" if ($debug);
+
+ while (<INPUT>) {
+ s/^\s+\015//g;
+ tr/\015//d;
+ next if /^\s*$/;
+ last if(/$prompt/);
+ # pager remnants like: ^H^H^H ^H^H^H content
+ s/[\b]+\s*[\b]*//g;
+
+ ProcessHistory("COMMENTS","keysort","D1","! $_");
+ }
+ return(0);
+}
+
+
+sub ShowVer {
+ print STDERR " In ShowVer: $_" if ($debug);
+
+ while (<INPUT>) {
+ tr/\015//d;
+ next if /^\s*$/;
+ last if(/$prompt/);
+ # pager remnants like: ^H^H^H ^H^H^H content
+ s/[\b]+\s*[\b]*//g;
+
+ ProcessHistory("COMMENTS","keysort","B1","! $_");
+ }
+ return(0);
+}
+
+sub ShowSys {
+ print STDERR " In ShowSys: $_" if ($debug);
+
+ while (<INPUT>) {
+ s/^\s+\015//g;
+ tr/\015//d;
+ next if /^\s*$/;
+ last if(/$prompt/);
+ # pager remnants like: ^H^H^H ^H^H^H content
+ s/[\b]+\s*[\b]*//g;
+
+ # Remove Uptime
+ / Up time/ && next;
+
+ /system description: (.*)/i &&
+ ProcessHistory("COMMENTS","keysort","A1", "!Chassis type: $1\n") &&
+ next;
+
+ ProcessHistory("COMMENTS","keysort","C1","! $_");
+ }
+ return(0);
+}
+
+sub ShowVlan {
+ print STDERR " In ShowVlan: $_" if ($debug);
+
+ while (<INPUT>) {
+ s/^\s+\015//g;
+ tr/\015//d;
+ next if /^\s*$/;
+ last if(/$prompt/);
+ # pager remnants like: ^H^H^H ^H^H^H content
+ s/[\b]+\s*[\b]*//g;
+
+ # Remove Uptime
+ / Up time/ && next;
+ ProcessHistory("COMMENTS","keysort","D1","! $_");
+ }
+ return(0);
+}
+
+# This routine processes a "write term" (aka show running-configuration)
+sub WriteTerm {
+ my($comment) = (0);
+ print STDERR " In ShowRun: $_" if ($debug);
+
+ while (<INPUT>) {
+ tr/\015//d;
+ next if /^\s*$/;
+ last if(/$prompt/);
+ # pager remnants like: ^H^H^H ^H^H^H content
+ s/[\b]+\s*[\b]*//g;
+
+ # skip consecutive comment lines
+ if (/^!/) {
+ next if ($comment);
+ ProcessHistory("","","",$_);
+ $comment++;
+ next;
+ }
+ $comment = 0;
+
+ /^building running-config/ && next;
+ /^------+/ && ProcessHistory("","","","!$_") && next;
+ /^router configuration/i && ProcessHistory("","","","!$_") && next;
+ /^oob host config/i && ProcessHistory("","","","!$_") && next;
+ /^empty configuration/i && ProcessHistory("","","","!$_") && next;
+
+ if (/^password (\S+) encrypted/ && $filter_pwds > 1) {
+ ProcessHistory("","","","!password <removed> encrypted\n");
+ next;
+ }
+ if (/^password (\S+)$/ && $filter_pwds >= 1) {
+ ProcessHistory("","","","!password <removed>\n");
+ next;
+ }
+
+ if (/^(enable password level \d+) (\S+) encrypted/ && $filter_pwds > 1){
+ ProcessHistory("","","","!$1 <removed> encrypted\n");
+ next;
+ }
+ if (/^(enable password level \d+) (\S+)$/ && $filter_pwds >= 1) {
+ ProcessHistory("","","","!$1 <removed> $'\n");
+ 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+) (\S+)/) {
+ if (defined($ENV{'NOCOMMSTR'})) {
+ ProcessHistory("SNMPSERVERHOST","ipsort",
+ "$2","!$1 $2 <removed>$'");
+ } else {
+ ProcessHistory("SNMPSERVERHOST","ipsort","$2","$_");
+ }
+ next;
+ }
+ if (/^(snmp-server community) (\S+)/) {
+ if (defined($ENV{'NOCOMMSTR'})) {
+ ProcessHistory("SNMPSERVERCOMM","keysort",
+ "$_","!$1 <removed>$'") && next;
+ } else {
+ ProcessHistory("SNMPSERVERCOMM","keysort","$2","$_") && next;
+ }
+ }
+
+ # prune tacacs/radius server keys
+ if (/^(tacacs-server|radius-server) key \w+/ && $filter_pwds >= 1) {
+ ProcessHistory("","","","!$1 <removed>$'"); next;
+ }
+
+ ProcessHistory("","","","$_");
+ }
+ $found_end = 1;
+ return(1);
+}
+
+# dummy function
+sub DoNothing {print STDOUT;}
+
+# Main
+@commandtable = (
+ {'show system' => 'ShowSys'},
+ {'show version' => 'ShowVer'},
+ {'dir' => 'Dir'},
+ {'show vlan' => 'ShowVlan'},
+ {'show running-config' => 'WriteTerm'}
+);
+# Use an array to preserve the order of the commands and a hash for mapping
+# commands to the subroutine and track commands that have been completed.
+@commands = map(keys(%$_), @commandtable);
+%commands = map(%$_, @commandtable);
+
+$cisco_cmds=join(";",@commands);
+$cmds_regexp=join("|",@commands);
+
+if (length($host) == 0) {
+ if ($file) {
+ print(STDERR "Too few arguments: file name required\n");
+ exit(1);
+ } else {
+ print(STDERR "Too few arguments: host name required\n");
+ exit(1);
+ }
+}
+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 hlogin -t $timeo -c\"$cisco_cmds\" $host\n" if ($debug);
+ print STDOUT "executing hlogin -t $timeo -c\"$cisco_cmds\" $host\n" if ($log);
+ if (defined($ENV{NOPIPE})) {
+ system "hlogin -t $timeo -c \"$cisco_cmds\" $host </dev/null > $host.raw 2>&1" || die "hlogin failed for $host: $!\n";
+ open(INPUT, "< $host.raw") || die "hlogin failed for $host: $!\n";
+ } else {
+ open(INPUT,"hlogin -t $timeo -c \"$cisco_cmds\" $host </dev/null |") || die "hlogin 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: dell\n!\n");
+ProcessHistory("COMMENTS","keysort","A0","!\n");
+ProcessHistory("COMMENTS","keysort","B0","!\n");
+ProcessHistory("COMMENTS","keysort","C0","!\n");
+ProcessHistory("COMMENTS","keysort","D0","!\n");
+TOP: while(<INPUT>) {
+ tr/\015//d;
+ if (/^Error:/) {
+ print STDOUT ("$host dlogin error: $_");
+ print STDERR ("$host dlogin error: $_") if ($debug);
+ last;
+ }
+ while (/#\s*($cmds_regexp)\s*$/) {
+ $cmd = $1;
+ if (!defined($prompt)) {
+ $prompt = ($_ =~ /^([^#]+#)/)[0];
+ $prompt =~ s/([][}{)(\\])/\\$1/g;
+ print STDERR ("PROMPT MATCH: $prompt\n") if ($debug);
+ }
+ print STDERR ("HIT COMMAND:$_") if ($debug);
+ if (!defined($commands{$cmd})) {
+ print STDERR "$host: found unexpected command - \"$cmd\"\n";
+ last TOP;
+ }
+ $rval = &{$commands{$cmd}};
+ delete($commands{$cmd});
+ if ($rval == -1) {
+ 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) || !$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 (!$found_end) {
+ print STDOUT "$found_end: found end\n";
+ 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);
+}