#!/usr/bin/perl

###############################################################################
#                                                                             #
# Filename: bakEmailAlert                                                     #
#                                                                             #
# Description:                                                                #
#                                                                             #
###############################################################################
###############################################################################
#                                                                             #
#  Copyright  2000 - 2001 Intel Corporation.                                 #
#  Intel Corporation All Rights Reserved.                                     #
#                                                                             #
#  The source code contained or described herein and all documents related to #
#  the source code ("Material") are owned by Intel Corporation or its         #
#  suppliers or licensors.  Title to the Material remains with Intel          #
#  Corporation or its suppliers and licensors.  The Material contains trade   #
#  secrets and proprietary and confidential information of Intel or its       #
#  suppliers and licensors.  The Material is protected by worldwide copyright #
#  and trade secret laws and treaty provisions.  No part of the Material may  #
#  be used, copied, reproduced, modified, published, uploaded, posted,        #
#  transmitted, distributed, or disclosed in any way without Intel's prior    #
#  express written permission.                                                #
#                                                                             #
#  No license under any patent, copyright, trade secret or other intellectual #
#  property right is granted to or conferred upon you by disclosure or        #
#  delivery of the Materials, either expressly, by implication, inducement,   #
#  estoppel or otherwise. Any license under such intellectual property rights #
#  must be express and approved by Intel in writing.                          #
#                                                                             #
###############################################################################

$MAIL			= "/bin/mail";
$SENSORS_CONF	= "/etc/asm/asm.conf";

