X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fcheck_nt.c;h=85c67531faabee25d9ea1e9edfb5b35a141410d6;hb=575e82a500d1b097b70883a8e50f4b92451d8270;hp=ed0dc98b14b5c4f205bde23ef651d8fddfb95363;hpb=44a321cb8a42d6c0ea2d96a1086a17f2134c89cc;p=nagiosplug.git diff --git a/plugins/check_nt.c b/plugins/check_nt.c index ed0dc98..85c6753 100644 --- a/plugins/check_nt.c +++ b/plugins/check_nt.c @@ -1,34 +1,33 @@ /****************************************************************************** * - * This file is part of the Nagios Plugins. + * CHECK_NT.C * - * Copyright (c) 2000 Yves Rubin + * Program: Windows NT plugin for NetSaint + * License: GPL + * Copyright (c) 2000-2002 Yves Rubin (rubiyz@yahoo.com) * - * The Nagios Plugins are free software; you can redistribute them - * and/or modify them 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. + * Description: + * + * This requires NSClient software to run on NT (http://nsclient.ready2run.nl/) * - * 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. + * 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$ - * *****************************************************************************/ - -#define PROGRAM check_nt -#define DESCRIPTION "Windows NT plugin for Nagios" -#define AUTHOR "Yves Rubin" -#define EMAIL "rubiyz@yahoo.com" -#define COPYRIGHTDATE "2000" - -//#include "stdlib.h" + #include "config.h" #include "common.h" #include "netutils.h" @@ -43,6 +42,7 @@ #define CHECK_PROCSTATE 6 #define CHECK_MEMUSE 7 #define CHECK_COUNTER 8 +#define CHECK_FILEAGE 9 #define MAX_VALUE_LIST 30 #define PORT 1248 @@ -61,7 +61,7 @@ int check_critical_value=FALSE; int vars_to_check=CHECK_NONE; int show_all=FALSE; -#define PROGNAME "check_nt" +const char *progname = "check_nt"; int process_arguments(int, char **); void print_usage(void); @@ -70,13 +70,11 @@ void preparelist(char *string); int main(int argc, char **argv){ int result; - int return_code; + int return_code = STATE_UNKNOWN; char *send_buffer=NULL; char recv_buffer[MAX_INPUT_BUFFER]; char *output_message=NULL; - char *temp_buffer=NULL; char *temp_string=NULL; - char *sep_string=NULL; char *description=NULL; double total_disk_space=0; @@ -84,18 +82,16 @@ int main(int argc, char **argv){ double percent_used_space=0; double mem_commitLimit=0; double mem_commitByte=0; - unsigned long current_connections=0; unsigned long utilization; unsigned long uptime; - unsigned long cache_hits; - unsigned long cache_buffers; - unsigned long lru_time; + unsigned long age_in_minutes; double counter_value; int offset=0; int updays=0; int uphours=0; int upminutes=0; - req_password=strscpy(req_password,"None"); + + asprintf(&req_password,"None"); if(process_arguments(argc,argv)==ERROR) usage("Could not parse arguments\n"); @@ -107,28 +103,33 @@ int main(int argc, char **argv){ alarm(socket_timeout); if (vars_to_check==CHECK_CLIENTVERSION) { - - send_buffer = strscpy(send_buffer,strcat(req_password,"&1")); + + asprintf(&send_buffer,strcat(req_password,"&1")); result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer)); if(result!=STATE_OK) return result; - output_message = strscpy(output_message,recv_buffer); + asprintf(&output_message,recv_buffer); return_code=STATE_OK; + } + else if(vars_to_check==CHECK_CPULOAD){ if (check_value_list==TRUE) { if (strtolarray(&lvalue_list,value_list,",")==TRUE) { - // -l parameters is present with only integers + /* -l parameters is present with only integers */ return_code=STATE_OK; - temp_string = strscpy(temp_string,"CPU Load"); - while (lvalue_list[0+offset]>0 && lvalue_list[0+offset]<=17280 && - lvalue_list[1+offset]>=0 && lvalue_list[1+offset]<=100 && - lvalue_list[2+offset]>=0 && lvalue_list[2+offset]<=100) { - // loop until one of the parameters is wrong or not present - - // Send request and retrieve data - send_buffer = ssprintf(send_buffer,"%s&2&%lu",req_password,lvalue_list[0+offset]); + asprintf(&temp_string,"CPU Load"); + while (lvalue_list[0+offset]>(unsigned long)0 && + lvalue_list[0+offset]<=(unsigned long)17280 && + lvalue_list[1+offset]>=(unsigned long)0 && + lvalue_list[1+offset]<=(unsigned long)100 && + lvalue_list[2+offset]>=(unsigned long)0 && + lvalue_list[2+offset]<=(unsigned long)100) { + /* loop until one of the parameters is wrong or not present */ + + /* Send request and retrieve data */ + asprintf(&send_buffer,"%s&2&%lu",req_password,lvalue_list[0+offset]); result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer)); if(result!=STATE_OK) return result; @@ -140,33 +141,33 @@ int main(int argc, char **argv){ utilization=strtoul(recv_buffer,NULL,10); - // Check if any of the request is in a warning or critical state + /* Check if any of the request is in a warning or critical state */ if(utilization >= lvalue_list[2+offset]) return_code=STATE_CRITICAL; else if(utilization >= lvalue_list[1+offset] && return_code10) { - // we had at least on loop - output_message = ssprintf(output_message,"%s",temp_string); + /* we had at least on loop */ + asprintf(&output_message,"%s",temp_string); } else - output_message = strscpy(output_message,"not enough values for -l parameters"); + asprintf(&output_message,"%s","not enough values for -l parameters"); } else - output_message = strscpy(output_message,"wrong -l parameter."); + asprintf(&output_message,"wrong -l parameter."); } else - output_message = strscpy(output_message,"missing -l parameters"); + asprintf(&output_message,"missing -l parameters"); } else if(vars_to_check==CHECK_UPTIME){ - send_buffer = strscpy(send_buffer,strcat(req_password,"&3")); + asprintf(&send_buffer,strcat(req_password,"&3")); result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer)); if(result!=STATE_OK) return result; @@ -180,7 +181,7 @@ int main(int argc, char **argv){ updays = uptime / 86400; uphours = (uptime % 86400) / 3600; upminutes = ((uptime % 86400) % 3600) / 60; - output_message = ssprintf(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; } @@ -189,7 +190,7 @@ int main(int argc, char **argv){ return_code=STATE_UNKNOWN; if (check_value_list==TRUE) { if (strlen(value_list)==1) { - send_buffer = ssprintf(send_buffer,"%s&4&%s", req_password, value_list); + asprintf(&send_buffer,"%s&4&%s", req_password, value_list); result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer)); if(result!=STATE_OK) return result; @@ -204,7 +205,7 @@ int main(int argc, char **argv){ percent_used_space = ((total_disk_space - free_disk_space) / total_disk_space) * 100; if (free_disk_space>=0) { - temp_string = ssprintf(temp_string,"%s:\\ - total: %.2f Gb - used: %.2f Gb (%.0f%%) - free %.2f Gb (%.0f%%)", + asprintf(&temp_string,"%s:\\ - total: %.2f Gb - used: %.2f Gb (%.0f%%) - free %.2f Gb (%.0f%%)", value_list, total_disk_space / 1073741824, (total_disk_space - free_disk_space) / 1073741824, percent_used_space, free_disk_space / 1073741824, (free_disk_space / total_disk_space)*100); @@ -216,26 +217,26 @@ int main(int argc, char **argv){ else return_code=STATE_OK; - output_message = ssprintf(output_message,"%s",temp_string); + asprintf(&output_message,"%s",temp_string); } else { - output_message = ssprintf(output_message,"Free disk space : Invalid drive "); + asprintf(&output_message,"Free disk space : Invalid drive "); return_code=STATE_UNKNOWN; } } else - output_message = strscpy(output_message,"wrong -l argument"); + asprintf(&output_message,"wrong -l argument"); } else - output_message = strscpy(output_message,"missing -l parameters"); + asprintf(&output_message,"missing -l parameters"); } else if(vars_to_check==CHECK_SERVICESTATE || vars_to_check==CHECK_PROCSTATE){ if (check_value_list==TRUE) { - preparelist(value_list); // replace , between services with & to send the request - send_buffer = ssprintf(send_buffer,"%s&%u&%s&%s", req_password,(vars_to_check==CHECK_SERVICESTATE)?5:6, + 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); result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer)); if(result!=STATE_OK) @@ -247,15 +248,15 @@ int main(int argc, char **argv){ } return_code=atoi(strtok(recv_buffer,"&")); temp_string=strtok(NULL,"&"); - output_message = ssprintf(output_message, "%s",temp_string); + asprintf(&output_message, "%s",temp_string); } else - output_message = strscpy(output_message,"No service/process specified"); + asprintf(&output_message,"No service/process specified"); } else if(vars_to_check==CHECK_MEMUSE) { - send_buffer = ssprintf(send_buffer,"%s&7", req_password); + asprintf(&send_buffer,"%s&7", req_password); result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer)); if (result!=STATE_OK) return result; @@ -268,7 +269,7 @@ int main(int argc, char **argv){ mem_commitLimit=atof(strtok(recv_buffer,"&")); mem_commitByte=atof(strtok(NULL,"&")); percent_used_space = (mem_commitByte / mem_commitLimit) * 100; - output_message = ssprintf(output_message,"Memory usage: total:%.2f Mb - used: %.2f Mb (%.0f%%) - free: %.2f Mb (%.0f%%)", + asprintf(&output_message,"Memory usage: total:%.2f Mb - used: %.2f Mb (%.0f%%) - free: %.2f Mb (%.0f%%)", mem_commitLimit / 1048576, mem_commitByte / 1048567, percent_used_space, (mem_commitLimit - mem_commitByte) / 1048576, (mem_commitLimit - mem_commitByte) / mem_commitLimit * 100); @@ -284,8 +285,8 @@ int main(int argc, char **argv){ else if(vars_to_check==CHECK_COUNTER) { if (check_value_list==TRUE) { - preparelist(value_list); // replace , between services with & to send the request - send_buffer = ssprintf(send_buffer,"%s&8&%s", req_password,value_list); + preparelist(value_list); /* replace , between services with & to send the request */ + asprintf(&send_buffer,"%s&8&%s", req_password,value_list); result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer)); if (result!=STATE_OK) return result; @@ -295,16 +296,16 @@ int main(int argc, char **argv){ exit(STATE_UNKNOWN); } - strtok(value_list,"&"); // burn the first parameters + strtok(value_list,"&"); /* burn the first parameters */ description = strtok(NULL,"&"); counter_value = atof(recv_buffer); if (description == NULL) - output_message = ssprintf(output_message, "%.f", counter_value); + asprintf(&output_message, "%.f", counter_value); else - output_message = ssprintf(output_message, description, counter_value); + asprintf(&output_message, description, counter_value); if (critical_value > warning_value) { - // Normal thresholds + /* 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) @@ -313,7 +314,7 @@ int main(int argc, char **argv){ return_code=STATE_OK; } else { - // inverse thresholds + /* inverse thresholds */ if(check_critical_value==TRUE && counter_value <= critical_value) return_code=STATE_CRITICAL; else if (check_warning_value==TRUE && counter_value <= warning_value) @@ -324,7 +325,50 @@ int main(int argc, char **argv){ } else { - output_message = strscpy(output_message,"No counter specified"); + asprintf(&output_message,"No counter specified"); + result=STATE_UNKNOWN; + } + } + else if(vars_to_check==CHECK_FILEAGE) { + + if (check_value_list==TRUE) { + preparelist(value_list); /* replace , between services with & to send the request */ + asprintf(&send_buffer,"%s&9&%s", req_password,value_list); + result=process_tcp_request(server_address,server_port,send_buffer,recv_buffer,sizeof(recv_buffer)); + if (result!=STATE_OK) + return result; + + if (!strncmp(recv_buffer,"ERROR",5)) { + printf("NSClient - %s\n",recv_buffer); + exit(STATE_UNKNOWN); + } + + age_in_minutes = atoi(strtok(recv_buffer,"&")); + description = strtok(NULL,"&"); + asprintf(&output_message, description); + + if (critical_value > warning_value) { + /* Normal thresholds */ + if(check_critical_value==TRUE && age_in_minutes >= critical_value) + return_code=STATE_CRITICAL; + else if (check_warning_value==TRUE && age_in_minutes >= warning_value) + 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; + else if (check_warning_value==TRUE && age_in_minutes <= warning_value) + return_code=STATE_WARNING; + else + return_code=STATE_OK; + } + + } + else { + asprintf(&output_message,"No file specified"); result=STATE_UNKNOWN; } } @@ -342,7 +386,6 @@ int main(int argc, char **argv){ int process_arguments(int argc, char **argv){ int c; -#ifdef HAVE_GETOPT_H int option_index = 0; static struct option long_options[] = { @@ -356,7 +399,6 @@ int process_arguments(int argc, char **argv){ {"help", no_argument, 0,'h'}, {0,0,0,0} }; -#endif /* no options were supplied */ if(argc<2) return ERROR; @@ -379,11 +421,7 @@ int process_arguments(int argc, char **argv){ } while (1){ -#ifdef HAVE_GETOPT_H c = getopt_long(argc,argv,"+hVH:t:c:w:p:v:l:s:d:",long_options,&option_index); -#else - c = getopt(argc,argv,"+hVH:t:c:w:p:v:l:s:d:"); -#endif if (c==-1||c==EOF||c==1) break; @@ -391,26 +429,26 @@ 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",my_basename(argv[0]),optarg); + printf("%s: Unknown argument: %s\n\n",progname,optarg); print_usage(); exit(STATE_UNKNOWN); case 'h': /* help */ print_help(); exit(STATE_OK); case 'V': /* version */ - print_revision(my_basename(argv[0]),"$Revision$"); + print_revision(progname,"$Revision$"); exit(STATE_OK); case 'H': /* hostname */ server_address=optarg; break; case 's': /* password */ - req_password=strscpy(req_password,optarg); + asprintf(&req_password,optarg); break; case 'p': /* port */ if (is_intnonneg(optarg)) server_port=atoi(optarg); else - terminate(STATE_UNKNOWN,"Server port an integer (seconds)\nType '%s -h' for additional help\n",PROGNAME); + die(STATE_UNKNOWN,"Server port an integer (seconds)\nType '%s -h' for additional help\n",progname); break; case 'v': if(strlen(optarg)<4) @@ -431,11 +469,13 @@ int process_arguments(int argc, char **argv){ vars_to_check=CHECK_MEMUSE; else if(!strcmp(optarg,"COUNTER")) vars_to_check=CHECK_COUNTER; + else if(!strcmp(optarg,"FILEAGE")) + vars_to_check=CHECK_FILEAGE; else return ERROR; break; case 'l': /* value list */ - value_list=strscpy(value_list,optarg); + asprintf(&value_list,"%s",optarg); check_value_list=TRUE; break; case 'w': /* warning threshold */ @@ -458,67 +498,93 @@ int process_arguments(int argc, char **argv){ } + if (vars_to_check==CHECK_NONE) + return ERROR; + return OK; } void print_usage(void) { - printf("Usage: %s -H host [-p port] [-v variable] [-w warning] [-c critical] [-l params] [-d SHOWALL] [-t timeout]\n",PROGNAME); + printf("Usage: %s -H host -v variable [-p port] [-w warning] [-c critical] [-l params] [-d SHOWALL] [-t timeout]\n",progname); } void print_help(void) { - print_revision(PROGNAME,"$Revision$"); - printf - ("Copyright (c) 2000 Yves Rubin (rubiyz@yahoo.com)\n\n" - "This plugin attempts to contact the NSClient service running on a Windows NT or Windows 2000 server to\n" - "gather the requested system information.\n\n"); + 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_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" - "-v, --variable=STRING\n" - " Variable to check. Valid variables are:\n" - " CLIENTVERSION = Get the NSClient version\n" - " CPULOAD = Average CPU load on last x minutes. Request a -l parameter with the following syntax:\n" - " -l ,,. should be less than 24*60.\n" - " Thresholds are percentage and up to 10 requests can be done in one shot. ie: -l 60,90,95,120,90,95\n" - " UPTIME = Get the uptime of the machine. No specific parameters. No warning or critical threshold\n" - " USEDDISKSPACE = Size and percentage of disk use. Request a -l parameter containing the drive letter only.\n" - " Warning and critical thresholds can be specified with -w and -c.\n" - " MEMUSE = Memory use. Warning and critical thresholds can be specified with -w and -c.\n" - " SERVICESTATE = Check the state of one or several services. Request a -l parameters with the following syntax:\n" - " -l ,,,... You can specify -d SHOWALL in case you want to see working services\n" - " in the returned string.\n" - " PROCSTATE = Check if one or several process are running. Same syntax as SERVICESTATE.\n" - " COUNTER = Check any performance counter of Windows NT/2000. Request a -l parameters with the following syntax:\n" - " -l \"\\\\\\\\counter\",\"\" The parameter is optional and \n" - " is given to a printf output command which require a float parameters. Some examples:\n" - " \"Paging file usage is %%.2f %%%%\" or \"%%.f %%%% paging file used.\"\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\n" - "Notes:\n" - " - The NSClient service should be running on the server to get any information.\n" - " - Critical thresholds should be lower than warning thresholds\n", PORT, DEFAULT_SOCKET_TIMEOUT); + 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"); + 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"); } int strtolarray(unsigned long *array, char *string, char *delim) { - // split a delimited string into a long array + /* split a delimited string into a long array */ int idx=0; char *t1; @@ -537,10 +603,10 @@ int strtolarray(unsigned long *array, char *string, char *delim) { } void preparelist(char *string) { - // Replace all , with & which is the delimiter for the request + /* Replace all , with & which is the delimiter for the request */ int i; - for (i = 0; i < strlen(string); i++) + for (i = 0; (size_t)i < strlen(string); i++) if (string[i] == ',') { string[i]='&'; }