Пример #1
0
class TestDatabaseHandlerEvents(unittest.TestCase):
    def setUp(self):
        self.db = DatabaseHandler('wids0')
        #self.db.storeEvent({'module':'UnitTestModule', 'datetime':0, 'name':'TestEvent', 'details':{}, 'uuids':['1234-1234-1234-1234'], 'packets':[0,1,2]})

    def cleanup(self):
        self.db.close()

    def test_event_get_all(self):
        count = self.db.getEvents(count=True)
        self.assertEqual(count, total_count)
        for event in self.db.getEvents():
            print(event.id, event.datetime, event.module, event.name,
                  event.details, event.uuids, event.packets)

    def test_event_get_filter_module(self):
        count = self.db.session.query(Event).filter(
            Event.module == 'DisassociationStormMonitor').count()
        self.assertEqual(count, 24)

    def test_event_get_mixfilter(self):
        count = self.db.session.query(Event).filter(
            Event.module == 'DisassociationStormMonitor').filter(
                Event.name ==
                'ZigbeeNWKCommandPayload Frame Detected').count()
        self.assertEqual(count, 24)
Пример #2
0
 def setUp(self):
     self.db = DatabaseHandler('event2', path='./')
     self.db.storeEvent({
         'module': 'UnitTestModule',
         'datetime': 0,
         'name': 'TestEvent',
         'details': {},
         'uuids': ['1234-1234-1234-1234'],
         'packets': [0, 1, 2]
     })
Пример #3
0
 def __init__(self, parameters=None, config=None):
     signal.signal(signal.SIGINT, self.SIGINT)
     self.config = WIDSConfig(parameters, config)
     self.config.daemon_pid = os.getpid()
     self.logutil = KBLogUtil(self.config.name, 'Daemon')
     self.database = DatabaseHandler(self.config.name)
     self.engine = None
     self.module_store = {}
     self.module_counter = 0
     self.task_store = {}
     self.task_counter = 0
     self.drone_store = {}
     self.drone_counter = 0
class TestDatabaseHandlerEvents(unittest.TestCase):
    def setUp(self):
        self.db = DatabaseHandler('event2', path='./')
        self.db.storeEvent({'module':'UnitTestModule', 'datetime':0, 'name':'TestEvent', 'details':{}, 'uuids':['1234-1234-1234-1234'], 'packets':[0,1,2]})

    def cleanup(self):
        self.db.close()

    def test_event_get_all(self):
        events = self.db.getEvents()

        for event in events:
            print(event.id, event.datetime, event.module, event.name, event.details, event.uuids, event.packets)
Пример #5
0
    def __init__(self, config):
        Process.__init__(self)
        self.name = 'RuleEngine'
        self.config = config
        self.database = DatabaseHandler(self.config.name)
        self.logutil = KBLogUtil(self.config.name, self.name)
        self.wids = WIDSClient(self.config.server_ip, self.config.server_port)
        self.active = None
        self.rules = []

        #///dev///
        self.rules.append(rule1)
Пример #6
0
class TestDatabaseHandlerEvents(unittest.TestCase):
    def setUp(self):
        self.db = DatabaseHandler('event2', path='./')
        self.db.storeEvent({
            'module': 'UnitTestModule',
            'datetime': 0,
            'name': 'TestEvent',
            'details': {},
            'uuids': ['1234-1234-1234-1234'],
            'packets': [0, 1, 2]
        })

    def cleanup(self):
        self.db.close()

    def test_event_get_all(self):
        events = self.db.getEvents()

        for event in events:
            print(event.id, event.datetime, event.module, event.name,
                  event.details, event.uuids, event.packets)
class TestDatabaseHandlerEvents(unittest.TestCase):
    def setUp(self):
        self.db = DatabaseHandler('wids0')
        #self.db.storeEvent({'module':'UnitTestModule', 'datetime':0, 'name':'TestEvent', 'details':{}, 'uuids':['1234-1234-1234-1234'], 'packets':[0,1,2]})

    def cleanup(self):
        self.db.close()

    def test_event_get_all(self):
        count = self.db.getEvents(count=True)
        self.assertEqual(count, total_count)
        for event in self.db.getEvents():
            print(event.id, event.datetime, event.module, event.name, event.details, event.uuids, event.packets)

    def test_event_get_filter_module(self):
        count = self.db.session.query(Event).filter(Event.module == 'DisassociationStormMonitor').count()
        self.assertEqual(count, 24)

    def test_event_get_mixfilter(self):
        count = self.db.session.query(Event).filter(Event.module == 'DisassociationStormMonitor').filter(Event.name == 'ZigbeeNWKCommandPayload Frame Detected').count()
        self.assertEqual(count, 24)
