#!/bin/bash
#
#filtermonitor ver1.0.3
#
# usage: 
#	filtermonitor option param1 param2 param3 param4
#
# Description: 
#	for select filtermonitor's command
#####################################################################
#include files
. $PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorUsage
. $PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorCommonFunc
. $PATHPREFIX/etc/FilterMonitor/MessageList
#S-fix for Ver1.0.3
#export PATH=${PATH}:"/bin:/sbin:/usr/bin:/usr/bin:/usr/sbin"
export PATH=${PATH}:"/bin:/sbin:/usr/bin:/usr/bin:/usr/sbin:/usr/local/bin"
#E-fix for Ver1.0.3
#permission for new files
umask 077
#define Values###################################################################
option=$1
param1=$2
param2=$3
param3=$4
param4=$5
callfunc=1
calib=1
autodetect=2
detect=3
status=4
set=5
save=6
restore=7
get=8
graph=9
test=10
log=11
usage=12
funcret=0
DetectAirFlow=0
funcname="filtermonitor"
tracelevel=0
AlreadyCalib=0
SETTINGFILE="/etc/FilterMonitor/FilterMonitorSetting"
LOCKFILE="FilterMonitorLock"
LOCKLOGFILE="/var/lock/FilterMonitor/FilterMonitorLockLog"
SKUFILE="/etc/FilterMonitor/SKUDefine"
SetPath="/etc/FilterMonitor"

#define functions################################################################
#checking file exist
FileChk(){
	$PATHPREFIX/usr/bin/FilterMonitor/FM_FileChk $1
	if [ $? -eq 0 ]
	then 
	 	echo -e "Internal error occurs. Please contact to customer service for the support."
		$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorLog tracelog $funcname DEBUG $tracelevel $callfunc "$1 is not exist."
		$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorLog syslog $funcname ERR $tracelevel $callfunc "${msg[16]}"
		$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorLog tracelog $funcname INFO $tracelevel $callfunc "$funcname end"
		exit 1
	fi
}

#finalize function
Finalize()
{	
	#Free lock file 	
	flock -u 9
	if [ $? -eq 1 ]
	then
		$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorLog tracelog $funcname DEBUG $tracelevel $callfunc "lockfile can not be free."
	fi

	#Delete lock file
	#change for FreeBSD Ver1.0.3
	if [ -d "/var/lock/" ]
	then
		rm -rf "/var/lock/FilterMonitor/" 2> /dev/null
	else
		rm -rf "/var/run/FilterMonitor/" 2> /dev/null
	fi

	$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorLog tracelog $funcname INFO $tracelevel $callfunc "$funcname end"
	exit $1
}

#check options and return options
OptionChk(){
	$PATHPREFIX/usr/bin/FilterMonitor/FM_OptionChk $callfunc $tracelevel $option\
 $param1 $param2 $param3 $param4
	option=`echo ${?}`
	if [ $option -ne 0 ]
	then 	
		return $option
	else 

		FilterMonitorUsage
		$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorLog tracelog $funcname INFO $tracelevel $callfunc "Option is not correct."
		exit 1
	fi
}

#start log
$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorLog tracelog $funcname INFO $tracelevel $callfunc "$funcname start"

#check lockfile path
#S-fix for Ver1.0.3
if [ -d "/var/lock/" ]
then
	mkdir "/var/lock/FilterMonitor/" 2> /dev/null
	LOCKPATH="/var/lock/FilterMonitor"
else
	mkdir "/var/run/FilterMonitor/" 2> /dev/null
	LOCKPATH="/var/run/FilterMonitor"
fi

#check lock file
if [ ! -f $LOCKPATH/$LOCKFILE ]
then
	touch "$LOCKPATH/$LOCKFILE"
fi

exec 9>>"$LOCKPATH/$LOCKFILE"
#E-fix for Ver1.0.3
flock -n 9
if [ $? -ne 0 ] 
then
	echo -e "Filter Monitor command is already being executed. Please try again after the command."
	$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorLog tracelog $funcname DEBUG $tracelevel $callfunc "Filter Monitor command is already being executed. "
	$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorLog syslog $funcname INFO $tracelevel $callfunc "${msg[2]}"
	exit 1
