use strict;
use warnings;
-our $VERSION = '5999.000_003';
+our $VERSION = '5999.000_004';
use Gruntmaster::Daemon::Constants qw/ERR/;
-use Gruntmaster::Daemon::Format qw/prepare_files/;
-use Gruntmaster::Data;
+use Gruntmaster::Daemon::Format qw/prepare_files stopvms/;
use File::Basename qw/fileparse/;
use File::Temp qw/tempdir/;
use Time::HiRes qw/time/;
use Try::Tiny;
use Log::Log4perl qw/get_logger/;
-use LWP::UserAgent;
use constant PAGE_SIZE => 10;
use constant FORMAT_EXTENSION => {
C => 'c',
CPP => 'cpp',
+ GCCGO => 'go',
+ GOLANG => 'go',
+ HASKELL => 'hs',
MONO => 'cs',
JAVA => 'java',
PASCAL => 'pas',
##################################################
+sub purge;
+
my $db;
-my $ua = LWP::UserAgent->new;
-my @purge_hosts = exists $ENV{PURGE_HOSTS} ? split ' ', $ENV{PURGE_HOSTS} : ();
sub safe_can_nodie {
my ($type, $sub, $name) = @_;
- return unless $name =~ /^\w+$/;
- no strict 'refs';
+ return unless $name =~ /^\w+$/s;
my $pkg = __PACKAGE__ . "::${type}::${name}";
eval "require $pkg" or get_logger->warn("Error while requiring $pkg: $@");
$pkg->can($sub);
safe_can_nodie @_ or get_logger->logdie("No such \l$type: '$name'");
}
-sub purge {
- get_logger->trace("Purging $_[0]");
- for my $host (@purge_hosts) {
- my $req = HTTP::Request->new(PURGE => "http://$host$_[0]");
- $ua->request($req)
- }
-}
-
sub process{
my ($job, $jobr) = @_;
prepare_files $meta;
chomp $errors;
- my ($files, $generator, $runner, $judge, $testcnt) = map { $meta->{$_} or die "Required parameter missing: $_"} qw/files generator runner judge testcnt/;
+ my ($files, $generator, $runner, $judge, $testcnt) = map { $meta->{$_} or die "Required parameter missing: $_\n"} qw/files generator runner judge testcnt/;
$generator = safe_can Generator => generate => $generator;
$runner = safe_can Runner => run => $runner;
$meta->{$_} = $results{$_} for keys %results;
$meta->{results} = \@full_results
} catch {
- s,(.*) at .*,$1,;
+ s/(.*) at .*/$1/s;
chomp;
$meta->{result} = -1;
$meta->{result_text} = $_;
};
+ stopvms;
- get_logger->info("Job result: " . $meta->{result_text});
+ get_logger->info('Job result: ' . $meta->{result_text});
return unless $jobr;
$jobr->update({
result => $meta->{result},
result_text => $meta->{result_text},
- results => encode_json $meta->{results},
+ ($meta->{results} ? (results => encode_json $meta->{results}) : ()),
$errors ? (errors => $errors) : ()
});
- my $log = $jobr->contest ? 'ct/' . $jobr->contest->id . '/log' : 'log';
- my $page = int (($job + PAGE_SIZE - 1) / PAGE_SIZE);
-
- purge "/$log/$job";
- purge "/$log/";
- purge "/$log/st";
- purge "/$log/page/$_" for $page - 1, $page, $page + 1;
+ my $solved = $meta->{result} ? 0 : 1;
+ my $status = $db->problem_statuses->find($jobr->owner, $jobr->problem);
+ $db->problem_statuses->update_or_create({
+ problem => $jobr->problem,
+ owner => $jobr->owner,
+ job => $jobr->id,
+ solved => $solved});
+
+ purge '/log/';
+ purge "/log/$job";
+ purge '/st/' . $jobr->contest if $jobr->contest;
+ purge '/us/';
+ purge '/us/' . $jobr->owner;
}
sub got_job{
}
sub run{
+ warn "No GRUNTMASTER_VM environment variable. Running without a VM is a security risk.\n" unless $ENV{GRUNTMASTER_VM};
+ require Gruntmaster::Data;
+ Gruntmaster::Data->import;
$db = Gruntmaster::Data->connect('dbi:Pg:');
Log::Log4perl->init('/etc/gruntmasterd/gruntmasterd-log.conf');
get_logger->info("gruntmasterd $VERSION started");