Files
HBlink4/scripts
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
..

HBlink4 Scripts

install_services.sh

Installs the systemd unit files with your user, group and paths filled in.

sudo ./scripts/install_services.sh

Documented in SYSTEMD.md, which is the reference for systemd deployment.

filter_user_csv.py

Filters the DMR user database to only include US and Canada entries, reducing file size and memory usage.

Note

: The dashboard now refreshes user.csv automatically on a daily schedule via dashboard/user_db.py, applying configurable country/callsign/ID filters without a restart. This script remains available for manual / one-off filtering when the automated pipeline isn't in use.

Usage

Download latest user database:

# Download from radioid.net or other DMR database source
wget -O user_full.csv https://example.com/user.csv

Filter for US/Canada only:

# Process and save to user.csv
python3 scripts/filter_user_csv.py user_full.csv user.csv

# Or overwrite the original file:
python3 scripts/filter_user_csv.py user.csv

Output:

Processing user_full.csv...

✅ Filtering complete!
   Kept: 132,999 entries (45.6%)
     - Canada: 7,047
     - United States: 125,952
   Skipped: 158,969 entries (54.4%)

📊 File sizes:
   Input:  14.79 MB
   Output: 7.21 MB
   Saved:  7.57 MB (51.2%)

✨ Filtered CSV written to: user.csv

Why Filter?

  • Memory efficiency: 54% fewer entries to load
  • Disk space: 51% smaller file size
  • Target audience: Primary users are US/Canada
  • Performance: Faster startup time for dashboard

Adding More Countries

To include additional countries, edit filter_user_csv.py line 52:

if country in ('United States', 'Canada', 'United Kingdom'):  # Add more here

Automation

To automatically update and filter the user database:

#!/bin/bash
# update_user_database.sh

echo "Downloading latest user database..."
wget -O user_full.csv https://example.com/user.csv

echo "Filtering for US/Canada..."
python3 scripts/filter_user_csv.py user_full.csv user.csv

echo "Cleaning up..."
rm user_full.csv

echo "Done! Restart dashboard to load new database."