1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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()
|