All pastes #903932 Raw Edit

GeofC

public text v1 · immutable
·published 2008-02-14 16:24 UTC
rendered paste body
#!/usr/bin/env python2.5
# -*- coding: utf-8 -*-
#
# PyCorr - An IDS correlation system written in Python
#
# Copyright (C) 2008  Geoffroy Cécile <geocecile@gmail.com>
# Copyright (C) 2008  Julien Montois <>
# Copyright (C) 2008  Olivier Tétard <toutoune25@free.fr>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.

import os
import sys
import getopt
import traceback

__version__ = "0.0.1-dev"
__svn_version__ = "$Id: pycorr-daemon.py 88 2008-02-14 14:50:10Z toutoune25 $"

try:
    from connector import *
except Exception, err:
    print err
    sys.exit(1)

from alert import *

# Debugging levels
DEBUG_ERR = 0
DEBUG_WARN = 1
DEBUG_INFO = 2

class PyCorrDaemon:
    def __init__(self, host, debug, visu):
        self.host = host
        self.debug = debug
        self.visu = visu

        self.print_debug("Enabling debbuging (level %s)" % self.debug, DEBUG_INFO)
        self.print_debug("Host to connect to: %s" % host, DEBUG_INFO)
        self.print_debug("Version: %s" % __version__, DEBUG_INFO)
        self.alert_processor = AlertProcessor(self)
        self.connector = PreludeEasyConnector(host, self.alert_processor, debug)
        self.connaaa()
        self.run()

	def connaaa(self):
		print "--------------------"

    def print_debug(self, str, log_level = DEBUG_ERR):
        '''Simply print a DEBUG line with the str message'''

        if log_level <= debug:

            if log_level == DEBUG_ERR:
                debug_level = "ERROR"
            elif log_level == DEBUG_WARN:
                debug_level = "WARNING"
            elif log_level == DEBUG_INFO:
                debug_level = "INFO"
            else:
                debug_level = "DEBUG"

            sys.stderr.write("[%s] %s\n" % (debug_level, str))
	
    def print_version(self):
        '''Print version number'''

        print __version__

    def run(self):
        try:
            while True:
                sys.stderr.write(".")
                sys.stderr.flush()
                idmef = self.connector.read_event()
                if idmef:
                    self.alert_processor.process(idmef)
                time.sleep(1)
        except KeyboardInterrupt, e:
            self.print_debug("Keyboard interruption detected: exiting", 2)
            self.exit()
        except Exception, e:
            self.print_debug("while processing alerts: %s" % e)

            if debug >= DEBUG_INFO:
                print "---------------------Traceback lines-----------------------"
                traceback.print_exc()
                print "-----------------------------------------------------------"
                self.exit()

    def exit(self):
        self.connector.disconnect_client()
        self.alert_processor.show_alert_tree()
        sys.exit(2)

def usage():
    str = u'''Usage: ./pycorr-daemon.py -H <prelude> -D -v
-h,  --help            Print this help
-H,  --hostname        Specifiy prelude-manager's address
-O,  --output 	       Specify output visualisation
-D,  --debug=[1-2]     Enable debugging, you could specify the debug level
-v,  --version         Print version number
'''
    sys.stderr.write(str)


if __name__ == "__main__":
    argv = os.sys.argv
    argc = len(argv)

    try:
        opts, args = getopt.getopt(argv[1:], "hH:vD", ["help", "hostname=", "output=", "version", "debug="])
    except getopt.GetoptError:
        usage()
        sys.exit(2)

    # Default values for parameters
    debug = DEBUG_ERR
    host = None

    # Parse parameters
    for o, a in opts:
        if o in ("-h", "--help"):
            usage()
            sys.exit(0)

        if o in ("-v", "--version"):
            print "PyCorr %s (%s)" % (__version__, __svn_version__)
            sys.exit(0)

        if o in ("-D", "--debug"):
            debug = DEBUG_WARN

            try:
                debug = int(a)
            except:
                pass
        
        if o in ("-O", "--output"):
        	visu = a

        if o in ("-H", "--hostname"):
            host = a

    if host == None:
        usage()
        sys.exit(2)

    # Finally, init PyCorr
    PyCorrDaemon(host, debug, visu)