Module: check_mk
Branch: master
Commit: 2d43d696de115e458d82a39d20403d884cef8f47
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=2d43d696de115e…
Author: Moritz Kiemer <mo(a)mathias-kettner.de>
Date: Fri Feb 8 13:29:03 2019 +0100
7143 mk_docker.py: A new docker monitoring plugin
We introduce a new plugin for docker monitoring, 'mk_docker.py'.
It combines the functionality of the two deprecated plugins
'mk_docker_node' and 'mk_docker_container_piggybacked', while
adding more configuration options.
If you where using both plugins, you can use the new plugin in its
default configuration to replace them. If you have been using only
one of them, you can disable the opposite parts of the new plugin,
either by using the bakery rule "Docker node and containers" or via
the configuration file (please refer to the example files in
agents/cfg_examples fo rmore details).
The previous rule "Piggybacked docker containers" is deprecated -
please set up a corresponding new one.
To deploy this plugin you must at least have the 'docker-py' python
library version 3.0.0 installed on the monitored system.
You can install it using the python package manager pip
(using the shell command "pip install docker-py").
CMK-1564
Change-Id: Ic8a619f7cf784ee3ebf9cde52c5d6ff865ad3e0e
---
.werks/7143 | 29 ++++++++++++++
agents/plugins/mk_docker_container_piggybacked | 55 --------------------------
agents/plugins/mk_docker_node | 49 -----------------------
checks/docker_container_status | 1 +
checks/docker_node_disk_usage | 1 +
checks/docker_node_info | 2 +
6 files changed, 33 insertions(+), 104 deletions(-)
diff --git a/.werks/7143 b/.werks/7143
new file mode 100644
index 0000000..91b885f
--- /dev/null
+++ b/.werks/7143
@@ -0,0 +1,29 @@
+Title: mk_docker.py: A new docker monitoring plugin
+Level: 1
+Component: checks
+Compatible: incomp
+Edition: cre
+Version: 1.6.0i1
+Date: 1550048642
+Class: feature
+
+We introduce a new plugin for docker monitoring, 'mk_docker.py'.
+It combines the functionality of the two deprecated plugins
+'mk_docker_node' and 'mk_docker_container_piggybacked', while
+adding more configuration options.
+
+If you where using both plugins, you can use the new plugin in its
+default configuration to replace them. If you have been using only
+one of them, you can disable the opposite parts of the new plugin,
+either by using the bakery rule "Docker node and containers" or via
+the configuration file (please refer to the example files in
+agents/cfg_examples fo rmore details).
+
+The previous rule "Piggybacked docker containers" is deprecated -
+please set up a corresponding new one.
+
+To deploy this plugin you must have the 'docker-py' python library
+installed on the monitored system. You can install it using the
+python package manager pip (using the shell command
+"pip install docker-py").
+
diff --git a/agents/plugins/mk_docker_container_piggybacked b/agents/plugins/mk_docker_container_piggybacked
deleted file mode 100755
index 36cf98c..0000000
--- a/agents/plugins/mk_docker_container_piggybacked
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/bin/bash
-# +------------------------------------------------------------------+
-# | ____ _ _ __ __ _ __ |
-# | / ___| |__ ___ ___| | __ | \/ | |/ / |
-# | | | | '_ \ / _ \/ __| |/ / | |\/| | ' / |
-# | | |___| | | | __/ (__| < | | | | . \ |
-# | \____|_| |_|\___|\___|_|\_\___|_| |_|_|\_\ |
-# | |
-# | Copyright Mathias Kettner 2018 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.
-
-# $REMOTE is exported from check_mk_agent.linux
-
-if type docker > /dev/null 2>&1; then
- NODE_NAME=$(docker info --format "{{json .Name}}")
-
- # For the container status, we want information about *all* containers
- for CONTAINER_ID in $(docker container ls -q --all); do
- echo "<<<<${CONTAINER_ID}>>>>"
- docker inspect "$CONTAINER_ID" \
- --format='{{println "<<<docker_container_status>>>"}}{{json .State}}{{println}}{{println "<<<docker_container_node_name>>>"}}{{println '"$NODE_NAME"'}}{{println "<<<docker_container_labels>>>"}}{{json .Config.Labels}}{{println}}{{println "<<<docker_container_network>>>"}}{{json .NetworkSettings}}{{println}}'
-
- if [ "$(docker inspect -f '{{.State.Running}}' "$CONTAINER_ID")" = "true" ]; then
- # Is there a regular agent available in the container? Use it!
- #
- # Otherwise execute the agent of the node in the context of the container.
- # Using this approach we should always get at least basic information from
- # the container.
- # Once it comes to plugins and custom configuration the user needs to use
- # a little more complex setup. Have a look at the documentation.
- AGENT_PATH=$(docker container exec "$CONTAINER_ID" bash -c "type check_mk_agent" 2>/dev/null) || AGENT_PATH=
- if [ -n "$AGENT_PATH" ]; then
- docker container exec --env "REMOTE=$REMOTE" "$CONTAINER_ID" check_mk_agent
- elif docker container exec "$CONTAINER_ID" which bash >/dev/null 2>&1; then
- docker container exec --env MK_FROM_NODE=1 --env "REMOTE=$REMOTE" -i "$CONTAINER_ID" bash < "$0"
- fi
- fi
-
- echo "<<<<>>>>"
- done
-fi
diff --git a/agents/plugins/mk_docker_node b/agents/plugins/mk_docker_node
deleted file mode 100755
index 7bc1080..0000000
--- a/agents/plugins/mk_docker_node
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/bin/bash
-# +------------------------------------------------------------------+
-# | ____ _ _ __ __ _ __ |
-# | / ___| |__ ___ ___| | __ | \/ | |/ / |
-# | | | | '_ \ / _ \/ __| |/ / | |\/| | ' / |
-# | | |___| | | | __/ (__| < | | | | . \ |
-# | \____|_| |_|\___|\___|_|\_\___|_| |_|_|\_\ |
-# | |
-# | Copyright Mathias Kettner 2016 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.
-
-if type docker > /dev/null 2>&1; then
- echo "<<<docker_node_info:sep(58)>>>"
- # sed: protect leading whitespace
- docker info | sed 's/^/|/'
-
- echo "<<<docker_node_disk_usage:sep(0)>>>"
- docker system df
-
- echo "<<<docker_node_images>>>"
- echo "[[[images]]]"
- docker images --format "{{json .}}"
-
- echo "[[[image_inspect]]]"
- IMAGE_IDS=$(docker images | awk 'NR>1 {print $3}')
- docker image inspect $IMAGE_IDS
-
- echo "[[[containers]]]"
- # equivalent of 'docker ps' for newer docker versions: 'docker container ls'
- docker ps --all --format "{{json .}}"
-
- echo "<<<docker_node_network:sep(0)>>>"
- NETWORK_IDS=$(docker network ls -f 'driver=bridge' | awk 'NR>1 {print $1}')
- docker network inspect $NETWORK_IDS
-fi
diff --git a/checks/docker_container_status b/checks/docker_container_status
index 9920e05..69649fa 100644
--- a/checks/docker_container_status
+++ b/checks/docker_container_status
@@ -95,6 +95,7 @@ check_info["docker_container_status.health"] = {
# '----------------------------------------------------------------------'
+@append_deprecation_warning # pylint: disable=undefined-variable
def check_docker_container_status(_no_item, _no_params, parsed):
status = parsed.get("Status", "unknown")
state = {"running": 0, "unknown": 3}.get(status, 2)
diff --git a/checks/docker_node_disk_usage b/checks/docker_node_disk_usage
index 21e770b..d5355e2 100644
--- a/checks/docker_node_disk_usage
+++ b/checks/docker_node_disk_usage
@@ -35,6 +35,7 @@ def parse_docker_node_disk_usage(info):
return {r.get('type'): r for r in table_rows if r is not None}
+@append_deprecation_warning # pylint: disable=undefined-variable
@get_parsed_item_data
def check_docker_node_disk_usage(_no_item, params, data):
diff --git a/checks/docker_node_info b/checks/docker_node_info
index ce80041..3d193d1 100644
--- a/checks/docker_node_info
+++ b/checks/docker_node_info
@@ -38,6 +38,7 @@ def parse_docker_node_info(info):
return loaded or {}
+@append_deprecation_warning # pylint: disable=undefined-variable
def check_docker_node_info(_no_item, _no_params, parsed):
if "Name" in parsed:
yield 0, 'Daemon running on host %s' % parsed["Name"]
@@ -56,6 +57,7 @@ check_info['docker_node_info'] = {
}
+@append_deprecation_warning # pylint: disable=undefined-variable
def check_docker_node_containers(_no_item, params, parsed):
def check_node_levels(count, levels, levels_lower):
warn, crit = levels
Module: check_mk
Branch: master
Commit: c7ed23bc334509fa82e3e5e04a6a1d9f9fe33e93
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=c7ed23bc334509…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Wed Feb 13 10:44:12 2019 +0100
7085 FIX Fixed parsing of special syslog messages which don't contain a host name
The Event Console is now able to process syslog messages that don't contain the
host name field. An example for such a message is this one:
C+:
Feb 13 08:41:07 pfsp: The configuration was changed on leader blatldc1-xxx to version 1.1366 by blatldc1-xxx/admin at 2019-02-13 09:41:02 CET</tt>
C-:
In previous versions messages like this resulted in log messages like this in
the event console log (var/log/mkeventd.log):
C+:
2019-02-13 09:41:07,338 [40] [cmk.mkeventd.EventServer] Got non-syslog message "Feb 13 08:41:07 pfsp: The configuration was changed on leader blatldc1-xxx to version 1.1366 by blatldc1-xxx/admin at 2019-02-13 09:41:02 CET" (need more than 1 value to unpack)
Traceback (most recent call last):
File "/omd/sites/ggmcmpp1/lib/python/cmk/ec/main.py", line 2916, in create_event_from_line
event.update(self.parse_syslog_info(rest))
File "/omd/sites/ggmcmpp1/lib/python/cmk/ec/main.py", line 2667, in parse_syslog_info
tag, message = line.split(": ", 1)
ValueError: need more than 1 value to unpack
2019-02-13 09:41:07,338 [20] [cmk.mkeventd.EventServer] Parsed message:
application:
core_host:
facility: 1
host:
host_in_downtime: False
ipaddress: 1.23.45.67
pid: 0
priority: 0
text: Feb 13 08:41:07 pfsp: The configuration was changed on leader blatldc1-xxx to version 1.1366 by blatldc1-xxx/admin at 2019-02-13 09:41
:02 CET
time: 1550047267.34
C-:
A fallback event was created that had no syslog fields set and contained the whole syslog message in the text field.
If you have EC rules matching on this fallback event, you will have to change these rules to match the parsed event
fields.
CMK-1213
Change-Id: I76fee896bbba5d6ee3f9246d5b930c762325b234
---
.werks/7085 | 64 +++++++++++++++++++++++++++++++++
cmk/ec/main.py | 20 +++++++++--
tests/unit/cmk/ec/test_event_creator.py | 15 ++++++++
3 files changed, 96 insertions(+), 3 deletions(-)
diff --git a/.werks/7085 b/.werks/7085
new file mode 100644
index 0000000..097d811
--- /dev/null
+++ b/.werks/7085
@@ -0,0 +1,64 @@
+Title: Fixed parsing of special syslog messages which don't contain a host name
+Level: 1
+Component: ec
+Compatible: incomp
+Edition: cre
+Version: 1.6.0i1
+Date: 1550050614
+Class: fix
+
+The Event Console is now able to process syslog messages that don't contain the
+host name field. An example for such a message is this one:
+
+C+:
+Feb 13 08:41:07 pfsp: The configuration was changed on leader blatldc1-xxx to version 1.1366 by blatldc1-xxx/admin at 2019-02-13 09:41:02 CET</tt>
+C-:
+
+In previous versions messages like this resulted in log messages like this in
+the event console log (var/log/mkeventd.log):
+
+C+:
+2019-02-13 09:41:07,338 [40] [cmk.mkeventd.EventServer] Got non-syslog message "Feb 13 08:41:07 pfsp: The configuration was changed on leader blatldc1-xxx to version 1.1366 by blatldc1-xxx/admin at 2019-02-13 09:41:02 CET" (need more than 1 value to unpack)
+Traceback (most recent call last):
+ File "/omd/sites/ggmcmpp1/lib/python/cmk/ec/main.py", line 2916, in create_event_from_line
+ event.update(self.parse_syslog_info(rest))
+ File "/omd/sites/ggmcmpp1/lib/python/cmk/ec/main.py", line 2667, in parse_syslog_info
+ tag, message = line.split(": ", 1)
+ValueError: need more than 1 value to unpack
+2019-02-13 09:41:07,338 [20] [cmk.mkeventd.EventServer] Parsed message:
+ application:
+ core_host:
+ facility: 1
+ host:
+ host_in_downtime: False
+ ipaddress: 1.23.45.67
+ pid: 0
+ priority: 0
+ text: Feb 13 08:41:07 pfsp: The configuration was changed on leader blatldc1-xxx to version 1.1366 by blatldc1-xxx/admin at 2019-02-13 09:41
+:02 CET
+ time: 1550047267.34
+C-:
+
+A fallback event was created that had no syslog fields set and contained the
+whole unparsed syslog message in the text field. If you have EC rules matching
+on this fallback event, you will have to change these rules to match the parsed
+event fields.
+
+Now that the parsing has been added, events created by such a syslog message now
+have the fields set as follows for our example:
+
+C+:
+application: pfsp
+core_host:
+facility: 1
+host: 127.0.0.1
+host_in_downtime: False
+ipaddress: 127.0.0.1'
+pid: 0
+priority: 5
+text: The configuration was changed on leader blatldc1-xxx to version 1.1366 by blatldc1-xxx/admin at 2019-02-13 09:41:02 CET
+time: 1550043667.0
+C-:
+
+Please note that the EC uses the sender IP addresse of the syslog message to populate the host field.
+
diff --git a/cmk/ec/main.py b/cmk/ec/main.py
index 8056204..d5d2560 100644
--- a/cmk/ec/main.py
+++ b/cmk/ec/main.py
@@ -1987,6 +1987,9 @@ class EventCreator(object):
# Variant 1: plain syslog message without priority/facility:
# May 26 13:45:01 Klapprechner CRON[8046]: message....
+ # Variant 1a: plain syslog message without priority/facility/host:
+ # May 26 13:45:01 Klapprechner CRON[8046]: message....
+
# Variant 2: syslog message including facility (RFC 3164)
# <78>May 26 13:45:01 Klapprechner CRON[8046]: message....
@@ -2035,7 +2038,7 @@ class EventCreator(object):
event["facility"] = prio >> 3
event["priority"] = prio & 7
- # Variant 1
+ # Variant 1,1a
else:
event["facility"] = 1 # user
event["priority"] = 5 # notice
@@ -2091,9 +2094,20 @@ class EventCreator(object):
event["text"] = line
event['time'] = time.mktime(time.strptime(time_part, '%Y %b %d %H:%M:%S'))
- # Variant 1,2,4
+ # Variant 1,1a,2,4
else:
- month_name, day, timeofday, host, rest = line.split(None, 4)
+ month_name, day, timeofday, rest = line.split(None, 3)
+
+ # Special handling for variant 1a. Detect whether or not host
+ # is a hostname or syslog tag
+ host, tmp_rest = rest.split(None, 1)
+ if host.endswith(":"):
+ # There is no host information sent, use the source address as "host"
+ host = address[0]
+ else:
+ # Use the extracted host and continue with the remaining message text
+ rest = tmp_rest
+
event["host"] = host
# Variant 4
diff --git a/tests/unit/cmk/ec/test_event_creator.py b/tests/unit/cmk/ec/test_event_creator.py
index a895cce..16b82e2 100644
--- a/tests/unit/cmk/ec/test_event_creator.py
+++ b/tests/unit/cmk/ec/test_event_creator.py
@@ -35,6 +35,21 @@ def event_creator():
},
),
(
+ "Feb 13 08:41:07 pfsp: The configuration was changed on leader blatldc1-xxx to version 1.1366 by blatldc1-xxx/admin at 2019-02-13 09:41:02 CET",
+ {
+ 'application': 'pfsp',
+ 'core_host': '',
+ 'facility': 1,
+ 'host': '127.0.0.1',
+ 'host_in_downtime': False,
+ 'ipaddress': '127.0.0.1',
+ 'pid': 0,
+ 'priority': 5,
+ 'text': 'The configuration was changed on leader blatldc1-xxx to version 1.1366 by blatldc1-xxx/admin at 2019-02-13 09:41:02 CET',
+ 'time': 1550043667.0
+ },
+ ),
+ (
# Variant 2: syslog message including facility (RFC 3164)
"<78>May 26 13:45:01 Klapprechner CRON[8046]: message",
{
Module: check_mk
Branch: master
Commit: 55c784573959fb5060423d3601b1fb7f90af1547
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=55c784573959fb…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Thu Feb 14 07:42:03 2019 +0100
Cleanup WATO group loading functions
The loading of groups has been splitted into group type specific
functions.
The fact that all types of groups are currently being loaded from a
single file should be only locally known in the cmk.gui.watolib.groups
module before we can clean this up more.
Change-Id: Ie4b36a27bb7ab8383e9c980b021d370668b10b71
---
cmk/gui/plugins/userdb/hook_auth.py | 4 +-
cmk/gui/plugins/userdb/ldap_connector.py | 4 +-
cmk/gui/plugins/wato/__init__.py | 4 +-
cmk/gui/plugins/wato/bi.py | 8 +--
cmk/gui/plugins/wato/check_mk_configuration.py | 26 +++------
cmk/gui/plugins/wato/utils/__init__.py | 77 +++++++++++++++++---------
cmk/gui/plugins/webapi/webapi.py | 22 ++++++--
cmk/gui/wato/__init__.py | 1 -
cmk/gui/wato/mkeventd.py | 7 +--
cmk/gui/wato/pages/folders.py | 6 +-
cmk/gui/wato/pages/groups.py | 50 ++++++++++++-----
cmk/gui/wato/pages/notifications.py | 4 +-
cmk/gui/wato/pages/password_store.py | 6 +-
cmk/gui/wato/pages/users.py | 8 +--
cmk/gui/watolib/groups.py | 24 ++++++--
tests/unit/cmk/gui/watolib/test_groups.py | 27 ++++++++-
tests/unit/cmk/gui/watolib/test_rulespecs.py | 8 +--
17 files changed, 186 insertions(+), 100 deletions(-)
Diff: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commitdiff;h=55c7845739…