all lists on 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal