feat 服务手动触发

This commit is contained in:
jxxghp 2023-09-24 11:13:49 +08:00
parent de98ccd33c
commit 85014f4acb
3 changed files with 42 additions and 8 deletions

View File

@ -11,12 +11,13 @@ from sqlalchemy.orm import Session
from app import schemas from app import schemas
from app.chain.search import SearchChain from app.chain.search import SearchChain
from app.core.config import settings from app.core.config import settings
from app.core.event import eventmanager
from app.core.security import verify_token from app.core.security import verify_token
from app.db import get_db from app.db import get_db
from app.db.systemconfig_oper import SystemConfigOper from app.db.systemconfig_oper import SystemConfigOper
from app.helper.message import MessageHelper from app.helper.message import MessageHelper
from app.helper.progress import ProgressHelper from app.helper.progress import ProgressHelper
from app.schemas.types import SystemConfigKey from app.schemas.types import SystemConfigKey, EventType
from app.utils.http import RequestUtils from app.utils.http import RequestUtils
from app.utils.system import SystemUtils from app.utils.system import SystemUtils
from version import APP_VERSION from version import APP_VERSION
@ -211,3 +212,17 @@ def restart_system(_: schemas.TokenPayload = Depends(verify_token)):
# 执行重启 # 执行重启
ret, msg = SystemUtils.restart() ret, msg = SystemUtils.restart()
return schemas.Response(success=ret, message=msg) return schemas.Response(success=ret, message=msg)
@router.get("/command", summary="执行命令", response_model=schemas.Response)
def execute_command(cmd: str,
_: schemas.TokenPayload = Depends(verify_token)):
"""
执行命令
"""
if not cmd:
return schemas.Response(success=False, message="命令不能为空!")
eventmanager.send_event(etype=EventType.CommandExcute, data={
"cmd": cmd
})
return schemas.Response(success=True)

View File

