Repository navigation
feat: list pending package updates on the system page - #2427
Merged
Merged
Conversation
Keep the per-package results of the background package manager check and return them through a new GetPackageUpdates action, exposed by the hub as GET /api/beszel/package-updates. The handler only returns the cached result of the last check, so the request never runs a package manager command or refreshes repository metadata. Each package has its name, installed version, available version and, where the package manager reports it, a security flag: - apt: versions and security repo from `apt-get -s dist-upgrade` - dnf: installed versions from `rpm -q` for the listed packages, security flags from `check-update --security` matched by name.arch - zypper: versions from `list-updates`; security stays a count because patches are not mapped to packages - pacman: versions from checkupdates - apk: versions from `apk -u list` Move the PACKAGE_UPDATES_INTERVAL parsing into its own function, log the effective value like SMART_INTERVAL does, and cover it with tests.
Show the package list on the system page when the agent reports pending updates. The table refetches only when the update counts change, and classifies each update as major, minor, patch or revision from the installed and available versions. Epoch changes, calendar versions, pre-release suffixes and anything else that can't be compared safely fall back to "other".
henrygd
approved these changes
Sep 27, 2026
henrygd
left a comment
Owner
There was a problem hiding this comment.
Looks good! There are only a few small changes I would make, which I can do after merge. Thanks very much!
ivanch
added a commit
to ivanch/haven
that referenced
this pull request
Oct 4, 2026
This PR contains the following updates: | Package | Update | Change | |---|---|---| | [henrygd/beszel-agent](https://github.com/henrygd/beszel) | minor | `0.20.0` → `0.21.0` | --- ### Release Notes <details> <summary>henrygd/beszel (henrygd/beszel-agent)</summary> ### [`v0.21.0`](https://github.com/henrygd/beszel/releases/tag/v0.21.0) [Compare Source](henrygd/beszel@v0.20.0...v0.21.0) #### What's Changed - Add pending package updates list to the system page ([#​2357](henrygd/beszel#2357), [#​2427](henrygd/beszel#2427)) - Add Wi-Fi signal strength monitoring ([#​2367](henrygd/beszel#2367)) - Add TLS certificate expiry check to HTTPS network monitors ([#​2401](henrygd/beszel#2401)) - Add systemd service logs to service details ([#​2440](henrygd/beszel#2440)) - Add option to set the DNS server queried by DNS monitors ([#​2389](henrygd/beszel#2389)) - Add network monitor comparison across systems and within the same system ([#​2442](henrygd/beszel#2442), [#​2477](henrygd/beszel#2477)) - Add `SYNC_SYSTEM_NAMES` environment variable to sync system names with hostnames ([#​1917](henrygd/beszel#1917)) - Add `DISABLE_SSH` option to the hub to skip SSH fallback ([#​2469](henrygd/beszel#2469)) - Add environment variable to disable container image update checks ([#​2371](henrygd/beszel#2371)) - Add MB/s and GB/s unit selection to bandwidth alerts - Add log timestamp toggle ([#​2471](henrygd/beszel#2471)) - Add view settings to the network monitors table ([#​2396](henrygd/beszel#2396)) - Add Twemoji Country Flags font so flags always render ([#​2363](henrygd/beszel#2363)) - Change active alerts grid to a banner and sheet ([#​2445](henrygd/beszel#2445)) - Change network packet loss to a red line ([#​2377](henrygd/beszel#2377)) - Improve Intel GPU monitoring by parsing `intel_gpu_top` JSON output ([#​2387](henrygd/beszel#2387)) - Improve LXC guest CPU usage reporting using cgroup accounting ([#​2341](henrygd/beszel#2341)) - Improve WebSocket and SSH fallback handling ([#​2441](henrygd/beszel#2441)) - Fix LVM volumes not mapping to disk I/O by resolving device symlinks ([#​2486](henrygd/beszel#2486)) - Fix ZFS pool I/O stats to include snapshot reads ([#​2474](henrygd/beszel#2474)) - Fix inaccurate disk I/O on the first sample of an interval ([#​2420](henrygd/beszel#2420)) - Fix Windows volume names being altered when matching I/O devices ([#​2419](henrygd/beszel#2419)) - Fix 32-bit wrap of disk I/O time counters ([#​2407](henrygd/beszel#2407)) - Fix partial NVMe SMART data handling ([#​2340](henrygd/beszel#2340)) - Fix NVMe power-cycle SMART fields overflowing ([#​2484](henrygd/beszel#2484)) - Fix `nvethernet` network counters ([#​2090](henrygd/beszel#2090)) - Fix agent not reconnecting after an async WebSocket handshake failure ([#​2329](henrygd/beszel#2329), [#​2326](henrygd/beszel#2326)) - Fix WebSocket reconnect loops on slow agent collections ([#​2294](henrygd/beszel#2294)) - Fix `SKIP_GPU` not excluding GPU hwmon temperatures and fans ([#​2313](henrygd/beszel#2313)) - Fix Docker image update check across all image repository digests ([#​2393](henrygd/beszel#2393)) - Fix status alerts being lost during pending recovery ([#​2375](henrygd/beszel#2375)) - Fix hub requiring system access for alert subscriptions and delivery ([#​2455](henrygd/beszel#2455)) - Fix hub not honoring SSH request cancellation ([#​2450](henrygd/beszel#2450)) - Fix hub not restarting `beszel-hub.service` after update ([#​2410](henrygd/beszel#2410)) - Fix IP targets being accepted for DNS monitors ([#​2483](henrygd/beszel#2483)) - Fix short monitor IDs failing schema validation ([#​2454](henrygd/beszel#2454)) - Fix network monitor charts to show gaps for failed probes and disconnects ([#​2428](henrygd/beszel#2428)) - Fix duplicate y-axis labels on network monitor response charts ([#​2426](henrygd/beszel#2426)) - Fix translations not refreshing on locale change ([#​2405](henrygd/beszel#2405)) - Fix scrollbar layout shifts ([#​2406](henrygd/beszel#2406)) - Fix hub returning 200 for unknown frontend routes ([#​2414](henrygd/beszel#2414)) - Fix proxy caching of systemd details ([#​2456](henrygd/beszel#2456)) - Fix agent not exiting with code 0 when run without a key on Windows ([#​2376](henrygd/beszel#2376), [#​2247](henrygd/beszel#2247)) - Fix OpenWrt user account handling in the install script ([#​2370](henrygd/beszel#2370)) - Update Go dependencies #### New Contributors - [@​adrienboulle](https://github.com/adrienboulle) made their first contribution in [#​2397](henrygd/beszel#2397) - [@​Mario-Mohar](https://github.com/Mario-Mohar) made their first contribution in [#​2410](henrygd/beszel#2410) - [@​LudwigJMarx](https://github.com/LudwigJMarx) made their first contribution in [#​2407](henrygd/beszel#2407) - [@​anandghegde](https://github.com/anandghegde) made their first contribution in [#​2357](henrygd/beszel#2357) - [@​Yi-111-a](https://github.com/Yi-111-a) made their first contribution in [#​2419](henrygd/beszel#2419) - [@​lukyjay](https://github.com/lukyjay) made their first contribution in [#​2387](henrygd/beszel#2387) - [@​user01010111](https://github.com/user01010111) made their first contribution in [#​2461](henrygd/beszel#2461) - [@​Juankers](https://github.com/Juankers) made their first contribution in [#​2470](henrygd/beszel#2470) - [@​Bartuzen](https://github.com/Bartuzen) made their first contribution in [#​2484](henrygd/beszel#2484) - [@​jeroendewilde](https://github.com/jeroendewilde) made their first contribution in [#​2471](henrygd/beszel#2471) **Full Changelog**: <henrygd/beszel@v0.20.0...v0.21.0> </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMTUuMTIiLCJ1cGRhdGVkSW5WZXIiOiI0NC4xMTUuMTIiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbXX0=--> --------- Co-authored-by: Renovate Bot <[email protected]> Reviewed-on: https://git.ivanch.me/ivanch/haven/pulls/21
ivanch
added a commit
to ivanch/haven
that referenced
this pull request
Oct 4, 2026
This PR contains the following updates: | Package | Update | Change | |---|---|---| | [ghcr.io/henrygd/beszel/beszel](https://github.com/henrygd/beszel) | minor | `0.20.0` → `0.21.0` | --- ### Release Notes <details> <summary>henrygd/beszel (ghcr.io/henrygd/beszel/beszel)</summary> ### [`v0.21.0`](https://github.com/henrygd/beszel/releases/tag/v0.21.0) [Compare Source](henrygd/beszel@v0.20.0...v0.21.0) #### What's Changed - Add pending package updates list to the system page ([#​2357](henrygd/beszel#2357), [#​2427](henrygd/beszel#2427)) - Add Wi-Fi signal strength monitoring ([#​2367](henrygd/beszel#2367)) - Add TLS certificate expiry check to HTTPS network monitors ([#​2401](henrygd/beszel#2401)) - Add systemd service logs to service details ([#​2440](henrygd/beszel#2440)) - Add option to set the DNS server queried by DNS monitors ([#​2389](henrygd/beszel#2389)) - Add network monitor comparison across systems and within the same system ([#​2442](henrygd/beszel#2442), [#​2477](henrygd/beszel#2477)) - Add `SYNC_SYSTEM_NAMES` environment variable to sync system names with hostnames ([#​1917](henrygd/beszel#1917)) - Add `DISABLE_SSH` option to the hub to skip SSH fallback ([#​2469](henrygd/beszel#2469)) - Add environment variable to disable container image update checks ([#​2371](henrygd/beszel#2371)) - Add MB/s and GB/s unit selection to bandwidth alerts - Add log timestamp toggle ([#​2471](henrygd/beszel#2471)) - Add view settings to the network monitors table ([#​2396](henrygd/beszel#2396)) - Add Twemoji Country Flags font so flags always render ([#​2363](henrygd/beszel#2363)) - Change active alerts grid to a banner and sheet ([#​2445](henrygd/beszel#2445)) - Change network packet loss to a red line ([#​2377](henrygd/beszel#2377)) - Improve Intel GPU monitoring by parsing `intel_gpu_top` JSON output ([#​2387](henrygd/beszel#2387)) - Improve LXC guest CPU usage reporting using cgroup accounting ([#​2341](henrygd/beszel#2341)) - Improve WebSocket and SSH fallback handling ([#​2441](henrygd/beszel#2441)) - Fix LVM volumes not mapping to disk I/O by resolving device symlinks ([#​2486](henrygd/beszel#2486)) - Fix ZFS pool I/O stats to include snapshot reads ([#​2474](henrygd/beszel#2474)) - Fix inaccurate disk I/O on the first sample of an interval ([#​2420](henrygd/beszel#2420)) - Fix Windows volume names being altered when matching I/O devices ([#​2419](henrygd/beszel#2419)) - Fix 32-bit wrap of disk I/O time counters ([#​2407](henrygd/beszel#2407)) - Fix partial NVMe SMART data handling ([#​2340](henrygd/beszel#2340)) - Fix NVMe power-cycle SMART fields overflowing ([#​2484](henrygd/beszel#2484)) - Fix `nvethernet` network counters ([#​2090](henrygd/beszel#2090)) - Fix agent not reconnecting after an async WebSocket handshake failure ([#​2329](henrygd/beszel#2329), [#​2326](henrygd/beszel#2326)) - Fix WebSocket reconnect loops on slow agent collections ([#​2294](henrygd/beszel#2294)) - Fix `SKIP_GPU` not excluding GPU hwmon temperatures and fans ([#​2313](henrygd/beszel#2313)) - Fix Docker image update check across all image repository digests ([#​2393](henrygd/beszel#2393)) - Fix status alerts being lost during pending recovery ([#​2375](henrygd/beszel#2375)) - Fix hub requiring system access for alert subscriptions and delivery ([#​2455](henrygd/beszel#2455)) - Fix hub not honoring SSH request cancellation ([#​2450](henrygd/beszel#2450)) - Fix hub not restarting `beszel-hub.service` after update ([#​2410](henrygd/beszel#2410)) - Fix IP targets being accepted for DNS monitors ([#​2483](henrygd/beszel#2483)) - Fix short monitor IDs failing schema validation ([#​2454](henrygd/beszel#2454)) - Fix network monitor charts to show gaps for failed probes and disconnects ([#​2428](henrygd/beszel#2428)) - Fix duplicate y-axis labels on network monitor response charts ([#​2426](henrygd/beszel#2426)) - Fix translations not refreshing on locale change ([#​2405](henrygd/beszel#2405)) - Fix scrollbar layout shifts ([#​2406](henrygd/beszel#2406)) - Fix hub returning 200 for unknown frontend routes ([#​2414](henrygd/beszel#2414)) - Fix proxy caching of systemd details ([#​2456](henrygd/beszel#2456)) - Fix agent not exiting with code 0 when run without a key on Windows ([#​2376](henrygd/beszel#2376), [#​2247](henrygd/beszel#2247)) - Fix OpenWrt user account handling in the install script ([#​2370](henrygd/beszel#2370)) - Update Go dependencies #### New Contributors - [@​adrienboulle](https://github.com/adrienboulle) made their first contribution in [#​2397](henrygd/beszel#2397) - [@​Mario-Mohar](https://github.com/Mario-Mohar) made their first contribution in [#​2410](henrygd/beszel#2410) - [@​LudwigJMarx](https://github.com/LudwigJMarx) made their first contribution in [#​2407](henrygd/beszel#2407) - [@​anandghegde](https://github.com/anandghegde) made their first contribution in [#​2357](henrygd/beszel#2357) - [@​Yi-111-a](https://github.com/Yi-111-a) made their first contribution in [#​2419](henrygd/beszel#2419) - [@​lukyjay](https://github.com/lukyjay) made their first contribution in [#​2387](henrygd/beszel#2387) - [@​user01010111](https://github.com/user01010111) made their first contribution in [#​2461](henrygd/beszel#2461) - [@​Juankers](https://github.com/Juankers) made their first contribution in [#​2470](henrygd/beszel#2470) - [@​Bartuzen](https://github.com/Bartuzen) made their first contribution in [#​2484](henrygd/beszel#2484) - [@​jeroendewilde](https://github.com/jeroendewilde) made their first contribution in [#​2471](henrygd/beszel#2471) **Full Changelog**: <henrygd/beszel@v0.20.0...v0.21.0> </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMTUuMTIiLCJ1cGRhdGVkSW5WZXIiOiI0NC4xMTUuMTIiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbXX0=--> --------- Co-authored-by: Renovate Bot <[email protected]> Reviewed-on: https://git.ivanch.me/ivanch/haven/pulls/20
3 tasks done
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
📃 Description
Follow-up to #2357, which added pending update counts (
pu: [total, security]). This PR adds the list behind those counts, the rest of what #617 asked for.Agent
The background check keeps the per-package results, not just the counts. It uses the same commands as before, and the counts come from the same parse, so the badge and the table always agree.
A new
GetPackageUpdatesaction returns the result of the last check. It never starts a check, runs a package manager or refreshes metadata. That still happens only on thePACKAGE_UPDATES_INTERVALschedule.What each package manager provides:
apt-get -s dist-upgrade-securityorigin)rpm -q --qffor the listed packagescheck-updatecheck-update --security, matched by name.arch)list-updateslist-patchescheckupdatesapk -u listdnf's
check-updatedoes not print installed versions. The agent makes one extrarpm -qcall with the listed name.arch values. It is local only, with no network or metadata access.The dnf security count is now the number of listed packages flagged by
--security, not the line count of the--securityoutput. With the captured Rocky 9 sample these agree (53).PACKAGE_UPDATES_INTERVALparsing is moved into its own function and logs the effective value, likeSMART_INTERVALdoes:30m,6h); the default is1h.0disables the checks.BESZEL_AGENT_PACKAGE_UPDATES_INTERVALtakes precedence, as for other agent variables.Hub
GET /api/beszel/package-updates?system=<id>follows the same pattern as/systemd/info:HasUsercheck.Site
info.pu[0] > 0. It is lazy-loaded and refetches only when the counts change, so no request is made per realtime tick.src/lib/package-updates.ts) and set to major, minor, patch or revision:-.5.15.0-91.101 → 5.15.0-92.102and2.35-0ubuntu3.4 → 2.35-0ubuntu3.15.~/+suffix-only changes📖 Documentation
PACKAGE_UPDATES_INTERVALneeds a line in the agent environment variable docs. I can open that PR against beszel-docs once this is settled.🪵 Changelog
➕ Added
GetPackageUpdatesagent action andGET /api/beszel/package-updateshub route✏️ Changed
PACKAGE_UPDATES_INTERVALparsing is tested, logs the effective value, and0disables the checks--securityTesting
checkupdatessample). Newrpm -qcaptures come from the same Rocky and Fedora images. The tests cover:Obsoletingsectionrpm"is not installed" linescheckDnfandcheckZypperare tested end to end against fakednf/rpm/zypperbinaries onPATH.0s, negative, unitless, invalid, empty, prefixed precedence)bun testcovers the version classifier with the formats listed above.go test -tags='testing no_ui'passes for the agent, hub and entities packages. The exceptions are 6 GPU/sensor tests inagent/that fail the same way onmainon macOS.golangci-lint --new-from-revreports 0 issues,biome checkis clean, andbun run buildsucceeds.Compatibility note
An agent without this change ignores the new action, so the request would wait for the 5 s timeout. The table only renders when
puis present, andpuis new in #2357, which isn't in a release yet. So as long as both ship in the same release, an old agent never gets the request. If they end up in different releases, I can add aMinVersiongate like the ZFS one.