MKP 0.9.9, section mailcow_mailboxes completed
This commit is contained in:
parent
16956e8d05
commit
9ffe91c13c
@ -42,8 +42,8 @@ def check_mailcow_domains(item, params, section):
|
|||||||
# create graph for used quota
|
# create graph for used quota
|
||||||
yield Metric("mailcow_domains_used_quota", percent_storage_used_for_messages, levels=levels)
|
yield Metric("mailcow_domains_used_quota", percent_storage_used_for_messages, levels=levels)
|
||||||
|
|
||||||
summary_quota = f"Quota used is {render.percent(percent_storage_used_for_messages)}"
|
summary_quota = f"Storage quota used is {render.percent(percent_storage_used_for_messages)}"
|
||||||
details_quota = f"Quota: {render.bytes(total_number_of_bytes_used)} of {render.bytes(quota)} used"
|
details_quota = f"Storage quota: {render.bytes(total_number_of_bytes_used)} of {render.bytes(quota)} used"
|
||||||
|
|
||||||
# create service
|
# create service
|
||||||
yield(Result(state=state_quota, summary=summary_quota, details=details_quota))
|
yield(Result(state=state_quota, summary=summary_quota, details=details_quota))
|
||||||
@ -112,19 +112,11 @@ def parse_mailcow_domains_section(string_table):
|
|||||||
create_time_data = "Not available"
|
create_time_data = "Not available"
|
||||||
else:
|
else:
|
||||||
create_time_data = create_time_value
|
create_time_data = create_time_value
|
||||||
#create_time = int(create_time_value)
|
|
||||||
#curr_time = int(time.time())
|
|
||||||
#diff_time = curr_time - create_time
|
|
||||||
#create_time_data = render.timespan(diff_time)
|
|
||||||
modify_time_value = line[3]
|
modify_time_value = line[3]
|
||||||
if modify_time_value == "None":
|
if modify_time_value == "None":
|
||||||
modify_time_data = "Never"
|
modify_time_data = "Never"
|
||||||
else:
|
else:
|
||||||
modify_time_data = modify_time_value
|
modify_time_data = modify_time_value
|
||||||
#modify_time = int(modify_time_value)
|
|
||||||
#curr_time = int(time.time())
|
|
||||||
#diff_time = curr_time - modify_time
|
|
||||||
#modify_time_data = render.timespan(diff_time)
|
|
||||||
# calculate percentage of used mailboxes
|
# calculate percentage of used mailboxes
|
||||||
max_number_of_mailboxes = int(line[4])
|
max_number_of_mailboxes = int(line[4])
|
||||||
number_of_mailboxes = int(line[5])
|
number_of_mailboxes = int(line[5])
|
||||||
|
@ -0,0 +1,148 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import time
|
||||||
|
import random
|
||||||
|
from pprint import pprint
|
||||||
|
from .agent_based_api.v1 import get_value_store, get_rate, 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 discover_mailcow_mailboxes(section):
|
||||||
|
for key in section:
|
||||||
|
yield(Service(item = key))
|
||||||
|
|
||||||
|
def check_mailcow_mailboxes(item, params, section):
|
||||||
|
mailbox = item
|
||||||
|
# get all values from section
|
||||||
|
active = section[mailbox][0]
|
||||||
|
create_time = section[mailbox][1]
|
||||||
|
modify_time = section[mailbox][2]
|
||||||
|
display_name = section[mailbox][3]
|
||||||
|
number_of_messages = section[mailbox][4]
|
||||||
|
_percent_in_use = section[mailbox][5]
|
||||||
|
quota = section[mailbox][6]
|
||||||
|
total_number_of_bytes_used = section[mailbox][7]
|
||||||
|
percent_storage_used_for_messages = section[mailbox][8]
|
||||||
|
last_imap_login_data = section[mailbox][9]
|
||||||
|
last_pop3_login_data = section[mailbox][10]
|
||||||
|
last_smtp_login_data = section[mailbox][11]
|
||||||
|
|
||||||
|
# create (main) service for used storage (mailbox quota)
|
||||||
|
warn, crit = params["levels_mailcow_mailboxes_quota_used"]
|
||||||
|
levels = (warn, crit)
|
||||||
|
state_quota = getStateUpper(levels, percent_storage_used_for_messages)
|
||||||
|
# create graph for used quota
|
||||||
|
yield Metric("mailcow_mailboxes_used_quota", percent_storage_used_for_messages, levels=levels)
|
||||||
|
summary_quota = f"Storage quota for mailbox of '{display_name}' is {render.percent(percent_storage_used_for_messages)}"
|
||||||
|
details_quota = f"Quota: {render.bytes(total_number_of_bytes_used)} of {render.bytes(quota)} used"
|
||||||
|
|
||||||
|
# create service
|
||||||
|
yield(Result(state=state_quota, summary=summary_quota, details=details_quota))
|
||||||
|
|
||||||
|
# create some additional services and information only details
|
||||||
|
notice = f"Active: {active}"
|
||||||
|
yield(Result(state=State.OK, notice=notice))
|
||||||
|
notice = f"Creation date: {create_time}"
|
||||||
|
yield(Result(state=State.OK, notice=notice))
|
||||||
|
notice = f"Last modified: {modify_time}"
|
||||||
|
yield(Result(state=State.OK, notice=notice))
|
||||||
|
|
||||||
|
notice = f"Last IMAP login: {last_imap_login_data} ago"
|
||||||
|
yield(Result(state=State.OK, notice=notice))
|
||||||
|
notice = f"Last POP3 login: {last_pop3_login_data} ago"
|
||||||
|
yield(Result(state=State.OK, notice=notice))
|
||||||
|
notice = f"Last SMTP login: {last_smtp_login_data} ago"
|
||||||
|
yield(Result(state=State.OK, notice=notice))
|
||||||
|
|
||||||
|
# create service for number of messages
|
||||||
|
warn, crit = params["levels_mailcow_mailboxes_num_messages"]
|
||||||
|
levels = (warn, crit)
|
||||||
|
state_messages = getStateUpper(levels, number_of_messages)
|
||||||
|
yield Metric("mailcow_mailboxes_messages", number_of_messages, levels=levels)
|
||||||
|
notice = f"Number of messages: {number_of_messages}"
|
||||||
|
yield(Result(state=state_messages, notice=notice))
|
||||||
|
|
||||||
|
|
||||||
|
def parse_mailcow_mailboxes_section(string_table):
|
||||||
|
# convert the raw output of the agent section into a meaningful structure, do type conversions and so on
|
||||||
|
parsed_data = {}
|
||||||
|
for line in string_table:
|
||||||
|
mailboxname = line[0]
|
||||||
|
value_active = int(line[1])
|
||||||
|
if value_active == 1:
|
||||||
|
active = "yes"
|
||||||
|
else:
|
||||||
|
active = "no"
|
||||||
|
# calculate creation and last modification date in human readable format
|
||||||
|
create_time_value = line[2]
|
||||||
|
if create_time_value == "None":
|
||||||
|
create_time_data = "Not available"
|
||||||
|
else:
|
||||||
|
create_time_data = create_time_value
|
||||||
|
modify_time_value = line[3]
|
||||||
|
if modify_time_value == "None":
|
||||||
|
modify_time_data = "Never"
|
||||||
|
else:
|
||||||
|
modify_time_data = modify_time_value
|
||||||
|
# get display name
|
||||||
|
display_name = line[4]
|
||||||
|
# number of messages within mailbox
|
||||||
|
number_of_messages = int(line[5])
|
||||||
|
# percent in use, rounded to full percent
|
||||||
|
percent_in_use = int(line[6])
|
||||||
|
# calculate storage used for all messages in mailbox
|
||||||
|
quota = int(line[7])
|
||||||
|
total_number_of_bytes_used = int(line[8])
|
||||||
|
percent_storage_used_for_messages = total_number_of_bytes_used * 100 / quota
|
||||||
|
# get time of last login for IMAP/POP3/SMTP (seconds since epoch)
|
||||||
|
last_imap_login = int(line[9])
|
||||||
|
last_pop3_login = int(line[10])
|
||||||
|
last_smtp_login = int(line[11])
|
||||||
|
# transfer these times into a human friendly format
|
||||||
|
if last_imap_login == 0:
|
||||||
|
last_imap_login_data = "Never"
|
||||||
|
else:
|
||||||
|
curr_time = int(time.time())
|
||||||
|
diff_time = curr_time - last_imap_login
|
||||||
|
last_imap_login_data = render.timespan(diff_time)
|
||||||
|
if last_pop3_login == 0:
|
||||||
|
last_pop3_login_data = "Never"
|
||||||
|
else:
|
||||||
|
curr_time = int(time.time())
|
||||||
|
diff_time = curr_time - last_pop3_login
|
||||||
|
last_pop3_login_data = render.timespan(diff_time)
|
||||||
|
if last_smtp_login == 0:
|
||||||
|
last_smtp_login_data = "Never"
|
||||||
|
else:
|
||||||
|
curr_time = int(time.time())
|
||||||
|
diff_time = curr_time - last_smtp_login
|
||||||
|
last_smtp_login_data = render.timespan(diff_time)
|
||||||
|
# store all (calculated) data
|
||||||
|
parsed_data[f"{mailboxname}"] = [active, create_time_data, modify_time_data,
|
||||||
|
display_name, number_of_messages, percent_in_use,
|
||||||
|
quota, total_number_of_bytes_used, percent_storage_used_for_messages,
|
||||||
|
last_imap_login_data, last_pop3_login_data, last_smtp_login_data
|
||||||
|
]
|
||||||
|
return parsed_data
|
||||||
|
|
||||||
|
register.agent_section(
|
||||||
|
name = "mailcow_mailboxes",
|
||||||
|
parse_function = parse_mailcow_mailboxes_section,
|
||||||
|
)
|
||||||
|
|
||||||
|
register.check_plugin(
|
||||||
|
name = "mailcow_mailboxes",
|
||||||
|
service_name = "Mailcow mailbox %s",
|
||||||
|
discovery_function = discover_mailcow_mailboxes,
|
||||||
|
check_function = check_mailcow_mailboxes,
|
||||||
|
check_default_parameters = {
|
||||||
|
"levels_mailcow_mailboxes_quota_used": (65.0, 85.0),
|
||||||
|
"levels_mailcow_mailboxes_num_messages": (1000, 2500),
|
||||||
|
},
|
||||||
|
check_ruleset_name="mailcow_mailboxes",
|
||||||
|
)
|
@ -219,18 +219,18 @@ def getMailcowInfo(headers, verify, base_url):
|
|||||||
|
|
||||||
'''
|
'''
|
||||||
Output is as follows:
|
Output is as follows:
|
||||||
mailbox name email address used for login
|
0 mailbox name email address used for login
|
||||||
active 1 --> active, 0 --> not active
|
1 active 1 --> active, 0 --> not active
|
||||||
creation date "None" if ???
|
2 creation date "None" if ???
|
||||||
last modified date "None" if never modified
|
3 last modified date "None" if never modified
|
||||||
name display name
|
4 name display name
|
||||||
number of messages
|
5 number of messages
|
||||||
percent in use quota used, rounded to full percents
|
6 percent in use quota used, rounded to full percents
|
||||||
quota max quota in bytes
|
7 quota max quota in bytes
|
||||||
quota used quota used in bytes
|
8 quota used quota used in bytes
|
||||||
last imap login seconds since epoch, 0 if never logged inin seconds since epoch
|
9 last imap login seconds since epoch, 0 if never logged in
|
||||||
last pop3 login seconds since epoch, 0 if never logged in
|
10 last pop3 login seconds since epoch, 0 if never logged in
|
||||||
last smtp login seconds since epoch, 0 if never logged in
|
11 last smtp login seconds since epoch, 0 if never logged in
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
user1@dom1.de;1;2022-04-29 14:29:34;2022-04-29 14:29:34;Sarah;2433;2;21474836480;495481374;1692520168;0;1692281537
|
user1@dom1.de;1;2022-04-29 14:29:34;2022-04-29 14:29:34;Sarah;2433;2;21474836480;495481374;1692520168;0;1692281537
|
||||||
@ -266,17 +266,17 @@ def doCmkOutputMailcow(version, num_domains, num_mailboxes, num_global_messages)
|
|||||||
|
|
||||||
'''
|
'''
|
||||||
Output is as follows:
|
Output is as follows:
|
||||||
domain_name
|
0 domain_name
|
||||||
active 1 --> active, 0 --> not active
|
1 active 1 --> active, 0 --> not active
|
||||||
creation date "None" if ???
|
2 creation date "None" if ???
|
||||||
last modified date "None" if never modified
|
3 last modified date "None" if never modified
|
||||||
max number mailboxes
|
4 max number mailboxes
|
||||||
number of mailboxes
|
5 number of mailboxes
|
||||||
max number of aliases
|
6 max number of aliases
|
||||||
number of aliases
|
7 number of aliases
|
||||||
total number of messages
|
8 total number of messages
|
||||||
total number of bytes used in bytes
|
9 total number of bytes used in bytes
|
||||||
max quota in bytes
|
10 max quota in bytes
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
dom1.de;1;2022-04-23 22:54:57;None;10;0;400;6;0;0;10737418240
|
dom1.de;1;2022-04-23 22:54:57;None;10;0;400;6;0;0;10737418240
|
||||||
|
18
local/share/check_mk/checkman/mailcow_mailboxes
Normal file
18
local/share/check_mk/checkman/mailcow_mailboxes
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
title: Mailcow: Usage per Mailbox, Quota and Number of Messages
|
||||||
|
agents: linux
|
||||||
|
catalog: unsorted
|
||||||
|
license: GPL
|
||||||
|
distribution: check_mk
|
||||||
|
description:
|
||||||
|
Tested with Mailcow versions 2022-07a and higher (use at your own risk with lower versions).
|
||||||
|
Tested only with fully dockerized Mailcow instances.
|
||||||
|
You have to provide at least the hostname/IP of your Mailcow server and an API key.
|
||||||
|
Got to configuration settings and create a new API key (read-only access is sufficient).
|
||||||
|
Allow API access to at least your CheckMK server IP address.
|
||||||
|
Shows several information about a Mailcow mailbox, e.g. number of messages and quota.
|
||||||
|
The check will raise WARN/CRIT if quota usage is above the configurable levels.
|
||||||
|
The check will raise WARN/CRIT if number of messages is above the configurable levels.
|
||||||
|
item:
|
||||||
|
mailboxname
|
||||||
|
inventory:
|
||||||
|
one service is created for each mailbox
|
@ -57,4 +57,16 @@ metric_info["mailcow_domains_configured_mailboxes"] = {
|
|||||||
"title": _("Number of Configured Mailboxes"),
|
"title": _("Number of Configured Mailboxes"),
|
||||||
"unit": "count",
|
"unit": "count",
|
||||||
"color": "24/b",
|
"color": "24/b",
|
||||||
|
}
|
||||||
|
|
||||||
|
metric_info["mailcow_mailboxes_used_quota"] = {
|
||||||
|
"title": _("Mailbox Quota Used"),
|
||||||
|
"unit": "%",
|
||||||
|
"color": "24/a",
|
||||||
|
}
|
||||||
|
|
||||||
|
metric_info["mailcow_mailboxes_messages"] = {
|
||||||
|
"title": _("Number of Messages"),
|
||||||
|
"unit": "count",
|
||||||
|
"color": "24/b",
|
||||||
}
|
}
|
@ -22,6 +22,17 @@ perfometer_info.append({
|
|||||||
],
|
],
|
||||||
})
|
})
|
||||||
|
|
||||||
|
perfometer_info.append({
|
||||||
|
"type": "stacked",
|
||||||
|
"perfometers": [
|
||||||
|
{
|
||||||
|
"type": "linear",
|
||||||
|
"segments": ["mailcow_mailboxes_used_quota"],
|
||||||
|
"total": 100.0,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
|
||||||
#perfometer_info.append({
|
#perfometer_info.append({
|
||||||
# "type": "stacked",
|
# "type": "stacked",
|
||||||
# "perfometers": [
|
# "perfometers": [
|
||||||
|
@ -0,0 +1,63 @@
|
|||||||
|
from cmk.gui.i18n import _
|
||||||
|
from cmk.gui.plugins.wato import (
|
||||||
|
CheckParameterRulespecWithItem,
|
||||||
|
rulespec_registry,
|
||||||
|
RulespecGroupCheckParametersApplications
|
||||||
|
)
|
||||||
|
from cmk.gui.valuespec import (
|
||||||
|
Dictionary,
|
||||||
|
ListChoice,
|
||||||
|
TextAscii,
|
||||||
|
Percentage,
|
||||||
|
Tuple,
|
||||||
|
Float,
|
||||||
|
Integer
|
||||||
|
)
|
||||||
|
|
||||||
|
def _item_spec_mailcow_mailboxes():
|
||||||
|
return TextAscii(
|
||||||
|
title=_("Domain")
|
||||||
|
)
|
||||||
|
|
||||||
|
def _parameter_spec_mailcow_mailboxes():
|
||||||
|
return Dictionary(
|
||||||
|
elements=[
|
||||||
|
("levels_mailcow_mailboxes_quota_used", Tuple(
|
||||||
|
title=_("Mailcow mailbox quota usage for storage"),
|
||||||
|
elements=[
|
||||||
|
Percentage(
|
||||||
|
title=_("Warning at"),
|
||||||
|
default_value=65.0,
|
||||||
|
),
|
||||||
|
Percentage(
|
||||||
|
title=_("Critical at"),
|
||||||
|
default_value=85.0,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
)),
|
||||||
|
("levels_mailcow_mailboxes_num_messages", Tuple(
|
||||||
|
title=_("Number of messages in mailbox"),
|
||||||
|
elements=[
|
||||||
|
Integer(
|
||||||
|
title=_("Warning at"),
|
||||||
|
default_value=1000,
|
||||||
|
),
|
||||||
|
Integer(
|
||||||
|
title=_("Critical at"),
|
||||||
|
default_value=2500,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
)),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
rulespec_registry.register(
|
||||||
|
CheckParameterRulespecWithItem(
|
||||||
|
check_group_name="mailcow_mailboxes",
|
||||||
|
group=RulespecGroupCheckParametersApplications,
|
||||||
|
match_type="dict",
|
||||||
|
item_spec=_item_spec_mailcow_mailboxes,
|
||||||
|
parameter_valuespec=_parameter_spec_mailcow_mailboxes,
|
||||||
|
title=lambda: _("Levels for Mailcow mailboxes"),
|
||||||
|
)
|
||||||
|
)
|
BIN
mkp/Mailcow-0.9.9.mkp
Executable file
BIN
mkp/Mailcow-0.9.9.mkp
Executable file
Binary file not shown.
Loading…
Reference in New Issue
Block a user