#!/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_mailcow_info(section): yield(Service()) def check_mailcow_info(params, section): for key in section: if key == "mailcow": # get thresholds levels_num_domains = params["levels_num_domains"] levels_num_mailboxes = params["levels_num_mailboxes"] levels_num_global_messages = params["levels_num_global_messages"] levels_solr_size_kb = params["levels_solr_size"] # Levels for Solr size are given in MBytes, so convert it to bytes levels_solr_size_warn = levels_solr_size_kb[0] * 1024 * 1024 levels_solr_size_crit = levels_solr_size_kb[1] * 1024 * 1024 levels_solr_size = (levels_solr_size_warn, levels_solr_size_crit) levels_solr_documents = params["levels_solr_documents"] version = section[key]["version"] num_domains = section[key]["num_domains"] num_mailboxes = section[key]["num_mailboxes"] num_global_messages = section[key]["num_global_messages"] solr_enabled = section[key]["solr_enabled"] solr_size = section[key]["solr_size"] solr_documents = section[key]["solr_documents"] # create graphs for number of domains, mailboxes and messages yield(Metric("mc_num_domains", num_domains, levels=levels_num_domains)) yield(Metric("mc_num_mailboxes", num_mailboxes, levels=levels_num_mailboxes)) yield(Metric("mc_num_global_messages", num_global_messages, levels=levels_num_global_messages)) # create graphs for solr size and number of solr documents if solr_enabled: yield(Metric("mc_solr_size", solr_size, levels=levels_solr_size)) yield(Metric("mc_solr_documents", solr_documents, levels=levels_solr_documents)) # create overall result summary = f"Version is {version}" details = f"Mailcow version: {version}\nNumber of domains: {num_domains}\nNumber of mailboxes: {num_mailboxes}\nNumber of messages: {num_global_messages}\n\nSolr size: {render.bytes(solr_size)}\nNumber of Solr documents: {solr_documents}" yield Result(state=State.OK, summary=summary, details=details) # Create result for number of domains warn, crit = levels_num_domains state = getStateUpper((warn, crit), num_domains) notice = f"Number of domains: {num_domains}" if state != State.OK: yield(Result(state=state, notice=notice)) # Create result for number of mailboxes warn, crit = levels_num_mailboxes state = getStateUpper((warn, crit), num_mailboxes) notice = f"Number of mailboxes: {num_mailboxes}" if state != State.OK: yield(Result(state=state, notice=notice)) # Create result for number of global messages warn, crit = levels_num_global_messages state = getStateUpper((warn, crit), num_global_messages) notice = f"Number of messages: {num_global_messages}" if state != State.OK: yield(Result(state=state, notice=notice)) # Create result for solr size and solr number of documents if solr_enabled: warn, crit = levels_solr_size state = getStateUpper((warn, crit), solr_size) notice = f"Solr size: {render.bytes(solr_size)}" if state != State.OK: yield(Result(state=state, notice=notice)) warn, crit = levels_solr_documents state = getStateUpper((warn, crit), solr_documents) notice = f"Number of Solr documents: {solr_documents}" if state != State.OK: yield(Result(state=state, notice=notice)) else: state = State.WARN notice = f"Solr is disabled" yield(Result(state=state, notice=notice)) def parse_mailcow_info_section(string_table): parsed_data = { "mailcow" : {}, } # we expect only one line line = string_table[0] version = line[0] num_domains = int(line[1]) num_mailboxes = int(line[2]) num_global_messages = int(line[3]) solr_enabled = bool(line[4]) # solr size comes with value and unit, unfortunately solr_size_str = line[5] solr_size_list = solr_size_str.split() solr_size_unit = solr_size_list[1] solr_size = float(solr_size_list[0]) if solr_size_unit == "KB": solr_size = solr_size * 1024.0 elif solr_size_unit == "MB": solr_size = solr_size * 1024.0 * 1024.0 elif solr_size_unit == "GB": solr_size = solr_size * 1024.0 * 1024.0 * 1024.0 solr_documents = int(line[6]) parsed_data["mailcow"]["version"] = version parsed_data["mailcow"]["num_domains"] = num_domains parsed_data["mailcow"]["num_mailboxes"] = num_mailboxes parsed_data["mailcow"]["num_global_messages"] = num_global_messages parsed_data["mailcow"]["solr_enabled"] = solr_enabled parsed_data["mailcow"]["solr_size"] = solr_size parsed_data["mailcow"]["solr_documents"] = solr_documents return parsed_data register.agent_section( name="mailcow_info", parse_function=parse_mailcow_info_section, ) register.check_plugin( name="mailcow_info", service_name="Mailcow Info", discovery_function=discover_mailcow_info, check_function=check_mailcow_info, check_default_parameters={ "levels_num_domains": (100, 200), "levels_num_mailboxes": (500, 1000), "levels_num_global_messages": (100000, 250000), "levels_solr_size": (4096.0, 8192.0), "levels_solr_documents": (20000, 40000) }, check_ruleset_name="mailcow_info", )