Skip to content

Commit f9a30fc

Browse files
committed
feat: 完善所有基础功能
1 parent b2b74e6 commit f9a30fc

File tree

8 files changed

+871
-180
lines changed

8 files changed

+871
-180
lines changed

core/__init__.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ async def syncFiles():
2828
await cluster.setupRouter()
2929
await cluster.listen(protocol == "https", Config.get("cluster.port"))
3030
await cluster.enable()
31+
if not cluster.enabled:
32+
raise asyncio.CancelledError
33+
scheduler.add_job(cluster.keepAlive, IntervalTrigger(seconds=Config.get("advanced.keep_alive")))
3134
scheduler.start()
3235
logger.tsuccess('main.success.scheduler')
3336
while True:
@@ -47,12 +50,7 @@ async def syncFiles():
4750

4851

4952
def init():
50-
loop = asyncio.get_event_loop()
51-
main_task = loop.create_task(main())
5253
try:
53-
loop.run_until_complete(main_task)
54+
asyncio.run(main())
5455
except KeyboardInterrupt:
55-
main_task.cancel()
56-
loop.run_until_complete(asyncio.shield(main_task))
57-
finally:
58-
loop.close()
56+
pass

core/classes.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ class AgentConfiguration:
2424
source: str
2525
concurrency: int
2626

27+
@dataclass
28+
class Counters:
29+
hits: int
30+
bytes: int
2731

2832
class Storage(ABC):
2933
@abstractmethod

core/cluster.py

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from core.scheduler import *
44
from core.exceptions import ClusterIdNotSetError, ClusterSecretNotSetError
55
from core.storages import getStorages, LocalStorage
6-
from core.classes import FileInfo, FileList, AgentConfiguration
6+
from core.classes import FileInfo, FileList, AgentConfiguration, Counters
77
from core.router import Router
88
from core.client import WebSocketClient
99
from core.i18n import locale
@@ -15,6 +15,7 @@
1515
import aiohttp
1616
import asyncio
1717
import hmac
18+
import datetime
1819
import hashlib
1920
import ssl
2021
import sys
@@ -314,11 +315,59 @@ async def callback(data: List[Any]):
314315
return
315316

316317
self.enabled = True
317-
logger.tsuccess("cluster.success.enable.enabled", id=self.id, port=Config.get("cluster.public_port"))
318+
logger.tsuccess(
319+
"cluster.success.enable.enabled",
320+
id=self.id,
321+
port=Config.get("cluster.public_port"),
322+
)
318323

319324
except Exception as e:
320325
logger.terror("cluster.error.enable.exception", e=e)
321326

327+
async def keepAlive(self) -> bool:
328+
if not self.enabled:
329+
logger.terror("cluster.error.keepalive.cluster_not_enabled")
330+
if not self.socket:
331+
logger.terror("cluster.error.keepalive.socket_not_setup")
332+
333+
future = asyncio.Future()
334+
335+
async def callback(data: List[Any]):
336+
future.set_result(data)
337+
338+
counter = self.router.counters
339+
340+
try:
341+
await self.socket.socket.emit(
342+
"keep-alive",
343+
data={
344+
"time": datetime.datetime.now(datetime.UTC)
345+
**counter,
346+
},
347+
callback=callback,
348+
)
349+
350+
response = await future
351+
error, date = (
352+
(response + [None, None])[:2]
353+
if isinstance(response, list)
354+
else (None, None)
355+
)
356+
357+
if error:
358+
logger.terror("cluster.error.keep_alive.error", e=error)
359+
return False
360+
361+
logger.tsuccess("cluster.success.keep_alive.success", hits=humanize.intcomma(counter.hits), bytes=humanize.naturalsize(counter.bytes, binary=True))
362+
363+
self.router.counters.bytes -= counter.bytes
364+
self.router.counters.hits -= counter.hits
365+
366+
return bool(date)
367+
368+
except Exception as e:
369+
logger.terror("cluster.error.keep_alive.error", e=e)
370+
322371
async def disable(self) -> None:
323372
if not self.socket or not self.enabled:
324373
return

core/config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"advanced.debug": False,
1010
"advanced.retry": 5,
1111
"advanced.delay": 15,
12+
"advanced.keep_alive": 10,
1213
"advanced.sync_interval": 60,
1314
"cluster.base_url": "https://openbmclapi.bangbang93.com",
1415
"cluster.id": "",

core/router.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from functools import wraps
22
from core.config import Config
3-
from core.classes import Storage
4-
from core.logger import logger
3+
from core.classes import Storage, Counters
54
from core.utils import checkSign
65
from typing import List, Union
76
from aiohttp import web
@@ -13,6 +12,7 @@ def __init__(self, app: web.Application, storages: List[Storage]) -> None:
1312
self.app = app
1413
self.secret = Config.get("cluster.secret")
1514
self.storages = storages
15+
self.counters = Counters(hits=0, bytes=0)
1616

1717
def route(self, path, method="GET"):
1818
def decorator(func):
@@ -38,7 +38,8 @@ async def _(
3838
data = await random.choice(self.storages).express(
3939
file_hash, request, response
4040
)
41-
logger.debug(data)
41+
self.counters.bytes += data["bytes"]
42+
self.counters.hits += data["hits"]
4243
return response
4344

4445
@self.route("/measure/{size}")

i18n/zh_cn.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
"cluster.info.disabling": "正在禁用节点……",
3030
"cluster.error.disable.exception": "在尝试禁用节点时发生错误:${e}",
3131
"cluster.error.enable.exception": "在尝试启用节点时发生错误:${e}",
32+
"cluster.error.keep_alive.cluster_not_enabled": "无法保活:节点未启用。",
33+
"cluster.error.keep_alive.socket_not_setup": "无法保活:WebSocket 客户端未创建。",
34+
"cluster.error.keep_alive.error": "保活失败:${e}",
3235
"cluster.error.disable.error": "无法禁用节点:${e}",
3336
"cluster.error.enable.error": "无法启用节点:${e}",
3437
"cluster.error.enable.failed": "节点启用失败。",

0 commit comments

Comments
 (0)