fi

#files check
FileChk $SETTINGFILE
FileChk $SKUFILE
FileChk $PATHPREFIX/usr/bin/FilterMonitor/FM_FileChk
FileChk $PATHPREFIX/usr/bin/FilterMonitor/FM_OptionChk
FileChk $PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorCalib
FileChk $PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorMeasure
FileChk $PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorDetect
FileChk $PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorSetting
FileChk $PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorSaving
FileChk $PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorRestore
FileChk $PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorGet
FileChk $PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorStatus
FileChk $PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorGraph
FileChk $PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorTest
FileChk $PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorIPMI
FileChk $PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorLog
FileChk $PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorSetCron
FileChk $PATHPREFIX/usr/bin/FilterMonitor/FM_FileDataChk

#get CurrentTraceLogLevel and AlreadyCalib from FilterMonitorSetting
read line < $SETTINGFILE
arr=(`echo $line | tr -s ',' ' '`)
# HighBall-S
#HWID=`echo ${arr[0]}`
SKU=`echo ${arr[0]}`
# HighBall-E
AlreadyCalib=`echo ${arr[4]}`
tracelevel=`echo ${arr[7]}`

#export IFS=","
# HighBall-S
#HighBall-S
#SKU=(`echo $sensnum | grep "$HWID" $SKUFILE`)
#SKU=(`echo $sensnum | grep "$SKU" $SKUFILE`)
#HighBall-E
# HighBall-E
#HighBall-S
#arr2=(`echo $SKU | tr -s ',' ' '`)
#SenNum=`echo ${arr2[1]}`
#Sensornum is fixed value,no need to change.
SenNum="C8"
#HighBall-E


#check CurrentTraceLogLevel is only 1 or 0
TRACELEVEL_CHECK=`expr "$tracelevel" : '\([0-1]\)$'`
if [ -z $TRACELEVEL_CHECK ]
then
	echo -e "Internal error occurs. Please contact to customer service for the support."	
	$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorLog syslog $funcname ERR $tracelevel $callfunc "${msg[16]}"	
	Finalize 1;
fi

#SensorStatus is not 0 then AlreadyCalib set 1
CALIB_CHECK=`expr "$AlreadyCalib" : '\([1-3]\)$'`
if [ ! -z $CALIB_CHECK ]
then
	AlreadyCalib=1
elif [ "$AlreadyCalib" -eq 0 ]
then
	AlreadyCalib=0
else
	echo -e "Internal error occurs. Please contact to customer service for the support."
	$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorLog syslog $funcname ERR $tracelevel $callfunc "${msg[16]}"
	Finalize 1;
fi

