Beispiel #1
0
def _get_handlers(handlers, formatters):
    for key, handler in handlers.items():
        kw = {}
        try:
            cls = handler.get("class")
            args = handler.get("args", tuple())
            level = handler.get("level", None)
            try:
                cls = eval(cls, logging.__dict__)
            except NameError:
                try:
                    cls = eval(cls, logging.handlers.__dict__)
                except NameError, err:
                    raise ConfigError("Specified class in handler "
                                      "%s is not a recognizable logger name" %
                                      key)
            try:
                handler_obj = cls(*eval(args, logging.__dict__))
            except IOError, err:
                raise ConfigError("Missing or wrong argument to "
                                  "%s in handler %s -> %s " %
                                  (cls.__name__, key, err))
            except TypeError, err:
                raise ConfigError("Wrong format for arguments "
                                  "to %s in handler %s -> %s" %
                                  (cls.__name__, key, err))
Beispiel #2
0
def ignore_signals(*signals):
    handlers = {}

    for s in signals:
        try:
            signal.signal(s, signal.SIG_IGN)
        except ValueError:
            LOG.warning('signal (%s) cannot be ignored', s)
        else:
            handlers[s] = signal.getsignal(s)
    try:
        yield handlers
    finally:
        for k, v in handlers.items():
            signal.signal(k, v)
Beispiel #3
0
def _get_handlers(handlers, formatters):
    for key, handler in handlers.items():
        kw = {}
        try:
            cls = handler.get("class")
            args = handler.get("args", tuple())
            level = handler.get("level", None)
            try:
                cls = eval(cls, logging.__dict__)
            except NameError:
                try:
                    cls = eval(cls, logging.handlers.__dict__)
                except NameError, err:
                    raise ConfigError("Specified class in handler " "%s is not a recognizable logger name" % key)
            try:
                handler_obj = cls(*eval(args, logging.__dict__))
            except IOError, err:
                raise ConfigError("Missing or wrong argument to " "%s in handler %s -> %s " % (cls.__name__, key, err))
            except TypeError, err:
                raise ConfigError("Wrong format for arguments " "to %s in handler %s -> %s" % (cls.__name__, key, err))
Beispiel #4
0
def adjust_config(logging_config, dir_mode=DirMode.CONFIG):
    # 使用配置目录
    if dir_mode == DirMode.CONFIG:
        dir_name = logging_config['log_dir']
    else:
        BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        dir_name = BASE_DIR + '/logs/'

    handlers = logging_config.get('handlers')
    for _, handler_config in handlers.items():
        filename = handler_config.get('filename', None)
        if filename is None:
            continue
        if dir_name is not None:
            if not os.path.exists(dir_name):
                try:
                    os.makedirs(dir_name)
                except Exception as e:
                    print(e)
            handler_config['filename'] = dir_name + filename
    return logging_config
Beispiel #5
0
def adjust_config(logging_config, dir_mode=DirMode.CONFIG):
    # 使用配置目录
    if dir_mode == DirMode.CONFIG:
        dirName = logging_config['log_dir']
    # 使用logger.py同级目录
    else:
        currentdir = os.path.dirname(__file__).replace('\\', '/')
        dirName = currentdir + '/logs/'

    handlers = logging_config.get('handlers')
    for handler_name, handler_config in handlers.items():
        filename = handler_config.get('filename', None)
        if filename is None:
            continue
        if dirName is not None:
            if not os.path.exists(dirName):
                try:
                    os.makedirs(dirName)
                except Exception as e:
                    print(e)
            handler_config['filename'] = dirName + filename
    return logging_config
Beispiel #6
0
def remove_console_handlers():
    for name, handler in handlers.items():
        if isinstance(handler, logging.StreamHandler):
            remove_handler(name)
Beispiel #7
0
def serve(log, config):
    log.debug("Opening Server")

    # Setup operations based on the pidfile
    pidfile = config["Global"].get("pidfile", None)
    if pidfile != None:
        if os.path.exists(pidfile):
            try:
                with open(pidfile, "r") as f:
                    pid = int(f.read())
                os.kill(pid, 0)
                log.error("Pidfile already exists! Exiting")
                exit(1)
            except OSError:
                log.info("Cleaning stale pidfile %s" % pidfile)
                os.unlink(pidfile)

        with open(pidfile, "w") as f:
            f.write(str(os.getpid()))
        log.debug("Wrote pidfile %s" % pidfile)

    # Create a new SMTP Server
    addr = config["Global"].get("addr", "0.0.0.0")
    port = int(config["Global"].get("port", "25"))
    host = config["Global"].get("host", "localhost")
    try:
        if toBool(config["Global"].get("custom_handler", "False")):
            log.info("Using custom SMTP Server")
            obj = csmtp.SMTP
        else:
            log.info("Using built-in SMTP Server")
            obj = pysmtp.SMTP
        server = obj(log, host=host, port=port, addr=addr)
    except:
        log.error("Failed to bind server to socket %s:%d" % (host, port))
        exit(1)

    # Setup the kill signal
    diefun = lambda signum, frame: death(pidfile, log, server, handlers)
    signal.signal(signal.SIGINT, diefun)
    signal.signal(signal.SIGTERM, diefun)

    # Chroot directory if necessary
    chroot = config["Global"].get("chroot", None)
    if chroot != None:
        try:
            os.chroot(chroot)
            log.info("Chrooted into %s" % chroot)
        except:
            log.error("Failed to Chroot into %s" % chroot)

    # Drop user / group permissions
    udown = config["Global"].get("user", None)
    gdown = config["Global"].get("group", None)
    try:
        if udown != None:
            uid = pwd.getpwnam(udown).pw_uid
        if gdown != None:
            gid = grp.getgrnam(gdown).gr_gid
    except:
        log.error("Failed to get User / Group Ids. Maybe they don't exist?")
        exit(1)
    try:
        if gdown != None:
            log.info("Dropped group privileges to %s" % gdown)
            os.setgid(gid)
        if udown != None:
            log.info("Dropped user privileges to %s" % udown)
            os.setuid(uid)
    except:
        log.error("Cannot Drop User / Group Privileges. Probably not running as root?")
        exit(1)

    # Setup additional handlers
    handlerl = {}
    hset = [x for x in config.sections() if x.lower() != "global" and toBool(config[x].get("Enabled", "False"))]
    for h in hset:
        mod = __import__("mh.%s" % h.lower(), fromlist=["Handler"])
        handler = getattr(mod, "Handler")(log, config[h])
        handler._name = h
        try:
            handler._deps
        except:
            handler._deps = {}
        handlerl[h] = handler
        log.debug("Loaded handler %s" % h)
    for k, v in handlerl.items():
        for d in v._deps:
            if not d in handlerl:
                log.error("%s couldn't satisfy dependency %s" % (k, d))
                exit(1)
    handlers = collections.OrderedDict(sorted(handlerl.items(), key=lambda t: t[1]))
    for k, v in handlers.items():
        v.startup(handlers)
        log.info("Starting handler %s" % k)

    # Run the server
    log.info("Accepting Connections on %s:%d", addr, port)
    log.info("Using Hostname %s", host)
    while True:
        server.run(handlers=handlers)
    death(pidfile, log, server, handlers)