Blame local/snmpcheck.def

Packit fcad23
#!/usr/local/bin/perl -w
Packit fcad23
Packit fcad23
use strict 'refs';
Packit fcad23
require Net::Ping;
Packit fcad23
require Term::ReadKey;
Packit fcad23
Packit fcad23
#defaults
Packit fcad23
$mibident=".ERRORNAME";
Packit fcad23
$miberrflag=".ERRORFLAG";
Packit fcad23
$miberrmsg=".ERRORMSG";
Packit fcad23
$mibfix=".ERRORFIX";
Packit fcad23
$mibheadall=".EXTENSIBLEDOTMIB";
Packit fcad23
$mibclearcache="$mibheadall.VERSIONMIBNUM.VERCLEARCACHE";
Packit fcad23
$mibrestartagent="$mibheadall.VERSIONMIBNUM.VERRESTARTAGENT";
Packit fcad23
$mibupdateconfig="$mibheadall.VERSIONMIBNUM.VERUPDATECONFIG";
Packit fcad23
%miblist=(    '.PROCMIBNUM.1' => 'processes',
Packit fcad23
	      '.SHELLMIBNUM.1' => 'scripts',
Packit fcad23
	      '.MEMMIBNUM' => 'swap space',
Packit fcad23
	      '.DISKMIBNUM.1' => 'disks',
Packit fcad23
	      '.LOADAVEMIBNUM.1' => 'load-average',
Packit fcad23
	      '.ERRORMIBNUM' => 'snmp-agent-errors');
Packit fcad23
@fixitlist=('.PROCMIBNUM.1','.SHELLMIBNUM.1');
Packit fcad23
%mibchecklist = ('.PROCMIBNUM.1' => 1,
Packit fcad23
		 '.SHELLMIBNUM.1' => 1,
Packit fcad23
		 '.MEMMIBNUM' => 1,
Packit fcad23
		 '.DISKMIBNUM.1' => 1,
Packit fcad23
		 '.LOADAVEMIBNUM.1' => 1,
Packit fcad23
		 '.ERRORMIBNUM' => 1);