Пример #8
0
 def __init__(self, parameters=None, config=None):
     signal.signal(signal.SIGINT, self.SIGINT)
     self.config = WIDSConfig(parameters, config)
     self.config.daemon_pid = os.getpid()
     self.logutil = KBLogUtil(self.config.name, 'Daemon')
     self.database = DatabaseHandler(self.config.name)
     self.engine = None
     self.module_store = {}
     self.module_counter = 0
     self.task_store = {}
     self.task_counter = 0
     self.drone_store = {}
     self.drone_counter = 0
 def setUp(self):
     self.db = DatabaseHandler('packet', path='./')
class TestDatabaseHandlerPackets(unittest.TestCase):
    def setUp(self):
        self.db = DatabaseHandler('packet', path='./')

    def cleanup(self):
        self.db.close()

    def test_packet__get_all(self):
        count = self.db.getPackets(count=True)
        self.assertEqual(count, total_count)

    def test_packet_get_new_(self):
        # query packets WITHOUT new flag
        packets_1 = self.db.getPackets(maxcount=100)
        index_1a = packets_1[0].id
        index_1b = packets_1[-1].id
        packets_2 = self.db.getPackets(maxcount=100)
        index_2a = packets_2[0].id
        index_2b = packets_2[-1].id
        self.assertEqual(index_1a, 1)
        self.assertEqual(index_1b, 100)
        self.assertEqual(index_2a, 1)
        self.assertEqual(index_2b, 100)
        # query packets WITH new flag
        packets_1 = self.db.getPackets(maxcount=100, new=True)
        index_1a = packets_1[0].id
        index_1b = packets_1[-1].id
        packets_2 = self.db.getPackets(maxcount=100, new=True)
        index_2a = packets_2[0].id
        index_2b = packets_2[-1].id
        self.assertEqual(index_1a, 1)
        self.assertEqual(index_1b, 100)
        self.assertEqual(index_2a, 101)
        self.assertEqual(index_2b, 200)

    def test_packet_get_maxcount_(self):
        count = self.db.getPackets(maxcount=100, count=True)
        self.assertEqual(count, 100)

    def test_packet_get_t1_count(self):
        count = self.db.getPackets(uuidFilterList=[t1_uuid], count=True)    
        self.assertEqual(count, t1_count)

    def test_packet_get_t2_count(self):
        count = self.db.getPackets(uuidFilterList=[t2_uuid], count=True)    
        self.assertEqual(count, t2_count)

    def test_packet_filter_rssi_gt(self):
        count = self.db.getPackets(valueFilterList=[('rssi','>',78)], count=True)
        self.assertEqual(count, rssi_gt_78)

    def test_packet_filter_rssi_eq(self):
        count = self.db.getPackets(valueFilterList=[('rssi','==',78)], count=True)
        self.assertEqual(count, rssi_eq_78)

    def test_packet_filter_rssi_lt(self):
        count = self.db.getPackets(valueFilterList=[('rssi','<',78)], count=True)
        self.assertEqual(count, rssi_lt_78)

    def test_packet_filter_datetime(self):
        pass

    def test_packet_mix_filters(self):
        count = self.db.getPackets(valueFilterList=[('rssi','>',78)], uuidFilterList=[t1_uuid], count=True)
        self.assertEqual(count, 76)
