Skip to content

Commit eb7a301

Browse files
authored
Merge pull request #13 from remnawave:development
Обновить версии SDK до 2.1.18 и 2.1.17; добавить новые DTO для обработки вебхуков и обновить существующие модели
2 parents 984aaf8 + 936c006 commit eb7a301

File tree

10 files changed

+235
-165
lines changed

10 files changed

+235
-165
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ pip install git+https://github.com/remnawave/python-sdk.git@development
6363

6464
| Contract Version | Remnawave Panel Version |
6565
| ---------------- | ----------------------- |
66-
| 2.1.17 | >=2.1.16 |
66+
| 2.1.18 | >=2.1.18 |
67+
| 2.1.17 | >=2.1.16, <=2.1.17 |
6768
| 2.1.16 | >=2.1.16 |
6869
| 2.1.13 | >=2.1.13, <=2.1.15 |
6970
| 2.1.9 | >=2.1.9, <=2.1.12 |

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[project]
22
name = "remnawave"
3-
version = "2.1.17"
4-
description = "A Python SDK for interacting with the Remnawave API v2.1.17."
3+
version = "2.1.18"
4+
description = "A Python SDK for interacting with the Remnawave API v2.1.18."
55
authors = [
66
{name = "Artem",email = "dev@forestsnet.com"}
77
]

remnawave/controllers/hosts_bulk_actions.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
SetInboundToManyHostsRequestDto,
1111
SetInboundToManyHostsResponseDto,
1212
SetPortToManyHostsResponseDto,
13+
SetPortToManyHostsRequestDto
1314
)
1415
from remnawave.rapid import AttributeBody, BaseController, post
1516

