X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fcheck_nt.c;h=cac826f5502a0eaa53abf4f18855d443e045b408;hb=6ecaa524bf28b5fb861b161ea075a11119cb3bd2;hp=ef0a66b5f2d82b5c3942ccceda6d899a2fb151ac;hpb=1321f206eb4afb2f877adc5811ad790a732a7cc5;p=nagiosplug.git diff --git a/plugins/check_nt.c b/plugins/check_nt.c index ef0a66b..cac826f 100644 --- a/plugins/check_nt.c +++ b/plugins/check_nt.c @@ -26,8 +26,15 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * + * $Id$ + * *****************************************************************************/ +const char *progname = "check_nt"; +const char *revision = "$Revision$"; +const char *copyright = "2003-2004"; +const char *email = "nagiosplug-devel@lists.sourceforge.net"; + #include "common.h" #include "netutils.h" #include "utils.h" @@ -63,8 +70,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); @@ -75,13 +80,17 @@ 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; char *perfdata=NULL; char *temp_string=NULL; char *temp_string_perf=NULL; - char *description=NULL; + char *description=NULL,*counter_unit = NULL; + char *minval = NULL, *maxval = NULL, *errcvt = NULL; double total_disk_space=0; double free_disk_space=0; @@ -90,21 +99,25 @@ int main(int argc, char **argv){ double critical_used_space=0; double mem_commitLimit=0; double mem_commitByte=0; + double fminval = 0, fmaxval = 0; 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; int upminutes=0; + int isPercent = FALSE; + int allRight = FALSE; + setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); - if(process_arguments(argc,argv)==ERROR) - usage(_("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); @@ -137,7 +150,7 @@ int main(int argc, char **argv){ /* -l parameters is present with only integers */ return_code=STATE_OK; temp_string = strdup (_("CPU Load")); - temp_string_perf = strdup (_(" ")); + temp_string_perf = strdup (" "); /* loop until one of the parameters is wrong or not present */ while (lvalue_list[0+offset]> (unsigned long)0 && @@ -183,7 +196,7 @@ int main(int argc, char **argv){ updays = uptime / 86400; uphours = (uptime % 86400) / 3600; upminutes = ((uptime % 86400) % 3600) / 60; - asprintf(&output_message,_("System Uptime : %u day(s) %u hour(s) %u minute(s)"),updays,uphours, upminutes); + asprintf(&output_message,_("System Uptime - %u day(s) %u hour(s) %u minute(s)"),updays,uphours, upminutes); return_code=STATE_OK; break; @@ -234,7 +247,7 @@ int main(int argc, char **argv){ else { preparelist(value_list); /* replace , between services with & to send the request */ asprintf(&send_buffer,"%s&%u&%s&%s", req_password,(vars_to_check==CHECK_SERVICESTATE)?5:6, - (show_all==TRUE)?_("ShowAll"):_("ShowFail"),value_list); + (show_all==TRUE) ? "ShowAll" : "ShowFail",value_list); fetch_data (server_address, server_port, send_buffer); return_code=atoi(strtok(recv_buffer,"&")); temp_string=strtok(NULL,"&"); @@ -252,12 +265,13 @@ int main(int argc, char **argv){ warning_used_space = ((float)warning_value / 100) * mem_commitLimit; critical_used_space = ((float)critical_value / 100) * mem_commitLimit; - // Changed divisor in following line from 1048567 to 3044515 to accurately reflect memory size + /* Divisor should be 1048567, not 3044515, as we are measuring "Commit Charge" here, + which equals RAM + Pagefiles. */ asprintf(&output_message,_("Memory usage: total:%.2f Mb - used: %.2f Mb (%.0f%%) - free: %.2f Mb (%.0f%%)"), - mem_commitLimit / 3044515, mem_commitByte / 3044515, percent_used_space, - (mem_commitLimit - mem_commitByte) / 3044515, (mem_commitLimit - mem_commitByte) / mem_commitLimit * 100); - asprintf(&perfdata,_("'Memory usage'=%.2fMb;%.2f;%.2f;0.00;%.2f"), mem_commitByte / 3044515, - warning_used_space / 3044515, critical_used_space / 3044515, mem_commitLimit / 3044515); + mem_commitLimit / 1048567, mem_commitByte / 1048567, percent_used_space, + (mem_commitLimit - mem_commitByte) / 1048567, (mem_commitLimit - mem_commitByte) / mem_commitLimit * 100); + asprintf(&perfdata,_("'Memory usage'=%.2fMb;%.2f;%.2f;0.00;%.2f"), mem_commitByte / 1048567, + warning_used_space / 1048567, critical_used_space / 1048567, mem_commitLimit / 1048567); return_code=STATE_OK; if(check_critical_value==TRUE && percent_used_space >= critical_value) @@ -269,40 +283,113 @@ int main(int argc, char **argv){ case CHECK_COUNTER: - if (value_list==NULL) - output_message = strdup (_("No counter specified")); - else { - preparelist(value_list); /* replace , between services with & to send the request */ - asprintf(&send_buffer,"%s&8&%s", req_password,value_list); - fetch_data (server_address, server_port, send_buffer); - strtok(value_list,"&"); /* burn the first parameters */ - description = strtok(NULL,"&"); - counter_value = atof(recv_buffer); - if (description == NULL) - asprintf(&output_message, "%.f", counter_value); - else - asprintf(&output_message,"%s = %.f", description, counter_value); - asprintf(&perfdata,"'%s'=%.f", description, counter_value); - - if (critical_value > warning_value) { /* Normal thresholds */ - if(check_critical_value==TRUE && counter_value >= critical_value) - return_code=STATE_CRITICAL; - else if (check_warning_value==TRUE && counter_value >= warning_value) - return_code=STATE_WARNING; - else - return_code=STATE_OK; - } - else { /* inverse thresholds */ - return_code=STATE_OK; - if(check_critical_value==TRUE && counter_value <= critical_value) - return_code=STATE_CRITICAL; - else if (check_warning_value==TRUE && counter_value <= warning_value) - return_code=STATE_WARNING; - } + /* + CHECK_COUNTER has been modified to provide extensive perfdata information. + In order to do this, some modifications have been done to the code + and some constraints have been introduced. + + 1) For the sake of simplicity of the code, perfdata information will only be + provided when the "description" field is added. + + 2) If the counter you're going to measure is percent-based, the code will detect + the percent sign in its name and will attribute minimum (0%) and maximum (100%) + values automagically, as well the ยจ%" sign to graph units. + + 3) OTOH, if the counter is "absolute", you'll have to provide the following + the counter unit - that is, the dimensions of the counter you're getting. Examples: + pages/s, packets transferred, etc. + + 4) If you want, you may provide the minimum and maximum values to expect. They aren't mandatory, + but once specified they MUST have the same order of magnitude and units of -w and -c; otherwise. + strange things will happen when you make graphs of your data. + */ + + if (value_list == NULL) + output_message = strdup (_("No counter specified")); + else + { + preparelist (value_list); /* replace , between services with & to send the request */ + isPercent = (strchr (value_list, '%') != NULL); + + strtok (value_list, "&"); /* burn the first parameters */ + description = strtok (NULL, "&"); + counter_unit = strtok (NULL, "&"); + asprintf (&send_buffer, "%s&8&%s", req_password, value_list); + fetch_data (server_address, server_port, send_buffer); + counter_value = atof (recv_buffer); + + + if (description == NULL) + asprintf (&output_message, "%.f", counter_value); + else if (isPercent) + { + counter_unit = strdup ("%"); + allRight = TRUE; + } + + if ((counter_unit != NULL) && (!allRight)) + { + minval = strtok (NULL, "&"); + maxval = strtok (NULL, "&"); + + /* All parameters specified. Let's check the numbers */ + + fminval = (minval != NULL) ? strtod (minval, &errcvt) : -1; + fmaxval = (minval != NULL) ? strtod (maxval, &errcvt) : -1; + + if ((fminval == 0) && (minval == errcvt)) + output_message = strdup (_("Minimum value contains non-numbers")); + else + { + if ((fmaxval == 0) && (maxval == errcvt)) + output_message = strdup (_("Maximum value contains non-numbers")); + else + allRight = TRUE; /* Everything is OK. */ + + } + } + else if ((counter_unit == NULL) && (description != NULL)) + output_message = strdup (_("No unit counter specified")); + + if (allRight) + { + /* Let's format the output string, finally... */ + + 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); + } + 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)); + } } - break; + if (critical_value > warning_value) + { /* Normal thresholds */ + if (check_critical_value == TRUE && counter_value >= critical_value) + return_code = STATE_CRITICAL; + else if (check_warning_value == TRUE && counter_value >= warning_value) + return_code = STATE_WARNING; + else + return_code = STATE_OK; + } + else + { /* inverse thresholds */ + return_code = STATE_OK; + if (check_critical_value == TRUE && counter_value <= critical_value) + return_code = STATE_CRITICAL; + else if (check_warning_value == TRUE && counter_value <= warning_value) + return_code = STATE_WARNING; + } + break; + case CHECK_FILEAGE: if (value_list==NULL) @@ -336,7 +423,7 @@ int main(int argc, char **argv){ case CHECK_NONE: default: - usage (_("Please specify a variable to check")); + usage4 (_("Please specify a variable to check")); break; } @@ -353,9 +440,6 @@ int main(int argc, char **argv){ - - - /* process command-line arguments */ int process_arguments(int argc, char **argv){ int c; @@ -403,14 +487,12 @@ int process_arguments(int argc, char **argv){ 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); + usage2 (_("Unknown argument"), optarg); 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); @@ -423,7 +505,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) @@ -483,16 +565,13 @@ int process_arguments(int argc, char **argv){ - - - void fetch_data (const char *address, int port, const char *sendb) { int result; 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); @@ -529,17 +608,18 @@ 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 (_("This plugin collects data from the NSClient service running on a\n\ +Windows NT/2000/XP/2003 server.\n\n")); + print_usage(); + printf (_("\nOptions:\n\ -H, --hostname=HOST\n\ Name of the host to check\n\ @@ -556,8 +636,8 @@ Windows NT/2000/XP server.\n\n")); -h, --help\n\ Print this help screen\n\ -V, --version\n\ - Print version information\n"), - PORT, DEFAULT_SOCKET_TIMEOUT); + Print version information\n"), PORT, DEFAULT_SOCKET_TIMEOUT); + printf (_("\ -v, --variable=STRING\n\ Variable to check. Valid variables are:\n")); @@ -595,7 +675,8 @@ Windows NT/2000/XP server.\n\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\ + is given to a printf output command which requires a float parameter.\n\ + If does not include \"%%\", it is used as a label.\n\ Some examples:\n\ \"Paging file usage is %%.2f %%%%\"\n\ \"%%.f %%%% paging file used.\"\n")); @@ -607,11 +688,9 @@ Windows NT/2000/XP server.\n\n")); - void print_usage(void) { - printf(_("\ + 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); + [-l params] [-d SHOWALL] [-t timeout]\n", progname); }