[PATCH pve-manager 1/1] close: 6799: add apt upgrade path to PVE API

Florian Paul Azim Hoberg florian.hoberg at credativ.de
Fri Sep 12 08:34:52 CEST 2025


Extend the PVE API by a new 'upgrade' path in the
apt path to perform 'apt-get -y dist-upgrade' on
the node in a noninteractive way to avoid blocking
the upgrade process.

Signed-off-by: Florian Paul Azim Hoberg @gyptazy <florian.hoberg at credativ.de>
---

PVE/API2/APT.pm | 78 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 78 insertions(+)

diff --git a/PVE/API2/APT.pm b/PVE/API2/APT.pm
index 0d07cf38..3f2d7807 100644
--- a/PVE/API2/APT.pm
+++ b/PVE/API2/APT.pm
@@ -417,6 +417,84 @@ __PACKAGE__->register_method({
    },
});

+__PACKAGE__->register_method({
+    name => 'upgrade_packages',
+    path => 'upgrade',
+    method => 'POST',
+    description =>
+        "This is used to upgrade the system to the latest packages (apt-get -y dist-upgrade).",
+    permissions => {
+        check => ['perm', '/nodes/{node}', ['Sys.Modify']],
+    },
+    protected => 1,
+    proxyto => 'node',
+    parameters => {
+        additionalProperties => 0,
+        properties => {
+            node => get_standard_option('pve-node'),
+            command => {
+                description => "Specify the command.",
+                type => 'string',
+                enum => [qw(upgrade)],
+            },
+            quiet => {
+                type => 'boolean',
+                description =>
+                    "Only produces output suitable for logging, omitting progress indicators.",
+                optional => 1,
+                default => 0,
+            },
+        },
+    },
+    returns => {
+        type => 'string',
+        description => 'The task UPID.',
+    },
+    code => sub {
+        my ($param) = @_;
+
+        my $rpcenv = PVE::RPCEnvironment::get();
+        my $dcconf = PVE::Cluster::cfs_read_file('datacenter.cfg');
+
+        my $authuser = $rpcenv->get_user();
+
+        my $realcmd = sub {
+            my $upid = shift;
+
+            # setup proxy for apt
+
+            my $aptconf = "// no proxy configured\n";
+            if ($dcconf->{http_proxy}) {
+                $aptconf = "Acquire::http::Proxy \"$dcconf->{http_proxy}\";\n";
+            }
+            my $aptcfn = "/etc/apt/apt.conf.d/76pveproxy";
+            PVE::Tools::file_set_contents($aptcfn, $aptconf);
+
+            # Run apt as noninteractive
+            my $cmd = [
+                'env', 'DEBIAN_FRONTEND=noninteractive',
+                'apt-get', '-q', '-y',
+                '-o', 'Dpkg::Options::=--force-confdef',
+                '-o', 'Dpkg::Options::=--force-confold',
+                'dist-upgrade'
+            ];
+
+            print "starting apt-get -y dist-upgrade\n" if !$param->{quiet};
+
+            if ($param->{quiet}) {
+                PVE::Tools::run_command($cmd, outfunc => sub { }, errfunc => sub { });
+            } else {
+                PVE::Tools::run_command($cmd);
+            }
+
+            return;
+        };
+
+        return $rpcenv->fork_worker('aptupgrade', undef, $authuser, $realcmd);
+
+    },
+});
+
__PACKAGE__->register_method({
    name => 'changelog',
    path => 'changelog',
--
2.50.1


More information about the pve-devel mailing list