summaryrefslogtreecommitdiffstats
path: root/Monitoring/plugins/nsca_client.py
diff options
context:
space:
mode:
Diffstat (limited to 'Monitoring/plugins/nsca_client.py')
-rwxr-xr-xMonitoring/plugins/nsca_client.py184
1 files changed, 184 insertions, 0 deletions
diff --git a/Monitoring/plugins/nsca_client.py b/Monitoring/plugins/nsca_client.py
new file mode 100755
index 00000000..76e551db
--- /dev/null
+++ b/Monitoring/plugins/nsca_client.py
@@ -0,0 +1,184 @@
+### This is a very quick and dirty code for David so he can work on its sikuli agent
+# and report as nsca the results.
+# This need to be clean a lot, it's still a server and should be a client class :)
+# I can do it after my "new baby holidays" are finished ;)
+# J.Gabes
+
+
+
+import time
+import select
+import socket
+import struct
+import sys
+import random
+
+
+def decrypt_xor(data, key):
+ keylen = len(key)
+ crypted = [chr(ord(data[i]) ^ ord(key[i % keylen])) for i in xrange(len(data))]
+ return ''.join(crypted)
+
+
+
+#Just print some stuff
+class NSCA_client():
+ def __init__(self, host, port, encryption_method, password):
+ self.host = host
+ self.port = port
+ self.encryption_method = encryption_method
+ self.password = password
+ self.rng = random.Random(password)
+
+
+ #Ok, main function that is called in the CONFIGURATION phase
+ def get_objects(self):
+ print "[Dummy] ask me for objects to return"
+ r = {'hosts' : []}
+ h = {'name' : 'dummy host from dummy arbiter module',
+ 'register' : '0',
+ }
+
+ r['hosts'].append(h)
+ print "[Dummy] Returning to Arbiter the hosts:", r
+ return r
+
+ def send_init_packet(self, socket):
+ '''
+ Build an init packet
+ 00-127 : IV
+ 128-131 : unix timestamp
+ '''
+ iv = ''.join([chr(self.rng.randrange(256)) for i in xrange(128)])
+ init_packet = struct.pack("!128sI", iv, int(time.mktime(time.gmtime())))
+ socket.send(init_packet)
+ return iv
+
+ def read_check_result(self, data, iv):
+ '''
+ Read the check result
+ 00-01 : Version
+ 02-05 : CRC32
+ 06-09 : Timestamp
+ 10-11 : Return code
+ 12-75 : hostname
+ 76-203 : service
+ 204-715 : output of the plugin
+ 716-720 : padding
+ '''
+ if len(data) != 720:
+ return None
+
+ if self.encryption_method == 1:
+ data = decrypt_xor(data,self.password)
+ data = decrypt_xor(data,iv)
+
+ (version, pad1, crc32, timestamp, rc, hostname_dirty, service_dirty, output_dirty, pad2) = struct.unpack("!hhIIh64s128s512sh",data)
+ hostname = hostname_dirty.partition("\0", 1)[0]
+ service = service_dirty.partition("\0", 1)[0]
+ output = output_dirty.partition("\0", 1)[0]
+ return (timestamp, rc, hostname, service, output)
+
+ def post_command(self, timestamp, rc, hostname, service, output):
+ '''
+ Send a check result command to the arbiter
+ '''
+ if len(service) == 0:
+ extcmd = "[%lu] PROCESS_HOST_CHECK_RESULT;%s;%d;%s\n" % (timestamp,hostname,rc,output)
+ else:
+ extcmd = "[%lu] PROCESS_SERVICE_CHECK_RESULT;%s;%s;%d;%s\n" % (timestamp,hostname,service,rc,output)
+
+ print "want to send", extcmd
+
+ #e = ExternalCommand(extcmd)
+ #self.from_q.put(e)
+
+
+ # When you are in "external" mode, that is the main loop of your process
+ def main(self):
+ #self.set_exit_handler()
+ self.interrupted = False
+ backlog = 5
+ size = 8192
+ server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ #server.setblocking(0)
+ server.connect((self.host, self.port))
+ #server.listen(backlog)
+ input = [server]
+ databuffer = {}
+ IVs = {}
+
+ init = server.recv(size)
+ print "got init", init
+
+ #init_packet = struct.pack("!128sI",iv,int(time.mktime(time.gmtime())))
+ (iv, t) = struct.unpack("!128sI",init)
+ print "IV", iv
+ print "T", t
+
+ version = 0
+ pad1 = 0
+ crc32= 0
+ timestamp = int(time.time())
+ rc = 2
+ hostname_dirty = "moncul"
+ service_dirty = "fonctionnne"
+ output_dirty = "blablalba"
+ pad2=0
+ '''
+ Read the check result
+ 00-01 : Version
+ 02-05 : CRC32
+ 06-09 : Timestamp
+ 10-11 : Return code
+ 12-75 : hostname
+ 76-203 : service
+ 204-715 : output of the plugin
+ 716-720 : padding
+ '''
+ init_packet = struct.pack("!hhIIh64s128s512sh", version, pad1, crc32, timestamp, rc, hostname_dirty, service_dirty, output_dirty, pad2)
+ print "Create packent len", len(init_packet)
+ #(version, pad1, crc32, timestamp, rc, hostname_dirty, service_dirty, output_dirty, pad2) = struct.unpack("!hhIIh64s128s512sh",data)
+
+ data = decrypt_xor(init_packet,iv)
+ data = decrypt_xor(data,self.password)
+
+
+ server.send(data)
+ sys.exit(0)
+
+ while not self.interrupted:
+ print "Loop"
+ inputready,outputready,exceptready = select.select(input,[],[], 1)
+
+ for s in inputready:
+ if s == server:
+ # handle the server socket
+ #client, address = server.accept()
+ iv = self.send_init_packet(client)
+ IVs[client] = iv
+ input.append(client)
+ else:
+ # handle all other sockets
+ data = s.recv(size)
+ if s in databuffer:
+ databuffer[s] += data
+ else:
+ databuffer[s] = data
+ if len(databuffer[s]) == 720:
+ # end-of-transmission or an empty line was received
+ (timestamp, rc, hostname, service, output)=self.read_check_result(databuffer[s],IVs[s])
+ del databuffer[s]
+ del IVs[s]
+ self.post_command(timestamp,rc,hostname,service,output)
+ try:
+ s.shutdown(2)
+ except Exception , exp:
+ print exp
+ s.close()
+ input.remove(s)
+
+
+
+nsca = NSCA_client('localhost', 5667, 1, 'toto')
+nsca.main()