Module: check_mk
Branch: master
Commit: f04b272acc95f1e2ab6f6f45091fce7a658530c1
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=f04b272acc95f1…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Mon Feb 25 12:10:59 2013 +0100
Convert piggyback cache setting to ValueSpec Age
---
web/plugins/wato/check_mk_configuration.py | 8 ++++----
1 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/web/plugins/wato/check_mk_configuration.py b/web/plugins/wato/check_mk_configuration.py
index bd20672..9b04e8f 100644
--- a/web/plugins/wato/check_mk_configuration.py
+++ b/web/plugins/wato/check_mk_configuration.py
@@ -654,10 +654,10 @@ register_configvar(group,
register_configvar(group,
"piggyback_max_cachefile_age",
- Integer(title = _("Maximum age for piggyback files"),
- label = _("seconds"),
- help = _("The number of seconds a piggyback file may be old to be valid for monitoring. "
- "Older files are deleted before processing them.")),
+ Age(title = _("Maximum age for piggyback files"),
+ help = _("The maximum age for piggy back data from another host to be valid for monitoring. "
+ "Older files are deleted before processing them. Please make sure that this age is "
+ "at least as large as you normal check interval for piggy hosts.")),
need_restart = True)
Module: check_mk
Branch: master
Commit: 74eebe828fbde0015af5fb4fcc68efb842366fa1
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=74eebe828fbde0…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Sat Feb 23 19:33:21 2013 +0100
Add code for getting data from RRDs
---
modules/check_mk.py | 2 +
modules/prediction.py | 87 +++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 89 insertions(+), 0 deletions(-)
diff --git a/modules/check_mk.py b/modules/check_mk.py
index 765e974..d065b01 100755
--- a/modules/check_mk.py
+++ b/modules/check_mk.py
@@ -111,6 +111,8 @@ nagios_startscript = '/etc/init.d/nagios'
nagios_binary = '/usr/sbin/nagios'
nagios_config_file = '/etc/nagios/nagios.cfg'
logwatch_notes_url = "/nagios/logwatch.php?host=%s&file=%s"
+rrdcached_socket = None # used by prediction.py
+rrd_path = none # used by prediction.py
def verbose(t):
if opt_verbose:
diff --git a/modules/prediction.py b/modules/prediction.py
new file mode 100644
index 0000000..516cb49
--- /dev/null
+++ b/modules/prediction.py
@@ -0,0 +1,87 @@
+#!/usr/bin/python
+# -*- encoding: utf-8; py-indent-offset: 4 -*-
+# +------------------------------------------------------------------+
+# | ____ _ _ __ __ _ __ |
+# | / ___| |__ ___ ___| | __ | \/ | |/ / |
+# | | | | '_ \ / _ \/ __| |/ / | |\/| | ' / |
+# | | |___| | | | __/ (__| < | | | | . \ |
+# | \____|_| |_|\___|\___|_|\_\___|_| |_|_|\_\ |
+# | |
+# | Copyright Mathias Kettner 2013 mk(a)mathias-kettner.de |
+# +------------------------------------------------------------------+
+#
+# This file is part of Check_MK.
+# The official homepage is at http://mathias-kettner.de/check_mk.
+#
+# check_mk 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 in version 2. check_mk is distributed
+# in the hope that it will be useful, but WITHOUT ANY WARRANTY; with-
+# out even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE. See the GNU General Public License for more de-
+# ails. You should have received a copy of the GNU General Public
+# License along with GNU Make; see the file COPYING. If not, write
+# to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+# Boston, MA 02110-1301 USA.
+
+# Code for predictive monitoring / anomaly detection
+
+# Export data from an RRD file. This requires an up-to-date
+# version of the rrdtools.
+
+def rrd_export(filename, ds, fromtime, untiltime, rrdcached=None):
+ # rrdtool xport --json -s 1361554418 -e 1361640814 --step 60 DEF:x=/omd/sites/heute/X.rrd:1:AVERAGE XPORT:x:HIRNI
+ cmd = "rrdtool xport --json -s %d -e %d --step 60 " % (fromtime, untiltime)
+ if rrdcached:
+ cmd += "--daemon '%s' " % rrdcached
+ cmd += " DEF:x=%s:%s:AVERAGE XPORT:x 2>&1" % (filename, ds)
+ if opt_debug:
+ sys.stderr.write("Running %s\n" % cmd)
+ f = os.popen(cmd)
+ output = f.read()
+ exit_code = f.close()
+ if exit_code:
+ raise MKGeneralException("Cannot fetch RRD data: %s" % output)
+ # Parse without json module (this is not always available)
+ # Our data begins at "data: [..."
+ begin = output.index("data:")
+ data_part = output[begin + 5:-2]
+ data = eval(data_part, { "null" : None })
+ # rrdtool xport create a list for each datapoint (because you
+ # can fetch several value at once)
+ return [ x[0] for x in data ]
+
+def pnp_cleanup(s):
+ return s \
+ .replace(' ', '_') \
+ .replace(':', '_') \
+ .replace('/', '_') \
+ .replace('\\', '_')
+
+def get_rrd_data(hostname, service_description, varname, fromtime, untiltime):
+ global rrdcached_socket
+ rrd_file = "%s/%s/%s_%s.rrd" % (
+ rrd_path, pnp_cleanup(hostname), pnp_cleanup(service_description), pnp_cleanup(varname))
+ if omd_root and not rrdcached_socket:
+ rrdcached_socket = omd_root + "/tmp/run/rrdcached.sock"
+ return rrd_export(rrd_file, 1, fromtime, untiltime, rrdcached_socket)
+
+
+### TEST CODE
+import os, time, sys, pprint
+class MKGeneralException(Exception):
+ def __init__(self, reason):
+ self.reason = reason
+ def __str__(self):
+ return self.reason
+omd_root = os.getenv("OMD_ROOT")
+rrdcached_socket = None
+execfile(omd_root + "/etc/check_mk/defaults")
+opt_debug = True
+data = get_rrd_data("test_1", "Check_MK", "execution_time", time.time() - 86400, time.time())
+pprint.pprint(data)
+
+# HINWEISE für nicht-OMD-Nutzer
+# - RRD_STORAGE_TYPE muss MULTIPLE sein - single wird nicht unterstützt. Sonst
+# müssten wir noch das XML-File auswerten.
+# - rrdcached_socket muss in main.mk definiert werden, wenn rrdcached verwendet wird.
Module: check_mk
Branch: master
Commit: 5f3c78a64a57de19c97cc96a19bff87f1e4782b8
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=5f3c78a64a57de…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Fri Feb 22 08:46:50 2013 +0100
custom_checks now support freshness checking
Conflicts:
ChangeLog
---
ChangeLog | 2 ++
modules/check_mk.py | 19 +++++++++++++------
web/plugins/wato/active_checks.py | 37 +++++++++++++++++++++++++++++++++++++
3 files changed, 52 insertions(+), 6 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 22439c2..016338b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -73,6 +73,8 @@
* FIX: Alias values of host/service/contact groups need to be set and unique
within the group
* Suggest use default value for filesystem levels that make sense
+ * Valuespec: CascadingDropdown now able to process choice values from functions
+ * Freshness checking for classical passive Nagios checks (custom_checks)
1.2.2b3:
Checks & Agents:
diff --git a/modules/check_mk.py b/modules/check_mk.py
index 74609c9..765e974 100755
--- a/modules/check_mk.py
+++ b/modules/check_mk.py
@@ -1904,10 +1904,10 @@ define service {
# Legacy checks via custom_checks
- entries = host_extra_conf(hostname, custom_checks)
- if entries:
+ custchecks = host_extra_conf(hostname, custom_checks)
+ if custchecks:
outfile.write("\n\n# Custom checks\n")
- for entry in entries:
+ for entry in custchecks:
# entries are dicts with the following keys:
# "service_description" Service description to use
# "command_line" (optional) Unix command line for executing the check
@@ -1931,6 +1931,13 @@ define service {
break
except:
pass
+
+ if "freshness" in entry:
+ freshness = " check_freshness\t\t1\n" + \
+ " freshness_threshold\t\t%d\n" % (60 * entry["freshness"]["interval"])
+ command_line = "echo %s && exit %d" % (
+ quote_shell_string(entry["freshness"]["output"]), entry["freshness"]["state"])
+
custom_commands_to_define.add(command_name)
@@ -1954,9 +1961,9 @@ define service {
service_description\t\t%s
check_command\t\t\t%s
active_checks_enabled\t\t%d
-%s}
+%s%s}
""" % (template, hostname, description, simulate_command(command),
- command_line and 1 or 0, extraconf))
+ (command_line and not "freshness") and 1 or 0, extraconf, freshness))
# Levels for host check
if is_cluster(hostname):
@@ -1965,7 +1972,7 @@ define service {
ping_command = 'check-mk-ping'
# No check_mk service, no legacy service -> create PING service
- if not have_at_least_one_service and not legchecks and not actchecks:
+ if not have_at_least_one_service and not legchecks and not actchecks and not custchecks:
outfile.write("""
define service {
use\t\t\t\t%s
diff --git a/web/plugins/wato/active_checks.py b/web/plugins/wato/active_checks.py
index e2f39fa..ff5778e 100644
--- a/web/plugins/wato/active_checks.py
+++ b/web/plugins/wato/active_checks.py
@@ -786,6 +786,43 @@ register_rule(group,
totext = _("process performance data"),
)
),
+ ( "freshness",
+ Dictionary(
+ title = _("Check freshness"),
+ help = _("Freshness checking is only useful for passive checks. It makes sure that passive "
+ "check results are submitted on a regular base. If not, the check is being set to "
+ "warning, critical or unknown."),
+ optional_keys = False,
+ elements = [
+ ( "interval",
+ Integer(
+ title = _("Expected update interval"),
+ label = _("Updates are expected at least every"),
+ unit = _("minutes"),
+ minvalue = 1,
+ default_value = 10,
+ )),
+ ( "state",
+ DropdownChoice(
+ title = _("State in case of absent updates"),
+ choices = [
+ ( 1, _("WARN") ),
+ ( 2, _("CRIT") ),
+ ( 3, _("UNKNOWN") ),
+ ],
+ default_value = 3,
+ )),
+ ( "output",
+ TextUnicode(
+ title = _("Plugin output in case of absent abdates"),
+ size = 40,
+ allow_empty = False,
+ default_value = _("Check result did not arrive in time")
+ )),
+ ],
+ )
+ ),
+
],
required_keys = [ "service_description" ],
),
Module: check_mk
Branch: master
Commit: f51b52c116eb6a5a034e88d4e7acc9d3556a8ed8
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=f51b52c116eb6a…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Fri Feb 22 17:08:21 2013 +0100
FIX: megaraid_bbu: deal with broken output ("Adpater")
Conflicts:
ChangeLog
---
ChangeLog | 2 ++
checks/megaraid_bbu | 6 +++---
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 26c77f0..ff061e4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -34,6 +34,7 @@
Core:
* FIX: Fix output of cmk -D: datasource programs were missing
* FIX: allow unicode encoded extra_service_conf
+ * FIX: no default PING service if custom checks are defined
* FIX: check_mk_base: fixed rounding error in get_bytes_human_readable
* New configuration variable contactgroup_members
@@ -45,6 +46,7 @@
* FIX: diskstat: fix local variable 'ios_per_sec' referenced before assignment
* FIX: multipath: ignore warning messages in agent due to invalid multipath.conf
* FIX: jolokia_metrics.mem: renamed parameter totalheap to total
+ * FIX: megaraid_bbu: deal with broken output ("Adpater")
* Linux agent: limit netstat to 10 seconds
* ps: Allow %1, %2, .. instead of %s in process_inventory. That allows
reordering of matched groups
diff --git a/checks/megaraid_bbu b/checks/megaraid_bbu
index b6a734c..d000efd 100644
--- a/checks/megaraid_bbu
+++ b/checks/megaraid_bbu
@@ -56,7 +56,7 @@ def megaraid_bbu_parse(info):
data = data.strip()
# Scan each controller into its own dictionary
- if name == "BBU status for Adapter":
+ if name in [ "BBU status for Adapter", "BBU status for Adpater" ]:
current_hba = {}
controllers[data] = current_hba
else:
@@ -80,7 +80,7 @@ def check_megaraid_bbu(item, _no_params, info):
state = 0
# get current charge level
if 'Relative State of Charge' not in controller:
- charge = ", No charge information were reported for this controller"
+ charge = ", No charge information reported for this controller"
else:
charge = ", Charge is %s" % controller['Relative State of Charge']
@@ -96,7 +96,7 @@ def check_megaraid_bbu(item, _no_params, info):
except:
pass
- if controller["Learn Cycle Active"] == "Yes":
+ if controller.get("Learn Cycle Active") == "Yes":
return (0, "OK - no states to check (controller is in learn cycle)" + charge)
# return assembled info
elif broken: