#! /usr/bin/env python import argparse import sys import socket import random import time CODE_OK = 0 CODE_WARN = 1 CODE_CRITICAL = 2 CODE_UNKNOWN = 3 def main(args): # setup ping query and random identifier query = [0,0,0,0] ident = random.sample(range(0,255),8) # load default values if not passed as arguments if args.timeout: timeout = args.timeout else: timeout = 10 if args.port: port = args.port else: port = 64738 # open socket and send ping request start = time.time() sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.settimeout(timeout) try: sock.sendto(bytes(query+ident), (args.hostname, port)) except: print("MURMUR CRITICAL - Could not send UDP ping request") sys.exit(CODE_CRITICAL) try: data, addr = sock.recvfrom(24) except: print("MURMUR CRITICAL - No response from server") sys.exit(CODE_CRITICAL) end = time.time() if data[4:12]==bytes(ident): delay = round(end-start, 3) print("MURMUR OK - %s second response time | users=%s max=%s bandwidth=%sB" % (delay, int.from_bytes(data[12:16]), int.from_bytes(data[16:20]), int.from_bytes(data[20:24])/8)) #print("Murmur version %s.%s" % (int.from_bytes(data[0:2]), data[2])) else: print("MURMUR WARN - Identification code did not match") sys.exit(CODE_WARN) sys.exit(CODE_OK) if __name__ == '__main__': parser = argparse.ArgumentParser(\ description='Murmur (Mumble server) UDP ping checker for Nagios') parser.add_argument('-H', '--hostname', help='Hostname to check', required=True) parser.add_argument('-p', '--port', help='Server port') parser.add_argument('-t', '--timeout', help='Timeout in seconds') args = parser.parse_args() main(args)