%SENSORS = (
	"Int", 		["Chassis Intrusion", 		"TYPE_TRIGGER", 4],
	"+12v", 	["+12 volts",		  		"TYPE_4",		3],
	"-12v", 	["-12 volts",		  		"TYPE_4", 		3],
	"+5v", 		["+5 volts",		  		"TYPE_4",		3],
	"+3.3v", 	["+3.3 volts",		  		"TYPE_4",		3],
	"+Vio", 	["CPU I/O voltage",  		"TYPE_4",		3],
	"+Vcore", 	["CPU Core voltage",	  	"TYPE_4",		3],
	"CPUTemp", 	["Baseboard temperature",	"TYPE_4",		1],
	"Fan1", 	["Fan 1",					"TYPE_2_LOWER", 3],
	"Fan2", 	["Fan 2",					"TYPE_2_LOWER", 3],
	"Fan3", 	["Fan 3",					"TYPE_2_LOWER", 3],
	"Fan4", 	["Fan 4",					"TYPE_2_LOWER", 3],
	"Fan5", 	["Fan 5",					"TYPE_2_LOWER", 3],
	"MemUtil", 	["Memory utilization",		"TYPE_TRIGGER", 7],
	"CPUUtil", 	["CPU utilization",			"TYPE_TRIGGER", 7],
	"Single-bit", ["Single-bit error",		"TYPE_TRIGGER", 7],
	"Disk",		["Disk Utilization",		"TYPE_2_LOWER", 6],
	"DiskA1",	["Disk /dev/hda1",			"TYPE_2_LOWER", 6],
	"DiskA2",	["Disk /dev/hda2",			"TYPE_2_LOWER", 6],
	"DiskA3",	["Disk /dev/hda3",			"TYPE_2_LOWER", 6],
	"DiskA4",	["Disk /dev/hda4",			"TYPE_2_LOWER", 6],
	"DiskA5",	["Disk /dev/hda5",			"TYPE_2_LOWER", 6],
	"DiskA6",	["Disk /dev/hda6",			"TYPE_2_LOWER", 6],
	"DiskA7",	["Disk /dev/hda7",			"TYPE_2_LOWER", 6],
	"DiskA8",	["Disk /dev/hda8",			"TYPE_2_LOWER", 6],
	"DiskA1",	["Disk /dev/hda1",			"TYPE_2_LOWER", 6],
	"DiskA2",	["Disk /dev/hda2",			"TYPE_2_LOWER", 6],
	"DiskA3",	["Disk /dev/hda3",			"TYPE_2_LOWER", 6],
	"DiskA4",	["Disk /dev/hda4",			"TYPE_2_LOWER", 6],
	"DiskA5",	["Disk /dev/hda5",			"TYPE_2_LOWER", 6],
	"DiskA6",	["Disk /dev/hda6",			"TYPE_2_LOWER", 6],
	"DiskA7",	["Disk /dev/hda7",			"TYPE_2_LOWER", 6],
	"DiskA8",	["Disk /dev/hda8",			"TYPE_2_LOWER", 6],
	"DiskA9",	["Disk /dev/hda9",			"TYPE_2_LOWER", 6],
	"DiskA10",	["Disk /dev/hda10",			"TYPE_2_LOWER", 6],
	"DiskA11",	["Disk /dev/hda11",			"TYPE_2_LOWER", 6],
	"DiskA12",	["Disk /dev/hda12",			"TYPE_2_LOWER", 6],
	"DiskA13",	["Disk /dev/hda13",			"TYPE_2_LOWER", 6],
	"DiskA14",	["Disk /dev/hda14",			"TYPE_2_LOWER", 6],
	"DiskA15",	["Disk /dev/hda15",			"TYPE_2_LOWER", 6],
	"DiskA16",	["Disk /dev/hda16",			"TYPE_2_LOWER", 6],
	"DiskB1",	["Disk /dev/hdb1",			"TYPE_2_LOWER", 6],
	"DiskB2",	["Disk /dev/hdb2",			"TYPE_2_LOWER", 6],
	"DiskB3",	["Disk /dev/hdb3",			"TYPE_2_LOWER", 6],
	"DiskB4",	["Disk /dev/hdb4",			"TYPE_2_LOWER", 6],
	"DiskB5",	["Disk /dev/hdb5",			"TYPE_2_LOWER", 6],
	"DiskB6",	["Disk /dev/hdb6",			"TYPE_2_LOWER", 6],
	"DiskB7",	["Disk /dev/hdb7",			"TYPE_2_LOWER", 6],
	"DiskB8",	["Disk /dev/hdb8",			"TYPE_2_LOWER", 6],
	"DiskB1",	["Disk /dev/hdb1",			"TYPE_2_LOWER", 6],
	"DiskB2",	["Disk /dev/hdb2",			"TYPE_2_LOWER", 6],
	"DiskB3",	["Disk /dev/hdb3",			"TYPE_2_LOWER", 6],
	"DiskB4",	["Disk /dev/hdb4",			"TYPE_2_LOWER", 6],
	"DiskB5",	["Disk /dev/hdb5",			"TYPE_2_LOWER", 6],
	"DiskB6",	["Disk /dev/hdb6",			"TYPE_2_LOWER", 6],
	"DiskB7",	["Disk /dev/hdb7",			"TYPE_2_LOWER", 6],
	"DiskB8",	["Disk /dev/hdb8",			"TYPE_2_LOWER", 6],
	"DiskB9",	["Disk /dev/hdb9",			"TYPE_2_LOWER", 6],
	"DiskB10",	["Disk /dev/hdb10",			"TYPE_2_LOWER", 6],
	"DiskB11",	["Disk /dev/hdb11",			"TYPE_2_LOWER", 6],
	"DiskB12",	["Disk /dev/hdb12",			"TYPE_2_LOWER", 6],
	"DiskB13",	["Disk /dev/hdb13",			"TYPE_2_LOWER", 6],
	"DiskB14",	["Disk /dev/hdb14",			"TYPE_2_LOWER", 6],
	"DiskB15",	["Disk /dev/hdb15",			"TYPE_2_LOWER", 6],
	"DiskB16",	["Disk /dev/hdb16",			"TYPE_2_LOWER", 6],
	"DiskC1",	["Disk /dev/hdc1",			"TYPE_2_LOWER", 6],
	"DiskC2",	["Disk /dev/hdc2",			"TYPE_2_LOWER", 6],
	"DiskC3",	["Disk /dev/hdc3",			"TYPE_2_LOWER", 6],
	"DiskC4",	["Disk /dev/hdc4",			"TYPE_2_LOWER", 6],
	"DiskC5",	["Disk /dev/hdc5",			"TYPE_2_LOWER", 6],
	"DiskC6",	["Disk /dev/hdc6",			"TYPE_2_LOWER", 6],
	"DiskC7",	["Disk /dev/hdc7",			"TYPE_2_LOWER", 6],
	"DiskC8",	["Disk /dev/hdc8",			"TYPE_2_LOWER", 6],
	"DiskC1",	["Disk /dev/hdc1",			"TYPE_2_LOWER", 6],
	"DiskC2",	["Disk /dev/hdc2",			"TYPE_2_LOWER", 6],
	"DiskC3",	["Disk /dev/hdc3",			"TYPE_2_LOWER", 6],
	"DiskC4",	["Disk /dev/hdc4",			"TYPE_2_LOWER", 6],
	"DiskC5",	["Disk /dev/hdc5",			"TYPE_2_LOWER", 6],
	"DiskC6",	["Disk /dev/hdc6",			"TYPE_2_LOWER", 6],
	"DiskC7",	["Disk /dev/hdc7",			"TYPE_2_LOWER", 6],
	"DiskC8",	["Disk /dev/hdc8",			"TYPE_2_LOWER", 6],
	"DiskC9",	["Disk /dev/hdc9",			"TYPE_2_LOWER", 6],
	"DiskC10",	["Disk /dev/hdc10",			"TYPE_2_LOWER", 6],
	"DiskC11",	["Disk /dev/hdc11",			"TYPE_2_LOWER", 6],
	"DiskC12",	["Disk /dev/hdc12",			"TYPE_2_LOWER", 6],
	"DiskC13",	["Disk /dev/hdc13",			"TYPE_2_LOWER", 6],
	"DiskC14",	["Disk /dev/hdc14",			"TYPE_2_LOWER", 6],
	"DiskC15",	["Disk /dev/hdc15",			"TYPE_2_LOWER", 6],
	"DiskC16",	["Disk /dev/hdc16",			"TYPE_2_LOWER", 6],
	"DiskD1",	["Disk /dev/hdd1",			"TYPE_2_LOWER", 6],
	"DiskD2",	["Disk /dev/hdd2",			"TYPE_2_LOWER", 6],
	"DiskD3",	["Disk /dev/hdd3",			"TYPE_2_LOWER", 6],
	"DiskD4",	["Disk /dev/hdd4",			"TYPE_2_LOWER", 6],
	"DiskD5",	["Disk /dev/hdd5",			"TYPE_2_LOWER", 6],
	"DiskD6",	["Disk /dev/hdd6",			"TYPE_2_LOWER", 6],
	"DiskD7",	["Disk /dev/hdd7",			"TYPE_2_LOWER", 6],
	"DiskD8",	["Disk /dev/hdd8",			"TYPE_2_LOWER", 6],
	"DiskD1",	["Disk /dev/hdd1",			"TYPE_2_LOWER", 6],
	"DiskD2",	["Disk /dev/hdd2",			"TYPE_2_LOWER", 6],
	"DiskD3",	["Disk /dev/hdd3",			"TYPE_2_LOWER", 6],
	"DiskD4",	["Disk /dev/hdd4",			"TYPE_2_LOWER", 6],
	"DiskD5",	["Disk /dev/hdd5",			"TYPE_2_LOWER", 6],
	"DiskD6",	["Disk /dev/hdd6",			"TYPE_2_LOWER", 6],
	"DiskD7",	["Disk /dev/hdd7",			"TYPE_2_LOWER", 6],
	"DiskD8",	["Disk /dev/hdd8",			"TYPE_2_LOWER", 6],
	"DiskD9",	["Disk /dev/hdd9",			"TYPE_2_LOWER", 6],
	"DiskD10",	["Disk /dev/hdd10",			"TYPE_2_LOWER", 6],
	"DiskD11",	["Disk /dev/hdd11",			"TYPE_2_LOWER", 6],
	"DiskD12",	["Disk /dev/hdd12",			"TYPE_2_LOWER", 6],
	"DiskD13",	["Disk /dev/hdd13",			"TYPE_2_LOWER", 6],
	"DiskD14",	["Disk /dev/hdd14",			"TYPE_2_LOWER", 6],
	"DiskD15",	["Disk /dev/hdd15",			"TYPE_2_LOWER", 6],
	"DiskD16",	["Disk /dev/hdd16",			"TYPE_2_LOWER", 6],
	"L_swRAID",	["Disk mirroring failure detected -- running in degraded mode.  Please check the appliance Web GUI immediately!","TYPE_4", 6],
);

