def __init__(self, aggregator): """ ConntrackSource @param aggregator: Aggregator to use. """ super(ConntrackSource, self).__init__() self.aggregator = aggregator self.listener = EventListener(self.event_callback, NFCT_T_DESTROY, NFCT_O_PLAIN) self.listener.start() self._running = False self.events = []
def __init__(self, interval=1, rawfile=None): """ Create new ConntrackLogger object. @param interval: interval in seconds to syncronize data with database @param rawfile: file object to put raw statistics """ #super(ConntrackLogger, self).__init__() self.rawfile = rawfile self.interval = int(interval) self.listener = EventListener(self.event_callback, NFCT_T_DESTROY, NFCT_O_PLAIN) self.listener.start() self._running = False self.events = [] logging.debug('Conntrack logger initialized! interval=%d' % interval)
class ConntrackLogger(object): """ ConntrackLogger """ def __init__(self, interval=1, rawfile=None): """ Create new ConntrackLogger object. @param interval: interval in seconds to syncronize data with database @param rawfile: file object to put raw statistics """ #super(ConntrackLogger, self).__init__() self.rawfile = rawfile self.interval = int(interval) self.listener = EventListener(self.event_callback, NFCT_T_DESTROY, NFCT_O_PLAIN) self.listener.start() self._running = False self.events = [] logging.debug('Conntrack logger initialized! interval=%d' % interval) def run(self): self._running = True self.loop() def loop(self): """ Main loop. """ logging.debug('Main loop started!') try: while self._running or self.events: t0 = time() events = self.events self.events = [] if events: t1 = time() logging.info('processing %d events...' % len(events)) with transaction.commit_on_success(): if events: for event in events: self.handle_event(event) reset_queries() logging.info('processed %d events in %.1f seconds' % (len(events), time() - t1)) if self._running and t0 < time(): sleep(self.interval - time() % self.interval) except: traceback.print_exc() self.stop() def raw_stat(self, *args): if not self.rawfile is None: self.rawfile.write(":".join(*args)+"\n") def handle_event(self, event): proto, d_in, d_out = parse_plaintext_event(event) fields = set(('src', 'dst', 'bytes')) if not (fields.issubset(d_in) and fields.issubset(d_out)): logging.warning('incomplete event: "%s"' % event) return self.raw_stat(int(time()), proto, d_in['src'], d_in.get('sport', '0'), d_in['dst'], d_in.get('dport', 0), d_in['bytes'], d_out['bytes']) handled = False session = self.get_session(d_in['src']) if not session is None: handled = True self.update_session(session, d_in, d_out) session = self.get_session(d_out['src']) if not session is None: handled = True self.update_session(session, d_out, d_in) if handled is False: logging.warning('unhandled connection: "%s"' % event) def get_session(self, src): try: return Session.objects.get(src=src, dt_finish=None) except Session.DoesNotExist: return None def get_record(self, session, dst): return Record.objects.get_or_create(session=session, dst=dst)[0] def update_session(self, session, d_in, d_out): logging.debug('updating %s -> %s: %s %s' % (d_in['src'], d_in['dst'], d_in['bytes'], d_out['bytes'])) rec = self.get_record(session, d_in['dst']) rec.traf_in += int(d_in['bytes']) rec.traf_out += int(d_out['bytes']) rec.save() def stop(self): """ Stop main loop. """ self.listener.stop() self._running = False def event_callback(self, event): """ Callback for Netfilter netlink interface. """ self.events.append(event)
class ConntrackSource(EventSource): """ ConntrackSource """ def __init__(self, aggregator): """ ConntrackSource @param aggregator: Aggregator to use. """ super(ConntrackSource, self).__init__() self.aggregator = aggregator self.listener = EventListener(self.event_callback, NFCT_T_DESTROY, NFCT_O_PLAIN) self.listener.start() self._running = False self.events = [] def run(self): self._running = True self.loop() def loop(self): """ Main loop. """ while self._running or self.events: events = self.events self.events = [] for event in events: event = str(event, 'utf-8').split() proto = event[1] event = [ i.split('=') for i in event if '=' in i ] c_in, c_out = dict(event[:6]), dict(event[6:]) self.aggregator.add_connection(int(time()), proto, c_in['src'], c_in['sport'], c_in['dst'], c_in['dport'], c_in['bytes'], c_out['bytes']) if self._running and not self.events: sleep(1.0) def stop(self): """ Stop main loop. """ self.listener.stop() self._running = False def event_callback(self, event): """ Callback for Netfilter netlink interface. """ self.events.append(event)