Files
pcurse/pcurse

134 lines
3.6 KiB
Perl
Executable File

#!/usr/bin/env perl
use strict;
no warnings 'all';
use feature ':5.10';
use IO::Tee;
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;
print 'Checking for updates ';
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[0] == 1) {
my $a = $jres[1]; #Addon data structure
my $i = $jobs{$jobid}{'i'}; #ID from @{$addons}
my $v = $jres[1]->{'targetversion'}; #Version we're trying to fetch
die "Not enough params: a: $a, i: $i, v: $v" unless(defined($a) && defined($i) && defined($v));
my $nextjob = [ $i, $a, $v ];
push(@toupd,$nextjob);
} elsif($jres[1] eq 'No need to update') {
} else {
say 'Error during check: '.$jres[1];
}
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;
print "\n" if(scalar(@toupd));
say 'Unpacking updates ' if(scalar(keys %tounpack));
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'}.' from version '.$addons->[$id]->{'version'}.' to '.$version;
$addons->[$id]->{'version'} = $version;
} else {
say 'Unpacking failed for '.$unpacking;
}
}
($ret,$msg) = pcurse::save_config($conf->{'addons'},$addons);
print $msg."\n" unless($ret);
close $lf;