calagoapi 1.0.dev1__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.
- calagoapi/__init__.py +190 -0
- calagoapi/account/__init__.py +14 -0
- calagoapi/account/account.py +292 -0
- calagoapi/account/auth.py +72 -0
- calagoapi/account/models.py +221 -0
- calagoapi/admin/__init__.py +48 -0
- calagoapi/admin/admin.py +341 -0
- calagoapi/admin/managers.py +490 -0
- calagoapi/admin/resources.py +970 -0
- calagoapi/aio/__init__.py +9 -0
- calagoapi/aio/console.py +289 -0
- calagoapi/aio/panel.py +176 -0
- calagoapi/api/__init__.py +63 -0
- calagoapi/api/account.py +195 -0
- calagoapi/api/admin.py +402 -0
- calagoapi/api/attachments.py +27 -0
- calagoapi/api/auth.py +52 -0
- calagoapi/api/backups.py +99 -0
- calagoapi/api/client.py +198 -0
- calagoapi/api/databases.py +217 -0
- calagoapi/api/files.py +210 -0
- calagoapi/api/network.py +84 -0
- calagoapi/api/public.py +13 -0
- calagoapi/api/schedules.py +79 -0
- calagoapi/api/servers.py +114 -0
- calagoapi/api/users.py +27 -0
- calagoapi/api/versions.py +29 -0
- calagoapi/backups/__init__.py +8 -0
- calagoapi/backups/backup.py +292 -0
- calagoapi/backups/manager.py +177 -0
- calagoapi/console/__init__.py +6 -0
- calagoapi/console/console.py +392 -0
- calagoapi/databases/__init__.py +12 -0
- calagoapi/databases/database.py +445 -0
- calagoapi/databases/explorer.py +159 -0
- calagoapi/databases/manager.py +122 -0
- calagoapi/files/__init__.py +9 -0
- calagoapi/files/file.py +196 -0
- calagoapi/files/manager.py +437 -0
- calagoapi/network/__init__.py +8 -0
- calagoapi/network/allocation.py +99 -0
- calagoapi/network/manager.py +132 -0
- calagoapi/nodes/__init__.py +6 -0
- calagoapi/nodes/node.py +477 -0
- calagoapi/panel.py +162 -0
- calagoapi/schedules/__init__.py +14 -0
- calagoapi/schedules/builders.py +461 -0
- calagoapi/schedules/manager.py +107 -0
- calagoapi/schedules/schedule.py +214 -0
- calagoapi/servers/__init__.py +13 -0
- calagoapi/servers/admin.py +430 -0
- calagoapi/servers/generic.py +785 -0
- calagoapi/servers/manager.py +167 -0
- calagoapi/servers/minecraft.py +207 -0
- calagoapi/tunnels/__init__.py +5 -0
- calagoapi/tunnels/tunnel.py +112 -0
- calagoapi/users/__init__.py +11 -0
- calagoapi/users/activity.py +45 -0
- calagoapi/users/subuser.py +127 -0
- calagoapi/users/user.py +267 -0
- calagoapi/utils/__init__.py +43 -0
- calagoapi/utils/convert.py +113 -0
- calagoapi/utils/exceptions.py +72 -0
- calagoapi/utils/model.py +142 -0
- calagoapi/utils/resource.py +100 -0
- calagoapi/utils/time.py +68 -0
- calagoapi-1.0.dev1.dist-info/METADATA +266 -0
- calagoapi-1.0.dev1.dist-info/RECORD +71 -0
- calagoapi-1.0.dev1.dist-info/WHEEL +5 -0
- calagoapi-1.0.dev1.dist-info/licenses/LICENSE +674 -0
- calagoapi-1.0.dev1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
from calagoapi.utils.resource import AdminManager
|
|
2
|
+
from calagoapi.admin.resources import (
|
|
3
|
+
Location,
|
|
4
|
+
Nest,
|
|
5
|
+
Egg,
|
|
6
|
+
Mount,
|
|
7
|
+
Device,
|
|
8
|
+
Role,
|
|
9
|
+
Announcement,
|
|
10
|
+
OAuthProvider,
|
|
11
|
+
DatabaseHost,
|
|
12
|
+
DatabaseAgentHost,
|
|
13
|
+
DatabaseAgentTemplate,
|
|
14
|
+
BackupConfiguration,
|
|
15
|
+
BackupPolicy,
|
|
16
|
+
EggRepository,
|
|
17
|
+
EggConfiguration,
|
|
18
|
+
SubdomainDomain,
|
|
19
|
+
)
|
|
20
|
+
from calagoapi.utils.model import idOf
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class LocationManager(AdminManager):
|
|
24
|
+
'''Location management, available as `panel.admin.locations`.'''
|
|
25
|
+
model = Location
|
|
26
|
+
|
|
27
|
+
def getLocations(self, search: str = None, page: int = None, per_page: int = None):
|
|
28
|
+
'''Lists locations.'''
|
|
29
|
+
return self._list(search, page, per_page)
|
|
30
|
+
|
|
31
|
+
def getLocation(self, location_id: str) -> Location:
|
|
32
|
+
'''Returns a location by UUID.'''
|
|
33
|
+
return self._get(location_id)
|
|
34
|
+
|
|
35
|
+
def getLocationByName(self, name: str) -> Location:
|
|
36
|
+
'''Returns a location by exact name, or None.'''
|
|
37
|
+
return self._find(name)
|
|
38
|
+
|
|
39
|
+
def createLocation(self, name: str, description: str = None, flag: str = None, backup_configuration=None) -> Location:
|
|
40
|
+
'''
|
|
41
|
+
Creates a location.
|
|
42
|
+
|
|
43
|
+
Example:
|
|
44
|
+
panel.admin.locations.createLocation('Frankfurt', flag='de')
|
|
45
|
+
'''
|
|
46
|
+
return self._create(name=name, description=description, flag=flag, backup_configuration_uuid=idOf(backup_configuration))
|
|
47
|
+
|
|
48
|
+
def deleteLocation(self, location) -> None:
|
|
49
|
+
'''Deletes a location. It must not contain nodes.'''
|
|
50
|
+
return self._delete(location)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class NestManager(AdminManager):
|
|
54
|
+
'''Nest and egg management, available as `panel.admin.nests`.'''
|
|
55
|
+
model = Nest
|
|
56
|
+
|
|
57
|
+
def getNests(self, search: str = None, page: int = None, per_page: int = None):
|
|
58
|
+
'''Lists nests.'''
|
|
59
|
+
return self._list(search, page, per_page)
|
|
60
|
+
|
|
61
|
+
def getNest(self, nest_id: str) -> Nest:
|
|
62
|
+
'''Returns a nest by UUID.'''
|
|
63
|
+
return self._get(nest_id)
|
|
64
|
+
|
|
65
|
+
def getNestByName(self, name: str) -> Nest:
|
|
66
|
+
'''Returns a nest by exact name, or None.'''
|
|
67
|
+
return self._find(name)
|
|
68
|
+
|
|
69
|
+
def createNest(self, name: str, author: str, description: str = None) -> Nest:
|
|
70
|
+
'''Creates a nest.'''
|
|
71
|
+
return self._create(name=name, author=author, description=description)
|
|
72
|
+
|
|
73
|
+
def deleteNest(self, nest, delete_eggs: bool = False) -> None:
|
|
74
|
+
'''Deletes a nest, optionally with its eggs.'''
|
|
75
|
+
return self._delete(nest, delete_eggs=delete_eggs)
|
|
76
|
+
|
|
77
|
+
def getAllEggs(self) -> list:
|
|
78
|
+
'''
|
|
79
|
+
Returns every egg grouped by nest.
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
List of {'nest': {...}, 'eggs': [...]} dicts.
|
|
83
|
+
'''
|
|
84
|
+
return self.admin.allEggs()
|
|
85
|
+
|
|
86
|
+
def findEgg(self, egg_id_or_name: str):
|
|
87
|
+
'''
|
|
88
|
+
Finds an egg in any nest by UUID or name.
|
|
89
|
+
|
|
90
|
+
Example:
|
|
91
|
+
paper = panel.admin.nests.findEgg('Paper')
|
|
92
|
+
'''
|
|
93
|
+
for entry in self.admin.allEggs():
|
|
94
|
+
for egg in entry.get('eggs', []):
|
|
95
|
+
if egg_id_or_name in (egg.get('uuid'), egg.get('name')):
|
|
96
|
+
return Egg(self.panel, egg, self.admin.eggs(entry['nest']['uuid']))
|
|
97
|
+
return None
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class MountManager(AdminManager):
|
|
101
|
+
'''Mount management, available as `panel.admin.mounts`.'''
|
|
102
|
+
model = Mount
|
|
103
|
+
|
|
104
|
+
def getMounts(self, search: str = None, page: int = None, per_page: int = None):
|
|
105
|
+
'''Lists mounts.'''
|
|
106
|
+
return self._list(search, page, per_page)
|
|
107
|
+
|
|
108
|
+
def getMount(self, mount_id: str) -> Mount:
|
|
109
|
+
'''Returns a mount by UUID.'''
|
|
110
|
+
return self._get(mount_id)
|
|
111
|
+
|
|
112
|
+
def createMount(self, name: str, source: str, target: str, read_only: bool = False,
|
|
113
|
+
user_mountable: bool = False, description: str = None) -> Mount:
|
|
114
|
+
'''
|
|
115
|
+
Creates a mount.
|
|
116
|
+
|
|
117
|
+
Args:
|
|
118
|
+
source: Path on the node.
|
|
119
|
+
target: Path inside servers.
|
|
120
|
+
'''
|
|
121
|
+
return self._create(name=name, source=source, target=target, read_only=read_only,
|
|
122
|
+
user_mountable=user_mountable, description=description)
|
|
123
|
+
|
|
124
|
+
def deleteMount(self, mount) -> None:
|
|
125
|
+
'''Deletes a mount.'''
|
|
126
|
+
return self._delete(mount)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
class DeviceManager(AdminManager):
|
|
130
|
+
'''Device management, available as `panel.admin.devices`.'''
|
|
131
|
+
model = Device
|
|
132
|
+
|
|
133
|
+
def getDevices(self, search: str = None, page: int = None, per_page: int = None):
|
|
134
|
+
'''Lists devices.'''
|
|
135
|
+
return self._list(search, page, per_page)
|
|
136
|
+
|
|
137
|
+
def getDevice(self, device_id: str) -> Device:
|
|
138
|
+
'''Returns a device by UUID.'''
|
|
139
|
+
return self._get(device_id)
|
|
140
|
+
|
|
141
|
+
def createDevice(self, name: str, source: str, target: str, permissions: str = 'rwm',
|
|
142
|
+
user_attachable: bool = False, description: str = None) -> Device:
|
|
143
|
+
'''Creates a device passthrough.'''
|
|
144
|
+
return self._create(name=name, source=source, target=target, permissions=permissions,
|
|
145
|
+
user_attachable=user_attachable, description=description)
|
|
146
|
+
|
|
147
|
+
def deleteDevice(self, device) -> None:
|
|
148
|
+
'''Deletes a device.'''
|
|
149
|
+
return self._delete(device)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
class RoleManager(AdminManager):
|
|
153
|
+
'''Role management, available as `panel.admin.roles`.'''
|
|
154
|
+
model = Role
|
|
155
|
+
|
|
156
|
+
def getRoles(self, search: str = None, page: int = None, per_page: int = None):
|
|
157
|
+
'''Lists roles.'''
|
|
158
|
+
return self._list(search, page, per_page)
|
|
159
|
+
|
|
160
|
+
def getRole(self, role_id: str) -> Role:
|
|
161
|
+
'''Returns a role by UUID.'''
|
|
162
|
+
return self._get(role_id)
|
|
163
|
+
|
|
164
|
+
def getRoleByName(self, name: str) -> Role:
|
|
165
|
+
'''Returns a role by exact name, or None.'''
|
|
166
|
+
return self._find(name)
|
|
167
|
+
|
|
168
|
+
def createRole(self, name: str, admin_permissions: list = None, server_permissions: list = None,
|
|
169
|
+
require_two_factor: bool = False, description: str = None) -> Role:
|
|
170
|
+
'''Creates a role.'''
|
|
171
|
+
return self._create(name=name, admin_permissions=admin_permissions or [], server_permissions=server_permissions or [],
|
|
172
|
+
require_two_factor=require_two_factor, description=description)
|
|
173
|
+
|
|
174
|
+
def deleteRole(self, role) -> None:
|
|
175
|
+
'''Deletes a role.'''
|
|
176
|
+
return self._delete(role)
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
class AnnouncementManager(AdminManager):
|
|
180
|
+
'''Announcement management, available as `panel.admin.announcements`.'''
|
|
181
|
+
model = Announcement
|
|
182
|
+
|
|
183
|
+
def getAnnouncements(self, search: str = None, page: int = None, per_page: int = None):
|
|
184
|
+
'''Lists announcements.'''
|
|
185
|
+
return self._list(search, page, per_page)
|
|
186
|
+
|
|
187
|
+
def getAnnouncement(self, announcement_id: str) -> Announcement:
|
|
188
|
+
'''Returns an announcement by UUID.'''
|
|
189
|
+
return self._get(announcement_id)
|
|
190
|
+
|
|
191
|
+
def createAnnouncement(self, title: str, content: str, type: str = 'info', enabled: bool = True, dismissible: bool = True,
|
|
192
|
+
locations: list = None, nodes: list = None, eggs: list = None, backup_configurations: list = None,
|
|
193
|
+
enabled_start: str = None, enabled_end: str = None, dismissible_end: str = None) -> Announcement:
|
|
194
|
+
'''
|
|
195
|
+
Creates an announcement.
|
|
196
|
+
|
|
197
|
+
Args:
|
|
198
|
+
title: Title.
|
|
199
|
+
content: Markdown content.
|
|
200
|
+
type: info, success, warning or error.
|
|
201
|
+
locations, nodes, eggs, backup_configurations: Limit who sees it. Everyone when all are empty.
|
|
202
|
+
enabled_start, enabled_end: Optional ISO-8601 time window.
|
|
203
|
+
|
|
204
|
+
Example:
|
|
205
|
+
panel.admin.announcements.createAnnouncement('Maintenance', 'Reboot at 02:00 UTC', type='warning')
|
|
206
|
+
'''
|
|
207
|
+
return self._create(
|
|
208
|
+
type=type,
|
|
209
|
+
title=title,
|
|
210
|
+
content=content,
|
|
211
|
+
enabled=enabled,
|
|
212
|
+
dismissible=dismissible,
|
|
213
|
+
title_translations={},
|
|
214
|
+
content_translations={},
|
|
215
|
+
locations=[idOf(x) for x in locations or []],
|
|
216
|
+
nodes=[idOf(x) for x in nodes or []],
|
|
217
|
+
eggs=[idOf(x) for x in eggs or []],
|
|
218
|
+
backup_configurations=[idOf(x) for x in backup_configurations or []],
|
|
219
|
+
enabled_start=enabled_start,
|
|
220
|
+
enabled_end=enabled_end,
|
|
221
|
+
dismissible_end=dismissible_end,
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
def deleteAnnouncement(self, announcement) -> None:
|
|
225
|
+
'''Deletes an announcement.'''
|
|
226
|
+
return self._delete(announcement)
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
class OAuthProviderManager(AdminManager):
|
|
230
|
+
'''OAuth provider management, available as `panel.admin.oauth`.'''
|
|
231
|
+
model = OAuthProvider
|
|
232
|
+
|
|
233
|
+
def getProviders(self, search: str = None, page: int = None, per_page: int = None):
|
|
234
|
+
'''Lists OAuth providers.'''
|
|
235
|
+
return self._list(search, page, per_page)
|
|
236
|
+
|
|
237
|
+
def getProvider(self, provider_id: str) -> OAuthProvider:
|
|
238
|
+
'''Returns a provider by UUID.'''
|
|
239
|
+
return self._get(provider_id)
|
|
240
|
+
|
|
241
|
+
def createProvider(self, **fields) -> OAuthProvider:
|
|
242
|
+
'''
|
|
243
|
+
Creates an OAuth provider. Accepts every Calagopus provider field
|
|
244
|
+
(name, client_id, client_secret, auth_url, token_url, info_url, scopes,
|
|
245
|
+
identifier_path, email_path, username_path, enabled, ...).
|
|
246
|
+
|
|
247
|
+
Tip: `discover()` fills most fields from an OpenID issuer URL.
|
|
248
|
+
'''
|
|
249
|
+
defaults = {
|
|
250
|
+
'enabled': True,
|
|
251
|
+
'login_only': False,
|
|
252
|
+
'login_bypass_two_factor': False,
|
|
253
|
+
'link_viewable': True,
|
|
254
|
+
'user_manageable': True,
|
|
255
|
+
'basic_auth': False,
|
|
256
|
+
'scopes': [],
|
|
257
|
+
}
|
|
258
|
+
return self._create(**{**defaults, **fields})
|
|
259
|
+
|
|
260
|
+
def discover(self, url: str) -> dict:
|
|
261
|
+
'''Reads an OpenID Connect discovery document and returns suggested provider settings.'''
|
|
262
|
+
return self.admin.discoverOauthProvider(url)
|
|
263
|
+
|
|
264
|
+
def deleteProvider(self, provider) -> None:
|
|
265
|
+
'''Deletes an OAuth provider.'''
|
|
266
|
+
return self._delete(provider)
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
class DatabaseHostManager(AdminManager):
|
|
270
|
+
'''Database host management, available as `panel.admin.database_hosts`.'''
|
|
271
|
+
model = DatabaseHost
|
|
272
|
+
|
|
273
|
+
def getDatabaseHosts(self, search: str = None, page: int = None, per_page: int = None):
|
|
274
|
+
'''Lists database hosts.'''
|
|
275
|
+
return self._list(search, page, per_page)
|
|
276
|
+
|
|
277
|
+
def getDatabaseHost(self, host_id: str) -> DatabaseHost:
|
|
278
|
+
'''Returns a database host by UUID.'''
|
|
279
|
+
return self._get(host_id)
|
|
280
|
+
|
|
281
|
+
def createDatabaseHost(self, name: str, type: str, credentials: dict, public_host: str = None, public_port: int = None,
|
|
282
|
+
deployment_enabled: bool = True, maintenance_enabled: bool = False) -> DatabaseHost:
|
|
283
|
+
'''
|
|
284
|
+
Creates a database host.
|
|
285
|
+
|
|
286
|
+
Args:
|
|
287
|
+
type: mysql, postgres or mongodb.
|
|
288
|
+
credentials: Connection credentials (host, port, username, password, ...).
|
|
289
|
+
'''
|
|
290
|
+
return self._create(name=name, type=type, credentials=credentials, public_host=public_host, public_port=public_port,
|
|
291
|
+
deployment_enabled=deployment_enabled, maintenance_enabled=maintenance_enabled)
|
|
292
|
+
|
|
293
|
+
def deleteDatabaseHost(self, host, force: bool = False) -> None:
|
|
294
|
+
'''Deletes a database host.'''
|
|
295
|
+
return self._delete(host, force=force)
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
class DatabaseAgentHostManager(AdminManager):
|
|
299
|
+
'''Database agent host management, available as `panel.admin.database_agent_hosts`.'''
|
|
300
|
+
model = DatabaseAgentHost
|
|
301
|
+
|
|
302
|
+
def getDatabaseAgentHosts(self, search: str = None, page: int = None, per_page: int = None):
|
|
303
|
+
'''Lists database agent hosts.'''
|
|
304
|
+
return self._list(search, page, per_page)
|
|
305
|
+
|
|
306
|
+
def getDatabaseAgentHost(self, host_id: str) -> DatabaseAgentHost:
|
|
307
|
+
'''Returns a database agent host by UUID.'''
|
|
308
|
+
return self._get(host_id)
|
|
309
|
+
|
|
310
|
+
def createDatabaseAgentHost(self, name: str, url: str, memory: int, disk: int, types: list = None,
|
|
311
|
+
deployment_enabled: bool = True, maintenance_enabled: bool = False,
|
|
312
|
+
description: str = None) -> DatabaseAgentHost:
|
|
313
|
+
'''Creates a database agent host.'''
|
|
314
|
+
return self._create(name=name, url=url, memory=memory, disk=disk, types=types, description=description,
|
|
315
|
+
deployment_enabled=deployment_enabled, maintenance_enabled=maintenance_enabled)
|
|
316
|
+
|
|
317
|
+
def deleteDatabaseAgentHost(self, host, force: bool = False) -> None:
|
|
318
|
+
'''Deletes a database agent host.'''
|
|
319
|
+
return self._delete(host, force=force)
|
|
320
|
+
|
|
321
|
+
def getCapacities(self) -> dict:
|
|
322
|
+
'''Returns allocated resources of every host.'''
|
|
323
|
+
return self.admin.databaseAgentCapacities()
|
|
324
|
+
|
|
325
|
+
def updateConfigs(self, hosts: list, config: dict) -> dict:
|
|
326
|
+
'''Applies the same configuration change to several hosts.'''
|
|
327
|
+
return self.admin.updateDatabaseAgentHostsConfig([idOf(h) for h in hosts], config)
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
class DatabaseAgentTemplateManager(AdminManager):
|
|
331
|
+
'''Database instance template management, available as `panel.admin.database_templates`.'''
|
|
332
|
+
model = DatabaseAgentTemplate
|
|
333
|
+
|
|
334
|
+
def getTemplates(self, search: str = None, page: int = None, per_page: int = None):
|
|
335
|
+
'''Lists templates.'''
|
|
336
|
+
return self._list(search, page, per_page)
|
|
337
|
+
|
|
338
|
+
def getTemplate(self, template_id: str) -> DatabaseAgentTemplate:
|
|
339
|
+
'''Returns a template by UUID.'''
|
|
340
|
+
return self._get(template_id)
|
|
341
|
+
|
|
342
|
+
def createTemplate(self, **fields) -> DatabaseAgentTemplate:
|
|
343
|
+
'''
|
|
344
|
+
Creates a template. Accepts every Calagopus template field (name, type,
|
|
345
|
+
docker_images, env, image_uid, image_gid, volumes, socket_path, memory,
|
|
346
|
+
swap, disk, cpu, deployment_enabled, ...).
|
|
347
|
+
'''
|
|
348
|
+
return self._create(**fields)
|
|
349
|
+
|
|
350
|
+
def deleteTemplate(self, template) -> None:
|
|
351
|
+
'''Deletes a template.'''
|
|
352
|
+
return self._delete(template)
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
class BackupConfigurationManager(AdminManager):
|
|
356
|
+
'''Backup configuration management, available as `panel.admin.backup_configurations`.'''
|
|
357
|
+
model = BackupConfiguration
|
|
358
|
+
|
|
359
|
+
def getBackupConfigurations(self, search: str = None, page: int = None, per_page: int = None):
|
|
360
|
+
'''Lists backup configurations.'''
|
|
361
|
+
return self._list(search, page, per_page)
|
|
362
|
+
|
|
363
|
+
def getBackupConfiguration(self, configuration_id: str) -> BackupConfiguration:
|
|
364
|
+
'''Returns a backup configuration by UUID.'''
|
|
365
|
+
return self._get(configuration_id)
|
|
366
|
+
|
|
367
|
+
def createBackupConfiguration(self, name: str, backup_disk: str, backup_configs: dict, shared: bool = False,
|
|
368
|
+
maintenance_enabled: bool = False, description: str = None) -> BackupConfiguration:
|
|
369
|
+
'''
|
|
370
|
+
Creates a backup configuration.
|
|
371
|
+
|
|
372
|
+
Args:
|
|
373
|
+
backup_disk: local, s3, ddup-bak, btrfs, zfs, restic, proxmox-backup-server or kopia.
|
|
374
|
+
backup_configs: Driver settings.
|
|
375
|
+
'''
|
|
376
|
+
return self._create(name=name, backup_disk=backup_disk, backup_configs=backup_configs, shared=shared,
|
|
377
|
+
maintenance_enabled=maintenance_enabled, description=description)
|
|
378
|
+
|
|
379
|
+
def testBackupConfiguration(self, node, backup_disk: str, backup_configs: dict) -> dict:
|
|
380
|
+
'''Tests storage settings from a node before saving them.'''
|
|
381
|
+
return self.admin.testBackupConfiguration(idOf(node), backup_disk, backup_configs)
|
|
382
|
+
|
|
383
|
+
def deleteBackupConfiguration(self, configuration) -> None:
|
|
384
|
+
'''Deletes a backup configuration.'''
|
|
385
|
+
return self._delete(configuration)
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
class BackupPolicyManager(AdminManager):
|
|
389
|
+
'''Panel-wide backup policies, available as `panel.admin.backup_policies`.'''
|
|
390
|
+
model = BackupPolicy
|
|
391
|
+
|
|
392
|
+
def getBackupPolicies(self, search: str = None, page: int = None, per_page: int = None):
|
|
393
|
+
'''Lists backup policies.'''
|
|
394
|
+
return self._list(search, page, per_page)
|
|
395
|
+
|
|
396
|
+
def getBackupPolicy(self, policy_id: str) -> BackupPolicy:
|
|
397
|
+
'''Returns a backup policy by UUID.'''
|
|
398
|
+
return self._get(policy_id)
|
|
399
|
+
|
|
400
|
+
def createBackupPolicy(self, name: str, cron: str, enabled: bool = True, parallelism: int = 1, retention: dict = None,
|
|
401
|
+
backup_configuration=None, kind: str = None, description: str = None) -> BackupPolicy:
|
|
402
|
+
'''
|
|
403
|
+
Creates a backup policy.
|
|
404
|
+
|
|
405
|
+
Args:
|
|
406
|
+
cron: 6-field cron expression (seconds first).
|
|
407
|
+
parallelism: How many backups run at the same time.
|
|
408
|
+
'''
|
|
409
|
+
return self._create(name=name, cron=cron, enabled=enabled, parallelism=parallelism, retention=retention,
|
|
410
|
+
backup_configuration_uuid=idOf(backup_configuration), kind=kind, description=description)
|
|
411
|
+
|
|
412
|
+
def deleteBackupPolicy(self, policy, delete_backups: bool = False) -> None:
|
|
413
|
+
'''Deletes a backup policy.'''
|
|
414
|
+
return self._delete(policy, delete_backups=delete_backups)
|
|
415
|
+
|
|
416
|
+
|
|
417
|
+
class EggRepositoryManager(AdminManager):
|
|
418
|
+
'''Egg repository management, available as `panel.admin.egg_repositories`.'''
|
|
419
|
+
model = EggRepository
|
|
420
|
+
|
|
421
|
+
def getEggRepositories(self, search: str = None, page: int = None, per_page: int = None):
|
|
422
|
+
'''Lists egg repositories.'''
|
|
423
|
+
return self._list(search, page, per_page)
|
|
424
|
+
|
|
425
|
+
def getEggRepository(self, repository_id: str) -> EggRepository:
|
|
426
|
+
'''Returns an egg repository by UUID.'''
|
|
427
|
+
return self._get(repository_id)
|
|
428
|
+
|
|
429
|
+
def createEggRepository(self, name: str, git_repository: str, description: str = None, credentials: dict = None) -> EggRepository:
|
|
430
|
+
'''Adds an egg repository.'''
|
|
431
|
+
return self._create(name=name, git_repository=git_repository, description=description, credentials=credentials)
|
|
432
|
+
|
|
433
|
+
def deleteEggRepository(self, repository) -> None:
|
|
434
|
+
'''Deletes an egg repository.'''
|
|
435
|
+
return self._delete(repository)
|
|
436
|
+
|
|
437
|
+
|
|
438
|
+
class EggConfigurationManager(AdminManager):
|
|
439
|
+
'''Egg configuration rules, available as `panel.admin.egg_configurations`.'''
|
|
440
|
+
model = EggConfiguration
|
|
441
|
+
|
|
442
|
+
def getEggConfigurations(self, search: str = None, page: int = None, per_page: int = None):
|
|
443
|
+
'''Lists egg configurations.'''
|
|
444
|
+
return self._list(search, page, per_page)
|
|
445
|
+
|
|
446
|
+
def getEggConfiguration(self, configuration_id: str) -> EggConfiguration:
|
|
447
|
+
'''Returns an egg configuration by UUID.'''
|
|
448
|
+
return self._get(configuration_id)
|
|
449
|
+
|
|
450
|
+
def createEggConfiguration(self, name: str, matcher: dict, order: int = 0, **fields) -> EggConfiguration:
|
|
451
|
+
'''Creates an egg configuration. Extra fields: config_allocations, config_startup, config_routes, config_features.'''
|
|
452
|
+
return self._create(name=name, matcher=matcher, order=order, **fields)
|
|
453
|
+
|
|
454
|
+
def deleteEggConfiguration(self, configuration) -> None:
|
|
455
|
+
'''Deletes an egg configuration.'''
|
|
456
|
+
return self._delete(configuration)
|
|
457
|
+
|
|
458
|
+
|
|
459
|
+
class SubdomainDomainManager(AdminManager):
|
|
460
|
+
'''Subdomain Manager domains, available as `panel.admin.subdomain_domains`.'''
|
|
461
|
+
model = SubdomainDomain
|
|
462
|
+
|
|
463
|
+
def getDomains(self, search: str = None, page: int = None, per_page: int = None):
|
|
464
|
+
'''Lists domains.'''
|
|
465
|
+
return self._list(search, page, per_page)
|
|
466
|
+
|
|
467
|
+
def getDomain(self, domain_id_or_name: str) -> SubdomainDomain:
|
|
468
|
+
'''Returns a domain by UUID or domain name, or None.'''
|
|
469
|
+
for domain in self.getDomains():
|
|
470
|
+
if domain_id_or_name in (domain.getUUID(), domain.getDomain()):
|
|
471
|
+
return domain
|
|
472
|
+
return None
|
|
473
|
+
|
|
474
|
+
def createDomain(self, domain: str, provider: str, provider_config: dict, eggs: list = None,
|
|
475
|
+
disallowed_subdomains_regexes: list = None) -> SubdomainDomain:
|
|
476
|
+
'''
|
|
477
|
+
Adds a domain.
|
|
478
|
+
|
|
479
|
+
Args:
|
|
480
|
+
domain: e.g. "example.com".
|
|
481
|
+
provider: cloudflare or powerdns.
|
|
482
|
+
provider_config: Provider credentials.
|
|
483
|
+
eggs: Eggs allowed to use the domain. All when empty.
|
|
484
|
+
'''
|
|
485
|
+
return self._create(domain=domain, provider=provider, provider_config=provider_config,
|
|
486
|
+
eggs=[idOf(e) for e in eggs or []], disallowed_subdomains_regexes=disallowed_subdomains_regexes or [])
|
|
487
|
+
|
|
488
|
+
def deleteDomain(self, domain) -> None:
|
|
489
|
+
'''Deletes a domain.'''
|
|
490
|
+
return self._delete(domain)
|