#!/usr/bin/python import sys from threading import Thread import socket import bson import shlex import subprocess import os LISTEN_IP=os.environ['MESHIP'] LISTEN_PORT=8124 IFACE=os.environ['WLANMESH'] RESPONSE_IP=os.environ['MONIP'] RESPONSE_PORT=8125 class CNCType: TRACE = 'traceroute' PING = 'ping' def debugOut(str): DEBUG = True if DEBUG: print str def sendCCResponse(dict, send_ip, send_port): c = bson.dumps(dict) b = bson.loads(c) debugOut('\nsending to %s:%s' % (send_ip, send_port)) debugOut('packet: %s' % b) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.sendto(c,(send_ip, send_port)) def performTraceRoute( end_ip): # need to add code to actually do a trace route, you get the picture though return traceips(end_ip) def performPing(start_ip, end_ip): # need to add code to actually do a ping, you get the picture though return {"ping": "complete"} def parseCNC(packet_string, send_addr='127.0.0.1', send_port=RESPONSE_PORT): packet_data = bson.loads(packet_string) try: s = packet_data['cmd'] print 'parseCNC %s' % s responder = CNCResponderThread(packet_data, send_addr, send_port) responder.run() except KeyError: print '\nInvalid CNC Packet recieved (No cmd key in dict): \n\t%s' % packet_data #trace route def traceips(dest): args = ["traceroute", dest, "-4", "-F", "-m", "50", "-n"] #use -i when in larger interface p = subprocess.Popen(args, stdout=subprocess.PIPE) r = p.communicate()[0] p.wait() a = [] for line in r.split('\n')[1:]: piece = line.split(); if len(piece) > 0: a.append(piece[1]) return a # listen for CNC packets class CNCListenerThread(Thread): def __init__(self, iface=IFACE, ip = LISTEN_IP, port = LISTEN_PORT): Thread.__init__(self, name='CNCListener') self.iface = iface self.ip = ip self.port = port self.done = False def stop(self): self.done = 1; def run(self): debugOut("Listening to CNC Packets from %s %s:%s" % (self.iface, self.ip, self.port) ) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setblocking(0) sock.bind((self.ip, self.port)) while not self.done: try: data = sock.recv(1024) print "received message:", bson.loads(data) parseCNC(data) except socket.error: pass except KeyboardInterrupt: self.stop() # # Thread created when we need to respond to CNCRequest class CNCResponderThread(Thread): def __init__(self, data, ip = RESPONSE_IP, port = RESPONSE_PORT): Thread.__init__(self, name='CNCResponder') self.ip = ip self.port = port self.data = data def run(self): packet_type = self.data['cmd'] if ( packet_type == CNCType.PING): debugOut("performing ping and doing stuff") sendCCResponse({'cmd': 'ping', 'id':2, "data": {"latency":"20"}}, self.ip, self.port) elif ( packet_type == CNCType.TRACE): debugOut("performing traceroute and doing stuff") args = self.data['args'] hops = performTraceRoute(args['dest']) hops.insert(0, self.ip) sendCCResponse({'cmd': 'traceroute', 'id': self.data['id'], "data" : {"hops": hops}}, self.ip, self.port) def main(): reciever = CNCListenerThread() reciever.start() #stay in a while loop until killed try: while 1: pass except KeyboardInterrupt: pass reciever.stop() if __name__ == '__main__': main()