139 lines
3.9 KiB
Perl
Executable File
139 lines
3.9 KiB
Perl
Executable File
#!/usr/bin/env perl
|
|
use strict;
|
|
no warnings 'all';
|
|
use feature ':5.10';
|
|
use IO::Tee;
|
|
use Data::Dumper;
|
|
use lib '.';
|
|
use pcurse;
|
|
|
|
my $logfile = $ENV{'HOME'}.'/.pcurse/lastrun.log';
|
|
open my $lf, '>', $logfile or die 'Cannot write to logfile '.$logfile.': '.$!;
|
|
select STDOUT;
|
|
$| = 1;
|
|
my $tee = IO::Tee->new(\*STDOUT, $lf);
|
|
select $tee;
|
|
|
|
my $ret;
|
|
my $msg;
|
|
my @toupd;
|
|
my %jobs;
|
|
my $workers;
|
|
my $opts = pcurse::parse_arguments;
|
|
$opts->{'config'} = $ENV{'HOME'}.'/.pcurse/config.json' unless(defined($opts->{'config'}));
|
|
my $conf = pcurse::load_config($opts->{'config'});
|
|
$conf = pcurse::check_config($conf);
|
|
($ret,$msg) = pcurse::save_config($conf->{'config'},$conf);
|
|
unless($ret) {
|
|
print $msg."\n";
|
|
exit 0;
|
|
}
|
|
$conf = pcurse::merge_opts($opts,$conf);
|
|
my $addons = pcurse::load_addons($conf->{'addons'});
|
|
say 'Loaded '.scalar(@{$addons}).' addons';
|
|
|
|
if(defined($opts->{'add'})) {
|
|
unless(defined($opts->{'name'})) {
|
|
say 'You need to specify a name for the addon with -name=string';
|
|
exit 1;
|
|
}
|
|
my $newaddon = {
|
|
'name' => $opts->{'name'},
|
|
'uri' => $opts->{'add'},
|
|
'version' => 'none',
|
|
};
|
|
pcurse::add_baseuri_to_addon($newaddon);
|
|
push(@{$addons},$newaddon);
|
|
}
|
|
|
|
my $pool = pcurse::init_pool($conf->{'workers'});
|
|
my $worki = 0;
|
|
my %tounpack;
|
|
my @errors;
|
|
print 'Updating ';
|
|
foreach my $addon(@{$addons}) {
|
|
my $workid = $pool->job('check',$addon);
|
|
$jobs{$workid}{'todo'} = 'check';
|
|
$jobs{$workid}{'job'} = $addon;
|
|
$jobs{$workid}{'i'} = $worki;
|
|
$worki++;
|
|
}
|
|
while(scalar(keys %jobs)) {
|
|
my $jobid;
|
|
if(my $jres = $pool->result_any(\$jobid)) {
|
|
if($jres->{'did'} eq 'check') {
|
|
if($jres->{'retval'} == 1) {
|
|
my $addon = $jres->{'addon'}; #Addon data structure
|
|
my $id = $jobs{$jobid}{'i'}; #ID from @{$addons}
|
|
my $version = $jres->{'addon'}->{'targetversion'}; #Version we're trying to fetch
|
|
die "Not enough params: addon: $addon, id: $id, version: $version" unless(defined($addon) && defined($id) && defined($version));
|
|
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;
|
|
} elsif($jres->{'result'} eq 'No need to update') {
|
|
print '.';
|
|
} else {
|
|
if(exists($jobs{$jobid}->{'retried'})) {
|
|
print 'E';
|
|
push(@errors,'Error during check: '.$jres->{'addon'}->{'name'})
|
|
} else {
|
|
print '|';
|
|
$jobs{$jobid}{'job'}->{'retried'} = 1;
|
|
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};
|
|
}
|
|
}
|
|
|
|
$pool->shutdown;
|
|
print "\n";
|
|
|
|
foreach my $unpacking(keys %tounpack) {
|
|
my $id = $tounpack{$unpacking}->[0];
|
|
my $file = $tounpack{$unpacking}->[1];
|
|
my $version = $tounpack{$unpacking}->[2];
|
|
if(pcurse::update($unpacking,$file,$conf->{'wowpath'})) {
|
|
say 'Updated '.$addons->[$id]->{'name'}.': '.$addons->[$id]->{'version'}.' => '.$version;
|
|
$addons->[$id]->{'version'} = $version;
|
|
} else {
|
|
say 'Unpacking failed for '.$unpacking;
|
|
}
|
|
}
|
|
|
|
foreach my $err(@errors) {
|
|
say $err;
|
|
}
|
|
|
|
($ret,$msg) = pcurse::save_config($conf->{'addons'},$addons);
|
|
print $msg."\n" unless($ret);
|
|
close $lf;
|