%DAEMON = (
	"ERA",	"",
	"PF",	"Predictive Failure: "
);

%TYPE_4 = (
	1,	"Back to normal",
	2,  "Crossed upper critical",
	3,	"Crossed upper warning",
	5,  "Crossed lower warning",
	4,  "Crossed lower critical"
);

%TYPE_2_LOWER = (
	1,	"Back to normal",
	5,  "Crossed lower warning",
	4,  "Crossed lower critical"
);

%TYPE_TRIGGER = (
	1,	"Cleared",
	2,  "Occured",
);

$daemon = $ARGV[0];
$sensor = $ARGV[1];
$type = $ARGV[2];

($EMAIL_ALERTS_ADDRESS1, $EMAIL_ALERTS_ADDRESS2, $EMAIL_ALERTS_ADDRESS3,
 $EMAIL_ALERTS_SUBJECT, $EMAIL_ALERTS_BODY ) = ReadSensorParameters( 
			"EMAIL_ALERTS_ADDRESS1", 
			"EMAIL_ALERTS_ADDRESS2", 
			"EMAIL_ALERTS_ADDRESS3",
			"EMAIL_ALERTS_SUBJECT",
			"EMAIL_ALERTS_BODY");

## Get the IP address.
open(HANDLE, "/sbin/ifconfig |");
$gotIface = 0;
while(<HANDLE>)
{
 	if( $gotIface )
	{
		($x, $ip_address, $x) = split(" ", $_);
		($x, $ip_address) = split(":", $ip_address);
		$gotIface = 0;
	}
	if($_ =~ /^eth0.*$/)
	{
		$gotIface = 1;
	}
}
close(HANDLE);

