Skip to content

Commit 2717a16

Browse files
committed
Release 1.0.5
1 parent ebbe064 commit 2717a16

41 files changed

Lines changed: 5219 additions & 1069 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,6 @@ logs/
77
dist/
88
build/
99
*.egg-info/
10+
config/pycluster.local.toml
11+
.codex
12+
.deploy-files.txt

CHANGELOG.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,35 @@
22

33
All notable changes to pyCluster should be recorded here.
44

5+
## 1.0.5 - 2026-04-04
6+
7+
### Changed
8+
9+
- cleaned up the telnet command surface so operator responses are more readable and more consistent across `show/*`, `set/*`, `unset/*`, mail, route, protocol, and sysop command families
10+
- moved a large share of operator-facing telnet text and selected operational log strings into `config/strings.toml` so wording tweaks no longer require code edits or restarts
11+
- public web 24-hour spot stats, history, and leaderboard views now use real time-window queries instead of capped recent-spot snapshots
12+
- the System Operator web console now shows country-data status more clearly, including left-nav pills for loaded `CTY.DAT` and `wpxloc.raw` version/date metadata
13+
- deploy tooling now treats country-data refresh as `CTY.DAT` plus `wpxloc.raw`, and `deploy/doctor.sh` checks the public stats endpoint on the correct listener
14+
- upgrades and deploys are now documented around `config/pycluster.local.toml` so host-local settings stay out of the tracked base config
15+
16+
### Added
17+
18+
- `wpxloc.raw` parsing and fallback lookup support for heading, web spot enrichment, and suspicious-prefix review cues
19+
- email OTP MFA recovery paths in both the System Console and telnet via `sysop/clearmfa <call>`
20+
- stale-user cleanup controls in the System Operator web console
21+
- richer cluster-mail observability in telnet and the System Operator web console
22+
23+
### Fixed
24+
25+
- `set/name`, `set/qth`, `set/qra`, `set/location`, `set/home`, and related `show/*` commands now persist and read back consistently
26+
- `set/location` now takes precedence over `set/qra`, while `set/qra` backfills location only when location is unset
27+
- `show/heading`, `who`, `show/links`, `show/route`, and related peer/operator views now report more accurate live state
28+
- telnet login handling no longer misbehaves when negotiation bytes are present before the callsign
29+
- public web frequency formatting and 24-hour summary counts now match real backend data better
30+
- live spot ingest now uses permissive plausibility checks instead of an over-strict homemade world callsign validator, while suspicious cases are flagged for review instead of being dropped
31+
- cluster mail routing handles offline peers and undeliverable paths more cleanly, with clearer operator readback
32+
- `show/wm7d` CQ-zone handling for calls like `N9JR` now prefers better lookup data instead of stale prefix-only assumptions
33+
534
## 1.0.4 - 2026-03-30
635

736
- fixed the cumulative upgrade path so older `1.0.0` databases with the real `user_prefs(pref_key, pref_value)` schema now upgrade cleanly through `deploy/upgrade.sh`

README.md

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ It keeps the familiar telnet-style operator experience, adds a public web UI and
1616

1717
- Telnet-first DX cluster workflow with modernized operator output
1818
- Public web UI for users and a dedicated web console for system operators
19-
- SQLite persistence, CTY refresh tooling, and fail2ban integration
19+
- SQLite persistence, CTY and wpxloc refresh tooling, and fail2ban integration
2020
- Validated deploy path across modern Debian, Ubuntu, Fedora, and Red Hat-family Linux
2121

2222
## 🧭 What pyCluster Does
@@ -29,7 +29,7 @@ It keeps the familiar telnet-style operator experience, adds a public web UI and
2929
- ships with deployment tooling for systemd-based Linux hosts
3030
- integrates with fail2ban for login-abuse protection
3131
- supports age-based cleanup for spots, messages, and bulletins
32-
- maintains local CTY data with optional automatic refresh from Country Files
32+
- maintains local `CTY.DAT` and `wpxloc.raw` data with optional automatic refresh from Country Files
3333

3434
## Where pyCluster Improves on Legacy Cluster Software
3535

@@ -67,6 +67,15 @@ In practice that means:
6767

