feat: per-suffix conditional forwarding rules (#82) #84

Merged
razvandimescu merged 4 commits from feat/config-forwarding-rules into main 2026-04-12 11:12:08 +08:00

4 Commits

Author SHA1 Message Date
Razvan Dimescu
8d70d0df8a refactor: drop config_count from merge_forwarding_rules return
Log config rules directly from config.forwarding before merging,
keeping the merge API clean of logging concerns.
2026-04-12 05:34:55 +03:00
Razvan Dimescu
5043d4612e style: rustfmt 2026-04-12 05:29:59 +03:00
Razvan Dimescu
a757b98744 feat: accept suffix as string or array in [[forwarding]] rules
Reuses existing string_or_vec deserializer so users can write:
  suffix = ["168.192.in-addr.arpa", "onsite"]
instead of repeating [[forwarding]] blocks per suffix.
2026-04-12 05:29:49 +03:00
Razvan Dimescu
f264cea5b4 feat: per-suffix conditional forwarding rules in numa.toml (#82)
Adds a `[[forwarding]]` config section so users can explicitly route
domain suffixes to specific upstreams. Config-declared rules take
precedence over auto-discovered rules (macOS scutil, Linux search
domains) via first-match semantics.

Example — the reporter's reverse-DNS case:

  [[forwarding]]
  suffix = "168.192.in-addr.arpa"
  upstream = "100.90.1.63:5361"

Bare IPs default to port 53. IPv6 is supported via
parse_upstream_addr. ForwardingRule::new() constructor replaces
direct struct-literal construction, and make_rule() now delegates
to parse_upstream_addr to fix a latent IPv6 parsing bug.
2026-04-12 03:03:56 +03:00