Moved downloading to main job loop, changed print values, so that . = no update, D = downloaded update, F = program failure, E = error downloading file, | = retry

This commit is contained in:
2019-08-18 21:22:10 +02:00
parent be02db85ff
commit 19110a30d5
2 changed files with 61 additions and 65 deletions

114
pcurse
View File

@ -3,6 +3,7 @@ use strict;
no warnings 'all'; no warnings 'all';
use feature ':5.10'; use feature ':5.10';
use IO::Tee; use IO::Tee;
use Data::Dumper;
use lib '.'; use lib '.';
use pcurse; use pcurse;
@ -47,7 +48,9 @@ if(defined($opts->{'add'})) {
my $pool = pcurse::init_pool($conf->{'workers'}); my $pool = pcurse::init_pool($conf->{'workers'});
my $worki = 0; my $worki = 0;
print 'Checking for updates '; my %tounpack;
my @errors;
print 'Updating ';
foreach my $addon(@{$addons}) { foreach my $addon(@{$addons}) {
my $workid = $pool->job('check',$addon); my $workid = $pool->job('check',$addon);
$jobs{$workid}{'todo'} = 'check'; $jobs{$workid}{'todo'} = 'check';
@ -57,72 +60,61 @@ foreach my $addon(@{$addons}) {
} }
while(scalar(keys %jobs)) { while(scalar(keys %jobs)) {
my $jobid; my $jobid;
if(my @jres = $pool->result_any(\$jobid)) { if(my $jres = $pool->result_any(\$jobid)) {
if($jres[0] == 1) { if($jres->{'did'} eq 'check') {
my $a = $jres[1]; #Addon data structure if($jres->{'retval'} == 1) {
my $i = $jobs{$jobid}{'i'}; #ID from @{$addons} my $addon = $jres->{'addon'}; #Addon data structure
my $v = $jres[1]->{'targetversion'}; #Version we're trying to fetch my $id = $jobs{$jobid}{'i'}; #ID from @{$addons}
die "Not enough params: a: $a, i: $i, v: $v" unless(defined($a) && defined($i) && defined($v)); my $version = $jres->{'addon'}->{'targetversion'}; #Version we're trying to fetch
my $nextjob = [ $i, $a, $v ]; die "Not enough params: addon: $addon, id: $id, version: $version" unless(defined($addon) && defined($id) && defined($version));
push(@toupd,$nextjob); my $workid = $pool->job('download', $addon->{'downloaduri'},$addon->{'fileid'});
} elsif($jres[1] eq 'No need to update') { $jobs{$workid}{'todo'} = 'download';
} else { $jobs{$workid}{'job'} = [ $addon->{'downloaduri'},$addon->{'fileid'} ];
if(exists($jobs{$jobid}->{'retried'})) { $jobs{$workid}{'id'} = $id;
say 'Error during check: '.$jres[1]; $jobs{$workid}{'tv'} = $version;
} elsif($jres->{'result'} eq 'No need to update') {
print '.';
} else { } else {
print '|'; if(exists($jobs{$jobid}->{'retried'})) {
$jobs{$jobid}{'job'}->{'retried'} = 1; push(@errors,'Error during check: '.$jres->{'addon'}->{'name'})
my $workid = $pool->job('check', $jobs{$jobid}{'job'}); } else {
$jobs{$workid}{'todo'} = 'check'; print '|';
$jobs{$workid}{'job'} = $jobs{$jobid}{'job'}; $jobs{$jobid}{'job'}->{'retried'} = 1;
$jobs{$workid}{'i'} = $jobs{$jobid}{'i'}; my $workid = $pool->job('check', $jobs{$jobid}{'job'});
$jobs{$workid}{'todo'} = 'check';
$jobs{$workid}{'job'} = $jobs{$jobid}{'job'};
$jobs{$workid}{'i'} = $jobs{$jobid}{'i'};
}
} }
} elsif($jres->{'did'} eq 'download') {
if($jres->{'retval'} == 1) {
my $ret = $jres->{'retval'};
my $filename = $jres->{'filename'};
my $file = $jres->{'filecontent'};
my $version = $jobs{$jobid}{'tv'};
if(defined($filename)) {
$tounpack{$filename} = [ $jobs{$jobid}{'id'},$file,$version ];
print 'D';
} else {
print 'F';
my $ai = $jobs{$jobid}{'id'};
my $an = $addons->[$ai]->{'name'};
push(@errors,'Passed an empty filename? in update '.$an)
}
} else {
print 'E';
my $uri = $jres->{'uri'};
push(@errors, 'Download failed for '.$uri);
}
} else {
print Dumper $jres;
} }
delete $jobs{$jobid}; delete $jobs{$jobid};
print '.';
} }
} }
print "\n";
print 'Downloading updates ' if(scalar(@toupd));
foreach my $a(@toupd) {
my $id = $a->[0];
my $addon = $a->[1];
my $version = $a->[2];
my $workid = $pool->job('download',$addon->{'downloaduri'},$addon->{'fileid'});
$jobs{$workid}{'todo'} = 'download';
$jobs{$workid}{'job'} = [ $addon->{'downloaduri'},$addon->{'fileid'} ];
$jobs{$workid}{'id'} = $id;
$jobs{$workid}{'tv'} = $version;
}
my %tounpack;
while(scalar(keys %jobs)) {
my $jobid;
if(my @jres = $pool->result_any(\$jobid)) {
if($jres[0]{'retval'} == 1) {
my $ret = $jres[0]{'retval'};
my $filename = $jres[0]{'filename'};
my $file = $jres[0]{'filecontent'};
my $version = $jobs{$jobid}{'tv'};
if(defined($filename)) {
$tounpack{$filename} = [ $jobs{$jobid}{'id'},$file,$version ];
} else {
my $ai = $jobs{$jobid}{'id'};
my $an = $addons->[$ai]->{'name'};
say 'Passed an empty filename? in update';
}
} else {
my $uri = shift;
say 'Download failed for '.$uri;
}
delete $jobs{$jobid};
print '.';
}
}
$pool->shutdown; $pool->shutdown;
print "\n" if(scalar(@toupd)); print "\n";
say 'Unpacking updates ' if(scalar(keys %tounpack)); say 'Unpacking updates ' if(scalar(keys %tounpack));
foreach my $unpacking(keys %tounpack) { foreach my $unpacking(keys %tounpack) {
@ -137,6 +129,10 @@ foreach my $unpacking(keys %tounpack) {
} }
} }
foreach my $err(@errors) {
say $err;
}
($ret,$msg) = pcurse::save_config($conf->{'addons'},$addons); ($ret,$msg) = pcurse::save_config($conf->{'addons'},$addons);
print $msg."\n" unless($ret); print $msg."\n" unless($ret);
close $lf; close $lf;

