Module: check_mk
Branch: master
Commit: 24274e27e4ec80be6f2213d3c3181ba0e0622c87
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=24274e27e4ec80…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Fri Feb 3 16:24:00 2012 +0100
Make agent_simulator and usewalk_hosts WATOable
---
web/plugins/wato/check_mk_configuration.py | 16 ++++++++++++++++
1 files changed, 16 insertions(+), 0 deletions(-)
diff --git a/web/plugins/wato/check_mk_configuration.py b/web/plugins/wato/check_mk_configuration.py
index 16239a9..089c6ad 100644
--- a/web/plugins/wato/check_mk_configuration.py
+++ b/web/plugins/wato/check_mk_configuration.py
@@ -197,6 +197,15 @@ register_configvar(group,
"been copied here from another monitoring site.")),
need_restart = True)
+register_configvar(group,
+ "agent_simulator",
+ Checkbox(title = _("SNMP Agent Simulator"),
+ label = _("Process stored SNMP walks with agent simulator"),
+ help = _("When using stored SNMP walks you can place inline code generating "
+ "dynamic simulation data. This feature can be activated here. There "
+ "is a big chance that you will never need this feature...")),
+ need_restart = True)
+
register_configvar(group,
"delay_precompile",
@@ -812,3 +821,10 @@ register_rule(group,
"<tt><HOST></tt>."),
label = _("Command line to execute")))
+register_rule(group,
+ "usewalk_hosts",
+ title = _("Hosts that simulate SNMP by using a stored SNMP walk"),
+ help = _("This ruleset helps in test and development. You can create stored SNMP "
+ "walks on the command line with cmk --snmpwalk HOSTNAME. A host that "
+ "is configured with this ruleset will then use the information from that "
+ "file instead of using real SNMP. "))
Module: check_mk
Branch: master
Commit: 95436160993cb6a27d377a3fe32e3ec2c58db59c
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=95436160993cb6…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Thu Feb 2 17:31:21 2012 +0100
if/if64: omit check result on counter wrap
But only if bandwidth traffic levels
are used.
---
ChangeLog | 2 ++
checks/if.include | 4 ++++
2 files changed, 6 insertions(+), 0 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 4af43e1..ec5c357 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -47,6 +47,8 @@
* cisco_temp_sensor: new check for temperature sensors of Cisco NEXUS
and other new Cisco devices
* oracle_tablespace: Fixed tablespace size/free space calculations
+ * FIX: if/if64: omit check result on counter wrap if bandwidth traffic levels
+ are used.
Multisite:
* Improve transaction handling and reload detection: user can have
diff --git a/checks/if.include b/checks/if.include
index dedc1fd..f8ec10b 100644
--- a/checks/if.include
+++ b/checks/if.include
@@ -264,6 +264,10 @@ def check_if_common(item, params, info):
# if at least one counter wrapped, we do not handle the counters at all
if wrapped:
+ # If there is a threshold on the bandwidth, we cannot proceed
+ # futher (the check would be flapping to green on a wrap)
+ if bw_crit != None:
+ raise MKCounterWrapped("", "Counter wrap, skipping checks this time")
perfdata = []
else:
perfdata.append(("outqlen", saveint(ifOutQLen)))
Module: check_mk
Branch: master
Commit: 00333ad4d974f4553dbd48a34f0f189d6973cd67
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=00333ad4d974f4…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Thu Feb 2 15:23:20 2012 +0100
Update nexus_temp, renamed to cisco_temp_sensor
---
ChangeLog | 3 +-
checkman/{nexus_temp => cisco_temp_sensor} | 9 +++-
checks/{nexus_temp => cisco_temp_sensor} | 47 ++++++++++---------
...xus_temp.php => check_mk-cisco_temp_sensor.php} | 3 +-
web/plugins/perfometer/check_mk.py | 1 +
5 files changed, 36 insertions(+), 27 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index d0a8bc8..4af43e1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -44,7 +44,8 @@
"Temperature %s", in order to be consistent with the other checks.
* mounts: exclude changes of the commit option (might change on laptops),
make only switch to ro critical, other changes warning.
- * nexus_temp: new check for Cisco NEXUS temperature sensors (first version)
+ * cisco_temp_sensor: new check for temperature sensors of Cisco NEXUS
+ and other new Cisco devices
* oracle_tablespace: Fixed tablespace size/free space calculations
Multisite:
diff --git a/checkman/nexus_temp b/checkman/cisco_temp_sensor
similarity index 64%
rename from checkman/nexus_temp
rename to checkman/cisco_temp_sensor
index 412a3c8..55b912d 100644
--- a/checkman/nexus_temp
+++ b/checkman/cisco_temp_sensor
@@ -1,11 +1,11 @@
-title: Check temperature sensors on Cisco NEXUS devices
+title: Check temperature sensors on Cisco devices that support CISCO-ENTITY-SENSOR-MIB
agents: snmp
author: Mathias Kettner <mk(a)mathias-kettner.de>
license: GPL
distribution: check_mk
description:
- This check monitors all temperature sensors for Cisco NEXUS
- devices. It uses a combination of data from the standardized
+ This check monitors all temperature sensors for Cisco devices.
+ It uses a combination of data from the standardized
sensors MIB and vendor specific information.
Warning and critical levels are retrieved from the device
@@ -15,6 +15,9 @@ item:
The name of the sensors as found in the OID tree below.
.1.3.6.1.2.1.47.1.1.1.1.2.
+ The sensor is retrived from the OID tree below.
+ .1.3.6.1.4.1.9.9.91
+
perfdata:
One value: the current temperature including warning and critical levels.
diff --git a/checks/nexus_temp b/checks/cisco_temp_sensor
similarity index 86%
rename from checks/nexus_temp
rename to checks/cisco_temp_sensor
index 29eccb2..b816b30 100644
--- a/checks/nexus_temp
+++ b/checks/cisco_temp_sensor
@@ -108,58 +108,60 @@
# Create a dictionary with the information about each
# sensor. The key into the dict is the end OID of the
# sensor.
-def parse_nexus_temp(info):
+def parse_cisco_temp_sensor(info):
description_info, state_info, levels_info = info
# Create dict of sensor descriptions
descriptions = dict(description_info)
-
+
# Create dict with thresholds
thresholds = {}
+ for id, sensortype, value, sensorstate in state_info:
+ thresholds.setdefault(id, [])
+
for endoid, level in levels_info:
# endoid is e.g. 21549.9 or 21459.10
id, subid = endoid.split('.')
thresholds.setdefault(id, []).append(saveint(level))
-
+
# Create main dictionary (only of temperature sensors)
sensors = []
for id, sensortype, value, sensorstate in state_info:
sensors.append( ( id, descriptions.get(id), sensortype,
saveint(value), sensorstate, thresholds[id] ) )
-
return sensors
-def inventory_nexus_temp(info):
- sensors = parse_nexus_temp(info)
- # Use all temperature sensors with a non-empty description
+def inventory_cisco_temp_sensor(info):
+ sensors = parse_cisco_temp_sensor(info)
+ # Use all temperature sensors with a non-empty description and valid threshold
return [ (entry[1], None) for entry
in sensors if entry[1] != None
- and entry[2] == '8' ]
+ and entry[2] == '8'
+ and len(entry[5]) == 2 ]
-def check_nexus_temp(item, _no_params, info):
- sensors = parse_nexus_temp(info)
+def check_cisco_temp_sensor(item, _no_params, info):
+ sensors = parse_cisco_temp_sensor(info)
for id, descr, sensortype, value, sensorstate, levels in sensors:
if item == descr:
warn, crit = levels
if sensorstate == "2":
- return (3, "UNKNOWN - data from sensor currently not available")
+ return (3, "UNKNOWN - data from sensor currently not available")
elif sensorstate == "3":
- return (3, "UNKNOWN - sensor is broken")
+ return (3, "UNKNOWN - sensor is broken")
if value >= crit:
- state = 2
+ state = 2
elif value >= warn:
- state = 1
+ state = 1
else:
- state = 0
+ state = 0
return (state, nagios_state_names[state] + " - %dC (levels at %d/%d)" % (value, warn, crit), [
- ( "temperature", value, warn, crit ) ])
-
- return (3, "UKNOWN - sensor not found in SNMP data")
+ ( "temperature", value, warn, crit ) ])
+ return (3, "UNKNOWN - sensor not found in SNMP data")
-check_info['nexus_temp'] = (check_nexus_temp, "Temperature %s", 1, inventory_nexus_temp)
+check_info['cisco_temp_sensor'] = (check_cisco_temp_sensor, "Temperature %s", 1, inventory_cisco_temp_sensor)
-snmp_info['nexus_temp'] = [
+snmp_info['cisco_temp_sensor'] = [
# Description of sensors
( ".1.3.6.1.2.1.47.1.1.1.1", [
OID_END,
@@ -181,5 +183,6 @@ snmp_info['nexus_temp'] = [
]),
]
-snmp_scan_functions['nexus_temp'] = \
- lambda oid: "nx-os" in oid(".1.3.6.1.2.1.1.1.0").lower()
+snmp_scan_functions['cisco_temp_sensor'] = \
+ lambda oid: "cisco" in oid(".1.3.6.1.2.1.1.1.0").lower() and \
+ oid(".1.3.6.1.4.1.9.9.91.1.1.1.1.*") != None
diff --git a/pnp-templates/check_mk-nexus_temp.php b/pnp-templates/check_mk-cisco_temp_sensor.php
similarity index 96%
rename from pnp-templates/check_mk-nexus_temp.php
rename to pnp-templates/check_mk-cisco_temp_sensor.php
index b6e5a84..2ff82a2 100644
--- a/pnp-templates/check_mk-nexus_temp.php
+++ b/pnp-templates/check_mk-cisco_temp_sensor.php
@@ -23,8 +23,9 @@
# to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
# Boston, MA 02110-1301 USA.
+
$title = str_replace("_", " ", $servicedesc);
-$opt[1] = "--vertical-label \"Celsius\" -l 0 -u 40 --title \"$title\" ";
+$opt[1] = "--vertical-label \"Celsius\" --title \"$title\" -h 140 ";
$def[1] = "DEF:var1=$RRDFILE[1]:$DS[1]:MAX ";
$def[1] .= "AREA:var1#2080ff:\"Temperature\:\" ";
diff --git a/web/plugins/perfometer/check_mk.py b/web/plugins/perfometer/check_mk.py
index ca05468..39bf3d7 100644
--- a/web/plugins/perfometer/check_mk.py
+++ b/web/plugins/perfometer/check_mk.py
@@ -208,6 +208,7 @@ def perfometer_check_mk_ipmi_sensors(row, check_command, perf_data):
# Also all checks dealing with temperature can use this perfometer
perfometers["check_mk-ipmi_sensors"] = perfometer_check_mk_ipmi_sensors
perfometers["check_mk-nvidia.temp"] = perfometer_check_mk_ipmi_sensors
+perfometers["check_mk-cisco_temp_sensor"] = perfometer_check_mk_ipmi_sensors
def perfometer_check_mk_if(row, check_command, perf_data):
txt = []
Module: check_mk
Branch: master
Commit: 17db9695fa9628eaf9c1340bfc1251f01ad7976f
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=17db9695fa9628…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Thu Feb 2 15:09:57 2012 +0100
Updated bug entries #0630
---
.bugs/630 | 13 +++++++++++++
1 files changed, 13 insertions(+), 0 deletions(-)
diff --git a/.bugs/630 b/.bugs/630
new file mode 100644
index 0000000..be89306
--- /dev/null
+++ b/.bugs/630
@@ -0,0 +1,13 @@
+Title: Reset counter in case of time step
+Component: core
+State: open
+Date: 2012-02-02 15:08:44
+Targetversion: 1.2.0
+Class: bug
+
+If get_counter detects a future timestamp then it
+should reset the counter to the current time so
+that at least the next time the counter will work.
+This happens e.g. in at Windows, because the agent
+was sending invalid timestamps in older versions
+that are lying in the future and are now repaired.
Module: check_mk
Branch: master
Commit: b2210ce0c40f76a5a605e93f8c529588c23633da
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=b2210ce0c40f76…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Thu Feb 2 11:39:21 2012 +0100
WATO: fixed several check parameter rules
---
checks/cpu | 2 +-
checks/if.include | 2 +-
web/htdocs/valuespec.py | 25 +++++++++++++++++++------
web/htdocs/wato.py | 13 ++++++++++---
web/plugins/wato/check_parameters.py | 27 +++++++++++++++++++--------
5 files changed, 50 insertions(+), 19 deletions(-)
diff --git a/checks/cpu b/checks/cpu
index 811b33b..e2bb254 100644
--- a/checks/cpu
+++ b/checks/cpu
@@ -29,7 +29,7 @@
cpuload_default_levels = (5, 10)
-threads_default_levels = (2000.0, 4000.0)
+threads_default_levels = (2000, 4000)
def inventory_cpu_load(info):
if len(info) == 1 and len(info[0]) >= 5:
diff --git a/checks/if.include b/checks/if.include
index a003d2a..dedc1fd 100644
--- a/checks/if.include
+++ b/checks/if.include
@@ -116,7 +116,7 @@ def inventory_if_common(info):
paramstring = "{"
if if_inventory_monitor_state:
- paramstring += '"state" : "%s",' % ifOperStatus
+ paramstring += '"state" : ["%s"],' % ifOperStatus
if ifSpeed != "" and if_inventory_monitor_speed:
paramstring += '"speed" : %d,' % int(ifSpeed)
diff --git a/web/htdocs/valuespec.py b/web/htdocs/valuespec.py
index 8707a3f..21e3d65 100644
--- a/web/htdocs/valuespec.py
+++ b/web/htdocs/valuespec.py
@@ -163,7 +163,7 @@ class Age(ValueSpec):
def validate_datatype(self, value, varprefix):
if type(value) != int:
- raise MKUserError(varprefix, _("The value has type %s, but must be of type int") % (type(value)))
+ raise MKUserError(varprefix, _("The value %r has type %s, but must be of type int") % (value, type(value)))
# Editor for a single integer
@@ -220,7 +220,8 @@ class Integer(ValueSpec):
def validate_datatype(self, value, varprefix):
if type(value) != int:
- raise MKUserError(varprefix, _("The value has type %s, but must be of type int") % (type(value)))
+ raise MKUserError(varprefix, _("The value %r has the wrong type %s, but must be of type int")
+ % (value, type(value)))
def validate_value(self, value, varprefix):
if self._minvalue != None and value < self._minvalue:
@@ -487,7 +488,7 @@ class Float(Integer):
def validate_datatype(self, value, varprefix):
if type(value) != float:
- raise MKUserError(varprefix, _("The value has type %s, but must be of type float") % (type(value)))
+ raise MKUserError(varprefix, _("The value %r has type %s, but must be of type float") % (value, type(value)))
class Percentage(Float):
@@ -499,10 +500,19 @@ class Percentage(Float):
self._maxvalue = 101.0
if "unit" not in kwargs:
self._unit = "%"
+ self._allow_int = kwargs.get("allow_int", False)
def value_to_text(self, value):
return "%.1f%%" % value
+ def validate_datatype(self, value, varprefix):
+ if self._allow_int:
+ if type(value) not in [ int, float ]:
+ raise MKUserError(varprefix, _("The value %r has type %s, but must be either float or int")
+ % (value, type(value)))
+ else:
+ Float.validate_datatype(self, value, varprefix)
+
class Checkbox(ValueSpec):
def __init__(self, **kwargs):
@@ -526,7 +536,7 @@ class Checkbox(ValueSpec):
def validate_datatype(self, value, varprefix):
if type(value) != bool:
- raise MKUserError(varprefix, _("The value has type %s, but must be either True or False") % (type(value)))
+ raise MKUserError(varprefix, _("The value %r has type %s, but must be of type bool") % (value, type(value)))
# A type-save dropdown choice. Parameters:
# help_separator: if you set this to a character, e.g. "-", then
@@ -1256,7 +1266,10 @@ class Dictionary(ValueSpec):
for param, vs in self._elements:
if param in value:
vp = varprefix + "_" + param
- vs.validate_datatype(value[param], vp)
+ try:
+ vs.validate_datatype(value[param], vp)
+ except MKUserError, e:
+ raise MKUserError(e.varname, _("%s: %s") % (vs.title(), e.message))
elif not self._optional_keys:
raise MKUserError(varprefix, _("The entry %s is missing") % vp.title())
@@ -1265,7 +1278,7 @@ class Dictionary(ValueSpec):
for param in value.keys():
if param not in allowed_keys:
raise MKUserError(varprefix, _("Undefined key '%s' in the dictionary. Allowed are %s.") %
- ", ".join(allowed_keys))
+ (param, ", ".join(allowed_keys)))
def validate_value(self, value, varprefix):
for param, vs in self._elements:
diff --git a/web/htdocs/wato.py b/web/htdocs/wato.py
index 8585138..6648131 100644
--- a/web/htdocs/wato.py
+++ b/web/htdocs/wato.py
@@ -2027,9 +2027,16 @@ def show_service_table(host, firsttime):
("varname", varname),
("host", hostname),
("item", repr(item))])
- title = _("Edit rules for this check parameter")
- title = "Check parameters for this service: " + \
- rulespec["valuespec"].value_to_text(params)
+ try:
+ rulespec["valuespec"].validate_datatype(params, "")
+ rulespec["valuespec"].validate_value(params, "")
+ paramtext = rulespec["valuespec"].value_to_text(params)
+ except Exception, e:
+ if config.debug:
+ raise
+ paramtext = _("Invalid check parameter: %s!") % e
+
+ title = "Check parameters for this service: " + paramtext
html.write('<a href="%s"><img title="%s" class=icon src="images/icon_rulesets.png"></a>' %
(url, title))
diff --git a/web/plugins/wato/check_parameters.py b/web/plugins/wato/check_parameters.py
index 2e1b0f6..ed1ce73 100644
--- a/web/plugins/wato/check_parameters.py
+++ b/web/plugins/wato/check_parameters.py
@@ -453,8 +453,8 @@ checkgroups.append((
Tuple(
title = _("Levels for the used space"),
elements = [
- Percentage(title = _("Warning at"), label = _("% usage")),
- Percentage(title = _("Critical at"), label = _("% usage"))])),
+ Percentage(title = _("Warning at"), label = _("% usage"), allow_int = True),
+ Percentage(title = _("Critical at"), label = _("% usage"), allow_int = True)])),
( "magic",
Float(
title = _("Magic factor (automatic level adaptation for large filesystems)"),
@@ -465,11 +465,22 @@ checkgroups.append((
title = _("Reference size for magic factor"),
minvalue = 1,
label = _("GB"))),
+ ( "levels_low",
+ Tuple(
+ title = _("Minimum levels if using magic factor"),
+ help = _("The filesystem levels will never fall below these values, when using "
+ "the magic factor and the filesystem is very small."),
+ elements = [
+ Percentage(title = _("Warning at"), label = _("% usage"), allow_int = True),
+ Percentage(title = _("Critical at"), label = _("% usage"), allow_int = True)])),
( "trend_range",
- Integer(
- title = _("Range for filesystem trend computation"),
- minvalue = 1,
- label= _("hours"))),
+ Optional(
+ Integer(
+ title = _("Range for filesystem trend computation"),
+ minvalue = 1,
+ label= _("hours")),
+ title = _("Trend computation"),
+ label = _("Enable trend computation"))),
( "trend_mb",
Tuple(
title = _("Levels on trends in MB per range"),
@@ -612,8 +623,8 @@ checkgroups.append((
Tuple(
title = _("Specify levels in percentage of total RAM"),
elements = [
- Percentage(title = _("Warning at a usage of"), label = _("% of RAM")),
- Percentage(title = _("Critical at a usage of"), label = _("% of RAM"))]),
+ Percentage(title = _("Warning at a usage of"), label = _("% of RAM"), max_value = None),
+ Percentage(title = _("Critical at a usage of"), label = _("% of RAM"), max_value = None)]),
Tuple(
title = _("Specify levels in absolute usage values"),
elements = [