Module: check_mk
Branch: master
Commit: 9f9078e77dc5da89216e7990a9ef137593945a99
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=9f9078e77dc5da…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Thu Feb 2 10:42:52 2012 +0100
WATO: force user to have at least one role
---
web/htdocs/wato.py | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/web/htdocs/wato.py b/web/htdocs/wato.py
index 27e027f..8585138 100644
--- a/web/htdocs/wato.py
+++ b/web/htdocs/wato.py
@@ -6729,6 +6729,10 @@ def mode_edit_user(phase):
'the user member of a contact group which has hosts assigned '
'in order to be able to receive emails.'))
+ if not new_user["roles"]:
+ raise MKUserError("role_user",
+ _("Your user has no roles. Please assign at least one role."))
+
ntp = html.var("notification_period")
if ntp not in timeperiods:
ntp = "24X7"
Module: check_mk
Branch: master
Commit: ff3917d11b10fef8d1f385b02704d7c39188fa57
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=ff3917d11b10fe…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Thu Feb 2 10:39:24 2012 +0100
cmk --notify: new macros $MONITORING_HOST$, $OMD_ROOT$ and $OMD_SITE$
---
ChangeLog | 1 +
modules/notify.py | 14 +++++++++++++-
web/plugins/wato/globals_notification.py | 4 ++++
3 files changed, 18 insertions(+), 1 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 48f6e5c..f586e33 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -219,6 +219,7 @@
* Drop RRA-configuration files for PNP4Nagios completely
* New configuration variable ping_levels for configuring parameters
for the host checks.
+ * cmk --notify: new macros $MONITORING_HOST$, $OMD_ROOT$ and $OMD_SITE$
Checks & Agents:
* if/if64: new ruleset if_disable_if64_hosts, that force if on
diff --git a/modules/notify.py b/modules/notify.py
index 01676bd..f15ba30 100644
--- a/modules/notify.py
+++ b/modules/notify.py
@@ -97,6 +97,15 @@ def do_notify(args):
in os.environ.items()
if var.startswith("NOTIFY_")
and not re.match('^\$[A-Z]+\$$', value)])
+
+ # Add a few further helper variables
+ import socket
+ context["MONITORING_HOST"] = socket.gethostname()
+ if omd_root:
+ context["OMD_ROOT"] = omd_root
+ context["OMD_SITE"] = os.getenv("OMD_SITE", "")
+
+
if notification_logging >= 2:
notify_log("Notification context:\n"
+ "\n".join(["%s=%s" % v for v in sorted(context.items())]))
@@ -140,7 +149,10 @@ def do_notify(args):
sys.stderr.write("Details have been logged to %s.\n" % notification_log)
sys.exit(1)
except Exception, e:
- file(var_dir + "/notify/crash.log", "a").write("CRASH:\n%s\n\n" % format_exception())
+ crash_dir = var_dir + "/notify"
+ if not os.path.exists(crash_dir):
+ os.makedirs(crash_dir)
+ file(crash_dir + "/crash.log", "a").write("CRASH:\n%s\n\n" % format_exception())
def format_exception():
import traceback, StringIO, sys
diff --git a/web/plugins/wato/globals_notification.py b/web/plugins/wato/globals_notification.py
index ea47a21..9857039 100644
--- a/web/plugins/wato/globals_notification.py
+++ b/web/plugins/wato/globals_notification.py
@@ -115,6 +115,10 @@ register_configvar(group,
"<tt><b>$LONGSERVICEOUTPUT$</b></tt>: the long output of the check command, "
"<tt><b>$SERVICEPERFDATA$</b></tt>: the performance data of the check, "
"<tt><b>$SERVICECHECKCOMMAND$</b></tt>: the name of the service check command"
+ "<br><br>"
+ "<tt><b>$MONITORING_HOST$</b></tt>: the host name of the monitoring server "
+ "<tt><b>$OMD_ROOT$</b></tt>: the home directory of the OMD site (only on OMD) "
+ "<tt><b>$OMD_SITE$</b></tt>: the name of the OMD site (only on OMD) "
),
),
domain = "check_mk")
Module: check_mk
Branch: master
Commit: fb8e41444256dd4f71726c48b29d4fdf2635eac0
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=fb8e41444256dd…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Wed Feb 1 17:20:46 2012 +0100
New cool ValueSpec: CascadingDropdown
---
web/htdocs/forms.py | 8 +++--
web/htdocs/js/checkmk.js | 16 ++++++++
web/htdocs/valuespec.py | 88 ++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 109 insertions(+), 3 deletions(-)
diff --git a/web/htdocs/forms.py b/web/htdocs/forms.py
index 6c76846..05ef548 100644
--- a/web/htdocs/forms.py
+++ b/web/htdocs/forms.py
@@ -27,7 +27,7 @@
from lib import *
-def edit_dictionary(entries, value, focus=None, hover_help=True, validate=None):
+def edit_dictionary(entries, value, focus=None, hover_help=True, validate=None, buttontext = None):
new_value = value.copy()
if html.var("filled_in") == "form" and html.check_transaction():
messages = []
@@ -60,7 +60,7 @@ def edit_dictionary(entries, value, focus=None, hover_help=True, validate=None):
html.write("<tr><td ")
if vs.help() and hover_help:
html.write('title="%s" ' % vs.help().replace('"', """))
- html.write("class=legend>%s" % vs.title())
+ html.write("class=legend>%s" % (vs.title() or ""))
if vs.help() and not hover_help:
html.write("<br><i>%s</i>" % vs.help())
html.write("</td><td class=content>")
@@ -73,7 +73,9 @@ def edit_dictionary(entries, value, focus=None, hover_help=True, validate=None):
vs.set_focus(name)
first = False
html.write("<tr><td class=buttons colspan=2>")
- html.button("save", _("Save"))
+ if buttontext == None:
+ buttontext = _("Save")
+ html.button("save", buttontext)
html.write("</td></tr>\n")
html.write("</table>\n")
html.hidden_fields()
diff --git a/web/htdocs/js/checkmk.js b/web/htdocs/js/checkmk.js
index d33e94c..bf4093d 100644
--- a/web/htdocs/js/checkmk.js
+++ b/web/htdocs/js/checkmk.js
@@ -1422,3 +1422,19 @@ function list_of_strings_extend(oInput, j) {
// Remove handle from old last element
oInput.onfocus = null;
}
+
+function valuespec_cascading_change(oSelect, varprefix, count) {
+ var nr = parseInt(oSelect.value);
+
+ for (var i=0; i<count; i++) {
+ var oDiv = document.getElementById(varprefix + "_" + i + "_sub");
+ if (oDiv) {
+ if (nr == i) {
+ oDiv.style.display = "";
+ }
+ else
+ oDiv.style.display = "none";
+ }
+ }
+}
+
diff --git a/web/htdocs/valuespec.py b/web/htdocs/valuespec.py
index f5e3ead..11bb85a 100644
--- a/web/htdocs/valuespec.py
+++ b/web/htdocs/valuespec.py
@@ -580,6 +580,94 @@ class DropdownChoice(ValueSpec):
raise MKUserError(varprefix, _("Invalid value %s, must be in %s") %
", ".join([v for (v,t) in self._choices]))
+
+# A Dropdown choice where the elements are ValueSpecs.
+# The currently selected ValueSpec will be displayed.
+# The text representations of the ValueSpecs will be used as texts.
+# A ValueSpec of None is also allowed and will return
+# the value None.
+# The resulting value is either a single value (if no
+# value spec is defined for the selected entry) or a pair
+# of (x, y) where x is the value of the selected entry and
+# y is the value of the valuespec assigned to that entry.
+# choices is a list of triples: [ ( value, title, vs ), ... ]
+class CascadingDropdown(ValueSpec):
+ def __init__(self, **kwargs):
+ ValueSpec.__init__(self, **kwargs)
+ self._choices = kwargs["choices"]
+ self._separator = kwargs.get("separator", ", ")
+ self._html_separator = kwargs.get("html_separator", "<br>")
+
+ def canonical_value(self):
+ if self._choices[0][2]:
+ return (self._choices[0][0], self._choices[0][2].canonical_value())
+ else:
+ return self._choices[0][0]
+
+ def render_input(self, varprefix, value):
+ def_val = 0
+ options = []
+ for nr, (val, title, vs) in enumerate(self._choices):
+ options.append((str(nr), title))
+ if value == val or (
+ type(value) == tuple and value[0] == val):
+ def_val = nr
+ html.select(varprefix + "_sel", options, def_val,
+ onchange="valuespec_cascading_change(this, '%s', %d);" % (varprefix, len(self._choices)))
+ html.write(self._html_separator)
+ for nr, (val, title, vs) in enumerate(self._choices):
+ if vs:
+ vp = varprefix + "_%d" % nr
+ if value == val or (
+ type(value) == tuple and value[0] == val):
+ def_val = value[1]
+ disp = ""
+ else:
+ def_val = vs.default_value()
+ disp = "none"
+ html.write('<div id="%s_%s_sub" style="display: %s">' % (varprefix, nr, disp))
+ vs.render_input(vp, def_val)
+ html.write('</div>')
+
+ def value_to_text(self, value):
+ for val, title, vs in self._choices:
+ if value[0] == val:
+ if not vs:
+ return title
+ else:
+ return title + self._separator + \
+ vs.value_to_text(value[1])
+ return "" # Nothing selected? Should never happen
+
+ def from_html_vars(self, varprefix):
+ sel = int(html.var(varprefix + "_sel"))
+ val, title, vs = self._choices[sel]
+ if vs:
+ val = (val, vs.from_html_vars(varprefix + "_%d" % sel))
+ return val
+
+ def validate_datatype(self, value, varprefix):
+ for nr, (val, title, vs) in enumerate(self._choices):
+ if value == val or (
+ type(value) == tuple and value[0] == val):
+ if vs:
+ if type(value) != tuple or len(value) != 2:
+ raise MKUserError(varprefix + "_sel", _("Value must a tuple with two elements."))
+ vs.validate_datatype(value[1], varprefix + "_%d" % nr)
+ return
+ raise MKUserError(_("Value %r is not allowed here.") % value)
+
+ def validate_value(self, value, varprefix):
+ for nr, (val, title, vs) in enumerate(self._choices):
+ if value == val or (
+ type(value) == tuple and value[0] == val):
+ if vs:
+ vs.validate_value(value[1], varprefix + "_%d" % nr)
+ return
+ raise MKUserError(varprefix, _("Value %r is not allowed here.") % (value, ))
+
+
+
# The same logic as the dropdown choice, but rendered
# as a group of radio buttons.
# columns == None or unset -> separate with " "
Module: check_mk
Branch: master
Commit: a20fc1e2b603de72abc28832ec0ce9443e04f9d0
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=a20fc1e2b603de…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Tue Jan 31 17:04:06 2012 +0100
mounts: fix python exception
---
checks/mounts | 8 +++++---
1 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/checks/mounts b/checks/mounts
index 5764cbe..54a7f4f 100644
--- a/checks/mounts
+++ b/checks/mounts
@@ -38,13 +38,15 @@ def check_mounts(item, targetopts, info):
if item == mp:
opts = options.split(",")
# Now compute the exact difference.
+
exceeding = []
- missing = []
for o in opts:
if o not in targetopts and not o.startswith("commit="):
exceeding.append(o)
- for o in targetopts and not o.startswith("commit="):
- if o not in opts:
+
+ missing = []
+ for o in targetopts:
+ if o not in opts and not o.startswith("commit="):
missing.append(o)
if not missing and not exceeding:
Module: check_mk
Branch: master
Commit: e0fd0f8aa93b2589a4d2a0cb7b35c560d1803c2f
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=e0fd0f8aa93b25…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Tue Jan 31 17:02:43 2012 +0100
WATO: added rule for clustered services
---
ChangeLog | 1 +
web/plugins/wato/check_mk_configuration.py | 11 +++++++++++
2 files changed, 12 insertions(+), 0 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index f041226..9993133 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -91,6 +91,7 @@
* Replication: Can now handle replication sites which use the form based auth
* Replication: Added option to ignore problems with the ssl certificates
used in ssl secured replications
+ * WATO now supports configuring Check_MK clusters
* FIX: Fixed missing folders in "move to" dropdown fields
* FIX: Fixed "move to target folders" after CSV import
* FIX: Fixed problem with duplicate extra_buttons when using the i18n of multiisite
diff --git a/web/plugins/wato/check_mk_configuration.py b/web/plugins/wato/check_mk_configuration.py
index 9430add..16239a9 100644
--- a/web/plugins/wato/check_mk_configuration.py
+++ b/web/plugins/wato/check_mk_configuration.py
@@ -707,6 +707,17 @@ register_rule(group,
"installed."),
))
+register_rule(group,
+ "clustered_services",
+ title = _("Clustered services"),
+ help = _("When you define HA clusters in WATO then you also have to specify "
+ "which services of a node should be assigned to the cluster and "
+ "which services to the physical node. This is done by this ruleset. "
+ "Please note that the rule will be applied to the <i>nodes</i>, not "
+ "to the cluster.<br><br>Please make sure that you re-inventorize the "
+ "cluster and the physical nodes after changing this ruleset."),
+ itemtype = "service")
+
group = _("SNMP")