if( ($daemon eq "") || ($sensor eq "") || ($type eq "") )
{
	print "Missing required parameters\n";
	exit;
}

if( ($EMAIL_ALERTS_ADDRESS1 eq "") &&
    ($EMAIL_ALERTS_ADDRESS2 eq "") &&
	($EMAIL_ALERTS_ADDRESS3 eq "") )
{
	print "No addresses defined\n";
	exit;
}

$mysensor = $SENSORS{$sensor};
$mytype = @$mysensor[1];

## Create body Message
$msg = $DAEMON{$daemon}.@$mysensor[0]."\n";
eval("\%mytype = \$$mytype;");
$msg .= @$mytype{$type}." at ".localtime(time)."\n\nServer's Local Address: $ip_address"."\n";

if($EMAIL_ALERTS_BODY ne "")
{
	## Append optional body.
	$msg .= "\n$EMAIL_ALERTS_BODY\n";
}

$subject = $EMAIL_ALERTS_SUBJECT;
if($subject eq "")
{
	## No subject defined so specify our own. 
	$subject = "ASM: ".(($daemon eq "PF") ? "7": @$mysensor[2]).$type."0";
}
for($i = 1; $i <= 3; $i ++)
{
	$addr = eval("\$"."EMAIL_ALERTS_ADDRESS$i");
	$mailcmd = "$MAIL -s \"$subject\" $addr";
	if($addr ne "")
	{
		open(HANDLE, "| $mailcmd");
		print HANDLE $msg;
		close(HANDLE);
	}
}
exit;


