[pve-devel] [PATCH manager 1/1] apt: use `apt changelog` for changelog fetching
Fabian Grünbichler
f.gruenbichler at proxmox.com
Tue Jul 4 11:45:07 CEST 2023
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 at 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
More information about the pve-devel
mailing list