/****************************************************************************** * CHECK_NC_NET.C - modified from the Check_nt.c in NC_NEt 2.x july 05 * * CHECK_NT.C -was modified from nagios official plugins version 1.4 beta1 * http://sourceforge.net/projects/nagiosplug/ * downloaded on Jan 30,2005 * * Program: Windows NT plugin for Nagios * License: GPL * Copyright (c) 2007 TOny Montibello (tony@MontiTech.com) * Support: NC_Net@MontiTech.com ; * * Description: * This requires one of the following Windows Servers running: * NC_Net availible from (http://sourceforge.net/projects/nc-net) * NSClient software to run on NT (http://nsclient.ready2run.nl/) * NSClient++ http://sourceforge.net/projects/nscplus/ * * 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: check_nc_net.c,v 4.00 2007/03/20 11:51:05 amontibello Exp $ * *****************************************************************************/ const char *progname = "check_nc_net"; const char *revision = "$Revision: 4.4.0 $"; const char *copyright = "2008"; const char *email = "NC_Net@MontiTech.com"; #include "common.h" #include "netutils.h" #include "utils.h" enum checkvars { CHECK_NONE, CHECK_CLIENTVERSION, /*1*/ CHECK_CPULOAD, /*2*/ CHECK_UPTIME, /*3*/ CHECK_USEDDISKSPACE, /*4*/ CHECK_FREEDISKSPACE, /*13*/ CHECK_SERVICESTATE, /*5*/ CHECK_PROCSTATE, /*6*/ CHECK_MEMUSE, /*7*/ CHECK_COUNTER, /*8*/ CHECK_FILEAGE, /*9*/ CHECK_INSTANCES, /*10*/ CHECK_EVENTLOG, /*11*/ CHECK_WMICHECK, /*12*/ CHECK_CONFIG, /*99*/ ENUM_CONFIG, /*18*/ ENUM_PASSIVE, /*19*/ /* ADDPASSIVE - 98 is implemented as a switch -S */ CONFIG_DELPASSIVE, /*97*/ ENUM_PROCESS, /*17*/ ENUM_SERVICE, /*16*/ CHECK_WMICOUNTER, /*14*/ ENUM_COUNTER, /*15*/ ENUM_COUNTERDESC, /*20*/ CHECK_WMICAT, /*21*/ CHECK_RUNSCRIPT, /*101*/ ENUM_SCRIPT, /*102*/ CONFIG_COPYSCRIPT, /*103*/ CONFIG_DELSCRIPT, /*104*/ CONFIG_ADDSCRIPT, /*105*/ CHECK_CLIENTTIME, /*22*/ CHECK_GETALLCHECKS, /*50*/ CHECK_GETCHECK, /*51*/ ENUM_CHECK, /*52*/ CONFIG_DELCHECK, /*53*/ CHECK_GETCHECKTIME, /*54*/ CHECK_CONFIG_BLIND, /*100*/ CHECK_COMMAND_ENUM, /*106*/ CHECK_COMMAND_COPY, /*107*/ CHECK_COMMAND_DEL, /*108*/ CHECK_COMMAND_PRINT, /*109*/ CHECK_RUNSCRIPT_S, /*110*/ CHECK_CHANGEPASS, /*2000*/ CHECK_ECHO, /*2003*/ CHECK_RUN_CMD_FILE, /*2004*/ CHECK_RUNSCRIP_RAW_S, /*2006*/ CHECK_EVENTLOG_NEW, /*2009*/ CHECK_GETALLCHECK_2, /*2010*/ CHECK_WMICAT_NEW, /*2016*/ CHECK_RUNSCRIP_RAW_A, /*2029*/ CHECK_OTHER }; 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; char *service_desc=NULL; char *check_type=NULL; unsigned long lvalue_list[MAX_VALUE_LIST]; unsigned long warning_value=0L; unsigned long critical_value=0L; int check_warning_value=FALSE; int check_critical_value=FALSE; char *critical_value_string=NULL; char *warning_value_string=NULL; enum checkvars vars_to_check = CHECK_NONE; int show_all=FALSE; int add_passive_check=FALSE; /*change buffer size from MAX_INPUT_BUFFER to 4096*/ char recv_buffer[4096]; int alternate_tcp_socket=FALSE; void fetch_data (const char* address, int port, const char* sendb); int process_arguments(int, char **); void preparelist(char *string); void preparelist2(char *string, char c); int strtoularray(unsigned long *array, char *string, const char *delim); void print_help(void); void print_usage(void); void print_command( char * opts); static int my_connect2 (const char *host_name, int port, int *sd, int proto); int process_tcp_request3 (const char *server_address, int server_port, const char *send_buffer, char *recv_buffer, int recv_size); 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,*counter_unit = NULL; char *minval = NULL, *maxval = NULL, *errcvt = NULL; double total_disk_space=0; double free_disk_space=0; double percent_used_space=0; double warning_used_space=0; 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 = 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) usage4 (_("Could not parse arguments")); /* initialize alarm signal handling */ signal(SIGALRM,socket_timeout_alarm_handler); /* set socket timeout */ alarm(socket_timeout); if ( add_passive_check == TRUE ) { asprintf(&send_buffer, "%s&98", req_password); /* Tells NC_Net to add to passive.cfg */ /*each concatination to original string is a paired set based on args entered*/ asprintf(&send_buffer, "%s&%s&%s", send_buffer, check_type,service_desc ); if (check_warning_value==TRUE ) { /* check for warning*/ asprintf(&send_buffer, "%s&-w&%s", send_buffer, warning_value_string ); } if (check_critical_value==TRUE ) { /* check for critical*/ asprintf(&send_buffer, "%s&-c&%s", send_buffer, critical_value_string ); } if ( value_list != NULL ) { asprintf(&send_buffer, "%s&-l&%s", send_buffer, value_list ); } if ( vars_to_check== CHECK_SERVICESTATE|| vars_to_check ==CHECK_PROCSTATE ) { if (show_all==TRUE) asprintf(&send_buffer, "%s&-d&SHOWALL", send_buffer ); else asprintf(&send_buffer, "%s&-d&SHOWFAIL", send_buffer ); } fetch_data (server_address, server_port, send_buffer); /* asprintf (&output_message, "Running addpassive check -S: %s -v: %s",service_desc,check_type );*/ return_code=atoi(strtok(recv_buffer,"&")); temp_string=strtok(NULL,"&"); output_message = strdup (temp_string); } else /* run Switch statment*/ switch (vars_to_check) { case CHECK_CLIENTVERSION: asprintf(&send_buffer, "%s&1", req_password); fetch_data (server_address, server_port, send_buffer); if (value_list != NULL && strcmp(recv_buffer, value_list) != 0) { asprintf (&output_message, _("Wrong client version - running: %s, required: %s"), recv_buffer, value_list); return_code = STATE_WARNING; } else { asprintf (&output_message, "%s", 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")); temp_string_perf = strdup (" "); /* 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); perfdata = temp_string_perf; } 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; if( check_critical_value==TRUE && critical_value > updays ) return_code=STATE_CRITICAL; else if ( check_warning_value==TRUE && warning_value > updays ) return_code=STATE_WARNING; break; case CHECK_USEDDISKSPACE: case CHECK_FREEDISKSPACE: 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; warning_used_space = ( warning_value > 100 )?warning_value*1024.0*1024:(warning_value*1.0 / 100) * total_disk_space; critical_used_space = ( critical_value > 100 )?critical_value*1024.0*1024:(critical_value*1.0 / 100) * total_disk_space; 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); asprintf(&temp_string_perf,_("'%s: Used Space'=%.2fGb;%.2f;%.2f;0.00;%.2f"), value_list, (total_disk_space - free_disk_space) / 1073741824, warning_used_space / 1073741824, critical_used_space / 1073741824, total_disk_space / 1073741824); return_code=STATE_OK; if (check_warning_value==TRUE ) { if (vars_to_check==CHECK_FREEDISKSPACE) { if ( free_disk_space < warning_used_space ) { return_code=STATE_WARNING; } }else { /* test useddiskspace*/ if ( total_disk_space - free_disk_space > warning_used_space ) { return_code=STATE_WARNING; } } } if (check_critical_value==TRUE ) { if (vars_to_check==CHECK_FREEDISKSPACE) { if ( free_disk_space < critical_used_space ) { return_code=STATE_CRITICAL; } }else { /* test useddiskspace*/ if ( total_disk_space - free_disk_space > critical_used_space ) { return_code=STATE_CRITICAL; } } } output_message = strdup (temp_string); perfdata = temp_string_perf; } 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; warning_used_space = ((float)warning_value / 100) * mem_commitLimit; critical_used_space = ((float)critical_value / 100) * mem_commitLimit; /* 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 / 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) return_code=STATE_CRITICAL; else if (check_warning_value==TRUE && percent_used_space >= warning_value) return_code=STATE_WARNING; break; case CHECK_COUNTER: /* Check_Counter has been rewriten for NC_Net now it processes the pref data in a more consistent way to the Nagios plug-in development guidelines. 1) if no Units of mesurement use a 0 (zero) for the UOM in the check and the units will be omited from the output. 2) it will do MIN without a MAX 3) still processes custom min and max even if it is % 4) % has a default of min 0, max 100 5) -w and -c are no longer causing a seg fault. old code said to always process both for perf data, but it should have checked that they were in use. 6) the description is only a label for perf data not a formatter... */ if (value_list == NULL) output_message = strdup (_("No counter specified")); else { preparelist (value_list); /* replace , between services with & to send the request */ temp_string = strtok (value_list, "&"); isPercent = (strchr (temp_string, '%') != NULL); 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 (isPercent) counter_unit = strdup ("%"); if ( description != NULL && counter_unit == NULL ) counter_unit = strdup ( "0" ); if ( counter_unit != NULL && description != NULL) { if ( counter_unit[0] == '0' ) counter_unit[0] = '\0'; minval = strtok (NULL, "&"); maxval = strtok (NULL, "&"); if ( minval == NULL && isPercent ) asprintf(&minval,"0"); if ( minval != NULL ) fminval = strtod ( minval, NULL ) ; if ( maxval == NULL && isPercent ) asprintf(&maxval,"100"); if ( maxval != NULL ) fmaxval = strtod (maxval, NULL); allRight = TRUE; /* Let's format the output string, finally... */ asprintf (&output_message, "%s = %.2f %s", description, counter_value, counter_unit); asprintf (&output_message,"%s | %s", output_message, fperfdata (description, counter_value, counter_unit, check_warning_value, warning_value, check_critical_value, critical_value, (minval != NULL), fminval, (maxval != NULL), fmaxval )); } else if (isPercent) asprintf(&output_message, "%s = %.2f %%",temp_string,counter_value); else asprintf(&output_message, "%s = %.2f",temp_string,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; } break; case CHECK_FILEAGE: if (value_list==NULL) output_message = strdup (_("No file 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 modified as per several requests */ /* 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; } if ( return_code == STATE_OK ) asprintf ( &output_message,"OK: %u Minutes, %s", age_in_minutes, value_list); else if ( return_code == STATE_WARNING ) asprintf ( &output_message,"WARNING: %u Minutes, %s", age_in_minutes, value_list); else if ( return_code == STATE_CRITICAL ) asprintf ( &output_message,"CRITICAL: %u Minutes, %s", age_in_minutes, value_list); else output_message = strdup (description); } break; case CHECK_INSTANCES: if (value_list==NULL) output_message = strdup (_("No Perfomance counter Category specified")); else { preparelist(value_list); asprintf(&send_buffer,"%s&10&%s", req_password,value_list); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; } break; case CHECK_EVENTLOG: if (value_list==NULL) asprintf(&send_buffer,"%s&11", req_password); else { asprintf(&send_buffer,"%s&11&%s", req_password,value_list); } fetch_data (server_address, server_port, send_buffer); return_code=atoi(strtok(recv_buffer,"&")); temp_string=strtok(NULL,"&"); if(check_critical_value==TRUE && return_code >= critical_value) return_code=STATE_CRITICAL; else if (check_warning_value==TRUE && return_code >= warning_value) return_code=STATE_WARNING; else if (check_warning_value==TRUE || check_critical_value==TRUE) return_code=STATE_OK; else if ( return_code == 0 ) return_code = STATE_OK; else if ( return_code != STATE_OK ) return_code=STATE_CRITICAL; output_message = strdup (temp_string); break; case CHECK_WMICHECK: if (value_list==NULL) output_message = strdup (_("No Query specified")); else { preparelist2(value_list,'^'); asprintf(&send_buffer, "%s&12&%s", req_password,value_list); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; } break; case CHECK_CONFIG: if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else { preparelist(value_list);/* replace , between parameters with & to send the request */ asprintf(&send_buffer,"%s&99&%s", req_password,value_list); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; } break; case ENUM_CONFIG: asprintf(&send_buffer,"%s&18", req_password); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; break; case ENUM_PASSIVE: asprintf(&send_buffer,"%s&19", req_password); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; break; case CONFIG_DELPASSIVE: if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else { asprintf(&send_buffer,"%s&97&%s", req_password, 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 ENUM_PROCESS: asprintf(&send_buffer,"%s&17", req_password); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; break; case ENUM_SERVICE: if ( value_list == NULL ) asprintf(&send_buffer,"%s&16&all", req_password); else { preparelist(value_list); asprintf(&send_buffer,"%s&16&%s", req_password,value_list); } fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; break; case ENUM_COUNTER: if ( value_list == NULL ) asprintf(&send_buffer,"%s&15", req_password); else { preparelist(value_list); asprintf(&send_buffer,"%s&15&%s", req_password,value_list); } fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; break; case CHECK_WMICOUNTER: /* requires -d input showall for checking against max showfail check against min */ if (value_list==NULL) output_message = strdup (_("No Query specified")); else { preparelist2(value_list,'^'); if ( show_all == FALSE ) /*&& warning_value > critical_value )*/ asprintf(&send_buffer, "%s&14&SHOWFAIL&%s", req_password,value_list); else asprintf(&send_buffer, "%s&14&SHOWALL&%s", req_password,value_list); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); counter_value =atof(output_message); return_code = STATE_OK; if ( show_all == TRUE ) { /* returned a max value*/ asprintf (&output_message, "%s \n%f Showall ", output_message, counter_value); if (check_warning_value == TRUE && counter_value >= atof(warning_value_string) ){ return_code = STATE_WARNING; } if (check_critical_value == TRUE && counter_value >= atof(critical_value_string)){ return_code = STATE_CRITICAL; } }else { /* returned a min value */ asprintf (&output_message, "%s \n%f Showfail ", output_message, counter_value ); if (check_warning_value == TRUE && counter_value <= atof(warning_value_string) ){ return_code = STATE_WARNING; } if (check_critical_value == TRUE && counter_value <= atof(critical_value_string) ){ return_code = STATE_CRITICAL; } } } break; case ENUM_COUNTERDESC: if ( value_list == NULL ) output_message = strdup (_("-l missing, no category specified.")); else { preparelist(value_list); asprintf(&send_buffer,"%s&20&%s", req_password,value_list); } fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; break; case CHECK_WMICAT: if (value_list==NULL) output_message = strdup (_("No Query specified")); else { preparelist2(value_list,'^'); asprintf(&send_buffer, "%s&21&%s", req_password,value_list); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; } break; case CHECK_RUNSCRIPT : if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else { asprintf(&send_buffer,"%s&101&%s", req_password, value_list); fetch_data (server_address, server_port, send_buffer); return_code=atoi(strtok(recv_buffer,"&")); temp_string=strtok(NULL,"&"); /* now check for thresholds befor submitting */ /*Qustion should retun code from script overider threshold : */ output_message = strdup (temp_string); } break; case ENUM_SCRIPT: asprintf(&send_buffer,"%s&102", req_password); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; break; case CONFIG_COPYSCRIPT: if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else { preparelist(value_list); asprintf(&send_buffer,"%s&103&%s", req_password, value_list); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; } break; case CONFIG_DELSCRIPT: if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else { asprintf(&send_buffer,"%s&104&%s", req_password, value_list); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; } break; case CONFIG_ADDSCRIPT: if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else { asprintf(&send_buffer,"%s&105&%s", req_password, value_list); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; } break; case CHECK_CLIENTTIME: asprintf(&send_buffer,"%s&22", req_password); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; break; case CHECK_GETALLCHECKS: asprintf(&send_buffer,"%s&50", req_password); 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_GETCHECK: if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else { preparelist(value_list); asprintf(&send_buffer,"%s&51&%s", req_password, value_list); fetch_data (server_address, server_port, send_buffer); /*output needs to be handled properly*/ asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; } break; case ENUM_CHECK: asprintf(&send_buffer,"%s&52", req_password); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; break; case CONFIG_DELCHECK: if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else { preparelist(value_list); asprintf(&send_buffer,"%s&53&%s", req_password, value_list); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; } break; case CHECK_GETCHECKTIME: if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else { preparelist(value_list); asprintf(&send_buffer,"%s&54&%s", req_password, value_list); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; } break; case CHECK_CONFIG_BLIND: if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else { preparelist(value_list);/* replace , between parameters with & to send the request */ asprintf(&send_buffer,"%s&100&%s", req_password,value_list); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; } break; case CHECK_COMMAND_ENUM: asprintf(&send_buffer,"%s&106", req_password); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; break; case CHECK_COMMAND_COPY: if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else { preparelist(value_list); asprintf(&send_buffer,"%s&107&%s", req_password, value_list); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; } break; case CHECK_COMMAND_DEL: if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else { preparelist(value_list); asprintf(&send_buffer,"%s&108&%s", req_password, value_list); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; } break; case CHECK_COMMAND_PRINT: if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else { asprintf(&send_buffer,"%s&109&%s", req_password, value_list); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; } break; case CHECK_RUNSCRIPT_S: if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else { asprintf(&send_buffer,"%s&110&%s", req_password, 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_CHANGEPASS: if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else { preparelist(value_list); asprintf(&send_buffer,"%s&2000&%s", req_password, value_list); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; } break; case CHECK_ECHO: if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else { preparelist(value_list); asprintf(&send_buffer,"%s&2003&%s", req_password, value_list); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; } break; case CHECK_RUN_CMD_FILE: if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else { asprintf(&send_buffer,"%s&2004&%s", req_password, value_list); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; } break; case CHECK_RUNSCRIP_RAW_S: if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else { asprintf(&send_buffer,"%s&2006&%s", req_password, value_list); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; } break; case CHECK_EVENTLOG_NEW: if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else { asprintf(&send_buffer,"%s&2009&%s", req_password, value_list); fetch_data (server_address, server_port, send_buffer); /* Result is # of events found followed by eventIDs */ return_code=atoi(strtok(recv_buffer,"&")); temp_string=strtok(NULL,"&"); if(check_critical_value==TRUE && return_code >= critical_value) return_code=STATE_CRITICAL; else if (check_warning_value==TRUE && return_code >= warning_value) return_code=STATE_WARNING; else if (check_warning_value==TRUE || check_critical_value==TRUE) return_code=STATE_OK; else if ( return_code == 0 ) return_code = STATE_OK; else if ( return_code != STATE_OK ) return_code=STATE_CRITICAL; output_message = strdup (temp_string); } break; case CHECK_GETALLCHECK_2: asprintf(&send_buffer,"%s&2010", req_password, value_list); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; break; case CHECK_WMICAT_NEW: if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else { asprintf(&send_buffer,"%s&2016&%s", req_password, value_list); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; } break; case CHECK_RUNSCRIP_RAW_A: if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else { asprintf(&send_buffer,"%s&2029&%s", req_password, value_list); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; } break; case CHECK_OTHER: if (value_list==NULL) output_message = strdup (_("missing -l parameters")); else { asprintf(&send_buffer,"%s&%s", req_password, value_list); fetch_data (server_address, server_port, send_buffer); asprintf (&output_message, "%s", recv_buffer); return_code = STATE_OK; } break; case CHECK_NONE: default: usage4 (_("Please specify a variable to check")); break; } /* reset timeout */ alarm(0); if (perfdata==NULL) printf("%s\n",output_message); else printf("%s | %s\n",output_message,perfdata); 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'}, {"addpassive", required_argument,0,'S'}, {"hostname", required_argument,0,'H'}, {"version", no_argument, 0,'V'}, {"alternate", no_argument, 0,'a'}, {"help", optional_argument,0,'h'}, {0,0,0,0} }; /* no options were supplied */ if(argc<2) return ERROR; /* change default timeout to 20 seconds */ socket_timeout = 20; /* 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\ -a, --alternate\n\ Use alternate P Buffer sizes\n\ This allows for recieving more than the default buffer limit of 1249\n\ may not be compatible with NS_Client but OK for NC_NET\n\ When using this option, some data may skip processing \n\ and go directly to Standard Output\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=STRING\n\ Print Command specific help\n\ -V, --version\n\ Print version information\n"), PORT, 20); printf (_("\ -v, --variable=STRING\n\ Variable to check. Valid variables are:\n\ Use --help= -- to list help for that command.\n")); printf (_("\ CLIENTVERSION = Get the Check_nt version Number\n\ CPULOAD = Average CPU load on last x minutes.\n\ UPTIME = Get the uptime of the machine.\n\ USEDDISKSPACE = check Size(in Megs) or percentage of disk use.\n\ FREEDISKSPACE = check Size(in Megs) or percentage of disk free.\n\ MEMUSE = Memory use.\n\ SERVICESTATE = Check the state of one or several services.\n\ PROCSTATE = Check if one or several process are running.\n\ COUNTER = Check any performance counter of Windows NT/2000.\n\ FILEAGE = Checks how old a file is .\n\ INSTANCES = Check any performance counter Category for availible instances.\n\ EVENTLOG = Check any Event Log in Windows for any entry.\n\ WMICHECK = performs a WMI query on Windows server.\n\ WMICOUNTER = Checks -w -c against a specific querry\n\ WMICAT = Runs WMI Query and outputs Concatinated results\n\ CONFIG = push a configuration variable change to NC_Net via active checks.\n\ ENUMCONFIG = Prints NC_Net's configuration.\n\ ENUMPASSIVE = Print out list of service descriptions from passive.cfg\n\ DELPASSIVE = Deletes a passive check from NC_Net passive.cfg.\n\ ENUMCOUNTER = Enumerates performance counters.\n\ ENUMCOUNTERDESC = Prints the internal detailed description of a performance counter.\n\ ENUMSERVICE = Print out list of all services\n\ ENUMPROCESS = Prints all running processes.\n\ ENUMSCRIPT = Prints a list of files loaded in NC_Net script directory\n\ RUNSCRIPT = Runs a script loaded in NC_Net Script Directory (Asyncronous)\n\ ADDSCRIPT = Uploads a script into NC_Net Script Directory\n\ DELSCRIPT = Deletes a file in the NC_Net Script Directory\n\ COPYSCRIPT = Copies a file in the NC_Net Script Directory to a new file name\n\ CLIENTTIME = Gets the System time form the client Host.\n\ GETALLCHECKS = Gets the stored Service checks. (Passive checks must be running)\n\ GETCHECK = Get a stored check result form the client.\n\ ENUMCHECK = Comma seeperated list of stored checks on the client.\n\ DELCHECK = removes a check from the stored check.(run DELPASSIVE seperatly)\n\ GETCHECKTIME = gets the time that a stored check was preformed.\n\ COMMAND_ENUM = prints a list of the files names in the command directory\n\ COMMAND_COPY = copys one file to a new filename in the command directory\n\ COMMAND_DEL = delets a file in the command directory\n\ COMMAND_PRINT = Prints the content of a file in the command directory\n\ RUNSCRIPT_S = Runs a script loaded in NC_Net Script Directory (Syncronous)\n\ CHANGEPASS = Command used to Change the Password Remotly.\n\ ECHO = Command returns the -l input.\n\ RUN_CMD_FILE = Command used to run a file configured with checks to process\n\ RUNSCRIP_RAW_S = Runs a script loaded in NC_Net Script Directory (Syncronous)(Always OK)\n\ EVENTLOG_NEW = Optimized Command used to do a query againt the Event Logs\n\ GETALLCHECK_2 = Command used to get all PREFETCHED_DATA configured through Passive checks.\n\ WMICAT_NEW = newer version of WMICAT where output is a paired with Data Labels. \n\ RUNSCRIP_RAW_A- Runs a script loaded in NC_Net Script Directory (Asyncronous)(Always OK)\n\ OTHER = Makes -l function as the test conole. \n\ \n\ ADDPASSIVE = Add a passive check to passive.cfg.\n\ DO NOT use -v ADDPASSIVE \n\ Instead run the desired passive check as an active check from the command line.\n\ then after you tested the command add the switch -S \n\ (NOTE this is a capital S) \n")); printf (_("\ -S --addpassive=STRING\n\ the STRING should be the Nagios service description. (unique for each host)\n\ This option is used primarily to add a passive check to NC_Net's passive.cfg.\n\ Active checks do not require the service description. \n\ When this option is added to a service check it will send the check as an addition \n\ to the passive.cfg. This test will verify the check will return an OK result. \n\ If the check does not return OK the check will not be added or modified to passive.cfg\n")); printf (_("Notes:\n\ - NC_Net should be running. \n\ NC_Net@MontiTech.com \n\ (http://sourceforge.net/projects/nc-net).\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] [-S Service_description]\n\ [-a] [-h helpCommand] [-V] [-s password] ", progname); } void print_command_CLIENTVERSION(void){ printf (_("\ CLIENTVERSION = Get the NSClient version\n\ If -l is specified, will return warning if versions differ.\n")); } void print_command_CPULOAD(void){ 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")); } void print_command_UPTIME(void){ printf (_("\ UPTIME = Get the uptime of the machine.\n\ No specific parameters. No warning or critical threshold\n")); } void print_command_USEDDISKSPACE(void){ printf (_("\ USEDDISKSPACE = Size and percentage of disk use.\n\ Request a -l parameter containing the drive letter only.\n\ Thresholds can be specified (in precentage used) with -w and -c.\n\ When the warning or critical value is less than 100 it is evaluated as a percentage of space.\n\ When the warning or critical value are above 100 they are evaluated as MegaBytes.\n")); } void print_command_FREEDISKSPACE(void){ printf (_("\ FREEDISKSPACE = Size and percentage of disk use.\n\ Request a -l parameter containing the drive letter only.\n\ Thresholds can be specified (in megabytes free) with -w and -c.\n\ When the warning or critical value is less than 100 it is evaluated as a percentage of space.\n\ When the warning or critical value are above 100 they are evaluated as bytes.\n\ Warning and critical are Integers and therfore limited to numbers less than 4 gigs.\n")); } void print_command_MEMUSE(void){ printf (_("\ MEMUSE = Memory use.\n\ Warning and critical thresholds can be specified with -w and -c.\n")); } void print_command_SERVICESTATE(void){ 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")); } void print_command_PROCSTATE(void){ printf (_("\ PROCSTATE = Check if one or several process are running.\n\ Same syntax as SERVICESTATE.\n")); } void print_command_COUNTER(void){ printf (_("\ COUNTER = Check any performance counter of Windows.\n\ This check accepts -w and -c\n\ Request a -l parameters with the following syntax:\n\ -l \"\\\\\\\\counter\"[,\"