Blame bin/mrtg

Packit 667938
#! /usr/bin/perl -w
Packit 667938
# -*- mode: cperl -*-
Packit 667938
Packit 667938
###################################################################
Packit 667938
# MRTG 2.17.7  Multi Router Traffic Grapher
Packit 667938
###################################################################
Packit 667938
# Created by Tobias Oetiker <tobi@oetiker.ch>
Packit 667938
#            and Dave Rand <dlr@bungi.com>
Packit 667938
#
Packit 667938
# For individual Contributers check the CHANGES file
Packit 667938
#
Packit 667938
###################################################################
Packit 667938
#
Packit 667938
# Distributed under the GNU General Public License
Packit 667938
#
Packit 667938
###################################################################
Packit 667938
my @STARTARGS=($0,@ARGV);
Packit 667938
Packit 667938
@main::DEBUG=qw();
Packit 667938
# DEBUG TARGETS
Packit 667938
# cfg  - watch the config file reading
Packit 667938
# dir  - directory mangeling
Packit 667938
# base - basic program flow
Packit 667938
# tarp - target parser
Packit 667938
# snpo - snmp polling
Packit 667938
# snpo2 - more snmp debug
Packit 667938
# coca - confcache operations
Packit 667938
# repo - track confcache repopulation
Packit 667938
# fork - forking view
Packit 667938
# time - some timing info
Packit 667938
# log  - logging of data via rateup or rrdtool
Packit 667938
# eval - trace eval experssions
Packit 667938
# prof - add timeing info some interesting bits of code
Packit 667938
Packit 667938
$main::GRAPHFMT="png";
Packit 667938
# There older perls tend to behave peculiar with
Packit 667938
# large integers ...
Packit 667938
require 5.005;
Packit 667938
Packit 667938
use strict;
Packit 667938
# addon jpt
Packit 667938
BEGIN {
Packit 667938
    # Automatic OS detection ... do NOT touch
Packit 667938
    if ( $^O =~ /^(ms)?(dos|win(32|nt)?)/i ) {
Packit 667938
	$main::OS = 'NT';
Packit 667938
	$main::SL = '\\';
Packit 667938
	$main::PS = ';';        
Packit 667938
    } elsif ( $^O =~ /^NetWare$/i ) {
Packit 667938
	$main::OS = 'NW';
Packit 667938
	$main::SL = '/';
Packit 667938
	$main::PS = ';';
Packit 667938
    } elsif ( $^O =~ /^VMS$/i ) {
Packit 667938
	$main::OS = 'VMS';
Packit 667938
	$main::SL = '.';
Packit 667938
	$main::PS = ':';
Packit 667938
    } elsif ( $^O =~ /^os2$/i ) {
Packit 667938
	$main::OS = 'OS2';
Packit 667938
	$main::SL = '/';
Packit 667938
	$main::PS = ';';
Packit 667938
    } else {
Packit 667938
	$main::OS = 'UNIX';
Packit 667938
	$main::SL = '/';
Packit 667938
	$main::PS = ':';
Packit 667938
    }
Packit 667938
    if ( $ENV{LANG} and $ENV{LANG} =~ /UTF.*8/i ){        
Packit 667938
        my $args = join " ", map { /\s/ ? "\"$_\"" : $_ } @ARGV;
Packit 667938
        $args ||= "";
Packit 667938
        print <
Packit 667938
-----------------------------------------------------------------------
Packit 667938
ERROR: Mrtg will most likely not work properly when the environment
Packit 667938
       variable LANG is set to UTF-8. Please run mrtg in an environment
Packit 667938
       where this is not the case. Try the following command to start:
Packit 667938
Packit 667938
       env LANG=C ${0} $args 
Packit 667938
-----------------------------------------------------------------------
Packit 667938
ERR
Packit 667938
        exit 0;
Packit 667938
    }
Packit 667938
}
Packit 667938
Packit 667938
Packit 667938
use FindBin;
Packit 667938
use lib "${FindBin::Bin}";
Packit 3f632f
use lib "${FindBin::Bin}${main::SL}..${main::SL}@@lib@@${main::SL}mrtg2";
Packit 667938
use Getopt::Long;
Packit 667938
use Math::BigFloat;
Packit 667938
Packit 667938
# search for binaries in the bin and bin/../lib  directory
Packit 667938
use MRTG_lib "2.100016";
Packit 667938
Packit 667938
my $NOW = timestamp;
Packit 667938
Packit 667938
my $graphiteObj;
Packit 667938
Packit 667938
# $SNMP_Session::suppress_warnings = 2;
Packit 667938
use locales_mrtg "0.07";
Packit 667938
Packit 667938
# Do not Flash Console Windows for the forked rateup process 
Packit 667938
BEGIN {
Packit 667938
    if ($^O eq 'MSWin32'){
Packit 667938
	eval {local $SIG{__DIE__};require Win32; Win32::SetChildShowWindow(0)};
Packit 667938
	warn "WARNING: $@\n" if $@;
Packit 667938
    }    
Packit 667938
}
Packit 667938
Packit 667938
$main::STARTTIME = time;
Packit 667938
Packit 667938
%main::verified_rrd = ();
Packit 667938
    
