#!/usr/bin/env bash
# raw5.sh — APRS-IS raw logger using socat, one-line login+filter, big rectangle (positions only)
set -euo pipefail

# ---- tweakables ----
PASSCODE="27799"                 # your APRS-IS passcode
CALL="W1HD-9"
SERVER="noam.aprs2.net"
PORT=14580
# Loud, unambiguous filter: rectangle over CONUS + positions only
# Syntax: a/<latN>/<lonW>/<latS>/<lonE>  (west/east longitudes are negative in US)
FILTER='a/49/-125/25/-66 t/p'

LOG_DIR="/var/log/direwolf"
LOG_FILE="$LOG_DIR/w1hd9-aprsis.raw"
ENV_FILE="/etc/default/aprsis-w1hd9-raw"
SERVICE="/etc/systemd/system/aprsis-w1hd9-raw.service"
LAUNCHER="/usr/local/bin/aprsis-w1hd9-raw.sh"

echo "==> Installing deps…"
apt-get update -y
apt-get install -y socat coreutils

echo "==> Ensuring 'direwolf' user…"
if ! id -u direwolf >/dev/null 2>&1; then
  adduser --system --group --home /var/lib/direwolf direwolf
fi

echo "==> Writing env…"
tee "$ENV_FILE" >/dev/null <<EOF
APRS_USER=$CALL
APRS_PASS=$PASSCODE
APRS_FILTER="$FILTER"
APRS_SERVER=$SERVER
APRS_PORT=$PORT
LOG_FILE=$LOG_FILE
EOF
chown direwolf:direwolf "$ENV_FILE"
chmod 600 "$ENV_FILE"

echo "==> Preparing logs…"
mkdir -p "$LOG_DIR"
touch "$LOG_FILE"
chown -R direwolf:direwolf "$LOG_DIR"
chmod 0640 "$LOG_FILE"

echo "==> Installing launcher (socat, CRLF, one-line login+filter)…"
tee "$LAUNCHER" >/dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
[ -r /etc/default/aprsis-w1hd9-raw ] && source /etc/default/aprsis-w1hd9-raw

mkdir -p "$(dirname "$LOG_FILE")"
[ -f "$LOG_FILE" ] || touch "$LOG_FILE"
chmod 0640 "$LOG_FILE"

printf "# %s starting raw logger for %s on %s:%s with filter [%s]\n" \
  "$(date -Is)" "$APRS_USER" "$APRS_SERVER" "$APRS_PORT" "$APRS_FILTER" >>"$LOG_FILE"

# We’ll send login+filter on one line (aprsc supports this), then re-assert filter on a 2nd line.
# socat's ,crlf ensures proper CRLF endings. Sleep keeps stdin open forever.
while true; do
  {
    printf 'user %s pass %s vers rawlogger 1.0 filter %s\n' "$APRS_USER" "$APRS_PASS" "$APRS_FILTER"
    sleep 1
    printf 'filter %s\n' "$APRS_FILTER"
    # keep input open forever
    sleep infinity
  } | tee -a "${LOG_FILE}.sent" \
    | socat - TCP:${APRS_SERVER}:${APRS_PORT},crlf \
    | stdbuf -oL tee -a "$LOG_FILE"
  echo "# $(date -Is) disconnected, retrying…" >>"$LOG_FILE"
  sleep 2
done
EOF
chmod +x "$LAUNCHER"

echo "==> Creating systemd service…"
tee "$SERVICE" >/dev/null <<'EOF'
[Unit]
Description=APRS-IS raw logger for W1HD-9 (socat)
After=network-online.target
Wants=network-online.target

[Service]
User=direwolf
Group=direwolf
EnvironmentFile=/etc/default/aprsis-w1hd9-raw
ExecStart=/usr/local/bin/aprsis-w1hd9-raw.sh
Restart=always
RestartSec=3
NoNewPrivileges=true
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

echo "==> Enabling + starting…"
systemctl daemon-reload
systemctl enable --now aprsis-w1hd9-raw

echo "==> Status:"
systemctl --no-pager -l status aprsis-w1hd9-raw || true

echo
echo "---- LIVE VIEW (Ctrl-C to exit) ----"
tail -F "$LOG_FILE"
