예제 #1
0
파일: sources.py 프로젝트: ei-grad/pytralog
    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 = []
예제 #2
0
    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)
예제 #3
0
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)
예제 #4
0
파일: sources.py 프로젝트: ei-grad/pytralog
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)