remnawave-api 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- remnawave_api/.DS_Store +0 -0
- remnawave_api/__init__.py +90 -0
- remnawave_api/controllers/__init__.py +37 -0
- remnawave_api/controllers/api_tokens_management.py +33 -0
- remnawave_api/controllers/auth.py +37 -0
- remnawave_api/controllers/bandwidthstats.py +17 -0
- remnawave_api/controllers/hosts.py +64 -0
- remnawave_api/controllers/hosts_bulk_actions.py +60 -0
- remnawave_api/controllers/inbounds.py +18 -0
- remnawave_api/controllers/inbounds_bulk_actions.py +50 -0
- remnawave_api/controllers/keygen.py +11 -0
- remnawave_api/controllers/nodes.py +95 -0
- remnawave_api/controllers/subscription.py +54 -0
- remnawave_api/controllers/subscriptions_settings.py +29 -0
- remnawave_api/controllers/subscriptions_template.py +31 -0
- remnawave_api/controllers/system.py +29 -0
- remnawave_api/controllers/users.py +131 -0
- remnawave_api/controllers/users_bulk_actions.py +89 -0
- remnawave_api/controllers/users_stats.py +21 -0
- remnawave_api/controllers/xray_config.py +23 -0
- remnawave_api/enums/__init__.py +18 -0
- remnawave_api/enums/alpn.py +10 -0
- remnawave_api/enums/client_type.py +10 -0
- remnawave_api/enums/error_code.py +80 -0
- remnawave_api/enums/fingerprint.py +13 -0
- remnawave_api/enums/security_layer.py +7 -0
- remnawave_api/enums/template_type.py +10 -0
- remnawave_api/enums/users.py +15 -0
- remnawave_api/exceptions/__init__.py +23 -0
- remnawave_api/exceptions/general.py +61 -0
- remnawave_api/exceptions/handler.py +130 -0
- remnawave_api/models/__init__.py +167 -0
- remnawave_api/models/api_tokens_management.py +10 -0
- remnawave_api/models/auth.py +26 -0
- remnawave_api/models/bandwidthstats.py +21 -0
- remnawave_api/models/hosts.py +91 -0
- remnawave_api/models/hosts_bulk_actions.py +31 -0
- remnawave_api/models/inbounds.py +38 -0
- remnawave_api/models/inbounds_bulk_actions.py +17 -0
- remnawave_api/models/keygen.py +5 -0
- remnawave_api/models/nodes.py +113 -0
- remnawave_api/models/subscription.py +26 -0
- remnawave_api/models/subscriptions_settings.py +57 -0
- remnawave_api/models/subscriptions_template.py +21 -0
- remnawave_api/models/system.py +70 -0
- remnawave_api/models/users.py +131 -0
- remnawave_api/models/users_bulk_actions.py +52 -0
- remnawave_api/models/users_stats.py +17 -0
- remnawave_api/models/xray_config.py +5 -0
- remnawave_api/rapid/__init__.py +5 -0
- remnawave_api/rapid/annotations.py +5 -0
- remnawave_api/rapid/client.py +210 -0
- remnawave_api/rapid/decorators.py +54 -0
- remnawave_api/utils/__init__.py +0 -0
- remnawave_api/utils/serializer.py +7 -0
- remnawave_api-1.0.0.dist-info/LICENSE +21 -0
- remnawave_api-1.0.0.dist-info/METADATA +94 -0
- remnawave_api-1.0.0.dist-info/RECORD +59 -0
- remnawave_api-1.0.0.dist-info/WHEEL +4 -0
remnawave_api/.DS_Store
ADDED
|
Binary file
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
import httpx
|
|
5
|
+
|
|
6
|
+
from remnawave_api.controllers import (
|
|
7
|
+
APITokensManagementController,
|
|
8
|
+
AuthController,
|
|
9
|
+
BandWidthStatsController,
|
|
10
|
+
HostsBulkActionsController,
|
|
11
|
+
HostsController,
|
|
12
|
+
InboundsBulkActionsController,
|
|
13
|
+
InboundsController,
|
|
14
|
+
KeygenController,
|
|
15
|
+
NodesController,
|
|
16
|
+
SubscriptionController,
|
|
17
|
+
SubscriptionsSettingsController,
|
|
18
|
+
SubscriptionsTemplateController,
|
|
19
|
+
SystemController,
|
|
20
|
+
UsersBulkActionsController,
|
|
21
|
+
UsersController,
|
|
22
|
+
UsersStatsController,
|
|
23
|
+
XrayConfigController,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class RemnawaveSDK:
|
|
28
|
+
def __init__(
|
|
29
|
+
self,
|
|
30
|
+
client: Optional[httpx.AsyncClient] = None,
|
|
31
|
+
base_url: Optional[str] = None,
|
|
32
|
+
token: Optional[str] = None,
|
|
33
|
+
):
|
|
34
|
+
self._client = client
|
|
35
|
+
self._token = token
|
|
36
|
+
self.base_url = base_url
|
|
37
|
+
|
|
38
|
+
self._validate_params()
|
|
39
|
+
|
|
40
|
+
if self._client is None:
|
|
41
|
+
self._client = self._prepare_client()
|
|
42
|
+
|
|
43
|
+
self.api_tokens_management = APITokensManagementController(self._client)
|
|
44
|
+
self.auth = AuthController(self._client)
|
|
45
|
+
self.bandwidthstats = BandWidthStatsController(self._client)
|
|
46
|
+
self.hosts = HostsController(self._client)
|
|
47
|
+
self.hosts_bulk_actions = HostsBulkActionsController(self._client)
|
|
48
|
+
self.inbounds = InboundsController(self._client)
|
|
49
|
+
self.inbounds_bulk_actions = InboundsBulkActionsController(self._client)
|
|
50
|
+
self.keygen = KeygenController(self._client)
|
|
51
|
+
self.nodes = NodesController(self._client)
|
|
52
|
+
self.subscription = SubscriptionController(self._client)
|
|
53
|
+
self.subscriptions_settings = SubscriptionsSettingsController(self._client)
|
|
54
|
+
self.subscriptions_template = SubscriptionsTemplateController(self._client)
|
|
55
|
+
self.system = SystemController(self._client)
|
|
56
|
+
self.users = UsersController(self._client)
|
|
57
|
+
self.users_bulk_actions = UsersBulkActionsController(self._client)
|
|
58
|
+
self.users_stats = UsersStatsController(self._client)
|
|
59
|
+
self.xray_config = XrayConfigController(self._client)
|
|
60
|
+
|
|
61
|
+
def _validate_params(self) -> None:
|
|
62
|
+
if self._client is None:
|
|
63
|
+
if self.base_url is None or self._token is None:
|
|
64
|
+
raise ValueError(
|
|
65
|
+
"base_url and token must be provided if client is not provided"
|
|
66
|
+
)
|
|
67
|
+
else:
|
|
68
|
+
if self.base_url is not None or self._token is not None:
|
|
69
|
+
logging.warning(
|
|
70
|
+
"base_url and token will be ignored if client is provided"
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
def _prepare_client(self) -> httpx.AsyncClient:
|
|
74
|
+
return httpx.AsyncClient(
|
|
75
|
+
base_url=self._prepare_url(), headers=self._prepare_headers()
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
def _prepare_headers(self) -> dict:
|
|
79
|
+
if not self._token.startswith("Bearer "):
|
|
80
|
+
self._token = "Bearer " + self._token
|
|
81
|
+
return {"Authorization": self._token}
|
|
82
|
+
|
|
83
|
+
def _prepare_url(self) -> str:
|
|
84
|
+
if self.base_url.endswith("/"):
|
|
85
|
+
self.base_url[:-1]
|
|
86
|
+
|
|
87
|
+
if not self.base_url.endswith("/api"):
|
|
88
|
+
self.base_url += "/api"
|
|
89
|
+
|
|
90
|
+
return self.base_url
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from .api_tokens_management import APITokensManagementController
|
|
2
|
+
from .auth import AuthController
|
|
3
|
+
from .bandwidthstats import BandWidthStatsController
|
|
4
|
+
from .hosts import HostsController
|
|
5
|
+
from .hosts_bulk_actions import HostsBulkActionsController
|
|
6
|
+
from .inbounds import InboundsController
|
|
7
|
+
from .inbounds_bulk_actions import InboundsBulkActionsController
|
|
8
|
+
from .keygen import KeygenController
|
|
9
|
+
from .nodes import NodesController
|
|
10
|
+
from .subscription import SubscriptionController
|
|
11
|
+
from .subscriptions_settings import SubscriptionsSettingsController
|
|
12
|
+
from .subscriptions_template import SubscriptionsTemplateController
|
|
13
|
+
from .system import SystemController
|
|
14
|
+
from .users import UsersController
|
|
15
|
+
from .users_bulk_actions import UsersBulkActionsController
|
|
16
|
+
from .users_stats import UsersStatsController
|
|
17
|
+
from .xray_config import XrayConfigController
|
|
18
|
+
|
|
19
|
+
__all__ = [
|
|
20
|
+
"APITokensManagementController",
|
|
21
|
+
"AuthController",
|
|
22
|
+
"BandWidthStatsController",
|
|
23
|
+
"HostsController",
|
|
24
|
+
"HostsBulkActionsController",
|
|
25
|
+
"InboundsController",
|
|
26
|
+
"InboundsBulkActionsController",
|
|
27
|
+
"KeygenController",
|
|
28
|
+
"NodesController",
|
|
29
|
+
"SubscriptionController",
|
|
30
|
+
"SubscriptionsSettingsController",
|
|
31
|
+
"SubscriptionsTemplateController",
|
|
32
|
+
"SystemController",
|
|
33
|
+
"UsersController",
|
|
34
|
+
"UsersBulkActionsController",
|
|
35
|
+
"UsersStatsController",
|
|
36
|
+
"XrayConfigController",
|
|
37
|
+
]
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from typing import Annotated
|
|
2
|
+
|
|
3
|
+
from httpx import Response
|
|
4
|
+
from rapid_api_client import Path
|
|
5
|
+
from rapid_api_client.annotations import PydanticBody
|
|
6
|
+
|
|
7
|
+
from remnawave_api.models import CreateApiTokenRequestDto
|
|
8
|
+
from remnawave_api.rapid import BaseController, delete, get, post
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class APITokensManagementController(BaseController):
|
|
12
|
+
@post("/tokens/create", response_class=Response)
|
|
13
|
+
async def create(
|
|
14
|
+
self,
|
|
15
|
+
body: Annotated[CreateApiTokenRequestDto, PydanticBody()],
|
|
16
|
+
) -> Response:
|
|
17
|
+
"""Create new API token"""
|
|
18
|
+
...
|
|
19
|
+
|
|
20
|
+
@delete("/tokens/delete/{uuid}", response_class=Response)
|
|
21
|
+
async def delete(
|
|
22
|
+
self,
|
|
23
|
+
uuid: Annotated[str, Path(description="UUID of the API token")],
|
|
24
|
+
) -> Response:
|
|
25
|
+
"""Delete API token"""
|
|
26
|
+
...
|
|
27
|
+
|
|
28
|
+
@get("/tokens", response_class=Response)
|
|
29
|
+
async def find_all(
|
|
30
|
+
self,
|
|
31
|
+
) -> Response:
|
|
32
|
+
"""Get all API tokens"""
|
|
33
|
+
...
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from typing import Annotated
|
|
2
|
+
|
|
3
|
+
from rapid_api_client.annotations import PydanticBody
|
|
4
|
+
|
|
5
|
+
from remnawave_api.models import (
|
|
6
|
+
LoginRequestDto,
|
|
7
|
+
LoginResponseDto,
|
|
8
|
+
RegisterRequestDto,
|
|
9
|
+
RegisterResponseDto,
|
|
10
|
+
StatusResponseDto,
|
|
11
|
+
)
|
|
12
|
+
from remnawave_api.rapid import BaseController, get, post
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class AuthController(BaseController):
|
|
16
|
+
@post("/auth/login", response_class=LoginResponseDto)
|
|
17
|
+
async def login(
|
|
18
|
+
self,
|
|
19
|
+
body: Annotated[LoginRequestDto, PydanticBody()],
|
|
20
|
+
) -> LoginResponseDto:
|
|
21
|
+
"""Login"""
|
|
22
|
+
...
|
|
23
|
+
|
|
24
|
+
@post("/auth/register", response_class=RegisterResponseDto)
|
|
25
|
+
async def register(
|
|
26
|
+
self,
|
|
27
|
+
body: Annotated[RegisterRequestDto, PydanticBody()],
|
|
28
|
+
) -> RegisterResponseDto:
|
|
29
|
+
"""Register"""
|
|
30
|
+
...
|
|
31
|
+
|
|
32
|
+
@get("/auth/status", response_class=StatusResponseDto)
|
|
33
|
+
async def get_status(
|
|
34
|
+
self,
|
|
35
|
+
) -> StatusResponseDto:
|
|
36
|
+
"""Get status"""
|
|
37
|
+
...
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from typing import Annotated
|
|
2
|
+
|
|
3
|
+
from rapid_api_client import Query
|
|
4
|
+
|
|
5
|
+
from remnawave_api.models import NodesUsageResponseDto
|
|
6
|
+
from remnawave_api.rapid import BaseController, get
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class BandWidthStatsController(BaseController):
|
|
10
|
+
@get("/nodes/usage/range", response_class=NodesUsageResponseDto)
|
|
11
|
+
async def get_nodes_usage_by_range(
|
|
12
|
+
self,
|
|
13
|
+
start: Annotated[str, Query(description="Start date in ISO format")],
|
|
14
|
+
end: Annotated[str, Query(description="End date in ISO format")],
|
|
15
|
+
) -> NodesUsageResponseDto:
|
|
16
|
+
"""Get Nodes Usage By Range"""
|
|
17
|
+
...
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
from typing import Annotated, List
|
|
2
|
+
|
|
3
|
+
from rapid_api_client import Path
|
|
4
|
+
from rapid_api_client.annotations import PydanticBody
|
|
5
|
+
|
|
6
|
+
from remnawave_api.models import (
|
|
7
|
+
CreateHostRequestDto,
|
|
8
|
+
DeleteHostResponseDto,
|
|
9
|
+
HostResponseDto,
|
|
10
|
+
HostsResponseDto,
|
|
11
|
+
ReorderHostRequestDto,
|
|
12
|
+
ReorderHostResponseDto,
|
|
13
|
+
UpdateHostRequestDto,
|
|
14
|
+
)
|
|
15
|
+
from remnawave_api.rapid import AttributeBody, BaseController, delete, get, post
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class HostsController(BaseController):
|
|
19
|
+
@post("/hosts/create", response_class=HostResponseDto)
|
|
20
|
+
async def create_host(
|
|
21
|
+
self,
|
|
22
|
+
body: Annotated[CreateHostRequestDto, PydanticBody()],
|
|
23
|
+
) -> HostResponseDto:
|
|
24
|
+
"""Create Host"""
|
|
25
|
+
...
|
|
26
|
+
|
|
27
|
+
@post("/hosts/update", response_class=HostResponseDto)
|
|
28
|
+
async def update_host(
|
|
29
|
+
self,
|
|
30
|
+
body: Annotated[UpdateHostRequestDto, PydanticBody()],
|
|
31
|
+
) -> HostResponseDto:
|
|
32
|
+
"""Update Host"""
|
|
33
|
+
...
|
|
34
|
+
|
|
35
|
+
@get("/hosts/all", response_class=HostsResponseDto)
|
|
36
|
+
async def get_all_hosts(
|
|
37
|
+
self,
|
|
38
|
+
) -> HostsResponseDto:
|
|
39
|
+
"""Get All Hosts"""
|
|
40
|
+
...
|
|
41
|
+
|
|
42
|
+
@get("/hosts/get-one/{uuid}", response_class=HostResponseDto)
|
|
43
|
+
async def get_one_host(
|
|
44
|
+
self,
|
|
45
|
+
uuid: Annotated[str, Path(description="UUID of the host")],
|
|
46
|
+
) -> HostResponseDto:
|
|
47
|
+
"""Get One Host"""
|
|
48
|
+
...
|
|
49
|
+
|
|
50
|
+
@post("/hosts/reorder", response_class=ReorderHostResponseDto)
|
|
51
|
+
async def reorder_hosts(
|
|
52
|
+
self,
|
|
53
|
+
hosts: Annotated[List[ReorderHostRequestDto], AttributeBody()],
|
|
54
|
+
) -> ReorderHostResponseDto:
|
|
55
|
+
"""Reorder Hosts"""
|
|
56
|
+
...
|
|
57
|
+
|
|
58
|
+
@delete("/hosts/delete/{uuid}", response_class=DeleteHostResponseDto)
|
|
59
|
+
async def delete_host(
|
|
60
|
+
self,
|
|
61
|
+
uuid: Annotated[str, Path(description="UUID of the host")],
|
|
62
|
+
) -> DeleteHostResponseDto:
|
|
63
|
+
"""Delete Host"""
|
|
64
|
+
...
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
from typing import Annotated, List
|
|
2
|
+
from uuid import UUID
|
|
3
|
+
|
|
4
|
+
from rapid_api_client import PydanticBody
|
|
5
|
+
|
|
6
|
+
from remnawave_api.models import (
|
|
7
|
+
BulkDeleteHostsResponseDto,
|
|
8
|
+
BulkDisableHostsResponseDto,
|
|
9
|
+
BulkEnableHostsResponseDto,
|
|
10
|
+
SetInboundToManyHostsRequestDto,
|
|
11
|
+
SetInboundToManyHostsResponseDto,
|
|
12
|
+
SetPortToManyHostsResponseDto,
|
|
13
|
+
)
|
|
14
|
+
from remnawave_api.rapid import AttributeBody, BaseController, post
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class HostsBulkActionsController(BaseController):
|
|
18
|
+
@post("/hosts/bulk/delete", response_class=BulkDeleteHostsResponseDto)
|
|
19
|
+
async def delete_hosts(
|
|
20
|
+
self,
|
|
21
|
+
uuids: Annotated[List[UUID], AttributeBody()],
|
|
22
|
+
) -> BulkDeleteHostsResponseDto:
|
|
23
|
+
"""Delete many hosts"""
|
|
24
|
+
...
|
|
25
|
+
|
|
26
|
+
@post("/hosts/bulk/disable", response_class=BulkDisableHostsResponseDto)
|
|
27
|
+
async def disable_hosts(
|
|
28
|
+
self,
|
|
29
|
+
uuids: Annotated[List[UUID], AttributeBody()],
|
|
30
|
+
) -> BulkDisableHostsResponseDto:
|
|
31
|
+
"""Disable many hosts"""
|
|
32
|
+
...
|
|
33
|
+
|
|
34
|
+
@post("/hosts/bulk/enable", response_class=BulkEnableHostsResponseDto)
|
|
35
|
+
async def enable_hosts(
|
|
36
|
+
self,
|
|
37
|
+
uuids: Annotated[List[UUID], AttributeBody()],
|
|
38
|
+
) -> BulkEnableHostsResponseDto:
|
|
39
|
+
"""Enable many hosts"""
|
|
40
|
+
...
|
|
41
|
+
|
|
42
|
+
@post(
|
|
43
|
+
"/hosts/bulk/set-inbound",
|
|
44
|
+
response_class=SetInboundToManyHostsResponseDto,
|
|
45
|
+
)
|
|
46
|
+
async def set_inbound_to_hosts(
|
|
47
|
+
self,
|
|
48
|
+
body: Annotated[SetInboundToManyHostsRequestDto, PydanticBody()],
|
|
49
|
+
) -> SetInboundToManyHostsResponseDto:
|
|
50
|
+
"""Set inbound to many hosts"""
|
|
51
|
+
...
|
|
52
|
+
|
|
53
|
+
@post("/hosts/bulk/set-port", response_class=SetPortToManyHostsResponseDto)
|
|
54
|
+
async def set_port_to_hosts(
|
|
55
|
+
self,
|
|
56
|
+
uuids: Annotated[List[UUID], AttributeBody()],
|
|
57
|
+
port: Annotated[float, AttributeBody()],
|
|
58
|
+
) -> SetPortToManyHostsResponseDto:
|
|
59
|
+
"""Set port to many hosts"""
|
|
60
|
+
...
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from remnawave_api.models import FullInboundsResponseDto, InboundsResponseDto
|
|
2
|
+
from remnawave_api.rapid import BaseController, get
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class InboundsController(BaseController):
|
|
6
|
+
@get("/inbounds", response_class=InboundsResponseDto)
|
|
7
|
+
async def get_inbounds(
|
|
8
|
+
self,
|
|
9
|
+
) -> InboundsResponseDto:
|
|
10
|
+
"""Get Inbounds"""
|
|
11
|
+
...
|
|
12
|
+
|
|
13
|
+
@get("/inbounds/full", response_class=FullInboundsResponseDto)
|
|
14
|
+
async def get_full_inbounds(
|
|
15
|
+
self,
|
|
16
|
+
) -> FullInboundsResponseDto:
|
|
17
|
+
"""Get Full Inbounds"""
|
|
18
|
+
...
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
from typing import Annotated
|
|
2
|
+
from uuid import UUID
|
|
3
|
+
|
|
4
|
+
from remnawave_api.models import (
|
|
5
|
+
AddInboundToNodesResponseDto,
|
|
6
|
+
AddInboundToUsersResponseDto,
|
|
7
|
+
RemoveInboundFromNodesResponseDto,
|
|
8
|
+
RemoveInboundFromUsersResponseDto,
|
|
9
|
+
)
|
|
10
|
+
from remnawave_api.rapid import AttributeBody, BaseController, post
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class InboundsBulkActionsController(BaseController):
|
|
14
|
+
@post("/inbounds/bulk/add-to-users", response_class=AddInboundToUsersResponseDto)
|
|
15
|
+
async def add_inbound_to_users(
|
|
16
|
+
self,
|
|
17
|
+
inbound_uuid: Annotated[UUID, AttributeBody()],
|
|
18
|
+
) -> AddInboundToUsersResponseDto:
|
|
19
|
+
"""Add Inbound To Users"""
|
|
20
|
+
...
|
|
21
|
+
|
|
22
|
+
@post(
|
|
23
|
+
"/inbounds/bulk/remove-from-users",
|
|
24
|
+
response_class=RemoveInboundFromUsersResponseDto,
|
|
25
|
+
)
|
|
26
|
+
async def remove_inbound_from_users(
|
|
27
|
+
self,
|
|
28
|
+
inbound_uuid: Annotated[UUID, AttributeBody()],
|
|
29
|
+
) -> RemoveInboundFromUsersResponseDto:
|
|
30
|
+
"""Remove Inbound From Users"""
|
|
31
|
+
...
|
|
32
|
+
|
|
33
|
+
@post("/inbounds/bulk/add-to-nodes", response_class=AddInboundToNodesResponseDto)
|
|
34
|
+
async def add_inbound_to_nodes(
|
|
35
|
+
self,
|
|
36
|
+
inbound_uuid: Annotated[UUID, AttributeBody()],
|
|
37
|
+
) -> AddInboundToNodesResponseDto:
|
|
38
|
+
"""Add Inbound To All Nodes"""
|
|
39
|
+
...
|
|
40
|
+
|
|
41
|
+
@post(
|
|
42
|
+
"/inbounds/bulk/remove-from-nodes",
|
|
43
|
+
response_class=RemoveInboundFromNodesResponseDto,
|
|
44
|
+
)
|
|
45
|
+
async def remove_inbound_from_nodes(
|
|
46
|
+
self,
|
|
47
|
+
inbound_uuid: Annotated[UUID, AttributeBody()],
|
|
48
|
+
) -> RemoveInboundFromNodesResponseDto:
|
|
49
|
+
"""Remove Inbound From All Nodes"""
|
|
50
|
+
...
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from remnawave_api.models import PubKeyResponseDto
|
|
2
|
+
from remnawave_api.rapid import BaseController, get
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class KeygenController(BaseController):
|
|
6
|
+
@get("/keygen/get", response_class=PubKeyResponseDto)
|
|
7
|
+
async def generate_key(
|
|
8
|
+
self,
|
|
9
|
+
) -> PubKeyResponseDto:
|
|
10
|
+
"""Get Public Key"""
|
|
11
|
+
...
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
from typing import Annotated, List
|
|
2
|
+
|
|
3
|
+
from rapid_api_client import Path
|
|
4
|
+
from rapid_api_client.annotations import PydanticBody
|
|
5
|
+
|
|
6
|
+
from remnawave_api.models import (
|
|
7
|
+
CreateNodeRequestDto,
|
|
8
|
+
DeleteNodeResponseDto,
|
|
9
|
+
NodeResponseDto,
|
|
10
|
+
NodesResponseDto,
|
|
11
|
+
ReorderNodeRequestDto,
|
|
12
|
+
RestartNodeResponseDto,
|
|
13
|
+
UpdateNodeRequestDto,
|
|
14
|
+
)
|
|
15
|
+
from remnawave_api.rapid import AttributeBody, BaseController, delete, get, patch, post
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class NodesController(BaseController):
|
|
19
|
+
@post("/nodes/create", response_class=NodeResponseDto)
|
|
20
|
+
async def create_node(
|
|
21
|
+
self,
|
|
22
|
+
body: Annotated[CreateNodeRequestDto, PydanticBody()],
|
|
23
|
+
) -> NodeResponseDto:
|
|
24
|
+
"""Create Node"""
|
|
25
|
+
...
|
|
26
|
+
|
|
27
|
+
@get("/nodes/get-all", response_class=NodesResponseDto)
|
|
28
|
+
async def get_all_nodes(
|
|
29
|
+
self,
|
|
30
|
+
) -> NodesResponseDto:
|
|
31
|
+
"""Get All Nodes"""
|
|
32
|
+
...
|
|
33
|
+
|
|
34
|
+
@get("/nodes/get-one/{uuid}", response_class=NodeResponseDto)
|
|
35
|
+
async def get_one_node(
|
|
36
|
+
self,
|
|
37
|
+
uuid: Annotated[str, Path(description="Node UUID")],
|
|
38
|
+
) -> NodeResponseDto:
|
|
39
|
+
"""Get One Node"""
|
|
40
|
+
...
|
|
41
|
+
|
|
42
|
+
@patch("/nodes/enable/{uuid}", response_class=NodeResponseDto)
|
|
43
|
+
async def enable_node(
|
|
44
|
+
self,
|
|
45
|
+
uuid: Annotated[str, Path(description="Node UUID")],
|
|
46
|
+
) -> NodeResponseDto:
|
|
47
|
+
"""Enable Node"""
|
|
48
|
+
...
|
|
49
|
+
|
|
50
|
+
@patch("/nodes/disable/{uuid}", response_class=NodeResponseDto)
|
|
51
|
+
async def disable_node(
|
|
52
|
+
self,
|
|
53
|
+
uuid: Annotated[str, Path(description="Node UUID")],
|
|
54
|
+
) -> NodeResponseDto:
|
|
55
|
+
"""Disable Node"""
|
|
56
|
+
...
|
|
57
|
+
|
|
58
|
+
@delete("/nodes/delete/{uuid}", response_class=DeleteNodeResponseDto)
|
|
59
|
+
async def delete_node(
|
|
60
|
+
self,
|
|
61
|
+
uuid: Annotated[str, Path(description="Node UUID")],
|
|
62
|
+
) -> DeleteNodeResponseDto:
|
|
63
|
+
"""Delete Node"""
|
|
64
|
+
...
|
|
65
|
+
|
|
66
|
+
@post("/nodes/update", response_class=NodeResponseDto)
|
|
67
|
+
async def update_node(
|
|
68
|
+
self,
|
|
69
|
+
body: Annotated[UpdateNodeRequestDto, PydanticBody()],
|
|
70
|
+
) -> NodeResponseDto:
|
|
71
|
+
"""Update Node"""
|
|
72
|
+
...
|
|
73
|
+
|
|
74
|
+
@get("/nodes/restart/{uuid}", response_class=RestartNodeResponseDto)
|
|
75
|
+
async def restart_node(
|
|
76
|
+
self,
|
|
77
|
+
uuid: Annotated[str, Path(description="Node UUID")],
|
|
78
|
+
) -> RestartNodeResponseDto:
|
|
79
|
+
"""Restart Node"""
|
|
80
|
+
...
|
|
81
|
+
|
|
82
|
+
@patch("/nodes/restart-all", response_class=RestartNodeResponseDto)
|
|
83
|
+
async def restart_all_nodes(
|
|
84
|
+
self,
|
|
85
|
+
) -> RestartNodeResponseDto:
|
|
86
|
+
"""Restart All Nodes"""
|
|
87
|
+
...
|
|
88
|
+
|
|
89
|
+
@post("/nodes/reorder", response_class=NodesResponseDto)
|
|
90
|
+
async def reorder_nodes(
|
|
91
|
+
self,
|
|
92
|
+
nodes: Annotated[List[ReorderNodeRequestDto], AttributeBody()],
|
|
93
|
+
) -> NodesResponseDto:
|
|
94
|
+
"""Reorder Nodes"""
|
|
95
|
+
...
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
from typing import Annotated
|
|
2
|
+
|
|
3
|
+
from rapid_api_client import Path
|
|
4
|
+
|
|
5
|
+
from remnawave_api.enums import ClientType
|
|
6
|
+
from remnawave_api.models import SubscriptionInfoResponseDto
|
|
7
|
+
from remnawave_api.rapid import BaseController, get
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class SubscriptionController(BaseController):
|
|
11
|
+
@get("/sub/{short_uuid}/info", response_class=SubscriptionInfoResponseDto)
|
|
12
|
+
async def get_subscription_info_by_short_uuid(
|
|
13
|
+
self,
|
|
14
|
+
short_uuid: Annotated[str, Path(description="Short UUID of the user")],
|
|
15
|
+
) -> SubscriptionInfoResponseDto:
|
|
16
|
+
"""None"""
|
|
17
|
+
...
|
|
18
|
+
|
|
19
|
+
@get("/sub/{short_uuid}", response_class=str)
|
|
20
|
+
async def get_subscription(
|
|
21
|
+
self,
|
|
22
|
+
short_uuid: Annotated[str, Path(description="Short UUID of the user")],
|
|
23
|
+
) -> str:
|
|
24
|
+
"""None"""
|
|
25
|
+
...
|
|
26
|
+
|
|
27
|
+
@get("/sub/{short_uuid}/{client_type}", response_class=str)
|
|
28
|
+
async def get_subscription_by_client_type(
|
|
29
|
+
self,
|
|
30
|
+
client_type: Annotated[ClientType, Path(description="Client type")],
|
|
31
|
+
short_uuid: Annotated[str, Path(description="Short UUID of the user")],
|
|
32
|
+
) -> str:
|
|
33
|
+
"""None"""
|
|
34
|
+
...
|
|
35
|
+
|
|
36
|
+
@get("/sub/outline/{short_uuid}/{type}/{encoded_tag}", response_class=str)
|
|
37
|
+
async def get_subscription_with_type(
|
|
38
|
+
self,
|
|
39
|
+
short_uuid: Annotated[str, Path(description="Short UUID of the user")],
|
|
40
|
+
type: Annotated[
|
|
41
|
+
str,
|
|
42
|
+
Path(
|
|
43
|
+
description="Subscription type (required if encodedTag is provided). Only SS is supported for now."
|
|
44
|
+
),
|
|
45
|
+
] = "ss",
|
|
46
|
+
encoded_tag: Annotated[
|
|
47
|
+
str,
|
|
48
|
+
Path(
|
|
49
|
+
description="Base64 encoded tag for Outline config. This paramter is optional. It is required only when type=ss."
|
|
50
|
+
),
|
|
51
|
+
] = "VGVzdGVy",
|
|
52
|
+
) -> str:
|
|
53
|
+
"""None"""
|
|
54
|
+
...
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
from typing import Annotated
|
|
2
|
+
|
|
3
|
+
from rapid_api_client.annotations import PydanticBody
|
|
4
|
+
|
|
5
|
+
from remnawave_api.models import (
|
|
6
|
+
SubscriptionSettingsResponseDto,
|
|
7
|
+
UpdateSubscriptionSettingsRequestDto,
|
|
8
|
+
)
|
|
9
|
+
from remnawave_api.rapid import BaseController, get, post
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class SubscriptionsSettingsController(BaseController):
|
|
13
|
+
@get("/subscription-settings/get", response_class=SubscriptionSettingsResponseDto)
|
|
14
|
+
async def get_settings(
|
|
15
|
+
self,
|
|
16
|
+
) -> SubscriptionSettingsResponseDto:
|
|
17
|
+
"""Get Subscription Settings"""
|
|
18
|
+
...
|
|
19
|
+
|
|
20
|
+
@post(
|
|
21
|
+
"/subscription-settings/update",
|
|
22
|
+
response_class=SubscriptionSettingsResponseDto,
|
|
23
|
+
)
|
|
24
|
+
async def update_settings(
|
|
25
|
+
self,
|
|
26
|
+
body: Annotated[UpdateSubscriptionSettingsRequestDto, PydanticBody()],
|
|
27
|
+
) -> SubscriptionSettingsResponseDto:
|
|
28
|
+
"""Update Subscription Settings"""
|
|
29
|
+
...
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from typing import Annotated
|
|
2
|
+
|
|
3
|
+
from rapid_api_client.annotations import Path, PydanticBody
|
|
4
|
+
|
|
5
|
+
from remnawave_api.enums import TemplateType
|
|
6
|
+
from remnawave_api.models import TemplateResponseDto, UpdateTemplateRequestDto
|
|
7
|
+
from remnawave_api.rapid import BaseController, get, post
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class SubscriptionsTemplateController(BaseController):
|
|
11
|
+
@get(
|
|
12
|
+
"/subscription-templates/get-template/{template_type}",
|
|
13
|
+
response_class=TemplateResponseDto,
|
|
14
|
+
)
|
|
15
|
+
async def get_template(
|
|
16
|
+
self,
|
|
17
|
+
template_type: Annotated[TemplateType, Path(description="Template type")],
|
|
18
|
+
) -> TemplateResponseDto:
|
|
19
|
+
"""Get Template"""
|
|
20
|
+
...
|
|
21
|
+
|
|
22
|
+
@post(
|
|
23
|
+
"/subscription-templates/update-template",
|
|
24
|
+
response_class=TemplateResponseDto,
|
|
25
|
+
)
|
|
26
|
+
async def update_template(
|
|
27
|
+
self,
|
|
28
|
+
body: Annotated[UpdateTemplateRequestDto, PydanticBody()],
|
|
29
|
+
) -> TemplateResponseDto:
|
|
30
|
+
"""Update Template"""
|
|
31
|
+
...
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
from remnawave_api.models import (
|
|
2
|
+
BandwidthStatisticResponseDto,
|
|
3
|
+
NodesStatisticResponseDto,
|
|
4
|
+
StatisticResponseDto,
|
|
5
|
+
)
|
|
6
|
+
from remnawave_api.rapid import BaseController, get
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class SystemController(BaseController):
|
|
10
|
+
@get("/system/stats", response_class=StatisticResponseDto)
|
|
11
|
+
async def get_stats(
|
|
12
|
+
self,
|
|
13
|
+
) -> StatisticResponseDto:
|
|
14
|
+
"""Get System Stats"""
|
|
15
|
+
...
|
|
16
|
+
|
|
17
|
+
@get("/system/bandwidth", response_class=BandwidthStatisticResponseDto)
|
|
18
|
+
async def get_bandwidth_stats(
|
|
19
|
+
self,
|
|
20
|
+
) -> BandwidthStatisticResponseDto:
|
|
21
|
+
"""Get System Bandwidth Statistics"""
|
|
22
|
+
...
|
|
23
|
+
|
|
24
|
+
@get("/system/statistics/nodes", response_class=NodesStatisticResponseDto)
|
|
25
|
+
async def get_nodes_statistics(
|
|
26
|
+
self,
|
|
27
|
+
) -> NodesStatisticResponseDto:
|
|
28
|
+
"""Get Nodes Statistics"""
|
|
29
|
+
...
|