]>
iEval git - gruntmaster-daemon.git/blob - lib/Gruntmaster/Daemon.pm
1d8cb8b41c80b18cebba926f702ca670e05e6c45
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
::Page qw
/generate/;
12 use Gruntmaster
::Data qw
/job_inmeta job_problem problem_meta set_job_daemon set_job_result set_job_result_text set_job_results/;
15 use File
::Basename qw
/fileparse/;
16 use File
::Slurp qw
/write_file/;
17 use File
::Spec
::Functions qw
/devnull/;
18 use File
::Temp qw
/tempdir/;
20 use IPC
::Open3 qw
/open3/;
22 use Sys
::Hostname qw
/hostname/;
23 use Time
::HiRes qw
/time/;
25 use YAML
::Any qw
/LoadFile DumpFile/;
26 use Log
::Log4perl qw
/get_logger/;
27 use Data
::Dumper qw
/Dumper/;
29 ##################################################
32 my ($type, $sub, $name) = @_;
34 return unless $name =~ /^\w+$/;
36 my $pkg = __PACKAGE__
. "::${type}::${name}";
37 eval "require $pkg" or get_logger
->warn("Error while requiring $pkg: $@");
42 my ($type, $sub, $name) = @_;
44 safe_can_nodie
@_ or get_logger
->logdie("No such \l$type: '$name'");
48 my ($name, $format) = @_;
49 my $basename = fileparse
$name, qr/\.[^.]*/;
50 get_logger
->trace("Preparing file $name...");
52 open my $devnull, devnull
;
53 open my $errors, '>>compile-error';
54 my $ret = open3
$devnull, $errors, undef, 'gruntmaster-compile', $format => $basename, $name;
58 die 'Compile error' if $?
64 for my $file (values $meta->{files
}) {
65 my ($format, $name, $content) = @
{$file}{qw
/format name content/};
67 $file->{run
} = mkrun
($format);
68 write_file
$name, $content;
69 prepare
$name, $format;
81 my @full_results = ();
84 $meta = job_inmeta
$job;
85 if (job_problem
$job) {
86 my $pbmeta = problem_meta job_problem
$job;
87 my %files = %{$meta->{files
}};
88 $meta = {%$meta, %$pbmeta};
89 $meta->{files
} = {%files, %{$pbmeta->{files
}}} if exists $pbmeta->{files
};
95 my ($files, $generator, $runner, $judge, $testcnt) = map { $meta->{$_} or die "Required parameter missing: $_"} qw
/files generator runner judge testcnt/;
97 $generator = safe_can Generator
=> generate
=> $generator;
98 $runner = safe_can Runner
=> run
=> $runner;
99 $judge = safe_can Judge
=> judge
=> $judge;
101 for my $test (1 .. $testcnt) {
102 my $start_time = time;
105 $generator->($test, $meta);
106 $result = $runner->($test, $meta);
109 unless (ref $result) {
111 $result = [ERR
, $result];
116 get_logger
->trace("Test $test result is " . $result->[1]);
117 push @full_results, {id
=> $test, result
=> $result->[0], result_text
=> $result->[1], time => time - $start_time}
119 get_logger
->trace("Test $test result is $result");
120 push @full_results, {id
=> $test, result
=> 0, result_text
=> $result, time => time - $start_time}
122 push @results, $result;
123 last if $meta->{judge
} eq 'Absolute' && ref $result
126 my %results = $judge->(@results);
127 $meta->{$_} = $results{$_} for keys %results;
131 $meta->{result
} = -1;
132 $meta->{result_text
} = $_;
135 get_logger
->info("Job result: " . $meta->{result_text
});
136 set_job_result
$job, $meta->{result
};
137 set_job_result_text
$job, $meta->{result_text
};
138 set_job_results
$job, \
@full_results if scalar @full_results;
141 my $log = $meta->{contest
} ?
"ct/$meta->{contest}/log" : 'log';
142 write_file
"$log/src/$job." . Gruntmaster
::Page
::Log
::FORMAT_EXTENSION
->{$meta->{files
}{prog
}{format
}}, $meta->{files
}{prog
}{content
};
143 generate
"$log/job/$job.html";
144 my $page = ($job + Gruntmaster
::Page
::Log
::PAGE_SIZE
- 1) / Gruntmaster
::Page
::Log
::PAGE_SIZE
;
145 generate
"$log/$page.html"
150 get_logger
->debug("Taking job $job...");
151 if (set_job_daemon
$job, hostname
. ":$$") {
152 get_logger
->debug("Succesfully taken job $job");
154 get_logger
->debug("Job $job done");
156 get_logger
->debug("Job $job already taken");
161 Log
::Log4perl
->init('log.conf');
162 get_logger
->info("gruntmasterd $VERSION started");
163 $tempdir = tempdir
'gruntmasterd.XXXX', CLEANUP
=> 1, TMPDIR
=> 1;
164 my $redis = Redis
->new;
165 $redis->subscribe('jobs', \
&got_job
);
166 $redis->wait_for_messages(0) while 1
171 # Below is stub documentation for your module. You'd better edit it!
175 Gruntmaster::Daemon - Perl extension for blah blah blah
179 use Gruntmaster::Daemon;
184 Stub documentation for Gruntmaster::Daemon, created by h2xs. It looks like the
185 author of the extension was negligent enough to leave the stub
193 Mention other useful documentation such as the documentation of
194 related modules or operating system documentation (such as man pages
195 in UNIX), or any relevant external documentation such as RFCs or
198 If you have a mailing list set up for your module, mention it here.
200 If you have a web site set up for your module, mention it here.
204 Marius Gavrilescu, E<lt>marius@E<gt>
206 =head1 COPYRIGHT AND LICENSE
208 Copyright (C) 2013 by Marius Gavrilescu
210 This library is free software; you can redistribute it and/or modify
211 it under the same terms as Perl itself, either Perl version 5.18.1 or,
212 at your option, any later version of Perl 5 you may have available.
This page took 0.052136 seconds and 4 git commands to generate.