feat: report a dpkg left halfway and when the host's own automatic updates last succeeded #25

Merged
christianmanivong merged 1 commits from feat/dpkg-interrupted into main 2026-10-08 14:12:35 +00:00
Owner

Part of NetOrk/netork#738.

An unattended upgrade cut off while it built an initrd left a kernel package half-configured on an Ubuntu host. For three months apt refused every upgrade, while apt.systemd.daily exited quietly and the timers reported success.

HOST_STATUS_COMMAND now also reads, without root:

  • dpkg's state, the way apt checks it: numbered files left in /var/lib/dpkg/updates, or a package half-installed, unpacked, half-configured, waiting for triggers or flagged for reinstallation (dpkg-query -W -f='${db:Status-Abbrev} ${Package}', filtered on the host). While dpkg, apt, aptitude or unattended-upgrade runs, packages are halfway on purpose, so the answer is then None.
  • When the host's own automatic updates last succeeded: /var/lib/apt/periodic/upgrade-stamp, which apt.systemd.daily touches only after unattended-upgrade succeeded, and the interval of APT::Periodic::Unattended-Upgrade in apt's units (s, m, h, d; a bare number is days; always is 0). update-success-stamp is not read: every apt-get update touches it, whoever runs it.

HostStatusDict gains package_manager_interrupted, interrupted_packages ([{name, state}]), auto_updates_last_success (Unix time) and auto_updates_interval (seconds), all NotRequired. Version 4.3.0.

Tests

  • tests/test_host_status.py: the aris fixture (iF linux-image-6.8.0-134-generic), every halfway state, the journal alone, tmp.i ignored, a running package manager, no dpkg; the stamp and every interval unit.
  • The whole suite: 481 passed; mypy strict clean.
  • napalm-linux, napalm-proxmox, napalm-bsd, napalm-openmediavault and napalm-opnsense pass against this branch.
  • The command run on an Ubuntu host parses cleanly (interrupted: False).
Part of NetOrk/netork#738. An unattended upgrade cut off while it built an initrd left a kernel package half-configured on an Ubuntu host. For three months apt refused every upgrade, while `apt.systemd.daily` exited quietly and the timers reported success. `HOST_STATUS_COMMAND` now also reads, without root: - **dpkg's state, the way apt checks it:** numbered files left in `/var/lib/dpkg/updates`, or a package half-installed, unpacked, half-configured, waiting for triggers or flagged for reinstallation (`dpkg-query -W -f='${db:Status-Abbrev} ${Package}'`, filtered on the host). While dpkg, apt, aptitude or unattended-upgrade runs, packages are halfway on purpose, so the answer is then `None`. - **When the host's own automatic updates last succeeded:** `/var/lib/apt/periodic/upgrade-stamp`, which `apt.systemd.daily` touches only after unattended-upgrade succeeded, and the interval of `APT::Periodic::Unattended-Upgrade` in apt's units (s, m, h, d; a bare number is days; `always` is 0). `update-success-stamp` is not read: every `apt-get update` touches it, whoever runs it. `HostStatusDict` gains `package_manager_interrupted`, `interrupted_packages` (`[{name, state}]`), `auto_updates_last_success` (Unix time) and `auto_updates_interval` (seconds), all `NotRequired`. Version 4.3.0. ## Tests - `tests/test_host_status.py`: the aris fixture (`iF linux-image-6.8.0-134-generic`), every halfway state, the journal alone, `tmp.i` ignored, a running package manager, no dpkg; the stamp and every interval unit. - The whole suite: 481 passed; mypy strict clean. - napalm-linux, napalm-proxmox, napalm-bsd, napalm-openmediavault and napalm-opnsense pass against this branch. - The command run on an Ubuntu host parses cleanly (`interrupted: False`).
christianmanivong added 1 commit 2026-10-08 14:08:09 +00:00
feat: report a dpkg left halfway and when the host's own automatic updates last succeeded
CI / test (3.10) (push) Successful in 1m59s
CI / test (3.11) (push) Successful in 30s
CI / test (3.12) (push) Successful in 34s
CI / test (3.10) (pull_request) Successful in 39s
CI / test (3.11) (pull_request) Successful in 23s
CI / test (3.12) (pull_request) Successful in 27s
7b44f689bc
An unattended upgrade cut off while it built an initrd left a kernel package
half-configured on an Ubuntu host. For three months apt refused every upgrade,
while apt.systemd.daily exited quietly and the timers reported success
(NetOrk/netork#738).

HOST_STATUS_COMMAND now also reads, without root:

- dpkg's state the way apt checks it: numbered files left in
  /var/lib/dpkg/updates, or a package half-installed, unpacked,
  half-configured, waiting for triggers or flagged for reinstallation.
  While dpkg, apt, aptitude or unattended-upgrade runs, packages are
  halfway on purpose, so the answer is then None.
- /var/lib/apt/periodic/upgrade-stamp, which apt.systemd.daily touches only
  after unattended-upgrade succeeded, and the interval of
  APT::Periodic::Unattended-Upgrade in apt's units. update-success-stamp is
  not read: every apt-get update touches it, whoever runs it.

HostStatusDict gains package_manager_interrupted, interrupted_packages,
auto_updates_last_success and auto_updates_interval, all NotRequired.
christianmanivong merged commit 72679ff4f8 into main 2026-10-08 14:12:35 +00:00
christianmanivong deleted branch feat/dpkg-interrupted 2026-10-08 14:12:35 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: NAPALM/napalm-device-types#25