Packit 667938
if ($MRTG_lib::OS eq 'OS2') {
Packit 667938
# in daemon mode we will pause 3 seconds to be sure that parent died
Packit 667938
  require OS2::Process;
Packit 667938
  if (OS2::Process::my_type() eq 'DETACH') {sleep(3);}
Packit 667938
}
Packit 667938
Packit 667938
if ($MRTG_lib::OS eq 'UNIX') {
Packit 667938
   $SIG{INT} = $SIG{TERM} = 
Packit 667938
           sub {   unlink ${main::Cleanfile} 
Packit 667938
                       if defined $main::Cleanfile;
Packit 667938
                   unlink ${main::Cleanfile2}
Packit 667938
                       if defined $main::Cleanfile2;
Packit 667938
                   unlink ${main::Cleanfile3}
Packit 667938
                       if defined $main::Cleanfile3;
Packit 667938
                   warn "$NOW: ERROR: Bailout after SIG $_[0]\n";
Packit 667938
                   exit 1;
Packit 667938
                };
Packit 667938
  $SIG{HUP} = sub {
Packit 667938
                   unlink ${main::Cleanfile} 
Packit 667938
                       if defined $main::Cleanfile;
Packit 667938
                   unlink ${main::Cleanfile2}
Packit 667938
                       if defined $main::Cleanfile2;
Packit 667938
                   unlink ${main::Cleanfile3}
Packit 667938
                       if defined $main::Cleanfile3;
Packit 667938
                   die "$NOW: ERROR: Bailout after SIG $_[0]\n";
Packit 667938
                };
Packit 667938
}
Packit 667938
Packit 667938
Packit 667938
END {
Packit 667938
    local($?, $!);
Packit 667938
    unlink ${main::Cleanfile} if defined $main::Cleanfile;
Packit 667938
    unlink ${main::Cleanfile2} if defined $main::Cleanfile2;
Packit 667938
}
Packit 667938
Packit 667938
&mai;;
Packit 667938
Packit 667938
exit(0);
Packit 667938
Packit 667938
#### Functions ################################################
Packit 667938
Packit 667938
sub main {
Packit 667938
Packit 667938
    
Packit 667938
    # read in the config file
Packit 667938
    my @routers;
Packit 667938
    my %cfg;
Packit 667938
    my %rcfg;
Packit 667938
    my %opts; 
Packit 667938
    my $EXITCODE = 0;
Packit 667938
    
Packit 667938
    GetOptions(\%opts, 'user=s', 'group=s', 'lock-file=s','confcache-file=s','logging=s', 'check', 'fhs', 'daemon',  'pid-file=s','debug=s', 'log-only') or die "Please use valid Options\n";
Packit 667938
Packit 667938
    if (defined $opts{debug}){
Packit 667938
        @main::DEBUG = split /\s*,\s*/, $opts{debug};
Packit 667938
	if (defined $SNMP_util::Debug){
Packit 667938
	        $SNMP_util::Debug = 1 if grep /^snpo2$/, @main::DEBUG;
Packit 667938
	}
Packit 667938
    }
Packit 667938
    if (grep /^prof$/, @main::DEBUG){
Packit 667938
	require Time::HiRes;
Packit 667938
        eval "sub gettimeofday() {return Time::HiRes::time()}";
Packit 667938
	# note this will crash if the module is missing
Packit 667938
	# so only use the --debug=prof if you have Time::HiRes installed
Packit 667938
    } else {
Packit 667938
	eval "sub gettimeofday() {return time()}";
Packit 667938
    }
Packit 667938
    debug 'time', "prog start ".localtime(time);
Packit 667938
Packit 667938
    my $uid = $<;
Packit 667938
    my $gid = $(;
Packit 667938
Packit 667938
    if (defined $opts{group}) {
Packit 667938
        $gid = getgrnam($opts{group});
Packit 667938
        die "$NOW: ERROR: Unknown Group: $opts{group})\n" if not defined $gid;
Packit 667938
    }
Packit 667938
Packit 667938
    if (defined $opts{user}) {
Packit 667938
        $uid = getpwnam($opts{user});
Packit 667938
        die "$NOW: ERROR: Unknown User: $opts{user})\n" if not defined $uid;
Packit 667938
    }
Packit 667938
Packit 667938
    # If we've specified using FHS (http://www.pathname.com/fhs/) on the command line,
Packit 667938
    # use the relevant path definitions (can be overridden later):
Packit 667938
Packit 667938
    my $confcachefile;
Packit 667938
    my $pidfile;
Packit 667938
    my $lockfile;
Packit 667938
    my $templock;
Packit 667938
    my $logfile;
Packit 667938
Packit 667938
    if (defined $opts{"fhs"}) {
Packit 667938
	$confcachefile = "/var/cache/mrtg/mrtg.ok";
Packit 667938
	$pidfile = "/var/run/mrtg.pid";
Packit 667938
	$lockfile = "/var/cache/mrtg/mrtg.lck";
Packit 667938
	$templock = "/var/cache/mrtg/mrtg.lck.$$";
Packit 667938
	$logfile = "/var/log/mrtg.log";
Packit 667938
    }	
Packit 667938
Packit 667938
    my $cfgfile = shift @ARGV;
Packit 667938
Packit 667938
    if ( !defined $cfgfile and -r "/etc/mrtg.cfg" ) { $cfgfile = "/etc/mrtg.cfg"; }
Packit 667938
Packit 667938
    printusage() unless defined $cfgfile;
Packit 667938
Packit 667938
    # PID file code, used later if daemonizing...
Packit 667938
    if ( !defined($pidfile) ) {
Packit 667938
        $pidfile =  $cfgfile;
Packit 667938
        $pidfile =~ s/\.[^.\/]+$//;
Packit 667938
        $pidfile .= '.pid';
Packit 667938
    }
Packit 667938
    $pidfile =  $opts{"pid-file"} || $pidfile;
Packit 667938
Packit 667938
    # Run as a daemon, specified on command line (required for FHS compliant daemon)
Packit 667938
    if (defined $opts{"daemon"}) {
Packit 667938
	# Create a pidfile, then chown it so we can use it once we change user
Packit 667938
	&create_pid($pidfile);
Packit 667938
	chown $uid, $gid, $pidfile;
Packit 667938
    }
Packit 667938
Packit 667938
    ($(,$)) = ($gid,$gid) ;
Packit 667938
    ($<,$>) = ($uid,$uid) ;
Packit 667938
    die "$NOW: ERROR failed to set UID to $uid\n" unless ($< == $uid and  $> == $uid);
Packit 667938
Packit 667938
    $logfile = $opts{logging} || $logfile;
Packit 667938
    if (defined $logfile){
Packit 667938
	setup_loghandlers $logfile;
Packit 667938
        warn "Started mrtg with config \'$cfgfile\'\n";
Packit 667938
    }	
Packit 667938
Packit 667938
    # lets make sure that there are not two mrtgs running in parallel.
Packit 667938
    # so we lock on the cfg file. Nothing fancy, just a lockfile
Packit 667938
Packit 667938
    $lockfile = $opts{"lock-file"} || $lockfile;
Packit 667938
Packit 667938
    if (! defined $lockfile) {
Packit 667938
        $lockfile = $cfgfile."_l";
Packit 667938
    }
Packit 667938
    if (! defined $templock) {
Packit 667938
        $templock = $lockfile."_" . $$ ;
Packit 667938
    }
Packit 667938
Packit 667938
    debug('base', "Creating Lockfiles $lockfile,$templock");
Packit 667938
    &lockit($lockfile,$templock);
Packit 667938
Packit 667938
    debug('base', "Reading Config File: $cfgfile");
Packit 667938
    my $cfgfile_age = -M $cfgfile;
Packit 667938
    readcfg($cfgfile,\@routers,\%cfg,\%rcfg);
Packit 667938
Packit 667938
    imggen($cfg{icondir} || $cfg{imagedir} || $cfg{workdir});
Packit 667938
    
Packit 667938
    # Enable or disable snmpv3
Packit 667938
    if(defined $cfg{enablesnmpv3}) {
Packit 667938
        $cfg{enablesnmpv3} = lc($cfg{enablesnmpv3});
Packit 667938
    } else {
Packit 667938
        $cfg{enablesnmpv3} = 'no';
Packit 667938
    }
Packit 667938
Packit 667938
    if ($cfg{threshmailserver}) {
Packit 667938
        if  (eval {local $SIG{__DIE__};require Net::SMTP;})   {
Packit 667938
	    import Net::SMTP;
Packit 667938
            debug('base', "Loaded Net::SMTP module for ThreshMail.");
Packit 667938
        } else {
Packit 667938
            die "$NOW: WARNING: Can't load Net::SMTP module. This is required for ThreshMail.";
Packit 667938
        }
Packit 667938
    }
Packit 667938
    # Check we have the necessary libraries for IPv6 support
Packit 667938
    if ($cfg{enablesnmpv3} eq 'yes') {
Packit 667938
        if  (eval {local $SIG{__DIE__};require Net_SNMP_util;})   {
Packit 667938
	    import Net_SNMP_util;
Packit 667938
            debug('base', "SNMP V3 libraries found, SNMP V3 enabled.");
Packit 667938
        } else {
Packit 667938
            warn "$NOW: WARNING: SNMP V3 libraries not found, SNMP V3 disabled.\n";
Packit 667938
            $cfg{enablesnmpv3} =  'no';
Packit 667938
	    require SNMP_util;
Packit 667938
	    import SNMP_util;
Packit 667938
        }
Packit 667938
    }
Packit 667938
    else {	# load V1/V2 libraries 
Packit 667938
	require SNMP_util;
Packit 667938
	import SNMP_util;
Packit 667938
    }
Packit 667938
    
Packit 667938
Packit 667938
    # Enable or disable IPv6
Packit 667938
    if(defined $cfg{enableipv6}) {
Packit 667938
        $cfg{enableipv6} = lc($cfg{enableipv6});
Packit 667938
    } else {
Packit 667938
        $cfg{enableipv6} = 'no';
Packit 667938
    }
Packit 667938
Packit 667938
    # Check we have the necessary libraries for IPv6 support
Packit 667938
    if ($cfg{enableipv6} eq 'yes') {
Packit 667938
        if ( eval {local $SIG{__DIE__};require Socket; require Socket6; require IO::Socket::INET6;}) {
Packit 667938
            import Socket;
Packit 667938
            import Socket6;
Packit 667938
            debug('base', "IPv6 libraries found, IPv6 enabled.");
Packit 667938
        } else {
Packit 667938
            warn "$NOW: WARNING: IPv6 libraries not found, IPv6 disabled.\n";
Packit 667938
            $cfg{enableipv6} =  'no';
Packit 667938
        }
Packit 667938
    }
Packit 667938
Packit 667938
    # Module invocation for sending a copy of the time series data to graphite.
Packit 667938
    if(defined $cfg{sendtographite}) {
Packit 667938
      require Net::Graphite;
Packit 667938
    }
Packit 667938
Packit 667938
    # from our last run we kept some info about
Packit 667938
    # the configuration of our devices around
Packit 667938
    debug('base', "Reading Interface Config cache");
Packit 667938
    $confcachefile =  $opts{"confcache-file"} || $confcachefile;
Packit 667938
    if ( !defined($confcachefile) ) {
Packit 667938
        $confcachefile = $cfgfile;
Packit 667938
        $confcachefile  =~ s/\.[^.\/]+$//;
Packit 667938
        $confcachefile .= ".ok";
Packit 667938
    }
Packit 667938
    my $confcache = readconfcache($confcachefile);
Packit 667938
Packit 667938
    # Check the config and create the target object
Packit 667938
    debug('base', "Checking Config File");
Packit 667938
    my @target;
Packit 667938
    cfgcheck(\@routers, \%cfg, \%rcfg, \@target, \%opts);
Packit 667938
Packit 667938
    # exit here if we only check the config file
Packit 667938
    # in case of an error, cfgcheck() already exited
Packit 667938
    if (defined $opts{check}) {
Packit 667938
        debug('base', "Remove Lock Files");
Packit 667938
        close LOCK; unlink ($templock, $lockfile);
Packit 667938
        debug('base', "Exit after successful config file check");
Packit 667938
        exit 0;
Packit 667938
    }
Packit 667938
Packit 667938
    # postload rrdtool support
Packit 667938
    if ($cfg{logformat} eq 'rrdtool'){
Packit 667938
        debug('base', "Loading RRD support");
Packit 667938
	require 'RRDs.pm';
Packit 667938
    }
Packit 667938
Packit 667938
    # set the locale
Packit 667938
    my $LOC;
Packit 667938
    if ( $cfg{'language'} and defined($lang2tran::LOCALE{"\L$cfg{'language'}\E"})) {
Packit 667938
	debug('base', "Loading Locale for ".$cfg{'language'});
Packit 667938
	$LOC=$lang2tran::LOCALE{"\L$cfg{'language'}\E"};
Packit 667938
    } else {
Packit 667938
	debug('base', "Loading default Locale");
Packit 667938
	$LOC=$lang2tran::LOCALE{'default'};
Packit 667938
    }
Packit 667938
Packit 667938
    # Daemon Code
Packit 667938
    my $last_time=0;
Packit 667938
    my $curent_time;
Packit 667938
    my $sleep_time;
Packit 667938
    if (defined $opts{"daemon"}) { $cfg{'runasdaemon'} = "yes"; }
Packit 667938
    &demonize_me($pidfile,$cfgfile) if defined $cfg{'runasdaemon'}  and $cfg{'runasdaemon'} =~ /y/i  and $MRTG_lib::OS ne 'VMS'
Packit 667938
    	and not (defined $cfg{'nodetach'} and $cfg{'nodetach'} =~ /y/i);
Packit 667938
    # auto restart on die if running as demon
Packit 667938
Packit 667938
    $SIG{__DIE__} = sub {
Packit 667938
        warn $_[0];
Packit 667938
        warn "*** Restarting after 10 seconds in an attempt to recover from the error above\n";
Packit 667938
        sleep 10;
Packit 667938
        exec @STARTARGS;
Packit 667938
    } if $cfg{'runasdaemon'};
Packit 667938
Packit 667938
    debug('base', "Starting main Loop");
Packit 667938
    do {                        # Do this loop once for native mode and forever in daemon mode 
Packit 667938
        my $router;        
Packit 667938
        $NOW = timestamp;   # get the time
Packit 667938
        debug 'time', "loop start ".localtime(time);
Packit 667938
Packit 667938
        #if we run as daemon, we sleep in between collection cycles
Packit 667938
        $sleep_time=  (int($cfg{interval}*60))-(time-$last_time);
Packit 667938
        if ($sleep_time > 0 ) { #If greater than 0 the sleep that amount of time
Packit 667938
	    debug('time', "Sleep time $sleep_time seconds");
Packit 667938
            sleep ($sleep_time);
Packit 667938
        } elsif ($last_time > 0) {
Packit 667938
            warn "$NOW: WARNING: data collection did not complete within interval!\n";
Packit 667938
        }
Packit 667938
        $last_time=time;
Packit 667938
Packit 667938
        # set meta expires if there is an index file
Packit 667938
        # 2000/05/03 Bill McGonigle <bill@zettabyte.net>
Packit 667938
        if (defined $cfg{'writeexpires'}) {
Packit 667938
           my $exp = &expistr($cfg{'interval'});
Packit 667938
           my $fil;
Packit 667938
           $fil = "$cfg{'htmldir'}index.html"  if -e "$cfg{'htmldir'}index.html";
Packit 667938
           $fil = "$cfg{'htmldir'}index.htm"  if -e "$cfg{'htmldir'}index.htm";
Packit 667938
            if (defined $fil) {
Packit 667938
                   open(META, ">$fil.meta");
Packit 667938
                   print META "Expires: $exp\n";
Packit 667938
                   close(META);
Packit 667938
            }
Packit 667938
        }
Packit 667938
Packit 667938
Packit 667938
        # Use SNMP to populate the target object
Packit 667938
	debug('base', "Populate Target object by polling SNMP and".
Packit 667938
	      " external Datasources");
Packit 667938
        debug 'time', "snmp read start ".localtime(time);
Packit 667938
        readtargets($confcache,\@target, \%cfg);
Packit 667938
Packit 667938
        $NOW = timestamp;   # get the time
Packit 667938
        # collect data for each router or pseudo target (`executable`)
Packit 667938
        debug 'time', "target loop start ".localtime(time);
Packit 667938
        foreach $router (@routers) {
Packit 667938
	    debug('base', "Act on Router/Target $router");
Packit 667938
            if (defined $rcfg{'setenv'}{$router}) {
Packit 667938
                my $line = $rcfg{'setenv'}{$router};
Packit 667938
                while ( $line =~ s/([^=]+)=\"([^\"]*)\"\s*// ) # " - unconfuse the highliter
Packit 667938
 		{ 
Packit 667938
		    $ENV{$1}=$2;
Packit 667938
                }
Packit 667938
	    }
Packit 667938
	    my($savetz) = $ENV{'TZ'};
Packit 667938
	    if (defined $rcfg{'timezone'}{$router}) {
Packit 667938
                $ENV{'TZ'} = $rcfg{'timezone'}{$router};
Packit 667938
		if ( $main::OS eq 'UNIX' ){
Packit 667938
			require 'POSIX.pm';
Packit 667938
			POSIX::tzset();
Packit 667938
		}
Packit 667938
            }
Packit 667938
Packit 667938
            my ($inlast, $outlast, $uptime, $name, $time) = 
Packit 667938
              getcurrent(\@target, $router, \%rcfg, \%cfg);
Packit 667938
Packit 667938
            if ( defined($inlast) and defined($outlast)) {
Packit 667938
              $EXITCODE = $EXITCODE | 1;
Packit 667938
            }
Packit 667938
            else {
Packit 667938
              $EXITCODE = $EXITCODE | 2;
Packit 667938
            }
Packit 667938
Packit 667938
	    debug('base', "Get Current values: in:".( defined $inlast ? $inlast : "undef").", out:".
Packit 667938
                                                 ( defined $outlast? $outlast : "undef").", up:".
Packit 667938
                                                 ( defined $uptime ? $uptime : "undef").", name:".
Packit 667938
                                                 ( defined $name ? $name : "undef").", time:".
Packit 667938
                                                 ( defined $time ? $time : "undef"));
Packit 667938
Packit 667938
            #abort, if the router is not responding.
Packit 667938
            if ($cfg{'logformat'} ne 'rrdtool') {
Packit 667938
              # undefined values are ok for rrdtool !
Packit 667938
              #if ( not defined $inlast or not defined $outlast){
Packit 667938
              #  warn "$NOW: WARNING: Skipping Update of $router, inlast is not defined\n"
Packit 667938
              #          unless defined $inlast;
Packit 667938
              #  warn "$NOW: WARNING: Skipping Update of $router, outlast is not defined\n"
Packit 667938
              #          unless defined $outlast;
Packit 667938
              #  next;
Packit 667938
              #}
Packit 667938
Packit 667938
              if (defined $inlast and $inlast < 0) {
Packit 667938
                $inlast += 2**31;
Packit 667938
                # this is likely to be a broken snmp counter ... lets compensate
Packit 667938
              }  
Packit 667938
              if (defined $outlast and $outlast < 0) {
Packit 667938
                $outlast += 2**31;
Packit 667938
                # this is likely to be a broken snmp counter ... lets compensate
Packit 667938
              }  
Packit 667938
            }
Packit 667938
	    
Packit 667938
            my ($maxin, $maxout, $maxpercent, $avin, $avout, $avpercent,$avmxin, $avmxout,
Packit 667938
                $cuin, $cuout, $cupercent);
Packit 667938
	    debug('base', "Create Graphics");
Packit 667938
            if ($rcfg{'options'}{'dorelpercent'}{$router}) {
Packit 667938
                ($maxin, $maxout, $maxpercent, $avin, $avout, $avpercent,
Packit 667938
                 $cuin, $cuout, $cupercent, $avmxin, $avmxout) =
Packit 667938
                  writegraphics($router, \%cfg, \%rcfg, $inlast, $outlast, $time,$LOC, \%opts);
Packit 667938
            } else {
Packit 667938
                ($maxin, $maxout ,$avin, $avout, $cuin, $cuout, $avmxin, $avmxout) =
Packit 667938
                  writegraphics($router, \%cfg, \%rcfg, $inlast, $outlast, $time,$LOC, \%opts);
Packit 667938
            }
Packit 667938
            # skip this update if we did not get anything usefull out of
Packit 667938
            # writegraphics
Packit 667938
            next if not defined $maxin;
Packit 667938
Packit 667938
	    debug('base', "Check for Thresholds");
Packit 667938
            threshcheck(\%cfg,\%rcfg,$cfgfile,$router,$cuin,$cuout);
Packit 667938
Packit 667938
	    if (defined $opts{'log-only'}){
Packit 667938
		debug('base', "Disable Graph and HTML generation");
Packit 667938
	    }
Packit 667938
Packit 667938
	    if ($cfg{logformat} eq 'rateup' and not defined $opts{'log-only'} ){
Packit 667938
		debug('base', "Check for Write HTML Pages");
Packit 667938
		writehtml($router, \%cfg, \%rcfg,
Packit 667938
			  $maxin, $maxout, $maxpercent, $avin, $avout, $avmxin, $avmxout, $avpercent,
Packit 667938
			  $cuin, $cuout, $cupercent, $uptime, $name, $LOC)
Packit 667938
	    }
Packit 667938
Packit 667938
            #
Packit 667938
            clonedirectory($router,\%cfg, \%rcfg);
Packit 667938
            #
Packit 667938
Packit 667938
            #put TZ things back in shape ... 
Packit 667938
            if ($savetz) {
Packit 667938
                $ENV{'TZ'} =  $savetz;
Packit 667938
            } else {
Packit 667938
                delete $ENV{'TZ'};
Packit 667938
            }
Packit 667938
	    if ( $main::OS eq 'UNIX' ){
Packit 667938
		require 'POSIX.pm';
Packit 667938
		POSIX::tzset();
Packit 667938
	    };
Packit 667938
        }
Packit 667938
        # Has the cfg file been modified since we started? if so, reload it.
Packit 667938
        if ( -M $cfgfile < $cfgfile_age and 
Packit 667938
          $cfg{'runasdaemon'} and $cfg{'runasdaemon'} =~ /y/i ) {
Packit 667938
            # reload the configuration
Packit 667938
            $cfgfile_age = -M $cfgfile;
Packit 667938
            debug('base', "Re-reading Config File: $cfgfile");
Packit 667938
            @routers = (); %cfg = (); %rcfg = ();
Packit 667938
            readcfg($cfgfile,\@routers,\%cfg,\%rcfg);
Packit 667938
            cfgcheck(\@routers, \%cfg, \%rcfg, \@target, \%opts);
Packit 667938
        }
Packit 667938
        debug('base', "End of main Loop");
Packit 667938
    } while ($cfg{'runasdaemon'} and $cfg{'runasdaemon'} =~ /y/i ); #In daemon mode run forever
Packit 667938
    debug('base', "Exit main Loop");
Packit 667938
    # OK we are done, remove the lock files ... 
Packit 667938
Packit 667938
    debug('base', "Remove Lock Files");
Packit 667938
    close LOCK; unlink ($templock, $lockfile);
Packit 667938
Packit 667938
    debug('base', "Store Interface Config Cache");
Packit 667938
    delete $$confcache{___updated} if exists $$confcache{___updated}; # make sure everything gets written out not only the updated entries
Packit 667938
    writeconfcache($confcache,$confcachefile);
Packit 667938
Packit 667938
    if ( ! $cfg{'runasdaemon'} or $cfg{'runasdaemon'} !~ /y/i ) {
Packit 667938
      if ( ($EXITCODE & 1) and ($EXITCODE & 2) ) {
Packit 667938
        # At least one target was sucessful
Packit 667938
        exit 91;
Packit 667938
      }
Packit 667938
      elsif ( not ($EXITCODE & 1) and ($EXITCODE & 2) ) {
Packit 667938
        # All targets failed
Packit 667938
        exit 92;
Packit 667938
      }
Packit 667938
    }
Packit 667938
}
Packit 667938
Packit 667938
# ( $inlast, $outlast, $uptime, $name, $time ) =
Packit 667938
#    &getcurrent( $target, $rou, $rcfg, $cfg )
Packit 667938
# Calculate monitored data for device $rou based on information in @$target
Packit 667938
# and referring to configuration data in %$rcfg and %$cfg. In the returned
Packit 667938
# list, $inlast and $outlast are the input and output monitored data values,
Packit 667938
# $uptime is the device uptime, $name is the device name, and $time is the
Packit 667938
# current time when the calculation was performed.
Packit 667938
sub getcurrent {
Packit 667938
	my( $target, $rou, $rcfg, $cfg ) = @_;
Packit 667938
	# Hash indexed by $mode for conveniently saving $inlast and $outlast
Packit 667938
	my %last;
Packit 667938
	# Initialize uptime, device name, and data collection time to empty strings
Packit 667938
	my $uptime = '';
Packit 667938
	my $name = '';
Packit 667938
	my $time = '';
Packit 667938
Packit 667938
	# Calculate input and output monitored data
Packit 667938
	foreach my $mode( qw( _IN_  _OUT_ ) ) {
Packit 667938
		# Initialize monitored data, warning message, and death message
Packit 667938
		# to empty strings
Packit 667938
		my $data;
Packit 667938
		my $warning;
Packit 667938
		my $death;
Packit 667938
		{
Packit 667938
			# Code block used to calculate monitoring data
Packit 667938
			# Localize warning and death exception handlers to capture
Packit 667938
			# error message less any leading and trailing white space
Packit 667938
			local $SIG{ __WARN__ } =
Packit 667938
				sub { $_[0] =~ /^\s*(.+?)\s*$/; $warning = $1; };
Packit 667938
			local $SIG{ __DIE__ } =
Packit 667938
				sub { $_[0] =~ /^\s*(.+?)\s*$/; $death = $1; };
Packit 667938
			# Calculate monitoring data. $rcfg->{ target }{ $rou } contains
Packit 667938
			# a Perl expression for the calculation.
Packit 667938
			$data = eval "$rcfg->{target}{$rou}";
Packit 667938
       		}
Packit 667938
		# Test for various exceptions occurring in the calculation
Packit 667938
		if( $warning ) {
Packit 667938
			warn "$NOW: ERROR: Target[$rou][$mode] '$$rcfg{target}{$rou}' (warn): $warning\n";
Packit 667938
			$data = undef;
Packit 667938
		} elsif( $death ) {
Packit 667938
			warn "$NOW: ERROR: Target[$rou][$mode] '$$rcfg{target}{$rou}' (kill): $death\n";
Packit 667938
			$data = undef;
Packit 667938
		} elsif( $@ ) {
Packit 667938
			warn "$NOW: ERROR: Target[$rou][$mode] '$$rcfg{target}{$rou}' (eval): $@\n";
Packit 667938
			$data = undef;
Packit 667938
		} elsif( not defined $data ) {
Packit 667938
			warn "$NOW: ERROR: Target[$rou][$mode] '$$rcfg{target}{$rou}' did not eval into defined data\n";
Packit 667938
			$data = undef;
Packit 667938
		} elsif( $data and $data !~ /^[-+]?\d+(\.\d*)?([eE][+-]?[0-9]+)?$/ ) {
Packit 667938
			warn "$NOW: ERROR: Target[$rou][$mode] '$$rcfg{target}{$rou}' evaluated to '$data' instead of a number\n";
Packit 667938
			$data = undef;
Packit 667938
		} elsif( length( $data ) > 190 ) {
Packit 667938
			warn "$NOW: ERROR: $mode value: '$data' is way to long ...\n";
Packit 667938
			$data = undef;
Packit 667938
		} else {
Packit 667938
			# At this point data is considered valid. Round to an integer
Packit 667938
			# unless RRDTool is in use and this is a gauge
Packit 667938
                        if (not ( $cfg->{ logformat } eq 'rrdtool'
Packit 667938
                                      and  defined $rcfg->{ options }{ gauge }{ $rou })){
Packit 667938
                            if (ref $data and ref $data eq 'Math::BigFloat') {
Packit 667938
                			$data->ffround( 0 )
Packit 667938
                            } else {
Packit 667938
                                        $data = sprintf "%.0f", $data;
Packit 667938
                            }
Packit 667938
                        }
Packit 667938
			# Remove any leading plus sign
Packit 667938
			$data =~ s/^\+//;
Packit 667938
		}
Packit 667938
		$last{ $mode } = $data;
Packit 667938
	}
Packit 667938
Packit 667938
	# Set $u to the unique index of the @$target array referred to in the
Packit 667938
	# monitored data calculation for the current device. $u will be set to
Packit 667938
	# -1 if that index is not unique.
Packit 667938
	my $u = $rcfg->{ uniqueTarget }{ $rou };
Packit 667938
Packit 667938
	# Get the uptime, device name, and data collection time from the @$target
Packit 667938
	# array if the monitored data calculation refers only to one target.
Packit 667938
	# Otherwise it doesn't make sense to do this.
Packit 667938
	if( $u >= 0 ) {
Packit 667938
		$uptime = $target->[ $u ]{ _UPTIME_ };
Packit 667938
		$name = $target->[ $u ]{ _NAME_ };
Packit 667938
		$time = $target->[ $u ]{ _TIME_ };
Packit 667938
Packit 667938
                if ($time =~ /^([-0-9.]+)$/) {
Packit 667938
                   $time = $1;
Packit 667938
                }
Packit 667938
Packit 667938
	}
Packit 667938
Packit 667938
	# Set the time to the current time if it was not set above
Packit 667938
	$time = time unless $time;
Packit 667938
Packit 667938
	# Cache uptime location for reading name
Packit 667938
	my( $uploc );
Packit 667938
Packit 667938
	# Get the uptime and device name from the alternate location (community@host or
Packit 667938
	# (OID:community@host or OID) that may have been specified with the RouterUptime
Packit 667938
	# target keyword
Packit 667938
	if( defined $rcfg->{ routeruptime }{ $rou } ) {
Packit 667938
		my( $noid, $nloc ) = split( /:/, $rcfg->{ routeruptime }{ $rou }, 2 );
Packit 667938
		# If only location (community@host) was specified then
Packit 667938
		# move the location details into the right place
Packit 667938
		if( $noid =~ /@/ ) {
Packit 667938
			$nloc = $noid;
Packit 667938
			$noid = undef;
Packit 667938
		}
Packit 667938
		# If no OID (community@host) was specified use the hardcoded default
Packit 667938
		if( not $noid ) {
Packit 667938
			$noid = 'sysUptime';
Packit 667938
		}
Packit 667938
		# If no location (community@host) was specified use values from the
Packit 667938
		# unique target referred to in the monitored data calculation
Packit 667938
		if( not $nloc ){
Packit 667938
                        if ($u >= 0) {
Packit 667938
          		    my $comm = $target->[ $u ]{ Community };
Packit 667938
			    my $host = $target->[ $u ]{ Host };
Packit 667938
			    my $opt = $target->[ $u ]{ SnmpOpt };
Packit 667938
			    $nloc = "$comm\@$host$opt";
Packit 667938
		        } else {
Packit 667938
                            die "$NOW: ERROR: You must specify the location part of the RouterUptime oid for non unique targets! ($rou)\n";
Packit 667938
                        }
Packit 667938
                }
Packit 667938
        
Packit 667938
		$uploc = $nloc;
Packit 667938
		# Get the device uptime if $noid(OID) and $nloc (community@host) have been specified
Packit 667938
		# one way or the other
Packit 667938
		debug('base', "Fetching sysUptime and sysName from: $noid:$nloc");
Packit 667938
		( $uptime, $name ) = snmpget( $uploc, $rcfg->{ snmpoptions }{ $rou }, $noid, 'sysName');
Packit 667938
	}
Packit 667938
Packit 667938
	# Get the device name from the alternate location (OID or
Packit 667938
	# OID:community@host) that may have been specified with the RouterName
Packit 667938
	# target keyword
Packit 667938
	if( defined $rcfg->{ routername }{ $rou } ) {
Packit 667938
		my( $noid, $nloc ) = split( /:/, $rcfg->{ routername }{ $rou }, 2 );
Packit 667938
		# If no location (community@host) was specified use values from the
Packit 667938
		# unique target referred to in the monitored data calculation
Packit 667938
		if( $u >= 0 and not $nloc ) {
Packit 667938
			my $comm = $target->[ $u ]{ Community };
Packit 667938
			my $host = $target->[ $u ]{ Host };
Packit 667938
			my $opt = $target->[ $u ]{ SnmpOpt };
Packit 667938
			$nloc = "$comm\@$host$opt";
Packit 667938
		}
Packit 667938
		# Get the location from the RouterUptime keyword if that is defined
Packit 667938
		# and $nloc has not otherwise been specified
Packit 667938
		$nloc = $uploc if $uploc and not $nloc;
Packit 667938
		# Get the device name if $nloc (community@host) has been specified
Packit 667938
		# one way or the other
Packit 667938
		debug('base', "Fetching sysName from: $noid:$nloc");
Packit 667938
		( $name ) = snmpget( $nloc, $$rcfg{snmpoptions}{ $rou }, $noid ) if $nloc;
Packit 667938
	}
Packit 667938
  
Packit 667938
	return ( $last{ _IN_ }, $last{ _OUT_ }, $uptime, $name, $time );
Packit 667938
}
Packit 667938
Packit 667938
sub rateupcheck ($) {
Packit 667938
    my $router = shift;
Packit 667938
    if ($?) {
Packit 667938
        my $value = $?;
Packit 667938
        my $signal =  $? & 127; #ignore the most significant bit 
Packit 667938
                                #as it is always one when it is a returning
Packit 667938
                                #child says dave ...
Packit 667938
        if (($MRTG_lib::OS ne 'UNIX') || ($signal != 127)) {
Packit 667938
            my $exitval = $? >> 8;
Packit 667938
            warn "$NOW: WARNING: rateup died from Signal $signal\n".
Packit 667938
              " with Exit Value $exitval when doing router '$router'\n".
Packit 667938
                " Signal was $signal, Returncode was $exitval\n"
Packit 667938
        }
Packit 667938
    }
Packit 667938
}
Packit 667938
Packit 667938
sub clonedirectory {
Packit 667938
    my($router,$cfg, $rcfg) = @_;
Packit 667938
    require File::Copy;
Packit 667938
    import File::Copy;
Packit 667938
Packit 667938
    return unless ( $$rcfg{'clonedirectory'}{$router} );
Packit 667938
Packit 667938
    my ($clonedstdir, $clonedsttarget ,$srcname, $dstname);
Packit 667938
Packit 667938
    ($clonedstdir, $clonedsttarget ) = split (/,|\s+/, $$rcfg{'clonedirectory'}{$router}) if ( $$rcfg{'clonedirectory'}{$router} =~ /,|\S\s+\S/ );
Packit 667938
Packit 667938
    if ( defined $clonedsttarget ) {
Packit 667938
		$clonedsttarget =~ s/\s+//;
Packit 667938
		$clonedsttarget = lc($clonedsttarget);
Packit 667938
    } else {
Packit 667938
        	$clonedstdir = $$rcfg{'clonedirectory'}{$router};
Packit 667938
    }
Packit 667938
    if ( $$rcfg{'directory'}{$router} ne $clonedstdir) {
Packit 667938
	$clonedstdir =~ s/\s+$//;
Packit 667938
        $clonedstdir .= "/" unless ($clonedstdir =~ /\/$/);
Packit 667938
        my $fullpathsrcdir = "$$cfg{'logdir'}$$rcfg{'directory'}{$router}";
Packit 667938
        my $fullpathdstdir = "$$cfg{'logdir'}$clonedstdir";
Packit 667938
Packit 667938
        die "$NOW: ERROR: Destination dir: $fullpathdstdir not found for cloning process\n" unless ( -e $fullpathdstdir );
Packit 667938
        die "$NOW: ERROR: Destination dir: $fullpathdstdir is not a directory destination for cloning process\n" unless ( -d $fullpathdstdir );
Packit 667938
        die "$NOW: ERROR: Destination dir: $fullpathdstdir is not writeable for cloning process\n" unless ( -w $fullpathdstdir );
Packit 667938
Packit 667938
        if ( defined $clonedsttarget ) {
Packit 667938
        	debug('base', "Clone directory $fullpathsrcdir to $fullpathdstdir " . 
Packit 667938
			       "renaming target $router to $clonedsttarget"); 
Packit 667938
	} else {
Packit 667938
        	debug('base', "Clone directory $fullpathsrcdir to $fullpathdstdir");
Packit 667938
	}
Packit 667938
Packit 667938
        foreach my $srcfile (<$fullpathsrcdir$router\[.-\]*>) {
Packit 667938
                debug('base', "copying $srcfile $fullpathdstdir");
Packit 667938
                copy("$srcfile","$fullpathdstdir") or warn "$NOW: WARNING: Cloning $srcfile to $fullpathdstdir unsuccessful; $!\n";
Packit 667938
                if ($srcfile =~ /\.html/i) {
Packit 667938
                        debug('base', "altering $fullpathdstdir/$router.$$rcfg{'extension'}{$router}");
Packit 667938
                        #
Packit 667938
                        my $dirrel = "../" x ($$rcfg{'clonedirectory'}{$router} =~ tr|/|/|);
Packit 667938
                        #
Packit 667938
                        debug('base', "dirrel $dirrel $clonedstdir");
Packit 667938
                        open(HTML,"$fullpathdstdir/$router.$$rcfg{'extension'}{$router}");
Packit 667938
                        my @CLONEHTML = <HTML>;
Packit 667938
                        close(HTML);
Packit 667938
                        foreach ( @CLONEHTML ) {
Packit 667938
	    			if ( defined $clonedsttarget and /$router/ ) {
Packit 667938
                                       	debug('base', "altering $router to $clonedsttarget in html file");
Packit 667938
					s/$router/$clonedsttarget/i;
Packit 667938
				}
Packit 667938
                                if ( /SRC=/i and /$$rcfg{'directory'}{$router}/ ) {
Packit 667938
                                        debug('base', "altering from $_");
Packit 667938
                                        s|(\.\./)+|$dirrel|;
Packit 667938
                                        s|$$rcfg{'directory'}{$router}|$clonedstdir|;
Packit 667938
                                        debug('base', "altering to $_");
Packit 667938
                                }
Packit 667938
                        }
Packit 667938
                        open(HTML,">$fullpathdstdir/$router.$$rcfg{'extension'}{$router}");
Packit 667938
                        print HTML $_ for ( @CLONEHTML );
Packit 667938
                        close(HTML);
Packit 667938
                }
Packit 667938
	    	if ( defined $clonedsttarget ) {
Packit 667938
			$srcfile =~ /.+\/(.+)?$/;
Packit 667938
			$srcname = $1;
Packit 667938
			$dstname = $srcname;
Packit 667938
			$dstname =~ s/$router/$clonedsttarget/;
Packit 667938
                        debug('base', "Clone renaming $srcname to $dstname at $fullpathdstdir");
Packit 667938
                	rename("$fullpathdstdir/$srcname","$fullpathdstdir/$dstname") or 
Packit 667938
				warn "$NOW: WARNING: Renaming $fullpathdstdir/$srcname to $fullpathdstdir/$dstname unsuccessful; $!\n";
Packit 667938
		}
Packit 667938
        }
Packit 667938
    } else {
Packit 667938
      warn "$NOW: WARNING: Cloning to the same place suspended. ; $!\n";
Packit 667938
    }
Packit 667938
}
Packit 667938
Packit 667938
sub writegraphics {
Packit 667938
    my($router, $cfg, $rcfg, $inlast, $outlast, $time,$LOC, $opts) = @_;
Packit 667938
  
Packit 667938
    my($absmax,$maxv, $maxvi, $maxvo, $i, $period, $res);
Packit 667938
    my(@exec, @mxvls, @metas);
Packit 667938
    my(%maxin, %maxout, %maxpercent, %avin, %avout, %avmxin, %avmxout,  %avpercent, %cuin, %cuout, %cupercent);
Packit 667938
    my($rrdinfo);
Packit 667938
Packit 667938
    @metas = ();
Packit 667938
    $maxvi = $$rcfg{'maxbytes1'}{$router};
Packit 667938
    $maxvo = $$rcfg{'maxbytes2'}{$router};
Packit 667938
    if ($maxvi > $maxvo) {
Packit 667938
        $maxv = $maxvi;
Packit 667938
    } else {
Packit 667938
        $maxv = $maxvo;
Packit 667938
    }
Packit 667938
    $absmax = $$rcfg{'absmax'}{$router};
Packit 667938
    $absmax = $maxv unless defined $absmax;
Packit 667938
    if ($absmax < $maxv) {
Packit 667938
        die "$NOW: ERROR: AbsMax: $absmax is smaller than MaxBytes: $maxv\n";
Packit 667938
    }
Packit 667938
Packit 667938
Packit 667938
    # select whether the datasource gives relative or absolute return values.
Packit 667938
    my $up_abs="u";
Packit 667938
    $up_abs='m' if defined $$rcfg{'options'}{'perminute'}{$router};
Packit 667938
    $up_abs='h' if defined $$rcfg{'options'}{'perhour'}{$router};
Packit 667938
    $up_abs='d' if defined $$rcfg{'options'}{'derive'}{$router};
Packit 667938
    $up_abs='a' if defined $$rcfg{'options'}{'absolute'}{$router};
Packit 667938
    $up_abs='g' if defined $$rcfg{'options'}{'gauge'}{$router};
Packit 667938
Packit 667938
    my $dotrrd = "$$cfg{'logdir'}$$rcfg{'directory'}{$router}$router.rrd";
Packit 667938
    my $dotlog = "$$cfg{'logdir'}$$rcfg{'directory'}{$router}$router.log";
Packit 667938
    my $reallog = $$cfg{logformat} eq 'rrdtool' ? $dotrrd : $dotlog;
Packit 667938
Packit 667938
    if (defined $$cfg{maxage} and -e $reallog and time()-$$cfg{maxage} > (stat($reallog))[9]){
Packit 667938
         warn "$NOW: ERROR: skipping update of $router. As $reallog is older than MaxAge ($$cfg{maxage} s)\n";
Packit 667938
         return undef;
Packit 667938
    }
Packit 667938
Packit 667938
    if ($$cfg{logformat} eq 'rrdtool') {
Packit 667938
        debug('base',"start RRDtool section");
Packit 667938
        # make sure we got some sane default here
Packit 667938
        my %dstype = qw/u COUNTER a ABSOLUTE g GAUGE h COUNTER m COUNTER d DERIVE/;
Packit 667938
        $up_abs = $dstype{$up_abs};
Packit 667938
        # update the database.
Packit 667938
Packit 667938
        # set minimum/maximum values. use 'U' if we cannot get good values
Packit 667938
        # the lower bound is hardcoded to 0
Packit 667938
        my $absi = $maxvi;
Packit 667938
        my $abso = $maxvo;
Packit 667938
        $absi = $abso = $$rcfg{'absmax'}{$router}
Packit 667938
            if defined $$rcfg{'absmax'}{$router};
Packit 667938
        debug('base',"maxi:$absi, maxo:$abso");
Packit 667938
        $absi = 'U' if $absi == 0;
Packit 667938
        $abso = 'U' if $abso == 0;
Packit 667938
        # check to see if we already have an RRD file or have to create it
Packit 667938
        # maybe we can convert an .log file to the new rrd format
Packit 667938
        if( $RRDs::VERSION >= 1.4 and $$cfg{rrdcached} and $$cfg{rrdcached} !~ /^unix:/ ) {
Packit 667938
             # rrdcached in network mode.  No log conversion possible.
Packit 667938
             # In this mode, we cannot use absolute paths.  So, we strip logdir from the name.
Packit 667938
             $dotrrd = "$$rcfg{'directory'}{$router}$router.rrd";
Packit 667938
             if( $RRDs::VERSION < 1.49 ) {
Packit 667938
               # This version of RRD doesnt support info, create and tune
Packit 667938
               debug('base',"Unable to verify RRD file with this version of rrdcached");
Packit 667938
               if( !$main::verified_rrd{$dotrrd} ) {
Packit 667938
                 warn "WARN: Unable to verify $dotrrd with this version of RRDTool\n";
Packit 667938
                 $main::verified_rrd{$dotrrd} = 1;
Packit 667938
               }
Packit 667938
             } elsif( !$main::verified_rrd{$dotrrd} ) {
Packit 667938
               # Test to see if it exists
Packit 667938
               debug('base',"Attempting to verify RRD file via rrdcached");
Packit 667938
               $rrdinfo = RRDs::info($dotrrd,'--daemon',$$cfg{rrdcached},'--noflush');
Packit 667938
               if(!$rrdinfo) { # doesnt exist, or cannot be accessed
Packit 667938
                  my $e = RRDs::error();
Packit 667938
                  warn "$NOW: Cannot access $dotrrd; will attempt to (re)create it: $e\n" if $e;
Packit 667938
  
Packit 667938
                  # don't fail if interval is not set
Packit 667938
                  my $interval = $$cfg{interval};
Packit 667938
                  my $minhb = int($$cfg{interval} * 60)*2;
Packit 667938
                  $minhb = 600 if ($minhb <600); 
Packit 667938
                  my $rows = $$rcfg{'rrdrowcount'}{$router} || int( 4000 / $interval);
Packit 667938
                  my $rows30m = $$rcfg{'rrdrowcount30m'}{$router} || 800;
Packit 667938
                  my $rows2h = $$rcfg{'rrdrowcount2h'}{$router} || 800;
Packit 667938
                  my $rows1d = $$rcfg{'rrdrowcount1d'}{$router} || 800;
Packit 667938
                  my @args = ($dotrrd, '-b', $time-10, '-s', int($interval * 60),
Packit 667938
                               "DS:ds0:$up_abs:$minhb:0:$absi",
Packit 667938
                               "DS:ds1:$up_abs:$minhb:0:$abso",
Packit 667938
                               "RRA:AVERAGE:0.5:1:$rows",
Packit 667938
                               ( $interval < 30  ? ("RRA:AVERAGE:0.5:".int(30/$interval).":".$rows30m):()),
Packit 667938
                                 "RRA:AVERAGE:0.5:".int(120/$interval).":".$rows2h,
Packit 667938
                               "RRA:AVERAGE:0.5:".int(1440/$interval).":".$rows1d,
Packit 667938
                               "RRA:MAX:0.5:1:$rows",
Packit 667938
                               ( $interval < 30  ? ("RRA:MAX:0.5:".int(30/$interval).":".$rows30m):()),
Packit 667938
                               "RRA:MAX:0.5:".int(120/$interval).":".$rows2h,
Packit 667938
                               "RRA:MAX:0.5:".int(1440/$interval).":".$rows1d);
Packit 667938
                  # do we have holt winters rras defined here ?
Packit 667938
                  if (defined $$rcfg{'rrdhwrras'} and defined $$rcfg{'rrdhwrras'}{$router}){
Packit 667938
                      push @args, split(/\s+/, $$rcfg{'rrdhwrras'}{$router});
Packit 667938
                  }
Packit 667938
                  push @args,"--daemon", $$cfg{rrdcached};
Packit 667938
  
Packit 667938
                  debug('base',"create $dotrrd via rrdcached");
Packit 667938
                  debug('log', "RRDs::create(".join(',',@args).")");
Packit 667938
                  RRDs::create(@args);
Packit 667938
                  $e = RRDs::error();
Packit 667938
                  die "$NOW: ERROR: Cannot create RRD ".join(',',@args)."- $e\n" if $e;
Packit 667938
              } else {
Packit 667938
                  # Does the RRD file need to be tuned?
Packit 667938
                  if(
Packit 667938
                      ($rrdinfo->{"ds[ds0].max"} != $absi) 
Packit 667938
                      ||($rrdinfo->{"ds[ds1].max"} != $abso) 
Packit 667938
                      ||($rrdinfo->{"ds[ds0].type"} ne $up_abs) 
Packit 667938
                      ||($rrdinfo->{"ds[ds1].type"} ne $up_abs) 
Packit 667938
                  ) {
Packit 667938
                      debug('base',"RRD file needs to be tuned");
Packit 667938
                      warn "$NOW: RRDFile $dotrrd needs to be tuned but cannot do this remotely.\n";
Packit 667938
                  }
Packit 667938
              }
Packit 667938
              $main::verified_rrd{$dotrrd} = 1;
Packit 667938
            } else {
Packit 667938
               debug('base',"No need to verify this file again");
Packit 667938
            }
Packit 667938
        } elsif (-e $dotlog and not -e $dotrrd) {
Packit 667938
             debug('base',"converting $dotlog to RRD format");
Packit 667938
             if(defined $RRDs::VERSION and $RRDs::VERSION < 1.000271){
Packit 667938
                die "$NOW: ERROR: RRDtool version 1.0.27 or later required to perform log2rrd conversion\n";
Packit 667938
             }
Packit 667938
             log2rrd($router,$cfg,$rcfg);
Packit 667938
        } elsif (! -e $dotrrd) {
Packit 667938
            #nope it seems we have to create a new one
Packit 667938
            debug('base',"create $dotrrd");
Packit 667938
            # create the rrd if it doesn't exist
Packit 667938
            # don't fail if interval is not set
Packit 667938
            my $interval = $$cfg{interval};
Packit 667938
            my $minhb = int($$cfg{interval} * 60)*2;
Packit 667938
            $minhb = 600 if ($minhb <600); 
Packit 667938
            my $rows = $$rcfg{'rrdrowcount'}{$router} || int( 4000 / $interval);
Packit 667938
            my $rows30m = $$rcfg{'rrdrowcount30m'}{$router} || 800;
Packit 667938
            my $rows2h = $$rcfg{'rrdrowcount2h'}{$router} || 800;
Packit 667938
            my $rows1d = $$rcfg{'rrdrowcount1d'}{$router} || 800;
Packit 667938
            my @args = ($dotrrd, '-b', $time-10, '-s', int($interval * 60),
Packit 667938
                         "DS:ds0:$up_abs:$minhb:0:$absi",
Packit 667938
                         "DS:ds1:$up_abs:$minhb:0:$abso",
Packit 667938
                         "RRA:AVERAGE:0.5:1:$rows",
Packit 667938
                         ( $interval < 30  ? ("RRA:AVERAGE:0.5:".int(30/$interval).":".$rows30m):()),
Packit 667938
                         "RRA:AVERAGE:0.5:".int(120/$interval).":".$rows2h,
Packit 667938
                         "RRA:AVERAGE:0.5:".int(1440/$interval).":".$rows1d,
Packit 667938
                         "RRA:MAX:0.5:1:$rows",
Packit 667938
                         ( $interval < 30  ? ("RRA:MAX:0.5:".int(30/$interval).":".$rows30m):()),
Packit 667938
                         "RRA:MAX:0.5:".int(120/$interval).":".$rows2h,
Packit 667938
                         "RRA:MAX:0.5:".int(1440/$interval).":".$rows1d);
Packit 667938
            # do we have holt winters rras defined here ?
Packit 667938
            if (defined $$rcfg{'rrdhwrras'} and defined $$rcfg{'rrdhwrras'}{$router}){
Packit 667938
                push @args, split(/\s+/, $$rcfg{'rrdhwrras'}{$router});
Packit 667938
            }
Packit 667938
Packit 667938
            debug('log', "RRDs::create(".join(',',@args).")");
Packit 667938
            RRDs::create(@args);
Packit 667938
            my $e = RRDs::error();
Packit 667938
            die "$NOW: ERROR: Cannot create RRD ".join(',',@args)."- $e\n" if $e;
Packit 667938
        } elsif ( -M $dotrrd > 0 ) {
Packit 667938
            # update the minimum/maximum according to maxbytes/absmax
Packit 667938
            # and (re)set the data-source-type to reflect cfg changes
Packit 667938
            # cost: 1 read/write cycle, but update will reuse the buffered data
Packit 667938
            # in daemon mode this will only happen in the first round
Packit 667938
            my @args = ($dotrrd, '-a', "ds0:$absi", '-a', "ds1:$abso",
Packit 667938
                       '-d', "ds0:$up_abs", '-d', "ds1:$up_abs");
Packit 667938
            debug('log', "RRDs::tune(@args)");
Packit 667938
            my $start = gettimeofday();
Packit 667938
            RRDs::tune(@args);
Packit 667938
	    debug('prof',sprintf("RRDs::tune $dotrrd - %.3fs",gettimeofday()-$start));
Packit 667938
            my $e = RRDs::error();
Packit 667938
            warn "$NOW: ERROR: Cannot tune logfile: $e\n" if $e;
Packit 667938
        }
Packit 667938
        # update the rrd
Packit 667938
        $inlast  = 'U' unless defined $inlast  and $inlast  =~ /\S/ and $inlast  ne '##UNDEF##';
Packit 667938
        $outlast = 'U' unless defined $outlast and $outlast =~ /\S/ and $outlast ne '##UNDEF##';
Packit 667938
        debug('log', "RRDs::update($dotrrd, '$time:$inlast:$outlast')");
Packit 667938
        my $start = gettimeofday();
Packit 667938
	my $rrddata = 0;
Packit 667938
	if ( $RRDs::VERSION >= 1.4 and $$cfg{rrdcached} ){
Packit 667938
	    RRDs::update($dotrrd, '--daemon', $$cfg{rrdcached}, "$time:$inlast:$outlast");
Packit 667938
            debug('prof',sprintf("RRDs::update $dotrrd (rrdcached) - %.3fs",gettimeofday()-$start));
Packit 667938
            $rrddata = \{ dummy => "" };
Packit 667938
	} elsif ( $RRDs::VERSION >= 1.2 ){
Packit 667938
	    $rrddata=RRDs::updatev($dotrrd, "$time:$inlast:$outlast");
Packit 667938
            debug('prof',sprintf("RRDs::updatev $dotrrd - %.3fs",gettimeofday()-$start));
Packit 667938
        } else {
Packit 667938
            RRDs::update($dotrrd, "$time:$inlast:$outlast");
Packit 667938
        debug('prof',sprintf("RRDs::update $dotrrd - %.3fs",gettimeofday()-$start));
Packit 667938
        }
Packit 667938
        my $e = RRDs::error(); 
Packit 667938
        warn "$NOW: ERROR: Cannot update $dotrrd with '$time:$inlast:$outlast' $e\n" if ($e);
Packit 667938
Packit 667938
Packit 667938
        # Send a copy of the time series data to graphite
Packit 667938
        if(defined $$cfg{sendtographite}) {
Packit 667938
          my @a = split ",",$$cfg{sendtographite};
Packit 667938
          if (not $graphiteObj) { 
Packit 667938
            $graphiteObj = Net::Graphite->new(
Packit 667938
            host                  => $a[0],
Packit 667938
            port                  => $a[1],
Packit 667938
            trace                 => 0,
Packit 667938
            proto                 => "tcp",
Packit 667938
            timeout               => 1,
Packit 667938
            fire_and_forget       => 1,
Packit 667938
            return_connect_error  => 0
Packit 667938
            );
Packit 667938
            if($graphiteObj->connect) {
Packit 667938
              debug('log',"successfully opened graphite socket ($graphiteObj)\n");
Packit 667938
            } else {
Packit 667938
              debug('log',"graphite connect error: $!\n");
Packit 667938
            }
Packit 667938
          }
Packit 667938
Packit 667938
	  # make a copy of the router name for use in the graphite namespace
Packit 667938
          my $graphiterouter = $router;
Packit 667938
          # periods are delimiters in the graphite namespace so change them to underscores
Packit 667938
          $graphiterouter =~ s/_/\./g;
Packit 667938
	  # commas are not allowed
Packit 667938
          $graphiterouter =~ s/,//g; #remove commas
Packit 667938
          #set up MRTG's 'in' var naming for graphite
Packit 667938
          my $graphitein;
Packit 667938
          if ($$rcfg{'legendi'}{$router}) {
Packit 667938
            $graphitein = $$rcfg{'legendi'}{$router};
Packit 667938
	    # if the 'in' var contains an underscore, change to a period so graphite will delimit on it
Packit 667938
            $graphitein =~ s/_/\./g;
Packit 667938
          } else {
Packit 667938
	    # if legendi is not specified, just use 'in'
Packit 667938
            $graphitein = "in";
Packit 667938
          }
Packit 667938
Packit 667938
          #set up MRTG's 'out' var naming for graphite
Packit 667938
          my $graphiteout;
Packit 667938
          if ($$rcfg{'legendo'}{$router}) {
Packit 667938
            $graphiteout = $$rcfg{'legendo'}{$router};
Packit 667938
	    # if the 'out' var contains an underscore, change to a period so graphite will delimit on it
Packit 667938
            $graphiteout =~ s/_/\./g;
Packit 667938
          } else {
Packit 667938
	    # if legendo is not specified, just use 'out'
Packit 667938
            $graphiteout = "out";
Packit 667938
          }
Packit 667938
Packit 667938
          my $graphitensprefix="m2g";
Packit 667938
Packit 667938
          # verify that the 'in' value is numeric (ints, floats, +, -) , and send to graphite
Packit 667938
          if($inlast =~ /^[+-]?([0-9]*[.])?[0-9]+$/) {
Packit 667938
            # send the 'in' var data to graphite, and log it appropriately
Packit 667938
            debug('log', "graphite->send($graphitensprefix.$graphiterouter.$graphitein,$inlast,$time)\n");
Packit 667938
            $graphiteObj->send(
Packit 667938
              path => "$graphitensprefix.$graphiterouter.$graphitein",
Packit 667938
              value => "$inlast",
Packit 667938
              time => $time,
Packit 667938
            );
Packit 667938
          } else {
Packit 667938
            debug('log', "WARNING - skipped graphite->send($graphitensprefix.$graphiterouter.$graphitein,$inlast,$time) because value ($inlast) is non-numeric\n");
Packit 667938
          }
Packit 667938
Packit 667938
          # verify that the 'out' value is numeric (ints, floats, +, -) , and send to graphite
Packit 667938
          if($outlast =~ /^[+-]?([0-9]*[.])?[0-9]+$/) { 
Packit 667938
            # send the 'out' var data to graphite, and log it appropriately
Packit 667938
            debug('log', "graphite->send($graphitensprefix.$graphiterouter.$graphiteout,$outlast,$time)\n");
Packit 667938
            $graphiteObj->send(
Packit 667938
              path => "$graphitensprefix.$graphiterouter.$graphiteout",
Packit 667938
              value => "$outlast",
Packit 667938
              time => $time,
Packit 667938
            );
Packit 667938
          } else {
Packit 667938
            debug('log', "WARNING - skipped graphite->send($graphitensprefix.$graphiterouter.$graphiteout,$outlast,$time) because value ($outlast) is non-numeric\n");
Packit 667938
          }
Packit 667938
        }
Packit 667938
        # done sending to graphite for this iteration
Packit 667938
Packit 667938
Packit 667938
Packit 667938
	if ( $RRDs::VERSION < 1.2 ){
Packit 667938
             # get the rrdtool-processed values back from rrdtool
Packit 667938
             # for the threshold checks (we cannot use the fetched data)
Packit 667938
	     $start = gettimeofday();
Packit 667938
             my $info =  RRDs::info($dotrrd);
Packit 667938
	     debug('prof',sprintf("RRDs::info $dotrrd - %.3fs",gettimeofday()-$start));
Packit 667938
	     my $lasttime =  $info->{last_update} - $info->{last_update} % $info->{step};        
Packit 667938
             debug('log', "RRDs::info($dotrrd)");
Packit 667938
             $e = RRDs::error(); 
Packit 667938
             warn "$NOW: ERROR: Cannot 'info' $dotrrd: $e\n" if ($e);
Packit 667938
             $start = gettimeofday();
Packit 667938
             my $fetch = (RRDs::fetch($dotrrd,'AVERAGE','-s',$lasttime-1,'-e',$lasttime))[3];
Packit 667938
             debug('prof',sprintf("RRDs::fetch $dotrrd - %.3fs",gettimeofday()-$start));
Packit 667938
             $e = RRDs::error(); 
Packit 667938
             warn "$NOW: ERROR: Cannot 'fetch' $dotrrd: $e\n" if ($e);
Packit 667938
             debug('log', "RRDs::fetch($dotrrd,'AVERAGE','-s',$lasttime,'-e',$lasttime)");        
Packit 667938
             $cuin{d}{$router} = $fetch->[0][0];
Packit 667938
             $cuout{d}{$router} = $fetch->[0][1];
Packit 667938
	} elsif ( $RRDs::VERSION >= 1.4 and $$cfg{rrdcached} ){
Packit 667938
             # Cannot check thresholds
Packit 667938
        } elsif($rrddata) {
Packit 667938
             my $utime = $time - ($time % int($cfg->{interval}*60));
Packit 667938
	     $cuin{d}{$router} = $rrddata->{"[$utime]RRA[AVERAGE][1]DS[ds0]"};
Packit 667938
	     $cuout{d}{$router} = $rrddata->{"[$utime]RRA[AVERAGE][1]DS[ds1]"};
Packit 667938
	     $cuin{d_hwfail}{$router} = $rrddata->{"[$utime]RRA[FAILURES][1]DS[ds0]"};
Packit 667938
	     $cuout{d_hwfail}{$router} = $rrddata->{"[$utime]RRA[FAILURES][1]DS[ds1]"};
Packit 667938
        }
Packit 667938
        my $in = defined $cuin{d}{$router} ?  $cuin{d}{$router} : "???" ;
Packit 667938
        my $out = defined  $cuout{d}{$router} ? $cuout{d}{$router} : "???" ;
Packit 667938
        debug('log', " got: $in/$out");
Packit 667938
        # the html pages and the graphics are created at "call time" so that's it!
Packit 667938
        # (the returned hashes are empty, it's just to minimize the changes to mrtg)
Packit 667938
        if ($$rcfg{'options'}{'dorelpercent'}{$router}) {  
Packit 667938
            return (\%maxin, \%maxout, \%maxpercent, \%avin, \%avout, \%avpercent, \%cuin, \%cuout, \%cupercent,  \%avmxin, \%avmxout);
Packit 667938
        }
Packit 667938
        return (\%maxin, \%maxout, \%avin, \%avout, \%cuin, \%cuout, \%avmxin, \%avmxout );
Packit 667938
Packit 667938
    }                 
Packit 667938
    ########## rrdtool users have left here ###############
Packit 667938
Packit 667938
    ((($MRTG_lib::OS eq 'NT' or $MRTG_lib::OS eq 'OS2') and (-e "${FindBin::Bin}${MRTG_lib::SL}rateup.exe")) or
Packit 667938
     (($MRTG_lib::OS eq 'NW') and (-e "SYS:/Mrtg/bin/rateup.nlm")) or
Packit 667938
     (-x "${FindBin::Bin}${MRTG_lib::SL}rateup")) or 
Packit 667938
       die "$NOW: ERROR: Can't Execute '${FindBin::Bin}${MRTG_lib::SL}rateup'\n";
Packit 667938
Packit 667938
    # rateup does not know about undef so we make inlast and outlast ready for rateup
Packit 667938
    #warn "$NOW: ERROR: inlast is undefined. Skipping $router\n" unless defined $inlast;
Packit 667938
    #warn "$NOW: ERROR: outlast is undefined. Skipping $router\n" unless defined $outlast;
Packit 667938
    #return undef unless defined $inlast and defined $outlast;
Packit 667938
Packit 667938
Packit 667938
    # set values to -1 to tell rateup about unknown values    
Packit 667938
    $inlast = -1 unless defined $inlast;
Packit 667938
    $outlast = -1 unless defined $outlast;
Packit 667938
    
Packit 667938
    # untaint in and out
Packit 667938
    if ($inlast =~ /^([-0-9.]+)$/) {
Packit 667938
        $inlast = $1;
Packit 667938
    }
Packit 667938
    if ($outlast =~ /^([-0-9.]+)$/) {
Packit 667938
        $outlast = $1;
Packit 667938
    }
Packit 667938
Packit 667938
    if ($$rcfg{'options'}{'dorelpercent'}{$router}) {
Packit 667938
        @exec = ("${FindBin::Bin}${MRTG_lib::SL}rateup", 
Packit 667938
                 "$$cfg{'logdir'}$$rcfg{'directory'}{$router}","$router",
Packit 667938
                 $time, $$rcfg{'options'}{'unknaszero'}{$router} ? '-z':'-Z',
Packit 667938
                 "$up_abs"."p", $inlast, $outlast, $absmax,
Packit 667938
                 "C", $$rcfg{'rgb1'}{$router},$$rcfg{'rgb2'}{$router},
Packit 667938
                 $$rcfg{'rgb3'}{$router},$$rcfg{'rgb4'}{$router},
Packit 667938
                 $$rcfg{'rgb5'}{$router});
Packit 667938
    } else { 
Packit 667938
Packit 667938
        @exec = ("${FindBin::Bin}${MRTG_lib::SL}rateup", 
Packit 667938
                 "$$cfg{'logdir'}$$rcfg{'directory'}{$router}","$router",
Packit 667938
                 $time, $$rcfg{'options'}{'unknaszero'}{$router} ? '-z':'-Z',
Packit 667938
                 "$up_abs", $inlast, $outlast, $absmax,
Packit 667938
                 "c", $$rcfg{'rgb1'}{$router},$$rcfg{'rgb2'}{$router},
Packit 667938
                 $$rcfg{'rgb3'}{$router},$$rcfg{'rgb4'}{$router});
Packit 667938
    }
Packit 667938
Packit 667938
    # If this list grows anymore would it be more efficient to have an
Packit 667938
    # array to look up the command line option to send to rateup rather
Packit 667938
    # than have a long list to check?
Packit 667938
    push (@exec, '-t') if defined $$rcfg{'options'}{'transparent'}{$router};
Packit 667938
    push (@exec, '-0') if defined $$rcfg{'options'}{'withzeroes'}{$router};
Packit 667938
    push (@exec, '-b') if defined $$rcfg{'options'}{'noborder'}{$router};
Packit 667938
    push (@exec, '-a') if defined $$rcfg{'options'}{'noarrow'}{$router};
Packit 667938
    push (@exec, '-i') if defined $$rcfg{'options'}{'noi'}{$router};
Packit 667938
    push (@exec, '-o') if defined $$rcfg{'options'}{'noo'}{$router};
Packit 667938
    push (@exec, '-l') if defined $$rcfg{'options'}{'logscale'}{$router};
Packit 667938
    push (@exec, '-x') if defined $$rcfg{'options'}{'expscale'}{$router};
Packit 667938
    push (@exec, '-m') if defined $$rcfg{'options'}{'secondmean'}{$router};
Packit 667938
    push (@exec, '-p') if defined $$rcfg{'options'}{'printrouter'}{$router};
Packit 667938
Packit 667938
    my $maxx = $$rcfg{'xsize'}{$router}; 
Packit 667938
    my $maxy = $$rcfg{'ysize'}{$router};
Packit 667938
    my $xscale = $$rcfg{'xscale'}{$router}; 
Packit 667938
    my $yscale = $$rcfg{'yscale'}{$router}; 
Packit 667938
    my $growright = 0+($$rcfg{'options'}{'growright'}{$router} or 0);
Packit 667938
    my $bits = 0+($$rcfg{'options'}{'bits'}{$router} or 0);
Packit 667938
    my $integer = 0+($$rcfg{'options'}{'integer'}{$router} or 0);
Packit 667938
    my $step = 5*60; 
Packit 667938
    my $rop;
Packit 667938
    my $ytics = $$rcfg{'ytics'}{$router};
Packit 667938
    my $yticsf= $$rcfg{'yticsfactor'}{$router};
Packit 667938
    my $timestrfmt = $$rcfg{'timestrfmt'}{$router};
Packit 667938
    my $timestrpos = ${MRTG_lib::timestrpospattern}{uc $$rcfg{'timestrpos'}{$router}};
Packit 667938
Packit 667938
    if (not defined $$rcfg{'ylegend'}{$router}){
Packit 667938
	if ($bits){
Packit 667938
	    $$rcfg{'ylegend'}{$router} = &$LOC("Bits per minute")
Packit 667938
		if defined $$rcfg{'options'}{'perminute'}{$router};
Packit 667938
	    $$rcfg{'ylegend'}{$router} = &$LOC("Bits per hour")	    
Packit 667938
		if defined $$rcfg{'options'}{'perhour'}{$router};
Packit 667938
	} else {
Packit 667938
	    $$rcfg{'ylegend'}{$router} = &$LOC("Bytes per minute")
Packit 667938
		if defined $$rcfg{'options'}{'perminute'}{$router};
Packit 667938
	    $$rcfg{'ylegend'}{$router} = &$LOC("Bytes per hour")	    
Packit 667938
		if defined $$rcfg{'options'}{'perhour'}{$router};
Packit 667938
	}
Packit 667938
    }
Packit 667938
	
Packit 667938
    if ($$rcfg{'ylegend'}{$router}) {
Packit 667938
        push (@exec, "l", "[$$rcfg{'ylegend'}{$router}]");
Packit 667938
    }
Packit 667938
    my $sign = ($$rcfg{'unscaled'}{$router} and $$rcfg{'unscaled'}{$router} =~ /d/) ? 1 : -1;
Packit 667938
Packit 667938
    if ($$rcfg{'pngtitle'}{$router}) {
Packit 667938
        push (@exec, "T", "[$$rcfg{'pngtitle'}{$router}]");
Packit 667938
    }
Packit 667938
  
Packit 667938
    if ($$rcfg{'timezone'}{$router}) {
Packit 667938
        push (@exec, "Z", "$$rcfg{'timezone'}{$router}");
Packit 667938
    }
Packit 667938
  
Packit 667938
    if ($$rcfg{'kilo'}{$router}) {
Packit 667938
        push (@exec, "k", $$rcfg{'kilo'}{$router});
Packit 667938
    }
Packit 667938
    if ($$rcfg{'kmg'}{$router}) { 
Packit 667938
        push (@exec, "K", $$rcfg{'kmg'}{$router});
Packit 667938
    }
Packit 667938
    if ($$rcfg{'weekformat'}{$router}) {
Packit 667938
        push (@exec, "W", $$rcfg{'weekformat'}{$router});
Packit 667938
    }
Packit 667938
    my $SAGE = (time - $main::STARTTIME) / 3600 / 24; # current script age 
Packit 667938
    if (not defined $$opts{'log-only'}){
Packit 667938
      if (not defined $$rcfg{'suppress'}{$router} or $$rcfg{'suppress'}{$router} !~ /d/) {
Packit 667938
        # VMS: should work for both now
Packit 667938
        push (@exec, "i", "$$cfg{'imagedir'}$$rcfg{'directory'}{$router}${router}-day.${main::GRAPHFMT}",
Packit 667938
              $sign*$maxvi, $sign*$maxvo, $maxx, $maxy, ,$xscale, $yscale, $growright, $step, $bits, $ytics, $yticsf, $timestrfmt, $timestrpos);
Packit 667938
        @mxvls = ("d");
Packit 667938
        push (@metas, "$$cfg{'imagedir'}$$rcfg{'directory'}{$router}${router}-day.${main::GRAPHFMT}",
Packit 667938
              $$cfg{'interval'});
Packit 667938
       }
Packit 667938
  
Packit 667938
Packit 667938
    if (((not -e "$$cfg{'imagedir'}$$rcfg{'directory'}{$router}${router}-week.${main::GRAPHFMT}") or
Packit 667938
         ((-M "$$cfg{'imagedir'}$$rcfg{'directory'}{$router}${router}-week.${main::GRAPHFMT}") + $SAGE  >= 0.5/24)) and
Packit 667938
        (not defined $$rcfg{'suppress'}{$router}  or $$rcfg{'suppress'}{$router} !~/w/)
Packit 667938
       ) {
Packit 667938
        $step=30*60;
Packit 667938
        $sign = (defined $$rcfg{'unscaled'}{$router}  and $$rcfg{'unscaled'}{$router} =~ /w/) ? 1 : -1;
Packit 667938
        push (@mxvls , "w");
Packit 667938
        $rop =(defined $$rcfg{'withpeak'}{$router}  and $$rcfg{'withpeak'}{$router} =~ /w/) ? "p" : "i"; 
Packit 667938
        push (@exec, $rop ,"$$cfg{'imagedir'}$$rcfg{'directory'}{$router}${router}-week.${main::GRAPHFMT}",
Packit 667938
              $sign*$maxvi, $sign*$maxvo,  $maxx, $maxy, $xscale, $yscale, $growright, $step, $bits, $ytics, $yticsf, $timestrfmt, $timestrpos);
Packit 667938
        push (@metas, "$$cfg{'imagedir'}$$rcfg{'directory'}{$router}${router}-week.${main::GRAPHFMT}", 30);
Packit 667938
    }
Packit 667938
  
Packit 667938
Packit 667938
    if (((not -e "$$cfg{'imagedir'}$$rcfg{'directory'}{$router}${router}-month.${main::GRAPHFMT}") or
Packit 667938
         (( -M "$$cfg{'imagedir'}$$rcfg{'directory'}{$router}${router}-month.${main::GRAPHFMT}") + $SAGE >= 2/24))  and
Packit 667938
        (not defined  $$rcfg{'suppress'}{$router} or $$rcfg{'suppress'}{$router} !~ /m/)) {
Packit 667938
        $step=2*60*60;
Packit 667938
        $sign = (defined $$rcfg{'unscaled'}{$router} and $$rcfg{'unscaled'}{$router} =~ /m/) ? 1 : -1;
Packit 667938
        push (@mxvls , "m");
Packit 667938
        $rop =(defined $$rcfg{'withpeak'}{$router} and $$rcfg{'withpeak'}{$router} =~ /m/) ? "p" : "i"; 
Packit 667938
        push (@exec, $rop ,"$$cfg{'imagedir'}$$rcfg{'directory'}{$router}${router}-month.${main::GRAPHFMT}",
Packit 667938
              $sign*$maxvi, $sign*$maxvo, $maxx, $maxy, $xscale, $yscale, $growright, $step, $bits, $ytics, $yticsf, $timestrfmt, $timestrpos);
Packit 667938
        push (@metas, "$$cfg{'imagedir'}$$rcfg{'directory'}{$router}${router}-month.${main::GRAPHFMT}", 120);
Packit 667938
    }
Packit 667938
  
Packit 667938
    if (((not -e "$$cfg{'imagedir'}$$rcfg{'directory'}{$router}${router}-year.${main::GRAPHFMT}") or
Packit 667938
         (( -M "$$cfg{'imagedir'}$$rcfg{'directory'}{$router}${router}-year.${main::GRAPHFMT}") + $SAGE  >= 1)) and
Packit 667938
        (not defined $$rcfg{'suppress'}{$router} or $$rcfg{'suppress'}{$router} !~/y/)) {
Packit 667938
        $step=24*60*60;
Packit 667938
        $sign = (defined $$rcfg{'unscaled'}{$router}  and $$rcfg{'unscaled'}{$router} =~ /y/) ? 1 : -1;
Packit 667938
        push (@mxvls , "y");
Packit 667938
        $rop =(defined $$rcfg{'withpeak'}{$router}  and $$rcfg{'withpeak'}{$router} =~ /y/) ? "p" : "i"; 
Packit 667938
        push (@exec, $rop, "$$cfg{'imagedir'}$$rcfg{'directory'}{$router}${router}-year.${main::GRAPHFMT}",
Packit 667938
              $sign*$maxvi, $sign*$maxvo, $maxx, $maxy, $xscale, $yscale, $growright, $step, $bits, $ytics, $yticsf, $timestrfmt, $timestrpos);
Packit 667938
        push (@metas, "$$cfg{'imagedir'}$$rcfg{'directory'}{$router}${router}-year.${main::GRAPHFMT}", 1440);
Packit 667938
    }
Packit 667938
  }
Packit 667938
Packit 667938
    # VMS: this might work now ... or does VMS NOT know about pipes?
Packit 667938
    # NT doesn't have fork() so an open(xxx,"-|") won't work
Packit 667938
    # OS2 fork() have bug with socket handles. In RunAsDaemon mode it fail
Packit 667938
    # after first loop (with "socket operation on non socket" message.
Packit 667938
Packit 667938
    if ($MRTG_lib::OS eq 'VMS' or $MRTG_lib::OS eq 'NT' or $MRTG_lib::OS eq 'OS2'){
Packit 667938
        map { s/"/\\"/; $_ = '"'.$_.'"' if /\s/ } @exec;
Packit 667938
        open (RATEUP, join (" ", @exec)."|") or
Packit 667938
           do {
Packit 667938
                warn "$NOW: WARNING: rateup (".(join " ", @exec ).
Packit 667938
                          ") did not work: $!\n";
Packit 667938
                return;
Packit 667938
           }
Packit 667938
    } elsif ($MRTG_lib::OS eq 'NW'){
Packit 667938
        map { s/"/\\"/; $_ = '"'.$_.'"' if /\s/ } @exec;
Packit 667938
Packit 667938
        # Stuff around because of Perl problems.
Packit 667938
Packit 667938
        open (NWPARMS, ">"."$$cfg{'imagedir'}$router.dat") or
Packit 667938
           do {
Packit 667938
                warn "$NOW: WARNING: Rateup parameters [$$cfg{'imagedir'}$router.dat] [open] failed.\n";
Packit 667938
Packit 667938
                return;
Packit 667938
           };
Packit 667938
        print NWPARMS join (" ", @exec);
Packit 667938
        close NWPARMS;
Packit 667938
Packit 667938
        # Now run Rateup with path to Parameters.
Packit 667938
Packit 667938
        open (RATEUP, "SYS:/Mrtg/bin/rateup -f $$cfg{'imagedir'}$router.dat"."|") or
Packit 667938
           do {
Packit 667938
                warn "$NOW: WARNING: SYS:/Mrtg/bin/rateup -f $$cfg{'imagedir'}$router.dat did NOT work.\n";
Packit 667938
Packit 667938
                return;
Packit 667938
           }
Packit 667938
    } else {
Packit 667938
        $! = undef;
Packit 667938
        open (RATEUP,"-|") or  
Packit 667938
                do { exec @exec or
Packit 667938
                     warn "$NOW: WARNING: rateup (".(join " ", @exec ).
Packit 667938
                          ") did not work: $!\n";
Packit 667938
                };
Packit 667938
Packit 667938
    }
Packit 667938
    
Packit 667938
    debug('log', join(" ", @exec));
Packit 667938
Packit 667938
Packit 667938
    if (open (HTML,"<$$cfg{'htmldir'}$$rcfg{'directory'}{$router}$router.$$rcfg{'extension'}{$router}")) {
Packit 667938
        for ($i=0 ; $i<200 ; $i++) {
Packit 667938
            last if eof(HTML);
Packit 667938
            $_= <HTML>;
Packit 667938
            if (/
Packit 667938
                $maxin{$1}{$router}=$2 || 0;
Packit 667938
            }
Packit 667938
Packit 667938
            if (/
Packit 667938
                $maxout{$1}{$router}=$2 || 0;
Packit 667938
            }
Packit 667938
Packit 667938
            if (/
Packit 667938
                $maxpercent{$1}{$router}=$2 || 0;
Packit 667938
            }
Packit 667938
Packit 667938
            if (/
Packit 667938
                $avin{$1}{$router}=$2 || 0;
Packit 667938
            }
Packit 667938
Packit 667938
            if (/
Packit 667938
                $avout{$1}{$router}=$2 || 0;
Packit 667938
            }
Packit 667938
Packit 667938
            if (/
Packit 667938
                $avpercent{$1}{$router}=$2 || 0;
Packit 667938
            }
Packit 667938
Packit 667938
            if (/
Packit 667938
                $cuin{$1}{$router}=$2 || 0;
Packit 667938
            }
Packit 667938
Packit 667938
            if (/
Packit 667938
                $cuout{$1}{$router}=$2 || 0;
Packit 667938
            }
Packit 667938
     
Packit 667938
            if (/
Packit 667938
                $cupercent{$1}{$router}=$2 || 0;
Packit 667938
            }
Packit 667938
            if (/
Packit 667938
                $avmxin{$1}{$router}=$2 || 0;
Packit 667938
            }
Packit 667938
Packit 667938
            if (/
Packit 667938
                $avmxout{$1}{$router}=$2 || 0;
Packit 667938
            }
Packit 667938
        }
Packit 667938
        close HTML;
Packit 667938
    }
Packit 667938
  
Packit 667938
    foreach $period (@mxvls) {
Packit 667938
        $res = <RATEUP>; 
Packit 667938
        if (not defined $res and eof(RATEUP)){
Packit 667938
            warn "$NOW: ERROR: Skipping webupdates because rateup did not return anything sensible\n";
Packit 667938
            close RATEUP;
Packit 667938
            rateupcheck $router;
Packit 667938
            return;
Packit 667938
        };
Packit 667938
        chomp $res;
Packit 667938
        $maxin{$period}{$router}=sprintf("%.0f",$res || 0);
Packit 667938
        chomp($res = <RATEUP>); 
Packit 667938
        $maxout{$period}{$router}=sprintf("%.0f",$res || 0);
Packit 667938
Packit 667938
        if ($$rcfg{'options'}{'dorelpercent'}{$router}) {
Packit 667938
            chomp($res = <RATEUP>); 
Packit 667938
            $maxpercent{$period}{$router}=sprintf("%.0f",$res || 0);
Packit 667938
        }
Packit 667938
Packit 667938
        chomp($res = <RATEUP>); 
Packit 667938
        $avin{$period}{$router}=sprintf("%.0f",$res || 0);
Packit 667938
        chomp($res = <RATEUP>); 
Packit 667938
        $avout{$period}{$router}=sprintf("%.0f",$res || 0);
Packit 667938
Packit 667938
        if ($$rcfg{'options'}{'dorelpercent'}{$router}) {
Packit 667938
            chomp($res = <RATEUP>); 
Packit 667938
            $avpercent{$period}{$router}=sprintf("%.0f",$res || 0);
Packit 667938
        }
Packit 667938
Packit 667938
        chomp($res = <RATEUP>); 
Packit 667938
        $cuin{$period}{$router}=sprintf("%.0f",$res || 0);
Packit 667938
        chomp($res = <RATEUP>); 
Packit 667938
        $cuout{$period}{$router}=sprintf("%.0f",$res || 0);
Packit 667938
Packit 667938
        if ($$rcfg{'options'}{'dorelpercent'}{$router}) {
Packit 667938
            chomp($res = <RATEUP>); 
Packit 667938
            $cupercent{$period}{$router}=sprintf("%.0f",$res || 0);
Packit 667938
        }
Packit 667938
Packit 667938
        chomp($res = <RATEUP>);
Packit 667938
        debug('avmx',"avmxin  $res");        
Packit 667938
        $avmxin{$period}{$router}=sprintf("%.0f",$res || 0);     
Packit 667938
        chomp($res = <RATEUP>);
Packit 667938
        debug('avmx',"avmxout $res");        
Packit 667938
        $avmxout{$period}{$router}=sprintf("%.0f",$res || 0);     
Packit 667938
        
Packit 667938
    }
Packit 667938
    close(RATEUP);
Packit 667938
    rateupcheck $router;
Packit 667938
    if ( defined $$cfg{'writeexpires'}  and $$cfg{'writeexpires'} =~ /^y/i ) {
Packit 667938
        my($fil,$exp);
Packit 667938
        while ( $fil = shift(@metas) ) {
Packit 667938
            $exp = &expistr(shift(@metas));
Packit 667938
            open(META, ">$fil.meta");
Packit 667938
            print META "Expires: $exp\n";
Packit 667938
            close(META);
Packit 667938
        }
Packit 667938
    }
Packit 667938
Packit 667938
    if ($$rcfg{'options'}{'dorelpercent'}{$router}) {
Packit 667938
        return (\%maxin, \%maxout, \%maxpercent, \%avin, \%avout, \%avpercent, \%cuin, \%cuout, \%cupercent, \%avmxin, \%avmxout);
Packit 667938
    } else {
Packit 667938
        return (\%maxin, \%maxout, \%avin, \%avout, \%cuin, \%cuout, \%avmxin, \%avmxout);
Packit 667938
    }
Packit 667938
}
Packit 667938
Packit 667938
#format 10*$kilo to 10 kB/s
Packit 667938
sub fmi {
Packit 667938
    my($number, $maxbytes, $router, @foo) = @_;
Packit 667938
    return "?????" unless defined $number;
Packit 667938
    my($rcfg,$LOC)=@foo;
Packit 667938
    my @short= ();
Packit 667938
    my $mul = 1;
Packit 667938
    if ($$rcfg{'kmg'}{$router}) {
Packit 667938
        my($i);
Packit 667938
        if (defined $$rcfg{'shortlegend'}{$router}) {
Packit 667938
            foreach $i (split(/,/, $$rcfg{'kmg'}{$router})) {
Packit 667938
                $short[$#short+1] = "$i"."$$rcfg{'shortlegend'}{$router}";
Packit 667938
            }
Packit 667938
        }
Packit 667938
        elsif ($$rcfg{'options'}{'bits'}{$router}) {
Packit 667938
            foreach $i (split(/,/, $$rcfg{'kmg'}{$router})) {
Packit 667938
                if ($$rcfg{'options'}{'perminute'}{$router}) {
Packit 667938
                    $short[$#short+1] = "$i".&$LOC("b/min");
Packit 667938
                } elsif ($$rcfg{'options'}{'perhour'}{$router}) {
Packit 667938
                    $short[$#short+1] = "$i".&$LOC("b/h");
Packit 667938
                } else {
Packit 667938
                    $short[$#short+1] = "$i".&$LOC("b/s");
Packit 667938
                }
Packit 667938
            }
Packit 667938
            $mul= 8;
Packit 667938
        } else {
Packit 667938
            foreach $i (split(/,/, $$rcfg{'kmg'}{$router})) {
Packit 667938
                if ($$rcfg{'options'}{'perminute'}{$router}) {
Packit 667938
                    $short[$#short+1] = "$i".&$LOC ("B/min");
Packit 667938
                } elsif ($$rcfg{'options'}{'perhour'}{$router}) {
Packit 667938
                    $short[$#short+1] = "$i".&$LOC("B/h");
Packit 667938
                } else {
Packit 667938
                    $short[$#short+1] = "$i".&$LOC("B/s");
Packit 667938
                }
Packit 667938
            }
Packit 667938
            $mul= 1;
Packit 667938
        }
Packit 667938
    } else {
Packit 667938
        if (defined $$rcfg{'options'}{'bits'}{$router}) {
Packit 667938
            if ($$rcfg{'options'}{'perminute'}{$router}) {
Packit 667938
                @short = (&$LOC("b/min"),&$LOC("kb/min"),&$LOC("Mb/min"),&$LOC("Gb/min"));
Packit 667938
            } elsif (defined $$rcfg{'options'}{'perhour'}{$router}) {
Packit 667938
                @short = (&$LOC("b/h"),&$LOC("kb/h"),&$LOC("Mb/h"),&$LOC("Gb/h"));
Packit 667938
            } else {
Packit 667938
                @short = (&$LOC("b/s"),&$LOC("kb/s"),&$LOC("Mb/s"),&$LOC("Gb/s"));
Packit 667938
            }
Packit 667938
            $mul= 8;
Packit 667938
        } else {
Packit 667938
            if ($$rcfg{'options'}{'perminute'}{$router}) {
Packit 667938
                @short = (&$LOC("B/min"),&$LOC("kB/min"),&$LOC("MB/min"),&$LOC("GB/min"));
Packit 667938
            } elsif ($$rcfg{'options'}{'perhour'}{$router}) {
Packit 667938
                @short = (&$LOC("B/h"),&$LOC("kB/h"),&$LOC("MB/h"),&$LOC("GB/h"));
Packit 667938
            } else {
Packit 667938
                @short = (&$LOC("B/s"),&$LOC("kB/s"),&$LOC("MB/s"),&$LOC("GB/s"));
Packit 667938
            }
Packit 667938
            $mul= 1;
Packit 667938
        }
Packit 667938
        if ($$rcfg{'shortlegend'}{$router}) {
Packit 667938
            @short = ("$$rcfg{'shortlegend'}{$router}",
Packit 667938
                      "k$$rcfg{'shortlegend'}{$router}",
Packit 667938
                      "M$$rcfg{'shortlegend'}{$router}",
Packit 667938
                      "G$$rcfg{'shortlegend'}{$router}");
Packit 667938
        }
Packit 667938
    }
Packit 667938
    my $digits=length("".$number*$mul);
Packit 667938
    my $divm=0;
Packit 667938
    #
Packit 667938
    #  while ($digits-$divm*3 > 4) { $divm++; }
Packit 667938
    #  my $divnum = $number*$mul/10**($divm*3);
Packit 667938
    my $divnum=$number*$mul*$$rcfg{'factor'}{$router};
Packit 667938
    #  while ($divnum/$$rcfg{'kilo'}{$router} >= 10*$$rcfg{'kilo'}{$router} and $divnum<$#short) {
Packit 667938
    while (($divnum >= 10*$$rcfg{'kilo'}{$router} or $short[$divm] =~ /^-/) and
Packit 667938
           $divm<$#short) {
Packit 667938
        $divm++;
Packit 667938
        $divnum /= $$rcfg{'kilo'}{$router};
Packit 667938
    }
Packit 667938
    my $perc;
Packit 667938
    if ($number == 0 || $maxbytes == 0) {
Packit 667938
        $perc = 0;
Packit 667938
    } else {
Packit 667938
        $perc = 100/$maxbytes*$number;
Packit 667938
    }
Packit 667938
    if (defined $$rcfg{'options'}{'integer'}{$router}) {
Packit 667938
        if ($$rcfg{'options'}{'nopercent'}{$router}) {
Packit 667938
            return sprintf("%.0f %s",$divnum,$short[$divm]);
Packit 667938
        } else {
Packit 667938
            return sprintf("%.0f %s (%2.1f%%)",$divnum,$short[$divm],$perc);
Packit 667938
        }
Packit 667938
    } else {
Packit 667938
        if (defined $$rcfg{'options'}{'nopercent'}{$router}) {
Packit 667938
            return sprintf("%.1f %s",$divnum,$short[$divm]); # Added: FvW
Packit 667938
        } else {
Packit 667938
            return sprintf("%.1f %s (%2.1f%%)",$divnum,$short[$divm],$perc);
Packit 667938
        }
Packit 667938
        return sprintf("%.1f %s (%2.1f%%)",$divnum,$short[$divm],$perc);
Packit 667938
    }
Packit 667938
}
Packit 667938
Packit 667938
Packit 667938
sub writehtml {
Packit 667938
    my($router, $cfg, $rcfg, $maxin, $maxout, $maxpercent,
Packit 667938
       $avin, $avout, $avmxin, $avmxout, $avpercent, 
Packit 667938
       $cuin, $cuout, $cupercent, $uptime, $name, $LOC) = @_;
Packit 667938
  
Packit 667938
    my($VERSION,$Today,$peri);
Packit 667938
  
Packit 667938
    my($persec);
Packit 667938
Packit 667938
    if (defined $$rcfg{'options'}{'bits'}{$router}) {
Packit 667938
        $persec = &$LOC("Bits");
Packit 667938
    } else {
Packit 667938
        $persec = &$LOC("Bytes");
Packit 667938
    }
Packit 667938
Packit 667938
    #  Work out the Colour legend
Packit 667938
    my($leg1, $leg2, $leg3, $leg4, $leg5);
Packit 667938
    if ($$rcfg{'legend1'}{$router}) {
Packit 667938
        $leg1 = $$rcfg{'legend1'}{$router};
Packit 667938
    } else {
Packit 667938
        if ($$rcfg{'options'}{'perminute'}{$router}) {
Packit 667938
            $leg1=&$LOC("Incoming Traffic in $persec per Minute");
Packit 667938
        } elsif ($$rcfg{'options'}{'perhour'}{$router}) {
Packit 667938
            $leg1=&$LOC("Incoming Traffic in $persec per Hour");
Packit 667938
        } else {
Packit 667938
            $leg1=&$LOC("Incoming Traffic in $persec per Second");
Packit 667938
        }
Packit 667938
    }
Packit 667938
    if ($$rcfg{'legend2'}{$router}) {
Packit 667938
        $leg2 = $$rcfg{'legend2'}{$router};
Packit 667938
    } else {
Packit 667938
        if ($$rcfg{'options'}{'perminute'}{$router}) {
Packit 667938
            $leg2=&$LOC("Outgoing Traffic in $persec per Minute");
Packit 667938
        } elsif ($$rcfg{'options'}{'perhour'}{$router}) {
Packit 667938
            $leg2=&$LOC("Outgoing Traffic in $persec per Hour");
Packit 667938
        } else {
Packit 667938
            $leg2=&$LOC("Outgoing Traffic in $persec per Second");
Packit 667938
        }	
Packit 667938
    }
Packit 667938
    if ($$rcfg{'legend3'}{$router}) {
Packit 667938
        $leg3 = $$rcfg{'legend3'}{$router};
Packit 667938
    } else {
Packit 667938
        $leg3 = &$LOC("Maximal 5 Minute Incoming Traffic");
Packit 667938
    }
Packit 667938
    if ($$rcfg{'legend4'}{$router}) {
Packit 667938
        $leg4 = $$rcfg{'legend4'}{$router};
Packit 667938
    } else {
Packit 667938
        $leg4 = &$LOC("Maximal 5 Minute Outgoing Traffic");
Packit 667938
    }
Packit 667938
    if ($$rcfg{'legend5'}{$router}) {
Packit 667938
        $leg5 = $$rcfg{'legend5'}{$router};
Packit 667938
    } else {
Packit 667938
        $leg5 = "(($leg1)/($leg2))*100";
Packit 667938
    }
Packit 667938
    # Translate the color names
Packit 667938
    $$rcfg{'col1'}{$router}=&$LOC($$rcfg{'col1'}{$router});
Packit 667938
    $$rcfg{'col2'}{$router}=&$LOC($$rcfg{'col2'}{$router});
Packit 667938
    $$rcfg{'col3'}{$router}=&$LOC($$rcfg{'col3'}{$router});
Packit 667938
    $$rcfg{'col4'}{$router}=&$LOC($$rcfg{'col4'}{$router});
Packit 667938
    $$rcfg{'col5'}{$router}=&$LOC($$rcfg{'col5'}{$router});
Packit 667938
Packit 667938
    my $dirrel = "../" x ($$rcfg{'directory_web'}{$router} =~ tr|/|/|);
Packit 667938
Packit 667938
    $Today=&$LOC(datestr(time));
Packit 667938
    $VERSION = "2.17.7";
Packit 667938
    open (HTML,">$$cfg{'htmldir'}$$rcfg{'directory'}{$router}$router.$$rcfg{'extension'}{$router}") || 
Packit 667938
      do { warn ("$NOW: WARNING: Writing $router.$$rcfg{'extension'}{$router}: $!");
Packit 667938
      	   next };
Packit 667938
    # this unforutnately confuses old IE greatly ... so we have to comment
Packit 667938
    # it out for now ... :-(
Packit 667938
    # print HTML '' . "\n";
Packit 667938
    print HTML '' . "\n";
Packit 667938
    print HTML '<html lang="en">' . "\n";
Packit 667938
    my $interval =$$cfg{'interval'};
Packit 667938
    my $expiration = &expistr($interval);
Packit 667938
    my $refresh =  defined $$cfg{'refresh'} ? $$cfg{'refresh'} : 300;
Packit 667938
    my $namestring = &$LOC("the device");
Packit 667938
    print HTML '' . "\n";
Packit 667938
    print HTML '' . "\n";
Packit 667938
    print HTML "\t" . '<head>' . "\n";
Packit 667938
    print HTML "\t\t" . '<meta charset="' . &$LOC('UTF-8') . '" />' . "\n";
Packit 667938
    print HTML "\t\t" . '<meta http-equiv="refresh" content="' . "$refresh" . '" />' . "\n";
Packit 667938
# Not functional in HTML file in modern web browsers - use HTTP header instead
Packit 667938
#		<meta http-equiv="pragma" content="no-cache" />
Packit 667938
#		<meta http-equiv="cache-control" content="no-cache" />
Packit 667938
#		<meta http-equiv="expires" content="$expiration" />
Packit 667938
#		<meta http-equiv="generator" content="MRTG $VERSION" />
Packit 667938
#		<meta http-equiv="date" content="$expiration" />
Packit 667938
    print HTML "\t\t" . '<title>' . "$$rcfg{'title'}{$router}" . '</title>' . "\n";
Packit 667938
    foreach $peri (qw(d w m y)) {
Packit 667938
        print HTML <<"TEXT";
Packit 667938
Packit 667938
Packit 667938
TEXT
Packit 667938
        if ($$rcfg{'options'}{'dorelpercent'}{$router} and defined $$maxpercent{$peri}{$router}) {
Packit 667938
            print HTML <<"TEXT";
Packit 667938
Packit 667938
TEXT
Packit 667938
        }
Packit 667938
        print HTML <<"TEXT";
Packit 667938
Packit 667938
Packit 667938
TEXT
Packit 667938
        if ($$rcfg{'options'}{'dorelpercent'}{$router}) {
Packit 667938
            print HTML <<"TEXT";
Packit 667938
Packit 667938
TEXT
Packit 667938
        }
Packit 667938
        print HTML "\n"
Packit 667938
           if defined $$cuin{$peri}{$router};
Packit 667938
        print HTML "\n"
Packit 667938
           if defined $$cuout{$peri}{$router};
Packit 667938
Packit 667938
        if ($$rcfg{'options'}{'dorelpercent'}{$router} and $$cupercent{$peri}{$router} ) {
Packit 667938
            print HTML <<"TEXT";
Packit 667938
Packit 667938
TEXT
Packit 667938
        }
Packit 667938
        print HTML <<"TEXT" if  $$avmxin{$peri}{$router} and $$avmxout{$peri}{$router};
Packit 667938
Packit 667938
Packit 667938
TEXT
Packit 667938
Packit 667938
    }
Packit 667938
Packit 667938
    $namestring = "'$name'" if $name;
Packit 667938
Packit 667938
    defined $$rcfg{backgc}{$router} or $$rcfg{backgc}{$router} = "#fff";
Packit 667938
Packit 667938
    $$rcfg{'rgb1'}{$router} = "" unless defined $$rcfg{'rgb1'}{$router};
Packit 667938
    $$rcfg{'rgb2'}{$router} = "" unless defined $$rcfg{'rgb2'}{$router};
Packit 667938
    $$rcfg{'rgb3'}{$router} = "" unless defined $$rcfg{'rgb3'}{$router};
Packit 667938
    $$rcfg{'rgb4'}{$router} = "" unless defined $$rcfg{'rgb4'}{$router};
Packit 667938
    $$rcfg{'rgb5'}{$router} = "" unless defined $$rcfg{'rgb5'}{$router};
Packit 667938
    $$rcfg{'rgb6'}{$router} = "" unless defined $$rcfg{'rgb6'}{$router};
Packit 667938
Packit 667938
    print HTML "		<style>
Packit 667938
			body {
Packit 667938
				background-color: $$rcfg{'backgc'}{$router};
Packit 667938
    ";
Packit 667938
    if($$rcfg{'backgc'}{$router} eq '#ffffff') {
Packit 667938
	print HTML "			color: #000000;";
Packit 667938
    } else {
Packit 667938
	print HTML "			color: #ffffff;";
Packit 667938
    }
Packit 667938
    print HTML "
Packit 667938
			}
Packit 667938
			div {
Packit 667938
				border-bottom: 2px solid #aaa;
Packit 667938
				padding-bottom: 10px;
Packit 667938
				margin-bottom: 5px;
Packit 667938
			}
Packit 667938
			div h2 {
Packit 667938
				font-size: 1.2em;
Packit 667938
			}
Packit 667938
			div.graph img {
Packit 667938
				margin: 5px 0;
Packit 667938
			}
Packit 667938
			div.graph table, div#legend table {
Packit 667938
				font-size: .8em;
Packit 667938
			}
Packit 667938
			div.graph table td {
Packit 667938
				padding: 0 10px;
Packit 667938
				text-align: right;
Packit 667938
			}
Packit 667938
			div table .in th, div table td span.in {
Packit 667938
				color: $$rcfg{'rgb1'}{$router};
Packit 667938
			}
Packit 667938
			div table .out th, div table td span.out {
Packit 667938
				color: $$rcfg{'rgb2'}{$router};
Packit 667938
			}";
Packit 667938
Packit 667938
    print HTML "
Packit 667938
			div table .inpeak th {
Packit 667938
				color: $$rcfg{'rgb3'}{$router};
Packit 667938
			}
Packit 667938
			div table .outpeak th {
Packit 667938
				color: $$rcfg{'rgb4'}{$router};
Packit 667938
			} " if defined $rcfg->{withpeak}{$router};
Packit 667938
Packit 667938
    print HTML "
Packit 667938
			div table .relpercent th {
Packit 667938
				color: $$rcfg{'rgb5'}{$router};
Packit 667938
			}" if ( $$rcfg{'options'}{'dorelpercent'}{$router} );
Packit 667938
	 
Packit 667938
    print HTML "
Packit 667938
			div#legend th {
Packit 667938
				text-align: right;
Packit 667938
			}
Packit 667938
			div#footer {
Packit 667938
				border: none;
Packit 667938
				font-size: .8em;
Packit 667938
				font-family: Arial, Helvetica, sans-serif;
Packit 667938
				width: 476px;
Packit 667938
			}
Packit 667938
			div#footer img {
Packit 667938
				border: none;
Packit 667938
				height: 25px;
Packit 667938
			}
Packit 667938
			div#footer address {
Packit 667938
				text-align: right;
Packit 667938
			}
Packit 667938
			div#footer #version {
Packit 667938
				margin: 0;
Packit 667938
				padding: 0;
Packit 667938
				float: left;
Packit 667938
				width: 88px;
Packit 667938
				text-align: right;
Packit 667938
			}
Packit 667938
		</style>";
Packit 667938
Packit 667938
    # allow for \n in addhead
Packit 667938
    defined $$rcfg{addhead}{$router} or $$rcfg{addhead}{$router} = "";
Packit 667938
    defined $$rcfg{pagetop}{$router} or $$rcfg{pagetop}{$router} = "";
Packit 667938
Packit 667938
    if (defined $$rcfg{bodytag}{$router}) {
Packit 667938
        if ($$rcfg{bodytag}{$router} !~ /
Packit 667938
                $$rcfg{bodytag}{$router} = "<body $$rcfg{bodytag}{$router}>";
Packit 667938
        }
Packit 667938
    } else {
Packit 667938
        $$rcfg{bodytag}{$router} = "<body>";
Packit 667938
    }
Packit 667938
Packit 667938
    $$rcfg{addhead}{$router} =~ s/\\n/\n/g if defined $$rcfg{addhead}{$router};
Packit 667938
Packit 667938
    print HTML "$$rcfg{'addhead'}{$router}
Packit 667938
	</head>
Packit 667938
";
Packit 667938
    print HTML "
Packit 667938
$$rcfg{bodytag}{$router}
Packit 667938
    $$rcfg{'pagetop'}{$router}
Packit 667938
    ";
Packit 667938
    print HTML "

";

Packit 667938
    if (defined $$rcfg{'timezone'}{$router}){    
Packit 667938
    print HTML     
Packit 667938
      &$LOC("The statistics were last updated $Today $$rcfg{'timezone'}{$router}");
Packit 667938
    } else {
Packit 667938
    print HTML     
Packit 667938
      &$LOC("The statistics were last updated $Today");
Packit 667938
    }
Packit 667938
    if ($uptime and ! $$rcfg{options}{noinfo}{$router}) {
Packit 667938
        print HTML
Packit 667938
          ",
\n".
Packit 667938
        &$LOC("at which time $namestring had been up for $uptime.")
Packit 667938
    }
Packit 667938
	print HTML "

";
Packit 667938
    my %sample= ('d' => "`Daily' Graph (".$interval.' Minute',
Packit 667938
                 'w' => "`Weekly' Graph (30 Minute",
Packit 667938
                 'm' => "`Monthly' Graph (2 Hour",
Packit 667938
                 'y' => "`Yearly' Graph (1 Day");
Packit 667938
  
Packit 667938
    my %full = ('d' => 'day',
Packit 667938
                'w' => 'week',
Packit 667938
                'm' => 'month',
Packit 667938
                'y' => 'year');
Packit 667938
  
Packit 667938
    my $InCo;
Packit 667938
    if (!(defined $$rcfg{'options'}{'noi'}{$router})) {
Packit 667938
    if (exists $$rcfg{'legendi'}{$router}) {
Packit 667938
        if ($$rcfg{'legendi'}{$router} ne "") {
Packit 667938
            $InCo=$$rcfg{'legendi'}{$router};
Packit 667938
        }
Packit 667938
    } else {
Packit 667938
        $InCo=&$LOC("In");
Packit 667938
    }
Packit 667938
    }
Packit 667938
    
Packit 667938
    my $OutCo;
Packit 667938
    if (!(defined $$rcfg{'options'}{'noo'}{$router})) {
Packit 667938
    if (exists $$rcfg{'legendo'}{$router}) {
Packit 667938
        if ($$rcfg{'legendo'}{$router} ne "") {
Packit 667938
            $OutCo=$$rcfg{'legendo'}{$router};
Packit 667938
        }
Packit 667938
    } else {
Packit 667938
        $OutCo=&$LOC("Out");
Packit 667938
    }
Packit 667938
    }
Packit 667938
    my $PercentCo;
Packit 667938
    if (defined $$rcfg{'legend5'}{$router}) {
Packit 667938
        if ($$rcfg{'legend5'}{$router} ne "") {
Packit 667938
            $PercentCo=$$rcfg{'legend5'}{$router};
Packit 667938
        }
Packit 667938
    } else {
Packit 667938
        $PercentCo=&$LOC("Percentage");
Packit 667938
    }
Packit 667938
  
Packit 667938
    foreach $peri (qw(d w m y)) {
Packit 667938
        next if defined $$rcfg{'suppress'}{$router} and $$rcfg{'suppress'}{$router} =~/$peri/;
Packit 667938
        my $gifw;
Packit 667938
        if ($$rcfg{'options'}{'dorelpercent'}{$router}) {
Packit 667938
            $gifw=sprintf("%.0f",($$rcfg{'xsize'}{$router}*$$rcfg{'xscale'}{$router}+
Packit 667938
                                  +100+30) *$$rcfg{'xzoom'}{$router});
Packit 667938
        } else {
Packit 667938
            $gifw=sprintf("%.0f",($$rcfg{'xsize'}{$router}*$$rcfg{'xscale'}{$router}
Packit 667938
                                  +100) *$$rcfg{'xzoom'}{$router});
Packit 667938
        }
Packit 667938
        my $gifh=sprintf("%.0f",($$rcfg{'ysize'}{$router}*$$rcfg{'yscale'}{$router}+35)
Packit 667938
                         *$$rcfg{'yzoom'}{$router});
Packit 667938
                 
Packit 667938
        # take the image directory away from the html directory to give us relative links
Packit 667938
Packit 667938
Packit 667938
	my $imagepath = ( $cfg->{htmldir} ne $cfg->{imagedir} ) ? "$dirrel$$cfg{imagehtml}$$rcfg{directory_web}{$router}" : "";
Packit 667938
        print HTML "
Packit 667938
Packit 667938
		
Packit 667938
			

".&$LOC("$sample{$peri}").&$LOC(' Average)')."

Packit 667938
			\"$full{$peri}\"
Packit 667938
			
Packit 667938
				
Packit 667938
					
Packit 667938
					" . &$LOC("Max") . "
Packit 667938
					" . &$LOC("Average") . "
Packit 667938
					" . &$LOC("Current") . "
Packit 667938
				";
Packit 667938
        my(@foo)=($rcfg,$LOC);
Packit 667938
        print HTML "
Packit 667938
				
Packit 667938
					" . $InCo . "
Packit 667938
					".&fmi($$maxin{$peri}{$router}, $$rcfg{'maxbytes1'}{$router}, $router, @foo)."
Packit 667938
					".&fmi($$avin{$peri}{$router}, $$rcfg{'maxbytes1'}{$router}, $router, @foo)." 
Packit 667938
					".&fmi($$cuin{$peri}{$router}, $$rcfg{'maxbytes1'}{$router}, $router, @foo)." 
Packit 667938
				" if $InCo;
Packit 667938
        print HTML "
Packit 667938
				
Packit 667938
					" . $OutCo . "
Packit 667938
					".&fmi($$maxout{$peri}{$router}, $$rcfg{'maxbytes2'}{$router}, $router, @foo)." 
Packit 667938
					".&fmi($$avout{$peri}{$router}, $$rcfg{'maxbytes2'}{$router}, $router, @foo)." 
Packit 667938
					".&fmi($$cuout{$peri}{$router}, $$rcfg{'maxbytes2'}{$router}, $router, @foo)." 
Packit 667938
				" if $OutCo;
Packit 667938
        print HTML "
Packit 667938
				
Packit 667938
					" . $PercentCo . "
Packit 667938
					".sprintf("%0.1f %%",($$maxpercent{$peri}{$router} || 0))." 
Packit 667938
					".sprintf("%0.1f %%",($$avpercent{$peri}{$router} || 0 ))." 
Packit 667938
					".sprintf("%0.1f %%",($$cupercent{$peri}{$router} || 0 ))." 
Packit 667938
				" if ($$rcfg{'options'}{'dorelpercent'}{$router} and $PercentCo);
Packit 667938
print HTML "
Packit 667938
				
Packit 667938
					
Packit 667938
						" . &$LOC("Average max 5 min values for $sample{$peri} interval):") . "
Packit 667938
						$InCo " . &fmi($$avmxin{$peri}{$router}, $$rcfg{'maxbytes1'}{$router}, $router, @foo) . "/
Packit 667938
						$OutCo " . &fmi($$avmxout{$peri}{$router}, $$rcfg{'maxbytes2'}{$router}, $router, @foo) . "
Packit 667938
					
Packit 667938
				" if ($$rcfg{'options'}{'avgpeak'}{$router} and $InCo and $OutCo);
Packit 667938
        print HTML "
Packit 667938
			
Packit 667938
		
Packit 667938
\n";
Packit 667938
}
Packit 667938
Packit 667938
    if (!(defined $$rcfg{'options'}{'nolegend'}{$router})) {
Packit 667938
    print HTML "
Packit 667938
Packit 667938
		
Packit 667938
			";
Packit 667938
    print HTML "
Packit 667938
				
Packit 667938
					$$rcfg{'col1'}{$router} ###
Packit 667938
					$leg1
Packit 667938
				" if $InCo;
Packit 667938
    print HTML "
Packit 667938
				
Packit 667938
					$$rcfg{'col2'}{$router} ###
Packit 667938
					$leg2
Packit 667938
				" if $OutCo;
Packit 667938
    if ($$rcfg{'withpeak'}{$router}) {
Packit 667938
        print HTML "
Packit 667938
				
Packit 667938
					$$rcfg{'col3'}{$router} ###
Packit 667938
					$leg3
Packit 667938
				" if $InCo;
Packit 667938
        print HTML "
Packit 667938
				
Packit 667938
					$$rcfg{'col4'}{$router} ###
Packit 667938
					$leg4
Packit 667938
				" if $OutCo;
Packit 667938
    }
Packit 667938
    if ($$rcfg{'options'}{'dorelpercent'}{$router}) {
Packit 667938
        print HTML "
Packit 667938
				
Packit 667938
					$$rcfg{'col5'}{$router} ###
Packit 667938
					$leg5
Packit 667938
				";
Packit 667938
    }
Packit 667938
        print HTML "
Packit 667938
			
Packit 667938
		
Packit 667938
Packit 667938
";
Packit 667938
    }
Packit 667938
Packit 667938
    if (!(defined $$rcfg{'options'}{'nobanner'}{$router})) {
Packit 667938
    my $gifPath;
Packit 667938
Packit 667938
    if (defined $$cfg{icondir}) {
Packit 667938
        $gifPath = $$cfg{icondir};
Packit 667938
        #lets make sure there is a trailing path separator
Packit 667938
        $gifPath =~ s|/*$|/|;
Packit 667938
    } else {
Packit 667938
	$gifPath = "$dirrel$$cfg{imagehtml}";
Packit 667938
    }
Packit 667938
Packit 667938
    print HTML<
Packit 667938
Packit 667938
		
Packit 667938
			MRTGMRTGMulti Router Traffic Grapher
Packit 667938
			

$VERSION

Packit 667938
			<address>
Packit 667938
				Tobias Oetiker
Packit 667938
				<tobi\@oetiker.ch>
Packit 667938
TEXT
Packit 667938
    print HTML &$LOC("and");
Packit 667938
    print HTML<
Packit 667938
				Dave Rand
Packit 667938
				<dlr\@bungi.com>
Packit 667938
TEXT
Packit 667938
Packit 667938
    # We don't need this any more.
Packit 667938
    undef $gifPath;
Packit 667938
Packit 667938
    if ($MRTG_lib::OS eq 'VMS') {
Packit 667938
        print HTML "
Packit 667938
				".&$LOC("Ported to OpenVMS Alpha by")." Werner Berger
Packit 667938
				<werner.berger\@cch.cerberus.ch>";
Packit 667938
    }
Packit 667938
# There is not realy any significant portion of code from Studard left and
Packit 667938
# none of his addresses work anymore. -- Tobi  2001-06-04
Packit 667938
#    if ($MRTG_lib::OS eq 'NT') {
Packit 667938
#        print HTML 
Packit 667938
#          "
Packit 667938
#  ".&$LOC("Ported to WindowsNT by")."
Packit 667938
#  <NOBR><small>Stuart Schneider
Packit 667938
#  
Packit 667938
#  <schneis\@testlab.orst.edu></NOBR>
Packit 667938
# ";
Packit 667938
#    }
Packit 667938
    if ( 
Packit 667938
        $$cfg{'language'} and 
Packit 667938
        defined($lang2tran::LOCALE{"\L$$cfg{'language'}\E"}) and
Packit 667938
        ($LOC != $lang2tran::LOCALE{"default"})) 
Packit 667938
    {
Packit 667938
        if (defined($credits::LOCALE{"\L$$cfg{'language'}\E"})) {
Packit 667938
            print HTML "
Packit 667938
				".$credits::LOCALE{"\L$$cfg{'language'}\E"};
Packit 667938
        } else {
Packit 667938
            print HTML "
Packit 667938
				".$credits::LOCALE{'default'};
Packit 667938
        }
Packit 667938
        ;
Packit 667938
    }
Packit 667938
    print HTML <
Packit 667938
			</address>
Packit 667938
		
Packit 667938
Packit 667938
TEXT
Packit 667938
    }
Packit 667938
Packit 667938
    print HTML $$rcfg{'pagefoot'}{$router} if defined $$rcfg{'pagefoot'}{$router};
Packit 667938
    print HTML <
Packit 667938
	</body>
Packit 667938
</html>
Packit 667938
Packit 667938
TEXT
Packit 667938
    close HTML;
Packit 667938
Packit 667938
    if (defined $$cfg{'writeexpires'}  and $$cfg{'writeexpires'} =~ /^y/i) {
Packit 667938
        open(HTMLG, ">$$cfg{'htmldir'}$$rcfg{'directory'}{$router}$router.".
Packit 667938
	     "$$rcfg{'extension'}{$router}.meta") ||
Packit 667938
	       do {
Packit 667938
		   warn "$NOW: WARNING: Writing $$cfg{'htmldir'}$$rcfg{'directory'}{$router}$router.".
Packit 667938
		     "$$rcfg{'extension'}{$router}.meta: $!\n";
Packit 667938
		   next
Packit 667938
	       };
Packit 667938
Packit 667938
        print HTMLG "Expires: $expiration\n";
Packit 667938
        close(HTMLG);
Packit 667938
    }
Packit 667938
}
Packit 667938
Packit 667938
Packit 667938
sub printusage {
Packit 667938
    print <
Packit 667938
Usage: mrtg <config-file>
Packit 667938
Packit 667938
mrtg-2.17.7 - Multi Router Traffic Grapher
Packit 667938
Packit 667938
Copyright 1995-2006 by Tobias Oetiker
Packit 667938
Licensed under the Gnu GPL.
Packit 667938
Packit 667938
If you want to know more about this tool, you might want
Packit 667938
to read the docs. You can find everything on the
Packit 667938
mrtg website:
Packit 667938
Packit 667938
http://oss.oetiker.ch/mrtg/
Packit 667938
Packit 667938
USAGEDESC
Packit 667938
    exit(1);
Packit 667938
}
Packit 667938
Packit 667938
Packit 667938
sub lockit {
Packit 667938
    my ($lockfile,$templock) = @_;
Packit 667938
    if ($MRTG_lib::OS eq 'VMS' or $MRTG_lib::OS eq 'NT'  or $MRTG_lib::OS eq 'OS2') {
Packit 667938
        # too sad NT and VMS can't do links we'll do the diletants lock
Packit 667938
        if (-e $lockfile and not unlink $lockfile) {
Packit 667938
            my($lockage) = time()-(stat($lockfile))[9];
Packit 667938
            die "$NOW: ERROR: I guess another mrtg is running. A lockfile ($lockfile)\n".
Packit 667938
                 "       aged $lockage seconds is hanging around and I can't remove\n".
Packit 667938
                 "       it because another process is still using it.";
Packit 667938
        }
Packit 667938
      
Packit 667938
        open (LOCK, ">$lockfile") or 
Packit 667938
          die "$NOW: ERROR: Creating lockfile $lockfile: $!\n";
Packit 667938
        print LOCK "$$\n";
Packit 667938
        close LOCK;
Packit 667938
        open (LOCK, "<$lockfile") or 
Packit 667938
          die "$NOW: ERROR: Reading lockfile $lockfile for owner check: $!\n";
Packit 667938
        my($read)=<LOCK>;
Packit 667938
        chomp($read);
Packit 667938
        die "$NOW: ERROR: Someone else just got the lockfile $lockfile\n" 
Packit 667938
          unless  $$ == $read;
Packit 667938
    } else {
Packit 667938
        # now, lets do it the UNIX way ... Daves work ...
Packit 667938
        open(LOCK,">$templock") or die "$NOW: ERROR: Creating templock $templock: $!";
Packit 667938
        $main::Cleanfile = $templock;
Packit 667938
        if (!link($templock,$lockfile)) { # Lock file exists - deal with it.
Packit 667938
            my($nlink,$lockage) = (stat($lockfile))[3,9]; 
Packit 667938
            $lockage = time() - $lockage;
Packit 667938
            if ($nlink < 2 or $lockage > 30*60) { #lockfile is alone and old
Packit 667938
                unlink($lockfile) 
Packit 667938
                  || do{ unlink $templock; 
Packit 667938
                         die "$NOW: ERROR: Can't unlink stale lockfile ($lockfile). Permissions?\n"};
Packit 667938
                link($templock,$lockfile) 
Packit 667938
                  || do{ unlink $templock; 
Packit 667938
                         die "$NOW: ERROR: Can't create lockfile ($lockfile).\n".
Packit 667938
                           "Permission problem or another mrtg locking succesfully?\n"};
Packit 667938
            } else {
Packit 667938
                unlink $templock;
Packit 667938
                die "$NOW: ERROR: It looks as if you are running two copies of mrtg in parallel on\n".
Packit 667938
                    "       the same config file. There is a lockfile ($lockfile) and it is\n".
Packit 667938
                    "       is only $lockage seconds old ... Check your crontab.\n".
Packit 667938
                    "       (/etc/crontab and /var/spool/cron/root) \n"
Packit 667938
                        if $lockage < 4;
Packit 667938
      
Packit 667938
                die  "$NOW: ERROR: I guess another mrtg is running. A lockfile ($lockfile) aged\n".
Packit 667938
                     "$lockage seconds is hanging around. If you are sure that no other mrtg\n".
Packit 667938
                     "is running you can remove the lockfile\n";
Packit 667938
          
Packit 667938
            }
Packit 667938
        
Packit 667938
        }
Packit 667938
    }
Packit 667938
}
Packit 667938
Packit 667938
sub threshmail ($$$$){
Packit 667938
    my $server = shift;
Packit 667938
    my $from = shift;
Packit 667938
    my $to = shift;
Packit 667938
    my $message = shift;
Packit 667938
    debug('base',"sending threshmail from $from to $to");
Packit 667938
    my $smtp = Net::SMTP->new([split /\s*,\s*/, $server],Timeout=>5) or
Packit 667938
	do { warn "$NOW: ERROR: could not send thresholdmail to $to"; return };
Packit 667938
    $smtp->mail($from);
Packit 667938
    $smtp->to(split(/\s*,\s*/, $to));
Packit 667938
    $smtp->data();
Packit 667938
    $smtp->datasend($message);
Packit 667938
    $smtp->dataend();
Packit 667938
    $smtp->quit;
Packit 667938
}   
Packit 667938
Packit 667938
sub threshcheck {
Packit 667938
    # threshold checking by Tom Muggli
Packit 667938
    # ... fsck'd up but fixed by Juha Laine
Packit 667938
    my ($cfg,$rcfg,$cfgfile,$router,$cuin,$cuout) = @_;
Packit 667938
    my $threshfile;
Packit 667938
    my %cu = ( i=> $cuin, o=>$cuout );
Packit 667938
    # are we going to keep state ?
Packit 667938
    if (defined $$cfg{'threshdir'}){
Packit 667938
        ensureSL(\$$cfg{'threshdir'});
Packit 667938
        $threshfile = $$cfg{'threshdir'}.(split /\Q$MRTG_lib::SL\E/, $cfgfile)[-1].".$router";
Packit 667938
    }
Packit 667938
Packit 667938
    # setup environment for external scripts
Packit 667938
    if (defined $rcfg->{'threshdesc'}{$router}) {
Packit 667938
        $ENV{THRESH_DESC}=$rcfg->{'threshdesc'}{$router};
Packit 667938
    } else {
Packit 667938
        delete $ENV{THRESH_DESC};
Packit 667938
    }
Packit 667938
    if (defined $rcfg->{'hwthreshdesc'}{$router}) {
Packit 667938
        $ENV{HWTHRESH_DESC}=$rcfg->{'hwthreshdesc'}{$router};
Packit 667938
    } else {
Packit 667938
        delete $ENV{HWTHRESH_DESC};
Packit 667938
    }
Packit 667938
Packit 667938
    for my $dir (qw(i o)){ # in and out
Packit 667938
        my %thresh = (
Packit 667938
                thresh => $cu{$dir}{d}{$router},
Packit 667938
                
Packit 667938
        # if we are looking at an rrd with holtwinters RRAs
Packit 667938
        # we get a failures count.
Packit 667938
                hwthresh => $cu{$dir}{d_hwfail}{$router}
Packit 667938
        );
Packit 667938
        for my $type (keys %thresh){
Packit 667938
            for my $bound (qw(min max)){
Packit 667938
                # it gets set inside the loop because threshval gets modified further
Packit 667938
                # down in the code
Packit 667938
                my $threshval = $thresh{$type};
Packit 667938
                next if not defined $threshval;
Packit 667938
Packit 667938
                my $boundval = $rcfg->{$type.$bound.$dir}{$router};
Packit 667938
                next unless defined $boundval;
Packit 667938
    
Packit 667938
                my $realval = "";
Packit 667938
    	        my $realthresh = "";
Packit 667938
    
Packit 667938
                if ($boundval =~ s/%$//) { # defined in % of maxbytes
Packit 667938
                    # 2 decimals in %   
Packit 667938
        		    $realval = "% ($threshval)";
Packit 667938
	                $realthresh = "% (".sprintf("%.1f",($rcfg->{"maxbytes".($dir eq 'i' ? 1 : 2)}{$router} * $boundval / 100)).")";
Packit 667938
                    $threshval = sprintf "%.1f", ($threshval / $rcfg->{"maxbytes".($dir eq 'i' ? 1 : 2)}{$router} * 100); # the new code
Packit 667938
                }
Packit 667938
    	        my $msghead = "";
Packit 667938
                $msghead = "From: $cfg->{threshmailsender}\nTo: $rcfg->{${type}.'mailaddress'}{$router}"
Packit 667938
	    	        if $rcfg->{${type}.'mailaddress'}{$router} and $cfg->{threshmailsender};
Packit 667938
    	        my $pagetop = $rcfg->{pagetop}{$router} || '';
Packit 667938
    	        $pagetop =~ s|

.*?

||;
Packit 667938
                $pagetop =~ s|\s*\s*(.*?)\s*(.*?)\s*\s*|$1 $2\n|g;
Packit 667938
	        $pagetop =~ s|\s*<.+?>\s*\n?||g;
Packit 667938
Packit 667938
         	my $msgbody = <
Packit 667938
    
Packit 667938
$rcfg->{title}{$router}
Packit 667938
Packit 667938
   Target: $router
Packit 667938
     Type: $type
Packit 667938
Direction: $dir
Packit 667938
    Bound: $bound
Packit 667938
Threshold: $boundval$realthresh
Packit 667938
  Current: $threshval$realval
Packit 667938
Packit 667938
$pagetop
Packit 667938
Packit 667938
MESSAGE
Packit 667938
	            $msgbody .= "\n$rcfg->{$type.'desc'}{$router}\n" if $rcfg->{$type.'desc'}{$router};
Packit 667938
	
Packit 667938
                
Packit 667938
                if (($bound eq 'min' and $boundval > $threshval) or
Packit 667938
                    ($bound eq 'max' and $boundval < $threshval)) {
Packit 667938
    		        # threshold was broken...
Packit 667938
	    	        my $message = <
Packit 667938
$msghead
Packit 667938
Subject: [MRTG-TH] BROKEN $router $type $bound $dir ( $boundval$realthresh vs $threshval$realval )
Packit 667938
Packit 667938
Threshold BROKEN
Packit 667938
----------------
Packit 667938
$msgbody
Packit 667938
MESSAGE
Packit 667938
                    my @exec = ( $rcfg->{$type.'prog'.$dir}{$router}, $router,
Packit 667938
			            $rcfg->{$type.$bound.$dir}{$router}, $threshval,($rcfg->{$type.'desc'}{$router} ||"No Description"));
Packit 667938
 
Packit 667938
                    # Check if we use the status file or not...
Packit 667938
                    if ( defined $threshfile ) {
Packit 667938
		                if ( not -e $threshfile.".".$type.$bound.uc($dir) ) {
Packit 667938
			            # Create a file to indicate a threshold problem for the time after the problem
Packit 667938
			                open THRESHTOUCH, ">".$threshfile.".".$type.$bound.uc($dir)
Packit 667938
			                    or warn "$NOW: WARNING: Creating $threshfile.".$bound.uc($dir).": $!\n";
Packit 667938
			                close THRESHTOUCH;
Packit 667938
			                if (defined $rcfg->{$type.'prog'.$dir}{$router}){
Packit 667938
                                debug('base',"run threshprog$dir: ".(join ",",@exec));
Packit 667938
                     	        system @exec;
Packit 667938
			                }
Packit 667938
			                threshmail $cfg->{threshmailserver},$cfg->{threshmailsender},$rcfg->{$type.'mailaddress'}{$router},$message
Packit 667938
    			                if $rcfg->{$type.'mailaddress'}{$router}
Packit 667938
            	        } 
Packit 667938
                        else {
Packit 667938
			                debug('base',"NOT acting on BROKEN threshold since $threshfile.$type$bound$dir exists");
Packit 667938
		                }
Packit 667938
		            } elsif ( not defined $cfg->{$type.'hyst'} or 
Packit 667938
	                     ($bound eq 'min' and $boundval - $cfg->{$type.'hyst'}* $boundval < $threshval) or
Packit 667938
                            ($bound eq 'max' and $boundval + $cfg->{$type.'hyst'}* $boundval > $threshval)
Packit 667938
  			            ) {
Packit 667938
        		     # no threshold dir so run on every 'break'
Packit 667938
		                if (defined $rcfg->{$type.'prog'.$dir}{$router}){
Packit 667938
                            debug('base',"run ${type}prog$dir: ".(join ",",@exec));
Packit 667938
                            system @exec;
Packit 667938
          		        }
Packit 667938
            	        threshmail $cfg->{threshmailserver},$cfg->{threshmailsender},$rcfg->{$type.'mailaddress'}{$router},$message
Packit 667938
                            if $rcfg->{$type.'mailaddress'}{$router};
Packit 667938
		            }
Packit 667938
                } else {
Packit 667938
  		            # no threshold broken ...
Packit 667938
		            my @exec = ( $rcfg->{$type.'progok'.$dir}{$router}, $router,
Packit 667938
			                 $rcfg->{$type.$bound.$dir}{$router}, $threshval);
Packit 667938
		            my $message = <
Packit 667938
$msghead
Packit 667938
Subject: [MRTG-TH] UN-BROKEN $router $type $bound $dir ( $rcfg->{$type.$bound.$dir}{$router} vs $threshval)
Packit 667938
Packit 667938
Threshold UN-BROKEN
Packit 667938
-------------------
Packit 667938
$msgbody
Packit 667938
MESSAGE
Packit 667938
Packit 667938
		            # Check if we use the status file or not...
Packit 667938
		            if ( defined $threshfile ) {
Packit 667938
		                if ( -e $threshfile.".".$type.$bound.uc($dir) ){
Packit 667938
			                unlink "$threshfile.".$type.$bound.uc($dir);
Packit 667938
		                    if (defined $rcfg->{$type.'progok'.$dir}{$router}){
Packit 667938
                                debug('base',"run ${type}progok$dir: ".(join ",",@exec));
Packit 667938
                     	        system @exec;
Packit 667938
    		                }
Packit 667938
			                threshmail $cfg->{threshmailserver},$cfg->{threshmailsender},$rcfg->{$type.'mailaddress'}{$router},$message
Packit 667938
                                if $rcfg->{$type.'mailaddress'}{$router};
Packit 667938
		                }
Packit 667938
		            }   
Packit 667938
                }
Packit 667938
            } # for my $bound ...
Packit 667938
        } # for my $type
Packit 667938
    } # for my $dir
Packit 667938
}
Packit 667938
Packit 667938
sub getexternal ($) {
Packit 667938
    my $command = shift;
Packit 667938
    my $in=undef;
Packit 667938
    my $out=undef;
Packit 667938
    my $uptime="unknown";
Packit 667938
    my $name="unknown";
Packit 667938
Packit 667938
    open (EXTERNAL , $command."|")
Packit 667938
	or warn "$NOW: WARNING: Running '$command': $!\n";
Packit 667938
Packit 667938
    warn "$NOW: WARNING: Could not get any data from external command ".
Packit 667938
	"'".$command.
Packit 667938
	    "'\nMaybe the external command did not even start. ($!)\n\n" if eof EXTERNAL;
Packit 667938
Packit 667938
    chomp( $in=<EXTERNAL>) unless eof EXTERNAL;
Packit 667938
    chomp( $out=<EXTERNAL>) unless eof EXTERNAL;
Packit 667938
    chomp( $uptime=<EXTERNAL>) unless eof EXTERNAL;
Packit 667938
    chomp( $name=<EXTERNAL>) unless eof EXTERNAL;
Packit 667938
Packit 667938
    close EXTERNAL;
Packit 667938
Packit 667938
    # strip returned date
Packit 667938
    $uptime  =~ s/^\s*(.*?)\s*/$1/;
Packit 667938
    $name  =~ s/^\s*(.*?)\s*/$1/;
Packit 667938
Packit 667938
    # do we have numbers in the external programs answer ?
Packit 667938
    if ( not defined $in ) {
Packit 667938
	warn "$NOW: WARNING: Problem with External get '$command':\n".
Packit 667938
	    "   Expected a Number for 'in' but nothing'\n\n";        
Packit 667938
    } elsif ( $in eq 'UNKNOWN' ) {
Packit 667938
        $in = undef;
Packit 667938
    } elsif ( $in !~ /([-+]?\d+(.\d+)?)/ ) {
Packit 667938
	warn "$NOW: WARNING: Problem with External get '$command':\n".
Packit 667938
	    "   Expected a Number for 'in' but got '$in'\n\n";
Packit 667938
	$in = undef;
Packit 667938
    } else {
Packit 667938
        $in = $1;
Packit 667938
    }
Packit 667938
Packit 667938
    if ( not defined $out ) {
Packit 667938
	warn "$NOW: WARNING: Problem with External get '$command':\n".
Packit 667938
	    "   Expected a Number for 'out' but nothing'\n\n";
Packit 667938
    } elsif ( $out eq 'UNKNOWN' ) {
Packit 667938
        $out = undef;
Packit 667938
    } elsif ( $out !~ /([-+]?\d+(.\d+)?)/ ) {
Packit 667938
	warn "$NOW: WARNING: Problem with External get '$command':\n".
Packit 667938
	    "   Expected a Number for 'out' but got '$out'\n\n";
Packit 667938
	$out = undef;
Packit 667938
    } else {
Packit 667938
        $out = $1;
Packit 667938
    }
Packit 667938
    debug('snpo',"External result:".($in||"undef")." out:".($out||"undef")." uptime:".($uptime||"undef")." name:".($name||"undef"));
Packit 667938
    return ($in,$out,time,$uptime,$name);
Packit 667938
}
Packit 667938
Packit 667938
sub getsnmparg ($$$$){
Packit 667938
    my $confcache = shift;
Packit 667938
    my $target = shift;
Packit 667938
    my $cfg = shift;
Packit 667938
    my $populated = shift;
Packit 667938
    my $retry = 0;
Packit 667938
Packit 667938
    my $hostname = $$target{Host};
Packit 667938
    my $hostkey = "$$target{Community}\@$$target{Host}$$target{SnmpOpt}";
Packit 667938
Packit 667938
    if ($$target{ipv4only}) {
Packit 667938
        if (not ( $hostname =~ /^\d+\.\d+\.\d+\.\d+$/ or gethostbyname $hostname) ){
Packit 667938
            warn "$NOW: WARNING: Skipping host $hostname as it does not resolve to an IPv4 address\n";
Packit 667938
            return 'DEADHOST';
Packit 667938
        }
Packit 667938
    } else {
Packit 667938
         if($hostname =~ /^\[(.*)\]$/) {
Packit 667938
            # Numeric IPv6 address. Check that it's valid
Packit 667938
            $hostname = substr($hostname, 1);
Packit 667938
            chop $hostname;
Packit 667938
            if(! inet_pton(AF_INET6(), $hostname)) {
Packit 667938
                warn "$NOW: WARNING: Skipping host $hostname: invalid IPv6 address\n";
Packit 667938
                return 'DEADHOST';
Packit 667938
            }
Packit 667938
        } else {
Packit 667938
            # Hostname. Look it up
Packit 667938
            my @res;
Packit 667938
            my ($too,$port,$otheropts) = split(':', $$target{SnmpOpt}, 3);
Packit 667938
            $port = 161 unless defined $port;
Packit 667938
            @res = getaddrinfo($hostname, $port, Socket::AF_UNSPEC(), Socket::SOCK_DGRAM());
Packit 667938
            if (scalar (@res) < 5) {
Packit 667938
                warn "$NOW: WARNING: Skipping host $hostname as it does not resolve to an IPv4 or IPv6 address\n";
Packit 667938
                return 'DEADHOST';
Packit 667938
            }
Packit 667938
        }
Packit 667938
    }
Packit 667938
  RETRY:
Packit 667938
    my @ifnum = ();
Packit 667938
    my @OID = ();
Packit 667938
    # Find apropriate Interface to poll from
Packit 667938
    for my $i (0..1) {
Packit 667938
	if ($$target{IfSel}[$i] eq 'If') {
Packit 667938
	    $ifnum[$i] = ".".$$target{Key}[$i];
Packit 667938
	    debug('snpo',"simple If: $ifnum[$i]");
Packit 667938
	} elsif($$target{IfSel}[$i] eq 'None') {
Packit 667938
            $ifnum[$i] = "";
Packit 667938
        } else {
Packit 667938
            $$target{Key}[$i] =~ s/\s+$//; # no trainling whitespace in keys ...
Packit 667938
Packit 667938
	    if (not defined readfromcache($confcache,$hostkey,$$target{IfSel}[$i],$$target{Key}[$i])) {
Packit 667938
		debug('snpo',"($i) Populate ConfCache for $$target{Host}$$target{SnmpOpt}");
Packit 667938
		populateconfcache($confcache,"$$target{Community}\@$$target{Host}$$target{SnmpOpt}",$$target{ipv4only},1,$$target{snmpoptions});
Packit 667938
		$$populated{$hostname} = 1; # set cache population to true for this cycle and host
Packit 667938
	    }
Packit 667938
 	    if (not defined readfromcache($confcache,$hostkey,$$target{IfSel}[$i],$$target{Key}[$i])) {
Packit 667938
                warn "$NOW: WARNING: Could not match host:'$$target{Community}\@$$target{Host}$$target{SnmpOpt}' ref:'$$target{IfSel}[$i]' key:'$$target{Key}[$i]'\n";
Packit 667938
		return 'NOMATCH';
Packit 667938
	    } else {
Packit 667938
		$ifnum[$i] = ".".readfromcache($confcache,$hostkey,$$target{IfSel}[$i],$$target{Key}[$i]);
Packit 667938
		debug('snpo',"($i) Confcache Match $$target{Key}[$i] -> $ifnum[$i]");
Packit 667938
	    }
Packit 667938
	}
Packit 667938
	if ($ifnum[$i] !~ /^$|^\.\d+$/) {
Packit 667938
	    warn "$NOW: WARNING: Can not determine".
Packit 667938
	      " ifNumber for $$target{Community}\@$$target{Host}$$target{SnmpOpt} \tref: '$$target{IfSel}[$i]' \tkey: '$$target{Key}[$i]'\n";
Packit 667938
	    return 'NOMATCH';
Packit 667938
	}
Packit 667938
    }
Packit 667938
    for my $i (0..1) {
Packit 667938
	# add ifget methodes call for a cross check;
Packit 667938
	for ($$target{IfSel}[$i]) {
Packit 667938
	    /^Eth$/ && do {
Packit 667938
		push @OID, "ifPhysAddress".$ifnum[$i]; last
Packit 667938
	    };
Packit 667938
	    /^Ip$/ && do {
Packit 667938
		push @OID, "ipAdEntIfIndex".".".$$target{Key}[$i];last
Packit 667938
	    };
Packit 667938
	    /^Descr$/ && do {
Packit 667938
		push @OID, "ifDescr".$ifnum[$i]; last
Packit 667938
	    };
Packit 667938
	    /^Type$/ && do {
Packit 667938
		push @OID, "ifType".$ifnum[$i]; last
Packit 667938
	    };
Packit 667938
	    /^Name$/ && do {
Packit 667938
		push @OID, "ifName".$ifnum[$i]; last
Packit 667938
	    };
Packit 667938
	}
Packit 667938
	push @OID ,$$target{OID}[$i].$ifnum[$i];
Packit 667938
    }
Packit 667938
    # we also want to know uptime and system name unless we are
Packit 667938
    if ( not defined $$cfg{nomib2} and $$cfg{logformat} ne 'rrdtool' ) {
Packit 667938
      if ( $OID[0] !~ /^cache.+$/ and
Packit 667938
           $OID[0] !~ /^\Q1.3.6.1.4.1.3495.1\E/ ) {
Packit 667938
           push @OID, qw(sysUptime sysName);
Packit 667938
      } else {
Packit 667938
           push @OID, qw(cacheUptime cacheSoftware cacheVersionId)
Packit 667938
      }
Packit 667938
    }
Packit 667938
Packit 667938
    # pull that data
Packit 667938
    debug('snpo',"SNMPGet from $$target{Community}\@$$target{Host}$$target{SnmpOpt} -- ".(join ",", @OID));
Packit 667938
    my @ret;
Packit 667938
    
Packit 667938
    # make sure we have no error messages hanging round.
Packit 667938
    
Packit 667938
    $SNMP_Session::errmsg = undef;
Packit 667938
    $Net_SNMP_util::ErrorMessage = undef;
Packit 667938
Packit 667938
    my $targtemp = $$target{Community}.'@'.$$target{Host}.$$target{SnmpOpt};
Packit 667938
    $targtemp = v4onlyifnecessary($targtemp, $$target{ipv4only});
Packit 667938
    
Packit 667938
    my @snmpoids = grep !/^(Pseudo|WaLK|GeTNEXT|CnTWaLK)|IndexPOS/, @OID;
Packit 667938
        
Packit 667938
    if (defined $$cfg{singlerequest}){
Packit 667938
#LH        local $BER::pretty_print_timeticks = 0;
Packit 667938
	foreach my $oid (@snmpoids){
Packit 667938
            push @ret, snmpget($targtemp,$$target{snmpoptions},$oid);
Packit 667938
	}
Packit 667938
    } else {
Packit 667938
	@ret = snmpget($targtemp,$$target{snmpoptions},@snmpoids);
Packit 667938
    }
Packit 667938
    my @newret;
Packit 667938
    for (@OID) {
Packit 667938
        /^PseudoZero$/ && do { push @newret, 0; next; };
Packit 667938
        /^PseudoOne$/ && do { push @newret, 1; next; };
Packit 667938
        s/^WaLK(\d*)// && do { my $idx = $1 || 0; my $oid=$_;push @newret, (split /:/, (snmpwalk($targtemp,$$target{snmpoptions},$oid))[$idx],2)[1]; 
Packit 667938
                          debug('snpo',"snmpwalk '$oid' -> ".($newret[-1]||'UNDEF'));next};
Packit 667938
        s/^GeTNEXT// && do { my $oid=$_;push @newret, (split /:/, snmpgetnext($targtemp,$$target{snmpoptions},$oid),2)[1]; 
Packit 667938
                          debug('snpo',"snmpgetnext '$oid' -> ".($newret[-1]||'UNDEF'));next};
Packit 667938
	s/^CnTWaLK// && do { my $oid=$_;my @insts= (snmpwalk($targtemp,$$target{snmpoptions},$_)); 
Packit 667938
	    		undef @insts if( $insts[1] || '') =~/no/i; push @newret, scalar @insts;
Packit 667938
			debug('snpo',"snmpCountwalk '$oid' -> ".($newret[-1]||'UNDEF'));next};
Packit 667938
        /IndexPOS.*\.(\d*)/ && do { my $idx=$1; s/IndexPOS/$idx/; s/\.\d*$//; push @newret, snmpget($targtemp,$$target{snmpoptions},$_); 
Packit 667938
                          debug('snpo', "snmpget of oid '$_' after replacement of IndexPOS"); next};
Packit 667938
        push @newret, shift @ret;
Packit 667938
    }
