Module: check_mk
Branch: master
Commit: 2fc7854cac6a2e146eff3a286eb8288c57228198
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=2fc7854cac6a2e…
Author: Simon Betz <si(a)mathias-kettner.de>
Date: Thu Feb 11 16:52:14 2016 +0100
#2980 agent_ipmi_sensors: new special agent to monitor IPMI data via ipmi-sensors (of
freeipmi)
Please make sure, that if you have installed freeipmi that IPMI is really support by your
hardware.
---
.werks/2980 | 9 ++
ChangeLog | 1 +
agents/special/agent_ipmi_sensors | 137 +++++++++++++++++++++++++++++++
checks/agent_ipmi_sensors | 37 +++++++++
web/plugins/wato/datasource_programs.py | 31 +++++++
5 files changed, 215 insertions(+)
diff --git a/.werks/2980 b/.werks/2980
new file mode 100644
index 0000000..efe304f
--- /dev/null
+++ b/.werks/2980
@@ -0,0 +1,9 @@
+Title: agent_ipmi_sensors: new special agent to monitor IPMI data via ipmi-sensors (of
freeipmi)
+Level: 1
+Component: checks
+Compatible: compat
+Version: 1.2.7i4
+Date: 1455205795
+Class: feature
+
+Please make sure, that if you have installed freeipmi that IPMI is really support by your
hardware.
diff --git a/ChangeLog b/ChangeLog
index 2aaafc9..9d6d3b5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -115,6 +115,7 @@
* 2977 aruba_wlc_clients: new check which monitors the WLC clients of a Aruba
Networks WLAN Controller
* 3173 datapower_cpu datapower_fan datapower_fs datapower_ldrive datapower_mem
datapower_pdrive datapower_raid_bat datapower_tcp datapower_temp: Detect XI52 Model
* 2979 aruba_wlc_aps: new inventory plugin for Aruba Networks WLAN Controller which
displays name, group name, model, serial number and system location of all access points
of this WLC
+ * 2980 agent_ipmi_sensors: new special agent to monitor IPMI data via ipmi-sensors
(of freeipmi)...
* 2660 FIX: fixed windows agent using the wrong working directory...
* 2664 FIX: ps: Speedup in situation with many matching processes...
* 2661 FIX: windows agent: fixed incomplete process list...
diff --git a/agents/special/agent_ipmi_sensors b/agents/special/agent_ipmi_sensors
new file mode 100755
index 0000000..a5510d0
--- /dev/null
+++ b/agents/special/agent_ipmi_sensors
@@ -0,0 +1,137 @@
+#!/usr/bin/python
+# -*- encoding: utf-8; py-indent-offset: 4 -*-
+# +------------------------------------------------------------------+
+# | ____ _ _ __ __ _ __ |
+# | / ___| |__ ___ ___| | __ | \/ | |/ / |
+# | | | | '_ \ / _ \/ __| |/ / | |\/| | ' / |
+# | | |___| | | | __/ (__| < | | | | . \ |
+# | \____|_| |_|\___|\___|_|\_\___|_| |_|_|\_\ |
+# | |
+# | Copyright Mathias Kettner 2015 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-
+# tails. 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.
+
+
+import os, sys, getopt, subprocess
+
+
+def usage():
+ sys.stderr.write("""Check_MK IPMI Sensors
+
+USAGE: agent_ipmi_sensors [OPTIONS] HOST
+ agent_ipmi_sensors --help
+
+ARGUMENTS:
+ HOST Host name or IP address
+
+OPTIONS:
+ --help Show this help message and exit
+ -u Username
+ -p Password
+ -l Privilege level
+ Possible are 'user', 'operator',
'admin'
+ --debug Debug output
+""")
+
+
+short_options = 'u:p:l:'
+long_options = [ 'help', 'debug' ]
+
+
+opt_debug = False
+hostname = None
+username = None
+password = None
+privilege_lvl = None
+
+
+try:
+ opts, args = getopt.getopt(sys.argv[1:], short_options, long_options)
+except getopt.GetoptError, err:
+ sys.stderr.write("%s\n" % err)
+ sys.exit(1)
+
+
+if len(args) == 1:
+ hostname = args[0]
+elif not args:
+ sys.stderr.write("ERROR: No host given.\n")
+ sys.exit(1)
+else:
+ sys.stderr.write("ERROR: Please specify exactly one host.\n")
+ sys.exit(1)
+
+
+for o, a in opts:
+ if o in [ '--help' ]:
+ usage()
+ sys.exit(0)
+ elif o in [ '--debug' ]:
+ opt_debug = True
+ elif o in [ '-u' ]:
+ username = a
+ elif o in [ '-p' ]:
+ password = a
+ elif o in [ '-l' ]:
+ privilege_lvl = a
+
+
+if not (username and password and privilege_lvl):
+ sys.stderr.write("ERROR: Credentials are missing.\n")
+ sys.exit(1)
+
+
+for sub_path in [ "sbin", "bin", "local/sbin",
"local/bin" ]:
+ base_cmd = "/usr/%s/ipmi-sensors" % sub_path
+ ipmi_cmd = [base_cmd, "-h", hostname, "-u", username,
"-p", password, "-l", privilege_lvl ]
+ try:
+ if opt_debug:
+ sys.stdout.write("DEBUG: try executing '%s'\n" % base_cmd)
+ p = subprocess.Popen(ipmi_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ sensor_data, err = p.communicate()
+ break
+ except Exception, e:
+ if opt_debug:
+ sys.stdout.write("ERROR: '%s': %s\n" % (base_cmd, e))
+ continue
+
+
+# output
+# ID | Name | Type | Reading | Units | Event
+# 4 | CPU Temp | Temperature | 28.00 | C | 'OK'
+# 71 | System Temp | Temperature | 28.00 | C | 'OK'
+# 607 | P1-DIMMC2 TEMP | Temperature | N/A | C | N/A
+
+
+def parse_ipmi_sensor_data(ipmi_sensor_data):
+ for line in ipmi_sensor_data:
+ if line.startswith("ID"):
+ continue
+ else:
+ sensor_id, sensor_name, sensor_type, reading, unit, event = \
+ map(lambda x: x.strip().replace(" ",
"_").replace("/", ""), line.split("|"))
+ sys.stdout.write("%s %s_%s %s_%s_(NA/NA) [%s]\n" % \
+ (sensor_id, sensor_type, sensor_name,
+ reading, unit, event.replace("'", "")))
+
+
+if err:
+ sys.stderr.write("ERROR: '%s'\n" % err[:-1])
+ sys.exit(1)
+else:
+ sys.stdout.write("<<<ipmi_sensors>>>\n")
+ parse_ipmi_sensor_data(sensor_data.splitlines())
+ sys.exit(0)
diff --git a/checks/agent_ipmi_sensors b/checks/agent_ipmi_sensors
new file mode 100644
index 0000000..66a8c34
--- /dev/null
+++ b/checks/agent_ipmi_sensors
@@ -0,0 +1,37 @@
+#!/usr/bin/python
+# -*- encoding: utf-8; py-indent-offset: 4 -*-
+# +------------------------------------------------------------------+
+# | ____ _ _ __ __ _ __ |
+# | / ___| |__ ___ ___| | __ | \/ | |/ / |
+# | | | | '_ \ / _ \/ __| |/ / | |\/| | ' / |
+# | | |___| | | | __/ (__| < | | | | . \ |
+# | \____|_| |_|\___|\___|_|\_\___|_| |_|_|\_\ |
+# | |
+# | Copyright Mathias Kettner 2014 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-
+# tails. 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.
+
+def agent_ipmi_sensors_arguments(params, hostname, ipaddress):
+ args = ''
+
+ args += " -u " + quote_shell_string(params["username"])
+ args += " -p " + quote_shell_string(params["password"])
+ args += " -l " + quote_shell_string(params["privilege_lvl"])
+
+ args += " " + quote_shell_string(ipaddress)
+ return args
+
+special_agent_info['ipmi_sensors'] = agent_ipmi_sensors_arguments
diff --git a/web/plugins/wato/datasource_programs.py
b/web/plugins/wato/datasource_programs.py
index 8dc3f61..fdb2741 100644
--- a/web/plugins/wato/datasource_programs.py
+++ b/web/plugins/wato/datasource_programs.py
@@ -214,6 +214,37 @@ register_rule(group,
match = 'first')
register_rule(group,
+ "special_agents:ipmi_sensors",
+ Dictionary(
+ elements = [
+ ( "username",
+ TextAscii(
+ title = _("Username"),
+ allow_empty = False,
+ )
+ ),
+ ( "password",
+ Password(
+ title = _("Password"),
+ allow_empty = False,
+ )
+ ),
+ ( "privilege_lvl",
+ TextAscii(
+ title = _("Privilege Level"),
+ help = _("Possible are 'user', 'operator',
'admin'"),
+ allow_empty = False,
+ )
+ )
+ ],
+ optional_keys = False
+ ),
+ title = _("Check IPMI Sensors via Freeipmi"),
+ help = _("This rule selects the Agent IPMI Sensors instead of the normal
Check_MK Agent "
+ "which collects the data through the Freeipmi command"),
+ match = 'first')
+
+register_rule(group,
"special_agents:netapp",
Transform(
Dictionary(