2023-03-11 14:29:54 +01:00
#!/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
2023-03-23 13:15:32 +01:00
#print(free_space)
2023-03-11 14:29:54 +01:00
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 } ' \n Last login: { last_login_human } ( { last_login_since } ago) \n Free 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 " ,
2023-08-08 09:12:08 +02:00
)