From: Dominik Csapak <d.csapak@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH manager 2/3] api: provide GUI versions via index and /cluster/resources
Date: Wed, 23 Sep 2026 13:35:02 +0200 [thread overview]
Message-ID: <20260923113757.2202858-3-d.csapak@proxmox.com> (raw)
In-Reply-To: <20260923113757.2202858-1-d.csapak@proxmox.com>
Index has these versions anyway, just expose them to the UI via the
usual `Proxmox` object.
In the /cluster/resources API call, we add that information to the node
that is handling the request (which is normally the same where the index
was loaded from).
Cache the pwt versions locally for 60 seconds, so we don't hit the file
read on every call.
With this information, the UI can detect an outdated UI version still
running.
Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
PVE/API2/Cluster.pm | 42 ++++++++++++++++++++++++++++++++++++++++++
www/index.html.tpl | 6 +++++-
2 files changed, 47 insertions(+), 1 deletion(-)
diff --git a/PVE/API2/Cluster.pm b/PVE/API2/Cluster.pm
index 4e5efbfd..f66e0a6a 100644
--- a/PVE/API2/Cluster.pm
+++ b/PVE/API2/Cluster.pm
@@ -20,6 +20,7 @@ use PVE::RPCEnvironment;
use PVE::SafeSyslog;
use PVE::Storage;
use PVE::Tools qw(extract_param);
+use PVE::pvecfg;
use PVE::API2::ACMEAccount;
use PVE::API2::ACMEPlugin;
@@ -259,6 +260,9 @@ my sub can_access_network {
return 0;
}
+# widget toolkit version, re-read at most once per minute to avoid reading the file on every call
+my $pwt_version_cache = {};
+
__PACKAGE__->register_method({
name => 'resources',
path => 'resources',
@@ -503,6 +507,25 @@ __PACKAGE__->register_method({
default => 'x86_64',
optional => 1,
},
+ 'versions' => {
+ description => "Optional package versions (for type 'node').",
+ type => 'object',
+ optional => 1,
+ properties => {
+ 'pve-manager' => {
+ type => "string",
+ optional => 1,
+ description =>
+ "The pve-manager version of this node. Only included for the node handling the request.",
+ },
+ 'proxmox-widget-toolkit' => {
+ type => "string",
+ optional => 1,
+ description =>
+ "The proxmox-widget-toolkit version of this node. Only included for the node handling the request.",
+ },
+ },
+ },
},
},
},
@@ -618,6 +641,8 @@ __PACKAGE__->register_method({
my $static_node_info = PVE::Cluster::get_node_kv("static-info");
if (!$param->{type} || $param->{type} eq 'node') {
+ my $nodename = PVE::INotify::nodename();
+
foreach my $node (@$nodelist) {
my $can_audit = $rpcenv->check($authuser, "/nodes/$node", ['Sys.Audit'], 1);
my $entry =
@@ -634,6 +659,23 @@ __PACKAGE__->register_method({
$entry->{'hastate'} = $status;
}
+ if ($node eq $nodename) {
+ my $now = time();
+ if (
+ !defined($pwt_version_cache->{version})
+ || $pwt_version_cache->{time} + 60 < $now
+ ) {
+ $pwt_version_cache->{version} = PVE::API2Tools::read_pwt_version();
+ $pwt_version_cache->{time} = $now;
+ }
+ my $pwt_version = $pwt_version_cache->{version};
+
+ $entry->{versions} = { 'pve-manager' => PVE::pvecfg::version() };
+ # an empty version means reading failed, omit it to avoid false positives
+ $entry->{versions}->{'proxmox-widget-toolkit'} = $pwt_version
+ if $pwt_version ne '';
+ }
+
push @$res, $entry;
}
}
diff --git a/www/index.html.tpl b/www/index.html.tpl
index c18e6411..8484710a 100644
--- a/www/index.html.tpl
+++ b/www/index.html.tpl
@@ -48,7 +48,11 @@
NodeArch: '[% arch %]',
UserName: '[% username %]',
CSRFPreventionToken: '[% token %]',
- ConsentText: '[% consenttext %]'
+ ConsentText: '[% consenttext %]',
+ GUIVersions: {
+ 'pve-manager': '[% version %]',
+ 'proxmox-widget-toolkit': '[% wtversion %]',
+ },
};
</script>
<script type="text/javascript" src="/proxmoxlib.js?ver=[% wtversion %]"></script>
--
2.47.3
next prev parent reply other threads:[~2026-09-23 11:38 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-23 11:35 [PATCH manager 0/3] ui: prompt users for reload when web ui version changes Dominik Csapak
2026-09-23 11:35 ` [PATCH manager 1/3] api: factor out read_pwt_version and pwt_base_dir Dominik Csapak
2026-09-23 11:35 ` Dominik Csapak [this message]
2026-09-23 11:35 ` [PATCH manager 3/3] ui: workspace: prompt user for reload when UI packages were updated Dominik Csapak
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260923113757.2202858-3-d.csapak@proxmox.com \
--to=d.csapak@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox