apt-get update does not return a non-zero exit on failure, thus parse its output instead

This commit is contained in:
Johannes 'josch' Schauer 2018-09-21 08:04:40 +02:00
parent 0166f95545
commit 9df5afa5c4
Signed by untrusted user: josch
GPG key ID: F2CBA5C78FBD83E1

View file

@ -514,7 +514,42 @@ sub setup {
# been evaluated at the time that apt takes its command line arguments # been evaluated at the time that apt takes its command line arguments
# into account. # into account.
$ENV{"APT_CONFIG"} = "$tmpfile"; $ENV{"APT_CONFIG"} = "$tmpfile";
0 == system('apt-get', 'update') or die "apt-get update failed: $?";
# apt-get doesn't report a non-zero exit if the update failed. Thus, we
# have to parse its output. See #778357, #776152, #696335 and #745735
{
my $pid = open(my $pipe_apt, '-|') // die "failed to fork(): $!";
if ($pid == 0) {
# redirect apt's stderr to stdout so that we can capture it
open(STDERR, '>&', STDOUT);
exec('apt-get', 'update');
die "cannot exec apt-get update: $!";
}
my $has_error = 0;
while (my $line = <$pipe_apt>) {
if ($line =~ '^W: ') {
$has_error = 1;
} elsif ($line =~ '^Err:') {
$has_error = 1;
}
# forward captured apt output
print STDERR $line;
}
close($pipe_apt);
if ($? != 0 or $has_error) {
die "apt-get update failed to download some indexes";
}
}
# check if anything was downloaded at all
{
open my $fh, '-|', 'apt-get', 'indextargets' // die "failed to fork(): $!";
chomp (my $indextargets = do { local $/; <$fh> });
close $fh;
if ($indextargets eq '') {
die "apt-get update didn't download anything";
}
}
# setting PATH for chroot, ldconfig, start-stop-daemon... # setting PATH for chroot, ldconfig, start-stop-daemon...
$ENV{"PATH"} = "/usr/sbin:/usr/bin:/sbin:/bin"; $ENV{"PATH"} = "/usr/sbin:/usr/bin:/sbin:/bin";