#!/usr/bin/python
# -*- encoding: utf-8; py-indent-offset: 4 -*-
# +------------------------------------------------------------------+
# |             ____ _               _        __  __ _  __           |
# |            / ___| |__   ___  ___| | __   |  \/  | |/ /           |
# |           | |   | '_ \ / _ \/ __| |/ /   | |\/| | ' /            |
# |           | |___| | | |  __/ (__|   <    | |  | | . \            |
# |            \____|_| |_|\___|\___|_|\_\___|_|  |_|_|\_\           |
# |                                                                  |
# | Copyright Mathias Kettner 2015             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.


def parse_fortigate_sslvpn(info):
    parsed = {}
    for domain_name, domain_info in zip(info[0], info[1]):
        parsed[domain_name[0]] = {
            "state": domain_info[0],
            "users": int(domain_info[1]),
            "web_sessions": int(domain_info[2]),
            "tunnels": int(domain_info[3]),
            "tunnels_max": int(domain_info[4])
        }
    return parsed


@get_parsed_item_data
def check_fortigate_sslvpn(_item, params, data):
    if params is None:
        params = {}

    fn_bool_state = {"1": "disabled", "2": "enabled"}
    yield 0, "%s" % fn_bool_state[data["state"]]

    yield check_levels(data["users"],
                       "active_vpn_users",
                       None,
                       infoname="Users",
                       human_readable_func=str)

    yield check_levels(data["web_sessions"],
                       "active_vpn_websessions",
                       None,
                       infoname="Web sessions",
                       human_readable_func=str)

    tunnel_status, infotext, tunnel_perf = check_levels(
        data["tunnels"],
        "active_vpn_tunnels",
        params.get("tunnel_levels"),
        infoname="Tunnels",
        human_readable_func=str,
    )

    if len(tunnel_perf[0]) == 2:  # no values for warn and crit
        perf_boundaries = (None, None, 0, data["tunnels_max"])
    else:
        perf_boundaries = (0, data["tunnels_max"])
    tunnel_perf[0] += perf_boundaries  # because check_levels does not include min, max

    yield tunnel_status, infotext, tunnel_perf


check_info["fortigate_sslvpn"] = {
    "inventory_function": discover(),
    "check_function": check_fortigate_sslvpn,
    "parse_function": parse_fortigate_sslvpn,
    "service_description": "VPN SSL %s",
    "has_perfdata": True,
    "group": "fortigate_sslvpn",
    "snmp_scan_function": lambda oid: ".1.3.6.1.4.1.12356.101.1" in oid(".1.3.6.1.2.1.1.2.0"),
    "snmp_info": [
        (".1.3.6.1.4.1.12356.101.3.2.1.1", [2]),
        (
            ".1.3.6.1.4.1.12356.101.12.2.3.1",
            [
                1,  # fgVpnSslState
                2,  # fgVpnSslStatsLoginUsers
                4,  # fgVpnSslStatsActiveWebSessions
                6,  # fgVpnSslStatsActiveTunnels
                7,  # fgVpnSslStatsMaxTunnels
            ]),
    ]
}