Пример #11
0
class WIDSDaemon:

    def __init__(self, parameters=None, config=None):
        signal.signal(signal.SIGINT, self.SIGINT)
        self.config = WIDSConfig(parameters, config)
        self.config.daemon_pid = os.getpid()
        self.logutil = KBLogUtil(self.config.name, 'Daemon')
        self.database = DatabaseHandler(self.config.name)
        self.engine = None
        self.module_store = {}
        self.module_counter = 0
        self.task_store = {}
        self.task_counter = 0
        self.drone_store = {}
        self.drone_counter = 0

    def SIGINT(self, s, f):
        if self.config.daemon_pid == os.getpid():
            self.logutil.log('SIGINT')
            self.stopDaemon()

    def startDaemon(self):
        self.logutil.writePID()
        self.logutil.startlog()
        self.logutil.log('Starting Daemon')
        self.loadDrones()
        self.loadModules()
        self.startServer()

    def stopDaemon(self):
        self.logutil.log('Initiating Shutdown')
        self.unloadModules()
        self.unloadDrones()
        self.logutil.log('Successfull Shutdown')
        self.logutil.cleanup()
        sys.exit()

    def loadDrones(self):
        count = len(self.config.drones)
        self.logutil.log('Loading Drones (Found {0} Drones in the Config)'.format(count))
        for droneConfig in self.config.drones:
            self.loadDrone(droneConfig)

    def loadDrone(self, droneConfigDict):
        try:
            print(droneConfigDict)
            drone_ip = str(droneConfigDict.get('ip', None))
            drone_port = str(droneConfigDict.get('port', None))
            if drone_ip == None or drone_port == None:
                error = 'Error: Missing Parameter: "address"'
                self.logutil.log(error)
                return self.formatResponse(error, None)
            else:
                droneIndex = self.drone_counter
                droneObject = DroneContainer(droneIndex, drone_ip, drone_port)
                self.drone_store[droneIndex] = droneObject
                self.drone_counter += 1
                self.logutil.log('Loading Drone {0} - {1}:{2}'.format(droneIndex, drone_ip, drone_port))
                return self.formatResponse(None, None)
        except:
            self.handleException()

    def unloadDrones(self):
        self.logutil.log('Unloading Drones')
        self.logutil.log('Found {0} Active Drones'.format(len(self.drone_store)))
        for i in range(len(self.drone_store)):
            self.unloadDrone(i)

    def unloadDrone(self, droneIndexInt):
        try:
            droneObject = self.drone_store.get(droneIndexInt, None)
            if droneObject == None:
                error = 'Error: Drone with Index {0} does not exist'.format(droneIndexInt)
                self.logutil.log(error)
                return self.formatResponse(False, error)
            else:
                droneObject.release()
                self.logutil.log('Releasing Drone {0} - {1}:{2}'.format(droneIndexInt, droneObject.address, droneObject.port))
                del(self.drone_store[droneIndexInt])
                del(droneObject)
                return self.formatResponse(True, None)
        except:
            self.handleException()


    def taskDrone(self, taskConfigDict):
        try:
            droneIndexList = taskConfigDict.get('droneIndexList')
            for droneIndexInt in droneIndexList:
                droneObject = self.drone_store.get(droneIndexInt, None)
                task_uuid = taskConfigDict.get('uuid', None)
                task_plugin = taskConfigDict.get('plugin', None)
                task_channel = taskConfigDict.get('channel', None)
                task_parameters = taskConfigDict.get('parameters', None)
                module_index = taskConfigDict.get('module_index', None)
                if droneObject == None:
                    error = ec.ERROR_DRONE_InvalidDroneIndex
                    data = droneIndexInt
                    return (error,data)
                if task_uuid == None:
                    error = ec.ERROR_DRONE_MissingDroneTaskParameter
                    data = 'uuid'
                    return (error, data)
                if task_channel == None:
                    error = ec.ERROR_DRONE_MissingDroneTaskParameter
                    data = 'channel'
                    return (error, data)
                if task_plugin == None:
                    error = ec.ERROR_MissingDroneTaskParameter
                    data = 'plugin'
                    return (error, data)
                if task_parameters == None:
                    error = ec.ERROR_MissingDroneTaskParameter
                    data = 'parameters'
                    return (error, data)
                (data,error) = droneObject.api.task(task_plugin, task_channel, task_uuid, task_parameters) 
                if error == None:
                    self.task_store[self.task_counter] = TaskContainer(self.task_counter, task_uuid, task_plugin, task_channel, task_parameters, droneIndexList, module_index)
                    self.task_counter += 1
                return (data,error)
        except:
            self.handleException()


    def detaskDrone(self, droneIndexList, task_uuid):
        try:
            for int_DroneIndex in droneIndexList:
                droneObject = self.drone_store.get(int_DroneIndex, None)
                droneObject.api.detask(task_uuid)
        except Exception:
            self.handleException()


    def loadModules(self):
        count = len(self.config.modules)
        self.logutil.log('Loading Modules (Found {0} Modules in the Config)'.format(count))
        for moduleConfigDict in self.config.modules:
            self.loadModule(moduleConfigDict)
        pass

    def unloadModules(self):
        self.logutil.log('Unloading Modules')
        self.logutil.log('Found {0} Active Modules'.format(len(self.module_store)))
        for i in range(len(self.module_store)):
            self.unloadModule(i)

    def loadModuleClass(self, module):
        if module == 'BeaconRequestMonitor'       : return BeaconRequestMonitor
        if module == 'DisassociationStormMonitor' : return DisassociationStormMonitor
        if module == 'DosAesCtrMonitor'           : return DosAesCtrMonitor

    def loadModule(self, moduleConfigDict):
        self.logutil.debug('Loading Module: {0}'.format(moduleConfigDict))
        try:
            moduleName = moduleConfigDict.get('name', None)
            moduleSettings = moduleConfigDict.get('settings', None)
            moduleClass = self.loadModuleClass(moduleName)
            if moduleName == None:
                error = ec.ERROR_WIDS_MissingModuleParameter
                data = 'name'
                self.logutil.log('Failed to Load Module - Missing Parameter: "name" in {0}\n'.format(moduleConfigDict))
                return self.formatResponse(error,data)
            elif moduleSettings == None:
                error = ec.ERROR_WIDS_MissingModuleParameter
                data = 'settings'
                self.logutil.log('Failed to Load Module - Missing Parameter: "settings" in {0}\n'.format(moduleConfigDict))
                return self.formatResponse(error,data)
            elif moduleClass == None:
                error = ec.ERROR_WIDS_MissingModuleClass
                data = moduleName
                self.logutil.log('Failed to Load Module - Could not load class: {0}'.format(moduleName))
                return self.formatResponse(error,data)
            else:
                moduleIndex = self.module_counter
                moduleShutdownEvent = Event()
                moduleSettings['module_index'] = moduleIndex
                self.logutil.debug('Found module class: {0}'.format(moduleClass))
                '''
                (error,data) = moduleClass.validate_settings(moduleSettings) 
                if not error == None:
                    return self.formatResponse(error,data)
                '''
                moduleProcess = moduleClass(moduleSettings, self.config, moduleShutdownEvent)
                moduleProcess.start()
                moduleObject = ModuleContainer(moduleIndex, moduleName, moduleSettings, moduleProcess, moduleShutdownEvent)
                self.module_store[moduleIndex] = moduleObject
                self.module_counter += 1
                self.logutil.log('Loading Module {0} - {1}'.format(moduleIndex, moduleObject.name))
                return self.formatResponse(None, None)
        except:
            self.handleException()


    def unloadModule(self, moduleIndexInt):
        try:
            moduleObject = self.module_store.get(moduleIndexInt, None)
            if moduleObject == None:
                error = 'Error: Module with Index {0} does not exist'.format(moduleIndexInt)
                self.logutil.log(error)
                return self.formatResponse(False, error)
            else:
                self.logutil.log('Unloading Module {0} ({1} - {2})'.format(moduleIndexInt, moduleObject.name, moduleObject.process.pid))
                self.logutil.log('Detasking Module Tasks')
                for taskObject in self.task_store.values():
                    if taskObject.module_index == moduleObject.index:
                        drones = taskObject.drones
                        uuid = taskObject.uuid
                        self.logutil.log('Removing Task {0} from Drones {1}'.format(uuid, drones))
                        self.detaskDrone(drones, uuid)
                moduleObject.process.terminate()
                moduleObject.process.join()
                del(self.module_store[moduleIndexInt])
                del(moduleObject)
                return self.formatResponse(True, None)
        except:
            self.handleException()


    def startServer(self):
        self.logutil.log('Starting Server on port {0}'.format(self.config.server_port))
        app = flask.Flask(__name__)
        app.add_url_rule('/active',             None, self.processActiveGetRequest,         methods=['GET'] )
        app.add_url_rule('/status',             None, self.processStatusGetRequest,         methods=['GET'] )
        app.add_url_rule('/data/upload',        None, self.processDataUploadRequest,        methods=['POST'])
        app.add_url_rule('/data/download',      None, self.processDataDownloadRequest,      methods=['POST'])
        app.add_url_rule('/drone/task',         None, self.processDroneTaskRequest,         methods=['POST'])
        app.add_url_rule('/drone/detask',       None, self.processDroneDetaskRequest,       methods=['POST'])
        app.add_url_rule('/drone/add',          None, self.processDroneAddRequest,          methods=['POST'])
        app.add_url_rule('/drone/delete',       None, self.processDroneDeleteRequest,       methods=['POST'])
        app.add_url_rule('/alerts',             None, self.processAlertGetRequest,          methods=['POST'])
        app.add_url_rule('/alerts/generate',    None, self.processAlertGenerateRequest,     methods=['POST'])
        app.add_url_rule('/module/load',        None, self.processModuleLoadRequest,        methods=['POST'])
        app.add_url_rule('/module/unload',      None, self.processModuleUnloadRequest,      methods=['POST'])
        app.run(threaded=True, port=int(self.config.server_port))

    def handleException(self):
        etb = traceback.format_exc()
        self.logutil.trace(etb)
        return self.formatResponse(error=ec.ERROR_GENERAL_UnknownException, data=str(etb))

    def formatResponse(self, error, data):
        return json.dumps({'error':error, 'data':data})

    def processActiveGetRequest(self):
        self.logutil.debug('Processing Active Get Request')
        return self.formatResponse(error=None, data=True)

    def processDataUploadRequest(self):
        self.logutil.debug('Processing Data Upload Request')
        try:
            data = json.loads(flask.request.data)
            packetdata = data.get('pkt')
            self.database.storePacket(packetdata)
            return self.formatResponse(error=None, data=None)
        except Exception:
            return self.handleException()

    def processDataDownloadRequest(self):
        self.logutil.debug('Processing Data Upload Request')
        try:
            return self.formatResponse(error=None, data=None)
        except Exception:
            return self.handleException()

    def processDroneTaskRequest(self):
        self.logutil.debug('Processing Drone Task Request')
        try:
            request_data = json.loads(flask.request.data)
            (error,data) = self.taskDrone(request_data)
            return self.formatResponse(error,data)
        except Exception:
            return self.handleException()

    def processDroneDetaskRequest(self):
        self.logutil.debug('Processing Drone Detask Request')
        try:
            data = json.loads(flask.request.data)
            return self.detaskDrone(data)
        except Exception:
            return self.handleException()

    def processDroneAddRequest(self):
        self.logutil.debug('Processing Drone Add Request')
        try:
            data = json.loads(flask.request.data)
            return self.loadDrone(data)
        except Exception:
            return self.handleException()

    def processDroneDeleteRequest(self):
        self.logutil.debug('Processing Drone Delete Request')
        try:
            data = json.loads(flask.request.data)
            drone_index = int(data.get('drone_index'))
            return self.unloadDrone(drone_index)
        except:
            return self.handleException()

    def processModuleLoadRequest(self):
        self.logutil.debug('Processing Module Load Request')
        try:
            data = json.loads(flask.request.data)
            return self.loadModule(data)
        except:
            return self.handleException()

    def processModuleUnloadRequest(self):
        self.logutil.debug('Processing Module Unload Request')
        try:
            data = json.loads(flask.request.data)
            module_index = int(data.get('module_index'))
            return self.unloadModule(module_index)
        except:
            return self.handleException()

    def processAlertGenerateRequest(self):
        self.logutil.debug('Processing Alert Generate Request')
        try:
            data = json.loads(flask.request.data)
            alert_name = str(data.get('alert_name'))
            self.database.storeAlert(alert_name)
            return self.formatResponse(True, None) 
        except:
            return self.handleException()
        
    def processAlertGetRequest(self):
        #self.logutil.debug('Processing Alert Request')
        try:
            alerts = []
            for alert in self.database.session.query(Alert).all():
                alerts.append('{0} - {1}'.format(microToDate(alert.datetime), alert.name))
            return self.formatResponse(None, alerts)
        except:
            return self.handleException()

    def processStatusGetRequest(self):
        self.logutil.log('Processing Status Request')
        try:
            config = self.config.json()
            modules = list((module.json() for module in self.module_store.values()))
            tasks = list((task.json() for task in self.task_store.values()))
            rules = list((rule.json() for rule in self.rule_store.values()))
            drones = list((drone.json() for drone in self.drone_store.values()))
            status = {'config':config, 'modules':modules, 'tasks':tasks, 'drones':drones, 'rules':rules}
            return json.dumps({'success':True, 'data':status})
        except:
            return self.handleException()
