137 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#!/usr/bin/env python3
 | 
						|
# pylint: disable=missing-module-docstring, unused-argument, missing-function-docstring
 | 
						|
# pylint: disable=line-too-long, too-many-locals
 | 
						|
 | 
						|
from time import time
 | 
						|
from pprint import pprint
 | 
						|
 | 
						|
from cmk.utils import debug
 | 
						|
 | 
						|
from cmk.agent_based.v2 import (
 | 
						|
    AgentSection,
 | 
						|
    CheckPlugin,
 | 
						|
    CheckResult,
 | 
						|
    Metric,
 | 
						|
    render,
 | 
						|
    Result,
 | 
						|
    Service,
 | 
						|
    State,
 | 
						|
    StringTable,
 | 
						|
    DiscoveryResult,
 | 
						|
)
 | 
						|
 | 
						|
 | 
						|
def get_state_upper(levels, value):
 | 
						|
    warn, crit = levels
 | 
						|
    if value >= crit:
 | 
						|
        return State.CRIT
 | 
						|
    if value >= warn:
 | 
						|
        return State.WARN
 | 
						|
    return State.OK
 | 
						|
 | 
						|
 | 
						|
def get_state_lower(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) -> DiscoveryResult:
 | 
						|
    for key in section:
 | 
						|
        yield Service(item=key)
 | 
						|
 | 
						|
 | 
						|
def check_nextcloud_users(item, params, section) -> CheckResult:
 | 
						|
    if debug.enabled():
 | 
						|
        pprint(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)
 | 
						|
    _level_type, levels_quota_used = params["levels_users_quota_used"]
 | 
						|
    _level_type, 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 = get_state_lower((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 = get_state_upper(levels_quota_used, quota_used_percent)
 | 
						|
    yield Result(state=state, summary=summary, details=details)
 | 
						|
 | 
						|
 | 
						|
def parse_nextcloud_users(string_table: StringTable) -> dict:
 | 
						|
    # 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_quota = int(line[4])
 | 
						|
        if quota_quota == -3:
 | 
						|
            # TBD, no quota set for user
 | 
						|
            pass
 | 
						|
        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
 | 
						|
 | 
						|
 | 
						|
agent_section_nextcloud_users = AgentSection(
 | 
						|
    name="nextcloud_users",
 | 
						|
    parse_function=parse_nextcloud_users,
 | 
						|
)
 | 
						|
 | 
						|
check_plugin_nextcloud_users = CheckPlugin(
 | 
						|
    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": ("fixed", (65.0, 85.0)),
 | 
						|
        "levels_users_free_space": ("fixed", (256.0, 128.0)),
 | 
						|
    },
 | 
						|
    check_ruleset_name="nextcloud_users",
 | 
						|
)
 |