@ -107,6 +107,11 @@ class Command(metaclass=Singleton):
"description": "删除订阅", "description": "删除订阅",
"data": {} "data": {}
}, },
"/subscribe_tmdb": {
"func": SubscribeChain(self._db).check,
"description": "订阅TMDB数据刷新",
"data": {}
},
"/downloading": { "/downloading": {
"func": DownloadChain(self._db).remote_downloading, "func": DownloadChain(self._db).remote_downloading,
"description": "正在下载", "description": "正在下载",
@ -216,7 +221,10 @@ class Command(metaclass=Singleton):
command = self.get(cmd) command = self.get(cmd)
if command: if command:
try: try:
logger.info(f"用户 {userid} 开始执行:{command.get('description')} ...") if userid:
logger.info(f"用户 {userid} 开始执行:{command.get('description')} ...")
else:
logger.info(f"开始执行:{command.get('description')} ...")
cmd_data = command['data'] if command.get('data') else {} cmd_data = command['data'] if command.get('data') else {}
args_num = ObjectUtils.arguments(command['func']) args_num = ObjectUtils.arguments(command['func'])
if args_num > 0: if args_num > 0:
@ -236,7 +244,10 @@ class Command(metaclass=Singleton):
else: else:
# 没有参数 # 没有参数
command['func']() command['func']()
logger.info(f"用户 {userid} {command.get('description')} 执行完成") if userid:
logger.info(f"用户 {userid} {command.get('description')} 执行完成")
else:
logger.info(f"{command.get('description')} 执行完成")
except Exception as err: except Exception as err:
logger.error(f"执行命令 {cmd} 出错:{str(err)}") logger.error(f"执行命令 {cmd} 出错:{str(err)}")
traceback.print_exc() traceback.print_exc()

View File

@ -49,6 +49,7 @@ class Scheduler(metaclass=Singleton):
"interval", "interval",
minutes=settings.COOKIECLOUD_INTERVAL, minutes=settings.COOKIECLOUD_INTERVAL,
next_run_time=datetime.now(pytz.timezone(settings.TZ)) + timedelta(minutes=1), next_run_time=datetime.now(pytz.timezone(settings.TZ)) + timedelta(minutes=1),
id="cookiecloud",
name="同步CookieCloud站点") name="同步CookieCloud站点")
# 媒体服务器同步 # 媒体服务器同步
@ -56,6 +57,7 @@ class Scheduler(metaclass=Singleton):
self._scheduler.add_job(MediaServerChain(self._db).sync, "interval", self._scheduler.add_job(MediaServerChain(self._db).sync, "interval",
hours=settings.MEDIASERVER_SYNC_INTERVAL, hours=settings.MEDIASERVER_SYNC_INTERVAL,
next_run_time=datetime.now(pytz.timezone(settings.TZ)) + timedelta(minutes=5), next_run_time=datetime.now(pytz.timezone(settings.TZ)) + timedelta(minutes=5),
id="mediaserver_sync",
name="同步媒体服务器") name="同步媒体服务器")
# 新增订阅时搜索5分钟检查一次 # 新增订阅时搜索5分钟检查一次
@ -63,19 +65,23 @@ class Scheduler(metaclass=Singleton):
minutes=5, kwargs={'state': 'N'}) minutes=5, kwargs={'state': 'N'})
# 检查更新订阅TMDB数据每隔6小时 # 检查更新订阅TMDB数据每隔6小时
self._scheduler.add_job(SubscribeChain(self._db).check, "interval", hours=6) self._scheduler.add_job(SubscribeChain(self._db).check, "interval", hours=6,
id="subscribe_tmdb", name="订阅元数据更新")
# 订阅状态每隔24小时搜索一次 # 订阅状态每隔24小时搜索一次
if settings.SUBSCRIBE_SEARCH: if settings.SUBSCRIBE_SEARCH:
self._scheduler.add_job(SubscribeChain(self._db).search, "interval", self._scheduler.add_job(SubscribeChain(self._db).search, "interval",
hours=24, kwargs={'state': 'R'}, name="订阅搜索") hours=24, kwargs={'state': 'R'},
id="subscribe_search", name="订阅搜索")
if settings.SUBSCRIBE_MODE == "spider": if settings.SUBSCRIBE_MODE == "spider":
# 站点首页种子定时刷新模式 # 站点首页种子定时刷新模式
triggers = TimerUtils.random_scheduler(num_executions=30) triggers = TimerUtils.random_scheduler(num_executions=30)
for trigger in triggers: for trigger in triggers:
self._scheduler.add_job(SubscribeChain(self._db).refresh, "cron", self._scheduler.add_job(SubscribeChain(self._db).refresh, "cron",
hour=trigger.hour, minute=trigger.minute, name="订阅刷新") hour=trigger.hour, minute=trigger.minute,
id=f"subscribe_refresh|{trigger.hour}:{trigger.minute}",
name="订阅刷新")
else: else:
# RSS订阅模式 # RSS订阅模式
if not settings.SUBSCRIBE_RSS_INTERVAL: if not settings.SUBSCRIBE_RSS_INTERVAL:
@ -83,11 +89,13 @@ class Scheduler(metaclass=Singleton):
elif settings.SUBSCRIBE_RSS_INTERVAL < 5: elif settings.SUBSCRIBE_RSS_INTERVAL < 5:
settings.SUBSCRIBE_RSS_INTERVAL = 5 settings.SUBSCRIBE_RSS_INTERVAL = 5
self._scheduler.add_job(SubscribeChain(self._db).refresh, "interval", self._scheduler.add_job(SubscribeChain(self._db).refresh, "interval",
minutes=settings.SUBSCRIBE_RSS_INTERVAL, name="订阅刷新") minutes=settings.SUBSCRIBE_RSS_INTERVAL,
id="subscribe_refresh", name="订阅刷新")
# 下载器文件转移每5分钟 # 下载器文件转移每5分钟
if settings.DOWNLOADER_MONITOR: if settings.DOWNLOADER_MONITOR:
self._scheduler.add_job(TransferChain(self._db).process, "interval", minutes=5, name="下载文件整理") self._scheduler.add_job(TransferChain(self._db).process, "interval", minutes=5,
id="transfer", name="下载文件整理")
# 公共定时服务 # 公共定时服务
self._scheduler.add_job(SchedulerChain(self._db).scheduler_job, "interval", minutes=10) self._scheduler.add_job(SchedulerChain(self._db).scheduler_job, "interval", minutes=10)