diff --git a/plugins/check_nt.c b/plugins/check_nt.c index d038efe..e2b8722 100644 --- a/plugins/check_nt.c +++ b/plugins/check_nt.c @@ -65,8 +65,10 @@ 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; +range *warning_value=NULL; +range *critical_value=NULL; +const char *warning_value_string=""; +const char *critical_value_string=""; int check_warning_value=FALSE; int check_critical_value=FALSE; enum checkvars vars_to_check = CHECK_NONE; @@ -81,6 +83,16 @@ int strtoularray(unsigned long *array, char *string, const char *delim); void print_help(void); void print_usage(void); +bool allnumeric(const char* number) +{ + int i; + for(i=0; number[i]; i++) + { + if(number[i]<'0'||number[i]>'9'){return false;} + } + return true; +} + int main(int argc, char **argv){ /* should be int result = STATE_UNKNOWN; */ @@ -224,8 +236,8 @@ int main(int argc, char **argv){ if (total_disk_space>0 && free_disk_space>=0) { percent_used_space = ((total_disk_space - free_disk_space) / total_disk_space) * 100; - warning_used_space = ((float)warning_value / 100) * total_disk_space; - critical_used_space = ((float)critical_value / 100) * total_disk_space; + warning_used_space = ((float)(warning_value?warning_value->end:0) / 100) * total_disk_space; + critical_used_space = ((float)(critical_value?critical_value->end:0) / 100) * total_disk_space; 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, @@ -234,12 +246,33 @@ int main(int argc, char **argv){ (total_disk_space - free_disk_space) / 1073741824, warning_used_space / 1073741824, critical_used_space / 1073741824, total_disk_space / 1073741824); - 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; + if(allnumeric(critical_value_string)&&allnumeric(warning_value_string)) + { + if (critical_value > warning_value) + { /* Normal thresholds */ + if (check_critical_value == TRUE && percent_used_space >= critical_value->end) + return_code = STATE_CRITICAL; + else if (check_warning_value == TRUE && percent_used_space >= warning_value->end) + return_code = STATE_WARNING; + else + return_code = STATE_OK; + } + else + { /* inverse thresholds */ + return_code = STATE_OK; + if (check_critical_value == TRUE && percent_used_space <= critical_value->end) + return_code = STATE_CRITICAL; + else if (check_warning_value == TRUE && percent_used_space <= warning_value->end) + return_code = STATE_WARNING; + } + }else{ + if(check_critical_value==TRUE && check_range(percent_used_space, critical_value)) + return_code=STATE_CRITICAL; + else if (check_warning_value==TRUE && check_range(percent_used_space, warning_value)) + return_code=STATE_WARNING; + else + return_code=STATE_OK; + } output_message = strdup (temp_string); perfdata = temp_string_perf; @@ -273,8 +306,8 @@ 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; - warning_used_space = ((float)warning_value / 100) * mem_commitLimit; - critical_used_space = ((float)critical_value / 100) * mem_commitLimit; + warning_used_space = ((float)(warning_value?warning_value->end:0) / 100) * mem_commitLimit; + critical_used_space = ((float)(warning_value?critical_value->end:0) / 100) * mem_commitLimit; /* Divisor should be 1048567, not 3044515, as we are measuring "Commit Charge" here, which equals RAM + Pagefiles. */ @@ -284,12 +317,32 @@ int main(int argc, char **argv){ 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; - + if(allnumeric(critical_value_string)&&allnumeric(warning_value_string)) + { + if (critical_value > warning_value) + { /* Normal thresholds */ + if (check_critical_value == TRUE && percent_used_space >= critical_value->end) + return_code = STATE_CRITICAL; + else if (check_warning_value == TRUE && percent_used_space >= warning_value->end) + return_code = STATE_WARNING; + else + return_code = STATE_OK; + } + else + { /* inverse thresholds */ + return_code = STATE_OK; + if (check_critical_value == TRUE && percent_used_space <= critical_value->end) + return_code = STATE_CRITICAL; + else if (check_warning_value == TRUE && percent_used_space <= warning_value->end) + return_code = STATE_WARNING; + } + }else{ + return_code=STATE_OK; + if(check_critical_value==TRUE && check_range(percent_used_space, critical_value)) + return_code=STATE_CRITICAL; + else if (check_warning_value==TRUE && check_range(percent_used_space, warning_value)) + return_code=STATE_WARNING; + } break; case CHECK_COUNTER: @@ -373,29 +426,41 @@ int main(int argc, char **argv){ } asprintf (&output_message, "%s |", output_message); asprintf (&output_message,"%s %s", output_message, - fperfdata (description, counter_value, - counter_unit, 1, warning_value, 1, critical_value, + fperfdatarange (description, counter_value, + counter_unit, warning_value_string, critical_value_string, (!(isPercent) && (minval != NULL)), fminval, (!(isPercent) && (minval != NULL)), fmaxval)); } } - 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; + if(allnumeric(critical_value_string)&&allnumeric(warning_value_string)) + { + if (critical_value > warning_value) + { /* Normal thresholds */ + if (check_critical_value == TRUE && counter_value >= critical_value->end) + return_code = STATE_CRITICAL; + else if (check_warning_value == TRUE && counter_value >= warning_value->end) + return_code = STATE_WARNING; + else + return_code = STATE_OK; + } else + { /* inverse thresholds */ return_code = STATE_OK; - } - else - { /* inverse thresholds */ - return_code = STATE_OK; - if (check_critical_value == TRUE && counter_value <= critical_value) + if (check_critical_value == TRUE && counter_value <= critical_value->end) + return_code = STATE_CRITICAL; + else if (check_warning_value == TRUE && counter_value <= warning_value->end) + return_code = STATE_WARNING; + } + }else{ + if(check_critical_value == TRUE && check_range(counter_value, critical_value)) + { return_code = STATE_CRITICAL; - else if (check_warning_value == TRUE && counter_value <= warning_value) + }else if(check_warning_value == TRUE && check_range(counter_value, warning_value)) { return_code = STATE_WARNING; + }else{ + return_code = STATE_OK; + } } break; @@ -411,21 +476,34 @@ int main(int argc, char **argv){ 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; + if(allnumeric(critical_value_string)&&allnumeric(warning_value_string)) + { + if (critical_value > warning_value) + { /* Normal thresholds */ + if (check_critical_value == TRUE && age_in_minutes >= critical_value->end) + return_code = STATE_CRITICAL; + else if (check_warning_value == TRUE && age_in_minutes >= warning_value->end) + return_code = STATE_WARNING; + else + return_code = STATE_OK; + } else - return_code=STATE_OK; + { /* inverse thresholds */ + return_code = STATE_OK; + if (check_critical_value == TRUE && age_in_minutes <= critical_value->end) + return_code = STATE_CRITICAL; + else if (check_warning_value == TRUE && age_in_minutes <= warning_value->end) + return_code = STATE_WARNING; + } + }else{ + if(check_critical_value == TRUE && check_range(age_in_minutes, critical_value)) + { + return_code = STATE_CRITICAL; + }else if(check_warning_value == TRUE && check_range(age_in_minutes, warning_value)) { + return_code = STATE_WARNING; + }else{ + return_code = STATE_OK; + } } } break; @@ -563,11 +641,13 @@ int process_arguments(int argc, char **argv){ value_list = optarg; break; case 'w': /* warning threshold */ - warning_value=strtoul(optarg,NULL,10); + warning_value=parse_range_string(optarg); + warning_value_string=optarg; check_warning_value=TRUE; break; case 'c': /* critical threshold */ - critical_value=strtoul(optarg,NULL,10); + critical_value=parse_range_string(optarg); + critical_value_string=optarg; check_critical_value=TRUE; break; case 'd': /* Display select for services */ diff --git a/plugins/utils.c b/plugins/utils.c index 4537390..f4f6433 100644 --- a/plugins/utils.c +++ b/plugins/utils.c @@ -600,3 +600,44 @@ char *fperfdata (const char *label, return data; } + +char *fperfdatarange (const char *label, + double val, + const char *uom, + const char *warn, + const char *crit, + int minp, + double minv, + int maxp, + double maxv) +{ + char *data = NULL; + + if (strpbrk (label, "'= ")) + asprintf (&data, "'%s'=", label); + else + asprintf (&data, "%s=", label); + + asprintf (&data, "%s%f", data, val); + asprintf (&data, "%s%s;", data, uom); + + if (warn) + asprintf (&data, "%s%s", data, warn); + + asprintf (&data, "%s;", data); + + if (crit) + asprintf (&data, "%s%s", data, crit); + + asprintf (&data, "%s;", data); + + if (minp) + asprintf (&data, "%s%f", data, minv); + + if (maxp) { + asprintf (&data, "%s;", data); + asprintf (&data, "%s%f", data, maxv); + } + + return data; +} diff --git a/plugins/utils.h b/plugins/utils.h index d6e9c8f..bd8fe1d 100644 --- a/plugins/utils.h +++ b/plugins/utils.h @@ -121,6 +121,16 @@ char *fperfdata (const char *, int, double); +char *fperfdatarange (const char *, + double, + const char *, + const char *, + const char *, + int, + double, + int, + double); + /* The idea here is that, although not every plugin will use all of these, most will or should. Therefore, for consistency, these very common options should have only these meanings throughout the overall suite */