From: Fabian Grünbichler Date: Tue, 4 Jul 2023 09:45:04 +0000 (+0200) Subject: apt: use `apt changelog` for changelog fetching X-Git-Url: https://git.proxmox.com/?p=pmg-api.git;a=commitdiff_plain;h=785364eba5dc8dcace4640cb8f96ac47c0f28198 apt: use `apt changelog` for changelog fetching 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 --- diff --git a/src/PMG/API2/APT.pm b/src/PMG/API2/APT.pm index bcd749b..724302f 100644 --- a/src/PMG/API2/APT.pm +++ b/src/PMG/API2/APT.pm @@ -85,32 +85,6 @@ my $get_pkgfile = sub { return undef; }; -my $get_changelog_url =sub { - my ($pkgname, $info, $pkgver, $origin, $component) = @_; - - my $changelog_url; - my $base = dirname($info->{FileName}); - if ($origin && $base) { - $pkgver =~ s/^\d+://; # strip epoch - my $srcpkg = $info->{SourcePkg} || $pkgname; - if ($origin eq 'Debian') { - $base =~ s!pool/updates/!pool/!; # for security channel - $changelog_url = "http://packages.debian.org/changelogs/$base/" . - "${srcpkg}_${pkgver}/changelog"; - } elsif ($origin eq 'Proxmox') { - if ($component eq 'pmg-enterprise') { - $changelog_url = "https://enterprise.proxmox.com/debian/pmg/$base/" . - "${pkgname}_${pkgver}.changelog"; - } else { - $changelog_url = "http://download.proxmox.com/debian/pmg/$base/" . - "${pkgname}_${pkgver}.changelog"; - } - } - } - - return $changelog_url; -}; - my $assemble_pkginfo = sub { my ($pkgname, $info, $current_ver, $candidate_ver) = @_; @@ -122,10 +96,6 @@ my $assemble_pkginfo = sub { if (my $pkgfile = &$get_pkgfile($candidate_ver)) { $data->{Origin} = $pkgfile->{Origin}; - if (my $changelog_url = &$get_changelog_url($pkgname, $info, $candidate_ver->{VerStr}, - $pkgfile->{Origin}, $pkgfile->{Component})) { - $data->{ChangeLogUrl} = $changelog_url; - } } if (my $desc = $info->{LongDesc}) { @@ -402,74 +372,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 $output = ""; - my $pkgfile = &$get_pkgfile($ver); - my $url; - - die "changelog for '${pkgname}_$ver->{VerStr}' not available\n" - if !($pkgfile && ($url = &$get_changelog_url($pkgname, $info, $ver->{VerStr}, $pkgfile->{Origin}, $pkgfile->{Component}))); - - my $data = ""; - - my $pmg_cfg = PMG::Config->new(); - my $proxy = $pmg_cfg->get('admin', 'http_proxy'); - - my $ua = LWP::UserAgent->new; - $ua->agent("PMG/1.0"); - $ua->timeout(10); - $ua->max_size(1024*1024); - $ua->ssl_opts(verify_hostname => 0); # don't care for changelogs - - if ($proxy) { - $ua->proxy(['http', 'https'], $proxy); - } else { - $ua->env_proxy; - } - - my $username; - my $pw; - - if ($pkgfile->{Origin} eq 'Proxmox' && $pkgfile->{Component} eq 'pmg-enterprise') { - my $info = PMG::API2::Subscription::read_etc_subscription(); - if ($info->{status} eq 'active') { - $username = $info->{key}; - $pw = PMG::Utils::get_hwaddress(); - $ua->credentials("enterprise.proxmox.com:443", 'pmg-enterprise-repository', - $username, $pw); - } - } - - syslog('info', "GET $url\n"); - my $response = $ua->get($url); + my $rc = PVE::Tools::run_command( + $cmd, + timeout => 10, + logfunc => sub { + my $line = shift; + $output .= "$line\n"; + }, + noerr => 1, + ); - if ($response->is_success) { - $data = $response->decoded_content; - } else { - PVE::Exception::raise($response->message, code => $response->code); - } + $output .= "RC: $rc" if $rc != 0; - return $data; + return $output; }}); __PACKAGE__->register_method({