From 11dfdb89c93619e12ccefb60259770eba5754216 Mon Sep 17 00:00:00 2001 From: Subhendu Ghosh Date: Mon, 19 Apr 2004 13:10:48 +0000 Subject: check_mssql.pl git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@869 f882894a-f735-0410-b71e-b25c423dba1c diff --git a/AUTHORS b/AUTHORS index e3dd8fd..3d5f9b7 100644 --- a/AUTHORS +++ b/AUTHORS @@ -110,3 +110,5 @@ Jon Hallett Flo Gleixner Howard Wilkinson Torsten Werner +Roy Sigurd Karlsbakk + diff --git a/plugins-scripts/check_mssql.pl b/plugins-scripts/check_mssql.pl new file mode 100755 index 0000000..fa15476 --- /dev/null +++ b/plugins-scripts/check_mssql.pl @@ -0,0 +1,141 @@ +#!/usr/bin/perl -w + +# +# Copyright 2003 Roy Sigurd Karlsbakk +# +# Requires freetds and DBD::Sybase +# http://www.freetds.org +# http://www.mbay.net/~mpeppler/ +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Report bugs to: nagiosplug-help@lists.sourceforge.net +# +# $Id$ +# + + +use DBI; +use DBD::Sybase; +use Getopt::Long; +use lib "."; +use utils qw($TIMEOUT %ERRORS &print_revision &support); +use strict; + +my $PROGNAME = "check_mssql"; + +my ( + $server,$database,$username,$password,$query,$help,$verbose,$timeout, + $dbh,$sth,$row, + $s,$opt_V,$regex +); +my $exitcode = $ERRORS{'OK'}; + +process_arguments(); + +# Just in case of problems, let's not hang Nagios +$SIG{'ALRM'} = sub { + print ("SQL UNKNOWN: ERROR connection $server (alarm timeout)\n"); + exit $ERRORS{"UNKNOWN"}; +}; +alarm($TIMEOUT); + +unless ($dbh = DBI->connect("dbi:Sybase:server=".uc($server), "$username", "$password")) { + printf "SQL CRITICAL: Can't connect to mssql server $DBI::errstr\n"; + exit($ERRORS{'CRITICAL'}); +} + +if (defined $database) { # otherwise use default database + unless ($dbh->do("use $database")) { + printf ("SQL CRITICAL: Can't 'use $database': $dbh->errstr"); + exit($ERRORS{'CRITICAL'}); + } +} +$sth = $dbh->prepare($query); +unless ($sth->execute()) { + printf("SQL CRITICAL: Error in query: $dbh->errstr\n"); + exit($ERRORS{'CRITICAL'}); +} + +$row = join(";",$sth->fetchrow_array); + +$sth->finish; +$dbh->disconnect; + +alarm(0); +if (defined $regex) { + if ($row =~ /$regex/) { + printf "SQL CRITICAL: - $row|$row\n"; + exit $ERRORS{'CRITICAL'}; + }else{ + print "SQL OK: $row|$row\n"; + exit $ERRORS{'OK'}; + } +} + +print "SQL OK: $row|$row\n"; +exit $ERRORS{'OK'}; + +################################################## + +sub syntax { + $s = shift or $s = 'Unknown'; + printf("Error: ($s)\n") unless ($help); + printf("Runs a query against a MS-SQL server or Sybase server and returns the first row\n"); + printf("Returns an error if no responses are running. Row is passed to perfdata in\n"); + printf("semicolon delimited format\n"); + printf("A simple sql statement like \"select getdate()\" verifies server responsiveness\n\n"); + printf("Syntax: %s -s -d -u -p -q [-v]\n", $PROGNAME); + printf(" --database -d Database name\n"); + printf(" --Hostname -H Server name\n"); + printf(" --username -u Username\n"); + printf(" --password -p Password\n"); + printf(" --query -q SQL query to run\n"); + printf(" --timeout -t Plugin timeout (default:$TIMEOUT)\n"); + printf(" --regex -r regex against SQL response(CRIT if MATCH)\n"); + printf(" --verbose -v verbose\n"); + printf("\nThe SQL response is concatenated into a string with a \";\" demarkation\n\n"); + exit($ERRORS{'UNKNOWN'}); +} + +sub process_arguments { + Getopt::Long::Configure('bundling'); + my $status = GetOptions + ("p=s" => \$password, "password=s" => \$password, + "u=s" => \$username, "username=s" => \$username, + "H=s" => \$server, "Hostname=s" => \$server, + "d=s" => \$database, "database=s" => \$database, + "q=s" => \$query, "query=s" => \$query, + "t=i" => \$timeout, "timeout=i" => \$timeout, + "r=s" => \$regex, "regex=s" => \$regex, + "h" => \$help, "help" => \$help, + "v" => \$verbose, "verbose" => \$verbose, + "V" => \$opt_V, "version" => \$opt_V); + + if (defined $opt_V) { + print_revision($PROGNAME,'$Revision$'); + exit $ERRORS{'OK'}; + } + + syntax("Help:") if ($help); + syntax("Missing username") unless (defined($username)); + syntax("Missing password") unless (defined($password)); + syntax("Missing server") unless (defined($server)); + syntax("Missing query string") unless (defined($query)); + $timeout = $TIMEOUT unless (defined($timeout)); + + return; + +} -- cgit v0.10-9-g596f