#!/usr/bin/perl

####################################################################
# Title:         nfspool.1.pl 
# Author:        John Stile <jstile@stilen.com>
# version:       0.1
# Modifications: 
#
# Description:  Use rrdtool and nfsstat over rsh 
#               to chart fileserver nfs stats: 
#                     read, write, getattr, and lookup 
#               Output graphs in png image files and a flat text file.
#
# Bug : Program can hang on network request. Causes load to go up. 
#
####################################################################


########################################
#
# Set the constants
#
$rrd_directory="/dept/sio/data/rrd/nfspoll";
$output_directory="/dept/sio/data/rrd/nfspoll/output";
$debug="0";

##########################################
#            Error Checking
##########################################
# - Check process table for this program. Expect to see one. 
# - Die if there is more than 1 copy of this program running.



#
# Array of fileservers
#
@fileservers = (
   fileserver2a,   fileserver2b,
   fileserver3a,   fileserver3b,
   fileserver4a,   fileserver4b,
   fileserver5a,   fileserver5b,
   fileserver6a,   fileserver6b,
   fileserver7a,   fileserver7b,
   fileserver8a,   fileserver8b,
   fileserver9a,   fileserver9b,
   fileserver10a,  fileserver10b,
   fileserver11a,  fileserver11b,
   fileserver12a,  fileserver12b

);

#  implement a hash from fileservername
#
#    fileserverX{
#                 calls => 1000
#                 null  =>   57
#                 ...
#    } 
#

#
#  For each fileserver
#
foreach $fs (@fileservers) {
  #
  # If you can't ping the server, skip it
  #
  $status = `ping -c 1 $fs | grep alive | wc -l`;
  if ( "$pingstatus" ){
    print ("WARNING:  unable to contact $fs\n");
    next;
  } else {
  
    #
    # Initilize Hash based on fileserver name
    # 
     %{$fs} = ();
         
    #
    # Get the nfs stats, clear them, and pop them in array @stats
    #
    open(NFSSTAT, "rsh $fs nfsstat -ns | ") || warn "WARNING:  $fs does not return\n";
    @stats=<NFSSTAT>;
    close ( NFSSTAT );
       
    #
    # Remove all stuff before 'Version 3' from array
    #
    while ( ! ( $stats[0]  =~ m/^Version 3/) ) {
      shift ( @stats );
    }
    
    #
    # We don't need the 'Version 3' line
    #
    shift ( @stats );
    
    #
    # Step through ramaining nfsstats output
    # shifting lines off in two's 
    #
    while ( @stats ){
      
      # 
      # We need pairs of lines 
      # lable and vaule
      #
      chomp ( $lable_line=shift( @stats ) );
      chomp ( $vaule_line=shift( @stats ) );
      
      #
      # Takes: 1st String refernece = lable line
      #        2nd String reference = value line 
      #        3nd Hash reversnce   = filservernamed hash
      # Returns: nothing
      &Parser( \$lable_line, \$vaule_line, \%{$fs} );
    }
  }
}

foreach $fs (@fileservers) {
      # 
      # Create the rrd table if it does not exist
      #
      # Takes: 1st String refernece = fileserver name
      #        2nd String reference = directory where rrd will live      
      # Returns: nothing
      #
      &CreateRRD ( \$fs, \$rrd_directory );

      # 
      # Populate the rrd table with: read write getatt lookup
      #
      # Takes: 1st String refernece = fileserver name
      #        2nd String reference = directory where rrd will live 
      #        3rd Hash reversnce   = filservernamed hash
      #      
      # Returns: nothing    
      #
      &PopulateRRD ( \$fs, \$rrd_directory, \%{$fs} ); 

      #
      # Graph the rrd table with: read write getatt lookup
      #
      # Takes: 1st String refernece = fileserver name
      #        2nd String reference = directory where rrd will live 
      #        3rd Hash reversnce   = filservernamed hash
      #        4th String reference = output directory
      #
      # Returns: nothing
      #
      &GraphRRD ( \$fs, \$rrd_directory, \%{$fs}, \$output_directory );  
}

#
# If No index.html, crate it.
#
if ( ! -f "$output_directory/index.html" ){   
      #
      # Create an index.html pointing to all the graphs
      #
      # Takes: 1st Array refernece = array of fileserver names
      #        2nd String reference = output directory
      #
      # Returns: nothing
      #
      &Make_html_index ( \@fileservers, \$output_directory );      
}


