#!/bin/sh

# Bring up/down dhcpd

. /etc/sysconfig/rc.conf
. /etc/sysconfig/network.conf
. /bin/network-functions

. /etc/image_features

PIDFILE=/var/run/dhcpd.pid
PIDFILE_LAN0=/var/run/dhcpd_lan0.pid
PIDFILE_LAN1=/var/run/dhcpd_lan1.pid
PIDFILE_VLAN=/var/run/dhcpd_vlan.pid
SERVICE=dhcpd
PROCESS_NAME=dhcpd

DHCPD_CONF_LAN0=/var/run/dhcpdlan0.conf
DHCPD_CONF_LAN1=/var/run/dhcpdlan1.conf
DHCPD_CONF_VLAN=/var/run/dhcpdvlan.conf

DHCPD_LAN0_LEASES=/var/state/dhcp/dhcpdlan0.leases
DHCPD_LAN1_LEASES=/var/state/dhcp/dhcpdlan1.leases
DHCPD_VLAN_LEASES=/var/state/dhcp/dhcpdvlan.leases

LOGGER="/bin/logger -t $0"

TryToFixConf()
{
	# keep, copy and try to recover file
	$LOGGER "dhcpd.conf.$ARG_EXT is corrupted! Starting recovery procedure."

	if [ -e /etc/fiad-conf/dhcpd.conf.$ARG_EXT ] ; then
		/bin/mv -f /etc/fiad-conf/dhcpd.conf.$ARG_EXT /etc/fiad-conf/dhcpd.conf.$ARG_EXT.bck > /dev/null
	fi
			
	if [ -e /etc/fiad-conf/dhcpd.conf.$ARG_EXT~ ] ; then
		/bin/cp -f /etc/fiad-conf/dhcpd.conf.$ARG_EXT~ /etc/fiad-conf/dhcpd.conf.$ARG_EXT > /dev/null
		$LOGGER "dhcpd.conf.$ARG_EXT is restored from blueprint."
	else
		/bin/cp -f /etc/default-conf/dhcpd.conf.$ARG_EXT /etc/fiad-conf/dhcpd.conf.$ARG_EXT > /dev/null
		$LOGGER "dhcpd.conf.$ARG_EXT is restored from default configuration file."
	fi
			
	/bin/dhcpdconfupd -r /etc/fiad-conf/dhcpd.conf.$ARG_EXT -n $DHCPD_INTERFACE > /dev/null
	if [ $? != 0 ] ; then
		$LOGGER "Failed to complete recovery procedure."
		return 2
	fi
			
	/bin/ipeconfgen generate normalize > /dev/null 2>&1
			
	DHCP_LEASE_TIME=$(cat /etc/fiad-conf/dhcpd.conf.$ARG_EXT | grep dhcp-lease-time | tr -dc '0-9')
	/bin/cp -f /etc/dhcpd.conf.mgmt $ARG_DHCPD_CONF > /dev/null
	if [ "$DHCP_LEASE_TIME" != "" ]; then
		sed -i "s/604800/$DHCP_LEASE_TIME/g" $ARG_DHCPD_CONF
	fi
	cat /etc/fiad-conf/dhcpd.conf.$ARG_EXT >> $ARG_DHCPD_CONF
	
	return 0
}

CheckConfAndTryToFixIt ()
{
	local RESULT;
	
	/bin/$PROCESS_NAME -q -t -cf $ARG_DHCPD_CONF $DHCPD_INTERFACE -lf $ARG_DHCPD_LEASES > /dev/null 2>&1
	RESULT=$?
	echo "	Initial check: RESULT=$RESULT"
	if [ $RESULT != 0 ] ; then
	  	if [ $ARG_EXT != "" ] ; then
			TryToFixConf
		fi
		/bin/$PROCESS_NAME -q -t -cf $ARG_DHCPD_CONF -lf $ARG_DHCPD_LEASES > /dev/null 2>&1
  		RESULT=$?
		echo "	Second check: RESULT=$RESULT"
		if [ $RESULT != 0 ] ; then
			$LOGGER "Cannot recover dhcpd.conf.$ARG_EXT!"
		fi
	fi
	echo "	Return RESULT=$RESULT"
	return $RESULT
}

