#!/bin/ksh -p
#
# ident "@(#)utdhcpopt.ksh	1.4 05/01/24 SMI"
#
# Copyright 2004-5 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#

# names of files and directories that will be touched by this script
#
TMPDIR="/var/opt/SUNWut/tmp"
CORONA_NAME="SunRay";
CORONA_TITLE="Sun Ray";

LEASE_DAYS=1;
LOG_KERN=6;
LOG_NET=6;
LOG_USB=6;
LOG_VID=6;
LOG_APPL=6;
AUTH_PORT=7009;

ProcessAdd() {
	BEGAN=false

	while read input
	do
		case $input in
		(begin*)
			COMMAND=${input#begin }
			if [[ $COMMAND = "options" ]]; then
				BEGAN=true
				grep "$CORONA_NAME " $DHTADM_P >/dev/null 2>&1
				if [[ $? = "0" ]]; then
					print -u2 "DHCP options configuration already exists."
					exit 1
				fi
			elif [[ $COMMAND = "ether" ]]; then
				BEGAN=true
			else
				print -u2 "Error: Invalid block type.  Please try again."
				exit 1
			fi		
			;;
		(end)
			break
			;;
		(macaddress*)
			if $BEGAN; then
				ConvertKeyToLower "$input"
				input="$_RETURN_VAL"
				ETHER=${input#macaddress=}
				normalizeEther
				UT_DHCP_MACADDRESS=$ETHER
				grep "$UT_DHCP_MACADDRESS" $DHTADM_P >/dev/null 2>&1
                                if [[ $? = "0" ]]; then
                                        print -u2 "DHCP ether configuration already exists."
                                        exit 1
                                fi	
			else
				print -u2 "Error: Input must start with a \"begin\" statement"
				exit 1	
			fi
			;;
		(*)
			if ! $BEGAN ; then
				print -u2 "Error: Input must start with a \"begin\" statement"
				exit 1
			else
				ConvertKeyToLower "$input"
                        	input="$_RETURN_VAL"
				SourceOptions "$input"
			fi
			;;
		esac
	done
	if [[ $COMMAND = "options" ]]; then
		ValidateOptionsBlock
		if [[ $? != 0 ]]; then
			print -u2 "Error: Invalid options block"
			exit 1
		else
			AddVendorOptions
			AddSunrayOptions
			if [[ $? = "0" ]]; then
				print "Configuration added."
				exit 0
			else
				print -us "Error: Could not add configuration."
				exit 1 
			fi
		fi
	elif [[ $COMMAND = "ether" ]]; then	
		ValidateEtherBlock
		if [[ $? != 0 ]]; then
                        print -u2 "Error: Invalid ether block"
                        exit 1
		else
			AddEther
		fi
	fi
}

AddEther() {
	ConstructOptionsMacro
	dhtadm -A -m "01$UT_DHCP_MACADDRESS" -d "$CORONA_MACRO" 2> ${TMPDIR}/Err.$$;
	if [ ${?} -ne 0 ]
	then
		print -u2 "Error: cannot create macro \"01$UT_DHCP_MACADDRESS\":"
		print -u2 $(cat ${TMPDIR}/Err.$$)
		rm -f ${TMPDIR}/Err.$$;
		exit 1;
	fi
	rm -f ${TMPDIR}/Err.$$;
}

RemoveEther() {
	dhtadm -D -m "01$UT_DHCP_MACADDRESS" 2> ${TMPDIR}/Err.$$;
	if [ ${?} -ne 0 ]
	then
		print -u2 "Error: cannot remove \"01$UT_DHCP_MACADDRESS\" macro:"
		print -u2 $(cat ${TMPDIR}/Err.$$)
		rm -f ${TMPDIR}/Err.$$;
		exit 1;
	fi
	rm -f ${TMPDIR}/Err.$$;
}

RemoveSunrayOptions() {
	dhtadm -D -m "${CORONA_NAME}" 2> /dev/null
}

AddSunrayOptions() {
    ConstructOptionsMacro
    let LEASE=${LEASE_DAYS}\*86400;
    CORONA_MACRO=":LeaseTim=${LEASE}:LeaseNeg${CORONA_MACRO}"
    dhtadm -D -m "${CORONA_NAME}" 2> /dev/null
    dhtadm -A -m "${CORONA_NAME}" -d "${CORONA_MACRO}" 2> ${TMPDIR}/Err.$$;

    if [ ${?} -ne 0 ]; then
  	print -u2 "Error:  cannot add server macro \"${CORONA_NAME}\" to dhcptab:\n    `cat ${TMPDIR}/Err.$$`"
	 rm -f ${TMPDIR}/Err.$$
	 return 1;
    else
  	rm -f ${TMPDIR}/Err.$$
    fi
    return 0
}

RemoveVendorOptions() {
	# remove them first
	typeset TMPBATCH=${TMPDIR}/setupdhcp-batch.$$
	rm -f ${TMPBATCH} 2> /dev/null
	touch ${TMPBATCH}
	for i in `cat $DHTADM_P | awk '/SUNW.NewT.SUNW/ { print $1 }'`; do
		print "dhtadm -D -s $i" >> ${TMPBATCH}
	done
	if [[ -s $TMPBATCH ]]; then
		# CR 6217989 - dhtadm -B errors on Solaris x86
		DoDhcpBatch dhtadm $TMPBATCH 2> /dev/null	# ignore errors
	fi
 	rm -f ${TMPBATCH}
}

AddVendorOptions() {
	RemoveVendorOptions
	typeset TMPBATCH=${TMPDIR}/setupdhcp-batch.$$  
  	print "dhtadm -A -s AuthSrvr -d 'Vendor=SUNW.NewT.SUNW,21,IP,1,1'" > ${TMPBATCH}
  	print "dhtadm -A -s AltAuth -d 'Vendor=SUNW.NewT.SUNW,35,IP,1,0'" >> ${TMPBATCH}
  	print "dhtadm -A -s AuthPort -d 'Vendor=SUNW.NewT.SUNW,22,NUMBER,2,1'" >> ${TMPBATCH}
  	print "dhtadm -A -s NewTVer -d 'Vendor=SUNW.NewT.SUNW,23,ASCII,1,0'" >> ${TMPBATCH}
  	print "dhtadm -A -s NewTBW -d 'Vendor=SUNW.NewT.SUNW,30,NUMBER,4,1'" >> ${TMPBATCH}
  	print "dhtadm -A -s LogHost -d 'Vendor=SUNW.NewT.SUNW,24,IP,1,1'" >> ${TMPBATCH}
  	print "dhtadm -A -s LogKern -d 'Vendor=SUNW.NewT.SUNW,25,NUMBER,1,1'" >> ${TMPBATCH}
  	print "dhtadm -A -s LogNet -d 'Vendor=SUNW.NewT.SUNW,26,NUMBER,1,1'" >> ${TMPBATCH}
  	print "dhtadm -A -s LogUSB -d 'Vendor=SUNW.NewT.SUNW,27,NUMBER,1,1'" >> ${TMPBATCH}
  	print "dhtadm -A -s LogVid -d 'Vendor=SUNW.NewT.SUNW,28,NUMBER,1,1'" >> ${TMPBATCH}
  	print "dhtadm -A -s LogAppl -d 'Vendor=SUNW.NewT.SUNW,29,NUMBER,1,1'" >> ${TMPBATCH}
  	print "dhtadm -A -s FWSrvr -d 'Vendor=SUNW.NewT.SUNW,31,IP,1,1'" >> ${TMPBATCH}
  	print "dhtadm -A -s Intf -d 'Vendor=SUNW.NewT.SUNW,33,ASCII,1,0'" >> ${TMPBATCH}
  	print "dhtadm -A -s NewTFlags -d 'Vendor=SUNW.NewT.SUNW,34,NUMBER,4,1'" >> ${TMPBATCH}
  	print "dhtadm -A -s BarrierLevel -d 'Vendor=SUNW.NewT.SUNW,36,NUMBER,4,1'" >> ${TMPBATCH}
	# CR 6217989 - dhtadm -B errors on Solaris x86
	DoDhcpBatch dhtadm $TMPBATCH 2> ${TMPDIR}/Err.$$;
  	if [ ${?} -ne 0 ]; then
		print -u2 "Error:  cannot add SunRay symbols to dhcptab:\n	  `cat ${TMPDIR}/Err.$$`"
		rm -f ${TMPBATCH} ${TMPDIR}/Err.$$;
		return 1;
  	fi
	rm -f ${TMPBATCH} ${TMPDIR}/Err.$$;

}

ProcessDelete() {
	BEGAN=false

	while read input
	do
       		case $input in
		(begin*)
			COMMAND=${input#begin }
			if [[ $COMMAND = "options" ]]; then
				grep "$CORONA_NAME " $DHTADM_P >/dev/null 2>&1
				if [[ $? != 0 ]]; then
					print -u2 "Configuration for DHCP options does not exist."
					exit 1
				fi
				BEGAN=true
			elif [[ $COMMAND = "ether" ]]; then
				BEGAN=true
			else
				print -u2 "Error: Must be either an 'options' or 'ether' block"
				exit 1
			fi
                        ;;
		(end)
                        if $BEGAN; then
				if [[ $COMMAND = "options" ]]; then
					RemoveSunrayOptions
					RemoveVendorOptions
				elif [[ $COMMAND = "ether" ]]; then
					RemoveEther
				fi
                        else
                                return 0
                        fi
			break
				;;
		(macaddress*)
			if $BEGAN; then
				ConvertKeyToLower "$input"
				input="$_RETURN_VAL"
				ETHER=${input#macaddress=}
				normalizeEther
				UT_DHCP_MACADDRESS=$ETHER
				grep "$UT_DHCP_MACADDRESS" $DHTADM_P >/dev/null 2>&1
				if [[ $? != "0" ]]; then
                                        print -u2 "DHCP ether configuration $UT_DHCP_MACADDRESS does not exist."
                                        exit 1
				fi
			else
				print -u2 "Error: Input must start with a \"begin\" statement"
				exit 1
                        fi
                        ;;
		(*)
                        if $BEGAN; then
                                print -u2 "Error: Invalid argument."
				exit 1
                        else
                                print -u2 "Error: Must specify a valid block."
				exit 1
                        fi
					;;
		esac
	done
	print "Configuration deleted."
}

ProcessChange() {
	BEGAN=false

	grep "$CORONA_NAME " $DHTADM_P >/dev/null 2>&1
	if [[ $? != 0 ]]; then
		print -u2 "Configuration for DHCP options does not exist."
		exit 1
	fi
	TranslateDhtadmP
        InitDHCPBlockParser $UTDHCPFILE
        while read input
        do
                case $input in
                (begin*)
			COMMAND=${input#begin }
			if [[ $COMMAND = "options" ]]; then
				grep "$CORONA_NAME " $DHTADM_P >/dev/null 2>&1
				if [[ $? != 0 ]]; then
                                        print -u2 "Configuration for DHCP options does not exist."
                                        exit 1
				fi
				GetNextDHCPBlock options
                                BEGAN=true
			elif [[ $COMMAND = "ether" ]]; then
				BEGAN=true
			else
                            	print -u2 "Error: Must be either an 'options' or 'ether' block"
				exit 1
			fi
                        ;;
                (end)
                        break
                        ;;
		(macaddress*)
			if $BEGAN; then
				ConvertKeyToLower "$input"
				input="$_RETURN_VAL"
				ETHER=${input#macaddress=}
				normalizeEther
				UT_DHCP_MACADDRESS=$ETHER
				grep "$UT_DHCP_MACADDRESS" $DHTADM_P >/dev/null 2>&1
				if [[ $? != "0" ]]; then
                                        print -u2 "DHCP ether configuration $UT_DHCP_MACADDRESS does not exist."
                                        exit 1
				fi
				while GetNextDHCPBlock ether
                                do
                                        if [[ $UT_DHCP_MACADDRESS = $ETHER ]]; then
						break
					fi
				done
			else
                            	print -u2 "Error: Input must start with a \"begin\" statement"
				exit 1
			fi
                        ;;
                (*)
                        if ! $BEGAN ; then
                                print -u2 "Error: Input must start with a \"begin\" statement"
				exit 1
			else
				ConvertKeyToLower "$input"
                        	input="$_RETURN_VAL"
                        	SourceOptions "$input" 
			fi
                        ;;
                esac
        done
	DestroyDHCPBlockParser
	rm -f $UTDHCPFILE 2>/dev/null
	if [[ $COMMAND = "options" ]]; then
		ValidateOptionsBlock
        	if [[ $? != 0 ]]; then
                	print -u2 "Error: Invalid options block"
                	exit 1
        	else
			AddVendorOptions
			AddSunrayOptions
			if [[ $? = "0" ]]; then
				print "Configuration changed."
				exit 0
			else
                    		print -us "Error: Could not change configuration."
				exit 1
			fi
		fi
	elif [[ $COMMAND = "ether" ]]; then
		ValidateEtherBlock
		if [[ $? != 0 ]]; then
			print -u2 "Error: Invalid ether block"
			exit 1	
		else
			RemoveEther
			AddEther
			print "Configuration changed."
		fi
        fi
        exit 0
}

ListEtherBlocks() {
	TranslateDhtadmP
	if [[ $? != 0 ]]; then
		return 0
	fi
	InitDHCPBlockParser $UTDHCPFILE
	if [[ $? != 0 ]]; then
		return 0
	fi
        while GetNextDHCPBlock ether
	do
          	CreateDHCPBlock ether
	done
	DestroyDHCPBlockParser
	rm -f $UTDHCPFILE 2>/dev/null
}

ListOptionsBlocks() {
	TranslateDhtadmP
	if [[ $? != 0 ]]; then
		return 0
	fi
	InitDHCPBlockParser $UTDHCPFILE
	if [[ $? != 0 ]]; then
                return 0
        fi
	while GetNextDHCPBlock options
        do
                CreateDHCPBlock options
	done	
	DestroyDHCPBlockParser
	rm -f $UTDHCPFILE 2>/dev/null
}

# main

trap "rm -rf ${TMPDIR}/*.$$; exit" 0 1 2 3 14 15

ETC_OPT_UT="/etc/opt/SUNWut"
UT_DHCP_BASEDIR=`(cd ${ETC_OPT_UT}/dhcp ; /bin/pwd)`
. ${UT_DHCP_BASEDIR}/../../support_lib/dhcp_config
. ${UT_DHCP_BASEDIR}/dhcp_config_solaris

GetCurrentCfg

if [[ $# = 0 ]]; then
	ListOptionsBlocks
	ListEtherBlocks
	exit 0
fi	

case $1 in
(add)
	ProcessAdd 
	;;
(change)
	ProcessChange 
	;;
(delete)
	ProcessDelete 
	;;
(list)
        if [[ $# = 1 ]]; then
                ListOptionsBlocks
                ListEtherBlocks
                exit 0  
        fi
        if [[ $2 = "options" ]]; then
                ListOptionsBlocks
                exit 0
        elif [[ $2 = "ether" ]]; then
                ListEtherBlocks
                exit 0
        else    
                print -u2 'Must specify either options or ether.'
                exit 1
        fi
        ;;
(*)
	exit 1
esac
