]> mj.ucw.cz Git - bex.git/blob - lib/BEX/Job.pm
Bug fixes
[bex.git] / lib / BEX / Job.pm
1 # Batch EXecutor 2.0 -- Jobs
2 # (c) 2011 Martin Mares <mj@ucw.cz>
3
4 use strict;
5 use warnings;
6
7 package BEX::Job;
8
9 use POSIX ();
10
11 our $job_cnt = 0;
12
13 sub new($;$) {
14         my ($class, $id) = @_;
15         my $job = { };
16         bless $job;
17         if (defined $id) {
18                 $job->{'ID'} = $id;
19         } else {
20                 $job_cnt++;
21                 $job->{'ID'} = POSIX::strftime("%Y%m%d-%H%M%S-$$-$job_cnt", localtime);
22         }
23         $job->{'Subject'} = '(no subject)';
24         return $job;
25 }
26
27 sub new_from_file($$;$) {
28         my ($class, $file, $header_only) = @_;
29         my $job = { };
30         open T, '<', $file or die "Cannot open $file: $!";
31         while (<T>) {
32                 chomp;
33                 /^$/ and last;
34                 /^([A-Z][A-Za-z0-9-]*):\s*(.*)/ or die "Cannot load $file: Header syntax error";
35                 !defined $job->{$1} or die "Cannot load $file: Header $1 re-defined";
36                 $job->{$1} = $2;
37         }
38         if (!$header_only) {
39                 my @cmds = <T>;
40                 $job->{'body'} = join("", @cmds);
41         }
42         close T;
43         $job->{'Subject'} //= '?';
44         $job->{'ID'} or die "Cannot load $file: Missing ID";
45         $job->{'ID'} !~ /\.[a-z]+$/ or die "Cannot load $file: Invalid ID syntax";
46         return bless $job;
47 }
48
49 sub id($) {
50         return $_[0]->{'ID'};
51 }
52
53 sub attr($$;$) {
54         my ($job, $attr, $val) = @_;
55         $job->{$attr} = $val if defined $val;
56         return $job->{$attr};
57 }
58
59 sub dump($) {
60         my ($job) = @_;
61         for my $k (sort keys %$job) {
62                 print "$k: ", $job->{$k}, "\n";
63         }
64 }
65
66 sub save($;$) {
67         my ($job, $fn) = @_;
68         -d "tmp" or mkdir "tmp" or die "Cannot create directory tmp: $!";
69         $fn //= 'tmp/' . $job->id;
70         open T, '>', $fn or die "Cannot create $fn: $!";
71         for my $k (sort grep { /^[A-Z]/ } keys %$job) {
72                 print T "$k: ", $job->{$k}, "\n";
73         }
74         print T "\n";
75         print T $job->{'body'} if defined $job->{'body'};
76         close T;
77         return $fn;
78 }
79
80 42;