/****************************************************************************** * * CHECK_NT.C * * Program: Windows NT plugin for NetSaint * 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. * *****************************************************************************/ #include "common.h" #include "netutils.h" #include "utils.h" enum checkvars { CHECK_NONE, CHECK_CLIENTVERSION, CHECK_CPULOAD, CHECK_UPTIME, CHECK_USEDDISKSPACE, CHECK_SERVICESTATE, CHECK_PROCSTATE, CHECK_MEMUSE, CHECK_COUNTER, CHECK_FILEAGE }; enum { MAX_VALUE_LIST = 30, 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; 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); int process_arguments(int, char **); void preparelist(char *string); int strtoularray(unsigned long *array, char *string, const char *delim); void print_help(void); void print_usage(void); int main(int argc, char **argv){ int return_code = STATE_UNKNOWN; char *send_buffer=NULL; char *output_message=NULL; char *temp_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 utilization; unsigned long uptime; unsigned long age_in_minutes; double counter_value; int offset=0; int updays=0; int uphours=0; int upminutes=0; setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); 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); switch (vars_to_check) { case CHECK_CLIENTVERSION: asprintf(&send_buffer, "%s&1", req_password); fetch_data (server_address, server_port, send_buffer); output_message = strdup (recv_buffer); return_code=STATE_OK; break; case CHECK_CPULOAD: if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else if (strtoularray(lvalue_list,value_list,",")==FALSE) output_message = strdup (_("wrong -l parameter.")); else { /* -l parameters is present with only integers */ return_code=STATE_OK; temp_string = strdup (_("CPU Load")); /* loop until one of the parameters is wrong or not present */ 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) { /* Send request and retrieve data */ asprintf(&send_buffer,"%s&2&%lu",req_password,lvalue_list[0+offset]); fetch_data (server_address, server_port, send_buffer); 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 one loop */ output_message = strdup (temp_string); else output_message = strdup (_("not enough values for -l parameters")); } break; case CHECK_UPTIME: asprintf(&send_buffer, "%s&3", req_password); fetch_data (server_address, server_port, send_buffer); uptime=strtoul(recv_buffer,NULL,10); 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); return_code=STATE_OK; break; case CHECK_USEDDISKSPACE: if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else if (strlen(value_list)==1) output_message = strdup (_("wrong -l argument")); else { asprintf(&send_buffer,"%s&4&%s", req_password, value_list); fetch_data (server_address, server_port, send_buffer); 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) { 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); 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 = strdup (temp_string); } else { output_message = strdup (_("Free disk space : Invalid drive ")); return_code=STATE_UNKNOWN; } } break; case CHECK_SERVICESTATE: case CHECK_PROCSTATE: if (value_list==NULL) output_message = strdup (_("No service/process specified")); 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); fetch_data (server_address, server_port, send_buffer); return_code=atoi(strtok(recv_buffer,"&")); temp_string=strtok(NULL,"&"); output_message = strdup (temp_string); } break; case CHECK_MEMUSE: asprintf(&send_buffer,"%s&7", req_password); fetch_data (server_address, server_port, send_buffer); mem_commitLimit=atof(strtok(recv_buffer,"&")); mem_commitByte=atof(strtok(NULL,"&")); percent_used_space = (mem_commitByte / mem_commitLimit) * 100; 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); 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; break; 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); 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; } } break; case CHECK_FILEAGE: 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&9&%s", req_password,value_list); fetch_data (server_address, server_port, send_buffer); age_in_minutes = atoi(strtok(recv_buffer,"&")); description = strtok(NULL,"&"); output_message = strdup (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; } } break; case CHECK_NONE: default: usage (_("")); break; } /* 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; int option = 0; static struct option longopts[] = { {"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} }; /* no options were supplied */ if(argc<2) return ERROR; /* backwards compatibility */ if (! is_option(argv[1])) { server_address = strdup(argv[1]); argv[1]=argv[0]; argv=&argv[1]; argc--; } for (c=1;c delimited string into a long array */ int idx=0; char *t1; for (idx=0;idx\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")); } 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); }