@@ -53,8 +54,7 @@ async def set_inbound_to_hosts(
5354
@post("/hosts/bulk/set-port", response_class=SetPortToManyHostsResponseDto)
5455
async def set_port_to_hosts(
5556
self,
56-
uuids: Annotated[List[UUID], AttributeBody()],
57-
port: Annotated[float, AttributeBody()],
57+
body: Annotated[SetPortToManyHostsRequestDto, PydanticBody()],
5858
) -> SetPortToManyHostsResponseDto:
5959
"""Set port to many hosts"""
6060
...

remnawave/controllers/webhooks.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from remnawave.models.webhook import (
77
WebhookPayloadDto,
88
UserDto,
9-
NodesDto,
9+
NodeDto,
1010
HwidUserDeviceDto,
1111
LoginAttemptDto,
1212
UserHwidDeviceEventDto,
@@ -148,7 +148,7 @@ def is_errors_event(event: str) -> bool:
148148
return event.startswith("errors.")
149149

150150
@staticmethod
151-
def get_typed_data(payload: WebhookPayloadDto) -> Union[UserDto, NodesDto, HwidUserDeviceDto, LoginAttemptDto, UserHwidDeviceEventDto, dict]:
151+
def get_typed_data(payload: WebhookPayloadDto) -> Union[UserDto, NodeDto, HwidUserDeviceDto, LoginAttemptDto, UserHwidDeviceEventDto, dict]:
152152
"""
153153
Get typed data from webhook payload based on event type.
154154

remnawave/models/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
SetInboundToManyHostsRequestDto,
6464
SetInboundToManyHostsResponseDto,
6565
SetPortToManyHostsResponseDto,
66+
SetPortToManyHostsRequestDto
6667
)
6768
from .hwid import (
6869
CreateHWIDUser, # Legacy alias
@@ -252,7 +253,7 @@
252253
InternalSquadDto,
253254
BaseUserDto,
254255
UserDto,
255-
NodesDto,
256+
NodeDto,
256257
ConfigProfileInboundDto,
257258
InfraProviderDto,
258259
LoginAttemptDto,
@@ -404,6 +405,7 @@
404405
"SetInboundToManyHostsRequestDto",
405406
"SetInboundToManyHostsResponseDto",
406407
"SetPortToManyHostsResponseDto",
408+
"SetPortToManyHostsRequestDto",
407409
# Users models
408410
"ActiveInternalSquadDto",
409411
"CreateUserRequestDto",
@@ -524,7 +526,7 @@
524526
# NODE ENTITIES
525527
"ConfigProfileInboundDto",
526528
"InfraProviderDto",
527-
"NodesDto",
529+
"NodeDto",
528530
"NodeEventDto",
529531

530532
# ERROR EVENTS

remnawave/models/hosts.py

Lines changed: 74 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@ class UpdateHostRequestDto(BaseModel):
4040
None, serialization_alias="securityLayer"
4141
)
4242
server_description: Optional[str] = Field(
43-
None, alias="serverDescription", max_length=30
43+
None, serialization_alias="serverDescription", max_length=30
4444
)
45-
muxParams: Optional[str] = Field(
45+
mux_params: Optional[str] = Field(
4646
None,
4747
serialization_alias="muxParams",
4848
)
@@ -67,19 +67,24 @@ class UpdateHostRequestDto(BaseModel):
6767
ge=0,
6868
le=65535
6969
)
70-
shuffle_host: bool = Field(
71-
False,
70+
shuffle_host: Optional[bool] = Field(
71+
None,
7272
serialization_alias="shuffleHost",
7373
)
74-
mihomo_x25519: bool = Field(
75-
False,
74+
mihomo_x25519: Optional[bool] = Field(
75+
None,
7676
serialization_alias="mihomoX25519",
7777
)
78+
x_http_extra_params: Optional[str] = Field(
79+
None,
80+
serialization_alias="xHttpExtraParams",
81+
)
82+
nodes: Optional[List[str]] = None
7883

7984

8085
class HostInboundData(BaseModel):
81-
config_profile_uuid: UUID = Field(alias="configProfileUuid")
82-
config_profile_inbound_uuid: UUID = Field(alias="configProfileInboundUuid")
86+
config_profile_uuid: Optional[UUID] = Field(alias="configProfileUuid")
87+
config_profile_inbound_uuid: Optional[UUID] = Field(alias="configProfileInboundUuid")
8388

8489

8590
class HostResponseDto(BaseModel):
@@ -93,57 +98,54 @@ class HostResponseDto(BaseModel):
9398
host: Optional[str] = None
9499
alpn: Optional[ALPN] = None
95100
fingerprint: Optional[Fingerprint] = None
96-
is_disabled: Optional[bool] = Field(
97-
None,
98-
alias="isDisabled",
99-
)
100-
security_layer: Optional[SecurityLayer] = Field(
101-
None,
102-
alias="securityLayer",
103-
)
104101
x_http_extra_params: Optional[str] = Field(
105102
None,
106103
alias="xHttpExtraParams",
107104
)
108-
server_description: Optional[str] = Field(
109-
None, alias="serverDescription", max_length=30
110-
)
111-
inbound: HostInboundData
112-
muxParams: Optional[str] = Field(
105+
mux_params: Optional[str] = Field(
113106
None,
114-
serialization_alias="muxParams",
107+
alias="muxParams",
115108
)
116109
sockopt_params: Optional[str] = Field(
117110
None,
118-
serialization_alias="sockoptParams",
111+
alias="sockoptParams",
119112
)
120-
tag: Optional[Annotated[str, StringConstraints(max_length=32)]] = Field(
121-
None, serialization_alias="tag"
113+
inbound: HostInboundData
114+
server_description: Optional[str] = Field(
115+
None, alias="serverDescription"
122116
)
123-
is_hidden: Optional[bool] = Field(
117+
tag: Optional[str] = None
118+
vless_route_id: Optional[int] = Field(
124119
None,
125-
serialization_alias="isHidden",
120+
alias="vlessRouteId",
126121
)
127-
override_sni_from_address: Optional[bool] = Field(
128-
None,
129-
serialization_alias="overrideSniFromAddress",
122+
shuffle_host: bool = Field(alias="shuffleHost")
123+
mihomo_x25519: bool = Field(alias="mihomoX25519")
124+
nodes: List[str]
125+
is_disabled: bool = Field(
126+
default=False,
127+
alias="isDisabled",
130128
)
131-
vless_route_id: Optional[int] = Field(
132-
None,
133-
serialization_alias="vlessRouteId",
129+
security_layer: SecurityLayer = Field(
130+
default=SecurityLayer.DEFAULT,
131+
alias="securityLayer",
134132
)
135-
shuffle_host: bool = Field(
136-
False,
137-
serialization_alias="shuffleHost",
133+
is_hidden: bool = Field(
134+
default=False,
135+
alias="isHidden",
138136
)
139-
mihomo_x25519: bool = Field(
140-
False,
141-
serialization_alias="mihomoX25519",
137+
override_sni_from_address: bool = Field(
138+
default=False,
139+
alias="overrideSniFromAddress",
140+
)
141+
allow_insecure: bool = Field(
142+
default=False,
143+
alias="allowInsecure",
142144
)
143145

144146
# Legacy compatibility property
145147
@property
146-
def inbound_uuid(self) -> UUID:
148+
def inbound_uuid(self) -> Optional[UUID]:
147149
return self.inbound.config_profile_inbound_uuid
148150

149151

@@ -186,8 +188,8 @@ class DeleteHostResponseDto(BaseModel):
186188

187189

188190
class CreateHostInboundData(BaseModel):
189-
config_profile_uuid: UUID = Field(serialization_alias="configProfileUuid")
190-
config_profile_inbound_uuid: UUID = Field(
191+
config_profile_uuid: Optional[UUID] = Field(serialization_alias="configProfileUuid")
192+
config_profile_inbound_uuid: Optional[UUID] = Field(
191193
serialization_alias="configProfileInboundUuid"
192194
)
193195

@@ -202,39 +204,23 @@ class CreateHostRequestDto(BaseModel):
202204
host: Optional[str] = None
203205
alpn: Optional[ALPN] = None
204206
fingerprint: Optional[Fingerprint] = None
205-
allow_insecure: bool = Field(
206-
False,
207-
serialization_alias="allowInsecure",
208-
)
209-
is_disabled: bool = Field(
210-
False,
211-
serialization_alias="isDisabled",
212-
)
213-
security_layer: Optional[SecurityLayer] = Field(
214-
SecurityLayer.DEFAULT,
215-
serialization_alias="securityLayer",
207+
x_http_extra_params: Optional[str] = Field(
208+
None,
209+
serialization_alias="xHttpExtraParams",
216210
)
217-
muxParams: Optional[str] = Field(
211+
mux_params: Optional[str] = Field(
218212
None,
219213
serialization_alias="muxParams",
220214
)
221215
sockopt_params: Optional[str] = Field(
222216
None,
223217
serialization_alias="sockoptParams",
224218
)
225-
tag: Optional[Annotated[str, StringConstraints(max_length=32, pattern="^[A-Z0-9_:]+$")]] = Field(
226-
None, serialization_alias="tag"
227-
)
228-
is_hidden: bool = Field(
229-
False,
230-
serialization_alias="isHidden",
231-
)
232-
override_sni_from_address: bool = Field(
233-
False,
234-
serialization_alias="overrideSniFromAddress",
235-
)
236219
server_description: Optional[str] = Field(
237-
None, alias="serverDescription", max_length=30
220+
None, serialization_alias="serverDescription", max_length=30
221+
)
222+
tag: Optional[Annotated[str, StringConstraints(max_length=32)]] = Field(
223+
None, serialization_alias="tag"
238224
)
239225
vless_route_id: Optional[int] = Field(
240226
None,
@@ -250,10 +236,31 @@ class CreateHostRequestDto(BaseModel):
250236
False,
251237
serialization_alias="mihomoX25519",
252238
)
239+
nodes: List[str] = Field(default_factory=list)
240+
allow_insecure: bool = Field(
241+
False,
242+
serialization_alias="allowInsecure",
243+
)
244+
is_disabled: bool = Field(
245+
False,
246+
serialization_alias="isDisabled",
247+
)
248+
security_layer: SecurityLayer = Field(
249+
SecurityLayer.DEFAULT,
250+
serialization_alias="securityLayer",
251+
)
252+
is_hidden: bool = Field(
253+
False,
254+
serialization_alias="isHidden",
255+
)
256+
override_sni_from_address: bool = Field(
257+
False,
258+
serialization_alias="overrideSniFromAddress",
259+
)
253260

254261
# Legacy compatibility property
255262
@property
256-
def inbound_uuid(self) -> UUID:
263+
def inbound_uuid(self) -> Optional[UUID]:
257264
return self.inbound.config_profile_inbound_uuid
258265

259266
# Constructor compatibility - support old-style inbound_uuid

remnawave/models/hosts_bulk_actions.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,14 @@
88

99
class SetInboundToManyHostsRequestDto(BaseModel):
1010
uuids: List[UUID]
11-
inbound_uuid: UUID = Field(serialization_alias="inboundUuid")
11+
config_profile_uuid: UUID = Field(serialization_alias="configProfileUuid")
12+
config_profile_inbound_uuid: UUID = Field(
13+
serialization_alias="configProfileInboundUuid"
14+
)
1215

16+
class SetPortToManyHostsRequestDto(BaseModel):
17+
uuids: List[UUID]
18+
port: int = Field(ge=1, le=65535)
1319

1420
class BulkDeleteHostsResponseDto(List[HostResponseDto]):
1521
pass

0 commit comments

Comments
 (0)