View File

@ -326,22 +326,22 @@ sub init_pool {
$addon->{'downloaduri'} = $addon->{'host'}.$addon->{'uri'}.'/download/'.$fileid.'/file'; $addon->{'downloaduri'} = $addon->{'host'}.$addon->{'uri'}.'/download/'.$fileid.'/file';
} }
$addon->{'targetversion'} = $version; $addon->{'targetversion'} = $version;
return (1,$addon); return { retval => 1, did => 'check', addon => $addon };
} }
} else { } else {
return (0,'No need to update'); return { retval => 0, did => 'check', result => 'No need to update', addon => $addon };
} }
} else { } else {
return (0,'Could not find file id for '.$addon->{'name'}); return { retval => 0, did => 'check', result => 'Could not find file id for '.$addon->{'name'} };
} }
} elsif($todo eq 'download') { } elsif($todo eq 'download') {
my $uri = shift; my $uri = shift;
my $fileid = shift; my $fileid = shift;
my ($ret,$filename,$file) = pcurse::download_update($uri,$fileid); my ($ret,$filename,$file) = pcurse::download_update($uri,$fileid);
return { retval => $ret, filename => $filename, filecontent => $file } if($ret); return { retval => $ret, did => 'download', filename => $filename, filecontent => $file } if($ret);
return { retval => 0, filename => undef, filecontent => undef }; return { retval => 0, did => 'download', filename => undef, filecontent => undef, uri => $uri };
} else { } else {
return (0,'Unknown task'); return { retval => 0, result => 'Unknown task' };
} }
}, },
}); });