#!/usr/bin/python
# -*- encoding: utf-8; py-indent-offset: 4 -*-
# +------------------------------------------------------------------+
# |             ____ _               _        __  __ _  __           |
# |            / ___| |__   ___  ___| | __   |  \/  | |/ /           |
# |           | |   | '_ \ / _ \/ __| |/ /   | |\/| | ' /            |
# |           | |___| | | |  __/ (__|   <    | |  | | . \            |
# |            \____|_| |_|\___|\___|_|\_\___|_|  |_|_|\_\           |
# |                                                                  |
# | Copyright Mathias Kettner 2014             mk@mathias-kettner.de |
# +------------------------------------------------------------------+
#
# This file is part of Check_MK.
# The official homepage is at http://mathias-kettner.de/check_mk.
#
# check_mk is free software;  you can redistribute it and/or modify it
# under the  terms of the  GNU General Public License  as published by
# the Free Software Foundation in version 2.  check_mk is  distributed
# in the hope that it will be useful, but WITHOUT ANY WARRANTY;  with-
# out even the implied warranty of  MERCHANTABILITY  or  FITNESS FOR A
# PARTICULAR PURPOSE. See the  GNU General Public License for more de-
# tails. You should have  received  a copy of the  GNU  General Public
# License along with GNU Make; see the file  COPYING.  If  not,  write
# to the Free Software Foundation, Inc., 51 Franklin St,  Fifth Floor,
# Boston, MA 02110-1301 USA.

# For legacy reasons
blade_bx_fan_default_error_levels = (20, 10)    # percentages or errors!


factory_settings['blade_bx_powerfan_default_levels'] = {
        "levels_lower" : ( 20, 10 ),
        "levels"       : ( 80, 90 ),
}


blade_bx_status = {
    "1" : "unknown",
    "2" : "disabled",
    "3" : "ok",
    "4" : "fail",
    "5" : "prefailure-predicted",
    "6" : "redundant-fan-failed",
    "7" : "not-manageable",
    "8" : "not-present",
    "9" : "not-available"
}


def inventory_blade_bx_powerfan(info):
    for status, descr, rpm, max_speed, speed, ctrlstate in info:
        if status != "8":
            yield descr, {}


def check_blade_bx_powerfan(item, params, info):
    if type(params) == dict:
        warn_perc_lower, crit_perc_lower = params['levels_lower']
        warn_perc, crit_perc             = params['levels']
    else:
        warn_perc_lower, crit_perc_lower = params
        warn_perc, crit_perc             = None, None

    for status, descr, rpm, max_speed, speed, ctrlstate in info:
        if descr == item:
            speed_perc = float(rpm) * 100 / float(max_speed)
            perfdata   = [
                ('perc', speed_perc, warn_perc_lower, crit_perc_lower, "0", "100" ),
                ('rpm', rpm )]

            if ctrlstate != "2":
                return 2, "Fan not present or poweroff", perfdata
            elif status != "3":
                return 2, "Status: %s" % blade_bx_status[status], perfdata
            else:
                state = 0
                infotext = "Speed at %s RPM, %.1f%% of max" % (rpm, speed_perc)
                levels_text = ""
                if speed_perc < crit_perc_lower:
                    state = 2
                    levels_text = " (warn/crit below %.1f%%/%.1f%%)" % \
                                    (warn_perc_lower, crit_perc_lower)
                elif speed_perc < warn_perc_lower:
                    state = 1
                    levels_text = " (warn/crit below %.1f%%/%.1f%%)" % \
                                    (warn_perc_lower, crit_perc_lower)

                if warn_perc:
                    if speed_perc >= crit_perc:
                        state = 2
                        levels_text = " (warn/crit at %.1f%%/%.1f%%)" % \
                                        (warn_perc, crit_perc)
                    elif speed_perc >= warn_perc:
                        state = 1
                        levels_text = " (warn/crit at %.1f%%/%.1f%%)" % \
                                        (warn_perc, crit_perc)

                if state > 0:
                    infotext += levels_text

                return state, infotext, perfdata


check_info['blade_bx_powerfan'] = {
    "check_function"          : check_blade_bx_powerfan,
    "inventory_function"      : inventory_blade_bx_powerfan,
    "service_description"     : "Blade Cooling %s",
    "has_perfdata"            : True,
    "group"                   : "hw_fans_perc",
    "default_levels_variable" : "blade_bx_powerfan_default_levels",
    "snmp_info"               : (".1.3.6.1.4.1.7244.1.1.1.3.3.1.1", [
                                    "2", #status
                                    "3", #desc
                                    "4", #rpm
                                    "5", #max_speed
                                    "6", #speed
                                    "7", # ctrlstate
   ]),
   "snmp_scan_function" : lambda oid: "BX600" in oid(".1.3.6.1.2.1.1.1.0") \
                            or oid(".1.3.6.1.2.1.1.2.0") == ".1.3.6.1.4.1.7244.1.1.1",
}