Пример #12
0
 def setUp(self):
     self.db = DatabaseHandler('wids0')
Пример #13
0
 def setUp(self):
     self.db = DatabaseHandler('packet', path='./')
Пример #14
0
class TestDatabaseHandlerPackets(unittest.TestCase):
    def setUp(self):
        self.db = DatabaseHandler('packet', path='./')

    def cleanup(self):
        self.db.close()

    def test_packet__get_all(self):
        count = self.db.getPackets(count=True)
        self.assertEqual(count, total_count)

    def test_packet_get_new_(self):
        # query packets WITHOUT new flag
        packets_1 = self.db.getPackets(maxcount=100)
        index_1a = packets_1[0].id
        index_1b = packets_1[-1].id
        packets_2 = self.db.getPackets(maxcount=100)
        index_2a = packets_2[0].id
        index_2b = packets_2[-1].id
        self.assertEqual(index_1a, 1)
        self.assertEqual(index_1b, 100)
        self.assertEqual(index_2a, 1)
        self.assertEqual(index_2b, 100)
        # query packets WITH new flag
        packets_1 = self.db.getPackets(maxcount=100, new=True)
        index_1a = packets_1[0].id
        index_1b = packets_1[-1].id
        packets_2 = self.db.getPackets(maxcount=100, new=True)
        index_2a = packets_2[0].id
        index_2b = packets_2[-1].id
        self.assertEqual(index_1a, 1)
        self.assertEqual(index_1b, 100)
        self.assertEqual(index_2a, 101)
        self.assertEqual(index_2b, 200)

    def test_packet_get_maxcount_(self):
        count = self.db.getPackets(maxcount=100, count=True)
        self.assertEqual(count, 100)

    def test_packet_get_t1_count(self):
        count = self.db.getPackets(uuidFilterList=[t1_uuid], count=True)
        self.assertEqual(count, t1_count)

    def test_packet_get_t2_count(self):
        count = self.db.getPackets(uuidFilterList=[t2_uuid], count=True)
        self.assertEqual(count, t2_count)

    def test_packet_filter_rssi_gt(self):
        count = self.db.getPackets(valueFilterList=[('rssi', '>', 78)],
                                   count=True)
        self.assertEqual(count, rssi_gt_78)

    def test_packet_filter_rssi_eq(self):
        count = self.db.getPackets(valueFilterList=[('rssi', '==', 78)],
                                   count=True)
        self.assertEqual(count, rssi_eq_78)

    def test_packet_filter_rssi_lt(self):
        count = self.db.getPackets(valueFilterList=[('rssi', '<', 78)],
                                   count=True)
        self.assertEqual(count, rssi_lt_78)

    def test_packet_filter_datetime(self):
        pass

    def test_packet_mix_filters(self):
        count = self.db.getPackets(valueFilterList=[('rssi', '>', 78)],
                                   uuidFilterList=[t1_uuid],
                                   count=True)
        self.assertEqual(count, 76)
 def setUp(self):
     self.db = DatabaseHandler('wids0')
 def setUp(self):
     self.db = DatabaseHandler('event2', path='./')
     self.db.storeEvent({'module':'UnitTestModule', 'datetime':0, 'name':'TestEvent', 'details':{}, 'uuids':['1234-1234-1234-1234'], 'packets':[0,1,2]})
