#!/usr/bin/perl -w ## Author: Wolfgang Wagner # $Id: check_wsc.pl v1.2 # 2007-06-05 ww add an interface for accessing generic_wmi # increase verbose output sligthly # do not check for -p as necessary parameter anymore (did not allow default params to be handled of webesrvice) # corrected: --help did not display help # Modified 2006-12-01 W. Wagner aka "Wolle" ## originally Written 01/07/04 F. Thomas use strict; use Getopt::Long; use LWP::UserAgent; use URI::Escape; use vars qw($PROGRAM); use lib "/usr/lib/nagios/plugins"; # path to util.pm use utils qw ($TIMEOUT %ERRORS &print_revision &support); sub print_usage_simple(); sub print_usage(); sub print_usage2(); my $version = "1.2"; use vars qw($opt_H $opt_r $opt_p $opt_t $opt_w $opt_help); use vars qw($name_webservice $verbose $timeout $agent); use vars qw($generic_wmi_class $generic_fields $generic_where); $PROGRAM="check_wsc"; # setting defaults $timeout = 30; # seconds $agent = "nagios-check_wsc $version"; $name_webservice = "nagios/service1.asmx"; # compatible to v0.6 from fthomas $opt_help=0; GetOptions ("H:s" => \$opt_H, "Hostname:s" => \$opt_H, "r:s" => \$opt_r, "remote_wsc:s" => \$opt_r, "p:s" => \$opt_p, "parameter:s" => \$opt_p, "t:s" => \$opt_t, "servicetype:s" => \$opt_t, "v" => \$verbose, "verbose" => \$verbose, "w:s" => \$name_webservice, "webservice:s", => \$name_webservice, "timeout:i" => \$timeout, "useragent:s" => \$agent, "help" => \$opt_help, # "help" => \$opt_help, "debug" => \$verbose, "wmi_class:s" => \$generic_wmi_class, "fields:s" => \$generic_fields, "where:s" => \$generic_where); # if ($opt_help ne 0) { print_usage2(); } my $host = $opt_H || print_usage(); my $remote = $opt_r || 'intralbc'; my $parameter = ""; if ($opt_p) { $parameter = $opt_p; } $parameter =~ s/ /%20/g; my $status = $ERRORS{'OK'}; my $output = ""; my $method = $opt_t || 'disks'; #--- parameters just when using generic_wmi my $wmi_class; my $fields = ""; my $where = ""; if ($method eq "generic_wmi") { $wmi_class = $generic_wmi_class || print_usage(); if ($generic_fields) { $fields = $generic_fields; } if ($generic_where) { $where = $generic_where; } } if ($verbose) { print "gateway=$remote\n"; print "webservice=$name_webservice\n"; print "host being checked=$host\n"; print "method=$method\n"; print "param=$parameter\n"; print "timeout=$timeout\n"; print "useragent=$agent\n"; print "wmi_class=$wmi_class\n"; print "select_fields=$fields\n"; print "where_clause=$where\n"; } my $ua = new LWP::UserAgent; $ua->agent($agent); $ua->timeout($timeout); my $req; my $req_string; if ($method eq "generic_wmi") { $req_string="http://$remote/$name_webservice/generic_WMI?server=$host&WMI_Class=$wmi_class&Select_Fields=$fields&Where_clause=$where"; }else { $req_string = "http://$remote/$name_webservice/$method?server=$host¶m=$parameter"; } $req = new HTTP::Request 'GET'=> $req_string; if ($verbose) { print "sending request=[$req_string]\n"; } my $response = $ua->request($req); if ($verbose) { print "returning from request\n"; } my $code = $response->code(); my $mess = $response->message(); if ($code ne 200) { $output = "check_wsc UNKNOWN: Problem getting service response message, code=$code, message=$mess"; $status=$ERRORS{'UNKNOWN'}; # unknown } else { my $buffer = $response->content();; $status = -1; # if nothing expected is returned if ($verbose) { print $buffer; } # check for probably correct response (custom error pages where not detected as incorrect) v1.0.1 # if (substr($buffer,0,4) ne " return original xml if ($method eq "generic_wmi") { $output = $buffer; $status = $ERRORS{'OK'}; } else { my $index = index($buffer, "Warning"); if ( $index gt -1) { $status = $ERRORS{'WARNING'}; } $index = index($buffer, "Critical"); if ( $index gt -1) { $status = $ERRORS{'CRITICAL'}; } my $index2 = index($buffer, "Result:"); $output = substr($buffer, $index2); if ($output ne "" and $index2 gt -1) { $index2 = index($output, "/g; if ($status eq "-1") { $status = $ERRORS{'OK'}; } } # } if ( $status eq "-1" ) { # content returned is unexpected $output = "Unexpected content returned:\n" . substr($response->content(),0,100); $output =~ s/<//g; $status = $ERRORS{'UNKNOWN'}; } } } print "$output\n"; exit $status; sub print_usage_simple() { print "usage check_wsc.pl -H -r [-p ] -t [-w ]\n\t[--wmi_class ] [--fields ] [--where ] [-v]\n"; print "check_wsc (v$version)\n"; print "use --help to see all otions\n"; } sub print_usage2() { print_usage_simple(); print "check_wsc (v$version)\n"; print "Options:\n --help Print detailed help screen -H, --hostname=STRING Hostaddress to be checked -r, --remote_wsc=STRING Address of the gateway serving the webservice -p, --parameter= Parameter for a specified service type -t, --servicetype=STRING Type of check to be executed -v, --verbose Detailed output of check-script -w, --webservice=STRING URL where the webservice can be found. Example: \"/Service1.asmx\". Default: \"/nagios/service1.asmx\". --timeout=integer Timeout in seconds waiting for response message from webservice --useragent=string String to be sent in http header as \"User Agent\"A --wmi_class=STRING WMI_Class to query Parameters when using servicetype=generic_wmi to return WMI-XML --wmi_class=STRING WMI-class to be queried --fields=STRING[,STRING]... Comma seperated list of fields to be selected from the WMI-class --where=STRING where clause to limit query; example --where=\"DeviceID=\\\"CPU1\\\" and ProcessorType=\\\"3\\\" "; exit $ERRORS{'UNKNOWN'}; } sub print_usage() { print_usage_simple(); exit $ERRORS{'UNKNOWN'}; }