2023-03-11 14:29:54 +01:00
#!/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 " :
2023-03-23 13:15:32 +01:00
levels_free_space = params [ " levels_free_space " ]
levels_number_of_files = params [ " levels_number_of_files " ]
2023-03-11 14:29:54 +01:00
status = section [ key ] [ " status " ]
2023-03-23 13:15:32 +01:00
free_space = section [ key ] [ " freespace " ]
2023-03-11 14:29:54 +01:00
version = section [ key ] [ " version " ]
2023-03-23 13:15:32 +01:00
php_version = section [ key ] [ " php_version " ]
webserver = section [ key ] [ " webserver " ]
2023-03-11 14:29:54 +01:00
num_files = section [ key ] [ " number_files " ]
num_shares = section [ key ] [ " number_shares " ]
2023-03-23 13:15:32 +01:00
2023-03-11 14:29:54 +01:00
# create graph for number of files and shares
yield ( Metric ( " nc_num_files " , num_files ) )
yield ( Metric ( " nc_num_shares " , num_shares ) )
2023-03-23 13:15:32 +01:00
# create overall result
2023-03-11 14:29:54 +01:00
summary = f " Status is { status } "
2023-03-23 13:15:32 +01:00
details = f " Nextcloud version: { version } \n PHP version: { php_version } \n Webserver: { webserver } \n \n Number of files: { num_files } \n Number of shares: { num_shares } \n \n Free space on disk: { render . bytes ( free_space ) } \n "
2023-03-11 14:29:54 +01:00
if status == " ok " :
state = State . OK
else :
state = State . CRIT
yield Result ( state = state , summary = summary , details = details )
2023-03-23 13:15:32 +01:00
# 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 ) )
2023-03-11 14:29:54 +01:00
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 \n Active users last 5 min: { num_active_last5min } \n Active user since last hour: { num_active_last1hour } \n Active 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 } \n Number 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 } \n Number 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 " ,
2023-03-23 13:15:32 +01:00
" NC_Freespace " ,
2023-03-11 14:29:54 +01:00
" NC_Status " ,
2023-03-23 13:15:32 +01:00
" NC_Webserver " ,
" NC_PHP_Version " ,
2023-03-11 14:29:54 +01:00
" 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
2023-03-23 13:15:32 +01:00
elif param == " NC_Freespace " :
parsed_data [ " nextcloud " ] [ " freespace " ] = float ( value )
2023-03-11 14:29:54 +01:00
elif param == " NC_Status " :
parsed_data [ " nextcloud " ] [ " status " ] = value
2023-03-23 13:15:32 +01:00
elif param == " NC_Webserver " :
parsed_data [ " nextcloud " ] [ " webserver " ] = value
elif param == " NC_PHP_Version " :
parsed_data [ " nextcloud " ] [ " php_version " ] = value
2023-03-11 14:29:54 +01:00
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 ) ,
2023-03-23 13:15:32 +01:00
" levels_free_space " : ( 8.0 , 4.0 ) ,
" levels_number_of_files " : ( 100000 , 250000 ) ,
2023-03-11 14:29:54 +01:00
} ,
check_ruleset_name = " nextcloud_info " ,
2023-08-08 09:12:08 +02:00
)