From: Michael Tremer <michael.tremer@ipfire.org>
To: development@lists.ipfire.org
Subject: Re: [PATCH] pakfire: Better errorhandling on downloads
Date: Fri, 04 Mar 2022 11:18:45 +0000 [thread overview]
Message-ID: <C0D7AA97-8DA4-40EF-932A-EE5C96735591@ipfire.org> (raw)
In-Reply-To: <7b55cb89dd4c4380d4ea5d6424e2d907246b5c69.camel@sicho.home>
[-- Attachment #1: Type: text/plain, Size: 10350 bytes --]
Hello,
> On 3 Mar 2022, at 21:20, Robin Roevens <robin.roevens(a)disroot.org> wrote:
>
> Hi
>
> Michael Tremer schreef op di 01-03-2022 om 13:31 [+0000]:
>> Hello,
>>
>>> On 23 Feb 2022, at 20:21, Robin Roevens <robin.roevens(a)disroot.org>
>>> wrote:
>>>
>>> - Add true/false return codes to fetchfile, getmetafile and
>>> getmirrors
>>> indicating succes or failure.
>>> - Check on those return codes and fail gracefully with clean
>>> error message(s) when downloads fail.
>>> - Replace duplicate meta-file fetching code in dbgetlist with
>>> getmetafile function (fixing possibly missed cariage return
>>> conversion in meta-files).
>>> - Remove pointless 5 retries to download server-list.db in
>>> selectmirror as fetchfile already retries 5 times.
>>
>> It would have been useful to have these four things in four different
>> patches, because that makes reviewing things a lot easier.
>>
>> Altogether, the patch isn’t that large, but it is easier to spot any
>> problems if changes are bundled into smaller logical sets.
> I understand, but I considered this (or at least the first two items)
> already as a single logical set. But you are right I could have split
> the patch in 4. Should I resubmit it as a v2 patchset of 4 ?
No, I don’t want to create any extra work for you now.
I just wanted to note this for future reference.
-Michael
>
> Robin
>
>>
>> Does anyone want to test this? I am just a little bit more concerned
>> about breaking the package management system, because then we can’t
>> fix things easily any more.
>
>> Best,
>> -Michael
>>
>>> ---
>>> src/pakfire/lib/functions.pl | 84 +++++++++++++++++++++------------
>>> ---
>>> 1 file changed, 49 insertions(+), 35 deletions(-)
>>>
>>> diff --git a/src/pakfire/lib/functions.pl
>>> b/src/pakfire/lib/functions.pl
>>> index d4e338f23..24c55fd4a 100644
>>> --- a/src/pakfire/lib/functions.pl
>>> +++ b/src/pakfire/lib/functions.pl
>>> @@ -2,7 +2,7 @@
>>> ###################################################################
>>> ############
>>> #
>>> #
>>> # IPFire.org - A linux based
>>> firewall #
>>> -# Copyright (C) 2007-2021 IPFire Team
>>> <info(a)ipfire.org> #
>>> +# Copyright (C) 2007-2022 IPFire Team
>>> <info(a)ipfire.org> #
>>> #
>>> #
>>> # This program is free software: you can redistribute it and/or
>>> modify #
>>> # it under the terms of the GNU General Public License as published
>>> by #
>>> @@ -206,7 +206,7 @@ sub fetchfile {
>>>
>>> if ( $code eq "500" ) {
>>> message("Giving up: There was no chance to
>>> get the file \"$getfile\" from any available server.\nThere was an
>>> error on the way. Please fix it.");
>>> - return 1;
>>> + return 0;
>>> }
>>>
>>> if ($response->is_success) {
>>> @@ -226,7 +226,7 @@ sub fetchfile {
>>> }
>>> logger("DOWNLOAD FINISHED: $file");
>>> $allok = 1;
>>> - return 0;
>>> + return 1;
>>> } else {
>>> logger("DOWNLOAD ERROR: Could not
>>> open $Conf::tmpdir/$bfile for writing.");
>>> }
>>> @@ -235,7 +235,7 @@ sub fetchfile {
>>> }
>>> }
>>> message("DOWNLOAD ERROR: There was no chance to get the
>>> file \"$getfile\" from any available server.\nMay be you should run
>>> \"pakfire update\" to get some new servers.");
>>> - return 1;
>>> + return 0;
>>> }
>>>
>>> sub getmirrors {
>>> @@ -256,9 +256,14 @@ sub getmirrors {
>>> }
>>>
>>> if ("$force" eq "force") {
>>> - fetchfile("$Conf::version/lists/server-list.db",
>>> "$Conf::mainserver");
>>> - move("$Conf::cachedir/server-list.db",
>>> "$Conf::dbdir/lists/server-list.db");
>>> + if (fetchfile("$Conf::version/lists/server-
>>> list.db", "$Conf::mainserver")) {
>>> + move("$Conf::cachedir/server-list.db",
>>> "$Conf::dbdir/lists/server-list.db");
>>> + } elsif (! -e "$Conf::dbdir/lists/server-list.db" )
>>> {
>>> + # if we end up with no server-list at all,
>>> return failure
>>> + return 0;
>>> + }
>>> }
>>> + return 1;
>>> }
>>>
>>> sub getcoredb {
>>> @@ -279,8 +284,9 @@ sub getcoredb {
>>> }
>>>
>>> if ("$force" eq "force") {
>>> - fetchfile("lists/core-list.db", "");
>>> - move("$Conf::cachedir/core-list.db",
>>> "$Conf::dbdir/lists/core-list.db");
>>> + if (fetchfile("lists/core-list.db", "")) {
>>> + move("$Conf::cachedir/core-list.db",
>>> "$Conf::dbdir/lists/core-list.db");
>>> + }
>>> }
>>> }
>>>
>>> @@ -318,15 +324,13 @@ sub selectmirror {
>>>
>>> ### Check if there is a current server list and read it.
>>> # If there is no list try to get one.
>>> - my $count = 0;
>>> - while (!(open(FILE, "<$Conf::dbdir/lists/server-list.db"))
>>> && ($count lt 5)) {
>>> - $count++;
>>> - getmirrors("noforce");
>>> - }
>>> - if ($count == 5) {
>>> - message("MIRROR ERROR: Could not find or download a
>>> server list");
>>> - exit 1;
>>> + unless (open(FILE, "<$Conf::dbdir/lists/server-list.db")) {
>>> + unless (getmirrors("noforce")) {
>>> + message("MIRROR ERROR: Could not find or
>>> download a server list");
>>> + exit 1;
>>> + }
>>> }
>>> +
>>> my @lines = <FILE>;
>>> close(FILE);
>>>
>>> @@ -390,8 +394,13 @@ sub dbgetlist {
>>> }
>>>
>>> if ("$force" eq "force") {
>>> - fetchfile("lists/packages_list.db", "");
>>> - move("$Conf::cachedir/packages_list.db",
>>> "$Conf::dbdir/lists/packages_list.db");
>>> + if (fetchfile("lists/packages_list.db", "")) {
>>> + move("$Conf::cachedir/packages_list.db",
>>> "$Conf::dbdir/lists/packages_list.db");
>>> + } elsif ( -e "$Conf::dbdir/lists/packages_list.db"
>>> ) {
>>> + # If we end up with no db file after
>>> download error there
>>> + # is nothing more we can do here.
>>> + return 0;
>>> + }
>>> }
>>>
>>> # Update the meta database if new packages was in the
>>> package list
>>> @@ -419,8 +428,7 @@ sub dbgetlist {
>>> @templine = split(/\;/,$prog);
>>> if (("$metadata{'Name'}" eq "$templine[0]")
>>> && ("$metadata{'Release'}" ne "$templine[2]")) {
>>> move("$Conf::dbdir/meta/meta-
>>> $metadata{'Name'}","$Conf::dbdir/meta/old_meta-$metadata{'Name'}");
>>> - fetchfile("meta/meta-
>>> $metadata{'Name'}", "");
>>> - move("$Conf::cachedir/meta-
>>> $metadata{'Name'}", "$Conf::dbdir/meta/meta-$metadata{'Name'}");
>>> + getmetafile($metadata{'Name'});
>>> }
>>> }
>>> }
>>> @@ -532,11 +540,14 @@ sub dblist {
>>>
>>> sub resolvedeps_one {
>>> my $pak = shift;
>>> -
>>> - getmetafile("$pak");
>>> -
>>> +
>>> message("PAKFIRE RESV: $pak: Resolving dependencies...");
>>>
>>> + unless (getmetafile("$pak")) {
>>> + message("PAKFIRE ERROR: Error retrieving dependency
>>> information on $pak. Unable to resolve dependencies.");
>>> + exit 1;
>>> + };
>>> +
>>> my %metadata = parsemetafile("$Conf::dbdir/meta/meta-
>>> $pak");
>>> my @all;
>>> my @deps = split(/ /, $metadata{'Dependencies'});
>>> @@ -629,14 +640,10 @@ sub cleanup {
>>>
>>> sub getmetafile {
>>> my $pak = shift;
>>> -
>>> - unless ( -e "$Conf::dbdir/meta/meta-$pak" ) {
>>> - fetchfile("meta/meta-$pak", "");
>>> - move("$Conf::cachedir/meta-$pak",
>>> "$Conf::dbdir/meta/meta-$pak");
>>> - }
>>> -
>>> - if ( -z "$Conf::dbdir/meta/meta-$pak" ) {
>>> - fetchfile("meta/meta-$pak", "");
>>> +
>>> + # Try to download meta-file if we don't have one yet, or it
>>> is empty for some reason
>>> + if ((! -e "$Conf::dbdir/meta/meta-$pak" ) || ( -z
>>> "$Conf::dbdir/meta/meta-$pak" )) {
>>> + return 0 unless (fetchfile("meta/meta-$pak", ""));
>>> move("$Conf::cachedir/meta-$pak",
>>> "$Conf::dbdir/meta/meta-$pak");
>>> }
>>>
>>> @@ -651,6 +658,7 @@ sub getmetafile {
>>> print FILE $string;
>>> }
>>> close(FILE);
>>> +
>>> return 1;
>>> }
>>>
>>> @@ -713,8 +721,11 @@ sub getpak {
>>> my $pak = shift;
>>> my $force = shift;
>>>
>>> - getmetafile("$pak");
>>> -
>>> + unless (getmetafile("$pak")) {
>>> + message("PAKFIRE ERROR: Unable to retrieve $pak
>>> metadata.");
>>> + exit 1;
>>> + }
>>> +
>>> my %metadata = parsemetafile("$Conf::dbdir/meta/meta-
>>> $pak");
>>> my $file = $metadata{'File'};
>>>
>>> @@ -728,8 +739,11 @@ sub getpak {
>>> return $file;
>>> }
>>> }
>>> -
>>> - fetchfile("paks/$file", "");
>>> +
>>> + unless (fetchfile("paks/$file", "")) {
>>> + message("PAKFIRE ERROR: Unable to download $pak.");
>>> + exit 1;
>>> + }
>>> return $file;
>>> }
>>>
>>> --
>>> 2.34.1
>>>
>>>
>>> --
>>> Dit bericht is gescanned op virussen en andere gevaarlijke
>>> inhoud door MailScanner en lijkt schoon te zijn.
>>>
>>
>>
>
> --
> Dit bericht is gescanned op virussen en andere gevaarlijke
> inhoud door MailScanner en lijkt schoon te zijn.
next prev parent reply other threads:[~2022-03-04 11:18 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-23 20:21 [PATCH 0/1] " Robin Roevens
2022-02-23 20:21 ` [PATCH] " Robin Roevens
2022-03-01 13:31 ` Michael Tremer
2022-03-03 21:20 ` Robin Roevens
2022-03-04 11:18 ` Michael Tremer [this message]
2022-03-04 15:08 ` Adolf Belka
2022-03-07 13:33 ` Robin Roevens
2022-03-07 14:11 ` Adolf Belka
2022-06-23 21:20 ` Robin Roevens
2022-06-25 10:11 ` Peter Müller
2022-03-01 13:27 ` [PATCH 0/1] " Michael Tremer
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=C0D7AA97-8DA4-40EF-932A-EE5C96735591@ipfire.org \
--to=michael.tremer@ipfire.org \
--cc=development@lists.ipfire.org \
/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