release 1.5
[spider.git] / perl / DXCron.pm
1 #
2 # module to timed tasks
3 #
4 # Copyright (c) 1998 - Dirk Koopman G1TLH
5 #
6 # $Id$
7 #
8
9 package DXCron;
10
11 use DXVars;
12 use DXUtil;
13 use DXM;
14 use DXDebug;
15 use FileHandle;
16 use Carp;
17
18 use strict;
19
20 use vars qw{@crontab $mtime $lasttime};
21
22 @crontab = ();
23 $mtime = 0;
24 $lasttime = 0;
25
26
27 my $fn = "$main::cmd/crontab";
28 my $localfn = "$main::local_cmd/crontab";
29
30 # cron initialisation / reading in cronjobs
31 sub init
32 {
33         my $t;
34         
35         if (-e $localfn) {
36                 if (-e $localfn && ($t = -M $localfn) != $mtime) {
37                         cread($localfn);
38                         $mtime = $t;
39                 }
40                 return;
41         }
42         if (($t = -M $fn) != $mtime) {
43                 cread($fn);
44                 $mtime = $t;
45         }
46 }
47
48 # read in a cron file
49 sub cread
50 {
51         my $fn = shift;
52         my $fh = new FileHandle;
53         my $line = 0;
54
55         dbg('cron', "reading $fn\n");
56         open($fh, $fn) or confess("can't open $fn $!");
57         @crontab = ();           # clear out the old stuff
58         while (<$fh>) {
59                 $line++;
60                 
61                 next if /^\s*#/o or /^\s*$/o;
62                 my ($min, $hour, $mday, $month, $wday, $cmd) = /^\s*(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(.+)$/o;
63                 next if !$min;
64                 my $ref = bless {};
65                 my $err;
66                 
67                 $err |= parse($ref, 'min', $min, 0, 60);
68                 $err |= parse($ref, 'hour', $hour, 0, 23);
69                 $err |= parse($ref, 'mday', $mday, 1, 31);
70                 $err |= parse($ref, 'month', $month, 1, 12, "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec");
71                 $err |= parse($ref, 'wday', $wday, 0, 6, "sun", "mon", "tue", "wed", "thu", "fri", "sat");
72                 if (!$err) {
73                         $ref->{cmd} = $cmd;
74                         push @crontab, $ref;
75                         dbg('cron', "adding $_\n");
76                 } else {
77                         dbg('cron', "error on line $line '$_'\n");
78                 }
79         }
80         close($fh);
81 }
82
83 sub parse
84 {
85         my $ref = shift;
86         my $sort = shift;
87         my $val = shift;
88         my $low = shift;
89         my $high = shift;
90         my @req;
91
92         # handle '*' values
93         if ($val eq '*') {
94                 $ref->{$sort} = 0;
95                 return 0;
96         }
97
98         # handle comma delimited values
99         my @comma = split /,/o, $val;
100         for (@comma) {
101                 my @minus = split /-/o;
102                 if (@minus == 2) {
103                         return 1 if $minus[0] < $low || $minus[0] > $high;
104                         return 1 if $minus[1] < $low || $minus[1] > $high;
105                         my $i;
106                         for ($i = $minus[0]; $i <= $minus[1]; ++$i) {
107                                 push @req, 0 + $i; 
108                         }
109                 } else {
110                         return 1 if $_ < $low || $_ > $high;
111                         push @req, 0 + $_;
112                 }
113         }
114         return 0;
115 }
116
117 # process the cronjobs
118 sub process
119 {
120         my $now = $main::systime;
121         
122         if ($now - $lasttime >= 60) {
123                 my ($sec, $min, $hour, $mday, $mon, $wday) = (gmtime($main::systime))[0-4,6];
124                 
125                 $lasttime = $now;
126         }
127 }
128
129 1;
130 __END__