diff options
Diffstat (limited to 'util/lg/lg.cgi.in')
-rwxr-xr-x | util/lg/lg.cgi.in | 783 |
1 files changed, 0 insertions, 783 deletions
diff --git a/util/lg/lg.cgi.in b/util/lg/lg.cgi.in deleted file mode 100755 index 2921f72..0000000 --- a/util/lg/lg.cgi.in +++ /dev/null @@ -1,783 +0,0 @@ -#!@PERLV_PATH@ -## The original original lookingglass s/w was written by Ed Kern. it -## is a single script and used to be available at http://nitrous.digex.net/ -# -## 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. -# -# Looking glass -# vars: query, router, args - -BEGIN { -$me = $0; -$me =~ s/.*\/(\S+)$/$1/; -} - -use CGI qw/:standard/; -use POSIX qw(strftime); -use Sys::Syslog; -use LockFile::Simple qw(lock trylock unlock); - -my($BASEDIR) = "@prefix@"; -my($pingcmd) = "@LG_PING_CMD@"; - -my($query, $max_time_diff, $cache_dir, $cloginrc, @results); -my($type, $router_param, $remote_user, $arg, $router, $mfg); - -my($LG_CACHE_DIR, $LG_CLOGINRC, $LG_IMAGE, $LG_LOG, $LG_ROUTERDB, $LG_AS_REG); -my($LG_BGP_RT, $LG_CACHE_TIME, $LG_SINGLE, $LG_STRIP); - -if (!defined($ENV{HOME})) { $ENV{HOME} = "."; } - -# note: the following functions are duplicated between lgform.cgi and lg.cgi -# to avoid the need for module inclusion headaches from within a httpd context. -# it is just easier to be self-contained. -# SO, ANY CHANGES HERE SHOULD BE REFLECTED IN THE OTHER .cgi. - -# logging -sub dolog -{ - my($level, $msg) = @_; - - if (defined($LG_LOG) && $LG_LOG !~ /\//) { - openlog($me, "pid", $LG_LOG); - syslog($level, "%s", $msg); - closelog; - } else { - local(*LOG); - my($file); - if (defined($LG_LOG)) { - $file = $LG_LOG; - } else { - $file = "$cache_dir/lg.log"; - } - # log date, hostname, query, addr - if (open(LOG, ">>$file") == 0) { - # stderr, if all else fails - printf(STDERR "[" . strftime("%a %b %e %H:%M:%S %Y", gmtime) . - "] could not open log file $file: $!\n"); - printf(STDERR $msg); - } else { - printf(LOG $msg); - close(LOG); - } - } - return; -} -# read LG configuration file -sub readconf -{ - my($conffile, $cmds); - local(*CONF); - if (defined($env{LG_CONF})) { - $conffile = $env{LG_CONF}; - } elsif (-e "lg.conf") { - $conffile = "lg.conf"; - } else { - $conffile = "$BASEDIR/util/lg/lg.conf"; - } - - if (! -f $conffile) { - return; - } - - if (open(CONF, "< $conffile")) { - while (<CONF>) { - next if (/^\s*(#|$)/); - $cmds .= $_; - } - close(CONF); - eval $cmds; - } else { - printf(STDERR "ERROR: couldn\'t open the configuration file: $conffile: $!\n"); - exit(1); - } - - return; -} -# read router.db file -sub readrouters -{ - my($rtrdb); - local(*RTR); - - if (defined($LG_ROUTERDB)) { - $rtrdb = $LG_ROUTERDB; - } else { - $rtrdb = "$BASEDIR/util/lg/router.db"; - } - - if (! -f $rtrdb) { - my(@dirs, $dir); - # if the router.db file does not exist, try to compile the list from - # the rancid group router.db files. - local(*DIR); - if (! opendir(DIR, $BASEDIR)) { - dolog(LOG_ERR, "ERROR: couldn\'t read $BASEDIR: $!\n"); - } else { - while ($dir = readdir(DIR)) { - next if ($dir =~ /^(\.|\.\.|CVS|bin|logs|util)$/); - push(@dirs, $dir) if (-d "$BASEDIR/$dir"); - } - closedir(DIR); - - foreach $dir (@dirs) { - if (! opendir(DIR, "$BASEDIR/$dir")) { - dolog(LOG_ERR, "ERROR: couldn\'t read $BASEDIR/$dir: $!\n"); - next; - } - closedir(DIR); - next if (! -f "$BASEDIR/$dir/router.db"); - if (open(RTR, "< $BASEDIR/$dir/router.db")) { - while (<RTR>) { - next if (/^\s*(#|$)/); - # fqdn:mfg:state - @record = split('\:', $_); - next if ($record[2] !~ /up/i || $record[1] !~ /(cisco|foundry|juniper)/); - push(@rtrlist, join(':', ($record[0], $record[1]))); - $rtrlabels{join(':', ($record[0], $record[1]))} = $record[0]; - } - close(RTR); - } else { - dolog(LOG_ERR, "ERROR: couldn\'t open the router.db file: $BASEDIR/$dir/router.db: $!\n"); - } - } - } - } else { - if (open(RTR, "< $rtrdb")) { - while (<RTR>) { - next if (/^\s*(#|$)/); - # fqdn:mfg:state - @record = split('\:', $_); - next if ($record[2] !~ /up/i || $record[1] !~ /(cisco|foundry|juniper)/); - push(@rtrlist, join(':', ($record[0], $record[1]))); - $rtrlabels{join(':', ($record[0], $record[1]))} = $record[0]; - } - close(RTR); - } else { - dolog(LOG_ERR, "ERROR: couldn\'t open the router.db file: $rtrdb: $!\n"); - exit(1); - } - } - - return; -} - -# the functions remaining are particular to lg.cgi. - -# return true if $router is a member of @rtrlist -sub arraymember { - my($rtrlist) = shift; - my($router) = shift; - my($r); - - foreach $r (@$rtrlist) { - $r = (split(':', $r))[0]; - return(1) if ($r eq $router); - } - - return(0); -} -# check reachability and lock file before attempting to connect to device -# return non-zero on error. -sub DoRsh -{ - my ($router, $mfg, $cmd, $arg) = @_; - my($ctime) = time(); - my($val); - - my($lckobj) = LockFile::Simple->make(-delay => $lock_int, - -max => $max_lock_wait, -hold => $max_lock_hold); - - if ($pingcmd =~ /\d$/) { - `$pingcmd $router`; - } else { - `$pingcmd $router 56 1`; - } - if ($?) { - push(@results, "$router is unreachable. Try again later.\n"); - print @results; - return(-1); - } - if (! $lckobj->lock("$cache_dir/$router")) { - push(@results, "$router is busy. Try again later.\n"); - print @results; - return(-1); - } - $val = &DoCmd($router, $mfg, $cmd, $arg); - $lckobj->unlock("$cache_dir/$router"); - return ($val); -} -# run commands on the router. return non-zero on error. -sub DoCmd -{ - my($rtr, $mfg, $cmd, $arg) = @_; - local(*CMD); - - if ($mfg =~ /foundry/i) { - $cmd = $foundryCmd{$type}; - open(CMD, "sh -c \"flogin -f $cloginrc -c \'$cmd $arg\' $rtr\" 2>&1 |"); - } elsif ($mfg =~ /juniper/i) { - $cmd = $juniperCmd{$type}; - open(CMD, "sh -c \"jlogin -f $cloginrc -c \'$cmd $arg\' $rtr\" 2>&1 |"); - } else { - $cmd = $ciscoCmd{$type}; - open(CMD, "sh -c \"clogin -noenable -f $cloginrc -c \'$cmd $arg\' $rtr\" 2>&1 |"); - } - while (<CMD>) { - tr/\015//d; - if (/^error:/i) { - dolog(LOG_ERR, $_); - if ($LG_STRIP) { undef(@results); } - push(@results, $_); - print @results; - return(-1); - } - push(@results, $_); - if (/$cmd/) { - ($prompt) = /^(\S*)[\#>]/; - if ($LG_STRIP) { - undef(@results); - } else { - print @results; - } - last; - } - } - - while (<CMD>) { - last if /^$prompt[\#>]/; - tr/\015//d; - print $_; - push(@results, $_); - } - while (<CMD>) {} - close(CMD); - - return(0); -} -# Subroutine: Error -# Usage: &Error("msg")); -# Description: displays an error and exits. -## -sub Error { - my($msg) = @_; - - my($q) = new CGI(); - print $q->header; - print $q->start_html("Looking Glass Error"); - - print "<BODY>"; - - # add the company image, LG_IMAGE - print $LG_IMAGE; - - - print <<EOF ; -<br> -<B><FONT SIZE=+2>Looking Glass Error:</FONT></B> -<p> -$msg -<br> -</body> -EOF - - print $q->end_html; - exit(0); -} -# convert a ipv4 address mask to prefix length -sub mask2len { - my($mask) = shift; - my($a, $b, $c, $d) = split('\.', $mask); - my($p, $len); - - $p = ~ (($a << 24) + ($b << 16) + ($c << 8) + $d); - for ($len = 32; $p > 0; $len --) { - $p = $p >> 1; - } - - return($len); -} -# end the page and exit. -sub end_page { - - print <<END ; - </pre> - <!--- end page content ---> - </body> -END - - print $query->end_html; - exit(0); -} -# start the page and log the transaction... -sub start_page { - my($mfg) = @_; - my($cmd); - - my($timestr) = strftime("%a %b %e %H:%M:%S %Y", gmtime); - dolog(LOG_INFO, sprintf("%s %s %s %s\n", - $ENV{REMOTE_HOST}, $ENV{REMOTE_ADDR}, $ENV{REMOTE_USER}, - "- - [$timestr] $type $router $arg")); - print $query->header; - print $query->start_html("Looking Glass Results - $router"); - - $timestr = strftime("%a %b %e %H:%M:%S %Y %Z", gmtime); - - # add the company image, LG_IMAGE - print $LG_IMAGE; - - if ($mfg =~ /foundry/i) { - $cmd = $foundryCmd{$type}; - } elsif ($mfg =~ /juniper/i) { - $cmd = $juniperCmd{$type}; - } else { - $cmd = $ciscoCmd{$type}; - } - - print <<HEAD ; - </b></font> - <font size=+3><b><h1>Looking Glass Results - $router - </b></h1></font> - <hr> - - <center> - <b>Date:</b> $timestr - <p> - <b>Query:</b> $cmd - <br> -HEAD - - if ($arg) { print "<b>Argument(s):</b> $arg\n"; } - print "</center>\n"; - - print <<END ; - <!--$cached--> - </center> - <p> - <pre> -END - - return; -} #end sub start_page - - -# Main() -# read the configuration file if it exists. -readconf(); - -## The script will now cache the results as simple files in the $cache_dir, -## named after the type of query (queries must, of course, be one word no -## spaces). Modify $max_time_diff to set the lifetime for each cache. -## Currently, cache lifetime is the same for all queries. -# for most web servers, cache_dir must be writable by uid nobody -if (defined($LG_CACHE_DIR)) { - $cache_dir = $LG_CACHE_DIR; -} else { - $cache_dir = "./tmp"; -} - -# read routers table to get @rtrlist -readrouters(); - -# when to display cache? max time difference (in seconds) -if (defined($LG_CACHE_TIME)) { - $max_time_diff = $LG_CACHE_TIME; -} else { - $max_time_diff = "600" ; -} - -# max seconds to wait for a 'router' lock to free up -$max_lock_wait = 30; -$lock_int = 5; -$max_lock_hold = 300; - -# clogin setup -if (defined($LG_CLOGINRC)) { - $cloginrc = $LG_CLOGINRC; -} else { - $cloginrc = "$BASEDIR/.cloginrc"; -} - -$query = new CGI; - -# get form data and validate -$type = ($query->param('query'))[0]; -$router_param = ($query->param('router'))[0]; -$remote_user = $ENV{REMOTE_USER}; -$arg = ($query->param('args'))[0]; -# handle multiple args -$arg =~ s/["'`]//g; # these are BS in any arg for any query -@arg = split(' ', $arg); - -# verify router, commands, arguments, etc. -($router, $mfg) = split(':', $router_param); -if (!defined($type) || !defined($router)) { - $results[0] = "You must at least choose a Query and a router. Try buying a clue.\n"; - &Error("You must at least choose a Query and a router. Try buying a clue.\n"); -} - -if (! arraymember(\@rtrlist, $router)) { - my($timestr) = strftime("%a %b %e %H:%M:%S %Y", gmtime); - dolog(LOG_WARNING, sprintf("%s %s %s %s\n", - $ENV{REMOTE_HOST}, $ENV{REMOTE_ADDR}, $ENV{REMOTE_USER}, - "- - [$timestr] lg.cgi: attempt to access $router\n")); - Error("access to $router not permitted"); -} - -# conversion of command "type" passed from lgform.cgi to the vendor's syntax. -%ciscoCmd = ( - #acl => "show access-list", - #aspath => "show ip as-path-access-list", - #communitylist => "show ip community-list", - damp => "show ip bgp dampened-paths", - framerelay => "show frame-relay pvc", - interface => "show interface", - intbrief => "show ip interface", # switch in {interface} - log => "show logging", - mbgp => "show ip mbgp", - mbgpsum => "show ip mbgp summary", - mneighbor => "show ip bgp neighbor", - neighbor => "show ip bgp neighbor", - regex => "show ip bgp regex", - route => "show ip route", - routemap => "show route-map", - ping => "ping", - prefix => "show ip bgp", - prefixlist => "show ip prefix-list", - summary => "show ip bgp summary", - trace => "traceroute" - ); -%foundryCmd = ( - #acl => "show access-list", - #aspath => "show ip as-path-access-list", - #communitylist => "show ip community-list", - damp => "show ip bgp dampened-paths", - #framerelay => "show frame-relay pvc", # no frame relay - interface => "show interface", - log => "show log", - #mbgp => "show ip mbgp", - #mbgpsum => "show bgp summary", - #mneighbor => "show ip bgp neighbor", - neighbor => "show ip bgp neighbor", - #regex => "show ip bgp aspath-regex", - route => "show ip route", - routemap => "show route-map", - ping => "ping", - prefix => "show ip bgp", - prefixlist => "show ip prefix-list", - summary => "show ip bgp summary", - trace => "traceroute" - ); -%juniperCmd = ( - #acl => "show access-list", - #aspath => "show ip as-path-access-list", - #communitylist => "show ip community-list", - damp => "show route damping suppressed terse table inet.0", - framerelay => "show frame-relay pvc", - interface => "show interface", - log => "show log messages", - mbgp => "show route table inet.2 terse", - mbgpsum => "show bgp summary", - mneighbor => "show bgp neighbor", - neighbor => "show bgp neighbor", - regex => "show route table inet.0 aspath-regex", - route => "show route table inet.0 terse", - routemap => "show policy", - ping => "ping rapid count 5", - prefix => "show route table inet.0", - prefixlist => "show policy", - summary => "show bgp summary", - trace => "traceroute" - ); -%cmdDisp = ( - #acl => "show access-list", - #aspath => "show ip as-path-access-list", - #communitylist => "show ip community-list", - damp => "show ip bgp dampened-paths", - framerelay => "show frame-relay pvc", - interface => "show interface", - log => "show logging", - mbgp => "show ip mbgp", - mbgpsum => "show ip mbgp summary", - mneighbor => "show ip mbgp neighbor", - neighbor => "show ip bgp neighbor", - regex => "show ip bgp regex", - route => "show ip route", - routemap => "show route-map", - ping => "ping", - prefix => "show ip bgp", - prefixlist => "show ip prefix-list", - summary => "show ip bgp summary", - trace => "traceroute" - ); - -# not all cmds/queries are implemented for junipers -if ($mfg =~ /juniper/) { - if (! defined($juniperCmd{$type})) { - Error("$cmdDisp{$type} not implemented for junipers. sorry.\n"); - } - $cmd = $juniperCmd{$type}; -} elsif ($mfg =~ /foundry/) { - if(! defined($foundryCmd{$type})) { - Error("$cmdDisp{$type} not implemented for foundrys. sorry.\n"); - } - $cmd = $foundryCmd{$type}; -} else { - if(! defined($ciscoCmd{$type})) { - Error("$cmdDisp{$type} not implemented for cisco. sorry.\n"); - } - $cmd = $ciscoCmd{$type}; -} - -if ($type eq "prefix" || $type eq "mbgp" || $type eq "route" ) { - if ($arg[0] !~ /^\d+\.\d+\.\d+\.\d+$/) { - &Error("The IP address \"$arg[0]\" is not valid and lacking an address would over-burden our router.\n"); - } elsif (defined($arg[1]) && $arg[1] !~ /^\d+\.\d+\.\d+\.\d+$/) { - &Error("The IP netmask \"$arg[1]\" is not valid.\n"); - } - if ($mfg =~ /juniper/i && defined($arg[1])) { - $arg = $arg[0] . "/" . mask2len($arg[1]); - } -} elsif ($type eq "framerelay") { - if ($mfg =~ /juniper/) { - &Error("Juniper does not have a show frame-relay pvc command. " . - "Use show interface.\n"); - } - if ($arg[0] > 15 && $arg[0] < 1024) { - $arg = $arg[0]; - } else { - undef($arg); - } -} elsif ($type eq "interface") { - if ($mfg =~ /(cisco|foundry)/) { - if ($arg[0] !~ /^b[^ ]+[0-9]/i && $arg[0] =~ /^b/i) { - $type = "intbrief"; - $arg = "brief"; - } else { - $arg = $arg[0]; - } - } elsif ($mfg =~ /juniper/) { - my($optind) = 0; - # arg 0 may be an intf name or a display option, but there can - # only be 2 args - $arg = ""; - while ($optind <= $#arg && $optind < 2) { - $arg[$optind] =~ s/brief/terse/; - if ($arg[$optind] =~ /^([a-z0-9]{2}\-\d+\/\d+\/\d+(:\d+)?)/i) { - $arg .= " $1"; - } elsif ($arg[$optind] =~ /^det/i) { - $arg .= " detail"; - } elsif ($arg[$optind] =~ /^ter/i) { - $arg .= " terse"; - } elsif ($arg[$optind] =~ /^ext/i) { - $arg .= " extensive"; - } - $optind += 1; - } - } -} elsif ($type eq "log") { - if ($arg[0] =~ /^\s*\|?$/) { - shift(@arg); - } - $arg[0] =~ s/^\s*\|?//; - if ($arg[0] !~ /^\s*$/) { - if ($mfg =~ /cisco/i) { - $arg = " | include " . join(' ', @arg); - } elsif ($mfg =~ /juniper/i) { - $arg = " | match \"" . join(' ', @arg) . "\""; - } else { - undef($arg); - } - } else { - undef($arg); - } -} elsif ($type eq "ping" || $type eq "trace") { - if ($arg[0] !~ /^\d+\.\d+\.\d+\.\d+$/) { - if ($arg[0] !~ /^[A-Za-z0-9._-]+$/) { - &Error("That argument ($arg[0]) is not valid.\n"); - } - } - $arg = $arg[0]; -} elsif ($type eq "aspath" || $type eq "communitylist") { - if ($arg[0] !~ /^\d+$/ || ($arg[0] < 1 && $arg[0] > 199)) { - &Error("That argument ($arg[0]) is not valid.\n"); - } - $arg = $arg[0]; -} elsif ($type eq "acl") { - if ($arg[0] !~ /^\d+$/ || ($arg[0] < 100 && $arg[0] > 199) || - ($arg[0] < 1300 && $arg[0] > 2699)) { - &Error("That argument ($arg[0]) is not valid.\n"); - } - $arg = $arg[0]; - # don't show the jewels - # XXX: this error msg is useless, but show acl is un-implemented. - &Error($mfg) if ($arg == 98 || $arg == 99); -} elsif ($type eq "prefixlist" || $type eq "routemap") { - if ($arg[0] !~ /^[0-9A-Za-z][^\s\"]*$/) { - &Error("That argument ($arg[0]) is not valid.\n"); - } - $arg = $arg[0]; -} elsif ($type eq "regex") { - $arg = $arg[0]; - if ($#arg >= 1) { - for ($n = 1; $n <= $#arg; $n++) { $arg .= " " . $arg[$n]; } - } - # remove leading/trailing whitespace - $arg =~ s/^\s*//; $arg =~ s/\s*$//; - if ($arg !~ /^[0-9_ ^.*+?[\])\(-]*\$?$/ || $arg =~ /^\s*$/) { - &Error("That argument ($arg[0]) is not valid.\n"); - } - # pathetic excuses for lookups - if ($arg =~ /^[_.* ^]*(\*|1|701|1239|1280|1740|3561|5462|10303)+[_\$]*$/ || - $arg =~ /^[_.* ^]*(1|701|1239|1280|1740|3561|5462|10303)+[_ .]*[\[*.]/) { - &Error("Get real. Such a query has potential to over-burden our " . - "router.\nLook that up on your own router.\n"); - } - if ($mfg =~ /juniper/) { - $arg =~ s/_/ /g; - # pre-junos 4.4 do not allow anchors - if ($arg =~ /\^\$/) { - $arg =~ "()"; - } else { - $arg =~ s/[\$^]/ /g; - } - $arg = "\"$arg\""; - } - # escape any ()s - $arg =~ s/([\(\)])/\\$1/g; -} elsif ($type eq "neighbor") { - if ($arg[0] !~ /^\d+\.\d+\.\d+\.\d+$/) { - if ($arg[0] !~ /([A-Za-z0-9-]*.)*[A-Za-z0-9-]*.(com|edu|net|org)/) { - &Error("That argument ($arg[0]) is not valid.\n"); - } - } - $arg = $arg[0]; - if (defined($arg[1]) && $arg[1] =~ /^(a|ro|f|re)/) { - if ($mfg =~ /juniper/) { - if ($arg[1] =~ /^a/) { - if (defined($LG_BGP_RT)) { - $cmd = "show route table inet.0 all advertising-protocol ". - "bgp"; - } - } elsif ($arg[1] =~ /^f/) { - if (defined($LG_BGP_RT)) { - $cmd = "show route damping table inet.0 all ". - "receive-protocol bgp"; - } - } elsif ($arg[1] =~ /^r/) { - if (defined($LG_BGP_RT)) { - $cmd = "show route table inet.0 all receive-protocol bgp"; - } - } - } else { - if ($arg[1] =~ /^a/) { - if (defined($LG_BGP_RT)) { $arg .= " advertised-routes"; } - } elsif ($arg[1] =~ /^f/) { - $arg .= " flap-statistics"; - } elsif ($arg[1] =~ /^ro/) { - if (defined($LG_BGP_RT)) { $arg .= " routes"; } - } elsif ($arg[1] =~ /^re/) { - if (defined($LG_BGP_RT)) { $arg .= " received-routes"; } - } - } - } -} elsif ($type eq "mneighbor") { - if ($arg[0] !~ /^\d+\.\d+\.\d+\.\d+$/) { - if ($arg[0] !~ /([A-Za-z0-9-]*.)*[A-Za-z0-9-]*.(com|edu|net|org)/) { - &Error("That argument ($arg[0]) is not valid.\n"); - } - } - $arg = $arg[0]; - if (defined($arg[1]) && $arg[1] =~ /^(a|ro|f|re)/) { - if ($mfg =~ /juniper/) { - if ($arg[1] =~ /^a/) { - $cmd .= " advertised-routes"; - } elsif ($arg[1] =~ /^f/) { - $cmd .= " flap-statistics"; - } elsif ($arg[1] =~ /^ro/) { - $cmd .= " routes"; - } elsif ($arg[1] =~ /^re/) { - $cmd .= " received-routes"; - } - } else { - if ($arg[1] =~ /^a/) { - $arg .= " advertised-routes"; - } elsif ($arg[1] =~ /^f/) { - $arg .= " flap-statistics"; - } elsif ($arg[1] =~ /^ro/) { - $arg .= " routes"; - } elsif ($arg[1] =~ /^re/) { - $arg .= " received-routes"; - } - } - } -} elsif ($type eq "damp" || $type eq "summary" || $type eq "mbgpsum") { - undef($arg); -} - -# make stdout unbuffered, so result page streams. -$| = 1; -start_page(); - -# cache the following -if ($type eq "summary" || $type eq "mbgpsu" || $type eq "damp" - || $type eq "log") { - if (!$arg) { - # cache requests with no addr/argument - local(*CACHE); - - my($file) = "$cache_dir/$type" ; - $file =~ s/\s+/_/g; - $file .= "_$router"; - - if (-e $file) { - # see if cache exists - @stat = stat($file); - $ftime = $stat[9]; - $dtime = time() - $stat[9]; - - # see if we are within cache time - if ($dtime <= $max_time_diff) { - if (open(CACHE, "<$file") == 0) { - dolog(LOG_ERR, "couldnt open cache file $file: $!\n"); - } else { - print "<b>From cache (number of seconds old (max " . - "$max_time_diff)):</b> $dtime\n\n"; - while (<CACHE>) { print $_; } - close(CACHE); - &end_page(); - } - } - } - - # else, execute command and save to a new cache file - if (! &DoRsh($router, $mfg, $cmd, $arg)) { - if (open(CACHE, ">$file") == 0) { - dolog(LOG_ERR, "couldnt create cache file $file: $!\n"); - exit(1); - } else { - printf(CACHE "@results"); - close(CACHE); - } - } - } else { - &DoRsh($router, $mfg, $cmd, $arg); - } - &end_page(); -} else { - &DoRsh($router, $mfg, $cmd, $arg); - &end_page(); -} - -exit(0); |