Packit 667938
    @ret = @newret;
Packit 667938
    debug('snpo',"SNMPfound -- ".(join ", ", map {"'".($_||"undef")."'"}  @ret));
Packit 667938
    $ret[-2] = $ret[-2].' '.$ret[-1] if $OID[-1] and $OID[-1] eq 'cacheVersionId';
Packit 667938
    my $time = time;
Packit 667938
    my @final;
Packit 667938
    # lets do some reality check
Packit 667938
    for my $i (0..1) {
Packit 667938
	# some ifget methodes call for a cross check;
Packit 667938
	for ($$target{IfSel}[$i]) {
Packit 667938
	    /^Eth$/ && do {
Packit 667938
		my $bin = shift @ret || 0xff;
Packit 667938
		my $eth = unpack 'H*', $bin;
Packit 667938
		my @eth;
Packit 667938
		while ($eth =~ s/^..//){
Packit 667938
		    push @eth, $&;
Packit 667938
		}
Packit 667938
		my $phys=join '-', @eth;
Packit 667938
		if ($phys ne $$target{Key}[$i]) {
Packit 667938
		    debug('snpo', "($i) eth if crosscheck got $phys expected $$target{Key}[$i]");
Packit 667938
		    if (not $retry) {
Packit 667938
			$retry=1;
Packit 667938
			# remove broken entry
Packit 667938
			storeincache($confcache,$hostkey,$$target{IfSel}[$i],$$target{Key}[$i],undef);
Packit 667938
			debug('repo',"($i) goto RETRY force if cache repopulation");
Packit 667938
			goto RETRY;
Packit 667938
		    } else {
Packit 667938
			warn "$NOW: WARNING: could not match&get".
Packit 667938
			    " $$target{Host}$$target{SnmpOpt}/$$target{OID}[$i] for Eth $$target{Key}[$i]\n";
Packit 667938
			return 'NOMATCH';
Packit 667938
		    }
Packit 667938
		};
Packit 667938
		debug ('snpo',"($i) Eth crosscheck OK");
Packit 667938
	    };
Packit 667938
	    /^Ip$/ && do {
Packit 667938
		my $if = shift @ret || 'none';
Packit 667938
		if ($ifnum[$i] ne '.'.$if) {
Packit 667938
		    debug('repo', "($i) IP if crosscheck got .$if expected $ifnum[$i]");
Packit 667938
		    if (not $retry) {
Packit 667938
			$retry=1;
Packit 667938
			# remove broken entry
Packit 667938
			storeincache($confcache,$hostkey,$$target{IfSel}[$i],$$target{Key}[$i],undef);   
Packit 667938
			debug('repo',"($i) goto RETRY force if cache repopulation");
Packit 667938
			goto RETRY;
Packit 667938
		    } else {
Packit 667938
			warn "$NOW: WARNING: could not match&get".
Packit 667938
			    " $$target{Host}$$target{SnmpOpt}/$$target{OID}[$i] for IP $$target{Key}[$i]\n";
Packit 667938
			return 'NOMATCH';
Packit 667938
		    }
Packit 667938
		}
Packit 667938
		debug ('snpo',"($i) IP crosscheck OK");
Packit 667938
	    };
Packit 667938
	    /^(Descr|Name|Type)$/ && do {
Packit 667938
		my $descr = shift @ret || 'Empty';
Packit 667938
                $descr =~ s/[\0- ]+$//; # remove excess spaces and stuff
Packit 667938
		if ($descr ne $$target{Key}[$i]) {
Packit 667938
		    debug('repo', "($i) $_ if crosscheck got $descr expected $$target{Key}[$i]");
Packit 667938
		    if (not $retry) {
Packit 667938
			$retry=1;
Packit 667938
			# remove broken entry
Packit 667938
			storeincache($confcache,$hostkey,$$target{IfSel}[$i],$$target{Key}[$i],undef);   
Packit 667938
			debug('repo',"($i) goto RETRY force if cache repopulation");
Packit 667938
			goto RETRY;
Packit 667938
		    } else {
Packit 667938
			warn "$NOW: WARNING: could not match&get".
Packit 667938
			    " $$target{Host}$$target{SnmpOpt}/$$target{OID}[$i] for $_ '$$target{Key}[$i]'\n";
Packit 667938
			return 'NOMATCH';
Packit 667938
		    }
Packit 667938
		} 
Packit 667938
		debug ('snpo',"($i) $_ crosscheck OK");
Packit 667938
	    };
Packit 667938
	}
Packit 667938
	# no sense continuing here ... if there is no data ...      
Packit 667938
 	if (defined $SNMP_Session::errmsg and $SNMP_Session::errmsg =~ /no response received/){
Packit 667938
            $SNMP_Session::errmsg = undef;
Packit 667938
	    warn "$NOW: WARNING: skipping because at least the query for $OID[0] on  $$target{Host} did not succeed\n";
Packit 667938
	    return 'DEADHOST';
Packit 667938
        }
Packit 667938
 	if (defined $Net_SNMP_util::ErrorMessage and $Net_SNMP_util::ErrorMessage =~ /No response from remote/){
Packit 667938
            $Net_SNMP_util::ErrorMessage = undef;
Packit 667938
	    warn "$NOW: WARNING: skipping because at least the query for $OID[0] on  $$target{Host} did not succeed\n";
Packit 667938
	    return 'DEADHOST';
Packit 667938
	}	
Packit 667938
	if ($$target{OID}[$i] =~ /if(Admin|Oper)Hack/) {
Packit 667938
	    push @final, ((shift @ret) == 1) ? 1:0;
Packit 667938
	} else {
Packit 667938
	    push @final, shift @ret;
Packit 667938
	}
Packit 667938
    }
