#!/usr/bin/env python # # Nagios check to verify signal level of nanostation5 # # Based on check_remoteneighbor # # By Richard van Mansom # OK = 15 WARNING = 10 OFFSET = -96 from collections import defaultdict from pysnmp.entity.rfc3413.oneliner import cmdgen from pysnmp.proto.rfc1902 import OctetString from gettext import gettext as _ import argparse import logging import operator import socket import sys import subprocess logging.basicConfig(level=logging.INFO) logger = logging.getLogger() class ERRNO(): OK = 0 WARNING = 1 CRITICAL = 2 UNKNOWN = 3 def snmpwalk(host, oid): # Failed: Script Exception - [] BULK PDU not implemented at cmd="snmpwalk -Ov -v 1 -c public %s %s" % (host, oid) cmd=cmd.split() output = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0].split() try: if output[0] == "End": return int() return int(output[1]) except: return int() def getSignal(host): output = snmpwalk(host, '.1.3.6.1.4.1.14988.1.1.1.2.1.3.0.21.109.112.84') if not output: output = snmpwalk(host, '.1.3.6.1.4.1.14988.1.1.1.2.1.3') if not output: output = snmpwalk(host, '.1.3.6.1.4.1.14988.1.1.1.1.1.4') return output def main(host): try: signal = getSignal(host) if signal == 0: return ("UNKNOWN: Signal: %s" % signal, ERRNO.UNKNOWN) signal2 = (OFFSET - signal) * -1 if signal2 > OK : return ("OK: Signal: %s" % signal, ERRNO.OK) if signal2 > WARNING : return ("WARNING: Signal: %s" % signal, ERRNO.WARNING) return ("CRITICAL: Signal: %s" % signal, ERRNO.CRITICAL) except socket.gaierror as e: return ("Failed: SNMP for host cannot be queried - %s" % e, ERRNO.CRITICAL) except Exception as e: return ("Failed: Script Exception - [%s] %s" % (type(e),e), ERRNO.CRITICAL) if __name__ == '__main__': class NagiosArgumentParser(argparse.ArgumentParser): ''' Like exit code 128 on errors''' def error(self, message): self.print_usage(sys.stderr) self.exit(128, _('%s: error: %s\n') % (self.prog, message)) parser = NagiosArgumentParser( description='Nagios Check InterLinks via SNMP.', formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('-g', dest='debug', action='store_true', default=False, help="Set logging to debug") parser.add_argument('host', action='store', type=str, help="Hostname to use") args = parser.parse_args() if args.debug: logger.setLevel(logging.DEBUG) (msg, errno) = main(args.host) sys.stdout.write(msg + "\n") sys.exit(errno)