#optioncheck
OptionChk
case "$?" in
	"$calib")
		$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorCalib $callfunc $tracelevel
		;;

	"$autodetect")
		#calib is done?
		if [ "$AlreadyCalib" -eq 1 ]
		then
			$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorMeasure $autodetect $DetectAirFlow $tracelevel 
			funcret=`echo $?`
			if [ "$funcret" -eq 0 ] 
			then
				$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorDetect $autodetect $DetectAirFlow $tracelevel
			else
				Finalize 1;
			fi
		else
			$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorLog tracelog $funcname INFO $tracelevel $callfunc "Initialization is not completed."
			Finalize 1;
		fi;;

	"$detect")
		#not autodetect 
		DetectAirFlow=1

		#calib is done?
		if [ "$AlreadyCalib" -eq 1 ]
		then
			$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorMeasure $detect $DetectAirFlow $tracelevel
			funcret=`echo $?`
			if [ "$funcret" -eq 0 ] 
			then
				$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorDetect $detect $DetectAirFlow $tracelevel 

			elif [  "$funcret" -eq 6 ]
			then
				echo -e "Getting the information of the machine failed. The installation of Filter Replacement Sensor has troubles or the sensor may be broken. Please contact to customer service for the support."
				Finalize 1;
			else
				$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorLog tracelog $funcname DEBUG $tracelevel $callfunc "FileterMoniorDetect Failed:$funcret."
				Finalize 1;
			fi
		else
			echo -e "Initialization is not completed. Please execute the initialization."
			$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorLog tracelog $funcname INFO $tracelevel $callfunc "Initialization is not completed."
			Finalize 1;
		fi;;

	"$status")
		$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorStatus $callfunc $tracelevel
		;;

	"$set")
		$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorSetting $callfunc $AlreadyCalib $param1 $param2 $param3 $param4 $tracelevel
		;;

	"$save")
		$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorSaving $callfunc $param1 $tracelevel
		;;

	"$restore")
   		#Already calib?
		if [ "$AlreadyCalib" -eq 1 ]
		then
			$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorRestore $callfunc $param1 $tracelevel
		else
			echo -e "Initialization is not completed. Please execute the initialization."
			$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorLog tracelog $funcname INFO $tracelevel $callfunc "Initialization is not completed."
			Finalize 1;
		fi;;

	"$get")
		$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorGet $callfunc $tracelevel
		;;

	"$graph")
		if [ "$AlreadyCalib" -eq 1 ]
		then
# HighBall-S
#			$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorGraph $graph $tracelevel $HWID $param1 $param2
			sensorcount=0
			sensorcount=(`find $SetPath -iname $param1 | wc -l`)
			if [ $sensorcount -ne 0 ]
			then
				case "$param2" in
				"w1")
					$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorGraph $graph $tracelevel $SKU $param1 $param2;;
				"m1")
					$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorGraph $graph $tracelevel $SKU $param1 $param2;;
				"m3")
					$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorGraph $graph $tracelevel $SKU $param1 $param2;;
				"m6")
					$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorGraph $graph $tracelevel $SKU $param1 $param2;;
				"y1")
					$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorGraph $graph $tracelevel $SKU $param1 $param2;;
				"y3")
					$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorGraph $graph $tracelevel $SKU $param1 $param2;;
				"y5")
					$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorGraph $graph $tracelevel $SKU $param1 $param2;;
				*)
					FilterMonitorUsage
					Finalize 1
					;;
				esac
			else
					FilterMonitorUsage
					Finalize 1;
			fi
# HighBall-E
		else
			echo -e "Initialization is not completed. Please execute the initialization."
			$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorLog tracelog $funcname INFO $tracelevel $callfunc "Initialization is not completed."
			Finalize 1;
		fi;;

	"$test")
# HighBall-S
#		$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorTest $callfunc $tracelevel $param1 $SenNum
		checkval=`echo -n $param1 |sed 's/[0-9]//g'`
		if [ -n "$checkval" ]
		then
			if [ ${param1} != "@" ]
			then
			FilterMonitorUsage
			Finalize 1			
			fi
			$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorTest $callfunc $tracelevel $param1 $SenNum
		else
			$PATHPREFIX/usr/bin/FilterMonitor/FilterMonitorTest $callfunc $tracelevel $param1 $SenNum

		fi;;
# HighBall-E

	"$log")
		#check prarm1 is 0 or 1
		TRACELEVEL_CHECK=`expr "$param1" : '\([0-1]\)$'`
		if [ ! -z $TRACELEVEL_CHECK ]
		then
			read line < $SETTINGFILE
			#replace the comma to space in $line to for put the array
			arr=(`echo $line | tr -s ',' ' '`)

			#put $param1 in TraceLogLevel 
			arr[7]=`echo $param1`

			#replace the  space to comma in $line to for put the setting file
			echo ${arr[@]} | tr -s ' ' ',' > $SETTINGFILE

		else
			FilterMonitorUsage
                     Finalize 1			
		fi;;

	"$usage")
		FilterMonitorUsage
		Finalize 0
		;;
	"*")
		FilterMonitorUsage
		Finalize 1
		;;
esac
Finalize 0

