Skip to content

Commit 5fb8630

Browse files
committed
chore: 优化一些内容
1 parent 9f2b04b commit 5fb8630

File tree

7 files changed

+93
-39
lines changed

7 files changed

+93
-39
lines changed

.gitignore

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,6 @@ logs
55
bmclapi
66
config
77
cache
8+
database
89

9-
start.sh
10-
11-
**/__pycache__
12-
13-
# pipy plugins
14-
tianxiu2b2t
10+
**/__pycache__

core/__init__.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from .config import API_VERSION, VERSION, cfg
1616
from .logger import logger
1717
from .utils import runtime
18+
from .database import init as init_database
1819
from . import web
1920
import platform
2021

@@ -52,9 +53,15 @@ def load_clusters():
5253
logger.terror("core.initialize.cluster.missing", err=e)
5354
continue
5455

56+
async def load_database():
57+
await init_database(
58+
cfg.get('database', {})
59+
)
60+
5561
async def load_config():
5662
load_storages()
5763
load_clusters()
64+
await load_database()
5865

5966
if clusters.count == 0 or clusters.storages.count == 0:
6067
logger.terror("core.initialize.missing", clusters=clusters.count, storages=clusters.storages.count)

core/cluster.py

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import datetime
55
import hmac
66
from pathlib import Path
7+
import sys
78
import tempfile
89
import time
910
from typing import Any, Optional
@@ -20,6 +21,7 @@
2021
from .logger import logger
2122
from .config import API_VERSION, ROOT_PATH, cfg, USER_AGENT
2223
from .storage import CheckStorage, StorageManager
24+
from .database import get_db
2325

