# 2021SC@SDUSC 山大智云 13 app

编程入门 行业动态 更新时间:2024-10-10 00:27:52

# 2021SC@SDUSC <a href=https://www.elefans.com/category/jswz/34/1760453.html style=山大智云 13 app"/>

# 2021SC@SDUSC 山大智云 13 app

该模块对软件的配置等进行了一系列设置。

log.py

目录结构

class LogConfiguratordef __init__def _rotating_configdef _basic_configdef add_syslog_handlerdef _get_log_level

init

def __init__(self,level,logfile)self._level=self._get_log_level(level)self._logfile=logfileif logfile is None:self._basic_config()else:self._rotating_config()

从函数中,我们可以看到调用了_get_log_level方法,_basic方法,_rotating_config方法

def _get_log_level(self, level):if level == 'debug':return logging.DEBUGelif level == 'info':return logging.INFOelse:return logging.WARNING

可以看出该方法的主要目的是设置logging的等级。

def _basic_config(self):'''Log to stdout. Mainly for development.'''kw = {'format': '[%(asctime)s] [%(levelname)s] %(message)s','datefmt': '%m/%d/%Y %H:%M:%S','level': self._level,'stream': sys.stdout}logging.basicConfig(**kw)

该方法设置基础配置,kw设置了一些列关于logging的参数

def _rotating_config(self):'''Rotating log'''handler = logging.handlers.TimedRotatingFileHandler(self._logfile, when='W0', interval=1)handler.setLevel(self._level)formatter = logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s')handler.setFormatter(formatter)logging.root.setLevel(self._level)logging.root.addHandler(handler)

该方法与上面方法的区别在于通过设置handler进行logging配置。按日期进行切割

logging.handlers.TimedRotatingFileHandler:按日期对日志进行切割
def add_syslog_handler(self):handler = logging.handlers.SysLogHandler(address='/dev/log')handler.setLevel(self._level)formatter = logging.Formatter('seafevents[%(process)d]: %(message)s')handler.setFormatter(formatter)logging.root.addHandler(handler)

该方法设置SysLogHandler。

config.py
class AppConfig(object):def __init__(self):passdef set(self, key, value):self.key = valuedef get(self, key):if hasattr(self, key):return self.__dict__[key]else:return ''

配置的对象类,用于封装信息

def exception_catch(conf_module):def func_wrapper(func):def wrapper(*args, **kwargs):try:func(*args, **kwargs)except Exception as e:logger.info('%s module configuration loading failed: %s' % (conf_module, e))return wrapperreturn func_wrapper

该方法捕捉函数的异常并进行抓捕。

logger.info('%s module configuration loading failed: %s' % (conf_module, e))
def load_config(config_file):# seafevent config fileappconfig.session_cls = init_db_session_class(config_file)config = get_config(config_file)load_env_config()appconfig.seaf_session_cls = init_db_session_class(appconfig.seaf_conf_path, db = 'seafile')load_publish_config(config)load_statistics_config(config)load_file_history_config(config)load_collab_server_config(config)

该方法加载配置。init_db_session_class方法在db文件中定义,我们在之前已经介绍过。

load_env_config()
load_publish_config(config)
load_statistics_config(config)
load_file_history_config(config)
load_collab_server_config(config)

这里调用的函数是该文件剩余的函数,可以看出是从不同的类型加载配置。

def load_env_config():# get central config dirappconfig.central_confdir = ""if 'SEAFILE_CENTRAL_CONF_DIR' in os.environ:appconfig.central_confdir = os.environ['SEAFILE_CENTRAL_CONF_DIR']# get seafile config pathappconfig.seaf_conf_path = ""if appconfig.central_confdir:appconfig.seaf_conf_path = os.path.join(appconfig.central_confdir, 'seafile.conf')elif 'SEAFILE_CONF_DIR' in os.environ:appconfig.seaf_conf_path = os.path.join(os.environ['SEAFILE_CONF_DIR'], 'seafile.conf')# get ccnet config pathappconfignet_conf_path = ""if appconfig.central_confdir:appconfignet_conf_path = os.path.join(appconfig.central_confdir, 'ccnet.conf')elif 'CCNET_CONF_DIR' in os.environ:appconfignet_conf_path = os.path.join(os.environ['CCNET_CONF_DIR'], 'ccnet.conf')

