#!/usr/bin/env python3
# -*- coding: utf-8; py-indent-offset: 4 -*-
#
# Author:  Linuxfabrik GmbH, Zurich, Switzerland
# Contact: info (at) linuxfabrik (dot) ch
#          https://www.linuxfabrik.ch/
# License: The Unlicense, see LICENSE file.

# https://github.com/Linuxfabrik/monitoring-plugins/blob/main/CONTRIBUTING.md

"""See the check's README for more details.
"""

import argparse  # pylint: disable=C0413
import sys  # pylint: disable=C0413

import lib.base  # pylint: disable=C0413
import lib.librenms  # pylint: disable=C0413
import lib.version  # pylint: disable=C0413
from lib.globals import STATE_OK, STATE_UNKNOWN  # pylint: disable=C0413

__author__ = 'Linuxfabrik GmbH, Zurich/Switzerland'
__version__ = '2024032903'

DESCRIPTION = '''This check displays LibreNMS instance information, using
                 its API. This is not a "is there a new version out there"
                 check as LibreNMS is capable of updating itself
                 (if running the Git version).'''

DEFAULT_INSECURE = False
DEFAULT_NO_PROXY = False
DEFAULT_TIMEOUT = 3
DEFAULT_URL = 'http://localhost'


def parse_args():
    """Parse command line arguments using argparse.
    """
    parser = argparse.ArgumentParser(description=DESCRIPTION)

    parser.add_argument(
        '-V', '--version',
        action='version',
        version='%(prog)s: v{} by {}'.format(__version__, __author__)
    )

    parser.add_argument(
        '--insecure',
        help='This option explicitly allows to perform "insecure" SSL '
             'connections. '
             'Default: %(default)s',
        dest='INSECURE',
        action='store_true',
        default=DEFAULT_INSECURE,
    )

    parser.add_argument(
        '--no-proxy',
        help='Do not use a proxy. '
             'Default: %(default)s',
        dest='NO_PROXY',
        action='store_true',
        default=DEFAULT_NO_PROXY,
    )

    parser.add_argument(
        '--timeout',
        help='Network timeout in seconds. '
             'Default: %(default)s (seconds)',
        dest='TIMEOUT',
        type=int,
        default=DEFAULT_TIMEOUT,
    )

    parser.add_argument(
        '--token',
        help='LibreNMS API token',
        dest='TOKEN',
        required=True,
    )

    parser.add_argument(
        '--url',
        help='LibreNMS API URL. '
             'Default: %(default)s',
        dest='URL',
        default=DEFAULT_URL,
    )

    return parser.parse_args()


def main():
    """The main function. Hier spielt die Musik.
    """

    # parse the command line, exit with UNKNOWN if it fails
    try:
        args = parse_args()
    except SystemExit:
        sys.exit(STATE_UNKNOWN)

    # init some vars
    msg = ''
    state = STATE_OK
    perfdata = ''

    # return LibreNMS instance information
    result = lib.librenms.get_data(args, '/api/v0/system')
    result = result['system'][0]

    # since 22.7.0-33:
    # {
    #     "local_ver": "24.2.0",
    #     "local_sha": "f3627462242a7ee711742fcbff5f61786e93bf62",
    #     "local_date": "2024-02-27T19:54:10+01:00",
    #     "local_branch": "HEAD",
    #     "db_schema": "2024_02_07_151845_custom_map_additions (290)",
    #     "php_ver": "8.1.27",
    #     "python_ver": "3.6.8",
    #     "database_ver": "MariaDB 10.6.17-MariaDB",
    #     "rrdtool_ver": "1.7.0",
    #     "netsnmp_ver": "5.8"
    # }


    msg += 'LibreNMS {}'.format(result['local_ver'])
    if 'local_branch' in result:
        msg += ' (Git: {})'.format(result['local_branch'])
    msg += ', '
    msg += 'DB-Schema {}, '.format(result['db_schema'])
    try:
        msg += '{}, '.format(result['database_ver'])
    except:
        msg += '{}, '.format(result['mysql_ver'])
    msg += 'Net-SNMP {}, '.format(result['netsnmp_ver'])
    msg += 'PHP {}, '.format(result['php_ver'])
    msg += 'Python {}, '.format(result['python_ver'])
    msg += 'RRD-Tool {}'.format(result['rrdtool_ver'])

    perfdata += lib.base.get_perfdata('librenms-version', lib.version.version2float(result['local_ver']), None, None, None, 0, None) # pylint: disable=C0301
    try:
        perfdata += lib.base.get_perfdata('db-version', lib.version.version2float(result['database_ver']), None, None, None, 0, None) # pylint: disable=C0301
    except:
        perfdata += lib.base.get_perfdata('db-version', lib.version.version2float(result['mysql_ver']), None, None, None, 0, None) # pylint: disable=C0301
    perfdata += lib.base.get_perfdata('netsnmp-version', lib.version.version2float(result['netsnmp_ver']), None, None, None, 0, None) # pylint: disable=C0301
    perfdata += lib.base.get_perfdata('php-version', lib.version.version2float(result['php_ver']), None, None, None, 0, None) # pylint: disable=C0301
    perfdata += lib.base.get_perfdata('python-version', lib.version.version2float(result['python_ver']), None, None, None, 0, None) # pylint: disable=C0301
    perfdata += lib.base.get_perfdata('rrdtool-version', lib.version.version2float(result['rrdtool_ver']), None, None, None, 0, None) # pylint: disable=C0301

    # over and out
    lib.base.oao(msg, state, perfdata)


if __name__ == '__main__':
    try:
        main()
    except Exception:   # pylint: disable=W0703
        lib.base.cu()
