serverwatcher 4.3__tar.gz → 4.5__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.
Files changed (21) hide show
  1. {serverwatcher-4.3/src/serverwatcher.egg-info → serverwatcher-4.5}/PKG-INFO +1 -1
  2. {serverwatcher-4.3 → serverwatcher-4.5}/pyproject.toml +1 -1
  3. {serverwatcher-4.3 → serverwatcher-4.5}/src/serverwatcher/defaultconfigs/watcher.yaml +1 -1
  4. {serverwatcher-4.3 → serverwatcher-4.5}/src/serverwatcher/validator.py +30 -0
  5. {serverwatcher-4.3 → serverwatcher-4.5}/src/serverwatcher/watcher.py +1 -4
  6. {serverwatcher-4.3 → serverwatcher-4.5/src/serverwatcher.egg-info}/PKG-INFO +1 -1
  7. {serverwatcher-4.3 → serverwatcher-4.5}/src/serverwatcher.egg-info/SOURCES.txt +0 -1
  8. serverwatcher-4.3/src/serverwatcher/autorepair.py +0 -137
  9. {serverwatcher-4.3 → serverwatcher-4.5}/LICENSE +0 -0
  10. {serverwatcher-4.3 → serverwatcher-4.5}/README.md +0 -0
  11. {serverwatcher-4.3 → serverwatcher-4.5}/setup.cfg +0 -0
  12. {serverwatcher-4.3 → serverwatcher-4.5}/src/serverwatcher/__init__.py +0 -0
  13. {serverwatcher-4.3 → serverwatcher-4.5}/src/serverwatcher/configclasses/__init__.py +0 -0
  14. {serverwatcher-4.3 → serverwatcher-4.5}/src/serverwatcher/configclasses/global_config.py +0 -0
  15. {serverwatcher-4.3 → serverwatcher-4.5}/src/serverwatcher/configclasses/messages.py +0 -0
  16. {serverwatcher-4.3 → serverwatcher-4.5}/src/serverwatcher/configclasses/watcher.py +0 -0
  17. {serverwatcher-4.3 → serverwatcher-4.5}/src/serverwatcher/defaultconfigs/global.yaml +0 -0
  18. {serverwatcher-4.3 → serverwatcher-4.5}/src/serverwatcher/defaultconfigs/messages.yaml +0 -0
  19. {serverwatcher-4.3 → serverwatcher-4.5}/src/serverwatcher.egg-info/dependency_links.txt +0 -0
  20. {serverwatcher-4.3 → serverwatcher-4.5}/src/serverwatcher.egg-info/requires.txt +0 -0
  21. {serverwatcher-4.3 → serverwatcher-4.5}/src/serverwatcher.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: serverwatcher
3
- Version: 4.3
3
+ Version: 4.5
4
4
  Summary: A HungerLib-powered Minecraft server automation engine.
5
5
  Author: iFamished
6
6
  License: GPL-3.0
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
7
7
 
8
8
  [project]
9
9
  name = "serverwatcher"
10
- version = "4.3"
10
+ version = "4.5"
11
11
  description = "A HungerLib-powered Minecraft server automation engine."
12
12
  readme = "README.md"
13
13
  requires-python = ">=3.10"
@@ -2,7 +2,7 @@ schedules:
2
2
  restart_soon_schedule_id: 0 # replace this with real schedule id
3
3
  origin_disable_schedule_id: 0 # replace this with real schedule id
4
4
 
5
- thresolds:
5
+ thresholds:
6
6
  ram_threshold: 6
7
7
  cpu_threshold: 150
8
8
  uptime_hours_threshold: 12
@@ -88,6 +88,32 @@ def validate_messages_config(cfg, errors):
88
88
  # Not required for every field, but warn if missing
89
89
  pass
90
90
 
91
+ def ensure_no_defaults(cfg, errors):
92
+ if cfg.panel_url == "https://example.com":
93
+ errors.append('panel_url: must not be left default')
94
+
95
+ if cfg.panel_api_key == 'CHANGE_ME':
96
+ errors.append('panel_api_key: must not be left default')
97
+
98
+ if cfg.origin_server_id == 'CHANGE_ME':
99
+ errors.append('origin_server_id: must not be left default')
100
+
101
+ if cfg.server_id == 'CHANGE_ME':
102
+ errors.append('server_id: must not be left default')
103
+
104
+ if cfg.server_domain == 'mc.example.com':
105
+ errors.append('server_domain: must not be left default')
106
+
107
+ if cfg.rcon_password == 'password':
108
+ errors.append('rcon_password: must not be left default')
109
+
110
+ if cfg.restart_soon_schedule_id <= 0:
111
+ errors.append(f'restart_soon_schedule_id: must be >= 1 (got {cfg.restart_soon_schedule_id})')
112
+
113
+ if cfg.origin_disable_schedule_id <= 0:
114
+ errors.append(f'origin_disable_schedule_id: must be >=1 (got {cfg.origin_disable_schedule_id})')
115
+
116
+
91
117
 
92
118
  # -----------------------------
93
119
  # Main validator
@@ -111,6 +137,10 @@ def validate_all():
111
137
  validate_messages_config(messages_cfg, errors)
112
138
  validate_watcher_config(watcher_cfg, errors)
113
139
 
140
+ # Check for defaults
141
+ ensure_no_defaults(global_cfg, errors)
142
+ ensure_no_defaults(watcher_cfg, errors)
143
+
114
144
  # Print results
115
145
  if errors:
116
146
  print("❌ CONFIG VALIDATION FAILED:")
@@ -18,12 +18,9 @@ from serverwatcher.configclasses.global_config import GlobalConfig
18
18
  from serverwatcher.configclasses.messages import MessagesConfig
19
19
  from serverwatcher.configclasses.watcher import WatcherConfig
