gitscope
← marzneshin / v0.5.0 / app/models/node.py
https://dev.kronoz.win/r/marzneshin.git
app/models/node.py · Python
Blame Raw
  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]