Module: check_mk
Branch: master
Commit: ae048842dcac8bc8e85b5519c07896e8fe207f72
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=ae048842dcac8b…
Author: Bernd Stroessenreuther <bs(a)mathias-kettner.de>
Date: Mon Sep 16 08:57:44 2013 +0200
Updated bug entries #1052
---
.bugs/1052 | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/.bugs/1052 b/.bugs/1052
new file mode 100644
index 0000000..e89f6e8
--- /dev/null
+++ b/.bugs/1052
@@ -0,0 +1,16 @@
+Title: CUPS print queue monitoring: Default Printer is not checked / inventorized
+Component: checks
+State: open
+Date: 2013-09-16 08:52:34
+Targetversion: 1.2.3i2
+Class: bug
+
+after a change in the linux agent, all printers are monitored / inventorized
+except the default printer, having a
+<DefaultPrinter sw>
+section in /etc/cups/printers.conf
+
+execution time optimization can be done within the change:
+lpstat -a
+command should not be executed twice, but only once
+(whereas the lpstat -p and lpstat -o commands can be done once per printer)
Module: check_mk
Branch: master
Commit: b2479c92dda49ed0a92f0ade6f1da720dfc4ccfa
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=b2479c92dda49e…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Sat Sep 14 11:46:35 2013 +0200
Allow to specify custom host check via WATO (arbitrary command line)
This can now directly be configured via WATO. It is very similar to
the "classical active and passive nagios checks" and allows to use
an arbitrary command line instead of PING, etc.
---
ChangeLog | 7 +++--
modules/check_mk.py | 31 ++++++++++++++-------
web/plugins/wato/active_checks.py | 40 +++++++++++++++-------------
web/plugins/wato/check_mk_configuration.py | 3 ++-
4 files changed, 49 insertions(+), 32 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 91c95af..304fdbf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -14,8 +14,11 @@
* New option explicit_snmp_communities to override rule based SNMP settings
* Preparations for significant SNMP monitoring performance improvement
(It's named Inline SNMP, which is available as special feature via subscriptions)
- * livestatus: new service column staleness: indicator for outdated service checks
- * livestatus: new host column staleness: indicator for outdated host checks
+ * Allow to specify custom host check via WATO (arbitrary command line)
+
+ Livestatus:
+ * new service column staleness: indicator for outdated service checks
+ * new host column staleness: indicator for outdated host checks
Checks & Agents:
* esx_hostystem multipath: criticize standby paths only if not equal to active paths
diff --git a/modules/check_mk.py b/modules/check_mk.py
index b6ce1db..f1905b9 100755
--- a/modules/check_mk.py
+++ b/modules/check_mk.py
@@ -1451,6 +1451,13 @@ def host_check_command(hostname, ip, is_clust):
elif value[0] == "tcp":
return "check-mk-host-tcp!" + str(value[1])
+ elif value[0] == "custom":
+ try:
+ custom_commands_to_define.add("check-mk-custom")
+ except:
+ pass # not needed and not available with CMC
+ return "check-mk-custom!" + autodetect_plugin(value[1])
+
raise MKGeneralException("Invalid value %r for host_check_command of host %s." % (
value, hostname))
@@ -2159,16 +2166,7 @@ define service {
continue
if command_line:
- plugin_name = command_line.split()[0]
- if command_line[0] not in [ '$', '/' ]:
- try:
- for dir in [ "/local", "" ]:
- path = omd_root + dir + "/lib/nagios/plugins/"
- if os.path.exists(path + plugin_name):
- command_line = path + command_line
- break
- except:
- pass
+ command_line = autodetect_plugin(command_line)
if "freshness" in entry:
freshness = " check_freshness\t\t1\n" + \
@@ -2225,6 +2223,19 @@ define service {
""" % (pingonly_template, ping_command, check_icmp_arguments(hostname), extra_service_conf_of(hostname, "PING"), hostname))
+def autodetect_plugin(command_line):
+ plugin_name = command_line.split()[0]
+ if command_line[0] not in [ '$', '/' ]:
+ try:
+ for dir in [ "/local", "" ]:
+ path = omd_root + dir + "/lib/nagios/plugins/"
+ if os.path.exists(path + plugin_name):
+ command_line = path + command_line
+ break
+ except:
+ pass
+ return command_line
+
def simulate_command(command):
if simulation_mode:
custom_commands_to_define.add("check-mk-simulation")
diff --git a/web/plugins/wato/active_checks.py b/web/plugins/wato/active_checks.py
index 449693a..e978655 100644
--- a/web/plugins/wato/active_checks.py
+++ b/web/plugins/wato/active_checks.py
@@ -810,6 +810,24 @@ register_rule(group,
),
match = 'all')
+def PluginCommandLine(addhelp = ""):
+ return TextAscii(
+ title = _("Command line"),
+ help = _("Please enter the complete shell command including "
+ "path name and arguments to execute. You can use Nagios "
+ "macros here. The most important are:<ul>"
+ "<li><tt>$HOSTADDRESS$</tt>: The IP address of the host</li>"
+ "<li><tt>$HOSTNAME$</tt>: The name of the host</li>"
+ "<li><tt>$USER1$</tt>: user macro 1 (usually path to shipped plugins)</li>"
+ "<li><tt>$USER2$</tt>: user marco 2 (usually path to your own plugins)</li>"
+ "</ul>"
+ "If you are using OMD, then you can omit the path and just specify "
+ "the command (e.g. <tt>check_foobar</tt>). This command will be "
+ "searched first in the local plugins directory "
+ "(<tt>~/local/lib/nagios/plugins</tt>) and then in the shipped plugins "
+ "directory (<tt>~/lib/nagios/plugins</tt>) within your site directory."),
+ size = "max",
+ )
register_rule(group,
"custom_checks",
@@ -830,25 +848,9 @@ register_rule(group,
default_value = _("Customcheck"))
),
( "command_line",
- TextAscii(
- title = _("Command line"),
- help = _("Please enter the complete shell command including "
- "path name and arguments to execute. You can use Nagios "
- "macros here. The most important are:<ul>"
- "<li><tt>$HOSTADDRESS$</tt>: The IP address of the host</li>"
- "<li><tt>$HOSTNAME$</tt>: The name of the host</li>"
- "<li><tt>$USER1$</tt>: user macro 1 (usually path to shipped plugins)</li>"
- "<li><tt>$USER2$</tt>: user marco 2 (usually path to your own plugins)</li>"
- "</ul>"
- "If you are using OMD, then you can omit the path and just specify "
- "the command (e.g. <tt>check_foobar</tt>). This command will be "
- "searched first in the local plugins directory "
- "(<tt>~/local/lib/nagios/plugins</tt>) and then in the shipped plugins "
- "directory (<tt>~/lib/nagios/plugins</tt>) within your site directory.<br><br>"
- "<b>Passive checks</b>: Do no specify a command line if you want "
- "to define passive checks."),
- size = "max",
- )
+ PluginCommandLine(addhelp = _("<br><br>"
+ "<b>Passive checks</b>: Do no specify a command line if you want "
+ "to define passive checks.")),
),
( "command_name",
TextAscii(
diff --git a/web/plugins/wato/check_mk_configuration.py b/web/plugins/wato/check_mk_configuration.py
index 2d3fc41..68d5706 100644
--- a/web/plugins/wato/check_mk_configuration.py
+++ b/web/plugins/wato/check_mk_configuration.py
@@ -1433,7 +1433,8 @@ register_rule(
( "tcp" , _("TCP Connect"), Integer(label = _("to port:"), minvalue=1, maxvalue=65535, default_value=80 )),
( "ok", _("Always assume host to be up") ),
( "agent", _("Use the status of the Check_MK Agent") ),
- ( "service", _("Use the status of the service..."), TextUnicode(label = ":", size=32, allow_empty=False )),
+ ( "service", _("Use the status of the service..."), TextUnicode(label = ":", size=45, allow_empty=False )),
+ ( "custom", _("Use a custom check plugin..."), PluginCommandLine() ),
],
default_value = "ping",
html_separator = " ",
Module: check_mk
Branch: master
Commit: 03cf034c9335a80beb9110650a29ef63850c6e93
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=03cf034c9335a8…
Author: Bernd Stroessenreuther <bs(a)mathias-kettner.de>
Date: Fri Sep 13 17:28:34 2013 +0200
check_bi_local.py now can be used with password or alternatively with automation secret
---
doc/treasures/check_bi_local.py | 26 ++++++++++++++++++++++----
1 file changed, 22 insertions(+), 4 deletions(-)
diff --git a/doc/treasures/check_bi_local.py b/doc/treasures/check_bi_local.py
index 304a68a..3fb6568 100755
--- a/doc/treasures/check_bi_local.py
+++ b/doc/treasures/check_bi_local.py
@@ -30,22 +30,40 @@
# 1. Put this file in /usr/lib/check_mk_agent/local
# 2. Make the file executable
# 3. Add a correct url_prefix (OMD site and slash)
-# user and password with read access to Multisite.
+# user with read access to Multisite.
+# 4. Add password OR automation secret of this user
url_prefix = "" # non-OMD installations
# url_prefix = "mysite/" # with OMD site name
# Authentication credentials
user = "omdadmin"
+
+# use password OR automation_secret (you do not need both of them!!)
+# set the other one to the empty string ""
+# either:
password = "omd"
+automation_secret=""
+
+# or:
+# password = ""
+# automation_secret = "LSEGRILPWQVLDBCYCKOC"
# Do not change anything below
import os, sys
-url = 'http://localhost/%scheck_mk/login.py?_login=1&_username=%s&_password=%s' \
- '&_origtarget=view.py%%3Fview_name=aggr_summary%%26output_format=python' % \
- (url_prefix, user, password)
+if automation_secret != "":
+ url = 'http://localhost/%scheck_mk/view.py?view_name=aggr_summary&output_format=py…' \
+ '&_username=%s&_secret=%s' % (url_prefix, user, automation_secret)
+elif password != "":
+ url = 'http://localhost/%scheck_mk/login.py?_login=1&_username=%s&_password=%s' \
+ '&_origtarget=view.py%%3Fview_name=aggr_summary%%26output_format=python' % \
+ (url_prefix, user, password)
+else:
+ sys.stderr.write("You need to specify a password or an automation secret in the script source\n")
+ sys.exit(1)
+
try:
command = "curl -u \"%s:%s\" -b /dev/null -L --noproxy localhost --silent '%s'" % \
Module: check_mk
Branch: master
Commit: 64d9889a4fddf19b8aa9f1a1139e8ddf2c491219
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=64d9889a4fddf1…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Mon Sep 2 12:28:49 2013 +0200
Further process in new snmp handling
---
modules/check_mk.py | 119 ++++++++++-----------------------------------------
modules/snmp.py | 20 ++++++---
2 files changed, 36 insertions(+), 103 deletions(-)
diff --git a/modules/check_mk.py b/modules/check_mk.py
index 1c40eed..f022468 100755
--- a/modules/check_mk.py
+++ b/modules/check_mk.py
@@ -578,69 +578,6 @@ def aggregated_service_name(hostname, servicedesc):
# | |
# +----------------------------------------------------------------------+
-# Returns command lines for snmpwalk and snmpget including
-# options for authentication. This handles communities and
-# authentication for SNMP V3. Also bulkwalk hosts
-def snmp_walk_command(hostname):
- return snmp_base_command('walk', hostname) + " -Cc"
-
-# Constructs the basic snmp commands for a host with all important information
-# like the commandname, SNMP version and credentials.
-# This function also changes snmpbulkwalk to snmpwalk for snmpv1.
-def snmp_base_command(what, hostname):
- # if the credentials are a string, we use that as community,
- # if it is a four-tuple, we use it as V3 auth parameters:
- # (1) security level (-l)
- # (2) auth protocol (-a, e.g. 'md5')
- # (3) security name (-u)
- # (4) auth password (-A)
- # And if it is a six-tuple, it has the following additional arguments:
- # (5) privacy protocol (DES|AES) (-x)
- # (6) privacy protocol pass phrase (-X)
-
- credentials = snmp_credentials_of(hostname)
- if what == 'get':
- command = 'snmpget'
- elif what == 'getnext':
- command = 'snmpgetnext -Cf'
- else:
- command = 'snmpbulkwalk'
-
- # Handle V1 and V2C
- if type(credentials) == str:
- if is_bulkwalk_host(hostname):
- options = '-v2c'
- else:
- if what == 'walk':
- command = 'snmpwalk'
- if is_snmpv2c_host(hostname):
- options = '-v2c'
- else:
- options = '-v1'
- options += " -c '%s'" % credentials
-
- # Handle V3
- else:
- if len(credentials) == 6:
- options = "-v3 -l '%s' -a '%s' -u '%s' -A '%s' -x '%s' -X '%s'" % tuple(credentials)
- elif len(credentials) == 4:
- options = "-v3 -l '%s' -a '%s' -u '%s' -A '%s'" % tuple(credentials)
- else:
- raise MKGeneralException("Invalid SNMP credentials '%r' for host %s: must be string, 4-tuple or 6-tuple" % (credentials, hostname))
-
- # Do not load *any* MIB files. This save lot's of CPU.
- options += " -m '' -M ''"
-
- # Configuration of timing and retries
- settings = snmp_timing_of(hostname)
- if "timeout" in settings:
- options += " -t %d" % settings["timeout"]
- if "retries" in settings:
- options += " -r %d" % settings["retries"]
-
- return command + ' ' + options
-
-
# Determine SNMP community for a specific host. It the host is found
# int the map snmp_communities, that community is returned. Otherwise
# the snmp_default_community is returned (wich is preset with
@@ -738,11 +675,11 @@ def snmp_get_oid(hostname, oid):
# In case of .*, check if prefix is the one we are looking for
value = None
- elif value == 'NULL':
+ elif value == 'NULL' or var.type in [ 'NOSUCHINSTANCE', 'NOSUCHOBJECT' ]:
value = None
- elif value is not None and value[0] == '"' and value[0] == '"':
- value = value[1:-1]
+ elif value is not None:
+ value = strip_snmp_value(value)
if opt_verbose and opt_debug:
sys.stdout.write("=> [%r] %s\n" % (value, var.type))
@@ -3953,42 +3890,30 @@ def do_snmpwalk(hostnames):
def do_snmpwalk_on(hostname, filename):
if opt_verbose:
sys.stdout.write("%s:\n" % hostname)
- ip = lookup_ipaddress(hostname)
- portspec = snmp_port_spec(hostname)
- cmd = snmp_walk_command(hostname) + " -On -Ob -OQ -Ot %s%s " % (ip, portspec)
- if opt_debug:
- print 'Executing: %s' % cmd
+
out = file(filename, "w")
- for oid in [ "", "1.3.6.1.4.1" ]: # SNMPv2-SMI::enterprises
- oids = []
- values = []
+ for oid in [
+ ".1.3.6.1.2.1", # SNMPv2-SMI::mib-2
+ ".1.3.6.1.4.1" # SNMPv2-SMI::enterprises
+ ]:
if opt_verbose:
- sys.stdout.write("%s..." % (cmd + oid))
+ sys.stdout.write("Walk on \"%s\"..." % oid)
sys.stdout.flush()
- count = 0
- f = os.popen(cmd + oid)
- while True:
- line = f.readline()
- if not line:
- break
- parts = line.split("=", 1)
- if len(parts) != 2:
- continue
- oid, value = parts
- value = value.rstrip("\n")
- if value.lstrip().startswith('"'):
- while value[-1] != '"':
- value += f.readline().rstrip("\n")
-
- if not oid.startswith("."):
- oid = "." + oid
- oids.append(oid)
- values.append(value)
- for oid, value in zip(oids, values):
+ results = snmpwalk_on_suboid(hostname, oid, strip_values = False)
+ for oid, value in results:
+ # FIXME: Need to parse some datatypes to have a compatible data format
+ # with older versions:
+ # .1.3.6.1.2.1.1.3.0 0:1:43:32.82
+ # ->
+ # .1.3.6.1.2.1.1.3.0 620972
+ #
+ # .1.3.6.1.2.1.1.8.0 0:0:00:00.00
+ # ->
+ # .1.3.6.1.2.1.1.8.0 0
out.write("%s %s\n" % (oid, value.strip()))
- count += 1
+
if opt_verbose:
- sys.stdout.write("%d variables.\n" % count)
+ sys.stdout.write("%d variables.\n" % len(results))
out.close()
if opt_verbose:
diff --git a/modules/snmp.py b/modules/snmp.py
index a6bbd42..638b4f5 100644
--- a/modules/snmp.py
+++ b/modules/snmp.py
@@ -93,7 +93,8 @@ def init_snmp_host(hostname):
priv_proto = 'DEFAULT'
priv_pass = ''
else:
- raise MKGeneralException("Invalid SNMP credentials '%r' for host %s: must be string, 4-tuple or 6-tuple" % (credentials, hostname))
+ raise MKGeneralException("Invalid SNMP credentials '%r' for host %s: "
+ "must be string, 4-tuple or 6-tuple" % (credentials, hostname))
try:
ipaddress = lookup_ipaddress(hostname)
@@ -119,10 +120,11 @@ def init_snmp_host(hostname):
g_snmp_sessions[hostname] = s
return s
-def snmpwalk_on_suboid(hostname, ip, oid):
+def snmpwalk_on_suboid(hostname, oid, strip_values = True):
s = init_snmp_host(hostname)
- # FIXME: handle bulkwalk/getnext walk
+ # FIXME: handle bulkwalk/getnext walk. At the moment it seems only
+ # a getnext walk is done in all cases.
# Remove trailing .0 for walks
# .1.3.6.1.2.1.1.5.0 but receive the value for 1.3.6.1.2.1.1.6.0.
@@ -130,7 +132,7 @@ def snmpwalk_on_suboid(hostname, ip, oid):
oid = oid[:-2]
if opt_debug:
- sys.stdout.write("Executing SNMPWALK of %s on %s\n" % (oid, hostname))
+ sys.stdout.write("Executing SNMPWALK of \"%s\" on %s\n" % (oid, hostname))
var_list = netsnmp.VarList(netsnmp.Varbind(oid))
res = s.walk(var_list)
@@ -142,8 +144,14 @@ def snmpwalk_on_suboid(hostname, ip, oid):
results = []
for var in var_list:
+ if var.iid is None:
+ continue
+
this_oid = var.tag + '.' + var.iid
- value = strip_snmp_value(var.val)
+ if strip_values:
+ value = strip_snmp_value(var.val)
+ else:
+ value = var.val
if opt_verbose and opt_debug:
sys.stdout.write("%s => [%s] %r\n" % (this_oid, value, var.type))
@@ -217,7 +225,7 @@ def get_snmp_table(hostname, ip, oid_info):
if opt_use_snmp_walk or is_usewalk_host(hostname):
rowinfo = get_stored_snmpwalk(hostname, fetchoid)
else:
- rowinfo = snmpwalk_on_suboid(hostname, ip, fetchoid)
+ rowinfo = snmpwalk_on_suboid(hostname, fetchoid)
columns.append((fetchoid, rowinfo))
number_rows = len(rowinfo)
Module: check_mk
Branch: master
Commit: a4146c4822a297fe05ad479bbc3d89ee49a177ec
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=a4146c4822a297…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Thu Aug 29 10:45:25 2013 +0200
Convention is to begin all OIDs with a leading dot -> fixed
---
checks/if64 | 2 +-
checks/if_lancom | 2 +-
checks/wut_webio_io | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/checks/if64 b/checks/if64
index a5e6310..d45d098 100644
--- a/checks/if64
+++ b/checks/if64
@@ -69,7 +69,7 @@ check_info["if64"] = {
"2.2.1.6", # ifPhysAddress 19
]),
'snmp_scan_function': \
- lambda oid: "LANCOM" not in oid("1.3.6.1.2.1.1.1.0") and \
+ lambda oid: "LANCOM" not in oid(".1.3.6.1.2.1.1.1.0") and \
".4.1.11863." not in oid(".1.3.6.1.2.1.1.2.0") and \
(not if64_disabled(g_hostname)) and \
oid(".1.3.6.1.2.1.31.1.1.1.6.*") != None,
diff --git a/checks/if_lancom b/checks/if_lancom
index 7579084..d0cb680 100644
--- a/checks/if_lancom
+++ b/checks/if_lancom
@@ -94,7 +94,7 @@ check_info["if_lancom"] = {
],
# check if number of network interfaces (IF-MIB::ifNumber.0) is at least 2
'snmp_scan_function': \
- lambda oid: "LANCOM" in oid("1.3.6.1.2.1.1.1.0") and \
+ lambda oid: "LANCOM" in oid(".1.3.6.1.2.1.1.1.0") and \
(not if64_disabled(g_hostname)) and \
oid(".1.3.6.1.2.1.31.1.1.1.6.*") != None,
'group': 'if',
diff --git a/checks/wut_webio_io b/checks/wut_webio_io
index e93866b..05499ef 100644
--- a/checks/wut_webio_io
+++ b/checks/wut_webio_io
@@ -106,6 +106,6 @@ check_info['wut_webio_io.inputs'] = {
]),
# first check we have a vendor mib from W&T, then check for the model in their MIB.
"snmp_scan_function" : lambda oid: \
- ".1.3.6.1.4.1.5040" in oid("1.3.6.1.2.1.1.2.0") and
+ ".1.3.6.1.4.1.5040" in oid(".1.3.6.1.2.1.1.2.0") and
oid(".1.3.6.1.4.1.5040.1.2.4.3.3.5.0").lower().startswith("web-io"),
}