Files
HBlink4/pyproject.toml
cortandClaude Opus 5 6f6dadd6ac Make a first-time install work without prior DMR or Linux experience
HBlink4 draws operators who have never run a network server before, and
several things in the install path assumed otherwise.

Sample configuration split in two. config_sample.json was a feature
showcase, and copying it as documented produced a broken server: its
example repeater pattern claimed IDs 310000-312999 with a passphrase of
its own, so an operator whose repeater fell in that range was rejected
with no way to diagnose it (patterns match first-wins and never fall
through to "default"). It also shipped an outbound link and an OpenBridge
trunk enabled against hosts that do not exist, and bound both address
families to one port, which cannot work. It is now a minimal working
config needing one edit -- the passphrase. The full reference moves to
config_advanced_sample.json with its link examples disabled and the ID
overlap called out.

Ship IPv4-only. Dual-stack is fully supported and now documented as four
concrete layouts, each verified to bind; it is simply not the default,
because most repeaters are IPv4 and the same-port bind conflict is not
something a new operator should have to learn first. The built-in default
when the key is absent stays false, so existing installs are unaffected.
"IPv6 is globally disabled" drops from WARNING to INFO -- it is now the
recommended setting and should not read as a fault.

install_services.sh: refuse paths containing a space, $ or % (systemd
mis-parses them in ExecStart=, and a space previously produced a unit
that passed verification and then failed at start); escape & in the path
substitution; render and verify units in a temp dir so a failed
substitution cannot leave a broken unit in /etc/systemd/system. Check the
things that otherwise surface only in the journal: complete checkout,
Python 3.9+, server and dashboard dependencies, both config files, and
agreement between the two halves of the dashboard event link.

readme: seven numbered steps with no diversions, adding the prerequisites
(python3-venv, which Debian and Ubuntu users hit constantly) and the
firewall ports, neither of which were mentioned.

Also: the dashboard logged a hardcoded localhost:8080 regardless of the
configured port; run_all.sh now fails clearly on missing config instead of
a traceback; pyproject's comment claimed systemd should invoke the console
scripts, contradicting how the units actually work.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 08:37:11 -05:00

41 lines
1.5 KiB
TOML

[build-system]
requires = ["setuptools>=68"]
build-backend = "setuptools.build_meta"
[project]
name = "hblink4"
description = "Next generation HomeBrew DMR protocol server"
readme = "readme.md"
requires-python = ">=3.9"
license = "GPL-3.0-or-later"
authors = [{ name = "Cort Buffington, N0MJS" }]
# Installing is OPTIONAL. HBlink4 runs straight from a git checkout:
# pip install -r requirements.txt -r requirements-dashboard.txt
# python hblink.py config/config.json
# This file exists for people who prefer `pip install -e .`, which additionally
# provides `hblink4` / `hblink4-dashboard` commands. Dependencies are read from
# the requirements files so there is only one place to declare them.
dynamic = ["version", "dependencies", "optional-dependencies"]
[project.urls]
Homepage = "https://github.com/n0mjs710/HBlink4"
# Console scripts, available only if you chose to `pip install` the project.
# They are NOT how HBlink4 is normally run: the systemd units invoke the module
# files by path straight from the checkout, so there is no install step to
# repeat after a `git pull`. See SYSTEMD.md.
[project.scripts]
hblink4 = "hblink4.hblink:main"
hblink4-dashboard = "dashboard.server:run"
[tool.setuptools.dynamic]
version = { attr = "hblink4.__version__" }
dependencies = { file = ["requirements.txt"] }
optional-dependencies.dashboard = { file = ["requirements-dashboard.txt"] }
[tool.setuptools]
packages = ["hblink4", "dashboard"]
[tool.setuptools.package-data]
dashboard = ["static/*", "config_sample.json"]