185 lines
8.2 KiB
Python
185 lines
8.2 KiB
Python
#!/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":
|
|
levels_free_space = params["levels_free_space"]
|
|
levels_number_of_files = params["levels_number_of_files"]
|
|
status = section[key]["status"]
|
|
free_space = section[key]["freespace"]
|
|
version = section[key]["version"]
|
|
php_version = section[key]["php_version"]
|
|
webserver = section[key]["webserver"]
|
|
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))
|
|
|
|
# create overall result
|
|
summary = f"Status is {status}"
|
|
details = f"Nextcloud version: {version}\nPHP version: {php_version}\nWebserver: {webserver}\n\nNumber of files: {num_files}\nNumber of shares: {num_shares}\n\nFree space on disk: {render.bytes(free_space)}\n"
|
|
if status == "ok":
|
|
state = State.OK
|
|
else:
|
|
state = State.CRIT
|
|
yield Result(state=state, summary=summary, details=details)
|
|
|
|
# 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 = getStateLower((warn, crit), free_space)
|
|
# create graph for free space on disk
|
|
yield(Metric("nc_free_space", free_space, levels=(warn,crit)))
|
|
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 = getStateUpper((warn, crit), num_files)
|
|
notice = f"Number of files: {num_files}"
|
|
if state != State.OK:
|
|
yield(Result(state=state, notice=notice))
|
|
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_Freespace",
|
|
"NC_Status",
|
|
"NC_Webserver",
|
|
"NC_PHP_Version",
|
|
"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_Freespace":
|
|
parsed_data["nextcloud"]["freespace"] = float(value)
|
|
elif param == "NC_Status":
|
|
parsed_data["nextcloud"]["status"] = value
|
|
elif param == "NC_Webserver":
|
|
parsed_data["nextcloud"]["webserver"] = value
|
|
elif param == "NC_PHP_Version":
|
|
parsed_data["nextcloud"]["php_version"] = 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),
|
|
"levels_free_space": (8.0, 4.0),
|
|
"levels_number_of_files": (100000, 250000),
|
|
},
|
|
check_ruleset_name="nextcloud_info",
|
|
) |