do_start ()
{
	PIDFILE=$PIDFILE_LAN0;
	if ! ServiceCheckRunning1 ; then
		PIDFILE=$PIDFILE_LAN1;
		if ! ServiceCheckRunning1 ; then
			PIDFILE=$PIDFILE_VLAN;
			if ! ServiceCheckRunning1 ; then
				return $?
			fi
		fi
	fi

	PIDFILE=/var/run/dhcpd.pid
	if [ -f /mnt/flashfs/dhcpdlan0.leases ] ; then
		/bin/mv -f /mnt/flashfs/dhcpdlan0.leases /mnt/bbram/state/dhcp/ > /dev/null
	fi
	
	/etc/init.d/softdogd wait
	/bin/touch $DHCPD_LAN0_LEASES

	if [ -f /mnt/flashfs/dhcpdlan1.leases ] ; then
		/bin/mv -f /mnt/flashfs/dhcpdlan1.leases /mnt/bbram/state/dhcp/ > /dev/null
	fi
	
	/bin/touch $DHCPD_LAN1_LEASES

	if [ -f /mnt/flashfs/dhcpdvlan.leases ] ; then
		/bin/mv -f /mnt/flashfs/dhcpdvlan.leases /mnt/bbram/state/dhcp/ > /dev/null
	fi
	
	/bin/touch $DHCPD_VLAN_LEASES


	if [ "$START_DHCPD_LAN" = "true" ] ; then
		DHCP_LEASE_TIME=$(cat /etc/fiad-conf/dhcpd.conf.lan | grep dhcp-lease-time | tr -dc '0-9')
		/bin/cp -f /etc/dhcpd.conf.mgmt $DHCPD_CONF_LAN0 > /dev/null
		if [ "$DHCP_LEASE_TIME" != "" ]; then
			sed -i "s/604800/$DHCP_LEASE_TIME/g" $DHCPD_CONF_LAN0
		fi
		DHCPD_INTERFACE="lan0"
		cat /etc/fiad-conf/dhcpd.conf.lan >> $DHCPD_CONF_LAN0
		ARG_EXT=lan
		ARG_DHCPD_CONF=$DHCPD_CONF_LAN0
		ARG_DHCPD_LEASES=$DHCPD_LAN0_LEASES
		if ! CheckConfAndTryToFixIt ; then
			echo "Wrong syntax in dhcpd.conf.$ARG_EXT!"
			$LOGGER "Wrong syntax in dhcpd.conf.$ARG_EXT!"
		fi

		/bin/setsid /bin/$PROCESS_NAME -q -cf $DHCPD_CONF_LAN0 $DHCPD_INTERFACE -lf $DHCPD_LAN0_LEASES > /dev/null 2>&1
		ServiceCheckRunning2
		# a case when execution failure is detected
		if [ $? != 0 ] ; then
			TryToFixConf
			/bin/setsid /bin/$PROCESS_NAME -q -cf $DHCPD_CONF_LAN0 $DHCPD_INTERFACE -lf $DHCPD_LAN0_LEASES > /dev/null 2>&1
			ServiceCheckRunning2
		fi
		mv /var/run/dhcpd.pid $PIDFILE_LAN0
	fi

	if [ "$START_DHCPD_SECOND_LAN" = "true" ] ; then
		DHCP_LEASE_TIME=$(cat /etc/fiad-conf/dhcpd.conf.lan1 | grep dhcp-lease-time | tr -dc '0-9')
		/bin/cp -f /etc/dhcpd.conf.mgmt $DHCPD_CONF_LAN1 > /dev/null
		if [ "$DHCP_LEASE_TIME" != "" ]; then
			sed -i "s/604800/$DHCP_LEASE_TIME/g" $DHCPD_CONF_LAN1
		fi
		DHCPD_INTERFACE="lan1"
		cat /etc/fiad-conf/dhcpd.conf.lan1 >> $DHCPD_CONF_LAN1
		ARG_EXT=lan1
		ARG_DHCPD_CONF=$DHCPD_CONF_LAN1
		ARG_DHCPD_LEASES=$DHCPD_LAN1_LEASES
		if ! CheckConfAndTryToFixIt ; then
			echo "Wrong syntax in dhcpd.conf.$ARG_EXT!"
			$LOGGER "Wrong syntax in dhcpd.conf.$ARG_EXT!"
		fi

		/bin/setsid /bin/$PROCESS_NAME -q -cf $DHCPD_CONF_LAN1 $DHCPD_INTERFACE -lf $DHCPD_LAN1_LEASES > /dev/null 2>&1
		ServiceCheckRunning2
		# a case when execution failure is detected
		if [ $? != 0 ] ; then
			TryToFixConf
			/bin/setsid /bin/$PROCESS_NAME -q -cf $DHCPD_CONF_LAN1 $DHCPD_INTERFACE -lf $DHCPD_LAN1_LEASES > /dev/null 2>&1
			ServiceCheckRunning2
		fi
		mv /var/run/dhcpd.pid $PIDFILE_LAN1
	fi
	if [ "$FEATURE_VLAN" = "1" ] && [ "$START_DHCPD_VLAN" = "true" ] ; then
		DHCP_LEASE_TIME=$(cat /etc/fiad-conf/dhcpd.conf.vlan$DHCPD_VLAN_ID | grep dhcp-lease-time | tr -dc '0-9')
		/bin/cp -f /etc/dhcpd.conf.mgmt $DHCPD_CONF_VLAN > /dev/null
		if [ "$DHCP_LEASE_TIME" != "" ]; then
			sed -i "s/604800/$DHCP_LEASE_TIME/g" $DHCPD_CONF_VLAN
		fi
		DHCPD_INTERFACE="lan$DHCPD_VLAN_INTERFACE.$DHCPD_VLAN_ID"
		ACTUAL_VLAN_INTERFACE=`/sbin/ifconfig | grep $DHCPD_INTERFACE`
		if [ "$ACTUAL_VLAN_INTERFACE" != "" ] ; then
			cat /etc/fiad-conf/dhcpd.conf.vlan$DHCPD_VLAN_ID >> $DHCPD_CONF_VLAN
			ARG_EXT=vlan$DHCPD_VLAN_ID
			ARG_DHCPD_CONF=$DHCPD_CONF_VLAN
			ARG_DHCPD_LEASES=$DHCPD_VLAN_LEASES
			if ! CheckConfAndTryToFixIt ; then
				echo "Wrong syntax in dhcpd.conf.$ARG_EXT!"
				$LOGGER "Wrong syntax in dhcpd.conf.$ARG_EXT!"
			fi

			/bin/setsid /bin/$PROCESS_NAME -q -cf $DHCPD_CONF_VLAN $DHCPD_INTERFACE -lf $DHCPD_VLAN_LEASES > /dev/null 2>&1
			ServiceCheckRunning2
			# a case when execution failure is detected
			if [ $? != 0 ] ; then
				TryToFixConf
				/bin/setsid /bin/$PROCESS_NAME -q -cf $DHCPD_CONF_VLAN $DHCPD_INTERFACE -lf $DHCPD_VLAN_LEASES > /dev/null 2>&1
				ServiceCheckRunning2
			fi
			mv /var/run/dhcpd.pid $PIDFILE_VLAN
		fi
	fi

	return $?
}

