public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: "Fabian Grünbichler" <f.gruenbichler@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH manager 1/1] apt: use `apt changelog` for changelog fetching
Date: Tue,  4 Jul 2023 11:45:07 +0200	[thread overview]
Message-ID: <20230704094507.92567-5-f.gruenbichler@proxmox.com> (raw)
In-Reply-To: <20230704094507.92567-1-f.gruenbichler@proxmox.com>

support for it got added to Proxmox repositories, so there is no need to use
custom logic and manual fetching for this anymore.

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
---

Notes:
    requires versioned depends on proxmox-widget-toolkit.

 PVE/API2/APT.pm | 101 ++++++++----------------------------------------
 1 file changed, 16 insertions(+), 85 deletions(-)

diff --git a/PVE/API2/APT.pm b/PVE/API2/APT.pm
index 6694dbeb6..dc506e6fe 100644
--- a/PVE/API2/APT.pm
+++ b/PVE/API2/APT.pm
@@ -88,38 +88,6 @@ my $get_pkgfile = sub {
     return undef;
 };
 
-my $get_changelog_url =sub {
-    my ($pkgname, $info, $pkgver, $pkgfile) = @_;
-
-    my $base;
-    $base = dirname($info->{FileName}) if defined($info->{FileName});
-
-    my $origin = $pkgfile->{Origin};
-
-    if ($origin && $base) {
-	$pkgver =~ s/^\d+://; # strip epoch
-	my $srcpkg = $info->{SourcePkg} || $pkgname;
-	if ($origin eq 'Debian' || $origin eq 'Debian Backports') {
-	    $base =~ s!pool/updates/!pool/!; # for security channel
-	    return "http://packages.debian.org/changelogs/$base/${srcpkg}_${pkgver}/changelog";
-	} elsif ($origin eq 'Proxmox') {
-	    # the product is just for getting the standard repos and is currently a required param,
-	    # but we actually only care about `files`, which includes _all_ configured repos
-	    my $data = Proxmox::RS::APT::Repositories::repositories("pve");
-
-	    for my $file ($data->{files}->@*) {
-		for my $repo (grep { $_->{Enabled} } $file->{repositories}->@*) {
-		    next if !grep(/$pkgfile->{Component}/, $repo->{Components}->@*);
-		    next if !$repo->{URIs}[0] =~ m/$pkgfile->{Site}/;
-
-		    return $repo->{URIs}[0] . "/$base/${pkgname}_${pkgver}.changelog";
-		}
-	    }
-	}
-    }
-    return; # none found, with our heuristic that is..
-};
-
 my $assemble_pkginfo = sub {
     my ($pkgname, $info, $current_ver, $candidate_ver)  = @_;
 
@@ -131,9 +99,6 @@ my $assemble_pkginfo = sub {
 
     if (my $pkgfile = &$get_pkgfile($candidate_ver)) {
 	$data->{Origin} = $pkgfile->{Origin};
-	my $changelog_url = $get_changelog_url->($pkgname, $info, $candidate_ver->{VerStr}, $pkgfile);
-
-	$data->{ChangeLogUrl} = $changelog_url if $changelog_url;
     }
 
     if (my $desc = $info->{LongDesc}) {
@@ -410,62 +375,28 @@ __PACKAGE__->register_method({
 
 	my $pkgname = $param->{name};
 
-	my $cache = &$get_apt_cache();
-	my $policy = $cache->policy;
-	my $p = $cache->{$pkgname} || die "no such package '$pkgname'\n";
-	my $pkgrecords = $cache->packages();
-
-	my $ver;
-	if ($param->{version}) {
-	    if (my $available = $p->{VersionList}) {
-		for my $v (@$available) {
-		    if ($v->{VerStr} eq $param->{version}) {
-			$ver = $v;
-			last;
-		    }
-		}
-	    }
-	    die "package '$pkgname' version '$param->{version}' is not available\n" if !$ver;
+	my $cmd = ['apt-get', 'changelog', '-qq'];
+	if (my $version = $param->{version}) {
+	    push @$cmd, "$pkgname=$version";
 	} else {
-	    $ver = $policy->candidate($p) || die "no installation candidate for package '$pkgname'\n";
+	    push @$cmd, "$pkgname";
 	}
 
-	my $info = $pkgrecords->lookup($pkgname);
-
-	my $pkgfile = $get_pkgfile->($ver) or die "couldn't find package info file for ${pkgname}=$ver->{VerStr}\n";
-
-	my $url = $get_changelog_url->($pkgname, $info, $ver->{VerStr}, $pkgfile)
-	    or die "changelog for '${pkgname}_$ver->{VerStr}' not available\n";
-
-	my $ua = LWP::UserAgent->new();
-	$ua->agent("PVE/1.0");
-	$ua->timeout(10);
-	$ua->max_size(1024 * 1024);
-	$ua->ssl_opts(verify_hostname => 0); # don't care for changelogs
-
-	my $datacenter_cfg = PVE::Cluster::cfs_read_file('datacenter.cfg');
-	if (my $proxy = $datacenter_cfg->{http_proxy}) {
-	    $ua->proxy(['http', 'https'], $proxy);
-	} else {
-	    $ua->env_proxy;
-	}
+	my $output = "";
 
-	if ($pkgfile->{Origin} eq 'Proxmox' && $pkgfile->{Component} eq 'pve-enterprise') {
-	    my $info = PVE::API2::Subscription::read_etc_subscription();
-	    if ($info->{status} eq 'active') {
-		my $pw = PVE::API2Tools::get_hwaddress();
-		$ua->credentials("enterprise.proxmox.com:443", 'pve-enterprise-repository', $info->{key}, $pw);
-	    }
-	}
+	my $rc = PVE::Tools::run_command(
+	    $cmd,
+	    timeout => 10,
+	    logfunc => sub {
+		my $line = shift;
+		$output .= "$line\n";
+	    },
+	    noerr => 1,
+	);
 
-	my $response = $ua->get($url);
+	$output .= "RC: $rc" if $rc != 0;
 
-	if ($response->is_success) {
-	    return $response->decoded_content;
-	} else {
-	    PVE::Exception::raise($response->message, code => $response->code);
-	}
-	return '';
+	return $output;
     }});
 
 __PACKAGE__->register_method({
-- 
2.39.2





  parent reply	other threads:[~2023-07-04  9:45 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-04  9:45 [pve-devel] [PATCH pve-manager/pmg-api/proxmox-backup/pwt 0/4] APT changelog switch-over Fabian Grünbichler
2023-07-04  9:45 ` [pve-devel] [PATCH pmg-api 1/1] apt: use `apt changelog` for changelog fetching Fabian Grünbichler
2023-07-04  9:45 ` [pve-devel] [PATCH proxmox-backup " Fabian Grünbichler
2023-07-04  9:45 ` [pve-devel] [PATCH proxmox-widget-toolkit 1/1] apt: drop ChangeLogUrl Fabian Grünbichler
2023-11-13 17:18   ` [pve-devel] applied: " Thomas Lamprecht
2023-11-14  7:04     ` Fabian Grünbichler
2023-07-04  9:45 ` Fabian Grünbichler [this message]
2023-11-14  8:30 ` [pve-devel] applied-series: [PATCH pve-manager/pmg-api/proxmox-backup/pwt 0/4] APT changelog switch-over Thomas Lamprecht

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=20230704094507.92567-5-f.gruenbichler@proxmox.com \
    --to=f.gruenbichler@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
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal