We log into APRS-IS with an empty filter, so the regional filter the code documents never applies #53

Open
opened 2026-11-03 18:52:29 +00:00 by skippy-bot · 0 comments

Problem

The connect path asks for a default filter of r/33/-96/100, but the config always defines the key, as nil when APRS_FILTER is unset, and Application.get_env/3 returns a stored nil rather than the default. The login frame therefore goes out as filter with no terms, and the deployment on port 10152 gets the unfiltered stream the producer buffer and three consumers were not sized for.

Evidence

At 2f150f66:

  • config/config.exs:74 and config/runtime.exs:280 both set aprs_is_default_filter: System.get_env("APRS_FILTER") with no fallback, so the key exists with a nil value when the env var is unset.
  • lib/aprsme/is/is.ex:96 is Application.get_env(:aprsme, :aprs_is_default_filter, "r/33/-96/100"), whose default can never be reached for a stored nil.
  • lib/aprsme/is/is.ex:242 interpolates filter #{filter} into the login string, which renders as an empty term for nil.
  • lib/aprsme/is/is.ex:244 logs Sending login string: ... filter on every connect, so the running app reports the empty filter today.
  • k8s/deployment.yaml:181 onward sets APRS_CALLSIGN, APRS_PORT 10152 and APRS_HOST and never sets APRS_FILTER.

Expected

With APRS_FILTER unset the connection logs in with the documented regional filter, and Aprsme.Is.get_status/0 reports the filter in use instead of nil.

How to verify

elixir -e 'Application.put_env(:demo, :f, nil); IO.inspect(Application.get_env(:demo, :f, "fallback"))' prints nil. Then start Aprsme.Is against the mock server in test/support/aprs_is_mock.ex with APRS_FILTER unset and assert the login frame carries filter r/33/-96/100.

Acceptance criteria

  • An unset APRS_FILTER falls back to a real filter, not an empty term.
  • The status payload reports the filter actually sent.
  • A test asserts the login frame contents for the unset case.
  • The deployment either sets APRS_FILTER or relies on the documented default, and one of them is written down.

Effort: S
Lens: reliability

## Problem The connect path asks for a default filter of `r/33/-96/100`, but the config always defines the key, as nil when `APRS_FILTER` is unset, and `Application.get_env/3` returns a stored nil rather than the default. The login frame therefore goes out as `filter ` with no terms, and the deployment on port 10152 gets the unfiltered stream the producer buffer and three consumers were not sized for. ## Evidence At `2f150f66`: - `config/config.exs:74` and `config/runtime.exs:280` both set `aprs_is_default_filter: System.get_env("APRS_FILTER")` with no fallback, so the key exists with a nil value when the env var is unset. - `lib/aprsme/is/is.ex:96` is `Application.get_env(:aprsme, :aprs_is_default_filter, "r/33/-96/100")`, whose default can never be reached for a stored nil. - `lib/aprsme/is/is.ex:242` interpolates `filter #{filter}` into the login string, which renders as an empty term for nil. - `lib/aprsme/is/is.ex:244` logs `Sending login string: ... filter ` on every connect, so the running app reports the empty filter today. - `k8s/deployment.yaml:181` onward sets `APRS_CALLSIGN`, `APRS_PORT` 10152 and `APRS_HOST` and never sets `APRS_FILTER`. ## Expected With `APRS_FILTER` unset the connection logs in with the documented regional filter, and `Aprsme.Is.get_status/0` reports the filter in use instead of nil. ## How to verify `elixir -e 'Application.put_env(:demo, :f, nil); IO.inspect(Application.get_env(:demo, :f, "fallback"))'` prints nil. Then start `Aprsme.Is` against the mock server in `test/support/aprs_is_mock.ex` with `APRS_FILTER` unset and assert the login frame carries `filter r/33/-96/100`. ## Acceptance criteria - [ ] An unset `APRS_FILTER` falls back to a real filter, not an empty term. - [ ] The status payload reports the filter actually sent. - [ ] A test asserts the login frame contents for the unset case. - [ ] The deployment either sets `APRS_FILTER` or relies on the documented default, and one of them is written down. **Effort:** S **Lens:** reliability
Sign in to join this conversation.
No description provided.