https://dev.kronoz.win/r/marzneshin.git
1from enum import Enum
2from typing import List, Optional
3
4from pydantic import ConfigDict, BaseModel, Field
5
6
7class NodeStatus(str, Enum):
8 healthy = "healthy"
9 unhealthy = "unhealthy"
10 disabled = "disabled"
11 none = "none"
12
13
14class NodeConnectionBackend(str, Enum):
15 grpcio = "grpcio"
16 grpclib = "grpclib"
17
18
19class NodeSettings(BaseModel):
20 min_node_version: str = "v0.2.0"
21 certificate: str
22
23
24class NodeBase(BaseModel):
25 id: Optional[int] = Field(None)
26 name: str
27 address: str
28 port: int = 62050
29 connection_backend: NodeConnectionBackend = Field(default=NodeConnectionBackend.grpclib)
30 usage_coefficient: float = Field(ge=0, default=1.0)
31 model_config = ConfigDict(from_attributes=True)
32
33
34from app.models.proxy import InboundBase
35
36
37class Node(NodeBase):
38 inbounds: Optional[List[InboundBase]] = None
39
40
41class NodeCreate(Node):
42 model_config = ConfigDict(json_schema_extra={
43 "example": {
44 "name": "DE node",
45 "address": "192.168.1.1",
46 "port": 62050,
47 "usage_coefficient": 1
48 }
49 })
50
51
52class NodeModify(Node):
53 name: Optional[str] = Field(None)
54 address: Optional[str] = Field(None)
55 port: Optional[int] = Field(None)
56 connection_backend: Optional[NodeConnectionBackend] = Field(None)
57 status: Optional[NodeStatus] = Field(None)
58 usage_coefficient: Optional[float] = Field(None)
59 model_config = ConfigDict(json_schema_extra={
60 "example": {
61 "name": "DE node",
62 "address": "192.168.1.1",
63 "port": 62050,
64 "api_port": 62051,
65 "status": "disabled",
66 "usage_coefficient": 1.0
67 }
68 })
69
70
71class NodeResponse(Node):
72 xray_version: Optional[str] = None
73 status: NodeStatus
74 message: Optional[str] = None
75 model_config = ConfigDict(from_attributes=True)
76
77
78class NodeUsageResponse(BaseModel):
79 node_id: Optional[int] = None
80 node_name: str
81 uplink: int
82 downlink: int
83
84
85class NodesUsageResponse(BaseModel):
86 usages: List[NodeUsageResponse]