#!/bin/sh



#
# Functions
#


cron_update()
{
	CRON_UPD_ERR=$(cat $CRON_TAB|crontab - 2>&1 >/dev/null)
	
	#crontab will not always return proper err codes
	if [ $? -eq 0 ] 
	then
		if [ "$CRON_UPD_ERR" != "" ] 
		then
			#we've got something on stderr, so we assume there's an error
			return 1
		else
			#hope it's ok
			return 0
		fi
	else
		return 1
	fi
}


cron_job_exists()
{
	if [ "`grep "^#BDC_CRON_JOB $1$" $CRON_TAB`" = "" ]
	then
		#it does not exist
		return 0
	fi
	#it exists
	return 1
}


cron_add()
{
	if [ "$2" != ""  ]
	then
		#use the given id
		JOB_ADD_ID=$2
	else
		#find the first free id
		JOB_ADD_ID="0"
		cron_job_exists $JOB_ADD_ID
		while [ $? -eq 1 ]
		do
			JOB_ADD_ID=`expr $JOB_ADD_ID + 1`
			cron_job_exists $JOB_ADD_ID
		done
	fi
	
	echo "
#BDC_CRON_JOB $JOB_ADD_ID
$1"	>>$CRON_TAB
	
	cron_update
	return $?
}


_dialog()
{
	_READ=""
	while [ "$_READ" = "" ]
	do
		#pop the question
		echo $ECHO_N $2 $ECHO_C
		
		#echo default value (if any)
		if [ "$3" != "" ]
		then
			echo $ECHO_N " ${CC_BOLD}[${CC_RST}""$3""${CC_BOLD}]${CC_RST}" $ECHO_C
		fi
		echo $ECHO_N " : " $ECHO_C
		read _READ
		if [ "$_READ" = "" ]
		then
			_READ=$3
		fi
	done
	eval $1=\"$_READ\"
}


_get_job_cron()
{
	echo
	echo " > Enter BDC CronJob time settings"
	echo
	
	#get min
	_dialog _GET_MINUTE " Minutes value" "$1"
		
	#get hour
	_dialog _GET_HOUR "  Hour value" "$2"
	
	#get DAYM
	_dialog _GET_DAYM " Day of Month value" "$3"
	
	#get month
	_dialog _GET_MONTH " Month value" "$4"
	
	#get DAYW
	_dialog _GET_DAYW " Day of Week value" "$5"
}


get_bdc_path()
{
	#get bdc path
	if [ -x /usr/local/bitdefender/lib/bdc ]
	then
		BDC_PATH=/usr/local/bitdefender/lib/bdc
	elif [ -x /usr/local/bdc/bdc ]
	then
		BDC_PATH=/usr/local/bdc/bdc
	elif [ -x /opt/BitDefender/lib/bdc ]
	then
		BDC_PATH=/opt/BitDefender/lib/bdc
	elif [ -x /opt/bdc/bdc ]
	then	
		BDC_PATH=/opt/bdc/bdc
	else
		BDC_PATH=""
	fi

	return 0
}


_get_path()
{
	_dialog _PATH "$2" "$3"
	while [ ! -e $_PATH ]
	do
		echo " > Invalid path"
		_dialog _PATH "$2" "$3"
	done
	eval $1=\"$_PATH\"
}

_get_scan_job()
{
	echo
	echo " > Enter BDC Scan CronJob settings"
	echo
	
	#get bdc path
	if [ "$2" = ""  ]
	then
		get_bdc_path
	else
		BDC_PATH=$2
	fi
	
	_get_path _GET_BDC_PATH " BDC path" $BDC_PATH
	
	#get scan path
	_get_path _GET_SCAN_PATH " Path to be scanned" "$1"
	
	#get scan opt
	_dialog _GET_SCAN_OPT " Scan options" "$3"
	
	_get_job_cron "$4" "$5" "$6" "$7" "$8"
}


_add()
{
        _get_scan_job "/" "" "--files --arc --mail --list --move --moves" "0" "0" "*" "*" "*"
        cron_add "$_GET_MINUTE $_GET_HOUR $_GET_DAYM $_GET_MONTH $_GET_DAYW $_GET_BDC_PATH $_GET_SCAN_OPT $_GET_SCAN_PATH"
        if [ $? -eq 1 ] 
        then
        	echo
        	echo " > BDC Scan CronJob ID $JOB_ADD_ID could not be configured ($CRON_UPD_ERR)"
        	echo
        	return 1
        fi
        echo
        echo " > BDC Scan CronJob ID $JOB_ADD_ID successfully configured"
        echo
        return 0
}




cron_get_job()
{
	eval $1=\""`grep -A 1 "^#BDC_CRON_JOB $2$" $CRON_TAB|tail -1`"\"
}


_list()
{
	JOB_ID_LIST=`grep "^#BDC_CRON_JOB [^U]" $CRON_TAB|awk '{print $2}'`
	if [ "$JOB_ID_LIST" = "" ]
	then
		echo
		echo " > There are no BDC Scan CronJobs configured"
		echo
		return 1
	fi
	for ID in $JOB_ID_LIST
	do
		cron_get_job CR_JOB $ID
		echo
		echo " > BDC Scan CronJob ${CC_BOLD}ID $ID${CC_RST} :"
		echo
		echo "        $CR_JOB"
		echo
	done
	return 0
}


cron_del()
{
	JOB_LN=`cat -n $CRON_TAB|grep "#BDC_CRON_JOB $1$"|head -1|awk '{print $1}'`
	JOB_LN_2=`expr $JOB_LN + 1`
	cat $CRON_TAB|sed -e "$JOB_LN,`expr $JOB_LN + 1`d" >$CRON_TAB.sed
	mv -f $CRON_TAB.sed $CRON_TAB
	cron_update
	return $?
}


_get_job_id()
{
	ID=-1
	while [ $ID -lt 0 ]
	do
		#ask for a job id
		_dialog ID " CronJob ID"
		#make sure we've got a numerical value
        	ID=$(echo $ID | awk '{ret+=$1; print ret}' 2>&1)
	done
	
	eval $1=\"$ID\"
	
	#is it a new one or not ?
	cron_job_exists $ID
	return $?
}


_get_exist_job_id()
{
	echo
	echo " > Enter the BDC CronJob ID"
	echo
	_get_job_id EX_ID
	while [ $? -eq 0 ]
	do
		echo " > BDC CronJob ID $EX_ID does not exist"
		_get_job_id EX_ID
	done
	eval $1=\"$ID\"
}



_del()
{
	#are there any scan jobs in there ?
	if [ "`grep "^#BDC_CRON_JOB [^U]$" $CRON_TAB`" = "" ]
	then
		echo
		echo " > There are no BDC Scan CronJobs configured"
		echo
		return 1
	fi
	
	#get job ID to be deleted
	_get_exist_job_id ID
	
	cron_del $ID
        echo
        echo " > BDC Scan CronJob ID $ID successfully deleted"
        echo
        return 0
}


cron_imp_job()
{
	cron_get_job IMP_JOB "$1"
	IJ_MIN="$(echo "$IMP_JOB"|awk '{print $1}')"
	IJ_HOUR="$(echo "$IMP_JOB"|awk '{print $2}')"
	IJ_DAYM="$(echo "$IMP_JOB"|awk '{print $3}')"
	IJ_MONTH="$(echo "$IMP_JOB"|awk '{print $4}')"
	IJ_DAYW="$(echo "$IMP_JOB"|awk '{print $5}')"
	IJ_BDC_PATH="$(echo "$IMP_JOB"|awk '{print $6}')"
	#because the update job does not have a path we need a little awk script
	IJ_SCAN_OPT="$(echo "$IMP_JOB"|awk '{ if ( NF == 7) { printf NF } else { for(i=7;i<NF;i++) printf $i } }')"
	IJ_SCAN_PATH="$(echo "$IMP_JOB"|awk '{print $NF}')"
}

_edit()
{	
	#are there any scan jobs in there ?
	JOB_ID_LIST=`grep "^#BDC_CRON_JOB [^U]" $CRON_TAB|awk '{print $2}'`
	if [ "$JOB_ID_LIST" = "" ]
	then
		echo
		echo " > There are no BDC Scan CronJobs configured"
		echo
		return 1
	fi

	#get job ID to edit
	_get_exist_job_id ID
	
	#import the cron job
	cron_imp_job $ID
	
	#get new job settings
	_get_scan_job "$IJ_SCAN_PATH" "$IJ_BDC_PATH" "$IJ_SCAN_OPT" "$IJ_MIN" "$IJ_HOUR" "$IJ_DAYM" "$IJ_MONTH" "$IJ_DAYW" "$IJ_BDC_PATH"

	#backup crontab
	cp $CRON_TAB $CRON_TAB.bak
        CRON_TAB_BAK=$CRON_TAB
	CRON_TAB="$CRON_TAB.bak"
        
	#delete the old job
        cron_del $ID

	#add the new job, with the sane ID, save any err
        cron_add "$_GET_MINUTE $_GET_HOUR $_GET_DAYM $_GET_MONTH $_GET_DAYW $_GET_BDC_PATH $_GET_SCAN_OPT $_GET_SCAN_PATH" "$ID"
	
	if [ $? -eq 1 ]
	then
		#huston, we have a problem
		CRON_TAB=$CRON_TAB_BAK
		ED_ERR=$CRON_UPD_ERR
		cron_update
        	echo
        	echo " > BDC Scan CronJob ID $ID could not be configured ($ED_ERR)"
        	echo
        	return 1

	fi
        echo
        echo " > BDC Scan CronJob ID $ID successfully configured"
        echo
        return 0
}


_add_update()
{
	cron_job_exists "UPDATE"
	if [ $? -eq 1 ]
	then
		echo
		echo " > BDC Update CronJob has already been configured"
		echo
		return 1
	fi
	
	echo
	echo " > Enter BDC Update CronJob settings"
	echo

	get_bdc_path
	_get_path _GET_BDC_PATH " BDC path" $BDC_PATH
	
	_get_job_cron "0" "*/3" "*" "*" "*"
	cron_add "$_GET_MINUTE $_GET_HOUR $_GET_DAYM $_GET_MONTH $_GET_DAYW $_GET_BDC_PATH --update" "UPDATE"
        if [ $? -eq 1 ]
        then
        	echo
        	echo " > BDC Update CronJob could not be configured ($CRON_UPD_ERR)"
        	echo
        	return 1
        fi
        echo
        echo " > BDC Update CronJob successfully configured"
        echo
        return 0

}


_edit_update()
{
	cron_get_job U_JOB "UPDATE"
	if [ "$U_JOB" = "" ]
	then
		echo
		echo " > There is no BDC Update CronJob configured"
		echo
		return 1
	fi
	
	cron_imp_job "UPDATE"
	
	echo
	echo " > Enter BDC Update CronJob settings"
	echo

	_get_path _GET_BDC_PATH " BDC path" $IJ_BDC_PATH
	_get_job_cron "$IJ_MIN" "$IJ_HOUR" "$IJ_DAYM" "$IJ_MONTH" "$IJ_DAYW"
	
	#backup crontab
	cp $CRON_TAB $CRON_TAB.bak
        CRON_TAB_BAK=$CRON_TAB
	CRON_TAB="$CRON_TAB.bak"
	
	cron_del "UPDATE"
	
	cron_add "$_GET_MINUTE $_GET_HOUR $_GET_DAYM $_GET_MONTH $_GET_DAYW $_GET_BDC_PATH --update" "UPDATE"
	
	if [ $? -eq 1 ]
	then
		#huston, we have a problem
		ED_ERR=$CRON_UPD_ERR
		CRON_TAB=$CRON_TAB_BAK
		cron_update
        	echo
        	echo " > BDC Update CronJob could not be configured ($ED_ERR)"
        	echo
        	return 1

	fi
        echo
        echo " > BDC Update CronJob successfully configured"
        echo
        return 0
}


_list_update()
{
	cron_get_job U_JOB "UPDATE"
	if [ "$U_JOB" = "" ]
	then
		echo
		echo " > There is no BDC Update CronJob configured"
		echo
		return 1
	fi
	
	echo
	echo " > BDC Update CronJob :"
	echo
	echo "       $U_JOB"
	echo
	return 0
}


_del_update()
{
	cron_job_exists "UPDATE"
	if [ $? -eq 0 ]
	then
		echo
		echo " > There is no BDC Update CronJob configured"
		echo
		return 1
	fi	
	cron_del "UPDATE"
	
        echo
        echo " > BDC Update CronJob successfully deleted"
        echo

	return 0
}


_update()
{
	case $1 in
		--add)
			_add_update
		;;
		--edit)
			_edit_update
		;;
		--list)
			_list_update
		;;
		--delete)
			_del_update
		;;
		*)
			echo "Usage :
	$0 --update [OPTIONS]
