Every setting now carries a paragraph saying what it is in everyday terms and why someone who does not already speak radio would turn it up, down, on or off: what the squelch knob actually is, why automatic gain is a bad idea for scanning, why a bias tee can damage equipment, why setting the transcription language matters on noisy audio. The menus and `config --describe` show it alongside the existing technical detail. packaging/make-man.py generates bandsaunter(1) from that same table, so the manual cannot document a setting the program lacks or miss one it has -- tests check both, that the page renders through groff without a single warning, and that the guidance survives into the rendered output. Around it are hand-written sections on the commands, entering frequencies, the band plan, lock-outs, the keys during a scan, HF, single sideband, files, environment variables and worked examples. The .deb regenerates and installs it rather than shipping a copy, so an installed manual always matches the installed program. The README picks up what the last few commits added: the plain display as a saved setting, what the settings tests now guarantee, and where to read the manual before installing. Version is the day's build: 2026-08-22_01. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
116 lines
4.4 KiB
Bash
Executable file
116 lines
4.4 KiB
Bash
Executable file
#!/bin/sh
|
|
# Build a .deb that pulls in every dependency through apt.
|
|
#
|
|
# Deliberately plain dpkg-deb rather than debhelper: everything this package
|
|
# needs is already in Debian, the payload is pure Python with no compiled
|
|
# parts, and this way the build needs nothing installed beyond dpkg itself.
|
|
set -eu
|
|
|
|
here=$(cd "$(dirname "$0")/.." && pwd)
|
|
version=$(cd "$here" && python3 -c 'import bandsaunter; print(bandsaunter.debian_version())')
|
|
revision=${DEB_REVISION:-1}
|
|
arch=all
|
|
stage=$(mktemp -d)
|
|
trap 'rm -rf "$stage"' EXIT
|
|
|
|
pkgdir="$stage/bandsaunter_${version}-${revision}_${arch}"
|
|
site="$pkgdir/usr/lib/python3/dist-packages"
|
|
mkdir -p "$site/bandsaunter" "$pkgdir/usr/bin" "$pkgdir/DEBIAN" \
|
|
"$pkgdir/usr/share/doc/bandsaunter"
|
|
|
|
cp "$here"/bandsaunter/*.py "$site/bandsaunter/"
|
|
cp "$here/README.md" "$pkgdir/usr/share/doc/bandsaunter/"
|
|
gzip -9n "$pkgdir/usr/share/doc/bandsaunter/README.md"
|
|
|
|
# Regenerated from the settings table rather than copied, so the manual
|
|
# cannot describe a version of the settings that no longer exists.
|
|
mkdir -p "$pkgdir/usr/share/man/man1"
|
|
python3 "$here/packaging/make-man.py" "$pkgdir/usr/share/man/man1/bandsaunter.1" \
|
|
>/dev/null
|
|
gzip -9n "$pkgdir/usr/share/man/man1/bandsaunter.1"
|
|
|
|
cat > "$pkgdir/usr/bin/bandsaunter" <<'EOF'
|
|
#!/usr/bin/python3
|
|
import sys
|
|
from bandsaunter.cli import main
|
|
sys.exit(main())
|
|
EOF
|
|
chmod 755 "$pkgdir/usr/bin/bandsaunter"
|
|
|
|
# Every one of these is in Debian, so apt resolves the lot. No speech
|
|
# recogniser is packaged for Debian, so that part ships as its own package
|
|
# (built by build-repo.sh) and is recommended rather than depended on: apt
|
|
# pulls it in from the repository, and a bare "dpkg -i" of this file still
|
|
# installs, without transcription.
|
|
cat > "$pkgdir/DEBIAN/control" <<EOF
|
|
Package: bandsaunter
|
|
Version: ${version}-${revision}
|
|
Section: hamradio
|
|
Priority: optional
|
|
Architecture: ${arch}
|
|
Depends: python3 (>= 3.10), python3-numpy, python3-scipy, python3-rich,
|
|
python3-yaml, librtlsdr0
|
|
Recommends: bandsaunter-transcribe, espeak-ng
|
|
Suggests: rtl-sdr
|
|
Maintainer: bandsaunter
|
|
Installed-Size: $(du -ks "$pkgdir" | cut -f1)
|
|
Description: signal scanner and recorder for RTL-SDR receivers
|
|
Sweeps any set of frequency ranges, or presets from a built-in US band plan,
|
|
records what it finds and works out what kind of signal it was.
|
|
.
|
|
Captures are kept only if they carry voice, decodable CW or an identified
|
|
digital keying scheme, so static and interference are discarded rather than
|
|
filling the disk. CW is decoded to text, and speech can be transcribed when
|
|
a recogniser is installed.
|
|
EOF
|
|
|
|
cat > "$pkgdir/DEBIAN/postinst" <<'EOF'
|
|
#!/bin/sh
|
|
set -e
|
|
if [ "$1" = configure ]; then
|
|
# The DVB-T driver claims the dongle on sight and has to be kept off it.
|
|
if [ ! -e /etc/modprobe.d/blacklist-rtlsdr.conf ]; then
|
|
echo 'blacklist dvb_usb_rtl28xxu' > /etc/modprobe.d/blacklist-rtlsdr.conf
|
|
echo 'bandsaunter: blacklisted dvb_usb_rtl28xxu; unplug and replug the'
|
|
echo ' receiver, or run: sudo rmmod dvb_usb_rtl28xxu'
|
|
fi
|
|
|
|
# Said once, at install time, only when there is genuinely nothing to
|
|
# transcribe with -- otherwise the recogniser package has already
|
|
# arrived and there is nothing to explain.
|
|
if ! python3 -c 'import importlib.util as u, sys
|
|
sys.path.append("/usr/lib/bandsaunter/vendor")
|
|
try:
|
|
found = any(u.find_spec(m) for m in
|
|
("faster_whisper", "whisper", "vosk", "pocketsphinx"))
|
|
except Exception:
|
|
found = True # something is there, however unhappy; say nothing
|
|
sys.exit(0 if found else 1)' \
|
|
2>/dev/null; then
|
|
echo 'bandsaunter: speech transcription is unavailable -- no recogniser'
|
|
echo ' is installed. Scanning, recording and CW decoding all'
|
|
echo ' work without one. To add transcription, either:'
|
|
echo ' apt install bandsaunter-transcribe'
|
|
echo ' (from the repository this package came from), or'
|
|
echo ' pip install --break-system-packages faster-whisper'
|
|
echo ' Then: bandsaunter transcribe --engines'
|
|
fi
|
|
fi
|
|
exit 0
|
|
EOF
|
|
chmod 755 "$pkgdir/DEBIAN/postinst"
|
|
|
|
cat > "$pkgdir/DEBIAN/prerm" <<'EOF'
|
|
#!/bin/sh
|
|
set -e
|
|
if [ "$1" = remove ] || [ "$1" = purge ]; then
|
|
rm -f /etc/modprobe.d/blacklist-rtlsdr.conf
|
|
fi
|
|
exit 0
|
|
EOF
|
|
chmod 755 "$pkgdir/DEBIAN/prerm"
|
|
|
|
out=${1:-$here/dist}
|
|
mkdir -p "$out"
|
|
fakeroot dpkg-deb --build "$pkgdir" "$out" >/dev/null
|
|
echo "$out/bandsaunter_${version}-${revision}_${arch}.deb"
|