def __init__(self, main_loop_f, port, on_datagram_received_f, task_interval=0.1, floodbarrier_active=True): threading.Thread.__init__(self) self.daemon = True self._lock = threading.RLock() self._running = False self._call_asap_queue = [] self._next_main_loop_call_ts = 0 # call immediately self._capturing = False self._captured = [] self._main_loop_f = main_loop_f self._port = port self._on_datagram_received_f = on_datagram_received_f self.task_interval = task_interval self.floodbarrier_active = floodbarrier_active if self.floodbarrier_active: self.floodbarrier = FloodBarrier() self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.s.settimeout(self.task_interval) my_addr = ('', self._port) self.s.bind(my_addr)
def __init__(self, task_interval=0.1, floodbarrier_active=True): threading.Thread.__init__(self) self.setDaemon(True) self.stop_flag = False self._lock = threading.RLock() self.task_interval = task_interval self.floodbarrier_active = floodbarrier_active self.tasks = TaskManager() if self.floodbarrier_active: self.floodbarrier = FloodBarrier()
def test(self): fb = FloodBarrier(checking_period=.4, max_packets_per_period=4, blocking_period=1) for ip in ts.IPS: for _ in xrange(4): assert not fb.ip_blocked(ip) # Every ip is on the limit assert fb.ip_blocked(ts.IPS[0]) assert fb.ip_blocked(ts.IPS[1]) # 0 and 3 blocked time.sleep(.2) # Half a period gone assert fb.ip_blocked(ts.IPS[0]) # IP 0 refreshes the blocking (extra .2 seconds) time.sleep(.2) # The initial floods are forgotten # IP 0,1,3 are blocked assert fb.ip_blocked(ts.IPS[0]) # The blocking doesn't get refreshed now (.8 secs to expire) assert fb.ip_blocked(ts.IPS[1]) # The blocking doesn't get refreshed (.6 secs to expire) assert not fb.ip_blocked(ts.IPS[2]) time.sleep(.7) # IP 0 is the only one still blocked (it got refreshed) assert fb.ip_blocked(ts.IPS[0]) assert not fb.ip_blocked(ts.IPS[1]) assert not fb.ip_blocked(ts.IPS[2]) assert not fb.ip_blocked(ts.IPS[3]) time.sleep(.4) for ip in ts.IPS: for _ in xrange(4): assert not fb.ip_blocked(ip) time.sleep(.4) for ip in ts.IPS: for _ in xrange(4): assert not fb.ip_blocked(ip)