Initial Commit v2.2.0

This commit is contained in:
2023-03-11 14:29:54 +01:00
parent bc5a12babd
commit b0d808ae60
14 changed files with 1038 additions and 0 deletions

View File

@@ -0,0 +1,79 @@
#!/usr/bin/env python3
from pprint import pprint
from .agent_based_api.v1 import 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 getStateLower(levels, value):
warn, crit = levels
if value < crit:
return State.CRIT
if value < warn:
return State.WARN
return State.OK
def discover_nextcloud_database(section):
yield(Service())
def check_nextcloud_database(params, section):
for key in section:
if key == "database":
opcache_hit_rate = section[key]["opcache_hit_rate"]
size = section[key]["size"]
type = section[key]["type"]
version = section[key]["version"]
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)
# create graph for database size
yield Metric("nc_database_size", size)
state = getStateLower(levels, opcache_hit_rate)
summary = f"Cache hit rate: {render.percent(opcache_hit_rate)}"
details = f"\nDatabase type: {type}\nDatabase version: {version}\nDatabase size: {render.bytes(size)}"
yield(Result(state=state, summary=summary, details=details))
def parse_nextcloud_database_section(string_table):
parsed_data = {
"database" : {}
}
params_list = [
"NC_Database_Type",
"NC_Database_Version",
"NC_Database_Size",
"NC_OPCache_Hit_Rate"
]
for line in string_table:
if line[0] in params_list:
param = line[0]
value = line[1]
if param == "NC_Database_Type":
parsed_data["database"]["type"] = value
elif param == "NC_Database_Version":
parsed_data["database"]["version"] = value
elif param == "NC_Database_Size":
parsed_data["database"]["size"] = int(value)
elif param == "NC_OPCache_Hit_Rate":
parsed_data["database"]["opcache_hit_rate"] = float(value)
return parsed_data
register.agent_section(
name="nextcloud_database",
parse_function=parse_nextcloud_database_section,
)
register.check_plugin(
name="nextcloud_database",
service_name="Nextcloud Database",
discovery_function=discover_nextcloud_database,
check_function=check_nextcloud_database,
check_default_parameters={
"levels_database_opcache_hit_rate": (99.7, 99.1),
},
check_ruleset_name="nextcloud_database",
)

View File

@@ -0,0 +1,147 @@
#!/usr/bin/env python3
from pprint import pprint
from .agent_based_api.v1 import 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 getStateLower(levels, value):
warn, crit = levels
if value < crit:
return State.CRIT
if value < warn:
return State.WARN
return State.OK
def discover_nextcloud_info(section):
yield(Service())
def check_nextcloud_info(params, section):
for key in section:
if key == "nextcloud":
status = section[key]["status"]
version = section[key]["version"]
num_files = section[key]["number_files"]
num_shares = section[key]["number_shares"]
# create graph for number of files and shares
yield(Metric("nc_num_files", num_files))
yield(Metric("nc_num_shares", num_shares))
summary = f"Status is {status}"
details = f"Version is {version}\nNumber of files: {num_files}\nNumber of shares: {num_shares}\n"
if status == "ok":
state = State.OK
else:
state = State.CRIT
yield Result(state=state, summary=summary, details=details)
elif key == "users":
num_users = section[key]["number"]
num_active_last1hour = section[key]["active_last1hour"]
num_active_last1day = section[key]["active_last1day"]
num_active_last5min = section[key]["active_last5min"]
# create graphs for number of users
yield Metric("nc_num_users", num_users)
yield Metric("nc_active_users_last_1hour", num_active_last1hour)
yield Metric("nc_active_users_last_1day", num_active_last1day)
yield Metric("nc_active_users_last_5min", num_active_last5min)
notice = f"Number of users: {num_users}\n\nActive users last 5 min: {num_active_last5min}\nActive user since last hour: {num_active_last1hour}\nActive users since last day: {num_active_last1day}"
yield(Result(state=State.OK, notice=notice))
elif key == "storages":
num_storages = section[key]["number"]
num_storages_home = section[key]["number_home"]
num_storages_local = section[key]["number_local"]
num_storages_other = section[key]["number_other"]
# create graphs for number of storages
yield Metric("nc_num_storages", num_storages)
yield Metric("nc_num_storages_home", num_storages_home)
yield Metric("nc_num_storages_local", num_storages_local)
yield Metric("nc_num_storages_other", num_storages_other)
notice = f"Number of storages: {num_storages}\nNumber of home/local/other storages: {num_storages_home}/{num_storages_local}/{num_storages_other}"
yield(Result(state=State.OK, notice=notice))
elif key == "apps":
num_apps_installed = section[key]["installed"]
num_apps_with_updates_available = section[key]["with_updates_available"]
# create graphs for number of apps
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 = getStateUpper(levels, num_apps_with_updates_available)
notice = f"Number of installed apps: {num_apps_installed}\nNumber of apps with updates available: {num_apps_with_updates_available}"
yield(Result(state=state, notice=notice))
def parse_nextcloud_info_section(string_table):
parsed_data = {
"nextcloud" : {},
"storages" : {},
"apps" : {},
"users" : {},
}
params_list = [
"NC_Version",
"NC_Status",
"NC_Num_Users",
"NC_Num_Files",
"NC_Num_Shares",
"NC_Num_Storages",
"NC_Num_Storages_Home",
"NC_Num_Storages_Local",
"NC_Num_Storages_Other",
"NC_Num_Apps_Installed",
"NC_Num_Apps_Updates_Available",
"NC_Active_Users_Last_5Min",
"NC_Active_Users_Last_1Hour",
"NC_Active_Users_Last_1Day"
]
for line in string_table:
if line[0] in params_list:
param = line[0]
value = line[1]
if param == "NC_Version":
parsed_data["nextcloud"]["version"] = value
elif param == "NC_Status":
parsed_data["nextcloud"]["status"] = value
elif param == "NC_Num_Files":
parsed_data["nextcloud"]["number_files"] = int(value)
elif param == "NC_Num_Shares":
parsed_data["nextcloud"]["number_shares"] = int(value)
elif param == "NC_Num_Storages":
parsed_data["storages"]["number"] = int(value)
elif param == "NC_Num_Storages_Home":
parsed_data["storages"]["number_home"] = int(value)
elif param == "NC_Num_Storages_Local":
parsed_data["storages"]["number_local"] = int(value)
elif param == "NC_Num_Storages_Other":
parsed_data["storages"]["number_other"] = int(value)
elif param == "NC_Num_Apps_Installed":
parsed_data["apps"]["installed"] = int(value)
elif param == "NC_Num_Apps_Updates_Available":
parsed_data["apps"]["with_updates_available"] = int(value)
elif param == "NC_Num_Users":
parsed_data["users"]["number"] = int(value)
elif param == "NC_Active_Users_Last_5Min":
parsed_data["users"]["active_last5min"] = int(value)
elif param == "NC_Active_Users_Last_1Hour":
parsed_data["users"]["active_last1hour"] = int(value)
elif param == "NC_Active_Users_Last_1Day":
parsed_data["users"]["active_last1day"] = int(value)
return parsed_data
register.agent_section(
name="nextcloud_info",
parse_function=parse_nextcloud_info_section,
)
register.check_plugin(
name="nextcloud_info",
service_name="Nextcloud Info",
discovery_function=discover_nextcloud_info,
check_function=check_nextcloud_info,
check_default_parameters={
"levels_apps_with_updates_available": (1, 2),
},
check_ruleset_name="nextcloud_info",
)

