Module: check_mk
Branch: master
Commit: bc3370f32b62aa13bf694b61ffd4159e7618dccc
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=bc3370f32b62aa…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Mon Sep 17 14:16:51 2012 +0200
check_imap_folder: new active check for searching IMAP folder
---
ChangeLog | 2 +
doc/treasures/check_imap_folder | 205 +++++++++++++++++++++++++++++++++++++++
2 files changed, 207 insertions(+), 0 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index fb2b69f..11e816a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -8,6 +8,8 @@
* Contacts can now define *_notification_commands attributes which can now
override the default notification command check-mk-notify
* SNMP scan: fixed case where = was contained in SNMP info
+ * check_imap_folder: new active check for searching for certain subjects
+ in an IMAP folder
Checks & Agents:
* New Checks for Siemens Blades (BX600)
diff --git a/doc/treasures/check_imap_folder b/doc/treasures/check_imap_folder
new file mode 100755
index 0000000..939a599
--- /dev/null
+++ b/doc/treasures/check_imap_folder
@@ -0,0 +1,205 @@
+#!/usr/bin/python
+# -*- encoding: utf-8; py-indent-offset: 4 -*-
+# +------------------------------------------------------------------+
+# | ____ _ _ __ __ _ __ |
+# | / ___| |__ ___ ___| | __ | \/ | |/ / |
+# | | | | '_ \ / _ \/ __| |/ / | |\/| | ' / |
+# | | |___| | | | __/ (__| < | | | | . \ |
+# | \____|_| |_|\___|\___|_|\_\___|_| |_|_|\_\ |
+# | |
+# | Copyright Mathias Kettner 2012 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.
+
+import imaplib, sys, email, email.header, re, getopt
+
+class MKImapError(Exception):
+ def __init__(self, reason):
+ self.reason = reason
+ def __str__(self):
+ return "Error accessing IMAP folder: " + str(self.reason) + "\n"
+
+state_names = {
+ 0 : "OK",
+ 1 : "WARN",
+ 2 : "CRIT",
+ 3 : "UNKNOWN",
+}
+
+def result(code, text):
+ sys.stderr.write(state_names[code] + " - " + text + "\n")
+ sys.exit(code)
+
+def bail_out(reason):
+ sys.stderr.write(reason + "\n")
+ sys.exit(3)
+
+
+def imap_login():
+ if use_ssl:
+ imap = imaplib.IMAP4_SSL(server)
+ else:
+ imap = imaplib.IMAP4(server)
+ imap.login(user, password)
+ return imap
+
+# FLAGS (\Seen \Recent)
+# FLAGS ()
+def parse_flags(flagsraw):
+ flags = flagsraw.split(None, 1)[1].strip('(').strip(')').replace('\\','').split()
+ return flags
+
+def decode_header_to_unicode(value):
+ result = email.header.decode_header(value)
+ parts = []
+ for header in result:
+ if header[1] == None:
+ parts.append(header[0]) # no encoding
+ else:
+ binstring, encoding = header
+ parts.append(binstring.decode(encoding).strip())
+ return " ".join(parts)
+
+def compile_patterns(plist):
+ for nr, p in enumerate(plist):
+ plist[nr] = re.compile(p, ignore_case and re.I or 0)
+
+def find_in_patterns(subject, plist):
+ for p in plist:
+ if p.search(subject):
+ return True
+ return False
+
+def usage():
+ sys.stdout.write("""
+Usage: check_imap_folder -H SERVER -u USER -p PASSWORD [OPTIONS]
+
+Logs into an IMAP account and retrieves the headers of all messages.
+The you can specify patterns to search in the subjects of the
+messages for.
+
+Options:
+
+ -h, --help Output this help and exit
+ -H, --host Hostname or IP-Address of IMAP server
+ -s, --ssl Use SSL for the connection
+ -u, --user USER Name of IMAP user
+ -p, --password PASSWORD Password of this user
+ -f, --folder FOLDER Name of the folder (default is INBOX)
+ -a, --all scan all mails, not only the unread ones
+ -i, --nocase ignore case when applying patterns
+ -w, --warning RE regular expression, warning if found in subject
+ -c, --critical RE regular expression, critical if found in subject
+
+""")
+ sys.exit(3)
+
+server = None
+user = None
+password = None
+folder = "INBOX"
+use_ssl = False
+ignore_seen = True
+ignore_case = False
+critical_patterns = [ ]
+warning_patterns = [ ]
+
+short_options = "H:su:p:f:aiw:c:h"
+long_options = [ "host=", "ssl", "user=", "password=", "folder=",
+ "all", "nocase", "warning=", "critical=", "help" ]
+
+try:
+ opts, args = getopt.getopt(sys.argv[1:], short_options, long_options)
+ for o, a in opts:
+ if o in [ '-h', '--help' ]:
+ usage()
+ elif o in [ '-H', '--host' ]:
+ server = a
+ elif o in [ '-s', '--ssl' ]:
+ use_ssl = True
+ elif o in [ '-u', '--user' ]:
+ user = a
+ elif o in [ '-p', '--password' ]:
+ password = a
+ elif o in [ '-f', '--folder' ]:
+ folder = a
+ elif o in [ '-a', '--all' ]:
+ ignore_seen = False
+ elif o in [ '-i', '--nocase' ]:
+ ignore_case = True
+ elif o in [ '-w', '--warning' ]:
+ warning_patterns.append(a)
+ elif o in [ '-c', '--critical' ]:
+ critical_patterns.append(a)
+
+except Exception, e:
+ bail_out(str(e))
+
+if server == None:
+ bail_out("Please specify a host with -H.")
+if user == None:
+ bail_out("Please specify a user name with -u.")
+if password == None:
+ bail_out("Please specify a password with -p.")
+
+
+compile_patterns(warning_patterns)
+compile_patterns(critical_patterns)
+
+imap = imap_login()
+status, message = imap.select(folder, readonly=True)
+if status != "OK":
+ result(3, "Cannot select IMAP folder " + folder)
+
+# status, message = imap.response('FLAGS')
+# print status, message
+
+
+status, message = imap.search(None, 'ALL')
+if status != "OK":
+ result(3, "Cannot get list of mails in folder")
+
+mail_ids = message[0].split()
+num_total = 0
+num_critical = 0
+num_warning = 0
+for mail_id in mail_ids:
+ status, fields = imap.fetch(mail_id, "(BODY[HEADER] FLAGS)")
+ header = fields[0][1]
+ flags = parse_flags(fields[1])
+ if "Seen" in flags and ignore_seen:
+ continue
+ message = email.message_from_string(header)
+ mail = dict([
+ (key, decode_header_to_unicode(val)) for (key, val) in message.items()])
+ subject = mail["Subject"].replace("\r\n", "")
+
+ num_total += 1
+ if find_in_patterns(subject, critical_patterns):
+ num_critical += 1
+ elif find_in_patterns(subject, warning_patterns):
+ num_warning += 1
+
+infotext = "%d%s messages" % (num_total, ignore_seen and " unread" or "")
+status = 0
+if num_warning:
+ status = 1
+ infotext += ", %d warning(!)" % num_critical
+if num_critical:
+ status = 2
+ infotext += ", %d critical(!!)" % num_critical
+
+result(status, infotext)
Module: check_mk
Branch: master
Commit: 32a01c76766552473f66039bd8f45f19d8b01a4e
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=32a01c76766552…
Author: Florian Heigl <fh(a)mathias-kettner.de>
Date: Tue Sep 18 12:17:34 2012 +0200
checks/cisco_hsrp: Do not inventorize HSRP groups that aren't working at time of inventory
---
checkman/cisco_hsrp | 10 +++++-----
checks/cisco_hsrp | 5 ++++-
2 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/checkman/cisco_hsrp b/checkman/cisco_hsrp
index f9c70ef..c125f83 100644
--- a/checkman/cisco_hsrp
+++ b/checkman/cisco_hsrp
@@ -30,8 +30,8 @@ item:
The Virtual IP of the failover group.
inventory:
- The check reads the HSRP MIB and creates one service per virtual IP. It also
- stores the HSRP state of
- the IP as seen by the monitored device, normally either standby or active.
- It also stores the ID of
- the failover group. (For future use)
+ The check reads the HSRP MIB and creates one service per virtual IP.
+ If the HSRP state of the group is either active or standby, a service
+ will be created. It also stores this HSRP state of
+ the IP as seen by the monitored device.
+ It also stores the ID of the failover group. (For future use)
diff --git a/checks/cisco_hsrp b/checks/cisco_hsrp
index 06181ad..0d38a19 100644
--- a/checks/cisco_hsrp
+++ b/checks/cisco_hsrp
@@ -57,8 +57,11 @@ def inventory_cisco_hsrp(info):
for line in info:
hsrp_grp_entry, vip, actrouter, sbrouter, hsrp_state, vmac = line
interface_index, hsrp_grp = hsrp_grp_entry.split(".")
+ hsrp_state = int(hsrp_state)
+ # if the group is in a working state (both routers see and talk to each other),
# inventorize HSRP group name+IP and the standby state as seen from "this" box.
- inventory.append( (vip, (hsrp_grp, int(hsrp_state))) )
+ if hsrp_state in [ 5, 6 ]:
+ inventory.append( (vip, (hsrp_grp, hsrp_state)) )
return inventory
Module: check_mk
Branch: master
Commit: 5b8b4afb1e2d087e1d6b6e33e399d15978e114c3
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=5b8b4afb1e2d08…
Author: Florian Heigl <fh(a)mathias-kettner.de>
Date: Mon Sep 17 17:56:46 2012 +0200
Switch to using bash internal type for all agent work. Mind that if porting for other shells.
---
agents/check_mk_agent.linux | 34 +++++++++++++++++-----------------
1 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/agents/check_mk_agent.linux b/agents/check_mk_agent.linux
index 4cd9957..069680a 100755
--- a/agents/check_mk_agent.linux
+++ b/agents/check_mk_agent.linux
@@ -81,7 +81,7 @@ df -PTlk $excludefs | sed 1d
# VMWare shows its own filesystems with 'vdf'. Just one
# problem: it outputs not 7 but only 6 columns
-if which vdf > /dev/null
+if type vdf > /dev/null
then
vdf -P | grep ^/vmfs/volumes | sed 's/ / vmfs /'
fi
@@ -132,7 +132,7 @@ cat /proc/uptime
# Network interfaces (Link, Autoneg, Speed)
# This requires ethtool
-if which ethtool > /dev/null
+if type ethtool > /dev/null
then
echo '<<<netif>>>'
for eth in $(cat /proc/net/dev | sed -rn -e 's/[[:space:]]*//g' -e '/ *([^:]):.*/s//\1/p' | egrep -vx '(lo|sit.*)')
@@ -144,7 +144,7 @@ fi
# New variant: Information about speed and state in one section
echo '<<<lnx_if:sep(58)>>>'
sed 1,2d /proc/net/dev
-if which ethtool > /dev/null
+if type ethtool > /dev/null
then
for eth in $(sed -e 1,2d < /proc/net/dev | cut -d':' -f1)
do
@@ -158,13 +158,13 @@ echo '<<<tcp_conn_stats>>>'
netstat -nt | awk ' /^tcp/ { c[$6]++; } END { for (x in c) { print x, c[x]; } }'
# Platten- und RAID-Status von LSI-Controlleren, falls vorhanden
-if which cfggen > /dev/null ; then
+if type cfggen > /dev/null ; then
echo '<<<lsi>>>'
cfggen 0 DISPLAY | egrep '(Target ID|State|Volume ID|Status of volume)[[:space:]]*:' | sed -e 's/ *//g' -e 's/:/ /'
fi
# Multipathgeraete
-if which multipath >/dev/null ; then
+if type multipath >/dev/null ; then
echo '<<<multipath>>>'
multipath -l
fi
@@ -177,7 +177,7 @@ cat /proc/mdstat
echo '<<<diskstat>>>'
date +%s
egrep ' (x?[shv]d[a-z]*|cciss/c[0-9]+d[0-9]+|dm-[0-9]+|VxVM.*) ' < /proc/diskstats
-if which dmsetup >/dev/null ; then
+if type dmsetup >/dev/null ; then
echo '[dmsetup_info]'
dmsetup info -c --noheadings --separator ' ' -o name,devno,vg_name,lv_name
fi
@@ -199,7 +199,7 @@ date +%s
sed -e 1,2d -e 's/:/ /g' < /proc/net/dev
-if which ipmitool >/dev/null
+if type ipmitool >/dev/null
then
echo '<<<ipmi>>>'
IPMI_FILE=$MK_CONFDIR/ipmitool_sensors.cache
@@ -242,7 +242,7 @@ fi
# that timeout, it leaves and empty cache file. We skip this check forever
# if we find that empty cache file.
sdrcache=/var/cache/.freeipmi/sdr-cache/sdr-cache-$(hostname).127.0.0.1
-if which ipmi-sensors >/dev/null && [ ! -e "$sdrcache" -o -s "$sdrcache" ]
+if type ipmi-sensors >/dev/null && [ ! -e "$sdrcache" -o -s "$sdrcache" ]
then
echo '<<<ipmi_sensors>>>'
# No cache file existing? => Impose a high time limit. We do not suffice
@@ -283,7 +283,7 @@ fi
# State of LSI MegaRAID controller via MegaCli. You can download that tool from:
# http://www.lsi.com/downloads/Public/MegaRAID%20Common%20Files/8.02.16_MegaC…
-if which MegaCli >/dev/null ; then
+if type MegaCli >/dev/null ; then
echo '<<<megaraid_pdisks>>>'
for part in $(MegaCli -EncInfo -aALL -NoLog < /dev/null \
| sed -rn 's/:/ /g; s/[[:space:]]+/ /g; s/^ //; s/ $//; s/Number of enclosures on adapter ([0-9]+).*/adapter \1/g; /^(Enclosure|Device ID|adapter) [0-9]+$/ p'); do
@@ -300,7 +300,7 @@ if which MegaCli >/dev/null ; then
fi
# 3WARE disk controller (by Radoslaw Bak)
-if which tw_cli > /dev/null ; then
+if type tw_cli > /dev/null ; then
for C in $(tw_cli show | awk 'NR < 4 { next } { print $1 }'); do
echo '<<<3ware_info>>>'
tw_cli /$C show all | egrep 'Model =|Firmware|Serial'
@@ -311,7 +311,7 @@ if which tw_cli > /dev/null ; then
done
fi
-if which vcbVmName > /dev/null 2>&1 ; then
+if type vcbVmName > /dev/null 2>&1 ; then
echo '<<<vmware_state>>>'
vcbVmName -s any
fi
@@ -320,19 +320,19 @@ fi
# check would not be executed in case no guest additions are installed.
# And that is something the check wants to detect
echo '<<<vbox_guest>>>'
-if which VBoxControl > /dev/null 2>&1 ; then
+if type VBoxControl > /dev/null 2>&1 ; then
VBoxControl -nologo guestproperty enumerate | cut -d, -f1,2
[ ${PIPESTATUS[0]} = 0 ] || echo "ERROR"
fi
-if which ntpq > /dev/null 2>&1 ; then
+if type ntpq > /dev/null 2>&1 ; then
echo '<<<ntp>>>'
# remote heading, make first column space separated
waitmax 2 ntpq -p | sed -e 1,2d -e 's/^\(.\)/\1 /' -e 's/^ /%/'
fi
-if which nvidia-settings >/dev/null && [ -S /tmp/.X11-unix/X0 ]
+if type nvidia-settings >/dev/null && [ -S /tmp/.X11-unix/X0 ]
then
echo '<<<nvidia>>>'
for var in GPUErrors GPUCoreTemp
@@ -347,7 +347,7 @@ if [ -e /proc/drbd ]; then
fi
# Status of CUPS printer queues
-if which lpstat > /dev/null 2>&1; then
+if type lpstat > /dev/null 2>&1; then
if pgrep cups > /dev/null 2>&1; then
echo '<<<cups_queues>>>'
waitmax 3 lpstat -p
@@ -363,7 +363,7 @@ if [ -S /var/run/heartbeat/crm/cib_ro -o -S /var/run/crm/cib_ro ]; then
echo '<<<heartbeat_crm>>>'
crm_mon -1 -r | grep -v ^$ | sed 's/^ //; /^\sResource Group:/,$ s/^\s//; s/^\s/_/g'
fi
-if which cl_status > /dev/null 2>&1; then
+if type cl_status > /dev/null 2>&1; then
echo '<<<heartbeat_rscstatus>>>'
cl_status rscstatus
@@ -392,7 +392,7 @@ fi
# Only handle the last 6 lines (includes the summary line at the bottom and
# the last message in the queue. The last message is not used at the moment
# but it could be used to get the timestamp of the last message.
-if which mailq >/dev/null 2>&1 && getent passwd postfix >/dev/null 2>&1; then
+if type mailq >/dev/null 2>&1 && getent passwd postfix >/dev/null 2>&1; then
echo '<<<postfix_mailq>>>'
mailq | tail -n 6
fi
Module: check_mk
Branch: master
Commit: 1ff8f6944844e19b028b10e37aad6f6f8c8ad518
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=1ff8f6944844e1…
Author: Florian Heigl <fh(a)mathias-kettner.de>
Date: Mon Sep 17 17:52:14 2012 +0200
Dont use hardcoded zpool path on linux
---
agents/check_mk_agent.linux | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/agents/check_mk_agent.linux b/agents/check_mk_agent.linux
index 26a57c2..4cd9957 100755
--- a/agents/check_mk_agent.linux
+++ b/agents/check_mk_agent.linux
@@ -408,9 +408,9 @@ fi
# Welcome the ZFS check on Linux
# We do not endorse running ZFS on linux if your vendor doesnt support it ;)
# check zpool status
-if [ -x /usr/sbin/zpool ]; then
+if type zpool; then
echo "<<<zpool_status>>>"
- /usr/sbin/zpool status -x
+ zpool status -x
fi