import util
from errors import *
+from events import *
def getAllInterfaces():
filters = ("lo", "any")
iface.start()
while True:
- if not self.queue.is_alive():
+ if not self.queue.isAlive():
self.log.critical("Queue thread died unexpectedly.")
return
for iface in self.__interfaces:
- if not iface.is_alive():
+ if not iface.isAlive():
self.log.critical("Thread died unexpectedly. %s" % iface.dev)
return
time.sleep(60)
self.queue.shutdown()
+ @property
+ def db(self):
+ return self.queue.db
+
class Interface(Thread):
heartbeat = 0.1
self.promisc = promisc
self.queue = self.cappie.queue
- self.db = Database(self)
-
self.log.debug("Created new interface %s" % self.dev)
self.__running = True
for key, val in p.items():
self.log.debug(" %s: %s" % (key, val))
- if not self.db.has(p["source_address"]):
- self.db.put(p["source_address"], "SOURCE_IP_ADDRESS", p["source_ip_address"])
+ self._handlePacket(p)
def run(self):
self.log.info("Starting interface %s" % self.dev)
util.setprocname("interface %s" % self.dev)
- self.db.open()
-
p = pcapy.open_live(self.dev, self.mtu, self.promisc, 0)
p.setfilter(self.filter)
#p.loop(0, self._callback)
p.setnonblock(1)
while True:
if not self.__running:
- self.db.close()
return
if p.dispatch(1, self._callback):
def filter(self):
return "arp or rarp"
+ def addEvent(self, event):
+ return self.cappie.queue.add(event)
-class Database(object):
- def __init__(self, interface):
- self.interface = interface
- self.dev = self.interface.dev
- self.log = self.interface.log
-
- self.__data = {}
-
- def open(self):
- self.log.debug("Opened database for %s" % self.dev)
-
- def close(self):
- self.log.debug("Closing database for %s" % self.dev)
- print self.__data
-
- def get(self, mac):
- if self.has(mac):
- return self.__data[mac]
-
- def has(self, mac):
- return self.__data.has_key(mac)
-
- def put(self, mac, key, val):
- if not self.has(mac):
- self.__data[mac] = {}
-
- # TODO Check key for sanity
+ def _handlePacket(self, packet):
+ if packet.operation == OPERATION_RESPONSE:
+ self.addEvent(EventResponseTrigger(self, packet))
+ #self.addEvent(EventCheckDuplicate(self, packet))
- self.__data[mac][key] = val
+ elif packet.operation == OPERATION_REQUEST:
+ self.addEvent(EventRequestTrigger(self, packet))