#!/usr/bin/env python # # Nagios check to verify signal level of nanostation5 # # Based on check_signal # # By Richard van Mansom # # High range for error level SPEED_CRITICAL = 6 SPEED_WARNING = 12 # Fixed NS5/NS2 Noise floor 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 numbers=[] cmd="snmpwalk -Ov -v 1 -c public %s %s" % (host, oid) cmd=cmd.split() output = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0].split() for signal in output: try: numbers.append(int(signal)) except: continue if len(numbers) == 1: return numbers[0] if len(numbers) == 2: return numbers[0] if len(numbers) == 3: return numbers[0] return int() def getLinkSpeed(host): output = False if not output: output = snmpwalk(host, '.1.3.6.1.4.1.14988.1.1.1.2.1.9') if not output: output = snmpwalk(host, '.1.3.6.1.4.1.14988.1.1.1.2.1.9.0.21.109.236') if not output: output = snmpwalk(host, '.1.3.6.1.4.1.14988.1.1.1.2.1.8.0.39') return output def main(host): try: speed = getLinkSpeed(host)/1000000 if speed == 0: return ("UNKNOWN: Speed: %s Mbit/s" % speed, ERRNO.UNKNOWN) elif speed <= SPEED_CRITICAL: return ("CRITICAL: Speed: %s Mbit/s" % speed, ERRNO.CRITICAL) elif speed <= SPEED_WARNING : return ("WARNING: Speed: %s Mbit/s" % speed, ERRNO.WARNING) else: return ("OK: Speed: %s Mbit/s" % speed, ERRNO.OK) 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)