2023-08-20 18:15:21 +02: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_mailcow_info ( section ) :
yield ( Service ( ) )
def check_mailcow_info ( params , section ) :
for key in section :
if key == " mailcow " :
2023-09-10 15:53:13 +02:00
# get thresholds
2023-08-20 18:15:21 +02:00
levels_num_domains = params [ " levels_num_domains " ]
levels_num_mailboxes = params [ " levels_num_mailboxes " ]
levels_num_global_messages = params [ " levels_num_global_messages " ]
2023-09-10 15:53:13 +02:00
levels_solr_size_kb = params [ " levels_solr_size " ]
2023-09-10 16:49:05 +02:00
# 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
2023-09-10 15:53:13 +02:00
levels_solr_size = ( levels_solr_size_warn , levels_solr_size_crit )
levels_solr_documents = params [ " levels_solr_documents " ]
2023-08-20 18:15:21 +02:00
version = section [ key ] [ " version " ]
num_domains = section [ key ] [ " num_domains " ]
num_mailboxes = section [ key ] [ " num_mailboxes " ]
num_global_messages = section [ key ] [ " num_global_messages " ]
2023-09-10 15:53:13 +02:00
solr_enabled = section [ key ] [ " solr_enabled " ]
solr_size = section [ key ] [ " solr_size " ]
solr_documents = section [ key ] [ " solr_documents " ]
2023-08-20 18:15:21 +02:00
# create graphs for number of domains, mailboxes and messages
2023-09-10 15:53:13 +02:00
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 ) )
2023-08-20 18:15:21 +02:00
# create overall result
summary = f " Version is { version } "
2023-09-10 15:53:13 +02:00
details = f " Mailcow version: { version } \n Number of domains: { num_domains } \n Number of mailboxes: { num_mailboxes } \n Number of messages: { num_global_messages } \n \n Solr size: { render . bytes ( solr_size ) } \n Number of Solr documents: { solr_documents } "
2023-08-20 18:15:21 +02:00
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 ) )
2023-09-10 15:53:13 +02:00
# 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 ) )
2023-08-20 18:15:21 +02:00
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 ] )
2023-09-10 15:53:13 +02:00
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 ] )
2023-08-20 18:15:21 +02:00
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
2023-09-10 15:53:13 +02:00
parsed_data [ " mailcow " ] [ " solr_enabled " ] = solr_enabled
parsed_data [ " mailcow " ] [ " solr_size " ] = solr_size
parsed_data [ " mailcow " ] [ " solr_documents " ] = solr_documents
2023-08-20 18:15:21 +02:00
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 ) ,
2023-09-10 15:53:13 +02:00
" levels_solr_size " : ( 4096.0 , 8192.0 ) ,
2023-09-10 16:49:05 +02:00
" levels_solr_documents " : ( 20000 , 40000 )
2023-08-20 18:15:21 +02:00
} ,
check_ruleset_name = " mailcow_info " ,
)