分别对seafile的central config dir,conf_path,ccnet_conf_path进行配置,基本逻辑为,通过os.environ查看是否系统是否有配置,然后分情况进行设置。

def load_publish_config(config):appconfig.publish_enabled = Falsetry:appconfig.publish_enabled = config.getboolean('EVENTS PUBLISH', 'enabled')except Exception as e:# prevent hasn't EVENTS PUBLISH section.passif appconfig.publish_enabled:try:appconfig.publish_mq_type = config.get('EVENTS PUBLISH', 'mq_type').upper()if appconfig.publish_mq_type != 'REDIS':logger.error("Unknown database backend: %s" % config['publish_mq_type'])raise RuntimeError("Unknown database backend: %s" % config['publish_mq_type'])appconfig.publish_mq_server = config.get(appconfig.publish_mq_type,'server')appconfig.publish_mq_port = config.getint(appconfig.publish_mq_type,'port')# prevent needn't passwordappconfig.publish_mq_password = ""if config.has_option(appconfig.publish_mq_type, 'password'):appconfig.publish_mq_password = config.get(appconfig.publish_mq_type,'password')except Exception as e:appconfig.publish_enabled = False

该方法配置publish版,会先检查config中的publish_enabled的配置,然后进行配置,同时设置数据库类型,server和port还有密码

if config.has_option(appconfig.publish_mq_type, 'password'):appconfig.publish_mq_password = config.get(appconfig.publish_mq_type,'password')
def load_statistics_config(config):appconfig.enable_statistics = Falsetry:if config.has_option('STATISTICS', 'enabled'):appconfig.enable_statistics = config.getboolean('STATISTICS', 'enabled')except Exception as e:logger.info(e)

该函数比较直观,根据config中的STATISTICS对enabled进行设置

def load_file_history_config(config):appconfig.fh = AppConfig()if config.has_option('FILE HISTORY', 'enabled'):appconfig.fh.enabled = config.getboolean('FILE HISTORY', 'enabled')if appconfig.fh.enabled:appconfig.fh.threshold = int(get_opt_from_conf_or_env(config, 'FILE HISTORY', 'threshold', default=5))default_suffix = 'md,txt,doc,docx,xls,xlsx,ppt,pptx'appconfig.fh.suffix = get_opt_from_conf_or_env(config, 'FILE HISTORY', 'suffix', default=default_suffix)suffix = appconfig.fh.suffix.strip(',')appconfig.fh.suffix_list = suffix.split(',') if suffix else []logger.info('The file with the following suffix will be recorded into the file history: %s' % suffix)else:logger.info('Disable File History Features.')else:appconfig.fh.enabled = Trueappconfig.fh.threshold = 5suffix = 'md,txt,doc,docx,xls,xlsx,ppt,pptx'appconfig.fh.suffix_list = suffix.split(',')logger.info('The file with the following suffix will be recorded into the file history: %s' % suffix)

配置FILE HISTORY 关于enabled属性的配置。

配置一系列属性。

def load_collab_server_config(config):appconfig.enable_collab_server = Falseif not config.has_option('COLLAB_SERVER', 'enabled'):returnappconfig.enable_collab_server = config.getboolean('COLLAB_SERVER', 'enabled')if appconfig.enable_collab_server:appconfig.collab_server = config.get('COLLAB_SERVER', 'server_url')appconfig.collab_key = config.get('COLLAB_SERVER', 'key')

配置collab_server

上面的配置大多数是根据enabled属性进行配置。

signal_hangler.py

该文件非常简单

def sigint_handler(*args):dummy = argsdo_exit(0)def sigchild_handler(*args):dummy = argstry:os.wait3(os.WNOHANG)except:pass

do_exit为util下的方法

