#!/usr/bin/env python3

from sys import argv, exit

from easysnmp import Session

try:
    hostname = argv[1]
    community = argv[2]
except IndexError:
    print('Usage: {} <hostname> <snmp_community>'.format(argv[0]))
    exit(3)

try:
    session = Session(hostname=hostname, community=community, version=2)

    items = session.walk('iso.3.6.1.2.1.33')

    result = {}
    for item in items:
        result[item.oid[len('iso.3.6.1.2.1.33')+1:]] = item.value

    warn = set()
    crit = set()

    if int(result['1.2.2.0']):
        warn.add('USV is on battery!')

    # Estimated runtime in minutes
    if int(result['1.2.3.0']) < 15:
        crit.add('Remaining runtime is less than 15 minutes! Only {} minutes left.'.format(result['1.2.3.0']))
    elif int(result['1.2.3.0']) < 25:
        warn.add('Remaining runtime is less than 25 minutes! Only {} minutes left.'.format(result['1.2.3.0']))

    # Battery status in percent
    if int(result['1.2.4.0']) < 10:
        crit.add('Remaining runtime is less than 10%! Only {}% left.'.format(result['1.2.4.0']))
    elif int(result['1.2.4.0']) < 25:
        warn.add('Remaining runtime is less than 25%! Only {}% left.'.format(result['1.2.4.0']))

    # Output load in percent
    if int(result['1.4.4.1.5.1']) > 90:
        crit.add('Output Power is more than 90% of rated capacity: {} W'.format(result['1.4.4.1.4.1']))
    elif int(result['1.4.4.1.5.1']) > 80:
        warn.add('Output Power is more than 80% of rated capacity: {} W'.format(result['1.4.4.1.4.1']))

    for line in sorted(crit):
        print(line)

    for line in sorted(warn):
        print(line)

    if crit:
        exit(2)
    elif warn:
        exit(1)
    else:
        print('{model} running{from_bat} at {out_pct}% load ({out_w} W), battery at {bat_pct}% ({bat_min} min)'.format(
            model=result['1.1.2.0'],
            out_pct=result['1.4.4.1.5.1'],
            out_w=result['1.4.4.1.4.1'],
            bat_pct=result['1.2.4.0'],
            bat_min=result['1.2.3.0'],
            from_bat=' from battery' if int(result['1.2.2.0']) else '',
        ))
        exit(0)
except Exception as e:
    print(repr(e))
    exit(3)
