/[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.3 by dpavlin, Fri Oct 3 16:40:00 2003 UTC revision 1.6 by dpavlin, Sun Oct 5 22:26:54 2003 UTC
# 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 126  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          # calculate offset -- that is number of seconds since midnight
134          my @lt = localtime($time);          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          my $offset = $lt[2];    # hour
140          $offset *= 60;          # convert to minutes          $offset *= 60;          # convert to minutes
141          $offset += $lt[1];      # minutes          $offset += $lt[1];      # minutes
142          $offset *= 60;          # convert to seconds          $offset *= 60;          # convert to seconds
143          $offset += $lt[0];          $offset += $lt[0];
144    
         # check if day falls into dayMask  
         return 0 if (! $self->_dayOk($lt[6]) );  
   
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: $offset\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 ) {          if ( $end > $start ) {
153                  if ($offset < $start) {                  if ($offset < $start) {
# Line 172  sub uptime { Line 175  sub uptime {
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            }
227                    
228            return $s;
229    }
230    
231    #
232  # this auxillary function will pretty-format interval in [days]d hh:mm:ss  # this auxillary function will pretty-format interval in [days]d hh:mm:ss
233  #  #
234    
# Line 193  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 239  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    

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

  ViewVC Help
Powered by ViewVC 1.1.26