Skip to content

Latest commit

 

History

History
246 lines (168 loc) · 5.7 KB

File metadata and controls

246 lines (168 loc) · 5.7 KB

Installing GeuReflector as a replacement for SvxReflector

This guide is for sysops who already have a working SvxReflector installation and want to replace it with GeuReflector. The binary name, config format, and systemd service are all compatible — the transition is a drop-in replacement plus a few config additions.


Prerequisites

  • A working SvxReflector installation (any recent version)
  • Build tools: git, cmake (≥ 3.7), g++ with C++11 support
  • Development libraries:
    # Debian/Ubuntu — required
    sudo apt install build-essential cmake libsigc++-2.0-dev libssl-dev \
                     libjsoncpp-dev libpopt-dev
    
    # Required for MQTT publishing (skip if building with -DWITH_MQTT=OFF)
    sudo apt install libmosquitto-dev
    
    # Required for Redis-backed config store (skip if building with -DWITH_REDIS=OFF)
    sudo apt install libhiredis-dev
    
    # Optional codec support
    sudo apt install libopus-dev libgsm1-dev libspeex-dev

The MQTT and Redis backends are enabled by default. If your deployment doesn't need them, see step 2 below for the opt-out CMake flags — that lets you skip the matching *-dev packages entirely.


1. Get the source

git clone https://github.com/IW1GEU/geureflector.git
cd geureflector

2. Build

cmake -S src -B build -DLOCAL_STATE_DIR=/var
cmake --build build

The compiled binary is at build/bin/svxreflector.

Optional: build without MQTT or Redis

The MQTT publisher and Redis-backed config store are enabled by default. To build without them — for example, on a host where you don't want to install libmosquitto-dev or libhiredis-dev — pass the matching CMake flags:

# build without MQTT support
cmake -S src -B build -DLOCAL_STATE_DIR=/var -DWITH_MQTT=OFF

# build without Redis support
cmake -S src -B build -DLOCAL_STATE_DIR=/var -DWITH_REDIS=OFF

# build without either
cmake -S src -B build -DLOCAL_STATE_DIR=/var -DWITH_MQTT=OFF -DWITH_REDIS=OFF

CMake prints which mode it picked (-- WITH_MQTT=ON: building with libmosquitto support) at configure time.

Behavior with the feature disabled:

  • WITH_MQTT=OFF + [MQTT] section in your conf → reflector logs a warning and continues without publishing. Safe to leave [MQTT] in place.
  • WITH_REDIS=OFF + [REDIS] section in your conf → reflector aborts startup (since Redis-mode auth would not work). Remove the [REDIS] section before starting.

3. Stop the running service

sudo systemctl stop svxreflector

4. Back up the original binary

Find where your current binary lives:

which svxreflector
# typically /usr/bin/svxreflector or /usr/local/bin/svxreflector

Back it up:

sudo cp /usr/bin/svxreflector /usr/bin/svxreflector.orig

5. Install the new binary

sudo cp build/bin/svxreflector /usr/bin/svxreflector

Use the same destination path you found in step 4.


6. Update the configuration

Your existing /etc/svxlink/svxreflector.conf works as-is — GeuReflector is fully backwards compatible. The trunk features are opt-in: if you add nothing, the reflector behaves exactly like the original.

To enable trunking, add two things:

6a. Declare this reflector's TG prefix

In the [GLOBAL] section:

[GLOBAL]
# ... existing settings ...
LOCAL_PREFIX=1        # this reflector owns TGs starting with "1"

A comma-separated list is accepted if this reflector covers multiple prefix groups:

LOCAL_PREFIX=11,12,13

6b. Add a trunk section for each peer

At the end of the config file, add one [TRUNK_x] section per peer reflector:

[TRUNK_1_2]
HOST=reflector-b.example.com
PORT=5302
SECRET=a_strong_shared_secret
REMOTE_PREFIX=2
  • The section name must be identical on both sides. Both sysops must agree on a shared name (e.g. TRUNK_1_2 for the link between prefix 1 and 2).
  • PORT defaults to 5302 if omitted.
  • Both sides must use the same SECRET.
  • REMOTE_PREFIX also accepts a comma-separated list.

6c. Optional: enable the HTTP status endpoint

[GLOBAL]
# ... existing settings ...
HTTP_SRV_PORT=8080

The /status endpoint will include a trunks object showing connection state and active talkers per link.


7. Open the trunk port in the firewall

The trunk uses TCP port 5302 (separate from the client port 5300).

# firewalld
sudo firewall-cmd --permanent --add-port=5302/tcp
sudo firewall-cmd --reload

# ufw
sudo ufw allow 5302/tcp

# iptables
sudo iptables -A INPUT -p tcp --dport 5302 -j ACCEPT

8. Start the service

sudo systemctl start svxreflector
sudo systemctl status svxreflector

9. Verify the trunk is working

Check the logs for the handshake message:

journalctl -u svxreflector -f

A successful trunk connection looks like:

TRUNK_1_2: Connected to reflector-b.example.com:5302
TRUNK_1_2: Trunk hello from peer 'TRUNK_1_2' local_prefix=2 priority=3847291042

If HTTP_SRV_PORT is set, query the status endpoint:

curl -s http://localhost:8080/status | python3 -m json.tool

The trunks object will show "connected": true for each active link.


Rolling back

If anything goes wrong, restore the original binary and restart:

sudo systemctl stop svxreflector
sudo cp /usr/bin/svxreflector.orig /usr/bin/svxreflector
sudo systemctl start svxreflector

No config changes are needed to roll back — the original binary simply ignores the LOCAL_PREFIX and [TRUNK_x] entries.


Further reading