diff options
Diffstat (limited to 'bin/francid')
-rwxr-xr-x | bin/francid | 384 |
1 files changed, 0 insertions, 384 deletions
diff --git a/bin/francid b/bin/francid deleted file mode 100755 index 54aae8d..0000000 --- a/bin/francid +++ /dev/null @@ -1,384 +0,0 @@ -#!/usr/local/bin/perl -## -## Amazingly hacked version of Hank's rancid - this one tries to -## deal with foundrys. -## -## 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; # flogin 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 "show version" -sub ShowVersion { - my($slot); - - print STDERR " In ShowVersion: $_" if ($debug); - - while (<INPUT>) { - tr/\015//d; - next if /^\s*$/; - last if(/^$prompt/); - - next if (/^The system /); - - s/^\s*(HW|SW)/$1/; - s/^\s*(Compiled on)/SW: $1/; - #s/^(HW.*)/$1\n/; - if (/^SL (\d)/) { - $slot = "Slot $1"; - s/^SL \d+/$slot/; - } - if (/MHz .* processor/) { - $slot = "MGMT"; - } - s/^(\s*\d+ )/$slot:$1/; - s/^===*//; - - ProcessHistory("VERSION","","","!$_"); - } - ProcessHistory("VERSION","","","!\n"); - return(0); -} - -# This routine parses "show chassis" -sub ShowChassis { - print STDERR " In ShowChassis: $_" if ($debug); - - while (<INPUT>) { - tr/\015//d; - last if (/^$prompt/); - next if (/ from /); - next if (/current temperature/i); - ProcessHistory("CHASSIS","","","! $_"); - } - ProcessHistory("CHASSIS","","","!\n"); - return(0); -} - -# This routine parses "show flash" -sub ShowFlash { - print STDERR " In ShowFlash: $_" if ($debug); - - while (<INPUT>) { - tr/\015//d; - last if(/^$prompt/); - next if /^\s*$/; - ProcessHistory("FLASH","","","!Flash: $_"); - } - ProcessHistory("","","","!\n"); - return; -} - -# This routine parses "show module" -sub ShowModule { - print STDERR " In ShowModule: $_" if ($debug); - - while (<INPUT>) { - tr/\015//d; - last if(/^$prompt/); - next if /^\s*$/; - next if /:\s*$/; - ProcessHistory("MODULE","","","!Module: $_"); - } - ProcessHistory("","","","!\n"); - return(0); -} - -# This routine processes a "write term" -sub WriteTerm { - print STDERR " In WriteTerm: $_" if ($debug); - - while (<INPUT>) { - tr/\015//d; - last if(/^$prompt/); - - /Current configuration:/i && next; - /^ver \d+\.\d+/ && next; - /^module \d+ / && next; - - /^ntp clock-period / && next; # kill ntp clock-period - /^ 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+)\s+(perm|deny)\s+(\d\S+)(\/\d+)\s*$/ && - ProcessHistory("PACL $1 $2","ipsort","$3","$_") - && next; - /^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; - # order logging statements - /^logging (\d+\.\d+\.\d+\.\d+)/ && - ProcessHistory("LOGGING","ipsort","$1","$_") && next; - # order name-server statements - /^ip name-server (\d+\.\d+\.\d+\.\d+)/ && - ProcessHistory("NAMESERVER","ipsort","$1","$_") && next; - # order snmp-server host statements - /^snmp-server host (\d+\.\d+\.\d+\.\d+)/ && - ProcessHistory("SNMPSERVERHOST","ipsort","$1","$_") && next; - /^snmp-server community / && - ProcessHistory("SNMPSERVERCOMM","keysort","$_","$_") && next; - - # order tacacs server statements - /^(tacacs-server key )/ && - ProcessHistory("","","","! $1<removed>\n") && next; - /^tacacs-server host (\d+\.\d+\.\d+\.\d+)/ && - ProcessHistory("TAC","ipsort","$1","$_") && next; - - # delete ntp auth password - /^(ntp authentication-key \d+ md5) / && - 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; - - ProcessHistory("","","","$_"); - # end of config - if (/^end$/) { - $found_end = 1; - return(1); - } - } - return(0); -} - -# dummy function -sub DoNothing {print STDOUT;} - -# Main -%commands=( - 'show version' => "ShowVersion", - 'show chassis' => "ShowChassis", - 'show module' => "ShowModule", - 'show flash' => "ShowFlash", - 'write term' => "WriteTerm" -); -# keys() doesnt return things in the order entered and the order of the -# cmds is important. pita -@commands=( - "show version", - "show chassis", - "show module", - "show flash", - "write term" -); -$cisco_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 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 flogin -t $timeo -c\"$cisco_cmds\" $host\n" if ($debug); - print STDOUT "executing flogin -t $timeo -c\"$cisco_cmds\" $host\n" if ($log); - if (defined($ENV{NOPIPE})) { - system "flogin -t $timeo -c \"$cisco_cmds\" $host </dev/null > $host.raw 2>&1" || die "flogin failed for $host: $!\n"; - open(INPUT, "< $host.raw") || die "flogin failed for $host: $!\n"; - } else { - open(INPUT,"flogin -t $timeo -c \"$cisco_cmds\" $host </dev/null |") || die "flogin failed for $host: $!\n"; - } -} - -TOP: while(<INPUT>) { - tr/\015//d; - if (/\#exit$/) { - $clean_run=1; - last; - } - if (/Error:/) { - s/^.*Error:/Error:/; - print STDOUT ("$host flogin error: $_"); - print STDERR ("$host flogin 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 "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 "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); -} |