serverwatcher 3.2__tar.gz → 3.4__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.
- {serverwatcher-3.2/src/serverwatcher.egg-info → serverwatcher-3.4}/PKG-INFO +1 -1
- {serverwatcher-3.2 → serverwatcher-3.4}/pyproject.toml +1 -1
- serverwatcher-3.4/src/serverwatcher/config/__init__.py +9 -0
- {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher/config/messages.py +5 -0
- {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher/config/watcher.py +4 -0
- {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher/defaultconfigs/global.yaml +1 -1
- {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher/defaultconfigs/messages.yaml +6 -0
- {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher/defaultconfigs/watcher.yaml +4 -0
- {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher/watcher.py +28 -44
- {serverwatcher-3.2 → serverwatcher-3.4/src/serverwatcher.egg-info}/PKG-INFO +1 -1
- {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher.egg-info/SOURCES.txt +1 -0
- {serverwatcher-3.2 → serverwatcher-3.4}/LICENSE +0 -0
- {serverwatcher-3.2 → serverwatcher-3.4}/README.md +0 -0
- {serverwatcher-3.2 → serverwatcher-3.4}/setup.cfg +0 -0
- {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher/__init__.py +0 -0
- {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher/config/global_config.py +0 -0
- {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher/schema.py +0 -0
- {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher.egg-info/dependency_links.txt +0 -0
- {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher.egg-info/requires.txt +0 -0
- {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher.egg-info/top_level.txt +0 -0
|
@@ -39,3 +39,9 @@ reason_uptime: "Uptime {uptime} exceeds {threshold}h"
|
|
|
39
39
|
reason_tps: "TPS {tps} is lower than {threshold}"
|
|
40
40
|
reason_low_uptime: "Uptime {uptime} is shorter than 30m"
|
|
41
41
|
reason_players: "There {verb} {count} {plural} online"
|
|
42
|
+
|
|
43
|
+
# New values, will reorder later
|
|
44
|
+
restart_action_sent: "Restart action sent. Waiting..."
|
|
45
|
+
server_back_online: "Server is back online!"
|
|
46
|
+
server_back_online_broadcast: "{prefix} <green>Restart successful!"
|
|
47
|
+
server_failed_restart: "Server failed to restart!"
|
|
@@ -15,19 +15,13 @@ from hungerlib.addons import (
|
|
|
15
15
|
map_to_dataclass,
|
|
16
16
|
)
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
# BASE DIRECTORY OF THIS PACKAGE
|
|
24
|
-
# BASE_DIR = os.path.dirname(__file__) # OLD VERSION, may use later
|
|
25
|
-
BASE_DIR = os.getcwd() # NEW VERSION
|
|
18
|
+
from serverwatcher.config import GlobalConfig, MessagesConfig, WatcherConfig
|
|
19
|
+
|
|
20
|
+
# Set directory
|
|
21
|
+
BASE_DIR = os.getcwd()
|
|
26
22
|
PACKAGE_DIR = os.path.dirname(__file__)
|
|
27
23
|
|
|
28
|
-
#
|
|
29
|
-
# Utility: load config or copy default from defaultconfigs/
|
|
30
|
-
# ---------------------------------------------------------
|
|
24
|
+
# Load configs
|
|
31
25
|
def load_or_default(path: str, default_path: str, schema):
|
|
32
26
|
"""
|
|
33
27
|
Loads YAML from path. If missing, copies default_path → path.
|
|
@@ -46,12 +40,9 @@ def load_or_default(path: str, default_path: str, schema):
|
|
|
46
40
|
return map_to_dataclass(raw, schema)
|
|
47
41
|
|
|
48
42
|
|
|
49
|
-
#
|
|
50
|
-
# Main Watcher
|
|
51
|
-
# ---------------------------------------------------------
|
|
43
|
+
# Main watcher
|
|
52
44
|
class ServerWatcher:
|
|
53
45
|
def __init__(self):
|
|
54
|
-
# Load all 3 configs
|
|
55
46
|
self.global_cfg: GlobalConfig = load_or_default(
|
|
56
47
|
"config/global.yaml",
|
|
57
48
|
"defaultconfigs/global.yaml",
|
|
@@ -70,7 +61,7 @@ class ServerWatcher:
|
|
|
70
61
|
WatcherConfig
|
|
71
62
|
)
|
|
72
63
|
|
|
73
|
-
#
|
|
64
|
+
# panel
|
|
74
65
|
p = self.global_cfg.panel
|
|
75
66
|
self.panel = Panel(
|
|
76
67
|
name=p["name"],
|
|
@@ -78,7 +69,7 @@ class ServerWatcher:
|
|
|
78
69
|
api_key=p["api_key"],
|
|
79
70
|
)
|
|
80
71
|
|
|
81
|
-
#
|
|
72
|
+
# origin
|
|
82
73
|
o = self.global_cfg.origin
|
|
83
74
|
self.origin = GenericServer(
|
|
84
75
|
name="Origin",
|
|
@@ -86,7 +77,7 @@ class ServerWatcher:
|
|
|
86
77
|
server_id=o["server_id"],
|
|
87
78
|
)
|
|
88
79
|
|
|
89
|
-
#
|
|
80
|
+
# server
|
|
90
81
|
s = self.global_cfg.server
|
|
91
82
|
self.server = MinecraftServer(
|
|
92
83
|
name=s["name"],
|
|
@@ -99,7 +90,7 @@ class ServerWatcher:
|
|
|
99
90
|
tpsCommand=s["tps_command"],
|
|
100
91
|
)
|
|
101
92
|
|
|
102
|
-
#
|
|
93
|
+
# logger
|
|
103
94
|
logger_name = self.cfg.logger_name_template.format(
|
|
104
95
|
server_name=s["name"]
|
|
105
96
|
)
|
|
@@ -111,29 +102,23 @@ class ServerWatcher:
|
|
|
111
102
|
console_backspaces=self.cfg.console_backspaces,
|
|
112
103
|
)
|
|
113
104
|
|
|
114
|
-
#
|
|
105
|
+
# timezone
|
|
115
106
|
self.tz = ZoneInfo(self.cfg.timezone)
|
|
116
107
|
|
|
117
|
-
#
|
|
118
|
-
# Utility: format messages with prefix
|
|
119
|
-
# -----------------------------------------------------
|
|
108
|
+
# format messages with prefix
|
|
120
109
|
def fmt(self, template: str, **kwargs):
|
|
121
110
|
return template.format(prefix=self.messages.prefix, **kwargs)
|
|
122
111
|
|
|
123
|
-
#
|
|
124
|
-
# Shutdown
|
|
125
|
-
# -----------------------------------------------------
|
|
112
|
+
# simple shutdown
|
|
126
113
|
def shutdown(self):
|
|
127
114
|
self.log.info("Shutting down ServerWatcher.")
|
|
128
115
|
raise SystemExit
|
|
129
116
|
|
|
130
|
-
#
|
|
131
|
-
# Restart logic
|
|
132
|
-
# -----------------------------------------------------
|
|
117
|
+
# restart logic
|
|
133
118
|
def restart_and_wait(self):
|
|
134
119
|
self.origin.disableSchedule(self.cfg.restart_soon_schedule_id)
|
|
135
120
|
self.server.restart()
|
|
136
|
-
self.log.info("
|
|
121
|
+
self.log.info(f"{self.messages.restart_action_sent}")
|
|
137
122
|
time.sleep(self.cfg.restart_wait_seconds)
|
|
138
123
|
|
|
139
124
|
self.log.warn("Checking server status...")
|
|
@@ -144,17 +129,15 @@ class ServerWatcher:
|
|
|
144
129
|
)
|
|
145
130
|
|
|
146
131
|
if alive:
|
|
147
|
-
self.log.info("
|
|
132
|
+
self.log.info(f"{self.messages.server_back_online}")
|
|
148
133
|
self.server.sendBroadcast(
|
|
149
|
-
f"{self.messages.
|
|
134
|
+
f"{self.messages.server_back_online_broadcast}"
|
|
150
135
|
)
|
|
151
136
|
self.origin.enableSchedule(self.cfg.origin_disable_schedule_id)
|
|
152
137
|
else:
|
|
153
|
-
self.log.error("
|
|
138
|
+
self.log.error(f"{self.messages.server_failed_restart}")
|
|
154
139
|
|
|
155
|
-
#
|
|
156
|
-
# Schedule restart
|
|
157
|
-
# -----------------------------------------------------
|
|
140
|
+
# schedule restart
|
|
158
141
|
def schedule_restart(self, minutes):
|
|
159
142
|
info = snapSchedule(minimumMinutes=minutes)
|
|
160
143
|
scheduled = info["scheduled"]
|
|
@@ -184,9 +167,7 @@ class ServerWatcher:
|
|
|
184
167
|
second_callbacks=second_callbacks,
|
|
185
168
|
)
|
|
186
169
|
|
|
187
|
-
#
|
|
188
|
-
# Main evaluation logic
|
|
189
|
-
# -----------------------------------------------------
|
|
170
|
+
# main evaluation logic
|
|
190
171
|
def evaluate(self):
|
|
191
172
|
self.log.info(self.messages.log_start)
|
|
192
173
|
|
|
@@ -202,7 +183,7 @@ class ServerWatcher:
|
|
|
202
183
|
restart_reasons = []
|
|
203
184
|
no_restart_reasons = []
|
|
204
185
|
|
|
205
|
-
#
|
|
186
|
+
# pro-restart
|
|
206
187
|
if self.server.getSchedule(self.cfg.restart_soon_schedule_id)["is_active"]:
|
|
207
188
|
restart_reasons.append(self.messages.reason_restart_soon)
|
|
208
189
|
pro += self.cfg.weight_restart_soon
|
|
@@ -232,7 +213,7 @@ class ServerWatcher:
|
|
|
232
213
|
)
|
|
233
214
|
pro += self.cfg.weight_tps
|
|
234
215
|
|
|
235
|
-
#
|
|
216
|
+
# anti-restart
|
|
236
217
|
if snap.uptime // 60 < 30:
|
|
237
218
|
no_restart_reasons.append(
|
|
238
219
|
self.fmt(self.messages.reason_low_uptime, uptime=snap.uptime_formatted)
|
|
@@ -247,7 +228,7 @@ class ServerWatcher:
|
|
|
247
228
|
)
|
|
248
229
|
anti += snap.players * self.cfg.weight_per_player
|
|
249
230
|
|
|
250
|
-
#
|
|
231
|
+
# logging
|
|
251
232
|
for r in restart_reasons:
|
|
252
233
|
self.log.warn(f"- {r}")
|
|
253
234
|
for r in no_restart_reasons:
|
|
@@ -282,7 +263,10 @@ class ServerWatcher:
|
|
|
282
263
|
# Main loop
|
|
283
264
|
# -----------------------------------------------------
|
|
284
265
|
def run(self):
|
|
285
|
-
|
|
266
|
+
if self.cfg.clear_terminal:
|
|
267
|
+
clearTerminal()
|
|
286
268
|
while True:
|
|
269
|
+
if self.cfg.clear_terminal:
|
|
270
|
+
clearTerminal()
|
|
287
271
|
self.evaluate()
|
|
288
|
-
time.sleep(
|
|
272
|
+
time.sleep(self.cfg.watch_interval)
|
|
@@ -9,6 +9,7 @@ src/serverwatcher.egg-info/SOURCES.txt
|
|
|
9
9
|
src/serverwatcher.egg-info/dependency_links.txt
|
|
10
10
|
src/serverwatcher.egg-info/requires.txt
|
|
11
11
|
src/serverwatcher.egg-info/top_level.txt
|
|
12
|
+
src/serverwatcher/config/__init__.py
|
|
12
13
|
src/serverwatcher/config/global_config.py
|
|
13
14
|
src/serverwatcher/config/messages.py
|
|
14
15
|
src/serverwatcher/config/watcher.py
|
|
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
|