Valid options are :
	--add		Add the BDC Update CronJob
	--list		List the BDC Update CronJob
	--edit		Edit the BDC Update CronJob
	--delete	Delete the BDC Update CronJob"
		;;
	esac
	return $?
}



#
# Main
#


#do we have crontab?
crontab -l >/dev/null 2>&1
if [ $? -eq 127 ]
then
        echo
        echo " > Cannot find 'crontab' in PATH"
        echo
        exit 1
fi

#get the current crontab
CRON_TAB=$(mktemp /tmp/bdc-cron.crontab.XXXXXXXXXX)
if [ $? -ne 0 ]
then
    echo
    echo " > Can not create temporary file"
    echo
    exit 1
fi
crontab -l -u root 2>/dev/null >$CRON_TAB

#test color change style
if [ -t 1 ];
then
    CC_BOLD="[1m"
    CC_RST="[0m"
fi

#test echo style
case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
  *c*,-n*) ECHO_N= ECHO_C='' ;;
  *c*,*  ) ECHO_N=-n ECHO_C= ;;
  *)       ECHO_N= ECHO_C='\c' ;;
esac

case $1 in
        --add)
                _add
        ;;
        --list)
                _list
        ;;

        --delete)
                _del
        ;;
        --edit)
                _edit
        ;;
        --update)
		_update $2
	;;
        *)
                echo "Usage :
	$0 [OPTIONS]
Valid options are :
	--add		Add a BDC Scan CronJob
	--list		List all BDC Scan CronJobs
	--edit		Edit a BDC Scan CronJob
	--delete	Delete a BDC Scan CronJob
	--update	Manage the BDC Update CronJob"
        ;;
esac

RET=$?

#clean up
rm -f $CRON_TAB  >/dev/null 2>&1
rm -f $CRON_TAB.back  >/dev/null 2>&1

exit $RET
