diff options
Diffstat (limited to 'bin/cat5rancid.in')
-rw-r--r-- | bin/cat5rancid.in | 112 |
1 files changed, 52 insertions, 60 deletions
diff --git a/bin/cat5rancid.in b/bin/cat5rancid.in index 174aead..bea31bb 100644 --- a/bin/cat5rancid.in +++ b/bin/cat5rancid.in @@ -1,6 +1,6 @@ #! @PERLV_PATH@ ## -## $Id: cat5rancid.in,v 1.37 2005/03/20 22:15:35 heas Exp $ +## $Id: cat5rancid.in,v 1.43 2005/06/20 21:24:30 heas Exp $ ## ## Copyright (C) 1997-2004 by Terrapin Communications, Inc. ## All rights reserved. @@ -31,16 +31,17 @@ $file = $opt_f; $host = $ARGV[0]; $clean_run = 0; $found_end = 0; -$timeo = 90; # clogin timeout in seconds +$timeo = 90; # clogin timeout in seconds -my(%filter_pwds); # password filtering mode +my(@commandtable, %commands, @commands);# command lists +my(%filter_pwds); # password filtering mode my(%modules); # module info (part from sh ver, part from sh module) # 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) { + 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; } @@ -62,10 +63,10 @@ sub ProcessHistory { sub numerically { $a <=> $b; } -# This is a sort routing that will sort numerically on the +# 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(%lines) = @_; local($i) = 0; local(@sorted_lines); foreach $key (sort numerically keys(%lines)) { @@ -75,10 +76,10 @@ sub keynsort { @sorted_lines; } -# This is a sort routing that will sort on the +# 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(%lines) = @_; local($i) = 0; local(@sorted_lines); foreach $key (sort keys(%lines)) { @@ -88,10 +89,10 @@ sub keysort { @sorted_lines; } -# This is a sort routing that will sort on the +# 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(%lines) = @_; local($i) = 0; local(@sorted_lines); foreach $key (sort values %lines) { @@ -101,9 +102,9 @@ sub valsort{ @sorted_lines; } -# This is a numerical sort routing (ascending). +# This is a numerical sort routine (ascending). sub numsort { - local(%lines)=@_; + local(%lines) = @_; local($i) = 0; local(@sorted_lines); foreach $num (sort {$a <=> $b} keys %lines) { @@ -117,7 +118,7 @@ sub numsort { # ip address when the ip address is anywhere in # the strings. sub ipsort { - local(%lines)=@_; + local(%lines) = @_; local($i) = 0; local(@sorted_lines); foreach $addr (sort sortbyipaddr keys %lines) { @@ -130,7 +131,7 @@ sub ipsort { # 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])); + $a[3] + 256 * ($a[2] + 256 * ($a[1] +256 * $a[0])); } sub sortbyipaddr { &ipaddrval($a) <=> &ipaddrval($b); @@ -671,8 +672,8 @@ sub ShowModule { print STDERR " In ShowModule: $_" if ($debug); OUTER:while (<INPUT>) { - tr/\015//d; - last if(/^$prompt/); + tr/\015//d; + last if(/^$prompt/); # stuff module type into %module if (/^Mod\s+Slot\s+Ports/) { <INPUT>; @@ -696,7 +697,7 @@ OUTER:while (<INPUT>) { } next; } - # one does it one way... pita + # one does it one way... pita if (/^Mod\s+Module-Name\s+Ports/) { <INPUT>; #my($slot); @@ -713,7 +714,7 @@ OUTER:while (<INPUT>) { } next; } - # daughter boards + # daughter boards if (/^Mod\s+Sub-Type/) { <INPUT>; my($slot, $board); @@ -767,7 +768,7 @@ OUTER:while (<INPUT>) { ProcessHistory("MODS","","",$model); if ($dboards) {ProcessHistory("MODS","","",$dboards);} } -} +} # This routine processes a "show port ifindex" sub ShowPortIfindex { @@ -790,7 +791,10 @@ sub ShowPortIfindex { sub WriteTerm { print STDERR " In WriteTerm: $_" if ($debug); - ProcessHistory("","","","!\n"); + if (! $found_end) { + ProcessHistory("","","","!\n"); + } + while (<INPUT>) { tr/\015//d; last if (/^$prompt/); @@ -822,9 +826,9 @@ sub WriteTerm { /^#Time: / && next; # Dog gone Cool matches to process the rest of the config - /^#time: / && next; # kill time: - /^tftp-server flash / && next; # kill any tftp remains - /^ntp clock-period / && next; # kill ntp clock-period + /^#time: / && next; # kill time: + /^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 if (/^enable password / && $filter_pwds >= 1) { @@ -925,15 +929,15 @@ sub WriteTerm { # order logging statements /^set logging server (\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> + # order/prune snmp-server host statements + # we only prune lines of the form + # snmp-server host a.b.c.d <community> if (/^set snmp trap (\d+\.\d+\.\d+\.\d+) /) { if (defined($ENV{'NOCOMMSTR'})) { ProcessHistory("SNMPSERVERHOST","ipsort","$1","!set snmp trap $1 <removed>\n"); } else { ProcessHistory("SNMPSERVERHOST","ipsort","$1","$_"); - } + } next; } if (/^(set snmp community) (\S+) (\S+)/) { @@ -991,38 +995,26 @@ sub WriteTerm { sub DoNothing {print STDOUT;} # Main -%commands=( - 'show version' => "ShowVersion", - 'show boot' => "ShowBoot", - 'show flash' => "ShowFlash", - 'dir bootflash:' => "DirSlotN", - 'dir slot0:' => "DirSlotN", - 'dir slot1:' => "DirSlotN", - 'dir sup-bootflash:' => "DirSlotN", - 'dir sup-microcode:' => "DirSlotN", - 'show module' => "ShowModule", - 'show port ifindex' => "ShowPortIfindex", - 'write term all' => "WriteTerm", - 'write term' => "WriteTerm", - 'show running-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 boot", - "show flash", - "dir bootflash:", - "dir slot0:", - "dir slot1:", - "dir sup-bootflash:", - "dir sup-microcode:", - "show module", - "show port ifindex", - "write term all", - "write term", - "show running-config" +@commandtable = ( + {'show version' => 'ShowVersion'}, + {'show boot' => 'ShowBoot'}, + {'show flash' => 'ShowFlash'}, + {'dir bootflash:' => 'DirSlotN'}, + {'dir slot0:' => 'DirSlotN'}, + {'dir slot1:' => 'DirSlotN'}, + {'dir sup-bootflash:' => 'DirSlotN'}, + {'dir sup-microcode:' => 'DirSlotN'}, + {'show module' => 'ShowModule'}, + {'show port ifindex' => 'ShowPortIfindex'}, + {'write term all' => 'WriteTerm'}, + {'write term' => 'WriteTerm'}, + {'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); |