]>
iEval git - gruntmaster-daemon.git/blob - lib/Gruntmaster/Daemon.pm
b5d210de4e4454131f3c3403999268b2e7508a74
1 package Gruntmaster
::Daemon
;
7 our $VERSION = '0.001';
9 use Gruntmaster
::Daemon
::Constants qw
/ERR/;
10 use Gruntmaster
::Daemon
::Format qw
/mkrun/;
11 use Gruntmaster
::Data
;
13 use File
::Basename qw
/fileparse/;
14 use File
::Slurp qw
/write_file/;
15 use File
::Temp qw
/tempdir/;
16 use Sys
::Hostname qw
/hostname/;
17 use Time
::HiRes qw
/time/;
19 use Log
::Log4perl qw
/get_logger/;
21 use constant PAGE_SIZE
=> 10;
23 ##################################################
26 my ($type, $sub, $name) = @_;
28 return unless $name =~ /^\w+$/;
30 my $pkg = __PACKAGE__
. "::${type}::${name}";
31 eval "require $pkg" or get_logger
->warn("Error while requiring $pkg: $@");
36 my ($type, $sub, $name) = @_;
38 safe_can_nodie
@_ or get_logger
->logdie("No such \l$type: '$name'");
42 my ($name, $format) = @_;
44 my $basename = fileparse
$name, qr/\.[^.]*/;
45 get_logger
->trace("Preparing file $name...");
47 $errors .= `gruntmaster-compile $format $basename $name 2>&1`;
49 die 'Compile error' if $?
55 for my $file (values $meta->{files
}) {
56 my ($format, $name, $content) = @
{$file}{qw
/format name content/};
58 $file->{run
} = mkrun
($format);
59 write_file
$name, $content;
60 prepare
$name, $format;
68 my @full_results = ();
72 $meta = job_inmeta
$job;
73 if (job_problem
$job) {
74 my $pbmeta = problem_meta job_problem
$job;
75 my %files = exists $meta->{files
} ?
%{$meta->{files
}} : ();
76 $meta = {%$meta, %$pbmeta};
77 $meta->{files
} = {%files, %{$pbmeta->{files
}}} if exists $pbmeta->{files
};
83 my ($files, $generator, $runner, $judge, $testcnt) = map { $meta->{$_} or die "Required parameter missing: $_"} qw
/files generator runner judge testcnt/;
85 $generator = safe_can Generator
=> generate
=> $generator;
86 $runner = safe_can Runner
=> run
=> $runner;
87 $judge = safe_can Judge
=> judge
=> $judge;
89 for my $test (1 .. $testcnt) {
90 my $start_time = time;
93 $generator->($test, $meta);
94 $result = $runner->($test, $meta);
97 unless (ref $result) {
99 $result = [ERR
, $result];
104 get_logger
->trace("Test $test result is " . $result->[1]);
105 push @full_results, {id
=> $test, result
=> $result->[0], result_text
=> $result->[1], time => time - $start_time}
107 get_logger
->trace("Test $test result is $result");
108 push @full_results, {id
=> $test, result
=> 0, result_text
=> $result, time => time - $start_time}
110 push @results, $result;
111 last if $meta->{judge
} eq 'Absolute' && ref $result
114 my %results = $judge->(@results);
115 $meta->{$_} = $results{$_} for keys %results;
119 $meta->{result
} = -1;
120 $meta->{result_text
} = $_;
123 get_logger
->info("Job result: " . $meta->{result_text
});
124 set_job_result
$job, $meta->{result
};
125 set_job_result_text
$job, $meta->{result_text
};
126 set_job_results
$job, \
@full_results if scalar @full_results;
127 set_job_errors
$job, $errors;
129 my $log = $Gruntmaster::Data
::contest ?
"ct/$Gruntmaster::Data::contest/log" : 'log';
131 PUBLISH gensrc
=> ($Gruntmaster::Data
::contest
// '') . ".$job";
132 PUBLISH genpage
=> "$log/job/$job.html";
133 PUBLISH genpage
=> "$log/index.html";
134 PUBLISH genpage
=> "$log/st.html";
135 my $page = ($job + PAGE_SIZE
- 1) / PAGE_SIZE
;
136 PUBLISH genpage
=> "$log/@{[$page - 1]}.html";
137 PUBLISH genpage
=> "$log/$page.html";
138 PUBLISH genpage
=> "$log/@{[$page + 1]}.html";
142 $_[0] =~ /^(\w*)\.(\d+)$/;
144 local $Gruntmaster::Data
::contest
= $1 if $1;
145 get_logger
->debug("Taking job $job@{[defined $1 ? \" of contest $1\" : '']}...");
146 if (set_job_daemon
$job, hostname
. ":$$") {
147 get_logger
->debug("Succesfully taken job $job");
149 get_logger
->debug("Job $job done");
151 get_logger
->debug("Job $job already taken");
156 Log
::Log4perl
->init('/etc/gruntmasterd/gruntmasterd-log.conf');
157 get_logger
->info("gruntmasterd $VERSION started");
158 chdir tempdir
'gruntmasterd.XXXX', CLEANUP
=> 1, TMPDIR
=> 1;
159 SUBSCRIBE jobs
=> \
&got_job
;
160 WAIT_FOR_MESSAGES
86400 while 1
165 # Below is stub documentation for your module. You'd better edit it!
169 Gruntmaster::Daemon - Perl extension for blah blah blah
173 use Gruntmaster::Daemon;
178 Stub documentation for Gruntmaster::Daemon, created by h2xs. It looks like the
179 author of the extension was negligent enough to leave the stub
187 Mention other useful documentation such as the documentation of
188 related modules or operating system documentation (such as man pages
189 in UNIX), or any relevant external documentation such as RFCs or
192 If you have a mailing list set up for your module, mention it here.
194 If you have a web site set up for your module, mention it here.
198 Marius Gavrilescu, E<lt>marius@E<gt>
200 =head1 COPYRIGHT AND LICENSE
202 Copyright (C) 2013 by Marius Gavrilescu
204 This library is free software; you can redistribute it and/or modify
205 it under the same terms as Perl itself, either Perl version 5.18.1 or,
206 at your option, any later version of Perl 5 you may have available.
This page took 0.05765 seconds and 4 git commands to generate.