serverwatcher 4.7__tar.gz → 4.8__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-4.7/src/serverwatcher.egg-info → serverwatcher-4.8}/PKG-INFO +1 -1
- {serverwatcher-4.7 → serverwatcher-4.8}/pyproject.toml +1 -1
- {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher/configclasses/messages.py +2 -0
- {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher/defaultconfigs/messages.yaml +1 -0
- {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher/defaultconfigs/watcher.yaml +1 -1
- {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher/watcher.py +28 -47
- {serverwatcher-4.7 → serverwatcher-4.8/src/serverwatcher.egg-info}/PKG-INFO +1 -1
- {serverwatcher-4.7 → serverwatcher-4.8}/LICENSE +0 -0
- {serverwatcher-4.7 → serverwatcher-4.8}/README.md +0 -0
- {serverwatcher-4.7 → serverwatcher-4.8}/setup.cfg +0 -0
- {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher/__init__.py +0 -0
- {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher/configclasses/__init__.py +0 -0
- {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher/configclasses/global_config.py +0 -0
- {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher/configclasses/watcher.py +0 -0
- {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher/defaultconfigs/global.yaml +0 -0
- {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher/validator.py +0 -0
- {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher.egg-info/SOURCES.txt +0 -0
- {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher.egg-info/dependency_links.txt +0 -0
- {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher.egg-info/requires.txt +0 -0
- {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher.egg-info/top_level.txt +0 -0
|
@@ -25,7 +25,6 @@ validate_all()
|
|
|
25
25
|
class ServerWatcher:
|
|
26
26
|
def __init__(self):
|
|
27
27
|
|
|
28
|
-
# load configs
|
|
29
28
|
self.global_cfg = loadConfig(
|
|
30
29
|
"config/global.yaml",
|
|
31
30
|
"/defaultconfigs/global.yaml",
|
|
@@ -44,7 +43,6 @@ class ServerWatcher:
|
|
|
44
43
|
WatcherConfig
|
|
45
44
|
)
|
|
46
45
|
|
|
47
|
-
# initialize panels and servers
|
|
48
46
|
self.panel = Panel(
|
|
49
47
|
name=self.global_cfg.panel_name,
|
|
50
48
|
url=self.global_cfg.panel_url,
|
|
@@ -81,23 +79,27 @@ class ServerWatcher:
|
|
|
81
79
|
|
|
82
80
|
self.tz = ZoneInfo(self.global_cfg.timezone)
|
|
83
81
|
|
|
84
|
-
# utility
|
|
85
82
|
def fmt(self, template: str, **kwargs):
|
|
86
83
|
return template.format(prefix=self.messages.prefix, **kwargs)
|
|
87
84
|
|
|
85
|
+
def say(self, msg, level="info", **fmt):
|
|
86
|
+
if not msg:
|
|
87
|
+
return
|
|
88
|
+
text = self.fmt(msg, **fmt)
|
|
89
|
+
getattr(self.log, level)(text)
|
|
90
|
+
|
|
88
91
|
def shutdown(self):
|
|
89
|
-
self.
|
|
92
|
+
self.say(self.messages.log_shutdown)
|
|
90
93
|
raise SystemExit
|
|
91
94
|
|
|
92
|
-
# restart logic
|
|
93
95
|
def restart_and_wait(self):
|
|
94
96
|
if self.cfg.schedule_control:
|
|
95
97
|
self.origin.disableSchedule(self.cfg.restart_soon_id)
|
|
96
98
|
self.server.restart()
|
|
97
|
-
self.
|
|
99
|
+
self.say(self.messages.restart_action_sent)
|
|
98
100
|
time.sleep(self.cfg.restart_wait_seconds)
|
|
99
101
|
|
|
100
|
-
self.
|
|
102
|
+
self.say(self.messages.log_status_check, level="warn")
|
|
101
103
|
alive = waitForOnline(
|
|
102
104
|
self.server,
|
|
103
105
|
timeout=self.cfg.restart_online_timeout,
|
|
@@ -105,12 +107,11 @@ class ServerWatcher:
|
|
|
105
107
|
)
|
|
106
108
|
|
|
107
109
|
if alive:
|
|
108
|
-
self.
|
|
109
|
-
self.
|
|
110
|
+
self.say(self.messages.server_back_online)
|
|
111
|
+
self.say(self.messages.server_back_online_broadcast)
|
|
110
112
|
else:
|
|
111
|
-
self.
|
|
113
|
+
self.say(self.messages.server_failed_restart, level="error")
|
|
112
114
|
|
|
113
|
-
# scheduled restart
|
|
114
115
|
def schedule_restart(self, minutes):
|
|
115
116
|
info = snapSchedule(minimumMinutes=minutes)
|
|
116
117
|
scheduled = info["scheduled"]
|
|
@@ -118,11 +119,8 @@ class ServerWatcher:
|
|
|
118
119
|
local_time = scheduled.astimezone(self.tz)
|
|
119
120
|
time_str = local_time.strftime("%I:%M %p")
|
|
120
121
|
|
|
121
|
-
self.server.sendBroadcast(
|
|
122
|
-
self.fmt(self.messages.broadcast_restart_at, time=time_str)
|
|
123
|
-
)
|
|
122
|
+
self.server.sendBroadcast(self.fmt(self.messages.broadcast_restart_at, time=time_str))
|
|
124
123
|
|
|
125
|
-
# minute_* callbacks
|
|
126
124
|
minute_callbacks = {
|
|
127
125
|
int(k.split("_")[1]): (
|
|
128
126
|
lambda msg=self.fmt(getattr(self.messages, k)):
|
|
@@ -132,7 +130,6 @@ class ServerWatcher:
|
|
|
132
130
|
if k.startswith("minute_")
|
|
133
131
|
}
|
|
134
132
|
|
|
135
|
-
# second_* callbacks
|
|
136
133
|
second_callbacks = {
|
|
137
134
|
int(k.split("_")[1]): (
|
|
138
135
|
lambda msg=self.fmt(getattr(self.messages, k)):
|
|
@@ -148,12 +145,11 @@ class ServerWatcher:
|
|
|
148
145
|
second_callbacks=second_callbacks,
|
|
149
146
|
)
|
|
150
147
|
|
|
151
|
-
# evaluation logic
|
|
152
148
|
def evaluate(self):
|
|
153
|
-
self.
|
|
149
|
+
self.say(self.messages.log_start)
|
|
154
150
|
|
|
155
151
|
if not validateAll(self.panel, self.server):
|
|
156
|
-
self.
|
|
152
|
+
self.say(self.messages.log_validation_fail, level="error")
|
|
157
153
|
self.shutdown()
|
|
158
154
|
|
|
159
155
|
self.server.refresh()
|
|
@@ -164,21 +160,16 @@ class ServerWatcher:
|
|
|
164
160
|
restart_reasons = []
|
|
165
161
|
no_restart_reasons = []
|
|
166
162
|
|
|
167
|
-
# pro-restart
|
|
168
163
|
if self.cfg.schedule_control and self.server.getSchedule(self.cfg.restart_soon_id)["is_active"]:
|
|
169
164
|
restart_reasons.append(self.messages.reason_restart_soon)
|
|
170
165
|
pro += self.cfg.weight_restart_soon
|
|
171
166
|
|
|
172
167
|
if snap.ram >= self.cfg.ram_threshold:
|
|
173
|
-
restart_reasons.append(
|
|
174
|
-
self.fmt(self.messages.reason_ram, ram=snap.ram, threshold=self.cfg.ram_threshold)
|
|
175
|
-
)
|
|
168
|
+
restart_reasons.append(self.fmt(self.messages.reason_ram, ram=snap.ram, threshold=self.cfg.ram_threshold))
|
|
176
169
|
pro += int(round(snap.ram, 0) - (self.cfg.ram_threshold - 1))
|
|
177
170
|
|
|
178
171
|
if snap.cpu >= self.cfg.cpu_threshold:
|
|
179
|
-
restart_reasons.append(
|
|
180
|
-
self.fmt(self.messages.reason_cpu, cpu=snap.cpu, threshold=self.cfg.cpu_threshold)
|
|
181
|
-
)
|
|
172
|
+
restart_reasons.append(self.fmt(self.messages.reason_cpu, cpu=snap.cpu, threshold=self.cfg.cpu_threshold))
|
|
182
173
|
pro += self.cfg.weight_cpu
|
|
183
174
|
|
|
184
175
|
if snap.uptime // 3600 >= self.cfg.uptime_hours_threshold:
|
|
@@ -189,37 +180,29 @@ class ServerWatcher:
|
|
|
189
180
|
pro += self.cfg.weight_uptime
|
|
190
181
|
|
|
191
182
|
if (snap.tps if snap.tps is not None else 0) <= self.cfg.tps_threshold:
|
|
192
|
-
restart_reasons.append(
|
|
193
|
-
self.fmt(self.messages.reason_tps, tps=snap.tps, threshold=self.cfg.tps_threshold)
|
|
194
|
-
)
|
|
183
|
+
restart_reasons.append(self.fmt(self.messages.reason_tps, tps=snap.tps, threshold=self.cfg.tps_threshold))
|
|
195
184
|
pro += self.cfg.weight_tps
|
|
196
185
|
|
|
197
|
-
# anti-restart
|
|
198
186
|
if snap.uptime // 60 < 30:
|
|
199
|
-
no_restart_reasons.append(
|
|
200
|
-
self.fmt(self.messages.reason_low_uptime, uptime=snap.uptime_formatted)
|
|
201
|
-
)
|
|
187
|
+
no_restart_reasons.append(self.fmt(self.messages.reason_low_uptime, uptime=snap.uptime_formatted))
|
|
202
188
|
anti += self.cfg.weight_low_uptime
|
|
203
189
|
|
|
204
190
|
if snap.players > 0:
|
|
205
191
|
verb = "are" if snap.players != 1 else "is"
|
|
206
192
|
plural = "players" if snap.players != 1 else "player"
|
|
207
|
-
no_restart_reasons.append(
|
|
208
|
-
self.fmt(self.messages.reason_players, verb=verb, count=snap.players, plural=plural)
|
|
209
|
-
)
|
|
193
|
+
no_restart_reasons.append(self.fmt(self.messages.reason_players, verb=verb, count=snap.players, plural=plural))
|
|
210
194
|
anti += snap.players * self.cfg.weight_per_player
|
|
211
195
|
|
|
212
|
-
# logging
|
|
213
196
|
if restart_reasons:
|
|
214
|
-
self.
|
|
197
|
+
self.say(self.messages.pro_restart_splash, level="warn")
|
|
215
198
|
for r in restart_reasons:
|
|
216
199
|
self.log.warn(f"- {r}")
|
|
217
200
|
self.log.warn("\n")
|
|
218
201
|
|
|
219
202
|
if no_restart_reasons:
|
|
220
|
-
self.
|
|
203
|
+
self.say(self.messages.anti_restart_splash, level="warn")
|
|
221
204
|
for r in no_restart_reasons:
|
|
222
|
-
self.log.warn(f"
|
|
205
|
+
self.log.warn(f"{self.messages.bullet} {r}")
|
|
223
206
|
self.log.warn("\n")
|
|
224
207
|
|
|
225
208
|
self.log.warn(f"Pro-restart: {pro}")
|
|
@@ -227,28 +210,26 @@ class ServerWatcher:
|
|
|
227
210
|
|
|
228
211
|
gap = abs(pro - anti)
|
|
229
212
|
|
|
230
|
-
# decision
|
|
231
213
|
if pro == 0:
|
|
232
|
-
self.
|
|
214
|
+
self.say(self.messages.log_no_restart)
|
|
233
215
|
return
|
|
234
216
|
|
|
235
217
|
if pro > anti and snap.players == 0:
|
|
236
|
-
self.
|
|
218
|
+
self.say(self.messages.log_immediate_restart)
|
|
237
219
|
self.restart_and_wait()
|
|
238
220
|
return
|
|
239
221
|
|
|
240
|
-
self.
|
|
222
|
+
self.say(self.messages.log_scheduled)
|
|
241
223
|
|
|
242
224
|
if gap <= 2:
|
|
243
|
-
self.
|
|
225
|
+
self.say(self.messages.log_gap_low, level="warn", gap=gap)
|
|
244
226
|
self.schedule_restart(self.cfg.low_gap_minutes)
|
|
245
227
|
else:
|
|
246
|
-
self.
|
|
228
|
+
self.say(self.messages.log_gap_high, level="warn", gap=gap)
|
|
247
229
|
self.schedule_restart(self.cfg.high_gap_minutes)
|
|
248
230
|
|
|
249
231
|
self.restart_and_wait()
|
|
250
232
|
|
|
251
|
-
# main loop
|
|
252
233
|
def run(self):
|
|
253
234
|
if self.global_cfg.clear_terminal:
|
|
254
235
|
clearTerminal()
|
|
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
|