#! /usr/bin/perl
###
### MAT - Management Account Tool (c)09/02 - Kirk Waingrow
###
### Version 1.3 - "OPEN" button added to show only open items
###
$VER="1.3 - Kirk Waingrow - 10/09"; # VERSION NUMBER
$PROGNAME="server_outages";
$MANAGENAME="Server Outage";
$DPATH="/var/www/data";
$FIELD1="Outage Date"; $FLEN1=10; # Length of the input field
$FIELD2="STI"; $FLEN2=10;
$FIELD3="ETR"; $FLEN3=8;
$FIELD4="Severity"; $FLEN4=8;
$FIELD5="Status"; $FLEN5=10;
$FIELD6="Hostname"; $FLEN6=25;
$FIELD7="Problem / WHY / Resolution"; $FLEN7=30;
$FIELD8="Ticket"; $FLEN8=8;
$FIELD9="whoami"; $FLEN9=8;
$FIELD10="Cluster"; $FLEN10=10;
@SEV=("Low", "Medium", "High");
@STAT=("Available","Completed", "In-process", "In-Use", "Unknown", "Repair", "New");
$DATE=`date '+%Y/%m/%d'`;
$TIME=`date '+%H:%M'`;
$FVAL1="";
$FVAL2="";
$FVAL3="";
$FVAL5="";
$FVAL6="";
$FVAL7="";
$FVAL8="";
$FVAL9="";
$FVAL10="";
#
# Only Change the Above - IF MORE FIELDS ARE ADDED THEN
# SEACH FOR /#CHANGE# AND MODIFY WHERE NEEDED
# -------------------------------------------------------------------
$DATA="$DPATH/$PROGNAME.txt";
$COMMENT="$DPATH/$PROGNAME.cmt";
$PROG="/cgi-bin/$PROGNAME";
if ( ! -d "$DPATH" ) { `mkdir -p $DPATH`; }
if ( ! -f "$DATA" ) { `touch $DATA`; }
print "Content-type: text/html\n\n";
print qq~
$MANAGENAME Manager
~;
$buffer = "$QUERY_STRING";
$buffer = $ENV{'QUERY_STRING'};
# Split the Variables by the &
#
@pairs = split (/&/, $buffer);
# Create the array
foreach $pair (@pairs)
{
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$form{$name} = $value;
#print "$form{$name}";
}
## #CHANGE#
$FVAL1="$DATE";
$FVAL2="$TIME";
# GET DATA FROM THE DATA FILE TO BE EDITTED
sub get_data
{
$cnt=0;
open(IN, "$DATA");
while ()
{
$cnt++;
if ( $cnt eq $form{UPD} )
{
# #CHANGE#
($FVAL1, $FVAL2, $FVAL3, $FVAL4, $FVAL5, $FVAL6, $FVAL7, $FVAL8, $FVAL9, $FVAL10) = split(/\t/, $_);
}
}
close(IN);
}
###
### Store the list of outage hosts in an array
###
sub fill_outage
{
@outage="";
open(IN, "$DATA") || print "NOT $DATA HERE";
while ()
{
($d1, $d2, $d3,$d4, $d5, $d6) = split(" ", $_);
push(@outage, "$d6");
}
close(IN);
}
# DELETE AN ENTRY
if ( $form{del} )
{
($fu, $fi) = split(/:/, $form{del});
$cnt=0;
open(OUT, "> $DATA.tmp");
open(IN, "$DATA");
while ()
{
$cnt++;
if ( $cnt ne $fu ) { print OUT "$_"; }
# else
# {
# # #CHANGE#
# ($FD1, $FD2, $FD3, $FD4, $FD5, $FD6, $FD7, $FD8, $FD9) = split(/\t/, $_);
# if ( "$fi" ne "$FD2" ) { print OUT "$_"; }
# }
}
close(IN);
close(OUT);
`mv $DATA.tmp $DATA`;
}
###
### ADD ENTRY
###
# Default values
$ERROR="";
if ( "$form{FIELD1}" )
{
# if ( ! "$form{FIELD1}" ) { $ERROR="1"; }
# if ( ! "$form{FIELD2}" ) { $ERROR="1"; }
# if ( ! "$form{FIELD3}" ) { $ERROR="1"; }
if ( ! "$ERROR" )
{
### #CHANGE#
$reload=`grep "^$form{FIELD1} $form{FIELD2} $form{FIELD3} $form{FIELD4} $form{FIELD5} $form{FIELD6} $form{FIELD7} $form{FIELD8} $form{FIELD9} $form{FIELD10}" $DATA`;
if ( ! "$reload" )
{
open (OUT, ">> $DATA");
### #CHANGE#
print OUT "$form{FIELD1} $form{FIELD2} $form{FIELD3} $form{FIELD4} $form{FIELD5} $form{FIELD6} $form{FIELD7} $form{FIELD8} $form{FIELD9} $form{FIELD10}\n";
close(OUT);
`sort -nr $DATA > $DATA.tmp`;
`mv $DATA.tmp $DATA`;
}
}
else
{ $ERROR="
*** ERROR: ALL FIELDS MUST BE ENTERED *** ";
### #CHANGE#
$FVAL1="$form{FIELD1}";
$FVAL2="$form{FIELD2}";
$FVAL3="$form{FIELD3}";
$FVAL4="$form{FIELD4}";
$FVAL5="$form{FIELD5}";
$FVAL6="$form{FIELD6}";
$FVAL7="$form{FIELD7}";
$FVAL8="$form{FIELD8}";
$FVAL9="$form{FIELD9}";
$FVAL10="$form{FIELD10}";
}
}
sub average_day
{
if ( -s "$DATA" )
{
$days=0; $daystemp=""; $cnt=0;
open(IN, "$DATA");
while ()
{
chomp;
($FD1,$FD2,$FD3, $FD4, $FD5, $FD6, $FD7, $FD8) = split(/\t/, $_);
if ( $daystemp ne $FD1 )
{
#print "
DAYS = $days / $daystemp / $FD1 = $cnt\n";
$d="$daystemp:$cnt";
if ( $daystemp ne "" )
{
push(@days, "$d");
}
$days++; $daystemp="$FD1";
$cnt=0;
}
#print "
DAYS = $days / $daystemp / $FD1 = $cnt\n";
$cnt++;
}
close(IN);
$avgday=sprintf("%.0f", ($TOTALREC / $days));
}
else { $avgday=0; $TOTALREC=0; $days=0; }
# print "
avgday = $TOTALREC /$days\n";
}
sub average_week
{
$weeks=1; $weeknum=0; $weekstemp="";
@weektotals=""; $cnt=0;
open(IN, "$DATA");
while ()
{
chomp;
($FD1,$FD2,$FD3, $FD4, $FD5, $FD6, $FD7, $FD8) = split(/\t/, $_);
if ( $weekstemp ne $FD1 )
{
$weekstemp="$FD1";
$weeknum++;
if ( $weeknum == 7 )
{
# print "
WEEKS = $weeks /$weeknum / $weekstemp / $FD1 = $cnt\n";
$w="$FD1:$cnt";
push(@weektotals, "$w");
$weeks++; $weeknum=0; $cnt=1;
}
}
$cnt++;
}
close(IN);
$avgweek=sprintf("%.0f", ($TOTALREC / $weeks));
# print "
avgweek = $TOTALREC /$weeks\n";
}
sub display_output
{
$TOTALREC++;
$found="1";
if ( $fade ) { $bgc="bgcolor=e8e8e8"; $fade="0"; }
else { $bgc="bgcolor=white"; $fade="1"; }
#if ( "$PREV" eq $FD1 ) { $bgc="bgcolor=red"; }
$STCCC="black";
$SEVCCC="black";
if ( "$FD4" eq "Low" ) { $SEVCCC="green"; }
if ( "$FD4" eq "Medium" ) { $SEVCCC="orange"; }
if ( "$FD4" eq "High" ) { $SEVCCC="red"; }
if ( "$FD1" =~ /9999/ ) { $FD4=""; $FD1="";}
if ( "$FD5" eq "Completed" || "$FD5" eq "Resolved" ) { $STCCC="green"; }
if ( "$FD5" eq "In-process" || "$FD5" eq "New" || "$FD5" eq "Unknown" || "$FD5" eq "In-Use" || "$FD5" eq "Repair") { $STCCC="red"; }
if ( "$FD5" eq "Available" ) { $STCCC="green"; }
print "\n";
if ( ! $form{prnt} && ! $form{DO})
{ print "";}
print qq~
| $FD1 |
$FD2 |
$FD3 |
~;
# Strip severity/status/outages
if ( ! $form{DO} )
{
print qq~
$FD4 |
$FD5 |
$tcnt |
~;
}
# Display host
print qq~
$FD6 |
~;
# Strip cluster
if ( ! $form{DO} )
{
print qq~
$FD10 |
~;
}
# Display Description
print qq~
$FD7 |
~;
# Strip Ticket / whoami
if ( ! $form{DO} )
{
print qq~
$FD8 |
$FD9 |
~;
}
print "
\n";
$PREV="$FD1";
}
###
### TITLE BAR
###
$TOTALREC=`cat $DATA | wc -l | awk '{ print $1}'`;
average_week;
average_day;
print qq~
~;
###
### Get average if passed
###
if ( $form{avg} )
{
print "";
if ( $form{avg} eq "day" ) {@avg=@days;}
if ( $form{avg} eq "week" ) {@avg=@weektotals;}
print qq~
$form{avg} | # Outages |
~;
foreach $i (@avg)
{
($dd, $nn) = split(/:/, $i);
print qq~
$dd | $nn |
~;
}
print "
";
exit;
}
###
### CAT A TEXT FILE FOR COMMENT AND INFORMATION
###
`touch $COMMENT`;
open(IN, "$COMMENT" );
while ()
{ print $_; }
close(IN);
###
### DISPLAY DATA
###
$TOTALREC=0;
if ( -s "$DATA" )
{
#
print qq~
|
Total Records = $TOTALREC |
(ver. $VER) |
~;
}
}