#######################################################
#
# Parser - populastes the hash with lable and vaule
#
sub Parser {

  $lable_sr      = shift @_  ;
  $value_sr      = shift @_ ;
  $fileserver_hr = shift @_ ;

  #
  # split the strings into arrays
  #
  @lable_array=split ('\s+', $$lable_sr);
  @value_array=split ('\s+\d+\%\s+', $$value_sr);
    
  for ( $i=0; $i<@lable_array; $i++ ){
        $fileserver_hr->{ $lable_array[ $i ] }="$value_array[$i]" ;     
  } 
}

#######################################################
#
# Creating the rrd file
#
# Takes:    1st - reference to string with a fileservers name
#           2nd - reference to directory where rrd file should live
#
# Returns: Nothing        
#
# rrdtool create $rrd_directory/$fs_nfs.rrd \
# --step 10 \                  # 10 sec steps for RRA's blow
# DS:read:GAUGE:600:0:U \    # DataSource: over max of 10min, "0" minimum and unknown max value as valid data
# DS:write:GAUGE:600:0:U \   # DataSource: over max of 10min, "0" minimum and unknown max value as valid data
# DS:getattr:GAUGE:600:0:U \ # DataSource: over max of 10min, "0" minimum and unknown max value as valid data
# DS:lookup:GAUGE:600:0:U \  # DataSource: over max of 10min, "0" minimum and unknown max value as valid data
# RRA:AVERAGE:0.5:1:600 \      # Archive: Average over 1   measurement (10 min), 600 values should be stroed
# RRA:AVERAGE:0.5:6:700 \      # Archive: Average over 6   measurements (1 hr) 700 , 700 values should be stroed
# RRA:AVERAGE:0.5:24:775 \     # Archive: Average over 24  measurements (4 hrs), 775 values should be stroed
# RRA:AVERAGE:0.5:288:797 \    # Archive: Average over 288 measurements (2 days), 797 values should be stroed
# RRA:MAX:0.5:1:600 \          # Archive: MAX     over 1   measurements (10 min), 600 values should be stroed
# RRA:MAX:0.5:6:700 \          # Archive: MAX     over 6   measurements (1 hr), 700 values should be stroed
# RRA:MAX:0.5:24:775 \         # Archive: MAX     over 24  measurements (4 hrs), 775 values should be stroed
# RRA:MAX:0.5:288:797 \        # Archive: MAX     over 288 measurements (2 days), 797 values should be stroed
# RRA:LAST:0.5:1:600 \         # Archive: Last    over 1   measurement (10 min), 600 values should be stored
# RRA:LAST:0.5:6:700 \          # Archive: MAX     over 6   measurements (1 hr), 700 values should be stroed
# RRA:LAST:0.5:24:775 \         # Archive: MAX     over 24  measurements (4 hrs), 775 values should be stroed
# RRA:LAST:0.5:288:797 \        # Archive: MAX     over 288 measurements (2 days), 797 values should be stroed
# 
sub CreateRRD {
  $fileserver_name_sr = shift @_;    # i.e. string reference to file server name
  $rrd_directory_sr   = shift @_;    # i.e. string reference to directory where rrd table will be stored
    #
    # If the rrd table does not exist, create it
    #
    if ( ! -e "$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd" ){
       system( "rrdtool create $$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd --step 10  DS:Read:GAUGE:600:0:U  DS:Write:GAUGE:600:0:U  DS:Getattr:GAUGE:600:0:U  DS:Lookup:GAUGE:600:0:U RRA:AVERAGE:0.5:1:600 RRA:AVERAGE:0.5:6:700 RRA:AVERAGE:0.5:24:775 RRA:AVERAGE:0.5:288:797 RRA:MAX:0.5:1:600 RRA:MAX:0.5:6:700 RRA:MAX:0.5:24:775  RRA:MAX:0.5:288:797 RRA:LAST:0.5:1:600   RRA:LAST:0.5:6:700   RRA:LAST:0.5:24:775   RRA:LAST:0.5:288:797 " );
    } 
}

