98 lines
3.8 KiB
Python
98 lines
3.8 KiB
Python
|
#!/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",
|
||
|
)
|