#!/usr/bin/env bash
# raw4.sh — robust APRS-IS raw logger (big firehose by default)
set -euo pipefail

### ---- YOU CAN TWEAK THESE ----
PASSCODE="27799"                 # <-- your APRS-IS 5-digit passcode
CALL="W1HD-9"                    # login callsign-SSID
# Start LOUD so you see data immediately (2,500 km circle over US midpoint).
FILTER='r/40.0/-95.0/2500'
# Later, narrow to your buddy:
# FILTER='b/W1HD-9 p/W1HD g/W1HD-9'
SERVER="noam.aprs2.net"         # North America rotate
PORT=14580
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 netcat-openbsd coreutils

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

echo "==> Writing environment file…"
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
# Let the service user read it (also handy for manual tests)
chown direwolf:direwolf "$ENV_FILE"
chmod 600 "$ENV_FILE"

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

echo "==> Installing raw-logger launcher…"
tee "$LAUNCHER" >/dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

# Load env both ways: systemd passes vars; sourcing helps for manual runs.
if [ -r /etc/default/aprsis-w1hd9-raw ]; then
  # shellcheck source=/etc/default/aprsis-w1hd9-raw
  source /etc/default/aprsis-w1hd9-raw
fi

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"

# Loop forever: login, set filter, keep STDIN open so server streams results.
while true; do
  {
    printf 'user %s pass %s vers rawlogger 1.0\n' "$APRS_USER" "$APRS_PASS"
    sleep 1
    printf 'filter %s\n' "$APRS_FILTER"
    # keep our input open forever; nc -w 0 will not close the socket on EOF
    tail -f /dev/null
  } | nc -w 0 "$APRS_SERVER" "$APRS_PORT" \
    | 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 (firehose)
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
# Hardening (optional but nice)
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=true

[Install]
WantedBy=multi-user.target
EOF

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

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

echo "==> Adding logrotate (keeps 14 days)…"
tee /etc/logrotate.d/aprsis-w1hd9-raw >/dev/null <<EOF
$LOG_FILE {
  daily
  rotate 14
  missingok
  compress
  delaycompress
  notifempty
  create 0640 direwolf direwolf
}
EOF

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