Packit 667938
    
Packit 667938
    my @res = ( @final,$time, @ret);
Packit 667938
    
Packit 667938
    # Convert in and out values to integers with a user-defined subroutine
Packit 667938
    # specified by the Conversion target key
Packit 667938
    if( $target->{ Conversion } ) {
Packit 667938
        foreach my $ri( 0..1 ) {
Packit 667938
            next unless defined $res[ $ri ];
Packit 667938
	    local $SIG{__DIE__};
Packit 667938
            my $exp = "&MRTGConversion::$target->{ Conversion }( \$res[\$ri] )";
Packit 667938
            $res[ $ri ] = eval $exp;
Packit 667938
            warn "$NOW: WARNING: evaluation of \"$exp\" failed\n$@\n" if $@;
Packit 667938
        }
Packit 667938
    }
Packit 667938
Packit 667938
    # have some cleanup first, it seems that some agents
Packit 667938
    # are adding newlines to what they return
Packit 667938
    map{ $_ =~ s/\n|\r//g if defined $_ } @res;
Packit 667938
    map{ $_ =~ s/^\s+//g if defined $_ } @res;
Packit 667938
    map{ $_ =~ s/\s+$//g if defined $_ } @res;
Packit 667938
    
Packit 667938
    # in and out should be numbers only
Packit 667938
	for my $ri (0..1){
Packit 667938
	    # for folks using rrdtool I am allowing numbers 
Packit 667938
	    # with decimals here
Packit 667938
	    if ( defined $res[$ri] and $res[$ri] !~ /^[-+]?\d+(.\d+)?$/ ) {
Packit 667938
		warn "$NOW: WARNING: Expected a number but got '$res[$ri]'\n";
Packit 667938
		$res[$ri] = undef;
Packit 667938
		
Packit 667938
	    }
Packit 667938
	}
Packit 667938
	return @res;
Packit 667938
    }
Packit 667938
Packit 667938
Packit 667938
# read target function ...
Packit 667938
sub readtargets ($$$) {
Packit 667938
    my ($confcache,$target,$cfg) = @_;
Packit 667938
    my $forks = $$cfg{forks};
Packit 667938
    my $trgnum = $#{$target}+1;
Packit 667938
    if (defined $forks and $forks > 1  and $trgnum > 1){
Packit 667938
        $forks = $trgnum if $forks > $trgnum;
Packit 667938
        my $split = int($trgnum / $forks) + 1;       
Packit 667938
	my @hand;
Packit 667938
	# get them forks to work ... 
Packit 667938
	for (my $i = 0; $i < $forks;$i++) {
Packit 667938
	    local *D;
Packit 667938
            my $sleep_count=0;
Packit 667938
            my $pid;
Packit 667938
            do {
Packit 667938
               $pid = open(D, "-|");
Packit 667938
                unless (defined $pid) {
Packit 667938
                    warn "$NOW: WARNING cannot fork: $!\n";
Packit 667938
                    die "$NOW: ERROR bailing out after 6 failed forkattempts"
Packit 667938
                         if $sleep_count++ > 6;
Packit 667938
                    sleep 10;
Packit 667938
                }
Packit 667938
            } until defined $pid;
Packit 667938
	    if ($pid) { # parent
Packit 667938
     		$hand[$i] = *D; # funky file handle magic ... 
Packit 667938
		debug ('fork',"Parent $$ after fork of child $i");
Packit 667938
	    } else {  # child
Packit 667938
		debug ('fork',"Child $i ($$) after fork");
Packit 667938
		my $res = "";
Packit 667938
                my %deadhost;
Packit 667938
                my %populated;
Packit 667938
		for (my $ii = $i * $split; 
Packit 667938
		     $ii < ($i+1) * $split and $ii < $trgnum;
Packit 667938
		     $ii++){
Packit 667938
		    my $targ = $$target[$ii];
Packit 667938
		    my @res;
Packit 667938
		    if ($$targ{Methode} eq 'EXEC') {
Packit 667938
			@res = getexternal($$targ{Command});
Packit 667938
		    } else { # parent
Packit 667938
                        if (not $deadhost{$$targ{Community}.$$targ{Host}}) {      
Packit 667938
        	  	    @res = getsnmparg($confcache,$targ,$cfg,\%populated);
Packit 667938
                            if ( $res[0] and $res[0] eq 'DEADHOST') {
Packit 667938
                                # guess we got a blank here
Packit 667938
                                @res = ( undef,undef,time,undef,undef);
Packit 667938
                                $deadhost{$$targ{Community}.$$targ{Host}} = 1;
Packit 667938
                                warn "$NOW: WARNING: no data for $$targ{OID}[0]&$$targ{OID}[1]:$$targ{Community}\@$$targ{Host}. Skipping further queries for Host $$targ{Host} in this round.\n"
Packit 667938
                            } elsif ($res[0] and $res[0] eq 'NOMATCH'){
Packit 667938
                                @res = (undef,undef,time,undef,undef);
Packit 667938
                            }
Packit 667938
                        } else {
Packit 667938
                            @res = ( undef,undef,time,undef,undef);
Packit 667938
                        }
Packit 667938
		    }
Packit 667938
		
Packit 667938
		    for (my $iii=0;$iii<5;$iii++){
Packit 667938
			if (defined $res[$iii]){
Packit 667938
                            $res .= "$res[$iii]\n";
Packit 667938
			} else {
Packit 667938
                            $res .= "##UNDEF##\n";
Packit 667938
			}
Packit 667938
		    }
Packit 667938
		}
Packit 667938
		debug ('fork',"Child $i ($$) waiting to deliver");
Packit 667938
		print $res; # we only talk after the work has been done to
Packit 667938
                  	    # otherwhise we might get blocked 
Packit 667938
                # return updated hosts from confcache
Packit 667938
                writeconfcache($confcache,'&STDOUT')
Packit 667938
                        if defined $$confcache{___updated};
Packit 667938
		exit 0;
Packit 667938
	    }
Packit 667938
	    
Packit 667938
	}
Packit 667938
	# happy reaping ... 
Packit 667938
        my $vin =''; # vector of pipe file-descriptors from children
Packit 667938
	for (my $i = 0; $i < $forks;$i++) {
Packit 667938
            vec($vin, fileno($hand[$i]), 1) = 1;
Packit 667938
        }
Packit 667938
        my $left = $forks;
Packit 667938
        while ($left) {
Packit 667938
            my $rout = $vin; # read vector
Packit 667938
            my $eout = $vin; # exception vector
Packit 667938
            my $nfound = select($rout, undef, $eout, undef); # no timeout
Packit 667938
            if (1 > $nfound) {
Packit 667938
               die sprintf("$NOW: ERROR: select returned %d: $!\n", $nfound);
Packit 667938
            }
Packit 667938
	    for (my $i = 0; $i < $forks; $i++) {
Packit 667938
                next unless defined $hand[$i] and defined fileno($hand[$i]);
Packit 667938
# this does not seem to work reliably
Packit 667938
#                if (vec($eout, fileno($hand[$i]), 1)) {
Packit 667938
#		   die "$NOW: ERROR: fork $i has died ahead of time?\n";
Packit 667938
#                }
Packit 667938
                next unless vec($rout, fileno($hand[$i]), 1);
Packit 667938
Packit 667938
                vec($vin, fileno($hand[$i]), 1) = 0; # remove this child fd
Packit 667938
Packit 667938
	        debug ('fork',"Parent reading child $i");
Packit 667938
	        my $h = $hand[$i];
Packit 667938
	        for (my $ii = $i * $split; 
Packit 667938
		     $ii < ($i+1) * $split and $ii < $trgnum;
Packit 667938
		     $ii++){ 
Packit 667938
		    my $targ = $$target[$ii];
Packit 667938
		    my @res;
Packit 667938
		    for (0..4){
Packit 667938
		        my $line = <$h>; # must be a simple scalar here else it wont work
Packit 667938
		        die "$NOW: ERROR: fork $i has died ahead of time ...\n" if not defined $line;
Packit 667938
		        chomp $line;
Packit 667938
    #                    debug ('fork',"reading for $ii $line");
Packit 667938
		        $line = undef if $line eq "##UNDEF##";                
Packit 667938
		        push @res,$line;
Packit 667938
		    };
Packit 667938
    
Packit 667938
		    ($$targ{_IN_},
Packit 667938
		     $$targ{_OUT_},
Packit 667938
		     $$targ{_TIME_},
Packit 667938
		     $$targ{_UPTIME_},
Packit 667938
		     $$targ{_NAME_}) = @res; 
Packit 667938
                     if ($] >= 5.0061){
Packit 667938
                         $$targ{_IN_} = Math::BigFloat->new($$targ{_IN_}) if $$targ{_IN_};
Packit 667938
                         $$targ{_OUT_} = Math::BigFloat->new($$targ{_OUT_}) if $$targ{_OUT_};
Packit 667938
                     }
Packit 667938
                }     
Packit 667938
                # feed confcache entries
Packit 667938
                my $lasthost ="";
Packit 667938
                while (<$h>){
Packit 667938
                    chomp;
Packit 667938
                    my ($host,$method,$key,$value) = split (/\t/, $_);
Packit 667938
                    if ($host ne $lasthost){
Packit 667938
        	         debug ('fork',"start clearing confcache on first entry for target $host");
Packit 667938
                         clearfromcache($confcache,$host);
Packit 667938
        	         debug ('fork',"finished clearing confcache");        
Packit 667938
                    }
Packit 667938
                    $lasthost = $host;
Packit 667938
                    storeincache($confcache,$host,$method,$key,$value);
Packit 667938
                 }
Packit 667938
                 close $h;
Packit 667938
                 --$left;
Packit 667938
            }
Packit 667938
        }
Packit 667938
	            
Packit 667938
    } else {
Packit 667938
        my %deadhost;
Packit 667938
        my %populated;
Packit 667938
	foreach my $targ (@$target) {
Packit 667938
	    if ($$targ{Methode} eq 'EXEC') {
Packit 667938
		debug('snpo', "run external $$targ{Command}");
Packit 667938
		($$targ{_IN_},
Packit 667938
		 $$targ{_OUT_},
Packit 667938
		 $$targ{_TIME_},
Packit 667938
		 $$targ{_UPTIME_},
Packit 667938
		 $$targ{_NAME_}) = getexternal($$targ{Command});
Packit 667938
	    } elsif ($$targ{Methode} eq 'SNMP' and not $deadhost{$$targ{Host}}) {
Packit 667938
		debug('snpo', "run snmpget from $$targ{OID}[0]&$$targ{OID}[1]:$$targ{Community}\@$$targ{Host}");
Packit 667938
		($$targ{_IN_},
Packit 667938
		 $$targ{_OUT_},
Packit 667938
		 $$targ{_TIME_},
Packit 667938
		 $$targ{_UPTIME_},
Packit 667938
		 $$targ{_NAME_}) = getsnmparg($confcache,$targ,$cfg,\%populated);
Packit 667938
               if ( $$targ{_IN_} and $$targ{_IN_} eq 'DEADHOST') {
Packit 667938
                   $$targ{_IN_} = undef;
Packit 667938
                   $$targ{_TIME_} =time;
Packit 667938
                   # guess we got a blank here
Packit 667938
                   $deadhost{$$targ{Host}} = 1;
Packit 667938
                   warn "$NOW: WARNING: no data for $$targ{OID}[0]&$$targ{OID}[1]:$$targ{Community}\@$$targ{Host}. Skipping further queries for Host $$targ{Host} in this round.\n"
Packit 667938
               } 
Packit 667938
               if (  $$targ{_IN_} and $$targ{_IN_} eq 'NOMATCH') {   
Packit 667938
                   $$targ{_IN_} = undef;
Packit 667938
                   $$targ{_TIME_} =time;
Packit 667938
               }
Packit 667938
       
Packit 667938
	    } else {
Packit 667938
                 $$targ{_IN_} = undef;
Packit 667938
                 $$targ{_OUT_} = undef;
Packit 667938
                 $$targ{_TIME_} = time;
Packit 667938
                 $$targ{_UPTIME_} = undef;
Packit 667938
                 $$targ{_NAME_} = undef;
Packit 667938
            }
Packit 667938
            if ($] >= 5.008 ){
Packit 667938
                    $$targ{_IN_} = new Math::BigFloat "$$targ{_IN_}" if $$targ{_IN_};
Packit 667938
                    $$targ{_OUT_} = new Math::BigFloat "$$targ{_OUT_}" if $$targ{_OUT_};
Packit 667938
            }
Packit 667938
                
Packit 667938
	}       
Packit 667938
    }
Packit 667938
        
Packit 667938
}
Packit 667938
Packit 667938
sub imggen ($) {
Packit 667938
        my $dir = shift;
Packit 667938
        if ( ! -r "$dir${main::SL}mrtg-l.png" and  open W, ">$dir${main::SL}mrtg-l.png" ){
Packit 667938
                binmode W;
Packit 667938
                print W unpack ('u', <<'UUENC');
Packit 667938
MB5!.1PT*&@H    -24A$4@   #\    9! ,   !TA.O'    &%!,5$5]9GTT
Packit 667938
M79A?8HB(9WFR;6G_=DWM=%35<5R_M[A2     6)+1T0'%F&(ZP   1%)1$%4
Packit 667938
M>-JMDKUOPD ,Q:E4]CH?S0PMG8-.$6L1A*YMJ,D<T>Q%5?[_ON>$Y (2$R>=
Packit 667938
MY;-^OF=;GNCM\SFY#_#GW$IU0WMP/#O5HSGNW8"9R)/92$NQ\Z:GUDG/@.@!
Packit 667938
M)CP#4H\ >LT>)NB!A0]8,"]&0.(#WY92V<\$=FM4
Packit 667938
MX.<2+4VH!U01B-LYX#V3B*U(1N 5[K,/?(G,)1!!9-%WX0.HYX7 :0!"]0&4
Packit 667938
MMV*/Z"/N@&8$P,N8!:FD[!4\ #7EN$G1 
Packit 667938
M+KI@K$9V#B"P03V,!\5)T]1T#*A,8P"P.%JZ1USGL%%IPTC.#
Packit 667938
M6*MJXQ-D&    $-T15AT4V]F='=A
Packit 667938
M(#DY+S Y+S Q(&-R:7-T>4!M>7-T:6,N97,N9'5P;VYT+F-O;>WHV?     J
Packit 667938
M=$58=%-I9VYA='5R90!D,C(W8S
Packit 667938
K8ULTB'X    .=$58=%!A9V4 -C-X,C4K,"LP&!)XE     !)14Y$KD)@@F(Y
Packit 667938
UUENC
Packit 667938
close W;
Packit 667938
        }
Packit 667938
        if ( ! -r "$dir${main::SL}mrtg-m.png" and  open W, ">$dir${main::SL}mrtg-m.png" ){
Packit 667938
                binmode W;
Packit 667938
                print W unpack ('u', <<'UUENC');
Packit 667938
MB5!.1PT*&@H    -24A$4@   !D    9! ,    VQYA0    &%!,5$5]9GTT
Packit 667938
M79A588QN9(*7:73_=DWL=%31
Packit 667938
M>-IC"$4"!0P$>"E&2B:I,%Z((!"(I$)X88H@GJ :A)<$Y@@*I8)YAA">("N(
Packit 667938
M%PYD"#L+"IJ#Y4!FN(86N4',# )J"4TO*R\O!_$"@::'@HTEQ /K _&$0+P 
Packit 667938
M(.T:6@A2@62?H#B*6TRQN#,
Packit 667938
M0W1%6'13;V9T=V%R90! *",I26UA9V5-86=I8VL@-"XR+CD@.3DO,#DO,#$@
Packit 667938
M8W)I<W1Y0&UY<W1I8RYE<RYD=7!O;G0N8V]M[>C9\    "IT15AT4VEG;F%T
Packit 667938
M=7)E #1E,S8X-S$P,38Q-S)A96%B.3,Y8SEA,F5D-31B86(U@DWZ,@    ET
Packit 667938
M15AT1&5L87D ,C4P(RC.$P    YT15AT4&%G90 R-7@R-2LP*S"#D2 ?    
Packit 667938
) $E%3D2N0F""
Packit 667938
UUENC
Packit 667938
close W;
Packit 667938
        }
