https://dev.kronoz.win/r/marzneshin.git
1from enum import Enum
2
3from pydantic import ConfigDict, BaseModel, Field
4
5
6class BackendConfigFormat(Enum):
7 PLAIN = 0
8 JSON = 1
9 YAML = 2
10
11
12class BackendConfig(BaseModel):
13 config: str
14 format: BackendConfigFormat
15
16
17class BackendStats(BaseModel):
18 running: bool
19
20
21class Backend(BaseModel):
22 name: str
23 backend_type: str
24 version: str | None
25 running: bool
26
27
28class NodeStatus(str, Enum):
29 healthy = "healthy"
30 unhealthy = "unhealthy"
31 disabled = "disabled"
32
33
34class NodeConnectionBackend(str, Enum):
35 grpcio = "grpcio"
36 grpclib = "grpclib"
37
38
39class NodeSettings(BaseModel):
40 min_node_version: str = "v0.2.0"
41 certificate: str
42
43
44class Node(BaseModel):
45 id: int | None = Field(None)
46 name: str
47 address: str
48 port: int = 53042
49 connection_backend: NodeConnectionBackend = Field(
50 default=NodeConnectionBackend.grpclib
51 )
52 usage_coefficient: float = Field(ge=0, default=1.0)
53 model_config = ConfigDict(from_attributes=True)
54
55
56class NodeCreate(Node):
57 model_config = ConfigDict(
58 json_schema_extra={
59 "example": {
60 "name": "DE node",
61 "address": "192.168.1.1",
62 "port": 53042,
63 "usage_coefficient": 1,
64 }
65 }
66 )
67
68
69class NodeModify(Node):
70 name: str | None = Field(None)
71 address: str | None = Field(None)
72 port: int | None = Field(None)
73 connection_backend: NodeConnectionBackend | None = Field(None)
74 status: NodeStatus | None = Field(None)
75 usage_coefficient: float | None = Field(None, ge=0)
76 model_config = ConfigDict(
77 json_schema_extra={
78 "example": {
79 "name": "DE node",
80 "address": "192.168.1.1",
81 "port": 53042,
82 "status": "disabled",
83 "usage_coefficient": 1.0,
84 }
85 }
86 )
87
88
89class NodeResponse(Node):
90 xray_version: str | None = None
91 status: NodeStatus
92 message: str | None = None
93 model_config = ConfigDict(from_attributes=True)
94 inbound_ids: list[int] | None = None
95 backends: list[Backend]
96
97
98class NodeUsageResponse(BaseModel):
99 node_id: int | None = None
100 node_name: str
101 uplink: int
102 downlink: int
103
104
105class NodesUsageResponse(BaseModel):
106 usages: list[NodeUsageResponse]