#! /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
< Back
~; $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~

~; if ( ! $form{prnt} && ! $form{DO} ) { print qq~ ~; } print qq~
$MANAGENAME Manager
MySpace Unix Operations
Search $TOTALREC records:
Averages: $avgday p/day - $avgweek p/week             OPEN | print | d/o
~; if ( $form{UPD}) { &get_data; $SUBVAL="Update"; print "\n"; } else { $SUBVAL="Add";} print qq~ $FIELD1: $FIELD2: $FIELD3: $FIELD4: $FIELD5: $FIELD6:  
$FIELD10:   $FIELD7:   $FIELD8:   $FIELD9:  
$ERROR
~; ### ### Get average if passed ### if ( $form{avg} ) { print ""; if ( $form{avg} eq "day" ) {@avg=@days;} if ( $form{avg} eq "week" ) {@avg=@weektotals;} print qq~ ~; foreach $i (@avg) { ($dd, $nn) = split(/:/, $i); print qq~ ~; } print "
$form{avg}# Outages
$dd$nn
"; 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~
~; # severity/Status/outages if ( ! $form{DO} ) { print qq~ ~; } print qq~ ~; if ( ! $form{DO} ) { print qq~ ~; } print qq~ ~; if ( ! $form{DO} ) { print qq~ ~; } print qq~ ~; $bgc=""; $lnum=0; $found=""; &fill_outage; open (IN, "$DATA"); while () { $lnum++; ### #CHANGE# ($FD1,$FD2,$FD3, $FD4, $FD5, $FD6, $FD7, $FD8, $FD9, $FD10) = split(/\t/, $_); ### COUNT NUMBER OF OUTAGES $ocnt=0; $tcnt=0; foreach $o(@outage) { $ocnt++; if ( $ocnt > $lnum ) { if ( "$o" eq "$FD6" ) { $tcnt++; } } } if ( $FD6 =~ /warmspare/ || $FD6 =~ /ws00/ ) { $tcnt="";} if ( $tcnt > 1 ) { $tcnt="$tcnt";} else { $tcnt="$tcnt";} if ( ! $FD6 ) { $FD2="---"; $FD3="---"; $FD4="---"; $FD5="---"; $FD6="NO OUTAGES"; $FD7="---"; $FD8="---"; $FD9="---";} $FLINE="UPD=$lnum"; # # SEARCH # if ( $form{search} ) { # Search only OPEN Issues if ( "$form{search}" eq "%OPEN%" ) { if ( "$FD5" eq "In-process" || "$FD5" eq "New" || "$FD5" eq "In-Use") { display_output; } } else { # Search all issues if ( /$form{search}/i ) { display_output; } } } # DONT SEARCH - DISPLAY EVERYTHING else { display_output; } } close(IN); print qq~
$FIELD1

$FIELD2

$FIELD3

$FIELD4

$FIELD5

Outages

$FIELD6

$FIELD10

$FIELD7

$FIELD8

$FIELD9

~; if ( ! "$found" ) { print "

*** Nothing was found

\n"; } else { # print qq~


Total Records = $TOTALREC (ver. $VER)
~; } }