##
## [ReadSensorParameters]
##
## Read and return a list of parameters from sensor configuration file.
##
sub ReadSensorParameters
{	
	return ReadParametersEngine($SENSORS_CONF, "", @_);
}

##
## [ReadParametersEngine]
##
## Read and return a list of parameters from sensor configuration file
##
sub ReadParametersEngine
{	
	my ($baseFile, $tempConfFile, @parameters) = @_;
	my $tempfile, $param_count, $at_least_one_array, $file, $i;
	my $got_it, $sep, $cmd, $params_left;
    my @return_list, @seperators;

	@separators = ("=", "_TEMP=");
	$at_least_one_array = 0;

	## See if temp file exists.
	$tempfile = ( ($tempConfFile != "") && (-e $tempConfFile ) ) ? 1 : 0;

	## Count number of parameters.
	for($param_count = 0; 
	    length($parameters[$param_count]) != ""; 
		$param_count++)
	{
		if( ref(@parameters[$param_count]) =~ "ARRAY")
		{
			$at_least_one_array = 1;		
			push(@return_list, []);
		}else{
			push(@return_list, "");
		}
	}
	
	## We read the following files:
	## 1. If temp file exists, we'll read through it first, then live conf.
	## 2. If temp file does not exist, only read live conf.
	for($file = 0; $file < ($tempfile ? 2 : 1); $file++)
	{
        if (open(fh,"< $baseFile") == 0)
		{
			print "Error opening $baseFile!\n";
			return false;
		}		
		
		$cmd = "";
		while( <fh> )
		{
			$line = $_;
			chomp($line);
			## Ignore comments.
			next if( $line =~ "/^#/" );
			
			for($i = 0; $i < $param_count; $i++)
			{
				## This is a non-array value that we already have,
				next if( !(ref(@parameters[$i]) =~ "ARRAY") &&
				    	 ($parameters[$i] eq "") );
			    
				## Loop through this line as many times as required for
				## our separators.  When reading the conf file, our command
				## separator is just "=".  For temp file reading, it can be
				## either "=" or "_TEMP=".
				$got_it = 0;
				for( $sep = 0; $sep < ($tempfile ? 2 : 1); $sep++)
				{
#					print "$sep: $parameters[$i]\n";
					## Get the command to compare.
					$cmd = ( ref(@parameters[$i]) =~ "ARRAY"
							 ? $parameters["$i"][0]
							 : $parameters[$i] ) .
							 $separators[$sep];
				  
				  	## Compare command with read line
					if(substr($line, 0, length($cmd) ) =~ "$cmd")
					{
						$got_it = 1;
						## Found it.  Add to proper place in return array.
						if( ref(@parameters[$i]) =~ "ARRAY" )
						{
							# Add to sub-array.
							($cmd, $value) = split("=", $line, 2);
							$list = @return_list[$i];
							push(@list, $value);
							$return_list[$i] = @list;
						}else{
							($cmd, $return_list[$i]) = split("=", $line, 2);
						}
					}
					last if( $got_it);
				}
			}
		 	if( !$at_least_one_array)
			{
				## If no arrays, see if we're done with all parameters.
				$params_left = 0;
				for($i = 0; $i < $param_count; $i++)
				{
					next if( !(ref(@parameters[$i]) =~ "ARRAY") &&
				    	 	 ($parameters[$i] eq "") );
					$params_left = 1;
				}
				last if( !$params_left);
			}
		}
		
		close fh;
		
	}

	return @return_list;
}
