8 |
|
|
9 |
use strict; |
use strict; |
10 |
use POSIX qw(strftime); |
use POSIX qw(strftime); |
11 |
use CGI qw/:standard *table/; |
use CGI; |
12 |
use CGI::Carp qw(fatalsToBrowser); |
#use CGI::Carp qw(fatalsToBrowser); |
13 |
use Data::Sorting qw(:arrays); |
use Data::Sorting qw(:arrays); |
14 |
use Time::ParseDate; |
use Time::ParseDate; |
15 |
use Time::Available; |
use Time::Available; |
194 |
|
|
195 |
# generate output |
# generate output |
196 |
# |
# |
197 |
print header,start_html("mon availiability report"); |
print $q->header,$q->start_html("mon availiability report"); |
198 |
|
|
199 |
# make some filters |
# make some filters |
200 |
# |
# |
201 |
|
|
202 |
print start_form, |
print $q->start_form,' |
203 |
start_table({-border=>0,-cellspacing=>0,-cellpadding=>0}), |
<table border=0 cellspacing=0 cellpadding=0> |
204 |
Tr(td( |
<tr><td> |
205 |
em("Show just service/group:"),br, |
<em>Show just service/group:</em><br> |
206 |
checkbox_group(-name=>'sg_filter', |
',$q->checkbox_group(-name=>'sg_filter', |
207 |
-values=>[keys %$sg_filter], |
-values=>[keys %$sg_filter], |
208 |
-default=>[keys %$sg_filter], |
-default=>[keys %$sg_filter], |
209 |
-linebreak=>'true', |
-linebreak=>'true', |
210 |
), |
),' |
211 |
),td( |
</td><td> |
212 |
em("Other options:"),br, |
<em>Other options:</em><br>', |
213 |
$q->checkbox(-name=>'rep_reset',-checked=>0, |
$q->checkbox(-name=>'rep_reset',-checked=>0, |
214 |
-label=>"show repeated failures on same service as individual failures"), |
-label=>"show repeated failures on same service as individual failures"),'<br>', |
|
br, |
|
215 |
$q->checkbox(-name=>'print_orphans',-checked=>0, |
$q->checkbox(-name=>'print_orphans',-checked=>0, |
216 |
-label=>"show records which are not complete in this interval"), |
-label=>"show records which are not complete in this interval"),'<br>', |
|
br, |
|
217 |
$q->checkbox(-name=>'use_date_limit',-checked=>1, |
$q->checkbox(-name=>'use_date_limit',-checked=>1, |
218 |
-label=>"use date limit from:"), |
-label=>"use date limit from:"), |
219 |
$q->textfield(-name=>'from_date',-size=>20,-default=>$from_date), |
$q->textfield(-name=>'from_date',-size=>20,-default=>$from_date),' to: ', |
220 |
" to: ", |
$q->textfield(-name=>'to_date',-size=>20,-default=>$to_date),' |
221 |
$q->textfield(-name=>'to_date',-size=>20,-default=>$to_date), |
<small>Using <a href="http://search.cpan.org/search?mode=module&query=Time::ParseDate">Time::ParseDate</a></small> |
222 |
small('Using <a href="http://search.cpan.org/search?mode=module&query=Time::ParseDate">Time::ParseDate</a>'), |
<br> |
223 |
br, |
',$q->checkbox(-name=>'use_time_limit',-checked=>1, -value=>'on', |
|
$q->checkbox(-name=>'use_time_limit',-checked=>1, -value=>'on', |
|
224 |
-label=>"use time limit for each day:"), |
-label=>"use time limit for each day:"), |
225 |
$q->textfield(-name=>'from_time_interval',-size=>8,-default=>$from_time_interval), |
$q->textfield(-name=>'from_time_interval',-size=>8,-default=>$from_time_interval),' to: ', |
|
" to: ", |
|
226 |
$q->textfield(-name=>'to_time_interval',-size=>8,-default=>$to_time_interval), |
$q->textfield(-name=>'to_time_interval',-size=>8,-default=>$to_time_interval), |
227 |
br,"Days: ", |
'<br>Days: ', |
228 |
$q->checkbox_group(-name=>'day_interval', |
$q->checkbox_group(-name=>'day_interval', |
229 |
-values=>[ sort { $a <=> $b } keys %days ], |
-values=>[ sort { $a <=> $b } keys %days ], |
230 |
-labels=>\%days, |
-labels=>\%days, |
235 |
Time::Available::DAY_THURSDAY, |
Time::Available::DAY_THURSDAY, |
236 |
Time::Available::DAY_FRIDAY, |
Time::Available::DAY_FRIDAY, |
237 |
] |
] |
238 |
), |
), |
239 |
$q->submit(-name=>'show',-value=>'Show report'), |
$q->submit(-name=>'show',-value=>'Show report'),' |
240 |
)),end_table, |
</td></tr> |
241 |
end_form; |
</table> |
242 |
|
',$q->end_form; |
243 |
|
|
244 |
|
# bail out of no data |
245 |
|
if ($data && scalar @$data < 1) { |
246 |
|
print $q->end_html; |
247 |
|
exit; |
248 |
|
} |
249 |
|
|
250 |
# dump report |
# dump report |
251 |
# |
# |
283 |
# |
# |
284 |
my @sorted = sorted_array( @$data, @sort_rules ); |
my @sorted = sorted_array( @$data, @sort_rules ); |
285 |
|
|
286 |
print "-- sort: ",Dumper(@sort_rules)," (data: ".@$data." sorted: ".@sorted.") --\n",br,"-- dayMask: $dayMask --\n",br,"-- cache_key: $cache_key --\n",br if ($debug); |
print "-- sort: ",Dumper(@sort_rules)," (data: ".@$data." sorted: ".@sorted.") --\n<br>-- dayMask: $dayMask --\n<br>-- cache_key: $cache_key --\n<br>" if ($debug); |
|
|
|
|
print start_table({-border=>1,-cellspacing=>0,-cellpadding=>2,-width=>'100%'}); |
|
287 |
|
|
288 |
print Tr( |
print '<table border=1 cellspacing=0 cellpadding=2 width="100%"> |
289 |
th("group/service"), |
<tr> |
290 |
th({-bgcolor=>'#f0f0f0'},'<nobr>'. |
<th>group/service</th><th bgcolor="#f0f0f0"><nobr>', |
291 |
&sort_link($q,'from','u').' from '. |
&sort_link($q,'from','u'),' from ',&sort_link($q,'from','d'),'</nobr>'; |
292 |
&sort_link($q,'from','d').'</nobr>', |
print '<br>',$from_html if ($from_html); |
293 |
br,$from_html |
print '</th><th><nobr>', |
294 |
), |
&sort_link($q,'to','u'),' to ',&sort_link($q,'to','d'),'</nobr>'; |
295 |
th( '<nobr>'. |
print '<br>',$to_html if ($to_html); |
296 |
&sort_link($q,'to','u').' to '. |
print '</th><th bgcolor="#e0e0e0"><nobr>', |
297 |
&sort_link($q,'to','d').'</nobr>', |
&sort_link($q,'dur','u'),' duration ',&sort_link($q,'dur','d'),'</nobr> |
298 |
br,$to_html |
</th><th>description</th> |
299 |
), |
</tr>'; |
|
th({-bgcolor=>'#e0e0e0'},'<nobr>'. |
|
|
&sort_link($q,'dur','u').' duration '. |
|
|
&sort_link($q,'dur','d').'</nobr>' |
|
|
), |
|
|
th("description") |
|
|
) if (scalar @sorted > 0); |
|
300 |
|
|
301 |
my $downtime; # total downtime |
my $downtime; # total downtime |
302 |
my $downinterval; # total downtime in time interval |
my $downinterval; # total downtime in time interval |
320 |
} |
} |
321 |
$sg_count->{$row->{sg}}++; |
$sg_count->{$row->{sg}}++; |
322 |
|
|
323 |
print Tr( |
print '<tr> |
324 |
td({-align=>'left',-valign=>'center'},$row->{sg}), |
<td align="left" valign="center">',$row->{sg},'</td> |
325 |
td({-align=>'right',-bgcolor=>'#f0f0f0'},$from), |
<td align="right" bgcolor="#f0f0f0">',$from,'</td> |
326 |
td({-align=>'right'},d($row->{to})), |
<td align="right">',d($row->{to}),'</td> |
327 |
td({-align=>'center',-bgcolor=>'#e0e0e0'},$dur), |
<td align="center" bgcolor="#e0e0e0">',$dur,'</td> |
328 |
td({-align=>'left'},$row->{desc}), |
<td align="left">',$row->{desc},'</td> |
329 |
),"\n"; |
</tr>'; |
330 |
} |
} |
331 |
|
|
332 |
# dump totals |
# dump totals |
333 |
# |
# |
334 |
|
|
335 |
|
my $dur; |
336 |
foreach my $sg (keys %$downtime) { |
foreach my $sg (keys %$downtime) { |
|
my $dur; |
|
337 |
if ($downinterval->{$sg}) { |
if ($downinterval->{$sg}) { |
338 |
$dur=dur($downinterval->{$sg})."<br><nobr><small>∑ ".dur($downtime->{$sg})."</small></nobr>"; |
$dur=dur($downinterval->{$sg})."<br><nobr><small>∑ ".dur($downtime->{$sg})."</small></nobr>"; |
339 |
} else { |
} else { |
340 |
$dur=dur($downtime->{$sg}); |
$dur=dur($downtime->{$sg}); |
341 |
} |
} |
342 |
print Tr(td({-colspan=>3,-align=>'right'},"total for $sg:"), |
print '<tr><td colspan=3 align="right">total for ',$sg,'</td> |
343 |
td({-bgcolor=>'#e0e0e0',-align=>'right'},$dur), |
<td bgcolor="#e0e0e0" align="right">',$dur,'</td> |
344 |
td(small("in ".$sg_count->{$sg}." failures"))),"\n"; |
<td><small>in ',$sg_count->{$sg},' failures</small></td> |
345 |
|
</tr>'; |
346 |
} |
} |
347 |
|
|
348 |
print end_table; |
print "</table>", |
349 |
|
$q->end_html; |
350 |
|
|
351 |
|
|