From f45e77a9e18a189f01851f829a4738eb03278e0f Mon Sep 17 00:00:00 2001 From: Jan Wagner Date: Wed, 23 Jan 2019 20:20:51 +0100 Subject: [PATCH] Adding d/p/13_check_snmp_process_new_features --- .../13_check_snmp_process_new_features | 348 ++++++++++++++++++ debian/patches/series | 1 + 2 files changed, 349 insertions(+) create mode 100644 debian/patches/13_check_snmp_process_new_features diff --git a/debian/patches/13_check_snmp_process_new_features b/debian/patches/13_check_snmp_process_new_features new file mode 100644 index 0000000..7210566 --- /dev/null +++ b/debian/patches/13_check_snmp_process_new_features @@ -0,0 +1,348 @@ +From 9ceabfc974d4d9bfd0731bbedfa12a035a662466 Mon Sep 17 00:00:00 2001 +From: jimbobmcgee +Date: Tue, 20 Mar 2018 23:28:12 +0000 +Subject: [PATCH] Minor feature updates to check_snmp_process.pl + +The following features are included: + 1. Added new `-T` option, to report/check against the total RAM of all matched processes, rather than the highest value + 2. Warn/Crit values are now optional for `-m` and `-u` options, allowing for capture of these in perfdata without requiring thresholds + 3. Perfdata is now always written if `-F` is supplied, even if there were no matched process (i.e. `num_process=0 memory_usage=0 cpu_usage=0`). +--- + plugins/check_snmp_process.pl | 201 +++++++++++++++++++++------------- + 1 file changed, 125 insertions(+), 76 deletions(-) + +diff --git a/plugins/check_snmp_process.pl b/plugins/check_snmp_process.pl +index 49a8cd7..2d2f72e 100755 +--- a/plugins/check_snmp_process.pl ++++ b/plugins/check_snmp_process.pl +@@ -44,9 +44,9 @@ + my $o_domain = 'udp/ipv4'; # Default to UDP over IPv4 + my $o_version2 = undef; #use snmp v2c + my $o_descr = undef; # description filter +-my $o_warn = 0; # warning limit ++my $o_warn = undef; # warning limit + my @o_warnL = undef; # warning limits (min,max) +-my $o_crit = 0; # critical limit ++my $o_crit = undef; # critical limit + my @o_critL = undef; # critical limits (min,max) + my $o_help = undef; # wan't some help ? + my $o_verb = undef; # verbose mode +@@ -74,17 +74,22 @@ + my $o_mem = undef; # checks memory (max) + my @o_memL = undef; # warn and crit level for mem + my $o_mem_avg = undef; # cheks memory average ++my $o_mem_sum = undef; # checks memory total + my $o_cpu = undef; # checks CPU usage + my @o_cpuL = undef; # warn and crit level for cpu +-my $o_delta = $delta_of_time_to_make_average; # delta time for CPU check ++my $o_delta = undef; # delta time for CPU check + + # functions + + sub p_version { print "check_snmp_process version : $VERSION\n"; } + + sub print_usage { +- print +-"Usage: $0 [-v] -H -C [-2] | (-l login -x passwd) [-p ] [-P ] -n [-w [,] -c [,max_proc] ] [-m, -a -u, -d ] [-t ] [-o ] [-f -A -F ] [-r] [-V] [-g]\n"; ++ print "Usage: $0 [-v] -H [-p ] [-P ] " ++ . "((-C [-2]) | (-l login -x passwd)) " ++ . "-n [-f] [-A] [-r] [-w [,] -c [,]] " ++ . "[-m [,] [-a|-T]] " ++ . "[-u [,] -d] " ++ . "[-t ] [-o ] [-F] [-V] [-g]\n"; + } + + sub isnotnum { # Return true if arg is not a number +@@ -186,7 +191,7 @@ sub help { + ex : "named.*-t /var/named/chroot" will only select named process with this parameter + -F, --perfout + Add performance output +- outputs : memory_usage, num_process, cpu_usage ++ outputs: num_processes, memory_usage (if -m), cpu_usage (if -u) + -w, --warn=MIN[,MAX] + Number of process that will cause a warning + -1 for no warning, MAX must be >0. Ex : -w-1,50 +@@ -197,15 +202,21 @@ sub help { + with the following options : -w m1,x1 -c m2,x2 + you must have : m2 <= m1 < x1 <= x2 + you can omit x1 or x2 or both +--m, --memory=WARN,CRIT ++-m, --memory[=WARN,CRIT] + checks memory usage (default max of all process) +- values are warning and critical values in Mb ++ WARN,CRIT values are warning and critical values in MB ++ if WARN,CRIT values are not given, just report + -a, --average + makes an average of memory used by process instead of max +--u, --cpu=WARN,CRIT ++ (implies -m, cannot be used with -T) ++-T, --total ++ checks the total memory used by processes instead of max ++ (implies -m, cannot be used with -a) ++-u, --cpu[=WARN,CRIT] + checks cpu usage of all process + values are warning and critical values in % of CPU usage + if more than one CPU, value can be > 100% : 100%=1 CPU ++ if WARN,CRIT values are not given, just report + -d, --delta=seconds + make an average of seconds for CPU (default 300=5min) + -g, --getall +@@ -272,6 +283,8 @@ sub check_options { + 'memory:s' => \$o_mem, + 'a' => \$o_mem_avg, + 'average' => \$o_mem_avg, ++ 'T' => \$o_mem_sum, ++ 'total' => \$o_mem_sum, + 'u:s' => \$o_cpu, + 'cpu' => \$o_cpu, + '2' => \$o_version2, +@@ -327,9 +340,11 @@ sub check_options { + + # Check compulsory attributes + if (!defined($o_descr) || !defined($o_host)) { print_usage(); exit $ERRORS{"UNKNOWN"} } +- @o_warnL = split(/,/, $o_warn); +- @o_critL = split(/,/, $o_crit); +- verb("$o_warn $o_crit $#o_warnL $#o_critL"); ++ ++ # Check warn/crit values ++ @o_warnL = split(/,/, ($o_warn // "0")); ++ @o_critL = split(/,/, ($o_crit // "0")); ++ verb("Warn: " . ($o_warn // "undef") . "; Crit: " . ($o_crit // "undef") . "; #Warn: " . $#o_warnL . "; #Crit: " . $#o_critL); + if (isnotnum($o_warnL[0]) || isnotnum($o_critL[0])) { + print "Numerical values for warning and critical\n"; + print_usage(); +@@ -348,7 +363,6 @@ sub check_options { + exit $ERRORS{"UNKNOWN"}; + } + +- # Check min_crit < min warn < max warn < crit warn + if ($o_warnL[0] < $o_critL[0]) { + print " warn minimum must be >= crit minimum\n"; + print_usage(); +@@ -371,7 +385,15 @@ sub check_options { + exit $ERRORS{"UNKNOWN"}; + } + #### Memory checks +- if (defined($o_mem)) { ++ if (defined($o_mem_sum) && defined($o_mem_avg)) { ++ print "cannot test memory average and memory total\n"; ++ print_usage(); ++ exit $ERRORS{"UNKNOWN"}; ++ } ++ if (defined($o_mem_sum) || defined($o_mem_avg)) { ++ $o_mem = $o_mem // ""; ++ } ++ if (defined($o_mem) && length($o_mem)) { + @o_memL = split(/,/, $o_mem); + if ($#o_memL != 1) { print "2 values (warning,critical) for memory\n"; print_usage(); exit $ERRORS{"UNKNOWN"} } + if (isnotnum($o_memL[0]) || isnotnum($o_memL[1])) { +@@ -386,7 +408,16 @@ sub check_options { + } + } + #### CPU checks +- if (defined($o_cpu)) { ++ if (defined($o_delta)) { ++ if (isnotnum($o_delta)) { ++ print "Numeric values for delta!\n"; ++ print_usage(); ++ exit $ERRORS{"UNKNOWN"}; ++ } ++ $o_cpu = $o_cpu // ""; ++ } ++ if (defined($o_cpu) && length($o_cpu)) { ++ $o_delta = $o_delta // $delta_of_time_to_make_average; + @o_cpuL = split(/,/, $o_cpu); + if ($#o_cpuL != 1) { print "2 values (warning,critical) for cpu\n"; print_usage(); exit $ERRORS{"UNKNOWN"} } + if (isnotnum($o_cpuL[0]) || isnotnum($o_cpuL[1])) { +@@ -619,24 +650,11 @@ sub check_options { + } + } + +-if ($num_int == 0) { +- print "No process ", (defined($o_noreg)) ? "named " : "matching ", $o_descr, " found : "; +- if ($o_critL[0] >= 0) { +- print "CRITICAL\n"; +- exit $ERRORS{"CRITICAL"}; +- } elsif ($o_warnL[0] >= 0) { +- print "WARNING\n"; +- exit $ERRORS{"WARNING"}; +- } +- print "YOU told me it was : OK\n"; +- exit $ERRORS{"OK"}; +-} +- + my $result = undef; + my $num_int_ok = 0; + + # Splitting snmp request because can't use get_bulk_request with v1 protocol +-if (!defined($o_get_all)) { ++if ($num_int != 0 && !defined($o_get_all)) { + if ($count_oid >= 50) { + my @toid = undef; + my $tmp_num = 0; +@@ -697,13 +715,21 @@ sub check_options { + my ($res_memory, $res_cpu) = (0, 0); + my $memory_print = ""; + my $cpu_print = ""; ++ + ###### Checks memory usage + + if (defined($o_mem)) { +- if (defined($o_mem_avg)) { +- for (my $i = 0; $i < $num_int; $i++) { $res_memory += $result_cons{ $proc_mem_table . "." . $tindex[$i] }; } +- $res_memory /= ($num_int_ok * 1024); +- verb("Memory average : $res_memory"); ++ if (defined($o_mem_avg) || defined($o_mem_sum)) { ++ verb("Check average: " . ($o_mem_avg // 0) . "; total: " . ($o_mem_sum // 0)); ++ for (my $i = 0; $i < $num_int; $i++) { ++ $res_memory += $result_cons{ $proc_mem_table . "." . $tindex[$i] }; ++ } ++ $res_memory /= 1024; # to Mbytes ++ verb("Memory total : $res_memory MB"); ++ if (defined($o_mem_avg)) { ++ $res_memory /= $num_int_ok; ++ verb("Memory average : $res_memory MB"); ++ } + } else { + for (my $i = 0; $i < $num_int; $i++) { + $res_memory +@@ -714,17 +740,22 @@ sub check_options { + $res_memory /= 1024; + verb("Memory max : $res_memory"); + } +- if ($res_memory > $o_memL[1]) { +- $final_status = 2; +- $memory_print = ", Mem : " . sprintf("%.1f", $res_memory) . "Mb > " . $o_memL[1] . " CRITICAL"; +- } elsif ($res_memory > $o_memL[0]) { +- $final_status = 1; +- $memory_print = ", Mem : " . sprintf("%.1f", $res_memory) . "Mb > " . $o_memL[0] . " WARNING"; +- } else { +- $memory_print = ", Mem : " . sprintf("%.1f", $res_memory) . "Mb OK"; +- } + if (defined($o_perf)) { +- $perf_output = "'memory_usage'=" . sprintf("%.1f", $res_memory) . "MB;" . $o_memL[0] . ";" . $o_memL[1]; ++ $perf_output = "'memory_usage'=" . sprintf("%.1f", $res_memory) . "MB"; ++ } ++ if (length($o_mem)) { ++ if ($res_memory > $o_memL[1]) { ++ $final_status = 2; ++ $memory_print = ", Mem : " . sprintf("%.1f", $res_memory) . "MB > " . $o_memL[1] . " CRITICAL"; ++ } elsif ($res_memory > $o_memL[0]) { ++ $final_status = 1; ++ $memory_print = ", Mem : " . sprintf("%.1f", $res_memory) . "MB > " . $o_memL[0] . " WARNING"; ++ } else { ++ $memory_print = ", Mem : " . sprintf("%.1f", $res_memory) . "MB OK"; ++ } ++ if (defined($o_perf)) { ++ $perf_output .= ";" . $o_memL[0] . ";" . $o_memL[1]; ++ } + } + } + +@@ -789,19 +820,24 @@ sub check_options { + if ($return != 0) { $cpu_print .= "! ERROR writing file $temp_file_name !"; $final_status = 3; } + ##### Check values (if something to check...) + if (defined($found_value)) { +- if ($found_value > $o_cpuL[1]) { +- $final_status = 2; +- $cpu_print .= ", Cpu : " . sprintf("%.0f", $found_value) . "% > " . $o_cpuL[1] . " CRITICAL"; +- } elsif ($found_value > $o_cpuL[0]) { +- $final_status = ($final_status == 2) ? 2 : 1; +- $cpu_print .= ", Cpu : " . sprintf("%.0f", $found_value) . "% > " . $o_cpuL[0] . " WARNING"; +- } else { +- $cpu_print .= ", Cpu : " . sprintf("%.0f", $found_value) . "% OK"; +- } + if (defined($o_perf)) { + if (!defined($perf_output)) { $perf_output = ""; } + else { $perf_output .= " "; } +- $perf_output .= "'cpu_usage'=" . sprintf("%.0f", $found_value) . "%;" . $o_cpuL[0] . ";" . $o_cpuL[1]; ++ $perf_output .= "'cpu_usage'=" . sprintf("%.0f", $found_value) . "%"; ++ } ++ if (length($o_cpu)) { ++ if ($found_value > $o_cpuL[1]) { ++ $final_status = 2; ++ $cpu_print .= ", CPU : " . sprintf("%.0f", $found_value) . "% > " . $o_cpuL[1] . " CRITICAL"; ++ } elsif ($found_value > $o_cpuL[0]) { ++ $final_status = ($final_status == 2) ? 2 : 1; ++ $cpu_print .= ", CPU : " . sprintf("%.0f", $found_value) . "% > " . $o_cpuL[0] . " WARNING"; ++ } else { ++ $cpu_print .= ", CPU : " . sprintf("%.0f", $found_value) . "% OK"; ++ } ++ if (defined($o_perf)) { ++ $perf_output .= ";" . $o_cpuL[0] . ";" . $o_cpuL[1]; ++ } + } + } else { + if ($final_status == 0) { $final_status = 3 } +@@ -809,35 +845,48 @@ sub check_options { + } + } + +-print $num_int_ok, " process ", (defined($o_noreg)) ? "named " : "matching ", $o_descr, " "; +- +-#### Check for min and max number of process +-if ($num_int_ok <= $o_critL[0]) { +- print "(<= ", $o_critL[0], " : CRITICAL)"; +- $final_status = 2; +-} elsif ($num_int_ok <= $o_warnL[0]) { +- print "(<= ", $o_warnL[0], " : WARNING)"; +- $final_status = ($final_status == 2) ? 2 : 1; +-} else { +- print "(> ", $o_warnL[0], ")"; ++if ($num_int == 0) { ++ print "No processes ", (defined($o_noreg) ? "named " : "matching "), $o_descr, " found : "; ++ if ($o_critL[0] >= 0) { ++ print "CRITICAL"; ++ $final_status = 2; ++ } elsif ($o_warnL[0] >= 0) { ++ print "WARNING"; ++ $final_status = ($final_status == 2) ? 2 : 1; ++ } + } +-if (defined($o_critL[1]) && ($num_int_ok > $o_critL[1])) { +- print " (> ", $o_critL[1], " : CRITICAL)"; +- $final_status = 2; +-} elsif (defined($o_warnL[1]) && ($num_int_ok > $o_warnL[1])) { +- print " (> ", $o_warnL[1], " : WARNING)"; +- $final_status = ($final_status == 2) ? 2 : 1; +-} elsif (defined($o_warnL[1])) { +- print " (<= ", $o_warnL[1], "):OK"; ++else { ++ print $num_int_ok, " process", ($num_int_ok == 1 ? " " : "es "), (defined($o_noreg) ? "named " : "matching "), $o_descr, " "; ++ ++ #### Check for min and max number of process ++ if ($num_int_ok <= $o_critL[0]) { ++ print "(<= ", $o_critL[0], " : CRITICAL)"; ++ $final_status = 2; ++ } elsif ($num_int_ok <= $o_warnL[0]) { ++ print "(<= ", $o_warnL[0], " : WARNING)"; ++ $final_status = ($final_status == 2) ? 2 : 1; ++ } else { ++ print "(> ", $o_warnL[0], ")"; ++ } ++ if (defined($o_critL[1]) && ($num_int_ok > $o_critL[1])) { ++ print " (> ", $o_critL[1], " : CRITICAL)"; ++ $final_status = 2; ++ } elsif (defined($o_warnL[1]) && ($num_int_ok > $o_warnL[1])) { ++ print " (> ", $o_warnL[1], " : WARNING)"; ++ $final_status = ($final_status == 2) ? 2 : 1; ++ } elsif (defined($o_warnL[1])) { ++ print " (<= ", $o_warnL[1], "):OK"; ++ } + } + + print $memory_print, $cpu_print; + + if (defined($o_perf)) { +- if (!defined($perf_output)) { $perf_output = ""; } +- else { $perf_output .= " "; } +- $perf_output .= "'num_process'=" . $num_int_ok . ";" . $o_warnL[0] . ";" . $o_critL[0]; +- print " | ", $perf_output; ++ print " | 'num_process'=" . $num_int_ok; ++ print ";" . $o_warnL[0] if defined($o_warn); ++ print ";" if defined($o_crit) && !defined($o_warn); ++ print ";" . $o_critL[0] if defined($o_crit); ++ print " " . $perf_output if length($perf_output // ""); + } + print "\n"; + diff --git a/debian/patches/series b/debian/patches/series index 59501c0..96038d7 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,5 +1,6 @@ 10_check_snmp_storage_error_handling 11_check_snmp_int_agent_workaround 12_check_snmp_mem_perf +13_check_snmp_process_new_features 50_disable_epn 51_fix_privacy_doc