Пример #17
0
class WIDSDaemon:
    def __init__(self, parameters=None, config=None):
        signal.signal(signal.SIGINT, self.SIGINT)
        self.config = WIDSConfig(parameters, config)
        self.config.daemon_pid = os.getpid()
        self.logutil = KBLogUtil(self.config.name, 'Daemon')
        self.database = DatabaseHandler(self.config.name)
        self.engine = None
        self.module_store = {}
        self.module_counter = 0
        self.task_store = {}
        self.task_counter = 0
        self.drone_store = {}
        self.drone_counter = 0

    def SIGINT(self, s, f):
        if self.config.daemon_pid == os.getpid():
            self.logutil.log('SIGINT')
            self.stopDaemon()

    def startDaemon(self):
        self.logutil.writePID()
        self.logutil.startlog()
        self.logutil.log('Starting Daemon')
        self.loadDrones()
        self.loadModules()
        self.startServer()

    def stopDaemon(self):
        self.logutil.log('Initiating Shutdown')
        self.unloadModules()
        self.unloadDrones()
        self.logutil.log('Successfull Shutdown')
        self.logutil.cleanup()
        sys.exit()

    def loadDrones(self):
        count = len(self.config.drones)
        self.logutil.log(
            'Loading Drones (Found {0} Drones in the Config)'.format(count))
        for droneConfig in self.config.drones:
            self.loadDrone(droneConfig)

    def loadDrone(self, droneConfigDict):
        try:
            print(droneConfigDict)
            drone_ip = str(droneConfigDict.get('ip', None))
            drone_port = str(droneConfigDict.get('port', None))
            if drone_ip == None or drone_port == None:
                error = 'Error: Missing Parameter: "address"'
                self.logutil.log(error)
                return self.formatResponse(error, None)
            else:
                droneIndex = self.drone_counter
                droneObject = DroneContainer(droneIndex, drone_ip, drone_port)
                self.drone_store[droneIndex] = droneObject
                self.drone_counter += 1
                self.logutil.log('Loading Drone {0} - {1}:{2}'.format(
                    droneIndex, drone_ip, drone_port))
                return self.formatResponse(None, None)
        except:
            self.handleException()

    def unloadDrones(self):
        self.logutil.log('Unloading Drones')
        self.logutil.log('Found {0} Active Drones'.format(len(
            self.drone_store)))
        for i in range(len(self.drone_store)):
            self.unloadDrone(i)

    def unloadDrone(self, droneIndexInt):
        try:
            droneObject = self.drone_store.get(droneIndexInt, None)
            if droneObject == None:
                error = 'Error: Drone with Index {0} does not exist'.format(
                    droneIndexInt)
                self.logutil.log(error)
                return self.formatResponse(False, error)
            else:
                droneObject.release()
                self.logutil.log('Releasing Drone {0} - {1}:{2}'.format(
                    droneIndexInt, droneObject.address, droneObject.port))
                del (self.drone_store[droneIndexInt])
                del (droneObject)
                return self.formatResponse(True, None)
        except:
            self.handleException()

    def taskDrone(self, taskConfigDict):
        try:
            droneIndexList = taskConfigDict.get('droneIndexList')
            for droneIndexInt in droneIndexList:
                droneObject = self.drone_store.get(droneIndexInt, None)
                task_uuid = taskConfigDict.get('uuid', None)
                task_plugin = taskConfigDict.get('plugin', None)
                task_channel = taskConfigDict.get('channel', None)
                task_parameters = taskConfigDict.get('parameters', None)
                module_index = taskConfigDict.get('module_index', None)
                if droneObject == None:
                    error = ec.ERROR_DRONE_InvalidDroneIndex
                    data = droneIndexInt
                    return (error, data)
                if task_uuid == None:
                    error = ec.ERROR_DRONE_MissingDroneTaskParameter
                    data = 'uuid'
                    return (error, data)
                if task_channel == None:
                    error = ec.ERROR_DRONE_MissingDroneTaskParameter
                    data = 'channel'
                    return (error, data)
                if task_plugin == None:
                    error = ec.ERROR_MissingDroneTaskParameter
                    data = 'plugin'
                    return (error, data)
                if task_parameters == None:
                    error = ec.ERROR_MissingDroneTaskParameter
                    data = 'parameters'
                    return (error, data)
                (data, error) = droneObject.api.task(task_plugin, task_channel,
                                                     task_uuid,
                                                     task_parameters)
                if error == None:
                    self.task_store[self.task_counter] = TaskContainer(
                        self.task_counter, task_uuid, task_plugin,
                        task_channel, task_parameters, droneIndexList,
                        module_index)
                    self.task_counter += 1
                return (data, error)
        except:
            self.handleException()

    def detaskDrone(self, droneIndexList, task_uuid):
        try:
            for int_DroneIndex in droneIndexList:
                droneObject = self.drone_store.get(int_DroneIndex, None)
                droneObject.api.detask(task_uuid)
        except Exception:
            self.handleException()

    def loadModules(self):
        count = len(self.config.modules)
        self.logutil.log(
            'Loading Modules (Found {0} Modules in the Config)'.format(count))
        for moduleConfigDict in self.config.modules:
            self.loadModule(moduleConfigDict)
        pass

    def unloadModules(self):
        self.logutil.log('Unloading Modules')
        self.logutil.log('Found {0} Active Modules'.format(
            len(self.module_store)))
        for i in range(len(self.module_store)):
            self.unloadModule(i)

    def loadModuleClass(self, module):
        if module == 'BeaconRequestMonitor': return BeaconRequestMonitor
        if module == 'DisassociationStormMonitor':
            return DisassociationStormMonitor
        if module == 'DosAesCtrMonitor': return DosAesCtrMonitor

    def loadModule(self, moduleConfigDict):
        self.logutil.debug('Loading Module: {0}'.format(moduleConfigDict))
        try:
            moduleName = moduleConfigDict.get('name', None)
            moduleSettings = moduleConfigDict.get('settings', None)
            moduleClass = self.loadModuleClass(moduleName)
            if moduleName == None:
                error = ec.ERROR_WIDS_MissingModuleParameter
                data = 'name'
                self.logutil.log(
                    'Failed to Load Module - Missing Parameter: "name" in {0}\n'
                    .format(moduleConfigDict))
                return self.formatResponse(error, data)
            elif moduleSettings == None:
                error = ec.ERROR_WIDS_MissingModuleParameter
                data = 'settings'
                self.logutil.log(
                    'Failed to Load Module - Missing Parameter: "settings" in {0}\n'
                    .format(moduleConfigDict))
                return self.formatResponse(error, data)
            elif moduleClass == None:
                error = ec.ERROR_WIDS_MissingModuleClass
                data = moduleName
                self.logutil.log(
                    'Failed to Load Module - Could not load class: {0}'.format(
                        moduleName))
                return self.formatResponse(error, data)
            else:
                moduleIndex = self.module_counter
                moduleShutdownEvent = Event()
                moduleSettings['module_index'] = moduleIndex
                self.logutil.debug(
                    'Found module class: {0}'.format(moduleClass))
                '''
                (error,data) = moduleClass.validate_settings(moduleSettings) 
                if not error == None:
                    return self.formatResponse(error,data)
                '''
                moduleProcess = moduleClass(moduleSettings, self.config,
                                            moduleShutdownEvent)
                moduleProcess.start()
                moduleObject = ModuleContainer(moduleIndex, moduleName,
                                               moduleSettings, moduleProcess,
                                               moduleShutdownEvent)
                self.module_store[moduleIndex] = moduleObject
                self.module_counter += 1
                self.logutil.log('Loading Module {0} - {1}'.format(
                    moduleIndex, moduleObject.name))
                return self.formatResponse(None, None)
        except:
            self.handleException()

    def unloadModule(self, moduleIndexInt):
        try:
            moduleObject = self.module_store.get(moduleIndexInt, None)
            if moduleObject == None:
                error = 'Error: Module with Index {0} does not exist'.format(
                    moduleIndexInt)
                self.logutil.log(error)
                return self.formatResponse(False, error)
            else:
                self.logutil.log('Unloading Module {0} ({1} - {2})'.format(
                    moduleIndexInt, moduleObject.name,
                    moduleObject.process.pid))
                self.logutil.log('Detasking Module Tasks')
                for taskObject in self.task_store.values():
                    if taskObject.module_index == moduleObject.index:
                        drones = taskObject.drones
                        uuid = taskObject.uuid
                        self.logutil.log(
                            'Removing Task {0} from Drones {1}'.format(
                                uuid, drones))
                        self.detaskDrone(drones, uuid)
                moduleObject.process.terminate()
                moduleObject.process.join()
                del (self.module_store[moduleIndexInt])
                del (moduleObject)
                return self.formatResponse(True, None)
        except:
            self.handleException()

    def startServer(self):
        self.logutil.log('Starting Server on port {0}'.format(
            self.config.server_port))
        app = flask.Flask(__name__)
        app.add_url_rule('/active',
                         None,
                         self.processActiveGetRequest,
                         methods=['GET'])
        app.add_url_rule('/status',
                         None,
                         self.processStatusGetRequest,
                         methods=['GET'])
        app.add_url_rule('/data/upload',
                         None,
                         self.processDataUploadRequest,
                         methods=['POST'])
        app.add_url_rule('/data/download',
                         None,
                         self.processDataDownloadRequest,
                         methods=['POST'])
        app.add_url_rule('/drone/task',
                         None,
                         self.processDroneTaskRequest,
                         methods=['POST'])
        app.add_url_rule('/drone/detask',
                         None,
                         self.processDroneDetaskRequest,
                         methods=['POST'])
        app.add_url_rule('/drone/add',
                         None,
                         self.processDroneAddRequest,
                         methods=['POST'])
        app.add_url_rule('/drone/delete',
                         None,
                         self.processDroneDeleteRequest,
                         methods=['POST'])
        app.add_url_rule('/alerts',
                         None,
                         self.processAlertGetRequest,
                         methods=['POST'])
        app.add_url_rule('/alerts/generate',
                         None,
                         self.processAlertGenerateRequest,
                         methods=['POST'])
        app.add_url_rule('/module/load',
                         None,
                         self.processModuleLoadRequest,
                         methods=['POST'])
        app.add_url_rule('/module/unload',
                         None,
                         self.processModuleUnloadRequest,
                         methods=['POST'])
        app.run(threaded=True, port=int(self.config.server_port))

    def handleException(self):
        etb = traceback.format_exc()
        self.logutil.trace(etb)
        return self.formatResponse(error=ec.ERROR_GENERAL_UnknownException,
                                   data=str(etb))

    def formatResponse(self, error, data):
        return json.dumps({'error': error, 'data': data})

    def processActiveGetRequest(self):
        self.logutil.debug('Processing Active Get Request')
        return self.formatResponse(error=None, data=True)

    def processDataUploadRequest(self):
        self.logutil.debug('Processing Data Upload Request')
        try:
            data = json.loads(flask.request.data)
            packetdata = data.get('pkt')
            self.database.storePacket(packetdata)
            return self.formatResponse(error=None, data=None)
        except Exception:
            return self.handleException()

    def processDataDownloadRequest(self):
        self.logutil.debug('Processing Data Upload Request')
        try:
            return self.formatResponse(error=None, data=None)
        except Exception:
            return self.handleException()

    def processDroneTaskRequest(self):
        self.logutil.debug('Processing Drone Task Request')
        try:
            request_data = json.loads(flask.request.data)
            (error, data) = self.taskDrone(request_data)
            return self.formatResponse(error, data)
        except Exception:
            return self.handleException()

    def processDroneDetaskRequest(self):
        self.logutil.debug('Processing Drone Detask Request')
        try:
            data = json.loads(flask.request.data)
            return self.detaskDrone(data)
        except Exception:
            return self.handleException()

    def processDroneAddRequest(self):
        self.logutil.debug('Processing Drone Add Request')
        try:
            data = json.loads(flask.request.data)
            return self.loadDrone(data)
        except Exception:
            return self.handleException()

    def processDroneDeleteRequest(self):
        self.logutil.debug('Processing Drone Delete Request')
        try:
            data = json.loads(flask.request.data)
            drone_index = int(data.get('drone_index'))
            return self.unloadDrone(drone_index)
        except:
            return self.handleException()

    def processModuleLoadRequest(self):
        self.logutil.debug('Processing Module Load Request')
        try:
            data = json.loads(flask.request.data)
            return self.loadModule(data)
        except:
            return self.handleException()

    def processModuleUnloadRequest(self):
        self.logutil.debug('Processing Module Unload Request')
        try:
            data = json.loads(flask.request.data)
            module_index = int(data.get('module_index'))
            return self.unloadModule(module_index)
        except:
            return self.handleException()

    def processAlertGenerateRequest(self):
        self.logutil.debug('Processing Alert Generate Request')
        try:
            data = json.loads(flask.request.data)
            alert_name = str(data.get('alert_name'))
            self.database.storeAlert(alert_name)
            return self.formatResponse(True, None)
        except:
            return self.handleException()

    def processAlertGetRequest(self):
        #self.logutil.debug('Processing Alert Request')
        try:
            alerts = []
            for alert in self.database.session.query(Alert).all():
                alerts.append('{0} - {1}'.format(microToDate(alert.datetime),
                                                 alert.name))
            return self.formatResponse(None, alerts)
        except:
            return self.handleException()

    def processStatusGetRequest(self):
        self.logutil.log('Processing Status Request')
        try:
            config = self.config.json()
            modules = list(
                (module.json() for module in self.module_store.values()))
            tasks = list((task.json() for task in self.task_store.values()))
            rules = list((rule.json() for rule in self.rule_store.values()))
            drones = list(
                (drone.json() for drone in self.drone_store.values()))
            status = {
                'config': config,
                'modules': modules,
                'tasks': tasks,
                'drones': drones,
                'rules': rules
            }
            return json.dumps({'success': True, 'data': status})
        except:
            return self.handleException()