Packit fcad23
$errlog="/net/tyfon/1/OV/log/ece-log";
Packit fcad23
$default_get_args = "-v 1 %s private";
Packit fcad23
$default_set_args = "-v 1 %s private";
Packit fcad23
$andlog=0;
Packit fcad23
$snmppath="BINDIR";
Packit fcad23
$eraseline="                                                                           \r";
Packit fcad23
$fixit=0;  # this should be 0 not -1, but is necessary till getc(STDIN) works
Packit fcad23
$rescanWhen = 300;
Packit fcad23
$display = $ENV{'DISPLAY'};
Packit fcad23
$hidden = 0;
Packit fcad23
$pinghost = 0;
Packit fcad23
$loglevel = 1;
Packit fcad23
$logwindowatstart = 0;
Packit fcad23
$numloglevels = 5;
Packit fcad23
$dontstart = 0;
Packit fcad23
$raiseonnew = 1;
Packit fcad23
Packit fcad23
#
Packit fcad23
#  Mib Package:  Each mib has a mib number attached and can check/fix itself;
Packit fcad23
#
Packit fcad23
Packit fcad23
package Mib;
Packit fcad23
Packit fcad23
# @ISA = qw( Host );
Packit fcad23
Packit fcad23
sub new {
Packit fcad23
    my $tmp = shift;
Packit fcad23
    my $self = {};
Packit fcad23
    $self->{'HostId'} = shift;
Packit fcad23
    $self->{'Host'} = $self->{'HostId'}->{'Name'};
Packit fcad23
    $_ = shift;
Packit fcad23
    $self->{'Mib'} = $_;
Packit fcad23
    print "test: $_\n";
Packit fcad23
    ($self->{'MibSuffix'}) = /(\.[0-9]+)$/;
Packit fcad23
    if (!defined($mibchecklist{$self->{'MibSuffix'}})) {
Packit fcad23
	($self->{'MibSuffix'}) = /(\.[0-9]+\.1)$/;
Packit fcad23
    }
Packit fcad23
    print "suff: $self->{'MibSuffix'}\n";
Packit fcad23
    $self->{'MibDesc'} = shift;
Packit fcad23
    $self->{'Frame'} = shift;
Packit fcad23
    bless $self;
Packit fcad23
}
Packit fcad23
Packit fcad23
sub getmibnum {
Packit fcad23
    my $self = shift;
Packit fcad23
    return ($self->{'Mib'});
Packit fcad23
}
Packit fcad23
Packit fcad23
sub snmp_walk {
Packit fcad23
    my $self = shift;
Packit fcad23
    $self->{'Frame'}->toplevel->Busy() if ($::display);
Packit fcad23
    my $mib = shift;
Packit fcad23
    my $cmd = "$::snmppath/snmpwalk " . sprintf($::default_get_args, $self->{'Host'}) . " $mib|";
Packit fcad23
    ::addToLog("running:  $cmd",5);
Packit fcad23
    open(OUT,"$cmd");
Packit fcad23
    my $outcount = 0;
Packit fcad23
    my @result = [];
Packit fcad23
    while (<OUT>) {
Packit fcad23
	$result[$outcount] = $_;
Packit fcad23
	chop;
Packit fcad23
	::addToLog("snmpwalk:  $_",5);
Packit fcad23
	if ($::display) {
Packit fcad23
	    $self->{'Frame'}->toplevel->update;
Packit fcad23
	}
Packit fcad23
	$outcount++;
Packit fcad23
    }
Packit fcad23
    close(OUT);
Packit fcad23
    for($i=0; $i <= $#result; $i++) {
Packit fcad23
	$result[$i] =~ s/ Hex:.*$//g;
Packit fcad23
	$result[$i] =~ s/\"//g;
Packit fcad23
    }
Packit fcad23
    $self->{'Frame'}->toplevel->Unbusy() if ($::display);
Packit fcad23
    if ($result[0] =~ /No Response/) {
Packit fcad23
	$self->{'HostId'}->hostdown;
Packit fcad23
	splice(@result,0);
Packit fcad23
    }
Packit fcad23
    return @result;
Packit fcad23
}
Packit fcad23
Packit fcad23
sub check {
Packit fcad23
    my $self = shift;
Packit fcad23
    my $tmp = [];
Packit fcad23
    if ($::mibchecklist{$self->{'MibSuffix'}} != 1) {
Packit fcad23
	return @{$tmp};
Packit fcad23
    }
Packit fcad23
    if (! $::display) {
Packit fcad23
	printf "%sChecking %s: %s\r", $::eraseline,$self->{'Host'},
Packit fcad23
	$self->{'MibDesc'};
Packit fcad23
    }
Packit fcad23
    my @walkout = $self->snmp_walk("$self->{'Mib'}$::miberrflag");
Packit fcad23
    while ($#walkout > -1) {
Packit fcad23
	$_ = shift @walkout;
Packit fcad23
	($result) = /= ([0-9]+)/;
Packit fcad23
	if (defined($result) && $result > 0)
Packit fcad23
	{
Packit fcad23
	    ($mibloc) = /\.([0-9]+) /;
Packit fcad23
	    push(@{$tmp},FixProblem::new("",$self->{'HostId'}, $self->{'Mib'},
Packit fcad23
					 $self->{'MibDesc'},
Packit fcad23
					 $mibloc,$self->{'Frame'}));
Packit fcad23
	    if (! $::display) {
Packit fcad23
		printf("%s%-8.8s  %-12.12s  %2d -- %-37.37s",$::eraseline,
Packit fcad23
		       $self->{'Host'},$tmp->[0]->{'ErrName'},
Packit fcad23
		       $result,$tmp->[0]->{'ErrMsg'});
Packit fcad23
		if ($tmp->[0]->canfix() && $::fixit == 0) {
Packit fcad23
		    printf(" / Fix? ");
Packit fcad23
		    $ans = Term::ReadKey::ReadKey(0);
Packit fcad23
		    if ("$ans" eq "y" || "$ans" eq "Y") {
Packit fcad23
			printf("\b\b\b\b\b\b\b\b");
Packit fcad23
			$tmp->[0]->fix($mibloc);     # fix now if curses
Packit fcad23
		    } else {
Packit fcad23
			print $ans;
Packit fcad23
			printf("\nChecking %s: %s\r",$self->{'Host'}, 
Packit fcad23
			       $self->{'MibDesc'});
Packit fcad23
		    }
Packit fcad23
		} elsif ($::fixit > 0) {
Packit fcad23
		    $tmp->[0]->fix($mibloc);     # fix now if curses
Packit fcad23
		}
Packit fcad23
		shift @{$tmp};
Packit fcad23
	    }
Packit fcad23
	}
Packit fcad23
    }
Packit fcad23
    return(@{$tmp});
Packit fcad23
}
Packit fcad23
Packit fcad23
#
Packit fcad23
#  Problem Package: A problem comes into existence when found.  It may
Packit fcad23
#  or may not know how to fix itself (Problem/FixProblem).
Packit fcad23
#
Packit fcad23
Packit fcad23
package Problem;
Packit fcad23
Packit fcad23
@ISA = qw( Mib );
Packit fcad23
Packit fcad23
sub snmp_get {
Packit fcad23
    my $self = shift;
Packit fcad23
    $self->{'Frame'}->toplevel->Busy() if ($::display);
Packit fcad23
    my $mib = shift;
Packit fcad23
    my $args = sprintf($::default_get_args, $self->{'Host'});
Packit fcad23
    $_ = `$::snmppath/snmpget $args $mib`;
Packit fcad23
    my ($result) = /= (.*)$/;
Packit fcad23
    if (!defined($result) || $result =~ /No Response/) {
Packit fcad23
	$self->{'HostId'}->hostdown;
Packit fcad23
	$result = "";
Packit fcad23
    }
Packit fcad23
    $result =~ s/\"//g;
Packit fcad23
    $result =~ s/ Hex:.*$//g;
Packit fcad23
    ::addToLog("snmpget:  $_",5);
Packit fcad23
    $self->{'Frame'}->toplevel->Unbusy() if ($::display);
Packit fcad23
    return $result;
Packit fcad23
}
Packit fcad23
Packit fcad23
sub snmp_set {
Packit fcad23
    my $self = shift;
Packit fcad23
    $self->{'Frame'}->toplevel->Busy() if ($::display);
Packit fcad23
    my $mib = shift;
Packit fcad23
    my $args = sprint($::default_set_args, $self->{'Host'});
Packit fcad23
    $_ = `$::snmppath/snmpset $args $mib`;
Packit fcad23
    my ($result) = /= (.*)$/;
Packit fcad23
    $result = "" if (!defined($result));
Packit fcad23
    $result =~ s/\"//g;
Packit fcad23
    ::addToLog("snmpset:  $_",5);
Packit fcad23
    $self->{'Frame'}->toplevel->Unbusy() if ($::display);
Packit fcad23
    return $result;
Packit fcad23
}
Packit fcad23
Packit fcad23
sub new{
Packit fcad23
    my $tmp = shift;
Packit fcad23
    my $hostId = shift;
Packit fcad23
    my $mib = shift;
Packit fcad23
    my $mibname = shift;
Packit fcad23
    my $self = new Mib ($hostId,$mib,$mibname);
Packit fcad23
    $self->{'MibLocation'} = shift;
Packit fcad23
    $tmp = shift;
Packit fcad23
    if ($::display) {
Packit fcad23
	$self->{'Frame'} = $tmp->Frame();
Packit fcad23
    }
Packit fcad23
    bless $self;
Packit fcad23
    $self->{'ErrName'} = 
Packit fcad23
	$self->snmp_get("$self->{'Mib'}$::mibident.$self->{'MibLocation'}");
Packit fcad23
    $self->{'ErrMsg'} = 
Packit fcad23
	$self->snmp_get("$self->{'Mib'}$::miberrmsg.$self->{'MibLocation'}");
Packit fcad23
    if (exists $self->{'HostId'}->{'Down'}) {
Packit fcad23
	return $self;
Packit fcad23
    }
Packit fcad23
    if ($::display) {
Packit fcad23
	$self->{'Frame'}->pack();
Packit fcad23
	$self->{'Desc'} = 
Packit fcad23
	    $self->{'Frame'}->Button(-text => sprintf("%-12.12s %-42.42s",
Packit fcad23
						     $self->{'ErrName'},
Packit fcad23
						     $self->{'ErrMsg'}),
Packit fcad23
				     -font => "6x13",
Packit fcad23
				     -highlightcolor => "#ffffff",
Packit fcad23
				     -borderwidth => 0,
Packit fcad23
				     -relief => "flat",
Packit fcad23
				     -bd => 0, -padx => 0, -pady => 0,
Packit fcad23
				     -activeforeground => 'red',
Packit fcad23
				     -activebackground => '#C9C9C9',
Packit fcad23
				     -background => '#E0C9C9',
Packit fcad23
				     -command => [\&selectme,$self]);
Packit fcad23
	$self->{'Desc'}->pack(-fill => "x",-expand => 1,-side=>"left"); # 
Packit fcad23
	if ($::raiseonnew) {
Packit fcad23
	    $tmp->toplevel->deiconify();
Packit fcad23
	    $tmp->toplevel->raise();
Packit fcad23
	}
Packit fcad23
	::addToLog("problem found:  $self->{'Host'}\t$self->{'ErrName'}\t$self->{'ErrMsg'}",2);
Packit fcad23
    }
Packit fcad23
    bless $self;
Packit fcad23
    return $self;
Packit fcad23
}
Packit fcad23
Packit fcad23
sub haveseen {
Packit fcad23
    my $self = shift;
Packit fcad23
    $self->{'Desc'}->configure(-background => '#C9C9C9');
Packit fcad23
}
Packit fcad23
Packit fcad23
sub selectme {
Packit fcad23
    my $self = shift;
Packit fcad23
    if ($main::hidden) {
Packit fcad23
      main::makeappear();
Packit fcad23
	return;
Packit fcad23
    }
Packit fcad23
    if (exists $self->{'Selected'}) {
Packit fcad23
      main::deselectitem($self);
Packit fcad23
	delete $self->{'Selected'};
Packit fcad23
    } else {
Packit fcad23
      main::selectitem($self);
Packit fcad23
	$self->{'Desc'}->configure(-foreground => "red");
Packit fcad23
	$self->{'Selected'} = 1;
Packit fcad23
    }
Packit fcad23
    $self->haveseen();
Packit fcad23
}
Packit fcad23
Packit fcad23
sub deselectme {
Packit fcad23
    my $self = shift;
Packit fcad23
    $self->{'Desc'}->configure(-foreground => "black");
Packit fcad23
    delete $self->{'Selected'};
Packit fcad23
}
Packit fcad23
Packit fcad23
sub check {
Packit fcad23
    my $self = shift;
Packit fcad23
    if ($::display) {
Packit fcad23
      main::setstatus("Checking $self->{'Host'} -- $self->{'ErrName'}");
Packit fcad23
    }
Packit fcad23
    else {
Packit fcad23
	printf("Checking \b\b\b\b\b\b\b\b\b");
Packit fcad23
    }
Packit fcad23
    $result = $self->snmp_get("$self->{'Mib'}$::miberrflag.$self->{'MibLocation'}");
Packit fcad23
    if (exists $self->{'HostId'}->{'Down'}) {
Packit fcad23
	return 0;
Packit fcad23
    }
Packit fcad23
    if ($result == 0) {
Packit fcad23
	$self->deleteme();
Packit fcad23
    }
Packit fcad23
  main::setstatus("idle");
Packit fcad23
    return $result;
Packit fcad23
}
Packit fcad23
Packit fcad23
sub fix {
Packit fcad23
# Don't fix and/or unable to
Packit fcad23
    my $self = shift;
Packit fcad23
  main::setmsg("Don't know how to fix $self->{'ErrName'}");
Packit fcad23
}
Packit fcad23
Packit fcad23
sub rsh {
Packit fcad23
    my $self = shift;
Packit fcad23
    if ($::display) {
Packit fcad23
	system "xterm -e rsh $self->{'HostId'}->{'Name'} -l root &";
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub deleteme {
Packit fcad23
    my $self = shift;
Packit fcad23
    my $host = $self->{'HostId'};
Packit fcad23
    $host->deleteProb($self);
Packit fcad23
}
Packit fcad23
Packit fcad23
sub deleteself {
Packit fcad23
    my $self = shift;
Packit fcad23
    if ($::display) {
Packit fcad23
	if ($self->{'Selected'}) {
Packit fcad23
	  main::deselectitem($self);
Packit fcad23
	}
Packit fcad23
	$self->{'Desc'}->destroy();
Packit fcad23
	$self->{'Frame'}->destroy();
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub canfix {
Packit fcad23
    return 0;
Packit fcad23
}
Packit fcad23
Packit fcad23
package FixProblem;
Packit fcad23
Packit fcad23
@ISA = qw( Problem );
Packit fcad23
Packit fcad23
sub new {
Packit fcad23
    my $tmp = shift;
Packit fcad23
    my $hostId = shift;
Packit fcad23
    my $mib = shift;
Packit fcad23
    my $mibdesc = shift;
Packit fcad23
    my $mibloc = shift;
Packit fcad23
    my $frame = shift;
Packit fcad23
    my $self = new Problem ($hostId,$mib,$mibdesc,$mibloc,$frame);
Packit fcad23
    $_ = $mib;
Packit fcad23
    ($mymib) = /(\.[0-9]+)$/;
Packit fcad23
    if (grep(/$mymib/,@::fixitlist) && ($::fixit >= 0)) {
Packit fcad23
	bless $self;		# Make it a FixProblem if fixable
Packit fcad23
    }
Packit fcad23
    return $self;               # else just return a Problem
Packit fcad23
}
Packit fcad23
Packit fcad23
sub canfix {
Packit fcad23
    return 1;
Packit fcad23
}
Packit fcad23
Packit fcad23
sub fix {
Packit fcad23
    my $self = shift;
Packit fcad23
    my $mibloc = shift;
Packit fcad23
    if ($::display) {
Packit fcad23
      main::setstatus(sprintf("Fixing %s:  %s",
Packit fcad23
			      $self->{'Host'}, $self->{'ErrName'}));
Packit fcad23
    } 
Packit fcad23
    else {
Packit fcad23
	printf(" / Fixing...\b\b\b\b\b\b\b\b\b");
Packit fcad23
    }
Packit fcad23
    $self->snmp_set("$self->{'Mib'}$::mibfix.$self->{'MibLocation'} integer 1");
Packit fcad23
    $self->snmp_set("$::mibclearcache integer 1");
Packit fcad23
    if (exists $self->{'HostId'}->{'Down'}) {
Packit fcad23
	return;
Packit fcad23
    }
Packit fcad23
    if ($::display) {
Packit fcad23
	main::setstatus("Sleeping");
Packit fcad23
    }
Packit fcad23
    else {
Packit fcad23
	printf("Sleeping \b\b\b\b\b\b\b\b\b");
Packit fcad23
    }
Packit fcad23
    sleep(2);
Packit fcad23
    if ($::display) {
Packit fcad23
	main::setstatus("Checking");
Packit fcad23
    }
Packit fcad23
    else {
Packit fcad23
	printf("Checking\b\b\b\b\b\b\b\b");
Packit fcad23
    }
Packit fcad23
    if ($self->check() != 0) {
Packit fcad23
	if (! $::display) {
Packit fcad23
	    printf("*failed*  \n");
Packit fcad23
	} else {
Packit fcad23
	    main::setmsg("Failed to fix $self->{'ErrName'} on $self->{'Host'}");
Packit fcad23
	}
Packit fcad23
    }
Packit fcad23
    else {
Packit fcad23
	if ($::display) {
Packit fcad23
#	    $self->{'HostId'}->deleteProb($self);
Packit fcad23
	    main::setmsg("Fixed $self->{'ErrName'} on $self->{'Host'}");
Packit fcad23
	} 
Packit fcad23
	else {
Packit fcad23
	    printf("Fixed     \n");
Packit fcad23
	}
Packit fcad23
    }
Packit fcad23
  main::setstatus("Idle");
Packit fcad23
}
Packit fcad23
Packit fcad23
#
Packit fcad23
#  Host Package:  Each object is a host which can check itself and display
Packit fcad23
#                 the results
Packit fcad23
#
Packit fcad23
package Host;
Packit fcad23
Packit fcad23
sub mibsort {
Packit fcad23
    $_ = $a;
Packit fcad23
    ($av) = /\.([0-9]+)/;
Packit fcad23
    $_ = $b;
Packit fcad23
    ($bv) = /\.([0-9]+)/;
Packit fcad23
    return $av <=> $bv;
Packit fcad23
}
Packit fcad23
Packit fcad23
sub new {
Packit fcad23
    my $self = {};
Packit fcad23
    my $tmp = shift;
Packit fcad23
    $self->{'Name'} = shift;
Packit fcad23
    $self->{'Host'} = $self->{'Name'};
Packit fcad23
    $self->{'Mibs'} = [];
Packit fcad23
    $self->{'Problems'} = [];
Packit fcad23
    bless $self;
Packit fcad23
    if ($::display) {
Packit fcad23
	$self->{'MainFrame'} = $::HostFrame->Frame();
Packit fcad23
	if (!$::hidden) {
Packit fcad23
	    $self->{'MainFrame'}->configure(-relief =>"sunken",-borderwidth=>2);
Packit fcad23
	}
Packit fcad23
	$self->{'ProbFrame'} = $self->{'MainFrame'}->Frame();
Packit fcad23
	$self->{'hostlabel'} = 
Packit fcad23
	    $self->{'MainFrame'}->Button(-text => sprintf("%-9.9s",
Packit fcad23
							    $self->{'Name'}),
Packit fcad23
					 -bd => 0, -padx => 0, -pady => 0,
Packit fcad23
					 -command =>[\&selectme,$self],
Packit fcad23
					 -activeforeground => 'red',
Packit fcad23
					 -activebackground => '#C9C9C9',
Packit fcad23
					 -width => 9,
Packit fcad23
					 -anchor => "w",
Packit fcad23
					 -relief => "flat");
Packit fcad23
	$self->{'hostlabel'}->pack(-side=>"left",-ipadx=>1,
Packit fcad23
				   -padx=> 1,-pady =>1);
Packit fcad23
	$self->{'ProbFrame'}->pack(-side=>"left",-ipadx=>1,
Packit fcad23
				   -padx=> 1,-pady =>1);
Packit fcad23
	$self->{'MainFrame'}->pack( #-padx => 2,-pady =>2, 
Packit fcad23
				   -fill => "x", -expand => 1);
Packit fcad23
    } 
Packit fcad23
    foreach $mibx ( sort mibsort keys(%::miblist) ) {
Packit fcad23
	push(@{$self->{'Mibs'}},
Packit fcad23
	     new Mib ($self,"$::mibheadall$mibx",$::miblist{$mibx},
Packit fcad23
		      $self->{'ProbFrame'}));
Packit fcad23
    }
Packit fcad23
    return $self;
Packit fcad23
}
Packit fcad23
Packit fcad23
sub rsh {
Packit fcad23
    my $self = shift;
Packit fcad23
    if ($::display) {
Packit fcad23
	system "xterm -e rsh $self->{'Name'} -l root &";
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub selectme {
Packit fcad23
    my $self = shift;
Packit fcad23
    if ($main::hidden) {
Packit fcad23
      main::makeappear();
Packit fcad23
	return;
Packit fcad23
    }
Packit fcad23
    if (exists $self->{'Selected'}) {
Packit fcad23
      main::deselectitem($self);
Packit fcad23
	delete $self->{'Selected'};
Packit fcad23
    } else {
Packit fcad23
      main::selectitem($self);
Packit fcad23
	$self->{'hostlabel'}->configure(-foreground => "red");
Packit fcad23
	$self->{'Selected'} = 1;
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub deselectme {
Packit fcad23
    my $self = shift;
Packit fcad23
    $self->{'hostlabel'}->configure(-foreground => "black");
Packit fcad23
    delete $self->{'Selected'};
Packit fcad23
}
Packit fcad23
Packit fcad23
sub fix {
Packit fcad23
    my $self = shift;
Packit fcad23
    if (! exists $self->{'Down'}) {
Packit fcad23
	foreach $i (@{$self->{'Problems'}}) {
Packit fcad23
	    if ($i->canfix() && ref($i) ne Host) {
Packit fcad23
		$i->fix();
Packit fcad23
	    }
Packit fcad23
	}
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub seenall {
Packit fcad23
    my $self = shift;
Packit fcad23
    foreach $i (@{$self->{'Problems'}}) {
Packit fcad23
	if (ref($i) ne Host) {
Packit fcad23
	    $i->haveseen();
Packit fcad23
	}
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub canfix {
Packit fcad23
    return 1;
Packit fcad23
}
Packit fcad23
Packit fcad23
sub hostdown {
Packit fcad23
    my $self = shift;
Packit fcad23
    $self->deleteProbs();
Packit fcad23
    push(@{$self->{'Problems'}},$self);
Packit fcad23
    $self->{'Down'} = 1;
Packit fcad23
    if ($::display) {
Packit fcad23
	if (!exists $self->{'hostlabel'}) {
Packit fcad23
	    $self->{'hostlabel'} = 
Packit fcad23
		$self->{'MainFrame'}->Button(-text => sprintf("%-9.9s",
Packit fcad23
							      $self->{'Name'}),
Packit fcad23
					     -bd => 0, -padx => 0, -pady => 0,
Packit fcad23
					     -command =>[\&selectme,$self],
Packit fcad23
					     -activeforeground => 'red',
Packit fcad23
					     -activebackground => '#C9C9C9',
Packit fcad23
					     -width => 9,
Packit fcad23
					     -anchor => "w",
Packit fcad23
					     -relief => "flat");
Packit fcad23
	}
Packit fcad23
	::addToLog("$self->{'Name'} is down",2);
Packit fcad23
	$self->{'hostlabel'}->configure(-text => 
Packit fcad23
					sprintf("%-9.9s down",$self->{'Name'}),
Packit fcad23
					-width => 14);
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub check {
Packit fcad23
    my $self = shift;
Packit fcad23
    $self->{'noDelete'} = 1;
Packit fcad23
    $self->deleteProbs();
Packit fcad23
    delete $self->{'noDelete'};
Packit fcad23
    if ($::display) {
Packit fcad23
	$self->{'hostlabel'}->configure(-text => $self->{'Name'},-width=>9);
Packit fcad23
    }
Packit fcad23
    delete $self->{'Down'};
Packit fcad23
  main::setstatus("pinging $self->{'Name'}");
Packit fcad23
    if (!($::pinghost) || Net::Ping::pingecho($self->{'Name'},2)) {
Packit fcad23
	foreach $i (@{$self->{'Mibs'}}) {
Packit fcad23
	    if (ref($i) ne Mib) {
Packit fcad23
		print "$i is a ref($i) not a Mib\n";
Packit fcad23
	    } else {
Packit fcad23
	      main::setstatus("Checking $self->{'Name'}:  " . $i->{'MibDesc'});
Packit fcad23
		push(@{$self->{'Problems'}},$i->check());
Packit fcad23
	    }
Packit fcad23
	    if (exists $self->{'Down'}) {
Packit fcad23
		last;
Packit fcad23
	    }
Packit fcad23
	}
Packit fcad23
    } else {
Packit fcad23
	$self->hostdown();
Packit fcad23
    }
Packit fcad23
  main::setstatus("Idle");
Packit fcad23
    if ($#{$self->{'Problems'}} == -1) {
Packit fcad23
	$self->deleteme();
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub deleteme {
Packit fcad23
    my $self = shift;
Packit fcad23
    if ($self->{'Selected'}) {
Packit fcad23
      main::deselectitem($self);
Packit fcad23
    }
Packit fcad23
    $self->deleteProbs();
Packit fcad23
    if ($::display) {
Packit fcad23
	$self->{'hostlabel'}->destroy();
Packit fcad23
	$self->{'ProbFrame'}->destroy();
Packit fcad23
	my $top = $self->{'MainFrame'}->toplevel;
Packit fcad23
	$self->{'MainFrame'}->destroy();
Packit fcad23
	$top->update;
Packit fcad23
    }
Packit fcad23
  main::deletehost($self->{'Name'});
Packit fcad23
}
Packit fcad23
Packit fcad23
sub deleteProbs {
Packit fcad23
    my $self = shift;
Packit fcad23
    foreach $i (@{$self->{'Problems'}}) {
Packit fcad23
	if (ref($i) eq Host) {
Packit fcad23
	    delete $self->{'Problems'};
Packit fcad23
	    return;
Packit fcad23
	}
Packit fcad23
	if (ref($i) ne Problem && ref($i) ne FixProblem) {
Packit fcad23
	    print "i:  $i is a ", ref($i), "\n";
Packit fcad23
	    next;
Packit fcad23
	}
Packit fcad23
	$self->deleteProb($i);
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub deleteProb {
Packit fcad23
    my $self = shift;
Packit fcad23
    my $child = shift;
Packit fcad23
    for ($k = 0; $k <= $#{$self->{'Problems'}}; $k++) {
Packit fcad23
	if (ref($self->{'Problems'}->[$k]) eq Problem ||
Packit fcad23
	    ref($self->{'Problems'}->[$k]) eq FixProblem ) {
Packit fcad23
	    if ($self->{'Problems'}->[$k]->{'Mib'} eq $child->{'Mib'} && 
Packit fcad23
	    $self->{'Problems'}->[$k]->{'MibLocation'} eq
Packit fcad23
	    $child->{'MibLocation'}) {
Packit fcad23
		splice(@{$self->{'Problems'}},$k,1);
Packit fcad23
		$child->deleteself();
Packit fcad23
		if ($#{$self->{'Problems'}} == -1 && 
Packit fcad23
		    !exists $self->{'noDelete'}) {
Packit fcad23
		    $self->deleteme();
Packit fcad23
		}
Packit fcad23
		last;
Packit fcad23
	    }
Packit fcad23
	} else {
Packit fcad23
	    print "    not: ",$self->{'Problems'}->[$k],"/",
Packit fcad23
	    ref($self->{'Problems'}->[$k]),"\n";
Packit fcad23
	}
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
package main;
Packit fcad23
Packit fcad23
#
Packit fcad23
# Read arguments
Packit fcad23
#
Packit fcad23
Packit fcad23
if ($#ARGV != -1) {
Packit fcad23
    while ($#ARGV >= 0 && $ARGV[0] =~ /^-/) {
Packit fcad23
	$_ = shift;
Packit fcad23
	$andlog = 1 if (/^-a/);
Packit fcad23
	$dontstart = 1 if (/^-d/);
Packit fcad23
	$fixit = -1 if (/^-n/);
Packit fcad23
	$fixit = 1 if (/^-y/);
Packit fcad23
	$display = 0 if (/^-x/);
Packit fcad23
	$pinghost = 1 if (/^-p/);
Packit fcad23
	$hidden = 1 if (/^-H/);
Packit fcad23
	$loglevel = shift if (/^-V/);
Packit fcad23
	$logwindowatstart = 1 if (/^-L/);
Packit fcad23
	&display_help() if (/^-h/);
Packit fcad23
	&setmibchecklist(@fixitlist) if (/^-f/);
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
#
Packit fcad23
# If necessary check the ece-log file for problems
Packit fcad23
#
Packit fcad23
Packit fcad23
if (($andlog || $#ARGV == -1) && !$dontstart) {
Packit fcad23
    open(LOG,$errlog);
Packit fcad23
    while (<LOG>) {
Packit fcad23
	@fields = split;
Packit fcad23
	@tmp = grep(/$fields[0]/,@ARGV);
Packit fcad23
	if ($#tmp == -1) { #  && $fields[1] ne "down") {
Packit fcad23
	    $ARGV[$#ARGV + 1] = $fields[0];
Packit fcad23
	}
Packit fcad23
    }
Packit fcad23
    close(LOG);
Packit fcad23
}
Packit fcad23
Packit fcad23
#
Packit fcad23
# Check all the found hosts 
Packit fcad23
#
Packit fcad23
Packit fcad23
if ($display) {
Packit fcad23
    use Tk;
Packit fcad23
#    $tk_strictMotif = 1;
Packit fcad23
    $top = MainWindow->new();
Packit fcad23
    $top->bind('all',"<Control-q>",[\&quit]);
Packit fcad23
    $top->bind('all',"<Control-h>",[\&makehidden]);
Packit fcad23
    $top->bind('all',"<Control-s>",[\&seenall]);
Packit fcad23
    $top->bind('all',"<Control-f>",[\&fixall]);
Packit fcad23
     $top->option('add','*highlightThickness','0');        #wish this worked
Packit fcad23
#     $top->option('add','*highlightbackground','#C9C9C9');
Packit fcad23
     $top->option('add','*background','#C9C9C9');
Packit fcad23
     $top->option('add','*font','6x13');
Packit fcad23
    $HostFrame = $top->Frame();
Packit fcad23
    $MenuFrame = $top->Frame(-relief => "raised",-borderwidth => 2);
Packit fcad23
    $MenuFrame->pack(-fill => "x",-expand => 1);
Packit fcad23
    $statusBar = $top->Frame(-relief => "raised",-borderwidth => 2);
Packit fcad23
    $status = $statusBar->Label(-text => "initializing",-anchor =>"e");
Packit fcad23
    $statusl = $statusBar->Label(-text => "Status:  ", -anchor => "w");
Packit fcad23
    $msgBar = $top->Frame(-relief => "raised",-borderwidth => 2);
Packit fcad23
    $msg = $msgBar->Label(-text => "",-anchor =>"e");
Packit fcad23
    $msgl = $msgBar->Label(-text => "Note:  ", -anchor => "w");
Packit fcad23
    
Packit fcad23
    $botFrame = $top->Frame();
Packit fcad23
    $butFrame = $top->Frame();
Packit fcad23
    $entryhost = "";
Packit fcad23
    $NewHost = $botFrame->Entry(-textvariable => \$entryhost,-width=>20,
Packit fcad23
				-relief => "sunken");
Packit fcad23
    $NewHost->bind("<Return>",sub {newHost("$entryhost");
Packit fcad23
			       $NewHost->delete(0,length($entryhost));});
Packit fcad23
    $BotLabel = $botFrame->Label(-text => "Check New Host:  ",
Packit fcad23
			    -anchor => "w");
Packit fcad23
    $CmdsMenuBut = $MenuFrame->Menubutton(-text => "Cmds");
Packit fcad23
    $CmdsMenu = $CmdsMenuBut->Menu(-tearoff => 1);
Packit fcad23
    $CmdsMenuBut->configure(-menu => $CmdsMenu);
Packit fcad23
    $CmdsMenuBut->pack(-side => "left");
Packit fcad23
    $CmdsMenuBut->command(-label => "Check Hosts", -command => [\&rescanhosts]);
Packit fcad23
    $CmdsMenuBut->command(-label => "Check Log", -command => [\&scanlog]);
Packit fcad23
    $CmdsMenuBut->command(-label => "Fix All", -command => [\&fixall],
Packit fcad23
			  -accelerator => "Ctrl-f");
Packit fcad23
    $CmdsMenuBut->command(-label => "Seen All", -command => [\&seenall],
Packit fcad23
			  -accelerator => "Ctrl-s");
Packit fcad23
    $CmdsMenuBut->separator();
Packit fcad23
    $CmdsMenuBut->command(-label => "Hide", -command => [\&makehidden],
Packit fcad23
			  -accelerator => "Ctrl-h");
Packit fcad23
    $CmdsMenuBut->command(-label => "Quit", -command => [\&quit],
Packit fcad23
			  -accelerator => "Ctrl-q");
Packit fcad23
    $PrefsMenuBut = $MenuFrame->Menubutton(-text => "Prefs");
Packit fcad23
    $PrefsMenu = $PrefsMenuBut->Menu(-tearoff => 1);
Packit fcad23
    $PrefsMenuBut->configure(-menu => $PrefsMenu);
Packit fcad23
    $PrefsMenuBut->pack(-side => "left");
Packit fcad23
    $PrefsMenuBut->cascade(-label => "Rescan");
Packit fcad23
    $RescanPrefsBut = $PrefsMenu->Menu();
Packit fcad23
    $PrefsMenuBut->entryconfigure("Rescan",-menu => $RescanPrefsBut);
Packit fcad23
    $AutoRescan = 1;
Packit fcad23
    if ($AutoRescan) {
Packit fcad23
      $afterId = Tk::after($rescanWhen*1000,[\&autorescan]);
Packit fcad23
    }
Packit fcad23
    $RescanPrefsBut->checkbutton(-label =>"Auto Rescan",
Packit fcad23
			       -variable =>\$AutoRescan,
Packit fcad23
			       -command => sub {if ($AutoRescan) {
Packit fcad23
				   $afterId = 
Packit fcad23
				     Tk::after($rescanWhen*1000,[\&autorescan])
Packit fcad23
				   } else {
Packit fcad23
				     Tk::after("cancel",$afterId);
Packit fcad23
				   }});
Packit fcad23
    $AutoCheckLog = 1;
Packit fcad23
    $RescanPrefsBut->checkbutton(-label =>"Checks Log",
Packit fcad23
			       -variable =>\$AutoCheckLog);
Packit fcad23
    $AutoCheckHosts = 0;
Packit fcad23
    $RescanPrefsBut->checkbutton(-label =>"Checks Hosts",
Packit fcad23
			       -variable =>\$AutoCheckHosts);
Packit fcad23
    $RescanWhenHidden = 1;
Packit fcad23
    $RescanPrefsBut->checkbutton(-label =>"Only When Hidden",
Packit fcad23
			       -variable =>\$RescanWhenHidden);
Packit fcad23
Packit fcad23
    $RescanPrefsBut->checkbutton(-label =>"Pop forward with new",
Packit fcad23
			       -variable =>\$raiseonnew);
Packit fcad23
Packit fcad23
    $PrefsMenuBut->cascade(-label => "Log Verbosity");
Packit fcad23
    $LogVerbBut = $PrefsMenu->Menu();
Packit fcad23
    $PrefsMenuBut->entryconfigure("Log Verbosity",
Packit fcad23
				  -menu => $LogVerbBut);
Packit fcad23
    for ($i=1; $i <= $numloglevels; $i++) {
Packit fcad23
	$LogVerbBut->radiobutton(-label => "$i", -variable => \$loglevel, 
Packit fcad23
				 -value => $i);
Packit fcad23
    }
Packit fcad23
Packit fcad23
    $PrefsMenuBut->cascade(-label => "Check For");
Packit fcad23
    $CheckForBut = $PrefsMenu->Menu();
Packit fcad23
    $PrefsMenuBut->entryconfigure("Check For",
Packit fcad23
				  -menu => $CheckForBut);
Packit fcad23
    $CheckForBut->command(-label => "Fixable Problems", 
Packit fcad23
			  -command => [\&setmibchecklist,@fixitlist]);
Packit fcad23
    $CheckForBut->command(-label => "Everything", 
Packit fcad23
			  -command => [\&setmibchecklist,keys(%miblist)]);
Packit fcad23
    $CheckForBut->separator();
Packit fcad23
    foreach $i ( sort mibsort keys(%::mibchecklist) ) {
Packit fcad23
	$CheckForBut->checkbutton(-label => $miblist{$i}, 
Packit fcad23
				  -variable => \$mibchecklist{$i});
Packit fcad23
    }
Packit fcad23
Packit fcad23
    $PrefsMenuBut->checkbutton(-label => "Ping Host First", 
Packit fcad23
			       -variable => \$pinghost);
Packit fcad23
Packit fcad23
    # Agent control
Packit fcad23
Packit fcad23
    $agentMenuBut = $MenuFrame->Menubutton(-text => "Agent-Control");
Packit fcad23
    $agentMenu = $agentMenuBut->Menu(-tearoff => 1);
Packit fcad23
    $agentMenuBut->configure(-menu => $agentMenu);
Packit fcad23
    $agentMenuBut->pack(-side => "left");
Packit fcad23
    $agentMenuBut->command(-label => "Re-read Configuration", 
Packit fcad23
			   -command => [sub {if ($selected) { $top->Busy(); 
Packit fcad23
							      my $args = sprint($::default_get_args, $selected->{'Host'});
Packit fcad23
$_ = `$::snmppath/snmpset $args $mibupdateconfig i 1`; $top->Unbusy();}}]);
Packit fcad23
    $agentMenuBut->command(-label => "Clear Exec Cache", 
Packit fcad23
			   -command => [sub {if ($selected) { $top->Busy();
Packit fcad23
							      my $args = sprint($::default_get_args, $selected->{'Host'});
Packit fcad23
$_ = `$::snmppath/snmpset $args $mibclearcache i 1`; $top->Unbusy();}}]);
Packit fcad23
    $agentMenuBut->separator();
Packit fcad23
    $agentMenuBut->command(-label => "Re-start Agent", 
Packit fcad23
			   -command => [sub {if ($selected) { $top->Busy(); 
Packit fcad23
							      my $args = sprint($::default_get_args, $selected->{'Host'});
Packit fcad23
$_ = `$::snmppath/snmpset $args $mibrestartagent i 1`; $top->Unbusy();} }]);
Packit fcad23
Packit fcad23
    # set up remote commands
Packit fcad23
Packit fcad23
    $remoteMenuBut = $MenuFrame->Menubutton(-text => "Remote-Info");
Packit fcad23
    $remoteMenu = $remoteMenuBut->Menu(-tearoff => 1);
Packit fcad23
    $remoteMenuBut->configure(-menu => $remoteMenu);
Packit fcad23
    $remoteMenuBut->pack(-side => "left");
Packit fcad23
    $remoteMenuBut->command(-label => "Load-Av", -command => [\&remote_load]);
Packit fcad23
    $remoteMenuBut->separator();
Packit fcad23
    $remoteMenuBut->command(-label => "top", -command => [\&remote_cmd,"top"]);
Packit fcad23
    $remoteMenuBut->command(-label => "mailq", -command => [\&remote_cmd,"mailq"]);
Packit fcad23
    $remoteMenuBut->command(-label => "ps", -command => [\&remote_cmd,"ps"]);
Packit fcad23
    $remoteMenuBut->command(-label => "conf", -command => [\&remote_cmd,"conf"]);
Packit fcad23
Packit fcad23
    # set up log file menu
Packit fcad23
    $logFileMenuBut = $MenuFrame->Menubutton(-text => "Log");
Packit fcad23
    $logFileMenu = $logFileMenuBut->Menu(-tearoff => 1);
Packit fcad23
    $logFileMenuBut->configure(-menu => $logFileMenu);
Packit fcad23
    $logFileMenuBut->pack(-side => "left");
Packit fcad23
    $logFileMenuBut->command(-label => "show log", -command => [\&displayLog]);
Packit fcad23
    $logFileMenuBut->command(-label => "clear log", -command => [\&clearLog]);
Packit fcad23
    $logFileMenuBut->separator();
Packit fcad23
    $logFileMenuBut->command(-label => "show Tyfon's log", -command => [\&displayTyfon]);
Packit fcad23
Packit fcad23
Packit fcad23
    # set up status bar
Packit fcad23
Packit fcad23
    $statusl->pack(-fill => "x", -expand => 1, -side =>"left");
Packit fcad23
    $status->pack(-fill => "x", -expand => 1, -side =>"left");
Packit fcad23
    $msgl->pack(-fill => "x", -expand => 1, -side => "left");
Packit fcad23
    $msg->pack(-fill => "x", -expand => 1, -side => "left");
Packit fcad23
    $statusBar->pack(-fill => "x", -expand => 1);
Packit fcad23
    $msgBar->pack(-fill => "x", -expand => 1);
Packit fcad23
    $HostFrame->pack(-fill => "x",-expand => 1);
Packit fcad23
    $butFrame->pack(-fill => "x",-expand => 1);
Packit fcad23
    $botFrame->pack(-fill => "x",-expand => 1);
Packit fcad23
    $FixBut = $butFrame->Button(-text => "Fix",-command=>[sub{print "hi\n"}],
Packit fcad23
				-state => "disabled");
Packit fcad23
    $FixBut->pack(-side => "left",-padx => 4,-pady => 2,-ipadx => 2,
Packit fcad23
		   -ipady => 2);
Packit fcad23
    $RshBut = $butFrame->Button(-text => "Rsh",-command=>[sub{print "hi\n"}],
Packit fcad23
				-state => "disabled");
Packit fcad23
    $RshBut->pack(-side => "left",-padx => 4,-pady => 2,-ipadx => 2,
Packit fcad23
		   -ipady => 2);
Packit fcad23
    $DelBut = $butFrame->Button(-text => "Del",
Packit fcad23
				 -state => "disabled");
Packit fcad23
    $DelBut->pack(-side => "left",-padx => 4,-pady => 2,-ipadx => 2,
Packit fcad23
		   -ipady => 2);
Packit fcad23
    $ChkBut = $butFrame->Button(-text => "Chk",
Packit fcad23
				 -state => "disabled");
Packit fcad23
    $ChkBut->pack(-side => "left",-padx => 4,-pady => 2,-ipadx => 2,
Packit fcad23
		   -ipady => 2);
Packit fcad23
    $BotLabel->pack(-fill => "x",-expand => 1,-side=>"left");
Packit fcad23
    $NewHost->pack(-side=>"left");
Packit fcad23
    &makehidden() if ($hidden);
Packit fcad23
    $top->update();
Packit fcad23
Packit fcad23
    # generate log window, but tell it not to create display 
Packit fcad23
    $logwindow = MainWindow->new;
Packit fcad23
    $logwindow->option('add','*highlightThickness','0');        #wish this worked
Packit fcad23
#     $logwindow->option('add','*highlightbackground','#C9C9C9');
Packit fcad23
    $logwindow->option('add','*background','#C9C9C9');
Packit fcad23
    $logwindow->option('add','*font','6x13');
Packit fcad23
Packit fcad23
    $logbuttons = $logwindow->Frame;
Packit fcad23
    $logbuttons->pack(-side => 'bottom', -expand => 1, -fill => 'x');
Packit fcad23
    $logclose = $logbuttons->Button(-text => 'Close', 
Packit fcad23
				 -command => ['withdraw',$logwindow]);
Packit fcad23
    $logclose->pack(-side => 'left', -expand => 1);
Packit fcad23
Packit fcad23
    $logtext = $logwindow->Text(-height => 40, -setgrid => 1);
Packit fcad23
    $logtext->pack(-side => 'left', -fill => 'both', -expand => 1);
Packit fcad23
    $logscroll = $logwindow->Scrollbar(-command => ['yview',$logtext]);
Packit fcad23
    $logscroll->pack(-side => 'right', -fill => 'y');
Packit fcad23
    $logtext->configure(-yscrollcommand => ['set', $logscroll]);
Packit fcad23
    $logwindow->title("snmpcheck Action Log file");
Packit fcad23
    $logwindow->iconname("snmpcheck-log");
Packit fcad23
    $logtext->delete('1.0','end');
Packit fcad23
    $logclear = $logbuttons->Button(-text => 'Clear Log', 
Packit fcad23
				 -command => [\&deleteLog]);
Packit fcad23
    $logclear->pack(-side => 'right', -expand => 1);
Packit fcad23
    if (! $logwindowatstart) {
Packit fcad23
	$logwindow->withdraw;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    $status->configure(-text => "Idle");
Packit fcad23
    $selected = 0;
Packit fcad23
    # fill table with hosts
Packit fcad23
    if (!$dontstart) {
Packit fcad23
	loadAllHosts(@ARGV);
Packit fcad23
    }
Packit fcad23
    MainLoop;
Packit fcad23
}
Packit fcad23
else {
Packit fcad23
    select(STDOUT);
Packit fcad23
    $| = 1;
Packit fcad23
    if ($::fixit == 0) {
Packit fcad23
	Term::ReadKey::ReadMode(3);
Packit fcad23
    }
Packit fcad23
    loadAllHosts(@ARGV);
Packit fcad23
    printf("$eraseline");
Packit fcad23
}
Packit fcad23
Packit fcad23
sub loadAllHosts {
Packit fcad23
    my @hostlist = @_;
Packit fcad23
    foreach $host ( @hostlist ) {
Packit fcad23
	newHost($host);
Packit fcad23
    }
Packit fcad23
}    
Packit fcad23
Packit fcad23
sub newHost {
Packit fcad23
    my $name = shift;
Packit fcad23
    if (!exists $chost{"$name"}) {
Packit fcad23
	$chost{"$name"} = new Host ($name);
Packit fcad23
	if ($::display) { $top->update(); }
Packit fcad23
	$chost{"$name"}->check;
Packit fcad23
    } else {
Packit fcad23
	setmsg("$name all ready exists");
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub deletehost {
Packit fcad23
    my $name = shift;
Packit fcad23
    delete $chost{"$name"};
Packit fcad23
}
Packit fcad23
Packit fcad23
sub setstatus {
Packit fcad23
    my $arg = shift;
Packit fcad23
    if ($display) {
Packit fcad23
	$status->configure(-text => $arg);
Packit fcad23
	$top->update();
Packit fcad23
	addToLog($arg,4);
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub setmsg {
Packit fcad23
    my $arg = shift;
Packit fcad23
    if ($display) {
Packit fcad23
	$msg->configure(-text => $arg);
Packit fcad23
	$top->update();
Packit fcad23
	addToLog($arg);
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub addToLog {
Packit fcad23
    if ($display) {
Packit fcad23
	my $logmsg = shift;
Packit fcad23
	my $logaddlevel = shift;
Packit fcad23
	if (! defined($logaddlevel)) {
Packit fcad23
	    $logaddlevel = 1;
Packit fcad23
	}
Packit fcad23
	if ($logaddlevel <= $loglevel) {
Packit fcad23
	    $logtext->insert('end'," " x ($logaddlevel-1) . "$logmsg\n");
Packit fcad23
	}
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub displayTyfon {
Packit fcad23
    remote_cmd_generic("cat /net/tyfon/1/OV/log/ece-log","Tyfon -- ece-log"); 
Packit fcad23
}
Packit fcad23
Packit fcad23
sub displayLog {
Packit fcad23
    $logwindow->deiconify;
Packit fcad23
    $logwindow->raise;
Packit fcad23
}
Packit fcad23
Packit fcad23
sub deleteLog {
Packit fcad23
    $logtext->delete('1.0','end');
Packit fcad23
}
Packit fcad23
Packit fcad23
sub deselectitem {
Packit fcad23
    $obj = shift;
Packit fcad23
    $obj->deselectme();
Packit fcad23
    $FixBut->configure(-state => "disabled");
Packit fcad23
    $RshBut->configure(-state => "disabled");
Packit fcad23
    $DelBut->configure(-state => "disabled");
Packit fcad23
    $ChkBut->configure(-state => "disabled");
Packit fcad23
    $selected = 0;
Packit fcad23
}
Packit fcad23
Packit fcad23
sub selectitem {
Packit fcad23
    if ($selected) {
Packit fcad23
	$selected->deselectme();
Packit fcad23
    }
Packit fcad23
    $selected = shift;
Packit fcad23
    if (ref($selected) ne Host || !(exists $selected->{'Down'})) {
Packit fcad23
	$RshBut->configure(-state => "normal", -command => ['rsh',$selected]);
Packit fcad23
    } else {
Packit fcad23
	$RshBut->configure(-state => "disabled");
Packit fcad23
    }
Packit fcad23
    $DelBut->configure(-state => "normal", -command => ['deleteme',$selected]);
Packit fcad23
    $ChkBut->configure(-state => "normal", -command => ['check',$selected]);
Packit fcad23
    if ($selected->canfix() && !(exists $selected->{'Down'})) {
Packit fcad23
	$FixBut->configure(-state => "normal", 
Packit fcad23
			   -command => ['fix',$selected]);
Packit fcad23
    } else {
Packit fcad23
	$FixBut->configure(-state => "disabled");
Packit fcad23
    }
Packit fcad23
    if ($hidden == 1) {
Packit fcad23
	makeappear();
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub makehidden {
Packit fcad23
    $MenuFrame->pack("forget");
Packit fcad23
    $statusBar->pack("forget");
Packit fcad23
    $msgBar->pack("forget");
Packit fcad23
    $butFrame->pack("forget");
Packit fcad23
    $botFrame->pack("forget");
Packit fcad23
    flatten();
Packit fcad23
    $hidden=1;
Packit fcad23
}
Packit fcad23
Packit fcad23
sub makeappear {
Packit fcad23
    $HostFrame->pack("forget");
Packit fcad23
    $MenuFrame->pack(-expand => 1, -fill => "x");
Packit fcad23
    $statusBar->pack(-expand => 1, -fill => "x");
Packit fcad23
    $msgBar->pack(-expand => 1, -fill => "x");
Packit fcad23
    $HostFrame->pack(-expand => 1, -fill => "x");
Packit fcad23
    $butFrame->pack(-expand => 1, -fill => "x"); 
Packit fcad23
    $botFrame->pack(-expand => 1, -fill => "x");
Packit fcad23
    reliefen();
Packit fcad23
    $hidden=0;
Packit fcad23
}
Packit fcad23
Packit fcad23
sub quit {
Packit fcad23
    $top->destroy();
Packit fcad23
    exit();
Packit fcad23
}
Packit fcad23
Packit fcad23
sub scanlog {
Packit fcad23
    my (@fields, @tmp);
Packit fcad23
    open(LOG,$::errlog);
Packit fcad23
    while (<LOG>) {
Packit fcad23
	@fields = split;
Packit fcad23
	@tmp = grep(/$fields[0]/,@ARGV);
Packit fcad23
	if ($#tmp == -1 && !exists $::chost->{$fields[0]}) {
Packit fcad23
	    newHost($fields[0]);
Packit fcad23
	}
Packit fcad23
    }
Packit fcad23
    close(LOG);
Packit fcad23
}
Packit fcad23
Packit fcad23
sub rescanhosts {
Packit fcad23
    foreach $i (keys(%chost)) {
Packit fcad23
	$chost{$i}->check();
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub autorescan {
Packit fcad23
    $afterId = Tk::after($rescanWhen*1000,[\&autorescan]);
Packit fcad23
    if ($RescanWhenHidden && !$hidden) {return;}
Packit fcad23
    if ($AutoCheckHosts) {
Packit fcad23
	rescanhosts();
Packit fcad23
    }
Packit fcad23
    if ($AutoCheckLog) {
Packit fcad23
	scanlog();
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub flatten {
Packit fcad23
    foreach $i (keys(%chost)) {
Packit fcad23
	$chost{$i}->{'MainFrame'}->configure(-relief => "flat",-borderwidth=>0);
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub reliefen {
Packit fcad23
    foreach $i (keys(%chost)) {
Packit fcad23
	$chost{$i}->{'MainFrame'}->configure(-relief =>"sunken",-borderwidth=>2);
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub fixall {
Packit fcad23
    foreach $i (keys(%chost)) {
Packit fcad23
	$chost{$i}->fix();
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub seenall {
Packit fcad23
    foreach $i (keys(%chost)) {
Packit fcad23
	$chost{$i}->seenall();
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub remote_cmd {
Packit fcad23
    my $type = shift;
Packit fcad23
    if ($selected) {
Packit fcad23
	remote_cmd_generic("$::snmppath/rsnmp -p $type $selected->{'Host'}",
Packit fcad23
			   "$selected->{'Host'} -- $type",1);
Packit fcad23
    } else {
Packit fcad23
	setmsg("Error:  Nothing selected");
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub remote_load {
Packit fcad23
    if ($selected) {
Packit fcad23
	remote_cmd_generic("$::snmppath/snmpwalk " . sprintf($::default_get_args,$selected->{'Host'}) . " .EXTENSIBLEDOTMIB.LOADAVEMIBNUM.LOADAVE",
Packit fcad23
			   "$selected->{'Host'} -- LoadAve");
Packit fcad23
    } else {
Packit fcad23
	setmsg("Error:  Nothing selected");
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub remote_cmd_generic {
Packit fcad23
    my $cmd = shift;
Packit fcad23
    my $title = shift;
Packit fcad23
    my $insert = shift;
Packit fcad23
    addToLog("running:  $cmd ... ");
Packit fcad23
    my $newwin = MainWindow->new;
Packit fcad23
    $newwin->Busy();
Packit fcad23
Packit fcad23
    $newwin->option('add','*highlightThickness','0');        #wish this worked
Packit fcad23
#     $newwin->option('add','*highlightbackground','#C9C9C9');
Packit fcad23
    $newwin->option('add','*background','#C9C9C9');
Packit fcad23
    $newwin->option('add','*font','6x13');
Packit fcad23
Packit fcad23
    my $buttons = $newwin->Frame;
Packit fcad23
    $buttons->pack(-side => 'bottom', -expand => 1, -fill => 'x');
Packit fcad23
    my $entries = $newwin->Frame;
Packit fcad23
    $entries->pack(-side => 'bottom', -expand => 1, -fill => 'x');
Packit fcad23
Packit fcad23
    my $text = $newwin->Text(-height => 40, -setgrid => 1);
Packit fcad23
    $text->pack(-side => 'left', -fill => 'both', -expand => 1);
Packit fcad23
    my $scroll = $newwin->Scrollbar(-command => ['yview',$text]);
Packit fcad23
    $scroll->pack(-side => 'left', -fill => 'y');
Packit fcad23
    $text->configure(-yscrollcommand => ['set', $scroll]);
Packit fcad23
Packit fcad23
    my $close = $buttons->Button(-text => 'Close', 
Packit fcad23
				 -command => ['destroy',$newwin]);
Packit fcad23
    $close->pack(-side => 'left', -expand => 1);
Packit fcad23
    my $rerun = $buttons->Button(-text => 'Re-Run', 
Packit fcad23
				 -command=>[\&fill_text,'',$text,
Packit fcad23
					    \$cmd,$insert]);
Packit fcad23
    $rerun->pack(-side => 'left', -expand => 1);
Packit fcad23
Packit fcad23
    my $cmdlabel = $entries->Label(-text => "Command:  ");
Packit fcad23
    my $cmdtexte = $entries->Entry(-textvariable => \$cmd, 
Packit fcad23
				      -relief => "sunken");
Packit fcad23
    $cmdtexte->bind('<Return>' => [\&fill_text,$text, \$cmd,$insert]);
Packit fcad23
    $cmdlabel->pack(-side => 'left');
Packit fcad23
    $cmdtexte->pack(-side => 'left');
Packit fcad23
    
Packit fcad23
    my $searchtext = '';
Packit fcad23
    my $searchlabel = $entries->Label(-text => "Search for:  ");
Packit fcad23
    my $searchtexte = $entries->Entry(-textvariable => \$searchtext, 
Packit fcad23
				      -relief => "sunken");
Packit fcad23
Packit fcad23
    $searchtexte->pack(-side => 'right');
Packit fcad23
    $searchlabel->pack(-side => 'right');
Packit fcad23
    $searchtexte->bind('<Return>' => [sub { $text->tag('remove','search','0.0','end');
Packit fcad23
					    my($current, $length) = ('1.0', 0);
Packit fcad23
					    while (1) {
Packit fcad23
						$current = $text->search(-count => \$length, $searchtext, $current, 'end');
Packit fcad23
						last if not $current;
Packit fcad23
						$text->tag('add', 'search', $current, "$current + $length char");
Packit fcad23
						$current = $text->index("$current + $length char");
Packit fcad23
						$text->tag('configure','search',
Packit fcad23
							   -background => 
Packit fcad23
							   'lightBlue');}}]);
Packit fcad23
Packit fcad23
    if (defined($title)) {
Packit fcad23
	$newwin->title($title);
Packit fcad23
	$newwin->iconname($title);
Packit fcad23
    }
Packit fcad23
    fill_text('',$text,\$cmd,$insert);
Packit fcad23
}
Packit fcad23
Packit fcad23
sub fill_text {
Packit fcad23
    my $dump = shift;
Packit fcad23
    my $textw = shift;
Packit fcad23
    my $cmd = shift;
Packit fcad23
    my $insert = shift;
Packit fcad23
    $textw->delete('1.0','end');
Packit fcad23
    if (defined($insert) && $insert) {
Packit fcad23
	$textw->insert('end',"running:  $$cmd\n\n");
Packit fcad23
    }
Packit fcad23
    $textw->toplevel->update();
Packit fcad23
    $textw->toplevel->Busy();
Packit fcad23
    open(OUT,"$$cmd|");
Packit fcad23
    while (<OUT>) {
Packit fcad23
	$textw->insert('end',$_);
Packit fcad23
	$textw->toplevel->update();
Packit fcad23
	$textw->toplevel->Busy();
Packit fcad23
    }
Packit fcad23
    close(OUT);
Packit fcad23
    if (defined ($insert) && $insert) {
Packit fcad23
	$textw->insert('end',"\ndone.\n");
Packit fcad23
    }
Packit fcad23
    $textw->toplevel->Unbusy();
Packit fcad23
    $textw->Unbusy();
Packit fcad23
    addToLog("done:  $$cmd");
Packit fcad23
}
Packit fcad23
Packit fcad23
sub display_help {
Packit fcad23
    print "
Packit fcad23
Usage:  snmpcheck [-x] [-n|y] [-h] [-H] [-V NUM] [-L] [-f] [[-a] HOSTS] 
Packit fcad23
Packit fcad23
  -h\tDisplay this message.
Packit fcad23
  -a\tcheck error log file AND hosts specified on command line.
Packit fcad23
  -p\tDon't try and ping-echo the host first
Packit fcad23
  -f\tOnly check for things I can fix
Packit fcad23
  HOSTS\tcheck these hosts for problems.
Packit fcad23
Packit fcad23
X Options:
Packit fcad23
  -x\tforces ascii base if \$DISPLAY set (instead of tk).
Packit fcad23
  -H\tstart in hidden mode.  (hides user interface)
Packit fcad23
  -V NUM\tsets the initial verbosity level of the command log (def: 1)
Packit fcad23
  -L\tShow the log window at startup
Packit fcad23
  -d\tDon't start by checking anything.  Just bring up the interface.
Packit fcad23
Packit fcad23
Ascii Options:
Packit fcad23
  -n\tDon't ever try and fix the problems found.  Just list.
Packit fcad23
  -y\tAlways fix problems found.
Packit fcad23
Packit fcad23
";
Packit fcad23
    exit(0);
Packit fcad23
Packit fcad23
}
Packit fcad23
Packit fcad23
sub option_get {
Packit fcad23
    my $resource = shift;
Packit fcad23
    return $top->option('get',$resource);
Packit fcad23
}
Packit fcad23
Packit fcad23
sub option_set {
Packit fcad23
    my $resource = shift;
Packit fcad23
    my $value = shift;
Packit fcad23
    $top->option('add',"*$resource",$value);
Packit fcad23
}
Packit fcad23
Packit fcad23
sub option_save {
Packit fcad23
Packit fcad23
}
Packit fcad23
Packit fcad23
sub mibsort {
Packit fcad23
    $_ = $a;
Packit fcad23
    ($av) = /\.([0-9]+)/;
Packit fcad23
    $_ = $b;
Packit fcad23
    ($bv) = /\.([0-9]+)/;
Packit fcad23
    return $av <=> $bv;
Packit fcad23
}
Packit fcad23
Packit fcad23
sub setmibchecklist {
Packit fcad23
    my $i;
Packit fcad23
    foreach $i (keys(%mibchecklist)) {
Packit fcad23
	$mibchecklist{$i} = 0;
Packit fcad23
    }
Packit fcad23
    foreach $i (@_) {
Packit fcad23
	$mibchecklist{$i} = 1;
Packit fcad23
    }
Packit fcad23
}