def send_async_email(app, msg, recipients, send_independently=True): """ 异步发送email :param app: :param msg: :param send_independently: 每个单独发送 :return: """ mdb_sys.init_app(reinit=True) with app.app_context(): if send_independently: # 独立发送, 先连接好邮件服务器 with mail.connect() as conn: for recipient in recipients: msg.recipients = [recipient] send_email_process(msg, conn) else: msg.recipients = recipients return send_email_process(msg)
def init_core_module(app): ''' 初始化核心模块 :param app: :return: ''' # app config web_start_log.info("Initialize the core module") # 系统必要配置, 优先导入 app.config.from_object(ConfDictToClass(CONFIG["system"], key="value")) app.config.from_object(ConfDictToClass(CONFIG["key"], key="value")) # 数据库 app.config.from_object(DatabaseConfig()) mdb_web.init_app(app, config_prefix='MONGO_WEB') mdb_sys.init_app(app, config_prefix='MONGO_SYS') mdb_user.init_app(app, config_prefix='MONGO_USER') # 缓存 app.config.from_object(ConfDictToClass(CONFIG["cache"], key="value")) app.config["CACHE_REDIS"] = redis app.config["CACHE_MONGODB"] = mdb_sys.connection app.config["CACHE_MONGODB_DB"] = mdb_sys.name cache.init_app(app) # 清除配置CONFIG的cache with app.app_context(): msg = " * Clean configuration cache successfully" cache.delete(CONFIG_CACHE_KEY) cache.delete(PLUG_IN_CONFIG_CACHE_KEY) web_start_log.info(msg) print(msg) # 异常错误信息 app.config["PRESERVE_CONTEXT_ON_EXCEPTION"] = PRESERVE_CONTEXT_ON_EXCEPTION ################################################### # 在此之前, 任何程序不能调用utils.get_config.py下的方法 ################################################### from apps.core.utils.get_config import get_configs, get_config from apps.core.flask.request import OsrRequestProcess from apps.core.flask.errorhandler import ErrorHandler from apps.core.blueprint import api, admin_view, theme_view, static, open_api from apps.core.flask.routing import RegexConverter from apps.core.flask.routing import push_url_to_db # 最大请求大小 app.config["MAX_CONTENT_LENGTH"] = get_config( "system", "MAX_CONTENT_LENGTH") * 1024 * 1024 # Session会话配置 session_config = get_configs("session") session_config["SESSION_PROTECTION"] = SESSION_PROTECTION session_config["SESSION_COOKIE_PATH"] = SESSION_COOKIE_PATH session_config["SESSION_COOKIE_HTTPONLY"] = SESSION_COOKIE_HTTPONLY session_config["SESSION_COOKIE_SECURE"] = SESSION_COOKIE_SECURE session_config["SESSION_USE_SIGNER"] = SESSION_USE_SIGNER session_config["SESSION_MONGODB_DB"] = mdb_sys.name app.config.from_object(ConfDictToClass(session_config)) app.config["SESSION_REDIS"] = redis app.config["SESSION_MONGODB"] = mdb_sys.connection sess.init_app(app) rest_session.init_app(app) # 邮件 app.config.from_object(ConfDictToClass(get_configs("email"))) mail.init_app(app) # Csrf token csrf_config = {} csrf_config["CSRF_ENABLED"] = CSRF_ENABLED csrf_config["WTF_CSRF_CHECK_DEFAULT"] = WTF_CSRF_CHECK_DEFAULT csrf_config["WTF_CSRF_METHODS"] = WTF_CSRF_METHODS app.config.from_object(ConfDictToClass(csrf_config)) csrf.init_app(app) # Babel app.config.from_object(ConfDictToClass(get_configs("babel"))) app.config["BABEL_TRANSLATION_DIRECTORIES"] = BABEL_TRANSLATION_DIRECTORIES babel.init_app(app) # 登录管理 login_manager.init_app(app) #login_manager.anonymous_user = AnonymousUser() login_manager.session_protection = SESSION_PROTECTION weblog.init_app(app) oauth.init_app(app) # 让路由支持正则 app.url_map.converters['regex'] = RegexConverter # 注册蓝图 blueprint web_start_log.info("Register blueprint, Initialize the routing") app.register_blueprint(api) app.register_blueprint(open_api) app.register_blueprint(admin_view) app.register_blueprint(theme_view) app.register_blueprint(static) push_url_to_db(app) # 请求处理 request_process = OsrRequestProcess() request_process.init_request_process(app=app) request_process.init_babel_locale_selector(babel=babel) # 错误处理 ErrorHandler(app)
def install_process(plugin_name, host_info, packages): ''' 子进程执行安装 :return: ''' ssh = MySSH(host=host_info["local_ip"], port=host_info["port"], username=host_info["username"], password=host_info["password"]) if ssh: result = [] venv = ". {}/bin/activate && ".format( get_config("py_venv", "VENV_PATH")) for package in packages: cmd = "{}pip install -U {}".format(venv, package) stdin, stdout, stderr = ssh.exec_cmd(cmd) for line in stdout.read().decode().split("\n"): if re.search(r"\s*Successfully\s+installed.*", line): result.append(line) ssh.close() packages = " ".join(packages) mdb_sys.init_app(reinit=True) plugin = mdb_sys.db.plugin.find_one( {"plugin_name": plugin_name}, {"require_package_install_result": 1}) if "require_package_install_result" in plugin and plugin[ "require_package_install_result"]: updated = False for old_result in plugin["require_package_install_result"]: if old_result["host_ip"] == host_info["local_ip"]: old_result["packages"] = packages if result: old_result["result"] = result old_result["time"] = time.time() old_result["error"] = None updated = True break if not updated: result = { "host_ip": host_info["local_ip"], "packages": packages, "error": None, "time": time.time() } if result: result["result"] = result plugin["require_package_install_result"].append(result) else: plugin["require_package_install_result"] = [{ "host_ip": host_info["local_ip"], "packages": packages, "result": result, "error": None, "time": time.time() }] mdb_sys.db.plugin.update_one({"plugin_name": plugin_name}, { "$set": { "require_package_install_result": plugin["require_package_install_result"] } })