MKP 3.2.0 released, fixed bugs when users are deleted and rules without levels are active

This commit is contained in:
2026-03-09 11:25:48 +00:00
parent bf470d5d6c
commit 7f58381fd3
9 changed files with 87 additions and 40 deletions

View File

@@ -3,7 +3,7 @@
# pylint: disable=line-too-long, too-many-locals
from time import time
from pprint import pprint
from typing import Final
from cmk.agent_based.v2 import (
AgentSection,
@@ -18,6 +18,7 @@ from cmk.agent_based.v2 import (
DiscoveryResult,
)
NO_LEVELS: Final[str] = "no_levels"
def get_state_upper(levels, value):
warn, crit = levels
@@ -43,6 +44,10 @@ def discover_nextcloud_users(section) -> DiscoveryResult:
def check_nextcloud_users(item, params, section) -> CheckResult:
attr = section.get(item)
if not attr:
yield Result(state=State.UNKNOWN, summary="User not found anymore, maybe it has been deleted.")
return
userid = item
quota_used_percent = section[item][0]
quota_used_bytes = section[item][1]
@@ -56,8 +61,8 @@ def check_nextcloud_users(item, params, section) -> CheckResult:
quota_is_set = False
else:
quota_is_set = True
_level_type, levels_quota_used = params["levels_users_quota_used"]
_level_type, levels_free_space = params["levels_users_free_space"]
level_type_quota_used, levels_quota_used = params["levels_users_quota_used"]
level_type_free_space, levels_free_space = params["levels_users_free_space"]
if (last_login_human == "never") or (not quota_is_set):
details = f"User ID is '{userid}', Last login: {last_login_human}"
summary = (
@@ -65,19 +70,29 @@ def check_nextcloud_users(item, params, section) -> CheckResult:
)
else:
# Levels are given in MBytes, we have to adjust this here
warn, crit = levels_free_space
warn = warn * 1024 * 1024
crit = crit * 1024 * 1024
state = get_state_lower((warn, crit), free_space)
if level_type_free_space != NO_LEVELS:
warn, crit = levels_free_space
warn = warn * 1024 * 1024
crit = crit * 1024 * 1024
state = get_state_lower((warn, crit), free_space)
yield Metric("nc_users_free_space", free_space, levels=(warn, crit))
else:
# a rule with no levels set is active, so assume OK state
state = State.OK
yield Metric("nc_users_free_space", free_space)
details = f"User ID is '{userid}'\nLast login: {last_login_human} ({last_login_since} ago)\nFree space: {render.bytes(free_space)}"
summary = f"Used quota of '{display_name}' is {render.percent(quota_used_percent)}, {render.bytes(quota_used_bytes)}/{render.bytes(quota_total_bytes)} used"
notice = f"Remaining free space: {render.bytes(free_space)}"
yield Metric("nc_users_free_space", free_space, levels=(warn, crit))
if state != State.OK:
yield Result(state=state, notice=notice)
yield Metric("nc_users_free_space", free_space, levels=(warn, crit))
yield Metric("nc_users_quota_used", quota_used_percent, levels=levels_quota_used)
state = get_state_upper(levels_quota_used, quota_used_percent)
if level_type_quota_used != NO_LEVELS:
yield Metric("nc_users_quota_used", quota_used_percent, levels=levels_quota_used)
state = get_state_upper(levels_quota_used, quota_used_percent)
else:
# a rule with no levels set is active, so assume OK state
yield Metric("nc_users_quota_used", quota_used_percent)
state = State.OK
yield Result(state=state, summary=summary, details=details)