Files
jarl/CHANGELOG.md
T
abrown38andClaude Opus 5.5 bf7f99874b Web UI: zone naming and reverse zones, ACL suggestions, record form
- New zone dialog: choose Domain or Reverse zone. Reverse zones are
  created from a network and their name is generated; both kinds show the
  exact zone name and flag likely mistakes (addresses or URLs as names,
  host-like names, duplicates in the view, parent/child zones, networks
  off the octet/nibble boundaries) before anything is submitted.
- Record form: clears every field but the type after an add; shows the
  record exactly as it will be stored and warns about unqualified names.
  In reverse zones it takes an address, defaults to PTR, suggests host
  names of A/AAAA records with that address and warns about a second PTR;
  the record list shows addresses.
- Address match lists (options, view match lists, ACL elements) offer the
  existing ACLs, TSIG keys and built-ins as one-click suggestions and
  flag unknown names.
- Server: in reverse zones a record can be named by its address, and a
  PTR target like nas.example.com without the final dot is read as the
  full host name (a bare label is refused). Warnings noticed while parsing
  record data reach the result again.
- Fixes: brand link hover underline, the dashboard's "New zone" link
  opening the dialog twice.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 20:49:43 +00:00

161 lines
9.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Changelog
All notable changes to Jarl are documented here. The format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and versions follow
[Semantic Versioning](https://semver.org/).
## [Unreleased]
The first version, to be released as 0.1.0.
### Added
- Web UI: wherever an address match list is entered (server, view and zone
options such as allow-query or allow-transfer, view match lists, ACL
elements) the existing ACLs, TSIG keys and built-in names are offered as
one-click suggestions, and names that don't exist are flagged as you type.
- **Query statistics** (off by default; `stats` in jarl.yaml, docs/stats.md).
When enabled, Jarl adds a loopback statistics channel and a response log to
named's configuration (merged into existing `logging` and
`statistics-channels` statements) and switches response logging with
`rndc responselog`. jarld aggregates named's counters and the log into a
separate SQLite database: per-minute, hourly and daily counters (queries,
result codes, record types, views, zones, cache hits, upstream latency,
DNSSEC) and hourly and daily top lists (names, clients, NXDOMAIN and
SERVFAIL names, refused clients), each with its own retention. Clients can
be anonymized or excluded. It is shown on a new Statistics page in the web
UI (KPI tiles, queries and failed answers over time, a weekday x hour
heatmap, top lists and breakdowns, each chart with a table view), in
`jarl stats status|summary|top|timeline|heatmap|breakdown`, and in the API
under `/api/v1/stats/`, behind the new `stats` permission. Works with the
bind9 packages of Debian 13 and Ubuntu 26.04.
- At startup jarld brings named's configuration up to date with jarl.yaml
settings that affect it (such as statistics), through the usual checked
pipeline. Files changed by hand are never overwritten.
- **jarld daemon**: REST API (`/api/v1`) and embedded web UI, with SQLite as
the source of truth for the whole BIND configuration. Runs under systemd
(`Type=notify`, sandboxed, unprivileged `jarl` user in group `bind`).
SIGHUP and certificate file changes reload TLS.
- **Configuration model**: views (ordered, match-clients/destinations,
recursive-only), ACLs (nested, negation, keys, reference tracking with
rename and delete protection), TSIG keys (kept in a separate `keys.conf`,
never in diffs), zones of every type (primary, secondary, stub,
static-stub, forward, mirror, hint, redirect, in-view), reverse zones
from a CIDR, records of every type, options at server, view, zone and
top-level scope, and defaults for new zones.
- **BIND 9.20 option catalog**: all 353 statements with grammar, allowed
scopes, value kinds, deprecation status and ARM descriptions, used for
validation and by the UI's option editor.
- **Changesets**: immediate one-operation changes by default; staging into
named changesets (`?changeset=`, `X-Jarl-Changeset`, `--changeset`),
batches (`POST /apply`, `jarl apply -f`), dry runs, previews with diffs,
and revert of applied changesets. Optimistic locking with object versions.
- **Apply pipeline**: whole-configuration validation, rendering, `named-checkconf -z`
and `named-checkzone` in a staging directory, atomic install, `rndc reconfig`
and per-zone reload, verification with `rndc zonestatus`, and automatic
rollback when named doesn't load the change. Automatic serials (date,
increment or unixtime policy, RFC 1982), bumped only when DNS data
changes. Drift detection for files changed outside Jarl.
- **Validation**: CNAME/DNAME rules, NS/MX/SRV targets, glue and
delegations, RRset TTL consistency, BIND 9.20 RRset/type limits, SPF/DMARC
sanity, ACL/key references and cycles, option syntax and scope, and
security lints (open resolver, open zone transfers, dynamic updates on
managed zones).
- **Records**: TXT entered as plain text (automatic quoting and 255-byte
splitting), relative and absolute names with detection of doubled
origins, PTR records kept in step with A/AAAA (`ptr`), RRset replace,
delete by match, zone file import (merge or replace).
- **Import and adoption**: `jarld import` reads an existing named.conf tree
and zone files (comments, `$INCLUDE`, `$GENERATE`, legacy
`master`/`slave` spellings); `jarld adopt` switches named to Jarl's
configuration with a backup and automatic fallback.
- **Authentication**: web logins with argon2id passwords, sessions
(HttpOnly, SameSite=Strict) and CSRF tokens, rate limiting per user and
IP; hashed API tokens (`jarl_...`) with optional expiry.
- **Permissions**: granular grants (resource × read/write, filtered by zone,
view, record name pattern and type), roles (`readonly`, `dns-editor`,
`operator`, `acme`), tokens restricted to a subset of their user's
rights, administrators.
- **Audit log** of logins, changes, users, tokens and secret reveals, with
user, token, IP and outcome, searchable and written to the journal.
- **Web UI**: dashboard, zones and records with inline editing and pending
markers, views, ACLs, TSIG keys, the option editor, review and apply,
history with revert, audit log, users, account and tokens, search.
Review mode by default, with an "apply immediately" switch.
- **jarl CLI**: zones, records, views, ACLs, TSIG keys, options, settings,
changesets, batches, history, users, tokens, audit, search, status, check
and resync. Table, JSON and YAML output, and documented exit codes.
- **ACME DNS-01**: `jarl acme set|unset`, certbot hooks
(`jarl acme certbot-auth|certbot-cleanup`), an acme.sh DNS API hook
(`contrib/acme.sh/dns_jarl.sh`), automatic zone and view discovery,
idempotent retries, and `--follow-cname` / `--resolver` for a dedicated
ACME zone.
- **Operations**: `jarld backup` (online), `jarld resync`, `jarld check`,
`jarld render`, local user recovery commands, audit retention.
- **Packaging**: Makefile (build, test, e2e, install, dist), systemd unit,
sysusers.d and tmpfiles.d files, example configuration
(`jarld config --example`).
- **Tests**: unit tests for every package, integration tests against the
real named 9.20 (checkers, reload and rollback, import and adopt), and an
end-to-end script (`scripts/e2e.sh`) that drives every CLI command
against a running named.
- **Documentation**: concepts, install and adoption, configuration, CLI,
API, permissions, ACME, validation, operations and development guides, and
a split-DNS guide for adding views to a server that has none.
### Changed
- Web UI, new zone dialog: choose **Domain** or **Reverse zone**. For a
reverse zone you give the network (10.10.0.0/24, 2001:db8:1::/48) and the
zone name is generated. Either way the dialog shows the exact zone name it
will create and explains problems before submitting: an address or URL
instead of a name, a host-like name such as www.example.com, a zone that
already exists in the view, a child or parent of an existing zone, and
networks that don't follow the octet or nibble boundaries.
- Web UI, record form: after adding a record every field is cleared except
the type, and the cursor returns to the name. A "Will add:" line shows the
record exactly as it will be stored, with warnings for unqualified names
(e.g. a CNAME to readthedocs.io without the final dot). In reverse zones
the form asks for the address, defaults to PTR, offers the host names of
A/AAAA records with that address, warns about a second PTR for an
address, and the record list shows each record's address.
- Reverse zones: a record name can be given as an address (10.10.0.20) in
the API and CLI too, and a PTR target without a final dot that contains a
dot (nas.adbraun.lol) is read as the full host name (with a warning); a
bare label is refused.
- `jarl resync` / `jarld resync` refuse to overwrite files that were changed
outside Jarl unless `--force` is given, as documented. Before, they always
overwrote them.
### Fixed
- Web UI: the "Jarl 0.1.0" brand link no longer underlines the gap between
the name and the version on hover.
- Web UI: creating a zone from the dashboard's "New zone" link no longer
opens the dialog a second time.
- Warnings noticed while parsing record data (a name read as absolute) were
lost before reaching the result; they are shown again.
- The negative-caching warning now uses the effective negative TTL, which
is the smaller of the SOA minimum and the zone's default TTL (RFC 2308).
It explains the real effect (new names can stay invisible to resolvers
that already asked) and gives the command that fixes it. Before, it
fired on the SOA minimum alone and wrongly blamed BIND's resolver cap.
- Problems printed by `jarld check` show zone names without the trailing dot.
- `jarl` now shows the warnings a change introduces when it is applied or
staged, not only on dry runs.
- `jarl check` and `jarl resync` no longer print named-checkconf's routine
"loaded serial" lines, only its errors and warnings.
- `jarl zone list` showed only primary zones: `zone create`'s default
`--type primary` leaked into the list filter through a shared variable.
Hint, secondary, forward and other zones are listed again.
- named-checkconf and named-checkzone output is classified by the tools'
exit code. Their warnings (e.g. `both "recursion no;" and "allow-recursion"
active`) were shown as errors. They are now shown as warnings in the
CLI, `jarld check` and the web UI.
- The `zone_outside_view` error says how to fix it (`--adopt-zones`).
- The end-to-end test starts named with `-f` like the Debian unit; with `-g`,
named sends all logging to stderr.