20
20
 
21
- # Validate and autorepair configs before watcher starts
21
+
22
22
  from serverwatcher.validator import validate_all
23
- from serverwatcher.autorepair import autorepair_all
24
23
 
25
- validate_all()
26
- autorepair_all()
27
24
  validate_all()
28
25
 
29
26
  class ServerWatcher:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: serverwatcher
3
- Version: 4.3
3
+ Version: 4.5
4
4
  Summary: A HungerLib-powered Minecraft server automation engine.
5
5
  Author: iFamished
6
6
  License: GPL-3.0
@@ -2,7 +2,6 @@ LICENSE
2
2
  README.md
3
3
  pyproject.toml
4
4
  src/serverwatcher/__init__.py
5
- src/serverwatcher/autorepair.py
6
5
  src/serverwatcher/validator.py
7
6
  src/serverwatcher/watcher.py
8
7
  src/serverwatcher.egg-info/PKG-INFO
@@ -1,137 +0,0 @@
1
- import os
2
- import yaml
3
- from dataclasses import fields, MISSING
4
-
5
- from hungerlib.addons import load_yaml, flatten_nested
6
- from serverwatcher.configclasses.global_config import GlobalConfig
7
- from serverwatcher.configclasses.messages import MessagesConfig
8
- from serverwatcher.configclasses.watcher import WatcherConfig
9
-
10
-
11
- # ---------------------------------------------------------
12
- # Helpers
13
- # ---------------------------------------------------------
14
-
15
- def load_yaml_default(schema, default_path):
16
- """
17
- Load the default YAML file located inside the schema's package.
18
- """
19
- module_file = schema.__module__.replace(".", "/")
20
- pkg_root = os.path.dirname(os.path.dirname(__import__(schema.__module__).__file__))
21
- abs_default = os.path.join(pkg_root, default_path.lstrip("/"))
22
-
23
- if os.path.exists(abs_default):
24
- return flatten_nested(load_yaml(abs_default))
25
- return {}
26
-
27
-
28
- def get_schema_defaults(schema):
29
- """
30
- Extract default values from dataclass fields.
31
- """
32
- defaults = {}
33
- for f in fields(schema):
34
- if f.default is not MISSING:
35
- defaults[f.name] = f.default
36
- elif f.default_factory is not MISSING: # type: ignore
37
- defaults[f.name] = f.default_factory() # type: ignore
38
- return defaults
39
-
40
-
41
- def repair_value(name, value, expected_type, schema_defaults, yaml_defaults, repairs):
42
- """
43
- Determine the correct value for a field using priority:
44
- 1. User value (if valid)
45
- 2. Schema default
46
- 3. YAML default
47
- """
48
- # If value is correct type and valid, keep it
49
- if isinstance(value, expected_type):
50
- if expected_type in (int, float) and value < 0:
51
- repairs.append(f"{name}: negative → repaired to default")
52
- else:
53
- return value
54
-
55
- # Try schema default
56
- if name in schema_defaults:
57
- repairs.append(f"{name}: repaired using schema default")
58
- return schema_defaults[name]
59
-
60
- # Try YAML default
61
- if name in yaml_defaults:
62
- repairs.append(f"{name}: repaired using YAML default")
63
- return yaml_defaults[name]
64
-
65
- # Fallback: empty string or zero
66
- repairs.append(f"{name}: no defaults found → set to safe fallback")
67
- if expected_type is str:
68
- return ""
69
- if expected_type in (int, float):
70
- return 0
71
- return None
72
-
73
-
74
- def repair_config(path, default_path, schema):
75
- """
76
- Load, repair, and rewrite a config file.
77
- """
78
- print(f"\n🔧 Repairing {path}...")
79
-
80
- # Load user config (raw YAML)
81
- if os.path.exists(path):
82
- raw = flatten_nested(load_yaml(path))
83
- else:
84
- raw = {}
85
-
86
- # Load defaults
87
- schema_defaults = get_schema_defaults(schema)
88
- yaml_defaults = load_yaml_default(schema, default_path)
89
-
90
- repaired = {}
91
- repairs = []
92
-
93
- # Validate each field in schema
94
- for f in fields(schema):
95
- name = f.name
96
- expected_type = f.type
97
- value = raw.get(name, None)
98
-
99
- repaired[name] = repair_value(
100
- name, value, expected_type, schema_defaults, yaml_defaults, repairs
101
- )
102
-
103
- # Write repaired YAML back to disk
104
- os.makedirs(os.path.dirname(path), exist_ok=True)
105
- with open(path, "w") as f:
106
- yaml.dump(repaired, f, sort_keys=False)
107
-
108
- if repairs:
109
- print(" ✔ Repairs applied:")
110
- for r in repairs:
111
- print(" -", r)
112
- else:
113
- print(" ✔ No repairs needed")
114
-
115
- return repairs
116
-
117
-
118
- # ---------------------------------------------------------
119
- # Main
120
- # ---------------------------------------------------------
121
-
122
- def autorepair_all():
123
- print("=== ServerWatcher Auto‑Repair ===")
124
-
125
- repairs = []
126
- repairs += repair_config("config/global.yaml", "/defaultconfigs/global.yaml", GlobalConfig)
127
- repairs += repair_config("config/messages.yaml", "/defaultconfigs/messages.yaml", MessagesConfig)
128
- repairs += repair_config("config/watcher.yaml", "/defaultconfigs/watcher.yaml", WatcherConfig)
129
-
130
- if repairs:
131
- print("\n✅ Auto‑repair completed with fixes.")
132
- else:
133
- print("\n✅ All configs already valid — no repairs needed.")
134
-
135
-
136
- if __name__ == "__main__":
137
- autorepair_all()
File without changes
File without changes
File without changes