Module: check_mk
Branch: master
Commit: f0e5f94ac41b00b84a5a0ddab0a00c7ffdbb133d
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=f0e5f94ac41b00…
Author: Moritz Kiemer <mo(a)mathias-kettner.de>
Date: Thu Feb 14 15:24:55 2019 +0100
mk_docker.py: handle docker-py version below 3.0.0
Also: be nice and allow empty config file
CMK-1662
Change-Id: Ibdbecf0ce0fee616de896cbd608669b520cbb958
---
agents/plugins/mk_docker.py | 42 +++++++++++++++++++++++++-----------
tests/unit/plugins/test_mk_docker.py | 2 +-
2 files changed, 31 insertions(+), 13 deletions(-)
diff --git a/agents/plugins/mk_docker.py b/agents/plugins/mk_docker.py
index a9b6fa1..c8ccdc3 100755
--- a/agents/plugins/mk_docker.py
+++ b/agents/plugins/mk_docker.py
@@ -119,7 +119,8 @@ def get_config(cfg_file):
LOGGER.debug("trying to read %r", cfg_file)
files_read = config.read(cfg_file)
LOGGER.info("read configration file(s): %r", files_read)
- return dict(config.items("DOCKER"))
+ section_name = "DOCKER" if config.sections() else "DEFAULT"
+ return dict(config.items(section_name))
class Section(list):
@@ -176,17 +177,29 @@ class AgentDispatcher(object):
'''
@staticmethod
- def iter_socket(sock):
+ def iter_socket(sock, descriptor):
header = sock.recv(8)
while header:
- _descriptor, length = struct.unpack('>BxxxL', header)
+ actual_descriptor, length = struct.unpack('>BxxxL', header)
while length:
data = sock.recv(length)
length -= len(data)
LOGGER.debug("Received data: %r", data)
- yield data
+ if actual_descriptor == descriptor:
+ yield data
header = sock.recv(8)
+ def get_stdout(self, exec_return_val):
+ if isinstance(exec_return_val, tuple):
+ # it's a tuple since version 3.0.0
+ exit_code, sock = exec_return_val
+ if exit_code not in (0, None):
+ return ''
+ else:
+ sock = exec_return_val
+
+ return ''.join(self.iter_socket(sock, 1))
+
def __init__(self):
remote = os.getenv("REMOTE", "")
self.env = {"REMOTE": remote}
@@ -214,26 +227,31 @@ class AgentDispatcher(object):
'''run check_mk agent in container or container
context'''
LOGGER.debug("trying to run containers check_mk_agent")
- result = container.exec_run('check_mk_agent', environment=self.env,
demux=True)
- if result.exit_code == 0:
+ result = container.exec_run('check_mk_agent', environment=self.env,
socket=True)
+ output = self.get_stdout(result)
+ if output:
LOGGER.info("successfully ran containers check_mk_agent")
- return result.output[0]
+ return output
LOGGER.info("container has no agent or executing agent failed")
# check for agent code and bash:
if not self.agent_code:
LOGGER.info("failed to load agent code: %s", self.agent_code_exc)
return None
- result = container.exec_run('bash')
- if result.exit_code != 0:
+ result = container.exec_run('bash', socket=True)
+ if not self.get_stdout(result):
LOGGER.info("failed to run bash in container: %s",
container.short_id)
return None
- _exit_code, dock_sock = container.exec_run(
+ result = container.exec_run(
'bash', environment=self.env_from_node, socket=True, stdin=True,
stderr=False)
- nbytes = dock_sock.sendall(self.agent_code)
+ try:
+ nbytes = result.sendall(self.agent_code)
+ except AttributeError:
+ # it's a tuple since version 3.0.0
+ nbytes = result[1].sendall(self.agent_code)
LOGGER.debug("sent agent to container (%d bytes)", nbytes)
- agent_ouput = ''.join(self.iter_socket(dock_sock))
+ agent_ouput = self.get_stdout(result)
LOGGER.info("successfully ran check_mk_agent that was sent to
container")
return agent_ouput
diff --git a/tests/unit/plugins/test_mk_docker.py b/tests/unit/plugins/test_mk_docker.py
index 63c3497..b62d429 100644
--- a/tests/unit/plugins/test_mk_docker.py
+++ b/tests/unit/plugins/test_mk_docker.py
@@ -11,7 +11,7 @@ sys.path.insert(0, os.path.join(cmk_path(), 'agents',
'plugins'))
import mk_docker # pylint: disable=import-error,wrong-import-position
PLUGIN_CHECKSUMS = {
- '0.1': '2296ae916366d26d54ea449b2c2552bb',
+ '0.1': '2e03d077fbefb3b10a51600aa23d2154',
}