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))
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)
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
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
def remove_console_handlers(): for name, handler in handlers.items(): if isinstance(handler, logging.StreamHandler): remove_handler(name)
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)