|
|
@@ -92,8 +92,8 @@ async def post_start_mihomo(request: MihomoBatchRequest) -> MihomoMetaWithURL:
|
|
|
return miho_model
|
|
|
mixed_port = request.port
|
|
|
if not mixed_port:
|
|
|
- mixed_port = find_free_port()
|
|
|
- external_controller_port = find_free_port((mixed_port+1, 18000))
|
|
|
+ mixed_port = await find_free_port()
|
|
|
+ external_controller_port = await find_free_port((mixed_port+1, 18000))
|
|
|
config = {}
|
|
|
temp_path = settings.MIHOMO_TEMP_PATH / f"{miho_model.provider_name}_{external_controller_port}.yaml"
|
|
|
config['mixed-port'] = mixed_port
|
|
|
@@ -193,12 +193,9 @@ async def get_mihomo_running_status():
|
|
|
|
|
|
@mihomo_router.post("/proxies_reachability")
|
|
|
async def get_proxies_reachability():
|
|
|
- # 1. 启动所有服务商
|
|
|
- await post_start_each_provider()
|
|
|
-
|
|
|
# 2. 获取所有运行中的代理
|
|
|
db = SubscriptionManager()
|
|
|
- running_proxies = db.get_running_proxies()
|
|
|
+ running_proxies = db.get_each_provider_running_proxies()
|
|
|
|
|
|
# 3. 测试延迟并更新数据库
|
|
|
results = []
|
|
|
@@ -229,6 +226,37 @@ async def get_proxies_reachability():
|
|
|
|
|
|
return results
|
|
|
|
|
|
+@mihomo_router.post("/start_all_proxies_reachability")
|
|
|
+async def start_all_proxies_reachability():
|
|
|
+ await post_start_each_provider()
|
|
|
+ await get_proxies_reachability()
|
|
|
+ db = SubscriptionManager()
|
|
|
+ with Session(db.engine) as session:
|
|
|
+ proxies_reachability = session.exec(
|
|
|
+ select(MihomoMeta)
|
|
|
+ .where(MihomoMeta.delay.is_not(None))
|
|
|
+ ).all()
|
|
|
+ tasks = []
|
|
|
+ port_start = 9350
|
|
|
+ for proxy in proxies_reachability:
|
|
|
+ tasks.append(post_start_mihomo(MihomoBatchRequest(id=int(proxy.id), port=port_start)))
|
|
|
+ port_start += 2
|
|
|
+ # 并发执行所有任务,并允许任务抛出异常而不中断其他任务
|
|
|
+ results = await asyncio.gather(*tasks, return_exceptions=True)
|
|
|
+
|
|
|
+ # 处理结果和错误
|
|
|
+ ret = []
|
|
|
+ for result in results:
|
|
|
+ if isinstance(result, Exception):
|
|
|
+ # 如果是异常,记录错误并添加到 ret 中
|
|
|
+ logger.error(f"Failed to start mihomo: {str(result)}")
|
|
|
+ ret.append({"error": str(result)})
|
|
|
+ else:
|
|
|
+ # 如果是正常结果,直接添加到 ret 中
|
|
|
+ ret.append(result)
|
|
|
+
|
|
|
+ return ret
|
|
|
+
|
|
|
@mihomo_router.get("/external-controller")
|
|
|
async def get_controller_urls():
|
|
|
running_list = await get_mihomo_running_status()
|