View File

@@ -0,0 +1,98 @@
#!/usr/bin/env python3
from pprint import pprint
from time import time
from .agent_based_api.v1 import 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 getStateLower(levels, value):
warn, crit = levels
if value < crit:
return State.CRIT
if value < warn:
return State.WARN
return State.OK
def discover_nextcloud_users(section):
for key in section:
yield(Service(item = key))
def check_nextcloud_users(item, params, section):
userid = item
quota_used_percent = section[item][0]
quota_used_bytes = section[item][1]
quota_total_bytes = section[item][2]
display_name = section[item][3]
last_login_human = section[item][4]
last_login_since = section[item][5]
free_space = quota_total_bytes - quota_used_bytes
print(free_space)
levels_quota_used = params["levels_users_quota_used"]
levels_free_space = params["levels_users_free_space"]
if last_login_human == "never":
quota_used_percent = 0
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)"
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 = getStateLower((warn, crit), 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_quota_used", quota_used_percent, levels=levels_quota_used)
state = getStateUpper(levels_quota_used, quota_used_percent)
yield(Result(state=state, summary=summary, details=details))
def parse_nextcloud_users_section(string_table):
# Raw output from check:
# userid;displayname;lastLogin;quota_free;quota_quota;quota_relative;quota_total;quota_used
# str;str;int(milli seconds since epoch);int(bytes);int(bytes);float(percent);int(bytes);int(bytes)
parsed_data = {}
for line in string_table:
userid = line[0]
display_name = line[1]
last_login = int(line[2])/1000
if last_login == 0:
# user never logged in
last_login_human = "never"
last_login_since = "never"
else:
# user logged in at least once
curr_time = int(time())
login_diff = curr_time - last_login
last_login_human = render.datetime(last_login)
last_login_since = render.timespan(login_diff)
quota_relative = float(line[5])
quota_total = float(line[6])
quota_used = float(line[7])
parsed_data[f"{userid}"] = [quota_relative, quota_used, quota_total, display_name, last_login_human, last_login_since]
return parsed_data
register.agent_section(
name = "nextcloud_users",
parse_function = parse_nextcloud_users_section,
)
register.check_plugin(
name = "nextcloud_users",
service_name = "Nextcloud User %s",
discovery_function = discover_nextcloud_users,
check_function = check_nextcloud_users,
check_default_parameters = {
"levels_users_quota_used": (65.0, 85.00),
"levels_users_free_space": (256.0, 128.0)
},
check_ruleset_name="nextcloud_users",
)