From 7f58381fd374f02cb10b16946be89606139e310f Mon Sep 17 00:00:00 2001 From: cmk-bonobo Date: Mon, 9 Mar 2026 11:25:48 +0000 Subject: [PATCH] MKP 3.2.0 released, fixed bugs when users are deleted and rules without levels are active --- .README.md.swp | Bin 0 -> 20480 bytes README.md | 12 +++-- mkp/Nextcloud-3.2.0.mkp | Bin 0 -> 12912 bytes nextcloud/agent_based/nextcloud_database.py | 17 +++++-- nextcloud/agent_based/nextcloud_info.py | 53 +++++++++++++------- nextcloud/agent_based/nextcloud_users.py | 37 ++++++++++---- nextcloud/checkman/nextcloud_database | 2 +- nextcloud/checkman/nextcloud_info | 4 +- nextcloud/checkman/nextcloud_users | 2 +- 9 files changed, 87 insertions(+), 40 deletions(-) create mode 100644 .README.md.swp create mode 100644 mkp/Nextcloud-3.2.0.mkp diff --git a/.README.md.swp b/.README.md.swp new file mode 100644 index 0000000000000000000000000000000000000000..6ca08dafb37829fbfdc1aa5da60d23b54f38d67b GIT binary patch literal 20480 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 5f6cf72..9a0b09b 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,16 @@ # Nextcloud CheckMK Special Agent Monitors various aspects of Nextcloud instances like state, quota and disk usage of all users, number of apps with available updates, database php opcache hit rate and so on. Gives additional information regarding versions of Nextcloud, database, number of storages and active users etc. -Tested only with Nextcloud versions 29/30 + +Tested only with Nextcloud versions 29/30/31/32 + Tested only with MariaDB as database backend + The whole plugin is now migrated to the new plugin API version, introduced with CheckMK 2.3 + Feel free to report other working environments. + Upgrade from older MKPs (before 3.1.1): If you upgrade from a already installed MKP version before 3.1.0, you have to re-create your rules for the "Nextcloud Server Information" (reason: some parameter changes combined with the migration to the new plugin API). @@ -18,7 +23,7 @@ Hint: It is always a good idea to create screenshots from all other Nextcloud ru 5. Re-create your rules with the previously saved information from steps 1 and 2 6. Apply your changes -Hint: You have to create an app password now for accessing your Nextcloud instance. For this to accomplish login to your Nextcloud server with an administrative user account. Go to "Personal Settings|Security" and take note of the section "Devices & Sessions". Create the app password via clicking the button "create new app password". You may use this password explicitly within the rule or store it first in the password safe of CheckMK. +Hint: You have to create an app password now for accessing your Nextcloud instance. For this to accomplish login to your Nextcloud server with an administrative user account. Go to "Personal Settings|Security" and take note of the section "Devices & Sessions". Create the app password via clicking the button "create new app password". You may use this password explicitly within the rule or store it first in the password safe of CheckMK (recommended). General installation instructions: @@ -40,7 +45,8 @@ Version History: -- |Date|Version|Changes| |----|-------|-------| -|2025/03/30|3.1.1|Migration to the new plugin API version finished, (hopefully) ready for CheckMK version 2.4 +|2026/03/09|3.2.0|Fixed bugs when: Users are deleted, quotas not set, rules with no levels are active| +|2025/03/30|3.1.1|Migration to the new plugin API version finished, (hopefully) ready for CheckMK version 2.4| |2023/01/13|2.5.2|Repackaged only to set the minimum required version back to 2.1.0p1, due to serveral user requests| |2023/01/12|2.5.1|Added versions for apps with available updates| |2023/01/12|2.4.1|Removed Parameter "token", switched to parameter "app password" only| diff --git a/mkp/Nextcloud-3.2.0.mkp b/mkp/Nextcloud-3.2.0.mkp new file mode 100644 index 0000000000000000000000000000000000000000..ccc2e3d0ab85b09ba5705da5d178330317a3ee0b GIT binary patch literal 12912 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 literal 0 HcmV?d00001 diff --git a/nextcloud/agent_based/nextcloud_database.py b/nextcloud/agent_based/nextcloud_database.py index db64233..a8bbcc0 100644 --- a/nextcloud/agent_based/nextcloud_database.py +++ b/nextcloud/agent_based/nextcloud_database.py @@ -2,6 +2,7 @@ # pylint: disable=missing-module-docstring, unused-argument, missing-function-docstring # pylint: disable=line-too-long +from typing import Final from collections.abc import Mapping from typing import NotRequired, TypedDict @@ -18,6 +19,8 @@ from cmk.agent_based.v2 import ( DiscoveryResult, ) +NO_LEVELS: Final[str] = "no_levels" + class _ItemData(TypedDict): dbtype: NotRequired[str] @@ -49,14 +52,18 @@ def check_nextcloud_database(params, section) -> CheckResult: size = section[key]["size"] dbtype = section[key]["dbtype"] version = section[key]["version"] - _level_type, levels = params["levels_database_opcache_hit_rate"] + level_type, levels = params["levels_database_opcache_hit_rate"] # create graph for opcache hit rate - yield Metric( - "nc_database_opcache_hit_rate", opcache_hit_rate, levels=levels - ) + if level_type == NO_LEVELS: + yield Metric("nc_database_opcache_hit_rate", opcache_hit_rate) + state = State.OK + else: + yield Metric( + "nc_database_opcache_hit_rate", opcache_hit_rate, levels=levels + ) + state = get_state_lower(levels, opcache_hit_rate) # create graph for database size yield Metric("nc_database_size", size) - state = get_state_lower(levels, opcache_hit_rate) summary = f"PHP OPCache hit rate: {render.percent(opcache_hit_rate)}" if opcache_hit_rate == 0: state = State.UNKNOWN diff --git a/nextcloud/agent_based/nextcloud_info.py b/nextcloud/agent_based/nextcloud_info.py index 6cd8621..b4e445a 100644 --- a/nextcloud/agent_based/nextcloud_info.py +++ b/nextcloud/agent_based/nextcloud_info.py @@ -3,6 +3,7 @@ # pylint: disable=line-too-long, too-many-branches, too-many-locals, too-many-statements from datetime import datetime +from typing import Final from cmk.agent_based.v2 import ( AgentSection, @@ -17,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,8 +45,8 @@ def discover_nextcloud_info(section) -> DiscoveryResult: def check_nextcloud_info(params, section) -> CheckResult: for key in section: if key == "nextcloud": - _level_type, levels_free_space = params["levels_free_space"] - _level_type, levels_number_of_files = params["levels_number_of_files"] + level_type_free_space, levels_free_space = params["levels_free_space"] + level_type_number_of_files, levels_number_of_files = params["levels_number_of_files"] # update infos are available only from Nextcloud version 28 onwards try: last_update = section[key]["last_update"] @@ -89,19 +91,28 @@ def check_nextcloud_info(params, section) -> CheckResult: # Create result for free space on disk # Levels for free space are given in GBytes, we have to adjust this here - warn, crit = levels_free_space - warn = warn * 1024 * 1024 * 1024 - crit = crit * 1024 * 1024 * 1024 - state = get_state_lower((warn, crit), free_space) - # create graph for free space on disk - yield Metric("nc_free_space", free_space, levels=(warn, crit)) + if level_type_free_space != NO_LEVELS: + warn, crit = levels_free_space + warn = warn * 1024 * 1024 * 1024 + crit = crit * 1024 * 1024 * 1024 + state = get_state_lower((warn, crit), free_space) + # create graph for free space on disk + yield Metric("nc_free_space", free_space, levels=(warn, crit)) + else: + # a rule with no levels set is active, assume OK state + state = State.OK + yield Metric("nc_free_space", free_space) notice = f"Remaining free space on disk: {render.bytes(free_space)}" if state != State.OK: yield Result(state=state, notice=notice) # Create result for number of files - warn, crit = levels_number_of_files - state = get_state_upper((warn, crit), num_files) + if level_type_number_of_files != NO_LEVELS: + warn, crit = levels_number_of_files + state = get_state_upper((warn, crit), num_files) + else: + # a rule with no levels set is active, assume OK state + state = State.OK notice = f"Number of files: {num_files}" if state != State.OK: yield Result(state=state, notice=notice) @@ -139,14 +150,22 @@ def check_nextcloud_info(params, section) -> CheckResult: else: app_versions = "" # create graphs for number of apps - _level_type, levels = params["levels_apps_with_updates_available"] + level_type, levels = params["levels_apps_with_updates_available"] yield Metric("nc_num_apps_installed", num_apps_installed) - yield Metric( - "nc_apps_with_updates_available", - num_apps_with_updates_available, - levels=levels, - ) - state = get_state_upper(levels, num_apps_with_updates_available) + if level_type != NO_LEVELS: + yield Metric( + "nc_apps_with_updates_available", + num_apps_with_updates_available, + levels=levels, + ) + state = get_state_upper(levels, num_apps_with_updates_available) + else: + # a rule with no levels set is active, assume OK state + yield Metric( + "nc_apps_with_updates_available", + num_apps_with_updates_available, + ) + state = State.OK if app_versions == "": notice = f"Number of installed apps: {num_apps_installed}\nNumber of apps with updates available: {num_apps_with_updates_available}" else: diff --git a/nextcloud/agent_based/nextcloud_users.py b/nextcloud/agent_based/nextcloud_users.py index c28093b..9658c88 100644 --- a/nextcloud/agent_based/nextcloud_users.py +++ b/nextcloud/agent_based/nextcloud_users.py @@ -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) diff --git a/nextcloud/checkman/nextcloud_database b/nextcloud/checkman/nextcloud_database index 5c61c6d..82d1710 100644 --- a/nextcloud/checkman/nextcloud_database +++ b/nextcloud/checkman/nextcloud_database @@ -4,7 +4,7 @@ catalog: unsorted license: GPL distribution: check_mk description: - Works with Nextcloud version 25/26/27/28/29/30 (use at your own risk with lower versions). + Works with Nextcloud version 25/26/27/28/29/30/31/32 (use at your own risk with lower versions). Tested only with mariab as underlying database. You have to use a username/app password combination to get access to the Nextcloud API. You can create this app password within the personal settings of an administrative user in Nextcloud. diff --git a/nextcloud/checkman/nextcloud_info b/nextcloud/checkman/nextcloud_info index 3e00f08..377f3c1 100644 --- a/nextcloud/checkman/nextcloud_info +++ b/nextcloud/checkman/nextcloud_info @@ -4,9 +4,9 @@ catalog: unsorted license: GPL distribution: check_mk description: - Works with Nextcloud version 25/26/27/28/29/30 (use at your own risk with lower versions). + Works with Nextcloud version 25/26/27/28/29/30/31/32 (use at your own risk with lower versions). Tested only with mariab as underlying database. - You have to use a username/app password combination to get access to the Nextcloud API. + You have to use a username/app password combination to get access to the Nextcloud API (including user info). You can create this app password within the personal settings of an administrative user in Nextcloud. Got to security settings and create a new app password. The user must not be secured with 2FA. diff --git a/nextcloud/checkman/nextcloud_users b/nextcloud/checkman/nextcloud_users index be2c4ad..7508335 100644 --- a/nextcloud/checkman/nextcloud_users +++ b/nextcloud/checkman/nextcloud_users @@ -4,7 +4,7 @@ catalog: unsorted license: GPL distribution: check_mk description: - Works with Nextcloud version 25/26/27/28/29/30 (use at your own risk with lower versions). + Works with Nextcloud version 25/26/27/28/29/30/31/32 (use at your own risk with lower versions). Tested only with mariab as underlying database. You have to use a username/app password combination to get access to the Nextcloud API. You can create this app password within the personal settings of an administrative user in Nextcloud.