diff options
author | Tar Committer <tar@ocjtech.us> | 2000-11-19 22:01:05 +0000 |
---|---|---|
committer | Tar Committer <tar@ocjtech.us> | 2000-11-19 22:01:05 +0000 |
commit | 1651adc35224e149715bd85af4ba108c5ee184bc (patch) | |
tree | f83b6af44ffb10f2c042b822b2f3469582a129ca /bin/rrancid | |
parent | 3861ba4cf180eb01fd98a16f4502702ab217e56f (diff) | |
download | rancid-1651adc35224e149715bd85af4ba108c5ee184bc.tar.gz rancid-1651adc35224e149715bd85af4ba108c5ee184bc.tar.xz rancid-1651adc35224e149715bd85af4ba108c5ee184bc.zip |
Imported from rancid-2.0.tar.gz.rancid-2.0
Diffstat (limited to 'bin/rrancid')
-rwxr-xr-x | bin/rrancid | 347 |
1 files changed, 0 insertions, 347 deletions
diff --git a/bin/rrancid b/bin/rrancid deleted file mode 100755 index 40113aa..0000000 --- a/bin/rrancid +++ /dev/null @@ -1,347 +0,0 @@ -#!/usr/local/bin/perl -## -## hacked version of Hank's rancid - this one tries to deal with redbacks. -## -## Copyright (C) 1997 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 - -# 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 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 "dir /<fsys>" -sub DirFlash { - print STDERR " In DirFlash: $_" if ($debug); - - my($dev) = (/\/(.*)$/); - while (<INPUT>) { - tr/\015//d; - last if(/^$prompt/); - /^\s*$/ && next; - - /(Can\'t open|No such device)/ && return; - ProcessHistory("FLASH","keysort",$dev,"!Flash: $dev: $_"); - } - ProcessHistory("FLASH","keysort",$dev,"!\n"); - return; -} - -# This routine parses "show hardware" -sub ShowHardware { - print STDERR " In ShowHardware: $_" if ($debug); - - while (<INPUT>) { - tr/\015//d; - last if(/^$prompt/); - s/\s*$/\n/; - - #ProcessHistory("","","","!Chassis: $_") && next; - ProcessHistory("COMMENTS","keysort","B1","!Chassis: $_"); - } - ProcessHistory("COMMENTS","keysort","B1","!\n"); - return; -} - -# This routine parses "show version" -sub ShowVersion { - print STDERR " In ShowVersion: $_" if ($debug); - - while (<INPUT>) { - tr/\015//d; - last if(/^$prompt/); - - /(uptime|restarted|^\s*$)/ && next; - ProcessHistory("COMMENTS","keysort","A1","!Image: $_"); - } - return; -} - -# This routine parses "show slot table" -sub ShowSlotTable { - print STDERR " In ShowSlotTable: $_" if ($debug); - - while (<INPUT>) { - tr/\015//d; - last if(/^$prompt/); - - /(Slot Table|^$)/ && next; - s/^\s*//; - ProcessHistory("COMMENTS","keysort","D1","!Slot Table: $_"); - } - ProcessHistory("COMMENTS","keysort","D1","!\n"); - return; -} - -# This routine processes a "write term" -sub WriteTerm { - print STDERR " In WriteTerm: $_" if ($debug); - - while (<INPUT>) { - tr/\015//d; - last if(/^$prompt/); - -# /Non-Volatile memory is in use/ && return(-1); # NvRAM is locked - # Dog gone Cool matches to process the rest of the config - /^! last updated: .*$/ && next; # kill last updated line - /^ length / && next; # kill length on serial lines - /^ width / && next; # kill width on serial lines - # 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; - ProcessHistory("","","","$_"); - # end of config - if (/^end$/) { - $found_end = 1; - last; - } - } - return; -} - -# dummy function -sub DoNothing {print STDOUT;} - -# Main subroutine that splits up the work -# All Subs return the name of the next function to use. -# If the sub returns a new funtion name, that name will be used -# else the main loop keeps using the current function -sub FlailHelplessly { - print STDERR "Flailing: $_" if ($debug); - print STDOUT "Flailing: $_" if ($log); - /#(show hardware)$/ && delete($commands{$1}) && return("ShowHardware"); - /#(show version)$/ && delete($commands{$1}) && return("ShowVersion"); - /#(show slot table)$/ && delete($commands{$1}) && return("ShowSlotTable"); - /#(show config)$/ && delete($commands{$1}) && return("WriteTerm"); - return "FlailHelplessly"; -} - -# Main -%commands=( - 'show version' => "ShowVersion", - "dir /flash" => "DirFlash", - "dir /pcmcia0" => "DirFlash", - "dir /pcmcia1" => "DirFlash", - 'show hardware' => "ShowHardware", - 'show slot table' => "ShowSlotTable", - 'show config' => "WriteTerm" -); -@commands=( - "show version", - "dir /flash", - "dir /pcmcia0", - "dir /pcmcia1", - "show hardware", - "show slot table", - "show config" -); -# dir /flash -# dir /pcmcia0 -# dir /pcmcia1 - -$redback_cmds=join(";",@commands); -$cmds_regexp=join("|",@commands); - -open(OUTPUT,">$host.new") || die "Can't open $host.new for writing: $!\n"; -select(OUTPUT); -# make OUTPUT unbuffered -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 \"$redback_cmds\" $host </dev/null > $host.raw" || die "clogin failed for $host: $!\n"; - open(INPUT, "< $host.raw") || die "clogin failed for $host: $!\n"; - } else { - open(INPUT,"clogin -t $timeo -c \"$redback_cmds\" $host </dev/null |") || die "clogin failed for $host: $!\n"; - } -} - -ProcessHistory("COMMENTS","keysort","B0","!\n"); -ProcessHistory("COMMENTS","keysort","C0","!\n"); -ProcessHistory("COMMENTS","keysort","E0","!\n"); -while(<INPUT>) { - tr/\015//d; - if (/\#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]; - $prompt =~ s/([][])/\\$1/g; # quote the damn []'s - } - print STDERR ("HIT COMMAND:$_") if ($debug); - if (! defined($commands{$cmd})) { - print STDERR "found unexpected command - \"$cmd\"\n"; - $clean_run = 0; - last; - } - $rval = &{$commands{$cmd}}; - delete($commands{$cmd}); - if ($rval == -1) { - $clean_run = 0; - last; - } - } -} -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 "missed cmd(s): %s\n", join(',', keys(%commands))); - printf(STDERR "missed cmd(s): %s\n", join(',', keys(%commands))) if ($debug); - } - if (!$clean_run || !$found_end) { - print STDOUT "End of run not found\n"; - print STDERR "End of run not found\n" if ($debug); - system("/usr/bin/tail -1 $host.new"); - } - unlink "$host.new" if (! $debug); -} |