# 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 - DNSSEC signing per zone (docs/dnssec.md): `jarl zone dnssec enable|status|check-ds|disable|wipe` and the zone page's DNSSEC tab, or the zone's new `dnssec_policy` field in the API. named signs the zone with BIND's `default` policy (one ECDSA P-256 key that is never replaced) or a custom one, using inline signing, with keys in a per-view directory under `/var/lib/bind/jarl/dnssec-keys`. Jarl shows the keys and the DS record to give the registrar, says when it's safe to publish it, and checks the parent's DS records (`check-ds`, which also tells named with `rndc dnssec -checkds`). It refuses steps that would break a signed domain: switching straight to unsigned (it goes through BIND's `insecure` policy instead, and finishes only once named is done), deleting a signed zone or moving it to another view, and TTLs above the policy's `max-zone-ttl`. `wipe` starts over with a clean slate once the parent has no DS. Each step in the web UI opens a dialog that says what it needs first. `jarl zone delegation` now also compares the parent's DS records with the zone's keys. - Porkbun support (optional, docs/dnssec.md#porkbun): with an API key in the new `porkbun:` section of jarl.yaml (and nowhere else), `jarl zone registrar status|sync-glue|set-ns|publish-ds|remove-ds` and the zone page's Registrar tab show and change the domain's name servers, glue records (one per name server inside the domain, with all its IPv4 and IPv6 addresses) and DS records at Porkbun. Every change first checks that it won't take the domain offline (the name servers answer for the zone, glue matches, a DS goes out only once the domain is delegated to servers that serve the signed zone, DS records match the zone's keys before the name servers change); `--dry-run` shows the checks and `--force` skips them. Administrators only. - Backups include the DNSSEC keys (private keys too), stored inside the backup file, and `jarld restore` puts them back for named (`bind.named_user`, default `bind`). `jarl-backup.service` has `CAP_DAC_READ_SEARCH` to read them; `--without-keys` skips them. - Jarl raises a zone's serial above the one named has loaded whenever it writes a zone file whose serial isn't higher (after restoring an older database, say), so named loads it (it refuses otherwise for a signed zone) and secondaries pick it up. - Daily database backups: the `jarl-backup.timer` systemd timer (turned on by the Debian package) runs `jarld backup`, which writes `jarl-.db` into `backup.dir` (`/var/backups/jarl`), checks it with SQLite's integrity check before giving it that name, and deletes backups older than `backup.retention` (30d) while always keeping the newest `backup.keep_at_least` (7). Ages come from the names, and only files named like backups are ever deleted. Settings are in the new `backup:` section of jarl.yaml; the schedule is the timer's. The dashboard and `jarl status` show the newest backup, and warn when it is older than `backup.warn_after` (2d) or the last attempt failed. `backup.stats` also backs up the statistics database. - `jarld restore [FILE | latest]`: lists backups, or checks one, shows what it holds next to the current database, and after confirmation replaces the database with it, keeping the current one as `jarl.db.before-restore-