/[Time-Available]/Available.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /Available.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.2 by dpavlin, Fri Oct 3 15:23:46 2003 UTC revision 1.6 by dpavlin, Sun Oct 5 22:26:54 2003 UTC
# Line 1  Line 1 
1  package Time::Available;  package Time::Available;
2    
3  use 5.008001;  use 5.001;
4  use strict;  use strict;
5  use warnings;  use warnings;
6    
# Line 63  sub new { Line 63  sub new {
63    
64          # calc start and stop seconds          # calc start and stop seconds
65          my ($hh,$mm,$ss) = split(/:/,$self->{ARGS}->{start},3);          my ($hh,$mm,$ss) = split(/:/,$self->{ARGS}->{start},3);
66            print STDERR "new: start time ",$hh||0,":",$mm||0,":",$ss||0,"\n" if ($debug);
67          my $s = $hh * 3600 || die("need at least hour specified for start time");          my $s = $hh * 3600 || die("need at least hour specified for start time");
68          $s += $mm * 60 if ($mm);          $s += $mm * 60 if ($mm);
69          $s += $ss if ($ss);          $s += $ss if ($ss);
# Line 71  sub new { Line 72  sub new {
72          die("need end time") if (! $self->{ARGS}->{end});          die("need end time") if (! $self->{ARGS}->{end});
73    
74          ($hh,$mm,$ss) = split(/:/,$self->{ARGS}->{end},3);          ($hh,$mm,$ss) = split(/:/,$self->{ARGS}->{end},3);
75            print STDERR "new: end time ",$hh||0,":",$mm||0,":",$ss||0,"\n" if ($debug);
76          $s = $hh * 3600 || die("need at least hour specified for end time");          $s = $hh * 3600 || die("need at least hour specified for end time");
77          $s += $mm * 60 if ($mm);          $s += $mm * 60 if ($mm);
78          $self->{end} = $s;          $self->{end} = $s;
# Line 88  sub new { Line 90  sub new {
90  # this sub (originally from Time::Avail) will return if day is applicable  # this sub (originally from Time::Avail) will return if day is applicable
91  #  #
92    
93  sub _dayOk($$) {  sub _dayOk($) {
94            my $self = shift;
95            my $day = shift || return;
96    
97          my( $dayMask, $day ) = @_;      # get parameters          my $dayMask = $self->{dayMask};
98    
99          my $dayOk = 0;          my $dayOk = 0;
100    
# Line 124  sub _dayOk($$) { Line 128  sub _dayOk($$) {
128  sub uptime {  sub uptime {
129          my $self = shift;          my $self = shift;
130    
131          my $time = shift || die "need uptime timestamp to calcualte uptime";          my $time = shift || die "need uptime timestamp to calculate uptime";
132    
133            # calculate offset -- that is number of seconds since midnight
134            my @lt = gmtime($time);
135    
136            # check if day falls into dayMask
137            return 0 if (! $self->_dayOk($lt[6]) );
138    
139            my $offset = $lt[2];    # hour
140            $offset *= 60;          # convert to minutes
141            $offset += $lt[1];      # minutes
142            $offset *= 60;          # convert to seconds
143            $offset += $lt[0];
144    
145          my $s=0;          my $s=0;
146    
147          my $start = $self->{start};          my $start = $self->{start};
148          my $end = $self->{end};          my $end = $self->{end};
149    
150          print STDERR "start: $start end: $end time: $time\n" if ($debug);          print STDERR "start: $start end: $end time: $offset [$lt[2]:$lt[1]:$lt[0]]\n" if ($debug);
151    
152          if( ( $end > $start ) && ( $time < $end ) ) {          if ( $end > $start ) {
153                  if ($time < $start) {                  if ($offset < $start) {
154                          $s = $end - $start;                          $s = $end - $start;
155                  } else {                  } elsif ($offset < $end) {
156                          $s = $end - $time;                          $s = $end - $offset;
157                  }                  }
158          } elsif( $start > $end ) {      # over midnight          } elsif ( $start > $end ) {     # over midnight
159                  if ( $time < $end ) {                  if ( $offset < $end ) {
160                          if ( $time < $start) {                          if ( $offset < $start) {
161                                  $s = SEC_PER_DAY - $start + $end - $time;                                  $s = SEC_PER_DAY - $start + $end - $offset;
162                          } else {                          } else {
163                                  $s = SEC_PER_DAY - $start + $end;                                  $s = SEC_PER_DAY - $start + $end;
164                          }                          }
165                  } else {                  } else {
166                          if ( $time < $start ) {                          if ( $offset < $start ) {
167                                  $s = SEC_PER_DAY - $start;                                  $s = SEC_PER_DAY - $start;
168                          } else {                          } else {
169                                  $s = SEC_PER_DAY - $time;                                  $s = SEC_PER_DAY - $offset;
170                            }
171                    }
172            }
173                    
174            return $s;
175    }
176    
177    #
178    # this will return number of seconds that service is available if passed
179    # downtime of service
180    #
181    
182    sub downtime {
183            my $self = shift;
184    
185            my $time = shift || die "need downtime timestamp to calculate uptime";
186    
187            # calculate offset -- that is number of seconds since midnight
188            my @lt = gmtime($time);
189    
190            # check if day falls into dayMask
191            return 0 if (! $self->_dayOk($lt[6]) );
192    
193            my $offset = $lt[2];    # hour
194            $offset *= 60;          # convert to minutes
195            $offset += $lt[1];      # minutes
196            $offset *= 60;          # convert to seconds
197            $offset += $lt[0];
198    
199            my $s=0;
200    
201            my $start = $self->{start};
202            my $end = $self->{end};
203    
204            print STDERR "start: $start end: $end time: $offset [$lt[2]:$lt[1]:$lt[0]]\n" if ($debug);
205    
206            if ( $end > $start ) {
207                    if ($offset > $start && $offset <= $end) {
208                            $s = $end - $offset;
209                    } elsif ($offset < $start) {
210                            $s = $end - $start;
211                    }
212            } elsif ( $start > $end ) {     # over midnight
213                    if ( $offset < $end ) {
214                            if ( $offset < $start) {
215                                    $s = $offset;
216                            } else {
217                                    $s = 0;
218                            }
219                    } else {
220                            if ( $offset < $start ) {
221                                    $s = SEC_PER_DAY - $end;
222                            } else {
223                                    $s = SEC_PER_DAY - $end + $start - $offset;
224                          }                          }
225                  }                  }
226          }          }
# Line 180  sub fmt_interval { Line 250  sub fmt_interval {
250          return $out;          return $out;
251  }  }
252    
253    #
254    # this function will calculate uptime for some interval
255    #
256    
257    sub interval {
258            my $self = shift;
259            my $from = shift || die "need start time for interval";
260            my $to = shift || die "need end time for interval";
261    
262            print STDERR "from:\t$from\t",scalar gmtime($from),"\n" if ($debug);
263            print STDERR "to:\t$to\t",scalar gmtime($to),"\n" if ($debug);
264    
265            my $total = 0;
266    
267            # calc first day availability
268            print STDERR "t:\t$from\t",scalar gmtime($from),"\n" if ($debug);
269            $total += $self->uptime($from);
270    
271            print STDERR "total: $total (first)\n" if ($debug);
272    
273            # add all whole days
274    
275            my $sec_in_day = $self->sec_in_interval;
276            my $day = 86400;        # 24*60*60
277    
278            my $loop_start_time = int($from/$day)*$day + $day;
279            my $loop_end_time = int($to/$day)*$day - $day;
280    
281            print STDERR "loop (start - end): $loop_start_time - $loop_end_time\n" if ($debug);
282    
283            for (my $t = $loop_start_time; $t <= $loop_end_time; $t += $day) {
284                    print STDERR "t:\t$t\t",scalar gmtime($t),"\n" if ($debug);
285                    $total += $sec_in_day if ($self->day_in_interval($t));
286                    print STDERR "total: $total (loop)\n" if ($debug);
287            }
288    
289            # add rest of last day
290            print STDERR "t:\t$to\t",scalar gmtime($to),"\n" if ($debug);
291    
292            $total -= $self->downtime($to);
293            print STDERR "total: $total (final)\n" if ($debug);
294    
295            return $total;
296    }
297    
298    #
299    # this function will check if day falls into interval
300    #
301    
302    sub day_in_interval {
303            my $self = shift;
304    
305            my $time = shift || die "need timestamp to check if day is in interval";
306    
307            my @lt = gmtime($time);
308            return $self->_dayOk($lt[6]);
309    }
310    
311    #
312    # return seconds in defined interval
313    #
314    
315    sub sec_in_interval {
316            my $self = shift;
317    
318            # over midnight?
319            if ($self->{start} > $self->{end}) {
320                    return(86400 - $self->{start} + $self->{end});
321            } else {
322                    return($self->{end} - $self->{start});
323            }
324    }
325    
326  1;  1;
327  __END__  __END__
328    
# Line 226  the following dayMask constants: Line 369  the following dayMask constants:
369  =over 4  =over 4
370    
371  =item *  =item *
372  Time::Avail::DAY_MONDAY  Time::Available::DAY_MONDAY
373    
374  =item *  =item *
375  Time::Avail::DAY_TUESDAY  Time::Available::DAY_TUESDAY
376    
377  =item *  =item *
378  Time::Avail::DAY_WEDNESDAY  Time::Available::DAY_WEDNESDAY
379    
380  =item *  =item *
381  Time::Avail::DAY_THURSDAY  Time::Available::DAY_THURSDAY
382    
383  =item *  =item *
384  Time::Avail::DAY_FRIDAY  Time::Available::DAY_FRIDAY
385    
386  =item *  =item *
387  Time::Avail::DAY_SATURDAY  Time::Available::DAY_SATURDAY
388    
389  =item *  =item *
390  Time::Avail::DAY_SUNDAY  Time::Available::DAY_SUNDAY
391    
392  =item *  =item *
393  Time::Avail::DAY_WEEKDAY  Time::Available::DAY_WEEKDAY
394    
395  =item *  =item *
396  Time::Avail::DAY_WEEKEND  Time::Available::DAY_WEEKEND
397    
398  =item *  =item *
399  Time::Avail::DAY_EVERYDAY  Time::Available::DAY_EVERYDAY
400    
401  =back  =back
402    
# Line 300  calculating of availability of some inte Line 443  calculating of availability of some inte
443  this module was born.  this module was born.
444    
445  More information about this module might be found on  More information about this module might be found on
446  http://www.rot13.org/~dpavlin/perl.html#cpan  http://www.rot13.org/~dpavlin/projects.html#cpan
447    
448  =head1 AUTHOR  =head1 AUTHOR
449    

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.6

  ViewVC Help
Powered by ViewVC 1.1.26