66 lines
1.7 KiB
Python
Executable File
66 lines
1.7 KiB
Python
Executable File
#! /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 = float(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)
|