Packit 667938
        if ( ! -r "$dir${main::SL}mrtg-r.png" and  open W, ">$dir${main::SL}mrtg-r.png" ){
Packit 667938
                binmode W;
Packit 667938
                print W unpack ('u', <<'UUENC');
Packit 667938
MB5!.1PT*&@H    -24A$4@   80    9! ,   ##'$3)    &%!,5$4T79@\
Packit 667938
M8YQ5=JAPC;>:K\S\_?[5WNFZR-PB%CO!     6)+1T0'%F&(ZP  !=5)1$%4
Packit 667938
M>-KM6$ESVE@0;BW 58: K_)"YDH(.%=YL/"511)7O""N3AS!WY_^NM^3Q)+,
Packit 667938
M4C55DZJ1*2&]U]O7Z\,4T"]__0_A;US.O\7$$#H*PR=R[_'@#? A9X3KLW,K
Packit 667938
MNRX_*L=MGK^#PQ)[$USW+J@'U)E,!JI<V>GS9"+RG0^B!(NDM,ZMB'G,M_?6
Packit 667938
MF@^[_#7D[U)*!V_N!#+4$)>M@+Z(.J/1)PNAI4]=5K# 0_,)'Z(4UXH*A<#/
Packit 667938
M2SQ\3+?[=!F4Q&M?Z!8@2-?4X+O*L^Q\$PPQ;MA.R= 65RRWR/:[U&#PTVR_
Packit 667938
MR4*JI#3?9#E-$U)#W)5*GE&3[Y&!T%P+?QR2)U;UUOB(0@A0"-Z*.AOVC)=^
Packit 667938
MY=L&-T/L"$G !,KBW"V-3PU[.\8W@5N7J)W(?L'&WB5LP6_*X10OP+2L21G/
Packit 667938
MH7OA=#:1&M)F-1FI\^A+8B&H %;A+\U>LP8A)HN^RZOC9^BZY#=#_&10NA8"
Packit 667938
M.5E !^R7H/2R=0G!6PH%1\%-!W@<"GU+PN4Q.Z2D6-K!2-;D]-=J"-2H?&C>
Packit 667938
M7"B$ABCW."HV-PX@%"6$YHS<3:@.K!$K2;N"4-0A\)X'.R[?%R4$MXQ"TT9,
Packit 667938
M7*Y:IP)!8N0L=Z0IVUJH(9!51H%B1)9A]$%,S3QB[_P0 EA;B\ W*KM/%?%Q
Packit 667938
M%*@8'$*0K?Y@54'0*+ !XZ@&P;C'2N$W?SU&\BX"Z"YKH08ATBB,^WCHW[U5
Packit 667938
MCK6U$!U'H3$WA9<<1\%+2I8R"H:]@ZT=Q8%9LK1%Z!1AA< XH902XAM@X#<;
Packit 667938
MA?;J) HL-F[!KJ*U%KC:D
Packit 667938
M4XWWZ^$U)]+-]? "M9#5YI*_+%^LE''@S[5Q]&951\J&PYL0-FJ],-<4J>DD
Packit 667938
M_NQ\.9M$RD9?TE!AX\HJ8E,+IJE^'Q6+.H1X\K#A;V\FI.B6F=)&B$+E>'9T
Packit 667938
M51>-EPD:$VVE;#C>'CJ2:=.FJ?9>1_'20-CQ'_ESAN"5Y?Q4LT'=SFS?^.7*
Packit 667938
MYFU%;!(IFTP>!K!Q%=8AL.)7D@8/AL;K:#3A#LW#*>0H> <0(-"]YF!:*>X2
Packit 667938
MUG&GD;D08Z0] ,((4XWG0O;)0-@2UTPW8@V^G0NG46BO^FNB,@I.7A$?EO.W
Packit 667938
MK+1)V<4R&H<$E]MR-K7@GD!HB;DL!4G%N>VP;?YJCPE?\''#<:4C!?S7?-IH
Packit 667938
MXG%'2N"B.&2Y/^M(*ZE!6PM.]L..5#4997
Packit 667938
M+B$% [N;Y?E&PQ<80[RJG)_Z(@Q;TERV&)DG48AJY>R@5W:5"SWE* JV([U5
Packit 667938
M*6W8H>EBM=_O>9B8CF2C0)M:.1L)@-*(!$_\^+C?S8TF.FJJO;6?& AP20*A
Packit 667938
MB6DR[*FS':G[7)5<
Packit 667938
M^! "2],!%$B88CAS9?S S>_,&2F1-N>:+LBJ2^+#Z1Q1?WV02(3PR2/
Packit 667938
M8Q.O/]<@&#R
Packit 667938
M3V<3W\H#'^=H&(1Z-F<D4PNA"F+#Y+TKRSC#,!DG/8=#*D;C73LC60B>'*IX
Packit 667938
M=,_1!P+ %2,A]5Q'TBSR49QN_$P5\?$9Z>2 P=;DXN8B..I(+ 2/'76SBU,P
Packit 667938
MC9=6BD28R\^O)=+1&2E2"#/C%CX7M++)J&#SFMP*GD^F,_SCC+.'42'H+;&)
Packit 667938
M0LH]YTU8>HM#"!3_GI@4.:R%*_3\U\EC:M+I8_I]-,T&9*3H0:4U/RYG:-+9
Packit 667938
M):7)9D,JX$_9*=,TW>)74"X0F@ Y50B83W?\'H!$"]80*XF;"P2P>%NUJ&2_
Packit 667938
M?-51V7N3)7)?E!]B_$V:OMMJ^,+CZMYPMK??9;'SXBG"J;4C%PBPVX5^T]1"
Packit 667938
M6U-M/;K_[#>U>Q4<$?_I=?&SS>NP_(5\X=Z<
Packit 667938
MO\3U!QLJ>FT="M4^    0W1%6'13;V9T=V%R90! *",I26UA9V5-86=I8VL@
Packit 667938
M-"XR+CD@.3DO,#DO,#$@8W)I<W1Y0&UY<W1I8RYE<RYD=7!O;G0N8V]M[>C9
Packit 667938
M\    "IT15AT4VEG;F%T=7)E #$R,3
Packit 667938
M9F,T,S9ELPXRP0    ]T15AT4&%G90 S.#AX,C4K,"LP4K-IB0    !)14Y$
Packit 667938
$KD)@@C9E
Packit 667938
UUENC
Packit 667938
close W;
Packit 667938
        }
Packit 667938
Packit 667938
}
Packit 667938
Packit 667938
# Local Variables:
Packit 667938
# mode: cperl
Packit 667938
# eval: (cperl-set-style "PerlStyle")
Packit 667938
# mode: flyspell
Packit 667938
# mode: flyspell-prog
Packit 667938
# End:
Packit 667938
#
Packit 667938
# vi: sw=4