Mailcow-CheckMK/local/lib/python3/cmk/base/plugins/agent_based/mailcow_info.py

157 lines
6.2 KiB
Python
Raw Normal View History

2023-08-20 18:15:21 +02:00
#!/usr/bin/env python3
from pprint import pprint
from .agent_based_api.v1 import register, render, Service, Result, State, Metric
def getStateUpper(levels, value):
warn, crit = levels
if value >= crit:
return State.CRIT
if value >= warn:
return State.WARN
return State.OK
def getStateLower(levels, value):
warn, crit = levels
if value < crit:
return State.CRIT
if value < warn:
return State.WARN
return State.OK
def discover_mailcow_info(section):
yield(Service())
def check_mailcow_info(params, section):
for key in section:
if key == "mailcow":
2023-09-10 15:53:13 +02:00
# get thresholds
2023-08-20 18:15:21 +02:00
levels_num_domains = params["levels_num_domains"]
levels_num_mailboxes = params["levels_num_mailboxes"]
levels_num_global_messages = params["levels_num_global_messages"]
2023-09-10 15:53:13 +02:00
levels_solr_size_kb = params["levels_solr_size"]
2023-09-10 16:49:05 +02:00
# Levels for Solr size are given in MBytes, so convert it to bytes
levels_solr_size_warn = levels_solr_size_kb[0] * 1024 * 1024
levels_solr_size_crit = levels_solr_size_kb[1] * 1024 * 1024
2023-09-10 15:53:13 +02:00
levels_solr_size = (levels_solr_size_warn, levels_solr_size_crit)
levels_solr_documents = params["levels_solr_documents"]
2023-08-20 18:15:21 +02:00
version = section[key]["version"]
num_domains = section[key]["num_domains"]
num_mailboxes = section[key]["num_mailboxes"]
num_global_messages = section[key]["num_global_messages"]
2023-09-10 15:53:13 +02:00
solr_enabled = section[key]["solr_enabled"]
solr_size = section[key]["solr_size"]
solr_documents = section[key]["solr_documents"]
2023-08-20 18:15:21 +02:00
# create graphs for number of domains, mailboxes and messages
2023-09-10 15:53:13 +02:00
yield(Metric("mc_num_domains", num_domains, levels=levels_num_domains))
yield(Metric("mc_num_mailboxes", num_mailboxes, levels=levels_num_mailboxes))
yield(Metric("mc_num_global_messages", num_global_messages, levels=levels_num_global_messages))
# create graphs for solr size and number of solr documents
if solr_enabled:
yield(Metric("mc_solr_size", solr_size, levels=levels_solr_size))
yield(Metric("mc_solr_documents", solr_documents, levels=levels_solr_documents))
2023-08-20 18:15:21 +02:00
# create overall result
summary = f"Version is {version}"
2023-09-10 15:53:13 +02:00
details = f"Mailcow version: {version}\nNumber of domains: {num_domains}\nNumber of mailboxes: {num_mailboxes}\nNumber of messages: {num_global_messages}\n\nSolr size: {render.bytes(solr_size)}\nNumber of Solr documents: {solr_documents}"
2023-08-20 18:15:21 +02:00
yield Result(state=State.OK, summary=summary, details=details)
# Create result for number of domains
warn, crit = levels_num_domains
state = getStateUpper((warn, crit), num_domains)
notice = f"Number of domains: {num_domains}"
if state != State.OK:
yield(Result(state=state, notice=notice))
# Create result for number of mailboxes
warn, crit = levels_num_mailboxes
state = getStateUpper((warn, crit), num_mailboxes)
notice = f"Number of mailboxes: {num_mailboxes}"
if state != State.OK:
yield(Result(state=state, notice=notice))
# Create result for number of global messages
warn, crit = levels_num_global_messages
state = getStateUpper((warn, crit), num_global_messages)
notice = f"Number of messages: {num_global_messages}"
if state != State.OK:
yield(Result(state=state, notice=notice))
2023-09-10 15:53:13 +02:00
# Create result for solr size and solr number of documents
if solr_enabled:
warn, crit = levels_solr_size
state = getStateUpper((warn, crit), solr_size)
notice = f"Solr size: {render.bytes(solr_size)}"
if state != State.OK:
yield(Result(state=state, notice=notice))
warn, crit = levels_solr_documents
state = getStateUpper((warn, crit), solr_documents)
notice = f"Number of Solr documents: {solr_documents}"
if state != State.OK:
yield(Result(state=state, notice=notice))
else:
state = State.WARN
notice = f"Solr is disabled"
yield(Result(state=state, notice=notice))
2023-08-20 18:15:21 +02:00
def parse_mailcow_info_section(string_table):
parsed_data = {
"mailcow" : {},
}
# we expect only one line
line = string_table[0]
version = line[0]
num_domains = int(line[1])
num_mailboxes = int(line[2])
num_global_messages = int(line[3])
2023-09-10 15:53:13 +02:00
solr_enabled = bool(line[4])
# solr size comes with value and unit, unfortunately
solr_size_str = line[5]
solr_size_list = solr_size_str.split()
solr_size_unit = solr_size_list[1]
solr_size = float(solr_size_list[0])
if solr_size_unit == "KB":
solr_size = solr_size * 1024.0
elif solr_size_unit == "MB":
solr_size = solr_size * 1024.0 * 1024.0
elif solr_size_unit == "GB":
solr_size = solr_size * 1024.0 * 1024.0 * 1024.0
solr_documents = int(line[6])
2023-08-20 18:15:21 +02:00
parsed_data["mailcow"]["version"] = version
parsed_data["mailcow"]["num_domains"] = num_domains
parsed_data["mailcow"]["num_mailboxes"] = num_mailboxes
parsed_data["mailcow"]["num_global_messages"] = num_global_messages
2023-09-10 15:53:13 +02:00
parsed_data["mailcow"]["solr_enabled"] = solr_enabled
parsed_data["mailcow"]["solr_size"] = solr_size
parsed_data["mailcow"]["solr_documents"] = solr_documents
2023-08-20 18:15:21 +02:00
return parsed_data
register.agent_section(
name="mailcow_info",
parse_function=parse_mailcow_info_section,
)
register.check_plugin(
name="mailcow_info",
service_name="Mailcow Info",
discovery_function=discover_mailcow_info,
check_function=check_mailcow_info,
check_default_parameters={
"levels_num_domains": (100, 200),
"levels_num_mailboxes": (500, 1000),
"levels_num_global_messages": (100000, 250000),
2023-09-10 15:53:13 +02:00
"levels_solr_size": (4096.0, 8192.0),
2023-09-10 16:49:05 +02:00
"levels_solr_documents": (20000, 40000)
2023-08-20 18:15:21 +02:00
},
check_ruleset_name="mailcow_info",
)