]> mj.ucw.cz Git - bex.git/blob - lib/BEX/Job.pm
bls: Added a new utility for listing known machines and group
[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 check_id($) {
14         my ($id) = @_;
15         return $id =~ /^([0-9A-Za-z-]+)$/;
16 }
17
18 sub new($;$) {
19         my ($class, $id) = @_;
20         my $job = { };
21         bless $job;
22         if (defined $id) {
23                 check_id($id) or die "Invalid job ID";
24                 $job->{'ID'} = $id;
25         } else {
26                 $job_cnt++;
27                 $job->{'ID'} = POSIX::strftime("%Y%m%d-%H%M%S-$$-$job_cnt", localtime);
28         }
29         $job->{'Subject'} = '';
30         return $job;
31 }
32
33 sub new_from_file($$;$) {
34         my ($class, $file, $header_only) = @_;
35         my $job = { };
36         open T, '<', $file or die "Cannot open $file: $!";
37         while (<T>) {
38                 chomp;
39                 /^$/ and last;
40                 /^([A-Z][A-Za-z0-9-]*):\s*(.*)/ or die "Cannot load $file: Header syntax error";
41                 !defined $job->{$1} or die "Cannot load $file: Header $1 re-defined";
42                 $job->{$1} = $2;
43         }
44         if (!$header_only) {
45                 my @cmds = <T>;
46                 $job->{'body'} = join("", @cmds);
47         }
48         close T;
49         $job->{'Subject'} //= '';
50         $job->{'ID'} or die "Cannot load $file: Missing ID";
51         check_id($job->{'ID'}) or die "Cannot load $file: Invalid ID syntax";
52         return bless $job;
53 }
54
55 sub id($) {
56         return $_[0]->{'ID'};
57 }
58
59 sub name($) {
60         my ($job) = @_;
61         my $name = $job->{'ID'};
62         my $subj = $job->{'Subject'} // "";
63         $name .= " ($subj)" if $subj !~ /^\s*$/;
64         return $name;
65 }
66
67 sub attr($$;$) {
68         my ($job, $attr, $val) = @_;
69         $job->{$attr} = $val if defined $val;
70         return $job->{$attr};
71 }
72
73 sub dump($) {
74         my ($job) = @_;
75         for my $k (sort keys %$job) {
76                 print "$k: ", $job->{$k}, "\n";
77         }
78 }
79
80 sub save($;$) {
81         my ($job, $fn) = @_;
82         -d "tmp" or mkdir "tmp" or die "Cannot create directory tmp: $!";
83         $fn //= 'tmp/' . $job->id;
84         open T, '>', $fn or die "Cannot create $fn: $!";
85         for my $k (sort grep { /^[A-Z]/ } keys %$job) {
86                 print T "$k: ", $job->{$k}, "\n";
87         }
88         print T "\n";
89         print T $job->{'body'} if defined $job->{'body'};
90         close T;
91         return $fn;
92 }
93
94 42;