do_stop ()
{
	PIDFILE=$PIDFILE_LAN0;
	ServiceStop

	PIDFILE=$PIDFILE_LAN1;
	ServiceStop

	PIDFILE=$PIDFILE_VLAN;
	ServiceStop

	/etc/init.d/softdogd wait

	rm -f $DHCPD_CONF_LAN0
	rm -f $DHCPD_CONF_LAN1
	rm -f $DHCPD_CONF_VLAN

	if [ -f /mnt/bbram/state/dhcp/dhcpdlan0.leases ] ; then
		/bin/cp -f /mnt/bbram/state/dhcp/dhcpdlan0.leases /mnt/flashfs/  > /dev/null
	fi

	if [ -f /mnt/bbram/state/dhcp/dhcpdlan1.leases ] ; then
		/bin/cp -f /mnt/bbram/state/dhcp/dhcpdlan1.leases /mnt/flashfs/  > /dev/null
	fi

	if [ -f /mnt/bbram/state/dhcp/dhcpdvlan.leases ] ; then
		/bin/cp -f /mnt/bbram/state/dhcp/dhcpdvlan.leases /mnt/flashfs/  > /dev/null
	fi


	return $?
}

do_status ()
{
	local RESULT=0;
	
	if [ "$START_DHCPD_LAN" = "true" ] ; then
		PIDFILE=$PIDFILE_LAN0;
		ServiceStatus
		RESULT=$?
		if [ $RESULT != 0 ] ; then
		    return $RESULT
		fi
	fi

	if [ "$START_DHCPD_SECOND_LAN" = "true" ] ; then
		PIDFILE=$PIDFILE_LAN1;
		ServiceStatus
		RESULT=$?
		if [ $RESULT != 0 ] ; then
		    return $RESULT
		fi
	fi

	if [ "$FEATURE_VLAN" = "1" ] && [ "$START_DHCPD_VLAN" = "true" ] ; then
		PIDFILE=$PIDFILE_VLAN;
		ServiceStatus
		RESULT=$?
	fi

	return $RESULT
}

case "$1" in
	start)
		do_start
		;;
	stop)
		do_stop
		;;
	status)
		do_status
		;;
	restart)
		do_stop
		do_start
		;;
	*)
		echo "Usage: $0 {start|stop|restart|status}"
		exit 1
esac

exit $?