6868
pyCluster is usable today as a single-node cluster with web and telnet access, persistent storage, peer linking, and operator controls. The codebase is still evolving, but it is no longer just a prototype.
6969

70+
Current release: `1.0.5`
71+
72+
Recent highlights in `1.0.5`:
73+
74+
- cleaner and more human-readable telnet/operator command replies
75+
- `CTY.DAT` and `wpxloc.raw` visibility plus refresh support
76+
- public web 24-hour spot stats that reflect real time windows
77+
- more complete MFA recovery, cluster-mail observability, and config-override documentation
78+
7079
## 🖥️ Interfaces
7180

7281
### Telnet
@@ -131,6 +140,8 @@ pip install -e .
131140
pycluster --config ./config/pycluster.toml serve
132141
```
133142

143+
Operator-local overrides can live in `./config/pycluster.local.toml`. When present, pyCluster loads `pycluster.toml` first and then layers `pycluster.local.toml` on top. Keep the tracked base file close to upstream and put host-specific changes in the local override file.
144+
134145
Deploy on a supported Linux host:
135146

136147
```bash
@@ -149,6 +160,7 @@ Typical deployed layout:
149160
/home/pycluster/pyCluster/ # live runtime tree
150161
├── config/
151162
│ ├── pycluster.toml # active node configuration
163+
│ ├── pycluster.local.toml # optional untracked local override
152164
│ └── strings.toml # hot-reloadable operator text
153165
├── data/
154166
│ └── pycluster.db # live SQLite database
@@ -168,6 +180,8 @@ sudo ./deploy/upgrade.sh
168180
sudo ./deploy/doctor.sh
169181
```
170182

183+
For git-based upgrades, move site-local changes out of the tracked `config/pycluster.toml` file and into `config/pycluster.local.toml` first. That keeps `git pull --ff-only` clean while preserving local runtime settings.
184+
171185
For upgrades from `1.0.0` through `1.0.3`, `deploy/upgrade.sh` performs the required cumulative state conversion for older installs:
172186

173187
- hashes any legacy plaintext passwords still stored in `user_prefs`
@@ -273,19 +287,33 @@ Auth-failure log retention:
273287

274288
- shipped logrotate policy for `/var/log/pycluster/authfail.log`
275289

276-
## 🌍 CTY Data
290+
## 🌍 Country Data
277291

278-
pyCluster ships with a bundled `cty.dat`, and install/upgrade perform a best-effort refresh from Country Files.
292+
pyCluster supports both `CTY.DAT` and `wpxloc.raw`.
293+
294+
That data is used for:
295+
296+
- DXCC/entity and zone enrichment
297+
- heading and lookup fallbacks
298+
- operational review cues for unusual spot prefixes
299+
- sysop visibility into currently loaded country-data versions
300+
301+
pyCluster ships with bundled country-data fixtures, and install/upgrade can perform a best-effort refresh from Country Files.
279302

280303
Manual refresh:
281304

282305
```bash
283306
python3 ./scripts/update_cty.py --config ./config/pycluster.toml
284307
```
285308

309+
By default this refreshes both `CTY.DAT` and `wpxloc.raw`. Use `--cty-only` if you intentionally want to skip the `wpxloc.raw` update.
310+
286311
Automatic refresh:
287312

288313
- `pycluster-cty-refresh.timer`
314+
- refreshes both `CTY.DAT` and `wpxloc.raw`
315+
316+
The System Operator web console and telnet `show/configuration` also report dataset load state, path, and version/date when available.
289317

290318
## 🧹 Retention and Cleanup
291319

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
[node]
2+
# qth = "Boston, MA"
3+
# node_locator = "FN42LI"
4+
5+
[telnet]
6+
# port = 7300
7+
8+
[web]
9+
# admin_token = "change-me"
10+
11+
[public_web]
12+
# enabled = true
13+
14+
[store]
15+
# sqlite_path = "./data/pycluster.db"

config/pycluster.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ host = "127.0.0.1"
2626
port = 8081
2727
static_dir = "./web/public_dxweb/static"
2828
cty_dat_path = "./fixtures/live/dxspider/cty.dat"
29+
wpxloc_raw_path = ""
2930

3031
[store]
3132
sqlite_path = "./data/pycluster.db"

0 commit comments

Comments
 (0)