/****************************************************************************** * * This file is part of the Nagios Plugins. * * Copyright (c) 2000 Yves Rubin * * 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. * * 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" #include "utils.h" #define CHECK_NONE 0 #define CHECK_CLIENTVERSION 1 #define CHECK_CPULOAD 2 #define CHECK_UPTIME 3 #define CHECK_USEDDISKSPACE 4 #define CHECK_SERVICESTATE 5 #define CHECK_PROCSTATE 6 #define CHECK_MEMUSE 7 #define CHECK_COUNTER 8 #define MAX_VALUE_LIST 30 #define PORT 1248 char *server_address=NULL; char *volume_name=NULL; int server_port=PORT; char *value_list=NULL; char *req_password=NULL; unsigned long lvalue_list[MAX_VALUE_LIST]; unsigned long warning_value=0L; unsigned long critical_value=0L; int check_value_list=FALSE; int check_warning_value=FALSE; int check_critical_value=FALSE; int vars_to_check=CHECK_NONE; int show_all=FALSE; #define PROGNAME "check_nt" int process_arguments(int, char **); void print_usage(void); void print_help(void); void preparelist(char *string); int main(int argc, char **argv){ int result; int return_code; 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; double free_disk_space=0; 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; double counter_value; int offset=0; int updays=0; int uphours=0; int upminutes=0; req_password=strscpy(req_password,"None"); if(process_arguments(argc,argv)==ERROR) usage("Could not parse arguments\n"); /* initialize alarm signal handling */ signal(SIGALRM,socket_timeout_alarm_handler); /* set socket timeout */ alarm(socket_timeout); if (vars_to_check==CHECK_CLIENTVERSION) { send_buffer = strscpy(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); 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 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]); 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); } utilization=strtoul(recv_buffer,NULL,10); // 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); } else output_message = strscpy(output_message,"not enough values for -l parameters"); } else output_message = strscpy(output_message,"wrong -l parameter."); } else output_message = strscpy(output_message,"missing -l parameters"); } else if(vars_to_check==CHECK_UPTIME){ send_buffer = strscpy(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; if (!strncmp(recv_buffer,"ERROR",5)) { printf("NSClient - %s\n",recv_buffer); exit(STATE_UNKNOWN); } uptime=strtoul(recv_buffer,NULL,10); 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); return_code=STATE_OK; } else if(vars_to_check==CHECK_USEDDISKSPACE){ 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); 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); } free_disk_space=atof(strtok(recv_buffer,"&")); total_disk_space=atof(strtok(NULL,"&")); 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%%)", 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); if(check_critical_value==TRUE && percent_used_space >= critical_value) return_code=STATE_CRITICAL; else if (check_warning_value==TRUE && percent_used_space >= warning_value) return_code=STATE_WARNING; else return_code=STATE_OK; output_message = ssprintf(output_message,"%s",temp_string); } else { output_message = ssprintf(output_message,"Free disk space : Invalid drive "); return_code=STATE_UNKNOWN; } } else output_message = strscpy(output_message,"wrong -l argument"); } else output_message = strscpy(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, (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) return result; if (!strncmp(recv_buffer,"ERROR",5)) { printf("NSClient - %s\n",recv_buffer); exit(STATE_UNKNOWN); } return_code=atoi(strtok(recv_buffer,"&")); temp_string=strtok(NULL,"&"); output_message = ssprintf(output_message, "%s",temp_string); } else output_message = strscpy(output_message,"No service/process specified"); } else if(vars_to_check==CHECK_MEMUSE) { send_buffer = ssprintf(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; if (!strncmp(recv_buffer,"ERROR",5)) { printf("NSClient - %s\n",recv_buffer); exit(STATE_UNKNOWN); } 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%%)", mem_commitLimit / 1048576, mem_commitByte / 1048567, percent_used_space, (mem_commitLimit - mem_commitByte) / 1048576, (mem_commitLimit - mem_commitByte) / mem_commitLimit * 100); if(check_critical_value==TRUE && percent_used_space >= critical_value) return_code=STATE_CRITICAL; else if (check_warning_value==TRUE && percent_used_space >= warning_value) return_code=STATE_WARNING; else return_code=STATE_OK; } 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); 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); } 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); else output_message = ssprintf(output_message, 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 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 { output_message = strscpy(output_message,"No counter specified"); result=STATE_UNKNOWN; } } /* reset timeout */ alarm(0); printf("%s\n",output_message); return return_code; } /* process command-line arguments */ int process_arguments(int argc, char **argv){ int c; #ifdef HAVE_GETOPT_H int option_index = 0; static struct option long_options[] = { {"port", required_argument,0,'p'}, {"timeout", required_argument,0,'t'}, {"critical", required_argument,0,'c'}, {"warning", required_argument,0,'w'}, {"variable", required_argument,0,'v'}, {"hostname", required_argument,0,'H'}, {"version", no_argument, 0,'V'}, {"help", no_argument, 0,'h'}, {0,0,0,0} }; #endif /* no options were supplied */ if(argc<2) return ERROR; /* backwards compatibility */ if (! is_option(argv[1])) { server_address=argv[1]; argv[1]=argv[0]; argv=&argv[1]; argc--; } for (c=1;c\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); } int strtolarray(unsigned long *array, char *string, char *delim) { // split a delimited string into a long array int idx=0; char *t1; for (idx=0;idx