diff --git a/README.md b/README.md index ac248cb..9e69783 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,8 @@ Apply your changes ## Version history: +2026/03/09 2.2.0 Bugfixes for rules without levels + 2025/03/30 2.1.0 Migration to new plugin API done 2024/01/26 1.2.0 Added password store option for the API key, added version check diff --git a/mailcow/agent_based/mailcow_domains.py b/mailcow/agent_based/mailcow_domains.py index 6e3b871..8de3b1a 100644 --- a/mailcow/agent_based/mailcow_domains.py +++ b/mailcow/agent_based/mailcow_domains.py @@ -19,6 +19,9 @@ def get_state_upper( levels: tuple[int | float, int | float], value: int | float ) -> State: """returns OK/WARN/CRIT depending on the given parameters""" + if levels is None: + # a rule with no levels set is active, assume OK state + return State.OK warn, crit = levels if value >= crit: return State.CRIT @@ -117,7 +120,7 @@ def check_mailcow_domains(item, params, section): percent_storage_used_for_messages = domain[12] # create (main) service for used storage (domain quota) - _type, levels = params["levels_mailcow_domains_quota_used"] + _level_type, levels = params["levels_mailcow_domains_quota_used"] state_quota = get_state_upper(levels, percent_storage_used_for_messages) # create graph for used quota @@ -142,28 +145,28 @@ def check_mailcow_domains(item, params, section): yield Result(state=State.OK, notice=notice) # create service for number of configured mailboxes (percent) - _type, levels = params["levels_mailcow_domains_mailboxes_used"] + _level_type, levels = params["levels_mailcow_domains_mailboxes_used"] state_mailboxes = get_state_upper(levels, percent_used_mailboxes) yield Metric("mailcow_domains_mailboxes", percent_used_mailboxes, levels=levels) notice = f"Used mailboxes: {render.percent(percent_used_mailboxes)}, {number_of_mailboxes} of {max_number_of_mailboxes} in use" yield Result(state=state_mailboxes, notice=notice) # create service for number of configured aliases (percent) - _type, levels = params["levels_mailcow_domains_aliases_used"] + _level_type, levels = params["levels_mailcow_domains_aliases_used"] state_aliases = get_state_upper(levels, percent_used_aliases) yield Metric("mailcow_domains_aliases", percent_used_aliases, levels=levels) notice = f"Used aliases: {render.percent(percent_used_aliases)}, {number_of_aliases} of {max_number_of_aliases} in use" yield Result(state=state_aliases, notice=notice) # create service for number of messages - _type, levels = params["levels_mailcow_domains_num_messages"] + _level_type, levels = params["levels_mailcow_domains_num_messages"] state_messages = get_state_upper(levels, total_number_of_messages) yield Metric("mailcow_domains_messages", total_number_of_messages, levels=levels) notice = f"Number of messages: {total_number_of_messages}" yield Result(state=state_messages, notice=notice) # create service for number of configured aliases (absolute) - _type, levels = params["levels_mailcow_domains_num_aliases"] + _level_type, levels = params["levels_mailcow_domains_num_aliases"] state_aliases = get_state_upper(levels, number_of_aliases) yield Metric("mailcow_domains_configured_aliases", number_of_aliases, levels=levels) notice = ( @@ -172,7 +175,7 @@ def check_mailcow_domains(item, params, section): yield Result(state=state_aliases, notice=notice) # create service for number of configured mailboxes (absolute) - _type, levels = params["levels_mailcow_domains_num_mailboxes"] + _level_type, levels = params["levels_mailcow_domains_num_mailboxes"] state_mailboxes = get_state_upper(levels, number_of_mailboxes) yield Metric( "mailcow_domains_configured_mailboxes", number_of_mailboxes, levels=levels diff --git a/mailcow/agent_based/mailcow_info.py b/mailcow/agent_based/mailcow_info.py index a7c208f..7e44c62 100644 --- a/mailcow/agent_based/mailcow_info.py +++ b/mailcow/agent_based/mailcow_info.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 # pylint: disable=line-too-long, simplifiable-if-statement, missing-module-docstring, too-many-locals + # import necessary elements from API version 2 from cmk.agent_based.v2 import ( AgentSection, @@ -16,6 +17,9 @@ def get_state_upper( levels: tuple[int | float, int | float], value: int | float ) -> State: """returns OK/WARN/CRIT depending on the given parameters""" + if levels is None: + # a rule with no levels set is active, assume OK state + return State.OK warn, crit = levels if value >= crit: return State.CRIT @@ -62,9 +66,9 @@ def discover_mailcow_info(section): def check_mailcow_info(params, section): """the check function""" # get thresholds - _type, levels_num_domains = params["levels_num_domains"] - _type, levels_num_mailboxes = params["levels_num_mailboxes"] - _type, levels_num_global_messages = params["levels_num_global_messages"] + _level_type, levels_num_domains = params["levels_num_domains"] + _level_type, levels_num_mailboxes = params["levels_num_mailboxes"] + _level_type, levels_num_global_messages = params["levels_num_global_messages"] # get all section data version: str = section["version"] git_version: str = section["git_version"] @@ -74,17 +78,6 @@ def check_mailcow_info(params, section): num_mailboxes: int = section["num_mailboxes"] num_global_messages: int = section["num_global_messages"] - # create graphs for number of domains, mailboxes and messages - yield Metric(name="mc_num_domains", value=num_domains, levels=levels_num_domains) - yield Metric( - name="mc_num_mailboxes", value=num_mailboxes, levels=levels_num_mailboxes - ) - yield Metric( - name="mc_num_global_messages", - value=num_global_messages, - levels=levels_num_global_messages, - ) - # create overall result if check_version_enabled: if update_available: @@ -100,22 +93,28 @@ def check_mailcow_info(params, section): yield Result(state=state, summary=summary, details=details) # Create result for number of domains - warn, crit = levels_num_domains - state = get_state_upper((warn, crit), num_domains) + state = get_state_upper(levels_num_domains, num_domains) + yield Metric(name="mc_num_domains", value=num_domains, levels=levels_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 = get_state_upper((warn, crit), num_mailboxes) + state = get_state_upper(levels_num_mailboxes, num_mailboxes) + yield Metric( + name="mc_num_mailboxes", value=num_mailboxes, levels=levels_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 = get_state_upper((warn, crit), num_global_messages) + state = get_state_upper(levels_num_global_messages, num_global_messages) + yield Metric( + name="mc_num_global_messages", + value=num_global_messages, + levels=levels_num_global_messages, + ) notice = f"Number of messages: {num_global_messages}" if state != State.OK: yield Result(state=state, notice=notice) diff --git a/mailcow/agent_based/mailcow_mailboxes.py b/mailcow/agent_based/mailcow_mailboxes.py index a48cdb3..d85d538 100644 --- a/mailcow/agent_based/mailcow_mailboxes.py +++ b/mailcow/agent_based/mailcow_mailboxes.py @@ -20,6 +20,9 @@ def get_state_upper( levels: tuple[int | float, int | float], value: int | float ) -> State: """returns OK/WARN/CRIT depending on the given parameters""" + if levels is None: + # a rule with no levels set is active, assume OK state + return State.OK warn, crit = levels if value >= crit: return State.CRIT diff --git a/mkp/Mailcow-2.2.0.mkp b/mkp/Mailcow-2.2.0.mkp new file mode 100644 index 0000000..28d1985 Binary files /dev/null and b/mkp/Mailcow-2.2.0.mkp differ