예제 #1
0
class Daemon():
    """ """
    def __init__(self, ETLHandler, run_interval_hrs=0.1):

        self.pid = '/tmp/mongotosql-daemon.pid'
        self.ETL = ETLHandler
        self.run_interval_sec = self.hours_to_sec(run_interval_hrs)

        logging.basicConfig(format='%(asctime)s -- %(levelname)s: %(message)s',
                            filename='ETLactivity.log',
                            level=logging.DEBUG,
                            datefmt='%m/%d/%Y %I:%M:%S %p')

        self.daemon = Daemonize(app='MongoToSqlD-Daemon',
                                pid=self.pid,
                                action=self.start_action,
                                foreground=True)

    def hours_to_sec(self, t):
        """ convert hours to seconds (sec = hrs x 60min x 60sec) """
        return float(t * 3600)

    def start_action(self):
        """ runs the program as a linux daemon or windows service
        """
        while True:
            self.ETL.get_from_mongo()
            self.ETL.push_to_sql()
            self.ETL.send_email_update()

            logging.info(" <daemon> pulled from mongo")
            logging.info(" <daemon> sleeping for {} sec".format(
                self.run_interval_sec))
            time.sleep(self.run_interval_sec)

    def start(self):
        """ """
        self.daemon.start()

    def stop(self):
        """ """
        self.daemon.exit()
예제 #2
0
class serviceProvider(object):
    """ Service handler class. Contains all objects """
    objList = None
    daemonObj = None

    def __init__(self):
        """ Init all objects and init handlers """

        self.services = [self.communication_handler]
        self.handlers = [
            self.handle_datalink, self.handle_networklayer,
            self.handle_transportlayer, self.handle_dns
        ]

        self.daemonObj = Daemonize(app=config.APP_NAME,
                                   pid=config.PID_FILE,
                                   action=self.start_app_service)

    def main(self):
        """ Start the daemon service """
        self.daemonObj.start()

    def start_app_service(self):
        """ Main function to handle everything """

        self.init_logger()  # logger in self.logger

        self.init_objects()

        self.logger.info("Starting service...")
        self.start_services()

        self.start_sniffing()

    def start_sniffing(self):
        """ Starts sniffing """
        self.logger.info("Starting sniffer...")
        try:
            sniff(store=False, prn=self.packet_handler)
        except Exception as e:
            self.logger.error(e)

    def start_services(self):
        for service in self.services:
            t = threading.Thread(target=service)
            t.start()

    def unit_communication_handler(self, conn):
        """ Handles communication for each connection """
        cmd = conn.recv_data()
        feature = cmd['feature']
        args = cmd['args']

        self.logger.debug("Recivied commands: {} {}".format(feature, args))

        if feature == 'service':
            if args[0] == 'stop':
                conn.send_data({
                    'status': 'Success',
                    'message': 'Stoping daemon service'
                })
                self.daemonObj.exit()
        else:
            args = (time.time(),
                    args[0].upper()) + args[1:]  # Capitalize BLOCK or ALLOW
            try:
                self.rule_updater_for_single_obj(feature, args)
            except Exception as e:
                conn.send_data({'status': 'Error', 'message': e.args[0]})
                conn.close()
                return False
            conn.send_data({
                'status': 'Success',
                'message': 'Update successfull.'
            })
            conn.close()
            return True
        return True

    def rule_updater_for_single_obj(self, layer, new_rules):
        """ Handles the rules updation for a single a layer. Handles all errors and replies"""
        new_list = self.objList[layer]['rules'].copy()

        new_list.append(new_rules)

        self.objList[layer]['obj'].update_list(new_list)

        return True

    def communication_handler(self):
        """ Blocking listener function. Calls unit_communication_handler for each connection"""
        self.serverObj = ipcAPI.ipcServer(config.SOCKET_FILE)

        self.serverObj.start_listening(self.unit_communication_handler)

    def init_logger(self):
        """ Creates logger object """
        fmt = "[\033[36m%(asctime)s\033[0m] [%(levelname)s] \033[1m%(module)s\033[0m \t: %(message)s"

        self.logger = logging.getLogger(config.APP_NAME)

        tempHandler = logging.FileHandler(config.LOG_FILE, "a")
        tempHandler.setLevel(logging.DEBUG)
        formatHandler = coloredLogs(fmt, datefmt='%H:%M:%S')
        tempHandler.setFormatter(formatHandler)

        self.logger.addHandler(tempHandler)
        # self.keep_fds = [self.logger.root.handlers[0].stream.fileno()]

    def init_objects(self):
        """ Init all objects in the objList"""

        from features.dnsBlocker import dnsBlocker
        from features.dataLinkLayer import dataLinkLayer
        from features.networkLayer import networkLayer
        from features.transportLayer import transportLayer

        self.objList = {
            'dataLinkLayer': {
                'obj':
                dataLinkLayer([], self.logger),  #[(0,'BLOCK','*','docker0')]),
                'rules': []
            },
            'networkLayer': {
                'obj': networkLayer([], self.logger),  #[(0,'BLOCK','icmp')]),
                'rules': []
            },
            'transportLayer': {
                'obj': transportLayer(
                    [], self.logger),  #[(0,'BLOCK','*','*','*','7596')]),
                'rules': []
            },
            'dnsBlocker': {
                'obj':
                dnsBlocker([], self.logger),  #[(0,'BLOCK','*.blockme.com')]),
                'rules': []
            },
        }

        return True

    def packet_handler(self, packet):
        """ Callback function for scapy """
        for handler_function in self.handlers:
            t = threading.Thread(target=handler_function, args=(packet, ))
            t.start()

    def handle_datalink(self, packet):
        """ Handler for dataLinkLayer """
        if packet.haslayer('Ether'):
            self.objList['dataLinkLayer']['obj'].handler(packet)
            return True
        return False

    def handle_networklayer(self, packet):
        """ Handler for networkLayer """
        if packet.haslayer('IP'):
            self.objList['networkLayer']['obj'].handler(packet)
            return True
        return False

    def handle_transportlayer(self, packet):
        """ Handler for transportLayer """
        if packet.haslayer('IP'):
            self.objList['transportLayer']['obj'].handler(packet)
            return True
        return False

    def handle_dns(self, packet):
        """ Handler applicationLayer(DNS) """
        if packet.haslayer('DNS'):
            self.objList['dnsBlocker']['obj'].handler(packet)
            return True
        return False
예제 #3
0
def main():
    if sc.rtm_connect():
        while True:
            for rtm in sc.rtm_read():
                if rtm["type"] == "message":
                    response(rtm)
            time.sleep(1)
    else:
        print("Connection Failed")


logger = logging.getLogger(__name__)
d = Daemonize(app=app_name, pid=app_name + ".pid", action=main, logger=logger)

daemon = len(sys.argv) >= 2 and sys.argv[1] == "-d"
kill = len(sys.argv) >= 2 and sys.argv[1] == "-k"
restart = len(sys.argv) >= 2 and sys.argv[1] == "-r"

if len(sys.argv) < 2:
    print("NON Daemon Mode")
    main()
else:
    if sys.argv[1] == "stop":
        d.exit()
    elif sys.argv[1] == "start":
        print("Daemon Mode: pid =", pid)
        d.start()
    else:
        sys.stderr.write("Unknown Option")