def do_exit(code=0):logging.info('exit with code %s', code)# os._exit: Exit the process with status n, without calling cleanup handlers, flushing stdio buffers, etc# sys.exit: This is implemented by raising the SystemExit exception. So only kill the current thread.# we need to make sure that the process exits.os._exit(code)
mq_handler.py
class MessageHandlerdef add_handler:添加事件和处理函数到handler中def handle_message:对于func中的函数,进行执行def get_channels:得到handler中的msg
def add_handler(self, msg_type, func):if msg_type in self._handlers:funcs = self._handlers[msg_type]else:funcs = []self._handlers[msg_type] = funcsif func not in funcs:funcs.append(func)def handle_message(self, session, channel, msg):pos = msg['content'].find('\t')if pos == -1:logger.warning("invalid message format: %s", msg)returnmsg_type = channel + ':' + msg['content'][:pos]if msg_type not in self._handlers:returnfuncs = self._handlers.get(msg_type)for func in funcs:try:func(session, msg)except Exception as e:logger.exception("error when handle msg: %s", e)def get_channels(self):channels = set()for msg_type in self._handlers:pos = msg_type.find(':')channels.add(msg_type[:pos])return channels
class EventsHander:def handle_event:进行事件处理def start:对于channel中的事件进行处理

App.py:app主类,进行一系列设置

BackgroundTasks的start方法进行一系列功能的启动

logging.info('Starting background tasks.')self._file_updates_sender.start()if self._work_weixin_notice_sender.is_enabled():self._work_weixin_notice_sender.start()
else:logging.info('work weixin notice sender is disabled')if self._index_updater.is_enabled():self._index_updater.start()
else:logging.info('search indexer is disabled')if self._seahub_email_sender.is_enabled():self._seahub_email_sender.start()
else:logging.info('seahub email sender is disabled')if self._ldap_syncer.enable_sync():self._ldap_syncer.start()
else:logging.info('ldap sync is disabled')if self._virus_scanner.is_enabled():self._virus_scanner.start()
else:logging.info('virus scan is disabled')if self._statistics.is_enabled():self._statistics.start()
else:logging.info('data statistics is disabled')if self._content_scanner.is_enabled():self._content_scanner.start()
else:logging.info('content scan is disabled')if self._office_converter and self._office_converter.is_enabled():self._office_converter.start()
else:logging.info('office converter is disabled')if self._repo_old_file_auto_del_scanner.is_enabled():self._repo_old_file_auto_del_scanner.start()
else:logging.info('repo old file auto del scanner disabled')if self._offline_downloader.is_enabled():self._offline_downloader.start()
else:logging.info('offline downloader disabled')

App类则启动一系列主要功能

def __init__(self, args, events_handler_enabled=True, background_tasks_enabled=True):self._central_config_dir = os.environ.get('SEAFILE_CENTRAL_CONF_DIR')self._args = argsself._events_handler_enabled = events_handler_enabledself._bg_tasks_enabled = background_tasks_enabledtry:load_config(args.config_file)except Exception as e:logging.error('Error loading seafevents config. Detail: %s' % e)raise RuntimeError("Error loading seafevents config. Detail: %s" % e)self._events_handler = Noneif self._events_handler_enabled:self._events_handler = EventsHandler(self._args.config_file)if appconfig.publish_enabled:events_publisher.init()else:logging.info("Events publish to redis is disabled.")self._bg_tasks = Noneif self._bg_tasks_enabled:self._bg_tasks = BackgroundTasks(args.config_file)if appconfig.enable_statistics:self.update_login_record_task = CountUserActivity()self.count_traffic_task = CountTrafficInfo()def serve_forever(self):if self._events_handler:self._events_handler.start()else:logging.info("Event listener is disabled.")if self._bg_tasks:self._bg_tasks.start()else:logging.info("Background task is disabled.")if appconfig.enable_statistics:self.update_login_record_task.start()self.count_traffic_task.start()else:logging.info("User login statistics is disabled.")logging.info("Traffic statistics is disabled.")

该模块主要定义了配置文件的处理与系统各种功能的启动与检查。

更多推荐

# 2021SC@SDUSC 山大智云 13 app

本文发布于:2024-02-13 19:05:39,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1760589.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:山大   SC   SDUSC   app

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!