From 987cd9ec9ef1d68da1053db99fb395d8e19e66d5 Mon Sep 17 00:00:00 2001 From: cxykevin Date: Sun, 25 Aug 2024 20:51:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0plugin=E4=B8=8E=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E7=83=AD=E9=87=8D=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/reg.py => plugin/flarum.py | 15 +++++-- server/cfg.py | 6 +++ server/email.py | 19 ++++++--- server/main.py | 65 ++++++++++++++++++++++++++----- 4 files changed, 85 insertions(+), 20 deletions(-) rename server/reg.py => plugin/flarum.py (93%) diff --git a/server/reg.py b/plugin/flarum.py similarity index 93% rename from server/reg.py rename to plugin/flarum.py index 30bbf01..93ba9a5 100644 --- a/server/reg.py +++ b/plugin/flarum.py @@ -2,13 +2,20 @@ from fastapi import FastAPI, Response, Cookie from datetime import datetime import aiohttp import json -from . import db +from server import db from typing import Annotated -from .cfg import config +from server import cfg -FL_SERVER = config["flarum"]["fl_server"] -FL_APIKEY = config["flarum"]["fl_apikey"] +FL_SERVER = cfg.config["flarum"]["fl_server"] +FL_APIKEY = cfg.config["flarum"]["fl_apikey"] + + +async def reload(): + global FL_SERVER + global FL_APIKEY + FL_SERVER = cfg.config["flarum"]["fl_server"] + FL_APIKEY = cfg.config["flarum"]["fl_apikey"] def main(app: FastAPI, ROOT: str, apikeys: dict): diff --git a/server/cfg.py b/server/cfg.py index 0d10008..b7d3028 100644 --- a/server/cfg.py +++ b/server/cfg.py @@ -2,3 +2,9 @@ import tomllib with open("config.toml", "rb") as f: config = tomllib.load(f) + + +def reload(): + global config + with open("config.toml", "rb") as f: + config = tomllib.load(f) diff --git a/server/email.py b/server/email.py index 7d04635..275c94b 100644 --- a/server/email.py +++ b/server/email.py @@ -1,14 +1,21 @@ from email.mime.text import MIMEText -from email.utils import parseaddr, formataddr from email.header import Header import aiosmtplib -from .cfg import config +from . import cfg -SMTP_SRV = config["email"]["smtp_srv"] -PORT = config["email"]["port"] -ADDR = config["email"]["addr"] -PASSWD = config["email"]["passwd"] +def load_cfg(): + global SMTP_SRV + global PORT + global ADDR + global PASSWD + SMTP_SRV = cfg.config["email"]["smtp_srv"] + PORT = cfg.config["email"]["port"] + ADDR = cfg.config["email"]["addr"] + PASSWD = cfg.config["email"]["passwd"] + + +load_cfg() async def sendemail(to_addr, links): diff --git a/server/main.py b/server/main.py index ccb2a90..2ac049b 100644 --- a/server/main.py +++ b/server/main.py @@ -6,24 +6,39 @@ from datetime import timedelta, datetime from contextlib import asynccontextmanager from . import db from . import email as email_sys -from . import reg +from . import cfg import hashlib import uuid from typing import Annotated import re import asyncio import uvicorn -from .cfg import config +from . import cfg import pygtrie +import os +import sys +import importlib -ALGORITHM = config["common"]["algorithm"] -ACCESS_TOKEN_EXPIRE_MINUTES = config["common"]["access_token_expire_minutes"] -ACCESS_EMAIL_EXPIRE_MINUTES = config["common"]["access_email_expire_minutes"] -ROOT = config["common"]["root"] -CLEAN_TIMEOUT = config["common"]["clean_timeout"] -MANAGE_KEY = config["common"]["manage_key"] -REDIRECT_URL_WHITELIST = config["common"]["redirect_url_whitelist"] +def load_cfg(): + global ALGORITHM + global ACCESS_TOKEN_EXPIRE_MINUTES + global ACCESS_EMAIL_EXPIRE_MINUTES + global ROOT + global CLEAN_TIMEOUT + global MANAGE_KEY + global REDIRECT_URL_WHITELIST + + ALGORITHM = cfg.config["common"]["algorithm"] + ACCESS_TOKEN_EXPIRE_MINUTES = cfg.config["common"]["access_token_expire_minutes"] + ACCESS_EMAIL_EXPIRE_MINUTES = cfg.config["common"]["access_email_expire_minutes"] + ROOT = cfg.config["common"]["root"] + CLEAN_TIMEOUT = cfg.config["common"]["clean_timeout"] + MANAGE_KEY = cfg.config["common"]["manage_key"] + REDIRECT_URL_WHITELIST = cfg.config["common"]["redirect_url_whitelist"] + + +load_cfg() tokens = pygtrie.StringTrie() apikeys = pygtrie.StringTrie() @@ -42,6 +57,7 @@ def clean_uuid(uuid: str): async def clean_sys(): while 1: await asyncio.sleep(CLEAN_TIMEOUT) + sys.stderr.write("==> clean\n") for k, v in tokens.items(): if (v[1] < datetime.now()): del tokens[k] @@ -279,7 +295,36 @@ async def init(key: str): return 1 await db.create_db() return 0 -reg.main(app, ROOT, apikeys) + +plugins = [] + + +async def reload_cfg(): + global plugins + cfg.reload() + load_cfg() + email_sys.load_cfg() + for i in plugins: + await i.reload() + + +@app.get("/manager/reload") +async def reload(key: str): + sys.stderr.write("==> reload config\n") + if (key != MANAGE_KEY): + return 1 + await reload_cfg() + return 0 + +for i in os.listdir("plugin"): + if (len(i.split(".")) != 2 or i.split(".")[1] != 'py'): + continue + if (i.split(".")[0] not in cfg.config): + sys.stderr.write("--> disable "+i.split(".")[0]+"\n") + continue + sys.stderr.write("==> load "+i.split(".")[0]+"\n") + plugins.append(importlib.import_module("plugin."+i.split(".")[0])) + plugins[-1].main(app, ROOT, apikeys) def run():