#!/usr/bin/env python3
# Copyright (C) 2019 Checkmk GmbH - License: GNU General Public License v2
# This file is part of Checkmk (https://checkmk.com). It is subject to the terms and
# conditions defined in the file COPYING, which is part of this source code package.

# Author: Markus Lengler <ml@lengler-it.de>

# Example outputs from agent:
#
# <<<dmraid>>>
# name   : isw_ebdabbedfh_system
# status : ok
# /dev/sda: isw, "isw_ebdabbedfh", GROUP, ok, 976773166 sectors, data@ 0 Model: WDC WD5002ABYS-5
# /dev/sdb: isw, "isw_ebdabbedfh", GROUP, ok, 976773166 sectors, data@ 0 Model: WDC WD5002ABYS-5


from cmk.base.check_api import LegacyCheckDefinition
from cmk.base.config import check_info

from cmk.agent_based.v2 import StringTable


def inventory_dmraid_ldisks(info):
    return [(line[2], None) for line in info if line[0] == "name"]


def inventory_dmraid_pdisks(info):
    return [(line[0].split(":")[0], None) for line in info if line[0].startswith("/dev/sd")]


def check_dmraid_pdisks(item, _no_params, info):
    for line in info:
        if line[0].startswith("/dev/sd"):
            disk = line[0].split(":")[0]
            if disk == item:
                status = line[4].split(",")[0]
                if status == "ok":
                    pos = line.index("Model:")
                    model = " ".join(line[pos + 1 :])
                    return (0, "Online (%s)" % model)
                return (2, "Error on disk!!")
    return (2, "Missing disk!!")


def check_dmraid_ldisks(item, _no_params, info):
    LDISK_FOUND = False
    for line in info:
        if LDISK_FOUND:
            if line[0] == "status":
                status = line[2]
                if status == "ok":
                    return (0, "state is %s" % status)
                return (2, "%s" % status)
        if line[0] == "name" and line[2] == item:
            LDISK_FOUND = True

    return (3, "incomplete data from agent")


def parse_dmraid(string_table: StringTable) -> StringTable:
    return string_table


check_info["dmraid"] = LegacyCheckDefinition(
    parse_function=parse_dmraid,
)


check_info["dmraid.ldisks"] = LegacyCheckDefinition(
    service_name="RAID LDisk %s",
    sections=["dmraid"],
    discovery_function=inventory_dmraid_ldisks,
    check_function=check_dmraid_ldisks,
)

check_info["dmraid.pdisks"] = LegacyCheckDefinition(
    service_name="RAID PDisk %s",
    sections=["dmraid"],
    discovery_function=inventory_dmraid_pdisks,
    check_function=check_dmraid_pdisks,
)
