diff options
Diffstat (limited to 'Reaktor/UDP')
-rw-r--r-- | Reaktor/UDP/README | 52 | ||||
-rw-r--r-- | Reaktor/UDP/config | 15 | ||||
-rwxr-xr-x | Reaktor/UDP/index | 94 |
3 files changed, 161 insertions, 0 deletions
diff --git a/Reaktor/UDP/README b/Reaktor/UDP/README new file mode 100644 index 00000000..587c8046 --- /dev/null +++ b/Reaktor/UDP/README @@ -0,0 +1,52 @@ +# Specifications +From 2011-09-16: +## Use Case + [ + { + "port": 1337, + "pattern": "XXYY", + "comment" : "does the right thing", + "action" : { + "POST": { + "url" : "xyz", + "data" : "abc" + } + } + } + ] +## Head definition + { + "bind_addr" : "127.0.0.1", + "port" : 1234, + "pattern" : "XXZZ", + "action" : { }, + } +bind is an optional entry which lets the user define a bind address for the server. +terminator is optional which lets the user define the EOM terminator. + +## Actions +### POST +"POST" : { + "url" : "http://euer.krebsco.de/", + "data" : "{ \"something\" : \"else\" }" + } + +### PROCESS +Process is taken from //hyper/process/test/bc.json - rev:a7fd3f + +stdout/stderr are optional and if left away data will be written to real stdout/stderr +in the process in envp => "payload" will be allocated for the given payload from the network + + "PROCESS" : { + { + "path": "/usr/bin/bc", + "argv": [ + "bc" + ], + "envp": { + "was": "geht", + }, + "stdout": "uri:///path/to/somewhere", + "stderr": "uri:///path/to/somewhere" + } + } diff --git a/Reaktor/UDP/config b/Reaktor/UDP/config new file mode 100644 index 00000000..623c721c --- /dev/null +++ b/Reaktor/UDP/config @@ -0,0 +1,15 @@ +[ + { + "comment" : "listener for licht.shack", + "bind_addr" : "0.0.0.0", + "port" : 2342, + "pattern" : "", + "action" : { + "PROCESS" : { + "path" : "/krebs/Reaktor/udp_commands/licht_resolver", + "argv" : [ ], + "envp" : { } + } + } + } +] diff --git a/Reaktor/UDP/index b/Reaktor/UDP/index new file mode 100755 index 00000000..ffe3d6b1 --- /dev/null +++ b/Reaktor/UDP/index @@ -0,0 +1,94 @@ +#!/usr/bin/python + +import asyncore, socket +import logging,subprocess +import re +import json +log = logging.getLogger('ubot') + +def enable_syslog(logger): + import logging.handlers as handlers + from logging import Formatter + hdlr = handlers.SysLogHandler( + facility=handlers.SysLogHandler.LOG_DAEMON) + formatter = Formatter( + '%(filename)s: %(levelname)s: %(message)s') + hdlr.setFormatter(formatter) + logger.addHandler(hdlr) + +from twisted.internet.protocol import DatagramProtocol +from twisted.internet import reactor +from twisted.application.internet import MulticastServer +from socket import SOL_SOCKET,SO_BROADCAST +class ubot(DatagramProtocol): +# def startProtocol(self): +# log.info("Starting Listener for Multicast") +# self.transport.joinGroup("255.255.255.255") + + """ UDP Bot """ + def startProtocol(self): + log.info("starting Protocol at host (%s)" % self.bind_addr) + #self.transport. + if self.bind_addr != "255.255.255.255": + self.transport.joinGroup(self.bind_addr) + else: + self.transport.socket.setsockopt(SOL_SOCKET,SO_BROADCAST,True) + def __init__(self, pattern,action,bind_addr,**kwargs): + #DatagramProtocol.__init__(self) + self.data = '' + self.pattern = pattern + self.action = action + self.bind_addr = bind_addr + + def datagramReceived(self,datagram,addr): + self.data = datagram + log.debug('<< %s' % self.data) + if self.find_pattern(): + self.start_action() + + def find_pattern(self): + """ returns true if own pattern is found""" + log.debug("Pattern is %s" %self.pattern) + ret = re.search(self.pattern,self.data) + if ret: + log.info("Match \"%s\" with pattern \"%s\"" % ((ret.string.strip()),self.pattern)) + else: + log.info("No Match") + return ret + + + def start_action(self): + """ runs all the defined actions""" + log.debug("Actions: %s" % str(self.action)) + self.start_process() + self.start_post() + + def start_process(self): + try: + act = self.action["PROCESS"] + proc = [] + proc.append(act["path"]) + proc.extend(act["argv"]) + + env = act["envp"] + env["payload"] = json.dumps(self.data) + log.info("Starting Process: %s (env: %s)" % (proc,env)) + subprocess.Popen(proc,env=env) + except Exception as e: + log.error(e) + def start_post(self): + pass + +def load_conf(conf_file): + return json.load(open(conf_file)) + + +if __name__ == "__main__": + import os + #enable_syslog(log) + HERE = os.path.dirname(os.path.realpath(__file__)) + lol = logging.DEBUG if os.environ.get('debug',False) else logging.INFO + logging.basicConfig(level=lol) + for i in load_conf("%s/config" %HERE): + reactor.listenMulticast(i["port"], ubot(**i)) + reactor.run() |