hungerlib 1.3.1.dev0__tar.gz → 2.dev0__tar.gz
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.
- {hungerlib-1.3.1.dev0/src/hungerlib.egg-info → hungerlib-2.dev0}/PKG-INFO +1 -1
- {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/pyproject.toml +1 -1
- hungerlib-2.dev0/src/hungerlib/__init__.py +64 -0
- hungerlib-2.dev0/src/hungerlib/api/__init__.py +13 -0
- hungerlib-2.dev0/src/hungerlib/api/backups.py +26 -0
- hungerlib-2.dev0/src/hungerlib/api/databases.py +29 -0
- hungerlib-2.dev0/src/hungerlib/api/filemanager.py +65 -0
- hungerlib-2.dev0/src/hungerlib/api/schedule.py +29 -0
- hungerlib-2.dev0/src/hungerlib/api/startup.py +16 -0
- {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib/config.py +1 -1
- hungerlib-2.dev0/src/hungerlib/panel.py +78 -0
- {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib/servers/_generic.py +26 -26
- {hungerlib-1.3.1.dev0 → hungerlib-2.dev0/src/hungerlib.egg-info}/PKG-INFO +1 -1
- {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib.egg-info/SOURCES.txt +6 -0
- hungerlib-1.3.1.dev0/src/hungerlib/__init__.py +0 -69
- hungerlib-1.3.1.dev0/src/hungerlib/panel.py +0 -168
- {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/LICENSE +0 -0
- {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/README.md +0 -0
- {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/setup.cfg +0 -0
- {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib/addons/_generic.py +0 -0
- {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib/addons/colormap.py +0 -0
- {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib/addons/minecraft.py +0 -0
- {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib/logger.py +0 -0
- {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib/mchelpers.py +0 -0
- {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib/scheduler.py +0 -0
- {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib/servers/minecraft.py +0 -0
- {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib.egg-info/dependency_links.txt +0 -0
- {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib.egg-info/requires.txt +0 -0
- {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib.egg-info/top_level.txt +0 -0
- {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/tests/test_imports.py +0 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
from importlib.metadata import version as _pkg_version, PackageNotFoundError
|
|
2
|
+
import importlib
|
|
3
|
+
|
|
4
|
+
try:
|
|
5
|
+
__version__ = _pkg_version("hungerlib")
|
|
6
|
+
except PackageNotFoundError:
|
|
7
|
+
__version__ = "0.0.0"
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# Public API map
|
|
11
|
+
# name -> (module_path, attribute_name or None)
|
|
12
|
+
_EXPORTS = {
|
|
13
|
+
# core modules
|
|
14
|
+
"panel": ("panel", None),
|
|
15
|
+
"config": ("config", None),
|
|
16
|
+
"logger": ("logger", None),
|
|
17
|
+
|
|
18
|
+
# servers
|
|
19
|
+
"GenericServer": ("servers._generic", "GenericServer"),
|
|
20
|
+
"MinecraftServer": ("servers.minecraft", "MinecraftServer"),
|
|
21
|
+
|
|
22
|
+
# addons
|
|
23
|
+
"genericAddons": ("addons._generic", None),
|
|
24
|
+
"minecraftAddons": ("addons.minecraft", None),
|
|
25
|
+
"colormap": ("addons.colormap", None),
|
|
26
|
+
|
|
27
|
+
# addon functions
|
|
28
|
+
"runCountdownEvents": ("addons._generic", "runCountdownEvents"),
|
|
29
|
+
"validateAll": ("addons._generic", "validateAll"),
|
|
30
|
+
"waitForOnline": ("addons._generic", "waitForOnline"),
|
|
31
|
+
"waitForOffline": ("addons._generic", "waitForOffline"),
|
|
32
|
+
"checkLag": ("addons.minecraft", "checkLag"),
|
|
33
|
+
"MC_COLOR_MAP": ("addons.colormap", "MC_COLOR_MAP"),
|
|
34
|
+
"ASCI_COLOR_MAP": ("addons.colormap", "ASCI_COLOR_MAP"),
|
|
35
|
+
|
|
36
|
+
# api endpoints
|
|
37
|
+
"ScheduleAPI": ("api.schedule", "ScheduleAPI"),
|
|
38
|
+
"FileManagerAPI": ("api.filemanager", "FileManagerAPI"),
|
|
39
|
+
"BackupsAPI": ("api.backups", "BackupsAPI"),
|
|
40
|
+
"DatabasesAPI": ("api.databases", "DatabasesAPI"),
|
|
41
|
+
"StartupAPI": ("api.startup", "StartupAPI"),
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
__all__ = list(_EXPORTS.keys()) + ["__version__"]
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# Lazy loader
|
|
49
|
+
def __getattr__(name):
|
|
50
|
+
if name not in _EXPORTS:
|
|
51
|
+
raise AttributeError(f"module 'hungerlib' has no attribute '{name}'")
|
|
52
|
+
|
|
53
|
+
module_name, attr = _EXPORTS[name]
|
|
54
|
+
module = importlib.import_module(f"hungerlib.{module_name}")
|
|
55
|
+
|
|
56
|
+
# Export module itself
|
|
57
|
+
if attr is None:
|
|
58
|
+
globals()[name] = module
|
|
59
|
+
return module
|
|
60
|
+
|
|
61
|
+
# Export attribute from module
|
|
62
|
+
value = getattr(module, attr)
|
|
63
|
+
globals()[name] = value
|
|
64
|
+
return value
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from .schedule import ScheduleAPI
|
|
2
|
+
from .filemanager import FileManagerAPI
|
|
3
|
+
from .backups import BackupsAPI
|
|
4
|
+
from .databases import DatabasesAPI
|
|
5
|
+
from .startup import StartupAPI
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"ScheduleAPI",
|
|
9
|
+
"FileManagerAPI",
|
|
10
|
+
"BackupsAPI",
|
|
11
|
+
"DatabasesAPI",
|
|
12
|
+
"StartupAPI",
|
|
13
|
+
]
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
class BackupsAPI:
|
|
2
|
+
"""
|
|
3
|
+
Raw backups endpoints.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
def __init__(self, panel):
|
|
7
|
+
self.panel = panel
|
|
8
|
+
|
|
9
|
+
def list(self, server_id):
|
|
10
|
+
return self.panel.get(f"/api/client/servers/{server_id}/backups")
|
|
11
|
+
|
|
12
|
+
def create(self, server_id, name="Auto Backup"):
|
|
13
|
+
return self.panel.post(
|
|
14
|
+
f"/api/client/servers/{server_id}/backups",
|
|
15
|
+
json={"name": name}
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
def delete(self, server_id, backup_id):
|
|
19
|
+
return self.panel.delete(
|
|
20
|
+
f"/api/client/servers/{server_id}/backups/{backup_id}"
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
def download(self, server_id, backup_id):
|
|
24
|
+
return self.panel.get(
|
|
25
|
+
f"/api/client/servers/{server_id}/backups/{backup_id}/download"
|
|
26
|
+
)
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
class DatabasesAPI:
|
|
2
|
+
"""
|
|
3
|
+
Raw database endpoints.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
def __init__(self, panel):
|
|
7
|
+
self.panel = panel
|
|
8
|
+
|
|
9
|
+
def list(self, server_id):
|
|
10
|
+
return self.panel.get(f"/api/client/servers/{server_id}/databases")
|
|
11
|
+
|
|
12
|
+
def create(self, server_id, name, remote="%", host=None):
|
|
13
|
+
payload = {"database": name, "remote": remote}
|
|
14
|
+
if host:
|
|
15
|
+
payload["host"] = host
|
|
16
|
+
return self.panel.post(
|
|
17
|
+
f"/api/client/servers/{server_id}/databases",
|
|
18
|
+
json=payload
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
def rotate_password(self, server_id, db_id):
|
|
22
|
+
return self.panel.post(
|
|
23
|
+
f"/api/client/servers/{server_id}/databases/{db_id}/rotate-password"
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
def delete(self, server_id, db_id):
|
|
27
|
+
return self.panel.delete(
|
|
28
|
+
f"/api/client/servers/{server_id}/databases/{db_id}"
|
|
29
|
+
)
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
class FileManagerAPI:
|
|
2
|
+
"""
|
|
3
|
+
Raw file manager endpoints.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
def __init__(self, panel):
|
|
7
|
+
self.panel = panel
|
|
8
|
+
|
|
9
|
+
def list(self, server_id, directory="/"):
|
|
10
|
+
return self.panel.get(
|
|
11
|
+
f"/api/client/servers/{server_id}/files/list?directory={directory}"
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
def download(self, server_id, file_path):
|
|
15
|
+
return self.panel.get(
|
|
16
|
+
f"/api/client/servers/{server_id}/files/download?file={file_path}"
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
def upload(self, server_id, directory, file_data):
|
|
20
|
+
return self.panel._raw_upload(
|
|
21
|
+
f"/api/client/servers/{server_id}/files/upload",
|
|
22
|
+
file_data
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
def delete(self, server_id, root, files):
|
|
26
|
+
return self.panel.post(
|
|
27
|
+
f"/api/client/servers/{server_id}/files/delete",
|
|
28
|
+
json={"root": root, "files": files}
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
def rename(self, server_id, root, files):
|
|
32
|
+
return self.panel.post(
|
|
33
|
+
f"/api/client/servers/{server_id}/files/rename",
|
|
34
|
+
json={"root": root, "files": files}
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
def copy(self, server_id, root, files):
|
|
38
|
+
return self.panel.post(
|
|
39
|
+
f"/api/client/servers/{server_id}/files/copy",
|
|
40
|
+
json={"root": root, "files": files}
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
def move(self, server_id, root, files):
|
|
44
|
+
return self.panel.post(
|
|
45
|
+
f"/api/client/servers/{server_id}/files/move",
|
|
46
|
+
json={"root": root, "files": files}
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
def create_folder(self, server_id, directory, name):
|
|
50
|
+
return self.panel.post(
|
|
51
|
+
f"/api/client/servers/{server_id}/files/create-folder",
|
|
52
|
+
json={"root": directory, "name": name}
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
def compress(self, server_id, root, files):
|
|
56
|
+
return self.panel.post(
|
|
57
|
+
f"/api/client/servers/{server_id}/files/compress",
|
|
58
|
+
json={"root": root, "files": files}
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
def decompress(self, server_id, file_path):
|
|
62
|
+
return self.panel.post(
|
|
63
|
+
f"/api/client/servers/{server_id}/files/decompress",
|
|
64
|
+
json={"file": file_path}
|
|
65
|
+
)
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
class ScheduleAPI:
|
|
2
|
+
"""
|
|
3
|
+
Raw schedule endpoints.
|
|
4
|
+
No logic. No models. No convenience.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
def __init__(self, panel):
|
|
8
|
+
self.panel = panel
|
|
9
|
+
|
|
10
|
+
def list(self, server_id):
|
|
11
|
+
return self.panel.get(f"/api/client/servers/{server_id}/schedules")
|
|
12
|
+
|
|
13
|
+
def create(self, server_id, payload):
|
|
14
|
+
return self.panel.post(f"/api/client/servers/{server_id}/schedules", json=payload)
|
|
15
|
+
|
|
16
|
+
def update(self, server_id, schedule_id, payload):
|
|
17
|
+
# Your panel uses POST for full updates
|
|
18
|
+
return self.panel.post(
|
|
19
|
+
f"/api/client/servers/{server_id}/schedules/{schedule_id}",
|
|
20
|
+
json=payload
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
def delete(self, server_id, schedule_id):
|
|
24
|
+
return self.panel.delete(f"/api/client/servers/{server_id}/schedules/{schedule_id}")
|
|
25
|
+
|
|
26
|
+
def run(self, server_id, schedule_id):
|
|
27
|
+
return self.panel.post(
|
|
28
|
+
f"/api/client/servers/{server_id}/schedules/{schedule_id}/execute"
|
|
29
|
+
)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
class StartupAPI:
|
|
2
|
+
"""
|
|
3
|
+
Raw startup variable endpoints.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
def __init__(self, panel):
|
|
7
|
+
self.panel = panel
|
|
8
|
+
|
|
9
|
+
def list(self, server_id):
|
|
10
|
+
return self.panel.get(f"/api/client/servers/{server_id}/startup")
|
|
11
|
+
|
|
12
|
+
def update(self, server_id, key, value):
|
|
13
|
+
return self.panel.post(
|
|
14
|
+
f"/api/client/servers/{server_id}/startup/variable",
|
|
15
|
+
json={"key": key, "value": value}
|
|
16
|
+
)
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import requests
|
|
2
|
+
|
|
3
|
+
from hungerlib.api.schedule import ScheduleAPI
|
|
4
|
+
from hungerlib.api.filemanager import FileManagerAPI
|
|
5
|
+
from hungerlib.api.backups import BackupsAPI
|
|
6
|
+
from hungerlib.api.databases import DatabasesAPI
|
|
7
|
+
from hungerlib.api.startup import StartupAPI
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Panel:
|
|
11
|
+
"""
|
|
12
|
+
High-level panel object.
|
|
13
|
+
Contains only:
|
|
14
|
+
- HTTP helpers
|
|
15
|
+
- authentication
|
|
16
|
+
- panel-wide utilities
|
|
17
|
+
- API module accessors
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
def __init__(self, name, url, api_key):
|
|
21
|
+
self.name = name
|
|
22
|
+
self.url = url.rstrip("/")
|
|
23
|
+
self.api_key = api_key
|
|
24
|
+
|
|
25
|
+
# API modules
|
|
26
|
+
self.schedules = ScheduleAPI(self)
|
|
27
|
+
self.files = FileManagerAPI(self)
|
|
28
|
+
self.backups = BackupsAPI(self)
|
|
29
|
+
self.databases = DatabasesAPI(self)
|
|
30
|
+
self.startup = StartupAPI(self)
|
|
31
|
+
|
|
32
|
+
def __str__(self):
|
|
33
|
+
return f"Panel name: {self.name}\nURL: {self.url}\nAPI key: {self.api_key}"
|
|
34
|
+
|
|
35
|
+
# ------------------------------------------------------------
|
|
36
|
+
# HTTP CORE
|
|
37
|
+
# ------------------------------------------------------------
|
|
38
|
+
@property
|
|
39
|
+
def headers(self):
|
|
40
|
+
return {
|
|
41
|
+
"Authorization": f"Bearer {self.api_key}",
|
|
42
|
+
"Accept": "application/json",
|
|
43
|
+
"Content-Type": "application/json",
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
def get(self, path, timeout=5):
|
|
47
|
+
return requests.get(f"{self.url}{path}", headers=self.headers, timeout=timeout)
|
|
48
|
+
|
|
49
|
+
def post(self, path, json=None, timeout=5):
|
|
50
|
+
return requests.post(f"{self.url}{path}", headers=self.headers, json=json, timeout=timeout)
|
|
51
|
+
|
|
52
|
+
def delete(self, path, timeout=5):
|
|
53
|
+
return requests.delete(f"{self.url}{path}", headers=self.headers, timeout=timeout)
|
|
54
|
+
|
|
55
|
+
def patch(self, path, json=None, timeout=5):
|
|
56
|
+
return requests.patch(f"{self.url}{path}", headers=self.headers, json=json, timeout=timeout)
|
|
57
|
+
|
|
58
|
+
# Special-case raw upload (multipart)
|
|
59
|
+
def _raw_upload(self, url, file_data):
|
|
60
|
+
return requests.post(
|
|
61
|
+
f"{self.url}{url}",
|
|
62
|
+
headers={"Authorization": f"Bearer {self.api_key}"},
|
|
63
|
+
files=file_data
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
# ------------------------------------------------------------
|
|
67
|
+
# PANEL HEALTH
|
|
68
|
+
# ------------------------------------------------------------
|
|
69
|
+
def ping(self):
|
|
70
|
+
try:
|
|
71
|
+
r = self.get("/api/client")
|
|
72
|
+
return r.status_code == 200
|
|
73
|
+
except:
|
|
74
|
+
return False
|
|
75
|
+
|
|
76
|
+
def validateAPI(self):
|
|
77
|
+
r = self.get("/api/client/account")
|
|
78
|
+
return r.status_code == 200
|
|
@@ -135,95 +135,95 @@ class GenericServer:
|
|
|
135
135
|
# ============================================================
|
|
136
136
|
|
|
137
137
|
def listFiles(self, directory="/"):
|
|
138
|
-
return self.panel.
|
|
138
|
+
return self.panel.files.list(self.server_id, directory)
|
|
139
139
|
|
|
140
140
|
def downloadFile(self, path):
|
|
141
|
-
return self.panel.
|
|
141
|
+
return self.panel.files.download(self.server_id, path)
|
|
142
142
|
|
|
143
143
|
def uploadFile(self, directory, file_data):
|
|
144
|
-
return self.panel.
|
|
144
|
+
return self.panel.files.upload(self.server_id, directory, file_data)
|
|
145
145
|
|
|
146
146
|
def deleteFiles(self, root, files):
|
|
147
|
-
return self.panel.
|
|
147
|
+
return self.panel.files.delete(self.server_id, root, files)
|
|
148
148
|
|
|
149
149
|
def renameFiles(self, root, files):
|
|
150
|
-
return self.panel.
|
|
150
|
+
return self.panel.files.rename(self.server_id, root, files)
|
|
151
151
|
|
|
152
152
|
def copyFiles(self, root, files):
|
|
153
|
-
return self.panel.
|
|
153
|
+
return self.panel.files.copy(self.server_id, root, files)
|
|
154
154
|
|
|
155
155
|
def moveFiles(self, root, files):
|
|
156
|
-
return self.panel.
|
|
156
|
+
return self.panel.files.move(self.server_id, root, files)
|
|
157
157
|
|
|
158
158
|
def createFolder(self, directory, name):
|
|
159
|
-
return self.panel.
|
|
159
|
+
return self.panel.files.create_folder(self.server_id, directory, name)
|
|
160
160
|
|
|
161
161
|
def compress(self, root, files):
|
|
162
|
-
return self.panel.
|
|
162
|
+
return self.panel.files.compress(self.server_id, root, files)
|
|
163
163
|
|
|
164
164
|
def decompress(self, file_path):
|
|
165
|
-
return self.panel.
|
|
165
|
+
return self.panel.files.decompress(self.server_id, file_path)
|
|
166
166
|
|
|
167
167
|
# ============================================================
|
|
168
168
|
# BACKUPS
|
|
169
169
|
# ============================================================
|
|
170
170
|
|
|
171
171
|
def listBackups(self):
|
|
172
|
-
return self.panel.
|
|
172
|
+
return self.panel.backups.list(self.server_id)
|
|
173
173
|
|
|
174
174
|
def createBackup(self, name="Auto Backup"):
|
|
175
|
-
return self.panel.
|
|
175
|
+
return self.panel.backups.create(self.server_id, name)
|
|
176
176
|
|
|
177
177
|
def deleteBackup(self, backup_id):
|
|
178
|
-
return self.panel.
|
|
178
|
+
return self.panel.backups.delete(self.server_id, backup_id)
|
|
179
179
|
|
|
180
180
|
def downloadBackup(self, backup_id):
|
|
181
|
-
return self.panel.
|
|
181
|
+
return self.panel.backups.download(self.server_id, backup_id)
|
|
182
182
|
|
|
183
183
|
# ============================================================
|
|
184
184
|
# DATABASES
|
|
185
185
|
# ============================================================
|
|
186
186
|
|
|
187
187
|
def listDatabases(self):
|
|
188
|
-
return self.panel.
|
|
188
|
+
return self.panel.databases.list(self.server_id)
|
|
189
189
|
|
|
190
190
|
def createDatabase(self, name, remote="%", host=None):
|
|
191
|
-
return self.panel.
|
|
191
|
+
return self.panel.databases.create(self.server_id, name, remote, host)
|
|
192
192
|
|
|
193
193
|
def rotateDatabasePassword(self, db_id):
|
|
194
|
-
return self.panel.
|
|
194
|
+
return self.panel.databases.rotate_password(self.server_id, db_id)
|
|
195
195
|
|
|
196
196
|
def deleteDatabase(self, db_id):
|
|
197
|
-
return self.panel.
|
|
197
|
+
return self.panel.databases.delete(self.server_id, db_id)
|
|
198
198
|
|
|
199
199
|
# ============================================================
|
|
200
200
|
# STARTUP VARIABLES
|
|
201
201
|
# ============================================================
|
|
202
202
|
|
|
203
203
|
def getStartupVariables(self):
|
|
204
|
-
return self.panel.
|
|
204
|
+
return self.panel.startup.list(self.server_id)
|
|
205
205
|
|
|
206
206
|
def updateStartupVariable(self, key, value):
|
|
207
|
-
return self.panel.
|
|
207
|
+
return self.panel.startup.update(self.server_id, key, value)
|
|
208
208
|
|
|
209
209
|
# ============================================================
|
|
210
210
|
# SCHEDULES
|
|
211
211
|
# ============================================================
|
|
212
212
|
|
|
213
213
|
def listSchedules(self):
|
|
214
|
-
return self.panel.
|
|
214
|
+
return self.panel.schedules.list(self.server_id)
|
|
215
215
|
|
|
216
216
|
def createSchedule(self, payload):
|
|
217
|
-
return self.panel.
|
|
217
|
+
return self.panel.schedules.create(self.server_id, payload)
|
|
218
218
|
|
|
219
219
|
def updateSchedule(self, schedule_id, payload):
|
|
220
|
-
return self.panel.
|
|
220
|
+
return self.panel.schedules.update(self.server_id, schedule_id, payload)
|
|
221
221
|
|
|
222
222
|
def deleteSchedule(self, schedule_id):
|
|
223
|
-
return self.panel.
|
|
223
|
+
return self.panel.schedules.delete(self.server_id, schedule_id)
|
|
224
224
|
|
|
225
225
|
def runSchedule(self, schedule_id):
|
|
226
|
-
return self.panel.
|
|
226
|
+
return self.panel.schedules.run(self.server_id, schedule_id)
|
|
227
227
|
|
|
228
228
|
# ============================================================
|
|
229
229
|
# HEALTH SNAPSHOT
|
|
@@ -238,4 +238,4 @@ class GenericServer:
|
|
|
238
238
|
"network_out": self.getNetworkOut(),
|
|
239
239
|
"uptime": self.getUptime(),
|
|
240
240
|
"status": self.getStatus()
|
|
241
|
-
}
|
|
241
|
+
}
|
|
@@ -15,6 +15,12 @@ src/hungerlib.egg-info/top_level.txt
|
|
|
15
15
|
src/hungerlib/addons/_generic.py
|
|
16
16
|
src/hungerlib/addons/colormap.py
|
|
17
17
|
src/hungerlib/addons/minecraft.py
|
|
18
|
+
src/hungerlib/api/__init__.py
|
|
19
|
+
src/hungerlib/api/backups.py
|
|
20
|
+
src/hungerlib/api/databases.py
|
|
21
|
+
src/hungerlib/api/filemanager.py
|
|
22
|
+
src/hungerlib/api/schedule.py
|
|
23
|
+
src/hungerlib/api/startup.py
|
|
18
24
|
src/hungerlib/servers/_generic.py
|
|
19
25
|
src/hungerlib/servers/minecraft.py
|
|
20
26
|
src/tests/test_imports.py
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
from importlib.metadata import version as _pkg_version, PackageNotFoundError
|
|
2
|
-
import importlib
|
|
3
|
-
|
|
4
|
-
try:
|
|
5
|
-
__version__ = _pkg_version("hungerlib")
|
|
6
|
-
except PackageNotFoundError:
|
|
7
|
-
__version__ = "0.0.0"
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
# api map
|
|
11
|
-
# name > (module_path, attribute_name or None)
|
|
12
|
-
_EXPORTS = {
|
|
13
|
-
# modules
|
|
14
|
-
"config": ("config", None),
|
|
15
|
-
"logger": ("logger", None),
|
|
16
|
-
"mchelpers": ("mchelpers", None),
|
|
17
|
-
"panel": ("panel", None),
|
|
18
|
-
"scheduler": ("scheduler", None),
|
|
19
|
-
|
|
20
|
-
# addon modules
|
|
21
|
-
"genericAddons": ('addons._generic', None),
|
|
22
|
-
'minecraftAddons': ('addons.minecraft', None),
|
|
23
|
-
"colormap": ("addons.colormap", None),
|
|
24
|
-
|
|
25
|
-
# classes / functions
|
|
26
|
-
"Panel": ("panel", "Panel"),
|
|
27
|
-
"GenericServer": ("servers._generic", "GenericServer"),
|
|
28
|
-
"MinecraftServer": ("servers.minecraft", "MinecraftServer"),
|
|
29
|
-
"DefaultConfig": ("config", "DefaultConfig"),
|
|
30
|
-
"HungerLogger": ("logger", "HungerLogger"),
|
|
31
|
-
"MCHelpers": ("mchelpers", "MCHelpers"),
|
|
32
|
-
|
|
33
|
-
# schedulers
|
|
34
|
-
"snapSchedule": ("scheduler", "snapSchedule"),
|
|
35
|
-
"secsUntil": ("scheduler", "secsUntil"),
|
|
36
|
-
"minsUntil": ("scheduler", "minsUntil"),
|
|
37
|
-
|
|
38
|
-
# addons
|
|
39
|
-
"runCountdownEvents": ('addons._generic', 'runCountdownEvents'),
|
|
40
|
-
'validateAll': ('addons._generic', 'validateAll'),
|
|
41
|
-
"waitForOnline": ("addons._generic", 'waitForOnline'),
|
|
42
|
-
"waitForOffline": ("addons._generic", 'waitForOffline'),
|
|
43
|
-
'checkLag': ('addons.minecraft', 'checkLag'),
|
|
44
|
-
"MC_COLOR_MAP": ("addons.colormap", "MC_COLOR_MAP"),
|
|
45
|
-
"ASCI_COLOR_MAP": ("addons.colormap", "ASCI_COLOR_MAP")
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
__all__ = list(_EXPORTS.keys()) + ["__version__"]
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
# lazy loader
|
|
54
|
-
def __getattr__(name):
|
|
55
|
-
if name not in _EXPORTS:
|
|
56
|
-
raise AttributeError(f"module 'hungerlib' has no attribute '{name}'")
|
|
57
|
-
|
|
58
|
-
module_name, attr = _EXPORTS[name]
|
|
59
|
-
module = importlib.import_module(f"hungerlib.{module_name}")
|
|
60
|
-
|
|
61
|
-
# If exporting the module itself
|
|
62
|
-
if attr is None:
|
|
63
|
-
globals()[name] = module
|
|
64
|
-
return module
|
|
65
|
-
|
|
66
|
-
# If exporting a specific attribute
|
|
67
|
-
value = getattr(module, attr)
|
|
68
|
-
globals()[name] = value
|
|
69
|
-
return value
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
# The Panel class and it's methods
|
|
2
|
-
import requests
|
|
3
|
-
|
|
4
|
-
class Panel:
|
|
5
|
-
def __init__(self, name, url, api_key):
|
|
6
|
-
self.name = name
|
|
7
|
-
self.url = url.rstrip("/")
|
|
8
|
-
self.api_key = api_key
|
|
9
|
-
'''The class that initiates the Panel'''
|
|
10
|
-
|
|
11
|
-
def __str__(self):
|
|
12
|
-
return f'Panel name: {self.name}\nURL: {self.url}\nAPI key: {self.api_key}'
|
|
13
|
-
|
|
14
|
-
@property
|
|
15
|
-
def headers(self):
|
|
16
|
-
return {
|
|
17
|
-
"Authorization": f"Bearer {self.api_key}",
|
|
18
|
-
"Accept": "application/json",
|
|
19
|
-
"Content-Type": "application/json"
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
# -----------------------------
|
|
23
|
-
# BASIC HTTP
|
|
24
|
-
# -----------------------------
|
|
25
|
-
def get(self, path, timeout=5):
|
|
26
|
-
return requests.get(f"{self.url}{path}", headers=self.headers, timeout=timeout)
|
|
27
|
-
|
|
28
|
-
def post(self, path, json=None, timeout=5):
|
|
29
|
-
return requests.post(f"{self.url}{path}", headers=self.headers, json=json, timeout=timeout)
|
|
30
|
-
|
|
31
|
-
def delete(self, path, timeout=5):
|
|
32
|
-
return requests.delete(f"{self.url}{path}", headers=self.headers, timeout=timeout)
|
|
33
|
-
|
|
34
|
-
def patch(self, path, json=None, timeout=5):
|
|
35
|
-
return requests.patch(f"{self.url}{path}", headers=self.headers, json=json, timeout=timeout)
|
|
36
|
-
|
|
37
|
-
def ping(self):
|
|
38
|
-
'''Attempts to ping the panel'''
|
|
39
|
-
try:
|
|
40
|
-
r = self.get("/api/client")
|
|
41
|
-
return r.status_code == 200
|
|
42
|
-
except:
|
|
43
|
-
return False
|
|
44
|
-
|
|
45
|
-
def validateAPI(self):
|
|
46
|
-
'''Ensures the provided API token is valid'''
|
|
47
|
-
r = self.get("/api/client/account")
|
|
48
|
-
return r.status_code == 200
|
|
49
|
-
|
|
50
|
-
# ============================================================
|
|
51
|
-
# FILE MANAGER API (RAW ENDPOINTS)
|
|
52
|
-
# ============================================================
|
|
53
|
-
|
|
54
|
-
def fm_list(self, server_id, directory="/"):
|
|
55
|
-
return self.get(f"/api/client/servers/{server_id}/files/list?directory={directory}")
|
|
56
|
-
|
|
57
|
-
def fm_download(self, server_id, file_path):
|
|
58
|
-
return self.get(f"/api/client/servers/{server_id}/files/download?file={file_path}")
|
|
59
|
-
|
|
60
|
-
def fm_upload(self, server_id, directory, file_data):
|
|
61
|
-
# file_data must be multipart/form-data
|
|
62
|
-
return requests.post(
|
|
63
|
-
f"{self.url}/api/client/servers/{server_id}/files/upload",
|
|
64
|
-
headers={"Authorization": f"Bearer {self.api_key}"},
|
|
65
|
-
files=file_data
|
|
66
|
-
)
|
|
67
|
-
|
|
68
|
-
def fm_delete(self, server_id, root, files):
|
|
69
|
-
payload = {"root": root, "files": files}
|
|
70
|
-
return self.post(f"/api/client/servers/{server_id}/files/delete", json=payload)
|
|
71
|
-
|
|
72
|
-
def fm_rename(self, server_id, root, files):
|
|
73
|
-
payload = {"root": root, "files": files}
|
|
74
|
-
return self.post(f"/api/client/servers/{server_id}/files/rename", json=payload)
|
|
75
|
-
|
|
76
|
-
def fm_copy(self, server_id, root, files):
|
|
77
|
-
payload = {"root": root, "files": files}
|
|
78
|
-
return self.post(f"/api/client/servers/{server_id}/files/copy", json=payload)
|
|
79
|
-
|
|
80
|
-
def fm_move(self, server_id, root, files):
|
|
81
|
-
payload = {"root": root, "files": files}
|
|
82
|
-
return self.post(f"/api/client/servers/{server_id}/files/move", json=payload)
|
|
83
|
-
|
|
84
|
-
def fm_create_folder(self, server_id, directory, name):
|
|
85
|
-
payload = {"root": directory, "name": name}
|
|
86
|
-
return self.post(f"/api/client/servers/{server_id}/files/create-folder", json=payload)
|
|
87
|
-
|
|
88
|
-
def fm_compress(self, server_id, root, files):
|
|
89
|
-
payload = {"root": root, "files": files}
|
|
90
|
-
return self.post(f"/api/client/servers/{server_id}/files/compress", json=payload)
|
|
91
|
-
|
|
92
|
-
def fm_decompress(self, server_id, file_path):
|
|
93
|
-
payload = {"file": file_path}
|
|
94
|
-
return self.post(f"/api/client/servers/{server_id}/files/decompress", json=payload)
|
|
95
|
-
|
|
96
|
-
# ============================================================
|
|
97
|
-
# BACKUPS API
|
|
98
|
-
# ============================================================
|
|
99
|
-
|
|
100
|
-
def backups_list(self, server_id):
|
|
101
|
-
return self.get(f"/api/client/servers/{server_id}/backups")
|
|
102
|
-
|
|
103
|
-
def backups_create(self, server_id, name="Auto Backup"):
|
|
104
|
-
payload = {"name": name}
|
|
105
|
-
return self.post(f"/api/client/servers/{server_id}/backups", json=payload)
|
|
106
|
-
|
|
107
|
-
def backups_delete(self, server_id, backup_id):
|
|
108
|
-
return self.delete(f"/api/client/servers/{server_id}/backups/{backup_id}")
|
|
109
|
-
|
|
110
|
-
def backups_download(self, server_id, backup_id):
|
|
111
|
-
return self.get(f"/api/client/servers/{server_id}/backups/{backup_id}/download")
|
|
112
|
-
|
|
113
|
-
# ============================================================
|
|
114
|
-
# DATABASES API
|
|
115
|
-
# ============================================================
|
|
116
|
-
|
|
117
|
-
def db_list(self, server_id):
|
|
118
|
-
return self.get(f"/api/client/servers/{server_id}/databases")
|
|
119
|
-
|
|
120
|
-
def db_create(self, server_id, name, remote="%", host=None):
|
|
121
|
-
payload = {"database": name, "remote": remote}
|
|
122
|
-
if host:
|
|
123
|
-
payload["host"] = host
|
|
124
|
-
return self.post(f"/api/client/servers/{server_id}/databases", json=payload)
|
|
125
|
-
|
|
126
|
-
def db_rotate_password(self, server_id, db_id):
|
|
127
|
-
return self.post(f"/api/client/servers/{server_id}/databases/{db_id}/rotate-password")
|
|
128
|
-
|
|
129
|
-
def db_delete(self, server_id, db_id):
|
|
130
|
-
return self.delete(f"/api/client/servers/{server_id}/databases/{db_id}")
|
|
131
|
-
|
|
132
|
-
# ============================================================
|
|
133
|
-
# STARTUP VARIABLES API
|
|
134
|
-
# ============================================================
|
|
135
|
-
|
|
136
|
-
def startup_list(self, server_id):
|
|
137
|
-
return self.get(f"/api/client/servers/{server_id}/startup")
|
|
138
|
-
|
|
139
|
-
def startup_update(self, server_id, key, value):
|
|
140
|
-
payload = {"key": key, "value": value}
|
|
141
|
-
return self.post(f"/api/client/servers/{server_id}/startup/variable", json=payload)
|
|
142
|
-
|
|
143
|
-
# ============================================================
|
|
144
|
-
# SCHEDULES API
|
|
145
|
-
# ============================================================
|
|
146
|
-
|
|
147
|
-
def schedules_list(self, server_id):
|
|
148
|
-
return self.get(f"/api/client/servers/{server_id}/schedules")
|
|
149
|
-
|
|
150
|
-
def schedules_create(self, server_id, payload):
|
|
151
|
-
return self.post(f"/api/client/servers/{server_id}/schedules", json=payload)
|
|
152
|
-
|
|
153
|
-
def schedules_update(self, server_id, schedule_id, payload):
|
|
154
|
-
return self.patch(f"/api/client/servers/{server_id}/schedules/{schedule_id}", json=payload)
|
|
155
|
-
|
|
156
|
-
def schedules_delete(self, server_id, schedule_id):
|
|
157
|
-
return self.delete(f"/api/client/servers/{server_id}/schedules/{schedule_id}")
|
|
158
|
-
|
|
159
|
-
def schedules_run(self, server_id, schedule_id):
|
|
160
|
-
return self.post(f"/api/client/servers/{server_id}/schedules/{schedule_id}/execute")
|
|
161
|
-
|
|
162
|
-
# ============================================================
|
|
163
|
-
# COMMAND API
|
|
164
|
-
# ============================================================
|
|
165
|
-
|
|
166
|
-
def sendCommand(self, server_id, command):
|
|
167
|
-
payload = {"command": command}
|
|
168
|
-
return self.post(f"/api/client/servers/{server_id}/command", json=payload)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|