]>
iEval git - gruntmaster-daemon.git/blob - Gruntmaster/Daemon.pm
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 qw
/job_inmeta job_problem problem_meta set_job_daemon set_job_result set_job_result_text set_job_results SUBSCRIBE WAIT_FOR_MESSAGES/;
12 use Gruntmaster
::Page
::Log
;
14 use File
::Basename qw
/fileparse/;
15 use File
::Slurp qw
/write_file/;
16 use File
::Spec
::Functions qw
/devnull/;
17 use File
::Temp qw
/tempdir/;
19 use IPC
::Open3 qw
/open3/;
20 use Sys
::Hostname qw
/hostname/;
21 use Time
::HiRes qw
/time/;
23 use YAML
::Any qw
/LoadFile DumpFile/;
24 use Log
::Log4perl qw
/get_logger/;
26 ##################################################
29 my ($type, $sub, $name) = @_;
31 return unless $name =~ /^\w+$/;
33 my $pkg = __PACKAGE__
. "::${type}::${name}";
34 eval "require $pkg" or get_logger
->warn("Error while requiring $pkg: $@");
39 my ($type, $sub, $name) = @_;
41 safe_can_nodie
@_ or get_logger
->logdie("No such \l$type: '$name'");
45 my ($name, $format) = @_;
46 my $basename = fileparse
$name, qr/\.[^.]*/;
47 get_logger
->trace("Preparing file $name...");
49 open my $devnull, devnull
;
50 open my $errors, '>>compile-error';
51 my $ret = open3
$devnull, $errors, undef, 'gruntmaster-compile', $format => $basename, $name;
55 die 'Compile error' if $?
61 for my $file (values $meta->{files
}) {
62 my ($format, $name, $content) = @
{$file}{qw
/format name content/};
64 $file->{run
} = mkrun
($format);
65 write_file
$name, $content;
66 prepare
$name, $format;
74 my @full_results = ();
77 $meta = job_inmeta
$job;
78 if (job_problem
$job) {
79 my $pbmeta = problem_meta job_problem
$job;
80 my %files = %{$meta->{files
}};
81 $meta = {%$meta, %$pbmeta};
82 $meta->{files
} = {%files, %{$pbmeta->{files
}}} if exists $pbmeta->{files
};
87 my ($files, $generator, $runner, $judge, $testcnt) = map { $meta->{$_} or die "Required parameter missing: $_"} qw
/files generator runner judge testcnt/;
89 $generator = safe_can Generator
=> generate
=> $generator;
90 $runner = safe_can Runner
=> run
=> $runner;
91 $judge = safe_can Judge
=> judge
=> $judge;
93 for my $test (1 .. $testcnt) {
94 my $start_time = time;
97 $generator->($test, $meta);
98 $result = $runner->($test, $meta);
101 unless (ref $result) {
103 $result = [ERR
, $result];
108 get_logger
->trace("Test $test result is " . $result->[1]);
109 push @full_results, {id
=> $test, result
=> $result->[0], result_text
=> $result->[1], time => time - $start_time}
111 get_logger
->trace("Test $test result is $result");
112 push @full_results, {id
=> $test, result
=> 0, result_text
=> $result, time => time - $start_time}
114 push @results, $result;
115 last if $meta->{judge
} eq 'Absolute' && ref $result
118 my %results = $judge->(@results);
119 $meta->{$_} = $results{$_} for keys %results;
123 $meta->{result
} = -1;
124 $meta->{result_text
} = $_;
127 get_logger
->info("Job result: " . $meta->{result_text
});
128 set_job_result
$job, $meta->{result
};
129 set_job_result_text
$job, $meta->{result_text
};
130 set_job_results
$job, \
@full_results if scalar @full_results;
132 my $log = $meta->{contest
} ?
"ct/$meta->{contest}/log" : 'log';
133 PUBLISH gensrc
=> $job;
134 PUBLISH genpage
=> "$log/job/$job.html";
135 PUBLISH genpage
=> "$log/index.html";
136 my $page = ($job + Gruntmaster
::Page
::Log
::PAGE_SIZE
- 1) / Gruntmaster
::Page
::Log
::PAGE_SIZE
;
137 PUBLISH genpage
=> "$log/$page.html"
142 get_logger
->debug("Taking job $job...");
143 if (set_job_daemon
$job, hostname
. ":$$") {
144 get_logger
->debug("Succesfully taken job $job");
146 get_logger
->debug("Job $job done");
148 get_logger
->debug("Job $job already taken");
153 Log
::Log4perl
->init('/etc/gruntmasterd/gruntmasterd-log.conf');
154 get_logger
->info("gruntmasterd $VERSION started");
155 chdir tempdir
'gruntmasterd.XXXX', CLEANUP
=> 1, TMPDIR
=> 1;
156 SUBSCRIBE jobs
=> \
&got_job
;
157 WAIT_FOR_MESSAGES
86400 while 1
162 # Below is stub documentation for your module. You'd better edit it!
166 Gruntmaster::Daemon - Perl extension for blah blah blah
170 use Gruntmaster::Daemon;
175 Stub documentation for Gruntmaster::Daemon, created by h2xs. It looks like the
176 author of the extension was negligent enough to leave the stub
184 Mention other useful documentation such as the documentation of
185 related modules or operating system documentation (such as man pages
186 in UNIX), or any relevant external documentation such as RFCs or
189 If you have a mailing list set up for your module, mention it here.
191 If you have a web site set up for your module, mention it here.
195 Marius Gavrilescu, E<lt>marius@E<gt>
197 =head1 COPYRIGHT AND LICENSE
199 Copyright (C) 2013 by Marius Gavrilescu
201 This library is free software; you can redistribute it and/or modify
202 it under the same terms as Perl itself, either Perl version 5.18.1 or,
203 at your option, any later version of Perl 5 you may have available.
This page took 0.067457 seconds and 4 git commands to generate.