X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fcheck_nt.c;h=60d58fd09e33b58f2e265c259584c7889ea28b6a;hb=a36696e454ccd3bcfd9fbb0d5f22f4fe176b6e7e;hp=84b78bc5060a961fce56cabe4cd3abc42d3c8a82;hpb=d19edd4043c498626fe68308005947975ef0a697;p=nagiosplug.git diff --git a/plugins/check_nt.c b/plugins/check_nt.c index 84b78bc..60d58fd 100644 --- a/plugins/check_nt.c +++ b/plugins/check_nt.c @@ -1,34 +1,44 @@ -/****************************************************************************** - * - * CHECK_NT.C - * - * Program: Windows NT plugin for Nagios - * License: GPL - * Copyright (c) 2000-2002 Yves Rubin (rubiyz@yahoo.com) - * - * Description: - * - * This requires NSClient software to run on NT (http://nsclient.ready2run.nl/) - * - * License Information: - * - * 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., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * $Id$ - * - *****************************************************************************/ +/***************************************************************************** +* +* Nagios check_nt plugin +* +* License: GPL +* Copyright (c) 2000-2002 Yves Rubin (rubiyz@yahoo.com) +* Copyright (c) 2003-2007 Nagios Plugins Development Team +* +* Last Modified: $Date$ +* +* Description: +* +* This file contains the check_nt plugin +* +* This plugin collects data from the NSClient service running on a +* Windows NT/2000/XP/2003 server. +* This plugin requires NSClient software to run on NT +* (http://nsclient.ready2run.nl/) +* +* +* 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 3 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, see . +* +* $Id$ +* +*****************************************************************************/ + +const char *progname = "check_nt"; +const char *revision = "$Revision$"; +const char *copyright = "2000-2007"; +const char *email = "nagiosplug-devel@lists.sourceforge.net"; #include "common.h" #include "netutils.h" @@ -44,7 +54,8 @@ enum checkvars { CHECK_PROCSTATE, CHECK_MEMUSE, CHECK_COUNTER, - CHECK_FILEAGE + CHECK_FILEAGE, + CHECK_INSTANCES }; enum { @@ -65,8 +76,6 @@ int check_critical_value=FALSE; enum checkvars vars_to_check = CHECK_NONE; int show_all=FALSE; -const char *progname = "check_nt"; - char recv_buffer[MAX_INPUT_BUFFER]; void fetch_data (const char* address, int port, const char* sendb); @@ -77,6 +86,9 @@ void print_help(void); void print_usage(void); int main(int argc, char **argv){ + +/* should be int result = STATE_UNKNOWN; */ + int return_code = STATE_UNKNOWN; char *send_buffer=NULL; char *output_message=NULL; @@ -97,7 +109,7 @@ int main(int argc, char **argv){ unsigned long utilization; unsigned long uptime; unsigned long age_in_minutes; - double counter_value; + double counter_value = 0.0; int offset=0; int updays=0; int uphours=0; @@ -110,8 +122,8 @@ int main(int argc, char **argv){ bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); - if(process_arguments(argc,argv)==ERROR) - usage(_("check_nt: could not parse arguments\n")); + if(process_arguments(argc,argv) == ERROR) + usage4 (_("Could not parse arguments")); /* initialize alarm signal handling */ signal(SIGALRM,socket_timeout_alarm_handler); @@ -349,14 +361,18 @@ int main(int argc, char **argv){ if (allRight) { /* Let's format the output string, finally... */ - - asprintf (&output_message, "%s = %.2f %s", description, counter_value, counter_unit); - output_message = strcat (output_message, "|"); - output_message = strcat (output_message, - fperfdata (description, counter_value, counter_unit, - 1, warning_value, 1, critical_value, - (!(isPercent) && (minval != NULL)), fminval, - (!(isPercent) && (minval != NULL)), fmaxval)); + if (strstr(description, "%") == NULL) { + asprintf (&output_message, "%s = %.2f %s", description, counter_value, counter_unit); + } else { + /* has formatting, will segv if wrong */ + asprintf (&output_message, description, counter_value); + } + asprintf (&output_message, "%s |", output_message); + asprintf (&output_message,"%s %s", output_message, + fperfdata (description, counter_value, + counter_unit, 1, warning_value, 1, critical_value, + (!(isPercent) && (minval != NULL)), fminval, + (!(isPercent) && (minval != NULL)), fmaxval)); } } @@ -398,7 +414,7 @@ int main(int argc, char **argv){ return_code=STATE_WARNING; else return_code=STATE_OK; - } + } else { /* inverse thresholds */ if(check_critical_value==TRUE && age_in_minutes <= critical_value) return_code=STATE_CRITICAL; @@ -410,9 +426,24 @@ int main(int argc, char **argv){ } break; + case CHECK_INSTANCES: + if (value_list==NULL) + output_message = strdup (_("No counter specified")); + else { + asprintf(&send_buffer,"%s&10&%s", req_password,value_list); + fetch_data (server_address, server_port, send_buffer); + if (!strncmp(recv_buffer,"ERROR",5)) { + printf("NSClient - %s\n",recv_buffer); + exit(STATE_UNKNOWN); + } + asprintf(&output_message,"%s",recv_buffer); + return_code=STATE_OK; + } + break; + case CHECK_NONE: default: - usage (_("Please specify a variable to check")); + usage4 (_("Please specify a variable to check")); break; } @@ -467,23 +498,20 @@ int process_arguments(int argc, char **argv){ strcpy(argv[c],"-c"); } - while (1){ + while (1) { c = getopt_long(argc,argv,"+hVH:t:c:w:p:v:l:s:d:",longopts,&option); if (c==-1||c==EOF||c==1) break; - switch (c) - { + switch (c) { case '?': /* print short usage statement if args not parsable */ - printf("%s: Unknown argument: %s\n\n",progname,optarg); - print_usage(); - exit(STATE_UNKNOWN); + usage5 (); case 'h': /* help */ print_help(); exit(STATE_OK); case 'V': /* version */ - print_revision(progname,"$Revision$"); + print_revision(progname,revision); exit(STATE_OK); case 'H': /* hostname */ if (server_address) free(server_address); @@ -496,7 +524,7 @@ int process_arguments(int argc, char **argv){ if (is_intnonneg(optarg)) server_port=atoi(optarg); else - die(STATE_UNKNOWN,_("Server port an integer (seconds)\nType '%s -h' for additional help\n"),progname); + die(STATE_UNKNOWN,_("Server port must be an integer\n")); break; case 'v': if(strlen(optarg)<4) @@ -519,6 +547,8 @@ int process_arguments(int argc, char **argv){ vars_to_check=CHECK_COUNTER; else if(!strcmp(optarg,"FILEAGE")) vars_to_check=CHECK_FILEAGE; + else if(!strcmp(optarg,"INSTANCES")) + vars_to_check=CHECK_INSTANCES; else return ERROR; break; @@ -562,7 +592,7 @@ void fetch_data (const char *address, int port, const char *sendb) { result=process_tcp_request(address, port, sendb, recv_buffer,sizeof(recv_buffer)); if(result!=STATE_OK) - die (result, "could not fetch information from server\n"); + die (result, _("could not fetch information from server\n")); if (!strncmp(recv_buffer,"ERROR",5)) die (STATE_UNKNOWN, "NSClient - %s\n",recv_buffer); @@ -601,83 +631,110 @@ void preparelist(char *string) { void print_help(void) { - print_revision(progname,"$Revision$"); - printf (_("\ -Copyright (c) 2000 Yves Rubin (rubiyz@yahoo.com)\n\n\ -This plugin collects data from the NSClient service running on a\n\ -Windows NT/2000/XP server.\n\n")); + print_revision(progname,revision); + + printf ("Copyright (c) 2000 Yves Rubin (rubiyz@yahoo.com)\n"); + printf (COPYRIGHT, copyright, email); + + printf ("%s\n", _("This plugin collects data from the NSClient service running on a")); + printf ("%s\n", _("Windows NT/2000/XP/2003 server.")); + + printf ("\n\n"); + print_usage(); - printf (_("\nOptions:\n\ --H, --hostname=HOST\n\ - Name of the host to check\n\ --p, --port=INTEGER\n\ - Optional port number (default: %d)\n\ --s \n\ - Password needed for the request\n\ --w, --warning=INTEGER\n\ - Threshold which will result in a warning status\n\ --c, --critical=INTEGER\n\ - Threshold which will result in a critical status\n\ --t, --timeout=INTEGER\n\ - Seconds before connection attempt times out (default: %d)\n\ --h, --help\n\ - Print this help screen\n\ --V, --version\n\ - Print version information\n"), - PORT, DEFAULT_SOCKET_TIMEOUT); - printf (_("\ --v, --variable=STRING\n\ - Variable to check. Valid variables are:\n")); - printf (_("\ - CLIENTVERSION = Get the NSClient version\n\ - If -l is specified, will return warning if versions differ.\n")); - printf (_("\ - CPULOAD = Average CPU load on last x minutes.\n\ - Request a -l parameter with the following syntax:\n\ - -l ,,.\n\ - should be less than 24*60.\n\ - Thresholds are percentage and up to 10 requests can be done in one shot.\n\ - ie: -l 60,90,95,120,90,95\n")); - printf (_("\ - UPTIME = Get the uptime of the machine.\n\ - No specific parameters. No warning or critical threshold\n")); - printf (_("\ - USEDDISKSPACE = Size and percentage of disk use.\n\ - Request a -l parameter containing the drive letter only.\n\ - Warning and critical thresholds can be specified with -w and -c.\n")); - printf (_("\ - MEMUSE = Memory use.\n\ - Warning and critical thresholds can be specified with -w and -c.\n")); - printf (_("\ - SERVICESTATE = Check the state of one or several services.\n\ - Request a -l parameters with the following syntax:\n\ - -l ,,,...\n\ - You can specify -d SHOWALL in case you want to see working services\n\ - in the returned string.\n")); - printf (_("\ - PROCSTATE = Check if one or several process are running.\n\ - Same syntax as SERVICESTATE.\n")); - printf (_("\ - COUNTER = Check any performance counter of Windows NT/2000.\n\ - Request a -l parameters with the following syntax:\n\ - -l \"\\\\\\\\counter\",\"\n\ - The parameter is optional and \n\ - is given to a printf output command which require a float parameters.\n\ - Some examples:\n\ - \"Paging file usage is %%.2f %%%%\"\n\ - \"%%.f %%%% paging file used.\"\n")); - printf (_("Notes:\n\ - - The NSClient service should be running on the server to get any information\n\ - (http://nsclient.ready2run.nl).\n\ - - Critical thresholds should be lower than warning thresholds\n")); + + printf (_(UT_HELP_VRSN)); + + printf ("%s\n", _("Options:")); + printf (" %s\n", "-H, --hostname=HOST"); + printf (" %s\n", _("Name of the host to check")); + printf (" %s\n", "-p, --port=INTEGER"); + printf (" %s", _("Optional port number (default: ")); + printf ("%d)\n", PORT); + printf (" %s\n", "-s "); + printf (" %s\n", _("Password needed for the request")); + printf (" %s\n", "-w, --warning=INTEGER"); + printf (" %s\n", _("Threshold which will result in a warning status")); + printf (" %s\n", "-c, --critical=INTEGER"); + printf (" %s\n", _("Threshold which will result in a critical status")); + printf (" %s\n", "-t, --timeout=INTEGER"); + printf (" %s", _("Seconds before connection attempt times out (default: ")); + printf ("%d)\n", DEFAULT_SOCKET_TIMEOUT); + printf (" %s\n", "-h, --help"); + printf (" %s\n", _("Print this help screen")); + printf (" %s\n", "-V, --version"); + printf (" %s\n", _("Print version information")); + printf (" %s\n", "-v, --variable=STRING"); + printf (" %s\n\n", _("Variable to check")); + printf ("%s\n", _("Valid variables are:")); + printf (" %s", "CLIENTVERSION ="); + printf (" %s\n", _("Get the NSClient version")); + printf (" %s\n", _("If -l is specified, will return warning if versions differ.")); + printf (" %s\n", "CPULOAD ="); + printf (" %s\n", _("Average CPU load on last x minutes.")); + printf (" %s\n", _("Request a -l parameter with the following syntax:")); + printf (" %s\n", _("-l ,,.")); + printf (" %s\n", _(" should be less than 24*60.")); + printf (" %s\n", _("Thresholds are percentage and up to 10 requests can be done in one shot.")); + printf (" %s\n", "ie: -l 60,90,95,120,90,95"); + printf (" %s\n", "UPTIME ="); + printf (" %s\n", _("Get the uptime of the machine.")); + printf (" %s\n", _("No specific parameters. No warning or critical threshold")); + printf (" %s\n", "USEDDISKSPACE ="); + printf (" %s\n", _("Size and percentage of disk use.")); + printf (" %s\n", _("Request a -l parameter containing the drive letter only.")); + printf (" %s\n", _("Warning and critical thresholds can be specified with -w and -c.")); + printf (" %s\n", "MEMUSE ="); + printf (" %s\n", _("Memory use.")); + printf (" %s\n", _("Warning and critical thresholds can be specified with -w and -c.")); + printf (" %s\n", "SERVICESTATE ="); + printf (" %s\n", _("Check the state of one or several services.")); + printf (" %s\n", _("Request a -l parameters with the following syntax:")); + printf (" %s\n", _("-l ,,,...")); + printf (" %s\n", _("You can specify -d SHOWALL in case you want to see working services")); + printf (" %s\n", _("in the returned string.")); + printf (" %s\n", "PROCSTATE ="); + printf (" %s\n", _("Check if one or several process are running.")); + printf (" %s\n", _("Same syntax as SERVICESTATE.")); + printf (" %s\n", "COUNTER ="); + printf (" %s\n", _("Check any performance counter of Windows NT/2000.")); + printf (" %s\n", _("Request a -l parameters with the following syntax:")); + printf (" %s\n", _("-l \"\\\\\\\\counter\",\"")); + printf (" %s\n", _("The parameter is optional and is given to a printf ")); + printf (" %s\n", _("output command which requires a float parameter.")); + printf (" %s\n", _("If does not include \"%%\", it is used as a label.")); + printf (" %s\n", _("Some examples:")); + printf (" %s\n", "\"Paging file usage is %%.2f %%%%\""); + printf (" %s\n", "\"%%.f %%%% paging file used.\""); + printf (" %s\n", "INSTANCES ="); + printf (" %s\n", _("Check any performance counter object of Windows NT/2000.")); + printf (" %s\n", _("Syntax: check_nt -H -p -v INSTANCES -l ")); + printf (" %s\n", _(" is a Windows Perfmon Counter object (eg. Process),")); + printf (" %s\n", _("if it is two words, it should be enclosed in quotes")); + printf (" %s\n", _("The returned results will be a comma-separated list of instances on ")); + printf (" %s\n", _(" the selected computer for that object.")); + printf (" %s\n", _("The purpose of this is to be run from command line to determine what instances")); + printf (" %s\n", _(" are available for monitoring without having to log onto the Windows server")); + printf (" %s\n", _(" to run Perfmon directly.")); + printf (" %s\n", _("It can also be used in scripts that automatically create Nagios service")); + printf (" %s\n", _(" configuration files.")); + printf (" %s\n", _("Some examples:")); + printf (" %s\n\n", _("check_nt -H 192.168.1.1 -p 1248 -v INSTANCES -l Process")); + printf (_("Notes:")); + printf (" %s\n", _("- The NSClient service should be running on the server to get any information")); + printf (" %s\n", "(http://nsclient.ready2run.nl)."); + printf (" %s\n", _("- Critical thresholds should be lower than warning thresholds")); + printf (" %s\n", _("- Default port 1248 is sometimes in use by other services. The error")); + printf (" %s\n", _("output when this happens contains \"Cannot map xxxxx to protocol number\".")); + printf (" %s\n", _("One fix for this is to change the port to something else on check_nt ")); + printf (" %s\n", _("and on the client service it\'s connecting to.")); } void print_usage(void) { - printf(_("\ -Usage: %s -H host -v variable [-p port] [-w warning] [-c critical]\n\ - [-l params] [-d SHOWALL] [-t timeout]\n"), progname); - printf (_(UT_HLP_VRS), progname, progname); + printf (_("Usage:")); + printf ("%s -H host -v variable [-p port] [-w warning] [-c critical]",progname); + printf ("[-l params] [-d SHOWALL] [-t timeout]\n"); }