| [Date Prev] [Date Next] | [Thread Prev] [Thread Next] | [Date Index] [Thread Index] |
[nocol-users] SQLMon
|
I made some changes to the SQL monitor provided by Rick. Let me know how this works for you all, seems to work beautifully for me. --Nathan ____________________________________________________________________ Nathan Clemons, Systems Engineer WinStar Internet and Hosting Services 800 South Main St. Mansfield, MA 02048 ____________________________________________________________________ nclemons@winstar.com www.winstar.com (v) 800-234-0002 ext.1109 nathan@ici.net (f) 508-261-0430
#!/usr/local/bin/perl
#
# SQLmon - monitor for DBI accessible SQL servers
#
# Part of the NOCOL monitoring package.
#
## Contributed by Richard Beebe II (richard.beebe@yale.edu)
# Derived from ciscomon
#
##
#
#
use DBI;
require "nocollib.pl" ;
local ($vpad) = "";
############################
## Variables customization # overrides values in the nocollib.pl library
############################
$sleepint=60*10; # Seconds to sleep between tries.
############################
#$debug = 0; # set to 1 for debugging output
$debug = 1; # set to 1 for debugging output
$libdebug = 0; # set to 1 for debugging output
$maxseverity = $E_CRITICAL ;
$sev{'Critical'} = $E_CRITICAL;
$sev{'Error'} = $E_ERROR;
$sev{'Warning'} = $E_WARNING;
$sev{'Info'} = $E_INFO;
$prognm = $0; # save program name
# Read the config file. Use '\t' as a separator for 'item'
sub readconf {
local ($var);
local ($host);
open(CONFIG,"<$cfile")||die("Couldn't find $cfile, exiting");
while(<CONFIG>) {
chop;
if(/^\s*#/) {next;} # skip comments
if(/^\s*$/) {next;} # skip blank lines
if (/^(pollinterval)\s*(\S*)$/i) {
$sleepint = $2 if $2;
next;
}
if (/^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(.+)$/)
{
$item="$1\t$2" ; # the name and address
$maxseverity{$item} = $sev{$3} ? $sev{$3} : $maxseverity;
$data_source{$item} = $4 if $4;
$username{$item} = $5;
$password{$item} = $6;
if (!$7) {
die "$item line doesn't have enough fields!";
}
$query_string{$item} = $7;
$sender{$item} = 'sqlmon';
$varname{$item} = 'SQLserver';
$sitename{$item} = $1;
$siteaddr{$item} = $2;
$varvalue{$item} = 1;
$varthres{$item} = 0;
$varunits{$item} = 'Up';
$severity{$item} = $E_INFO;
push (@items, $item);
next;
} else {
print "Ignoring illegal line: $_\n";
}
} # end while(CONFIG)
close(CONFIG);
if(0>$#items){die("Nothing to monitor in $cfile, exiting")};
if ($debug) {
print "Items are:\n"; foreach (@items) { print "\t$_\n" } ;
}
} # end: readconf
&nocol_startup;
&readconf;
local ($stime, $deltatime);
## Check state of each router
#
while (1) {
local ($host, $ipaddr) = @_ ;
$stime = time;
foreach $item (@items ) {
# ($host,$ipaddr) = split(/\t/,$item);
$rc = 0;
$failconnect = 0;
print "(debug) dotest: connecting to database $data_source{$item} ($username{$item}, $password{$item})\n" if $debug;
if ($dbh = DBI->connect($data_source{$item}, $username{$item}, $password{$item})) {
print "(debug) dotest: running command $query_string{$item}\n" if $debug;
if (!($rc = $dbh->do($query_string{$item}))) {
print "(debug) $host : $dbh->errstr" if $debug;
$failconnect = -1;
}
} else {
print "(debug) $host : $DBI::errstr" if $debug;
$rc = $failconnect = -1;
}
# $item = "$host\t$ipaddr";
$varvalue{$item} = $rc;
print "(debug) dotest: SQL query returned: ".$rc."\n" if $debug;
if ($rc > 0) { #status is UP
($mon{$item},$day{$item},$hour{$item},$min{$item}) = &gettime ;
if (!($nocop{$item} & $n_UP)) { # recent state change
$nocop{$item} = $nocop{$item} & ~($n_UP | $n_DOWN | $n_UNKNOWN) | $n_UP;
$loglevel{$item} = $severity{$item} ; # loglevel set to old level
$severity{$item} = $E_INFO;
&eventlog(&packevent($item)) ; # log to noclogd daemon
}
} else { # Status is DOWN
$varvalue{$item} = 0;
local($oseverity) = $severity{$item} ;
$severity{$item} = ($severity{$item} > $maxseverity{$item}) ? ($severity{$item} - 1) : $maxseverity{$item};
$nocop{$item}= $nocop{$item} & ~($n_UP | $n_DOWN | $n_UNKNOWN) | $n_DOWN;
if ($oseverity != $severity{$item}) { # severity change
($mon{$item},$day{$item},$hour{$item},$min{$item}) = &gettime ;
# smaller severity is more severe... set that as loglevel
$loglevel{$item}= $severity{$item} < $oseverity ? $severity{$item}:$oseverity;
&eventlog(&packevent($item));
}
}
if ($failconnect > -1) { $dbh->disconnect; }
} # end: for $h ($host)
open(OEVENTS,">$datafile");
foreach $item (@items) {
if(!$forget{$item}) {
&writeevent(OEVENTS, $item);
}
}
close(OEVENTS);
$deltatime = time - $stime; # time to do tests
if ($sleepint > $deltatime) { sleep($sleepint - $deltatime); }
} # end: while(1)
###
### main
###
#&nocol_main ;
|