#######################################################
#
# Populate the rrd table
#
sub PopulateRRD {
   $fileserver_name_sr = shift @_;
   $rrd_directory_sr   = shift @_;   
   $fileserver_hr      = shift @_ ;   # Hash reference to the fileserver we are acting on  
   $read       =$fileserver_hr->{ 'read'   }  ;
   $write      =$fileserver_hr->{ 'write'  }  ;
   $getattr    =$fileserver_hr->{ 'getattr'}  ;
   $lookup     =$fileserver_hr->{ 'lookup' }  ;
  
  if  ( $debug eq "1" ){ print "$$fileserver_name_sr\t$read\t$write\t$getattr\t$lookup\n"; }
       system ( "rrdtool update $$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd  --template Read:Write:Getattr:Lookup N:$read:$write:$getattr:$lookup" );           
             
}

#######################################################
#
# Make graph from the rrd table
#
sub GraphRRD {
 
   $fileserver_name_sr = shift @_ ;
   $rrd_directory_sr   = shift @_ ;   
   $fileserver_hr      = shift @_ ;   # Hash reference to the fileserver we are acting on  
   $output_sr          = shift @_ ;
   my $read       =$fileserver_hr->{ 'read'    }  ;
   my $write      =$fileserver_hr->{ 'write'   }  ;
   my $getattr    =$fileserver_hr->{ 'getattr' }  ;
   my $lookup     =$fileserver_hr->{ 'lookup'  }  ;
   
   chomp ( $date=`date +%Y-%m-%d-%H:%M` );
   my @feedgack;
   my $output="";

   #####################################
   # For the graph:
   #  read    a=ave   b=max    c=last  
   #  write   d=ave   e=max    f=last
   #  getattr g=ave   h=max    i=last
   #  lookup  j=ave   k=max    l=lasst
   # Totals   a+d+g+j b+e+h+k  c+f+i+l
   #####################################
   #
   # Draw 12 Hour png
   #
   
   #system ( "rrdtool graph $$output_sr/$$fileserver_name_sr\.png --imgformat=PNG --start='-86400'  -c BACK#343435 -c FONT#ffffff -c CANVAS#605f60 --title='12 Hour NFSSTATS: $$fileserver_name_sr'  --height=150 --width=400 -value=0  --vertical-label='Transactions' --step 10 DEF:a='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Read:AVERAGE DEF:b='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Read:MAX  DEF:c='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Read:LAST DEF:d='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Write:AVERAGE DEF:e='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Write:MAX  DEF:f='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Write:LAST DEF:g='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Getattr:AVERAGE DEF:h='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Getattr:MAX  DEF:i='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Getattr:LAST  DEF:j='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Lookup:AVERAGE  DEF:k='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Lookup:MAX   DEF:l='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Lookup:LAST  CDEF:adgj=a,d,g,j,+,+,+ CDEF:behk=b,e,h,k,+,+,+ CDEF:cfil=c,f,i,l,+,+,+  COMMENT:'$date' COMMENT:'\\\n' COMMENT:'Attribute: \ \ \    LAST      AVE      MAX\\\n' COMMENT:'-----------------------------------------\\\n' LINE1:c#ea0e2b:'Read\\: \ \ \ '  GPRINT:c:LAST:%6.0lf%s\r GPRINT:a:LAST:%6.0lf%s\r GPRINT:b:LAST:%6.0lf%s\r COMMENT:'\\\n' LINE1:f#EACC00:'Write\\: \ \ \' GPRINT:f:LAST:%6.0lf%s\r GPRINT:d:LAST:%6.0lf%s\r GPRINT:e:LAST:%6.0lf%s\r  COMMENT:'\\\n'   LINE1:i#EA8F00:'Getattr\\: ' GPRINT:i:LAST:%6.0lf%s\r GPRINT:g:LAST:%6.0lf%s\r GPRINT:h:LAST:%6.0lf%s\r COMMENT:'\\\n'   LINE1:l#a8ef0e:'Lookup\\: \ '  GPRINT:l:LAST:%6.0lf%s\r GPRINT:j:LAST:%6.0lf%s\r GPRINT:k:LAST:%6.0lf%s\r COMMENT:'\\\n'  LINE1:cfil#bd43f9:'Total\\: \ \ '  GPRINT:cfil:LAST:%6.0lf%s\r  GPRINT:adgj:LAST:%6.0lf%s\r GPRINT:behk:LAST:%6.0lf%s\r PRINT:c:LAST:%6.0lf  PRINT:f:LAST:%6.0lf PRINT:i:LAST:%6.0lf  PRINT:l:LAST:%6.0lf ");
   system ( "rrdtool graph $$output_sr/$$fileserver_name_sr\.png --imgformat=PNG --start='-86400'  -c BACK#343435 -c FONT#ffffff -c CANVAS#605f60 --title='12 Hour NFSSTATS: $$fileserver_name_sr'  --height=150 --width=400 -value=0  --vertical-label='Transactions' --step 10 DEF:a='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Read:AVERAGE DEF:b='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Read:MAX  DEF:c='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Read:LAST DEF:d='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Write:AVERAGE DEF:e='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Write:MAX  DEF:f='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Write:LAST DEF:g='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Getattr:AVERAGE DEF:h='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Getattr:MAX  DEF:i='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Getattr:LAST  DEF:j='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Lookup:AVERAGE  DEF:k='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Lookup:MAX   DEF:l='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Lookup:LAST  CDEF:adgj=a,d,g,j,+,+,+ CDEF:behk=b,e,h,k,+,+,+ CDEF:cfil=c,f,i,l,+,+,+  COMMENT:'$date' COMMENT:'\\\n' COMMENT:'Attribute: \ \ \    LAST      AVE      MAX\\\n' COMMENT:'-----------------------------------------\\\n' LINE1:c#ea0e2b:'Read\\: \ \ \ '  GPRINT:c:LAST:%6.0lf%s\r GPRINT:a:LAST:%6.0lf%s\r GPRINT:b:LAST:%6.0lf%s\r COMMENT:'\\\n' LINE1:f#EACC00:'Write\\: \ \ \' GPRINT:f:LAST:%6.0lf%s\r GPRINT:d:LAST:%6.0lf%s\r GPRINT:e:LAST:%6.0lf%s\r  COMMENT:'\\\n'   LINE1:i#EA8F00:'Getattr\\: ' GPRINT:i:LAST:%6.0lf%s\r GPRINT:g:LAST:%6.0lf%s\r GPRINT:h:LAST:%6.0lf%s\r COMMENT:'\\\n'   LINE1:l#a8ef0e:'Lookup\\: \ '  GPRINT:l:LAST:%6.0lf%s\r GPRINT:j:LAST:%6.0lf%s\r GPRINT:k:LAST:%6.0lf%s\r COMMENT:'\\\n'  LINE1:cfil#bd43f9:'Total\\: \ \ '  GPRINT:cfil:LAST:%6.0lf%s\r  GPRINT:adgj:LAST:%6.0lf%s\r GPRINT:behk:LAST:%6.0lf%s\r  ");
    
   #
   # Draw 1 Week png
   #
   system ( "rrdtool graph  $$output_sr/$$fileserver_name_sr\_1week\.png --imgformat=PNG --start='-604800'  -c BACK#343435 -c FONT#ffffff -c CANVAS#605f60 --title='1 Week NFSSTATS: $$fileserver_name_sr'  --height=150 --width=400 -value=0  --vertical-label='Transactions' --step 10 DEF:a='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Read:AVERAGE DEF:b='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Read:MAX  DEF:c='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Read:LAST DEF:d='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Write:AVERAGE DEF:e='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Write:MAX  DEF:f='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Write:LAST DEF:g='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Getattr:AVERAGE DEF:h='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Getattr:MAX  DEF:i='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Getattr:LAST  DEF:j='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Lookup:AVERAGE  DEF:k='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Lookup:MAX   DEF:l='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Lookup:LAST  CDEF:adgj=a,d,g,j,+,+,+ CDEF:behk=b,e,h,k,+,+,+ CDEF:cfil=c,f,i,l,+,+,+  COMMENT:'$date' COMMENT:'\\\n' COMMENT:'Attribute: \ \ \    LAST      AVE      MAX\\\n' COMMENT:'-----------------------------------------\\\n' LINE1:c#ea0e2b:'Read\\: \ \ \ '  GPRINT:c:LAST:%6.0lf%s\r GPRINT:a:LAST:%6.0lf%s\r GPRINT:b:LAST:%6.0lf%s\r  COMMENT:'\\\n' LINE1:f#EACC00:'Write\\: \ \ \'  GPRINT:f:LAST:%6.0lf%s\r GPRINT:d:LAST:%6.0lf%s\r GPRINT:e:LAST:%6.0lf%s\r COMMENT:'\\\n'   LINE1:i#EA8F00:'Getattr\\: ' GPRINT:i:LAST:%6.0lf%s\r GPRINT:g:LAST:%6.0lf%s\r GPRINT:h:LAST:%6.0lf%s\r COMMENT:'\\\n'   LINE1:l#a8ef0e:'Lookup\\: \ '  GPRINT:l:LAST:%6.0lf%s\r GPRINT:j:LAST:%6.0lf%s\r GPRINT:k:LAST:%6.0lf%s\r COMMENT:'\\\n'  LINE1:cfil#bd43f9:'Total\\: \ \ '  GPRINT:cfil:LAST:%6.0lf%s\r  GPRINT:adgj:LAST:%6.0lf%s\r GPRINT:behk:LAST:%6.0lf%s\r  ");

   
   #
   # Draw 1 Month png
   #
   system ( "rrdtool graph  $$output_sr/$$fileserver_name_sr\_1month\.png --imgformat=PNG --start='-2678400'  -c BACK#343435 -c FONT#ffffff -c CANVAS#605f60 --title='1 Month NFSSTATS: $$fileserver_name_sr'  --height=150 --width=400 -value=0  --vertical-label='Transactions' --step 10 DEF:a='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Read:AVERAGE DEF:b='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Read:MAX  DEF:c='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Read:LAST DEF:d='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Write:AVERAGE DEF:e='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Write:MAX  DEF:f='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Write:LAST DEF:g='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Getattr:AVERAGE DEF:h='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Getattr:MAX  DEF:i='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Getattr:LAST  DEF:j='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Lookup:AVERAGE  DEF:k='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Lookup:MAX   DEF:l='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Lookup:LAST  CDEF:adgj=a,d,g,j,+,+,+ CDEF:behk=b,e,h,k,+,+,+ CDEF:cfil=c,f,i,l,+,+,+  COMMENT:'$date' COMMENT:'\\\n' COMMENT:'Attribute: \ \ \    LAST      AVE      MAX\\\n' COMMENT:'-----------------------------------------\\\n' LINE1:c#ea0e2b:'Read\\: \ \ \ '  GPRINT:c:LAST:%6.0lf%s\r GPRINT:a:LAST:%6.0lf%s\r GPRINT:b:LAST:%6.0lf%s\r  COMMENT:'\\\n' LINE1:f#EACC00:'Write\\: \ \ \'  GPRINT:f:LAST:%6.0lf%s\r GPRINT:d:LAST:%6.0lf%s\r GPRINT:e:LAST:%6.0lf%s\r COMMENT:'\\\n'   LINE1:i#EA8F00:'Getattr\\: ' GPRINT:i:LAST:%6.0lf%s\r GPRINT:g:LAST:%6.0lf%s\r GPRINT:h:LAST:%6.0lf%s\r COMMENT:'\\\n'   LINE1:l#a8ef0e:'Lookup\\: \ '  GPRINT:l:LAST:%6.0lf%s\r GPRINT:j:LAST:%6.0lf%s\r GPRINT:k:LAST:%6.0lf%s\r COMMENT:'\\\n'  LINE1:cfil#bd43f9:'Total\\: \ \ '  GPRINT:cfil:LAST:%6.0lf%s\r  GPRINT:adgj:LAST:%6.0lf%s\r GPRINT:behk:LAST:%6.0lf%s\r  ");

   #
   # Draw 1 Year png
   #
   system ( "rrdtool graph  $$output_sr/$$fileserver_name_sr\_1year\.png --imgformat=PNG  --start='-33053184' -c BACK#343435 -c FONT#ffffff -c CANVAS#605f60 --title='1 Year NFSSTATS: $$fileserver_name_sr'  --height=150 --width=400 -value=0  --vertical-label='Transactions' --step 10 DEF:a='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Read:AVERAGE DEF:b='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Read:MAX  DEF:c='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Read:LAST DEF:d='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Write:AVERAGE DEF:e='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Write:MAX  DEF:f='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Write:LAST DEF:g='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Getattr:AVERAGE DEF:h='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Getattr:MAX  DEF:i='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Getattr:LAST  DEF:j='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Lookup:AVERAGE  DEF:k='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Lookup:MAX   DEF:l='$$rrd_directory_sr/$$fileserver_name_sr\_nfs.rrd':Lookup:LAST  CDEF:adgj=a,d,g,j,+,+,+ CDEF:behk=b,e,h,k,+,+,+ CDEF:cfil=c,f,i,l,+,+,+  COMMENT:'$date' COMMENT:'\\\n' COMMENT:'Attribute: \ \ \    LAST      AVE      MAX\\\n' COMMENT:'-----------------------------------------\\\n' LINE1:c#ea0e2b:'Read\\: \ \ \ '  GPRINT:c:LAST:%6.0lf%s\r GPRINT:a:LAST:%6.0lf%s\r GPRINT:b:LAST:%6.0lf%s\r  COMMENT:'\\\n' LINE1:f#EACC00:'Write\\: \ \ \'  GPRINT:f:LAST:%6.0lf%s\r GPRINT:d:LAST:%6.0lf%s\r GPRINT:e:LAST:%6.0lf%s\r COMMENT:'\\\n'   LINE1:i#EA8F00:'Getattr\\: ' GPRINT:i:LAST:%6.0lf%s\r GPRINT:g:LAST:%6.0lf%s\r GPRINT:h:LAST:%6.0lf%s\r COMMENT:'\\\n'   LINE1:l#a8ef0e:'Lookup\\: \ '  GPRINT:l:LAST:%6.0lf%s\r GPRINT:j:LAST:%6.0lf%s\r GPRINT:k:LAST:%6.0lf%s\r COMMENT:'\\\n'  LINE1:cfil#bd43f9:'Total\\: \ \ '  GPRINT:cfil:LAST:%6.0lf%s\r  GPRINT:adgj:LAST:%6.0lf%s\r GPRINT:behk:LAST:%6.0lf%s\r  ");

   ######################################
   #  Print the data to a file
   ######################################
   open ( OUTPUT, ">>$$output_sr/nfspool_REPORT.txt" ) || die "Couldn't write to $$output_sr/nfspool_REPORT.txt" ;
   print OUTPUT "$date\|$fs\|$read|$write|$getattr|$lookup\n";
   close ( OUTPUT );
}


