#!/usr/bin/perl -w

require File::Basename;
use File::Basename;
use File::Path qw/make_path/;

# name of this program
my $myname = "inodes_autogrow";
# turn this on for debugging output
my $debug = 1;
# this is the target inode usage (cluster logs errors at 80%)
my $files_target_pct = 75;
# ocum/aiqum login info
my $ocum_user = "nasom";
my $ocum_pass = "moVBNCJp!3";

#########################################################################
# set up some logging
#########################################################################

$logfile = "c:/aiqum_script_logs/${myname}.log";
my $logdir = dirname($logfile);
make_path($logdir);
open (LOG, '>>', $logfile) or die "Failed opening log file: $logfile!\n";
print LOG "############################################################\n";
print LOG scalar localtime(), "\n";

#########################################################################
# check for all ocum arguments and parse into variables
# test command:
# ocum_generic_script.pl -eventID 270581 -eventName Inodes Nearly Full -eventSeverity warning -eventSourceID 20001 -eventSourceName vs-4946047:/inodes_test -eventSourceType VOLUME -eventState NEW -eventArgs inodesNearlyFull=80,inodesFull=90,dfMountedOn=inodes_test,dfKBytesTotal=19456,dfKBytesUsed=1084,dfKBytesPercent=5.571546052631579,dfInodesTotal=748,dfInodesUsed=606,dfInodesPercent=81.01604278074866
#########################################################################
print LOG "Args: @ARGV\n";
#unless (scalar @ARGV == 16)
#	{
#	print LOG "All 16 OCUM arguments have not been supplied!\n";
#	die "All 16 OCUM arguments have not been supplied!\n";
#	}
	
my $lastarg = "";
my $test = 0;
my $eventID ="";
my $eventName ="";
my $eventState ="";
my $eventSeverity ="";
my $eventSourceID ="";
my $eventSourceType ="";
my $eventSourceName ="";
my $eventArgs ="";

# This is a very ugly way of parsing arguments, but Windows arguments don't seem to comply with posix standards.
# first combine all of the arguments into one long string
$allargs = " ";
foreach $arg (@ARGV)
	{
	$allargs .= " $arg";
	}
# then split the string on the event+ arg names, but also include the arg name
@args = split /\s\-(event\w+)\s/, $allargs;

foreach $arg (@args)
	{
	$test = 1 if $arg =~ /test/i;
	$eventID = $arg if $lastarg =~ /eventid/i;
	$eventName = $arg if $lastarg =~ /eventname/i;
	$eventSeverity = $arg if $lastarg =~ /eventseverity/i;
	$eventSourceID = $arg if $lastarg =~ /eventsourceid/i;
	$eventSourceName = $arg if $lastarg =~ /eventsourcename/i;
	$eventSourceType = $arg if $lastarg =~ /eventsourcetype/i;
	$eventState = $arg if $lastarg =~ /eventstate/i;
	$eventArgs = $arg if $lastarg =~ /eventargs/i;
	$lastarg = $arg;
	}
	
unless ($eventState =~ /new/i)
	{
	print LOG "Event ID $eventID state is not NEW, aborting.\n";
	die "Event ID $eventID state is not NEW, aborting.\n";
	}
	
unless ($eventID =~ /^\d+$/)
	{
	print LOG "Invalid event id: $eventID, aborting.\n";
	die "Invalid event id: $eventID, aborting.\n";
	}
print LOG "Event ID = $eventID\n";

#########################################################################
# parse the eventSourceName to get the svm and volume names
# parse the eventArgs to get the total and used inodes
#########################################################################
($svm, $volume) = split /:\//, $eventSourceName, 2;
@args = split /,/, $eventArgs;
foreach $arg (@args)
	{
	if ($arg =~ /inodestotal/i)
		{
		($junk, $files_total) = split /=/, $arg, 2;
		}
	if ($arg =~ /inodesused/i)
		{
		($junk, $files_used) = split /=/, $arg, 2;
		}
	if ($arg =~ /dfKBytesTotal/i)
		{
		($junk, $kbtotal) = split /=/, $arg, 2;
		}
	}	
unless (defined $files_total && $files_total =~ /^\d+$/)
{
	print LOG "Invalid total inodes: $files_total!\n";
	exit;
}
unless (defined $files_used && $files_used =~ /^\d+$/)
{
	print LOG "Invalid used inodes: $files_used!\n";
	exit;
}
print LOG "Vserver: $svm\n";
print LOG "Volume: $volume\n";
print LOG "Files total: $files_total\n";
print LOG "Files used: $files_used\n";
#########################################################################
# then use "um svm list" get a list of the vservers to get the cluster name
#########################################################################

$um_cmd = "um cli login -u nasom -p moVBNCJp!3 & um svm list";
$um_out = `$um_cmd`;
@um_out = split /\n/, $um_out;
chomp (@um_out);
foreach $line (@um_out)
{
	chomp ($line);
	#print "$line" if $debug;
	if ($line =~ /$svm/i)
	{
		($junk, $junk, $cluster, $junk) = split /\s+/, $line, 4;
		print LOG "Cluster: $cluster\n";
	}
}

########################################################################
# now calculate the new inode (files) count to achieve the target % usage
########################################################################

$files_new = int (100 * $files_used / $files_target_pct);
$files_max = int ($kbtotal * 0.949 / 4);
$files_new = $files_max if ($files_max > $files_used && $files_new > $files_max);
print LOG "Files new: $files_new\n";

########################################################################
# now use the um rum cmd to adjust the inodes on the volume
########################################################################

print LOG "Increasing files to $files_new on volume $volume of cluster $cluster.\n";
$um_cmd = "um cli login -u nasom -p moVBNCJp!3 & um run cmd -t 30 $cluster \"volume modify -vserver $svm -volume $volume -files $files_new\"";
$um_out = `$um_cmd`;
print LOG "$um_out";
#@um_out = split /\n/, $um_out;
#print "@um_out";

exit;