#!/usr/bin/env python3
# -*- encoding: utf-8; py-indent-offset: 4 -*-

#<<<mikrotik_ppp>>>
#.id *80000950
#name My-SSTP-Session-1
#service sstp
#caller-id 1.2.3.4
#address 172.16.1.10
#uptime 3w3d3h4m44s
#encoding AES256-CBC
#session-id 0x81000950
#limit-bytes-in 0
#limit-bytes-out 0
#radius false
#.id *80000E58
#name My-SSTP-Session-5
#service sstp
#caller-id 5.6.7.8
#address 172.16.1.36
#uptime 6d4h25m17s
#encoding AES256-CBC
#session-id 0x81000E58
#limit-bytes-in 0
#limit-bytes-out 0
#radius false

# import api
from cmk.agent_based.v2 import AgentSection, CheckPlugin, Metric, Result, Service, State, StringTable

# factory settings:
mikrotik_ppp_factory_settings = {
    "uptime"          : (2000, 5000),
    "output_metrics" : False
}

# parse function
def parse_mikrotik_ppp(string_table: StringTable):

    # we'll return this later
    data = {}

    # loop thru
    for line in string_table:
        
        # handle a related line
        if line[0] == 'name':
            pppsession = str(line[1])
            data[pppsession] = {}

        if line[0] == 'caller-id':
            data[pppsession]['callerid'] = str(line[1])

        if line[0] == 'address':
            data[pppsession]['address'] = str(line[1])

        if line[0] == 'uptime':
            data[pppsession]['uptime'] = str(line[1])

        if line[0] == 'service':
            data[pppsession]['service'] = str(line[1])

    return data

# discovery function
def discover_mikrotik_ppp(section):
    for key in list(section):
        yield Service(item=key)

# check function
def check_mikrotik_ppp(item, params, section):
    if item not in section:
        return

    data = section.get(item)

    mysummary = ""
    service = data['service'].upper()
    callerid = data['callerid']
    address = data['address']
    uptime = data['uptime']

    # TODO adding alarm thresholds for uptime?

    mysummary = "%s Session %s, caller-id: %s, address: %s, uptime: %s" % (service, item, callerid, address, uptime)

    yield Result(state = State.OK, summary = mysummary)

# register parse function
agent_section_mikrotik_ppp = AgentSection(
    name                = "mikrotik_ppp",
    parse_function      = parse_mikrotik_ppp,
)

# register check
check_plugin_mikrotik_ppp = CheckPlugin(
    name                     = "mikrotik_ppp",
    service_name             = "PPP Session %s",
    discovery_function       = discover_mikrotik_ppp,
    check_function           = check_mikrotik_ppp,
    check_ruleset_name       = "mikrotik_ppp",
    check_default_parameters = mikrotik_ppp_factory_settings,
)