fixed crash when last login seems to be in the future

This commit is contained in:
2026-03-15 12:04:06 +00:00
parent 7811b4b617
commit 1b3eedcc50
2 changed files with 15 additions and 7 deletions

View File

@@ -20,6 +20,7 @@ from cmk.agent_based.v2 import (
NO_LEVELS: Final[str] = "no_levels"
def get_state_upper(levels, value):
warn, crit = levels
if value >= crit:
@@ -46,7 +47,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.")
yield Result(
state=State.UNKNOWN,
summary="User not found anymore, maybe it has been deleted.",
)
return
userid = item
quota_used_percent = section[item][0]
@@ -65,9 +69,7 @@ def check_nextcloud_users(item, params, section) -> CheckResult:
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 = (
f"Used quota of '{display_name}' can't be calculated yet (never logged in or no quota set)"
)
summary = f"Used quota of '{display_name}' can't be calculated yet (never logged in or no quota set)"
else:
# Levels are given in MBytes, we have to adjust this here
if level_type_free_space != NO_LEVELS:
@@ -86,8 +88,10 @@ def check_nextcloud_users(item, params, section) -> CheckResult:
notice = f"Remaining free space: {render.bytes(free_space)}"
if state != State.OK:
yield Result(state=state, notice=notice)
if level_type_quota_used != NO_LEVELS:
yield Metric("nc_users_quota_used", quota_used_percent, levels=levels_quota_used)
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
@@ -113,8 +117,12 @@ def parse_nextcloud_users(string_table: StringTable) -> dict:
# user logged in at least once
curr_time = int(time())
login_diff = curr_time - last_login
if login_diff < 0:
# this should not happen, but if it does, we handle it gracefully
last_login_since = "Check your system time, last login is in the future"
else:
last_login_since = render.timespan(login_diff)
last_login_human = render.datetime(last_login)
last_login_since = render.timespan(login_diff)
quota_quota = int(line[4])
if quota_quota == -3:
# TBD, no quota set for user