2426
class TokenManager:
2527
def __init__(
@@ -132,12 +134,13 @@ class Cluster:
132134
def __init__(
133135
self,
134136
id: str,
135-
secret: str
137+
secret: str,
138+
manager: 'ClusterManager'
136139
):
137140
self._token = TokenManager(id, secret)
138141
self._last_modified = 0
139142
self.sio = socketio.AsyncClient(
140-
handle_sigint=False
143+
handle_sigint=False,
141144
)
142145
self._keepalive_lock = utils.CustomLock(locked=True)
143146
self._storage_wait = utils.CustomLock(locked=True)
@@ -149,6 +152,7 @@ def __init__(
149152
self._failed_keepalive = 0
150153
self._retry_times = 0
151154
self._task_group = None
155+
self._manager = manager
152156

153157
@property
154158
def id(self):
@@ -167,14 +171,17 @@ async def setup(
167171
@self.sio.on("warden-error") # type: ignore
168172
async def _(message: Any):
169173
logger.twarning("cluster.warden", id=self.id, msg=message)
174+
await get_db().insert_cluster_info(self.id, "server-push", "warden-error", message)
170175

171176
@self.sio.on("exception") # type: ignore
172177
async def _(message: Any):
173178
logger.terror("cluster.exception", id=self.id, msg=message)
179+
await get_db().insert_cluster_info(self.id, "server-push", "exception", message)
174180

175181
@self.sio.on("message") # type: ignore
176182
async def _(message: Any):
177183
logger.tinfo("cluster.message", id=self.id, msg=message)
184+
await get_db().insert_cluster_info(self.id, "server-push", "message", message)
178185

179186
@self.sio.on("connect") # type: ignore
180187
async def _():
@@ -183,6 +190,7 @@ async def _():
183190
return
184191
self._enabled = False
185192
logger.tinfo("cluster.reconnect", id=self.id)
193+
await get_db().insert_cluster_info(self.id, "socketio", "reconnect")
186194
await self.enable()
187195

188196

@@ -225,6 +233,10 @@ async def keepalive(self):
225233

226234
self.counter.hits -= current_counter.hits
227235
self.counter.bytes -= current_counter.bytes
236+
237+
# insert into db
238+
await get_db().upsert_cluster_counter(self.id, current_counter.hits, current_counter.bytes)
239+
228240
resp_time = time.time() - datetime.datetime.fromisoformat(res.ack).timestamp()
229241
logger.tsuccess("cluster.keepalive", id=self.id, hits=units.format_number(current_counter.hits), bytes=units.format_number(current_counter.bytes), delay=F"{resp_time * 1000:.4f}")
230242
except:
@@ -252,14 +264,19 @@ async def request_cert(self):
252264
return Certificate(CertificateType.CLUSTER, str(cert), str(key))
253265

254266
async def connect(self):
255-
await self.sio.connect(
256-
cfg.base_url,
257-
transports=['websocket'],
258-
headers={
259-
"User-Agent": USER_AGENT,
260-
},
261-
auth=self._token.get_socketio_token
262-
)
267+
try:
268+
await self.sio.connect(
269+
cfg.base_url,
270+
transports=['websocket'],
271+
headers={
272+
"User-Agent": USER_AGENT,
273+
},
274+
auth=self._token.get_socketio_token
275+
)
276+
except:
277+
logger.debug_traceback()
278+
await anyio.sleep(5)
279+
await self.connect()
263280

264281
async def emit(self, event: str, data: Any = None, timeout: Optional[int] = None) -> SocketEmitResult:
265282
err, ack = None, None
@@ -269,8 +286,13 @@ async def callback(data: Any):
269286
err, ack = data
270287
else:
271288
err, ack = data, None
289+
if event not in ("keep-alive", ):
290+
await get_db().insert_cluster_info(self.id, "server", event, err)
272291
fut.set()
273292

293+
if event not in ("keep-alive", ):
294+
await get_db().insert_cluster_info(self.id, "client", event)
295+
274296
await self.sio.emit(event, data, callback=callback)
275297

276298
fut = anyio.Event()
@@ -352,8 +374,8 @@ async def enable(self):
352374
"noFastEnable": False,
353375
"byoc": utils.get_certificate_type() != CertificateType.CLUSTER,
354376
"flavor": {
355-
"runtime": "python",
356-
"storage": "local"
377+
"runtime": f"python/{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}",
378+
"storage": self._manager.storages.get_storage_type.type
357379
}
358380
}, 300)
359381
if res.err is not None:
@@ -546,7 +568,7 @@ def add_cluster(
546568
id: str,
547569
secret: str
548570
):
549-
self._clusters[id] = Cluster(id, secret)
571+
self._clusters[id] = Cluster(id, secret, self)
550572

551573
def get_cluster(
552574
self,

core/config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@ def _get_keys(self, key: str):
2828
def get(self, key: str, default = None) -> Any:
2929
val = os.getenv(key) or self._get_value(self._data, self._get_keys(key))
3030
if val is None:
31-
print(f"[Config] Key '{key}' is not set?")
3231
if key in DEFAULT_CONFIG:
3332
self.set(key, DEFAULT_CONFIG[key])
3433
val = DEFAULT_CONFIG[key]
3534
self.save()
3635
else:
36+
print(f"[Config] Key '{key}' is not set?")
3737
val = default
3838
return val
3939

core/logger.py

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -80,24 +80,6 @@ def tdebug_traceback(self, key: str, *args, **kwargs):
8080

8181
logger = Loglogger()
8282

83-
class LoguruHandler(logging.Handler): # pragma: no cover
84-
"""logging 与 loguru 之间的桥梁,将 logging 的日志转发到 loguru。"""
85-
86-
def emit(self, record: logging.LogRecord):
87-
try:
88-
level = Logger.level(record.levelname).name
89-
except ValueError:
90-
level = record.levelno
91-
92-
frame, depth = inspect.currentframe(), 0
93-
while frame and (depth == 0 or frame.f_code.co_filename == logging.__file__):
94-
frame = frame.f_back
95-
depth += 1
96-
97-
logger._log_with_args(
98-
level,
99-
record.getMessage(),
100-
)
10183

10284
def _log(*values):
10385
data = []
@@ -118,7 +100,10 @@ def emit(self, record):
118100
except ValueError:
119101
level = record.levelno
120102

121-
print(level, record.getMessage())
103+
logger.log.opt(depth=6).log(
104+
level,
105+
record.getMessage(),
106+
)
122107

123108
# 配置拦截处理器
124109
logging.basicConfig(handlers=[InterceptHandler()], level=logging.DEBUG)

core/storage/__init__.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from collections import deque
2+
from dataclasses import dataclass
23
from typing import Type
34

45
import anyio.abc
@@ -22,6 +23,26 @@
2223
"s3": S3Storage
2324
}
2425

26+
@dataclass
27+
class StorageTypeCount:
28+
file: int = 0
29+
alist: int = 0
30+
webdav: int = 0
31+
s3: int = 0
32+
33+
@property
34+
def type(self):
35+
res = []
36+
if self.file > 0:
37+
res.append("file")
38+
if self.alist > 0:
39+
res.append("alist")
40+
if self.webdav > 0:
41+
res.append("webdav")
42+
if self.s3 > 0:
43+
res.append("s3")
44+
return "+".join(res)
45+
2546
class StorageManager:
2647
def __init__(
2748
self
@@ -30,6 +51,20 @@ def __init__(
3051
self._weight_storages: deque[Storage] = deque()
3152
self._online_storages: deque[Storage] = deque()
3253
self._status = False
54+
55+
@property
56+
def get_storage_type(self):
57+
res = StorageTypeCount()
58+
for storage in self._storages:
59+
if isinstance(storage, LocalStorage):
60+
res.file += 1
61+
elif isinstance(storage, AlistStorage):
62+
res.alist += 1
63+
elif isinstance(storage, WebDavStorage):
64+
res.webdav += 1
65+
elif isinstance(storage, S3Storage):
66+
res.s3 += 1
67+
return res
3368

3469

3570
def add_storage(

core/storage/alist.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ def __init__(
2121

2222
def __repr__(self):
2323
return f"<AlistResponse code={self.code} data={self.data} message={self.message}>"
24+
25+
def raise_for_status(self):
26+
if self.code == 200:
27+
return
28+
raise Exception(f"Status: {self.code}, message: {self.message}")
29+
2430

2531
class AlistStorage(abc.Storage):
2632
type = "alist"
@@ -64,6 +70,8 @@ async def _fetch_token(self):
6470
}
6571
) as resp:
6672
data = AlistResponse(await resp.json())
73+
data.raise_for_status()
74+
6775
self._token = data.data["token"]
6876

6977
assert self._task_group is not None
@@ -155,6 +163,7 @@ async def upload(self, path: str, tmp_file: _TemporaryFileWrapper):
155163
data=tmp_file.file
156164
) as resp:
157165
data = AlistResponse(await resp.json())
166+
data.raise_for_status()
158167
return True
159168

160169
async def get_response_file(self, hash: str) -> abc.ResponseFile:

0 commit comments

Comments
 (0)