#######################################################
#
# Make an index.html pointing to all the graphs
#
sub Make_html_index {   

   $fileservers_ar = shift @_ ;   
   $output_sr          = shift @_ ;
  
   open ( INDEX_HTML, ">>$$output_sr/index.html" ) || warn "Couldn't write $$output_sr/index.html" ;
   
   #
   # BEGIN INDEX
   #
   print INDEX_HTML "<HTML>\n",
                    "<BODY bgcolor=black >\n<head>\n",
                    "<meta http-equiv=\"refresh\" content=\"60\">\n",
                    "</head>\n",
                    "<FONT color=white ><A HREF=\"$$output_sr/nfspool_REPORT.txt\" >Text Report</A></font>\n";
   
   #
   # Table in Tables
   #
   print INDEX_HTML "<TABLE BORDER=1><TR><TD COLSPAN=8 >\n";
    
   #
   # TABLES
   #
   foreach $fileserver ( @$fileservers_ar ){
   
  
      if ( $fileserver =~ m/fileserver\d+b/ ){
         print INDEX_HTML "\n\t</TD><TD>\n";
      }

      print INDEX_HTML "\t<TABLE BORDER=1>",
         "\n\t<TR >\n",
         "\t\t<TD><P><FONT color=\"white\" >$fileserver:</FONT></P></TD>\n",
         "\t\t<TD><A HREF=\"file:$$output_sr/$fileserver\_1week.png\" >1 Week</A></TD>\n",
         "\t\t<TD><A HREF=\"file:$$output_sr/$fileserver\_1month.png\" >1 Month</A></TD>\n",
         "\t\t<TD><A HREF=\"file:$$output_sr/$fileserver\_1year.png\" >1 Year</A></TD>\n",
         "\t</TR>\n",
         "\t<TR>\n",
         "\t\t<TD COLSPAN=4 ><IMG SRC=\"$$output_sr/$fileserver.png\" ></TD>\n",
         "\t</TR>\n\t</TABLE>\n";
  
      if ( $fileserver =~ m/fileserver\d+b/ ){
         print INDEX_HTML "\n</TD></TR><TR><TD COLSPAN=8 >\n";
      }
   }
   

   #
   # END Table in Tables
   #
   print INDEX_HTML "<\TABLE>";
   
   #
   # END INDEX
   #
   print  INDEX_HTML "</BODY>\n",
                      "</HTML>";

   close ( INDEX_HTML) || warn "Couldn't close  $$output_sr/index.html" ;
   
}



