################################################################################
# Filename: ./src/plugins/dhcpd/include/dhcpd-functions
# 
# The contents of this file are subject to the Qlusters Public License
# Version 1.1 (the License); you may not use this file except in compliance
# with the License.
# You may obtain a copy of the License at
# http://www.openqrm.org/content/view/33/69/.
# 
# Software distributed under the License is distributed on an AS IS basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
# the specific language governing rights and limitations under the License.
# 
# The Original Code is openQRM.
# 
# The Initial Developer of the Original Code is Qlusters Corporation. Portions
# created by Qlusters Corporation are Copyright (C) 2003-2005. All Rights
# Reserved.
# 
# Contributor(s):
# 
# Description:
# 
# Comments:
################################################################################
QRM_DHCPD_PLUGIN_DHCPD_CONF_TEMPLATE="$QRM_PLUGIN_BASE_DIR/etc/dhcpd.conf.qrm"
QRM_DHCPD_PLUGIN_DHCPD_CONF="$QRM_PLUGIN_BASE_DIR/etc/dhcpd.conf"

PLUGIN_INIT_SCRIPT=${QRM_PLUGIN_BASE_DIR}/etc/init.d/dhcpd

if [ ! -f "$QRM_DHCPD_PLUGIN_DHCPD_CONF_TEMPLATE" ]; then
	echo "ERROR: Could not find Qrm-dhcpd plugin dhcpd.conf template at $QRM_DHCPD_PLUGIN_DHCPD_CONF_TEMPLATE" >&2
	return 1
fi

function _install_usage() {
	echo "Usage : $PLUGIN -n/--network <network-address>"
	echo "					-s/--subnetmask <subnetmask>"
	echo "					-b/--broadcast <broadcast-address>"
	echo "					-g/--gateway <default-gateway>"
	echo "					-d/--dns <default-dns-server>"
	echo "					-q/--qrm-server <qrm-server>"
	echo "					-t/--tftp <tftp-server-ip>"
	echo "					--domain <domain-name>"
	echo "					-h/--help"
}

function _display_configuration() {
	echo
	echo "#################### dhcpd-plugin configuration ##############"
	echo "   Network :                    $QRM_SERVER_NETWORK"
	echo "   Subnetmask :                 $QRM_SERVER_SUBNETMASK"
	echo "   Broadcast address :          $QRM_SERVER_BROADCAST"
	echo "   Default gateway :            $QRM_SERVER_GATEWAY"
	echo "   DNS-server ip-address :      $QRM_SERVER_DNS"
	echo "   QRM-server ip-address :      $QRM_SERVER_IP_ADDRESS"
	echo "   Tftp-server ip-address :     $QRM_SERVER_TFTP_SERVER"
	echo "   Domain-name :                $QRM_SERVER_DOMAIN"
	echo "   First ip-address in range :  $QRM_DHCPD_PLUGIN_RANGE_FIRST_IP_ADDRESS"
	echo "   Last ip-address in range :   $QRM_DHCPD_PLUGIN_RANGE_LAST_IP_ADDRESS"
	echo "##############################################################"
	echo
}

function dhcpd_install() {
	while [ $# -ne 0 ]; do
		case "$1" in
			-n | --network)
				QRM_SERVER_NETWORK=$2
				shift
				;;
			-s | --subnet)
				QRM_SERVER_SUBNETMASK=$2
				shift
				;;
			-b | --broadcast)
				QRM_SERVER_BROADCAST=$2
				shift
				;;
			-g | --gateway)
				QRM_SERVER_GATEWAY=$2
				shift
				;;
			-d | --dns)
				QRM_SERVER_DNS=$2
				shift
				;;
			-q | --qrm-server)
				QRM_SERVER_IP_ADDRESS=$2
				shift
				;;
			-t | --tftp)
				QRM_SERVER_TFTP_SERVER=$2
				shift
				;;	
			--domain)
				QRM_SERVER_DOMAIN=$2
				shift
				;;
			-h | --help)
				usage
				;;
		esac
		shift
	done


	echo "Setting up Qrm-dhcpd plugin"
	echo "(you can press <ENTER> for going with the suggested defaults)"
	echo
	while (true); do

		while [ -z "$QRM_SERVER_NETWORK" ]; do
			echo "Please give the network-address to manage :"
			read QRM_SERVER_NETWORK
		done
		while [ -z "$QRM_SERVER_SUBNETMASK" ]; do
			echo "Please give the subnet-mask for the network $QRM_SERVER_NETWORK :"
			read QRM_SERVER_SUBNETMASK
		done
		while [ -z "$QRM_SERVER_BROADCAST" ]; do
			echo "Please give the broadcast-address for the network $QRM_SERVER_NETWORK :"
			read QRM_SERVER_BROADCAST
		done
		while [ -z "$QRM_SERVER_GATEWAY" ]; do
			echo "Please give the default gateway for the network $QRM_SERVER_NETWORK :"
			read QRM_SERVER_GATEWAY
		done
		while [ -z "$QRM_SERVER_DNS" ]; do
			echo "Please give the dns-server ip-address for the network $QRM_SERVER_NETWORK :"
			read QRM_SERVER_DNS
		done
		while [ -z "$QRM_SERVER_IP_ADDRESS" ]; do
			echo "Please give the Qrm-server ip-address :"
			read QRM_SERVER_IP_ADDRESS
		done
		while [ -z "$QRM_SERVER_TFTP_SERVER" ]; do
			echo "If you are using a remote tftp-server please give the ip-address of this system :"
			echo "(otherwise please give the Qrm-server ip-address)"
			read QRM_SERVER_TFTP_SERVER
		done
		while [ -z "$QRM_SERVER_DOMAIN" ]; do
			echo "Please give the domain-name for the network $QRM_SERVER_NETWORK :"
			read QRM_SERVER_DOMAIN
		done

	# prepare the defaults
		IP1=`echo $QRM_SERVER_NETWORK | cut -d'.' -f 1-3`
		IP2=`echo $QRM_SERVER_NETWORK | cut -d'.' -f 4`
		IP2=$(( IP2 + 1 ))
		QRM_DHCPD_PLUGIN_RANGE_FIRST_IP_ADDRESS_DEFAULT="$IP1.$IP2"
		IP1=`echo $QRM_SERVER_BROADCAST | cut -d'.' -f 1-3`
		IP2=`echo $QRM_SERVER_BROADCAST | cut -d'.' -f 4`
		IP2=$(( IP2 - 1 ))
		QRM_DHCPD_PLUGIN_RANGE_LAST_IP_ADDRESS_DEFAULT="$IP1.$IP2"

		echo
		while [ -z "$QRM_DHCPD_PLUGIN_RANGE_FIRST_IP_ADDRESS" ]; do
			echo "Please give the first ip-address in the dhcp-range : [$QRM_DHCPD_PLUGIN_RANGE_FIRST_IP_ADDRESS_DEFAULT] "
			read QRM_DHCPD_PLUGIN_RANGE_USERS_FIRST_IP_ADDRESS
			if [ ! -z "$QRM_DHCPD_PLUGIN_RANGE_USERS_FIRST_IP_ADDRESS" ]; then
				QRM_DHCPD_PLUGIN_RANGE_FIRST_IP_ADDRESS="$QRM_DHCPD_PLUGIN_RANGE_USERS_FIRST_IP_ADDRESS"
			else
				QRM_DHCPD_PLUGIN_RANGE_FIRST_IP_ADDRESS="$QRM_DHCPD_PLUGIN_RANGE_FIRST_IP_ADDRESS_DEFAULT"
			fi
			echo "First ip-address in the dhcpd-range will be       : $QRM_DHCPD_PLUGIN_RANGE_FIRST_IP_ADDRESS"
			echo
		done

		while [ -z "$QRM_DHCPD_PLUGIN_RANGE_LAST_IP_ADDRESS" ]; do
			echo "Please give the last ip-address in the dhcp-range : [$QRM_DHCPD_PLUGIN_RANGE_LAST_IP_ADDRESS_DEFAULT] "
			read QRM_DHCPD_PLUGIN_RANGE_USERS_LAST_IP_ADDRESS
			if [ ! -z "$QRM_DHCPD_PLUGIN_RANGE_USERS_LAST_IP_ADDRESS" ]; then
				QRM_DHCPD_PLUGIN_RANGE_LAST_IP_ADDRESS="$QRM_DHCPD_PLUGIN_RANGE_USERS_LAST_IP_ADDRESS"
			else
				QRM_DHCPD_PLUGIN_RANGE_LAST_IP_ADDRESS="$QRM_DHCPD_PLUGIN_RANGE_LAST_IP_ADDRESS_DEFAULT"
			fi
			echo "Last ip-address in the dhcpd-range will be        : $QRM_DHCPD_PLUGIN_RANGE_LAST_IP_ADDRESS"
			echo
		done

	# check all configured parameters
		if ! qrm_validate_ipaddress $QRM_SERVER_NETWORK ; then
			QRM_SERVER_NETWORK=""
			BAD_PARAMETERS=y
		fi
		if ! qrm_validate_ipaddress $QRM_SERVER_SUBNETMASK ; then
			QRM_SERVER_SUBNETMASK=""
			BAD_PARAMETERS=y
		fi
		if ! qrm_validate_ipaddress $QRM_SERVER_SUBNETMASK ; then
			QRM_SERVER_SUBNETMASK=""
			BAD_PARAMETERS=y
		fi
		if ! qrm_validate_ipaddress $QRM_SERVER_BROADCAST ; then
			QRM_SERVER_BROADCAST=""
			BAD_PARAMETERS=y
		fi
		if ! qrm_validate_ipaddress $QRM_SERVER_GATEWAY ; then
			QRM_SERVER_GATEWAY=""
			BAD_PARAMETERS=y
		fi
		if ! qrm_validate_ipaddress $QRM_SERVER_DNS ; then
			QRM_SERVER_DNS=""
			BAD_PARAMETERS=y
		fi
		if ! qrm_validate_ipaddress $QRM_SERVER_IP_ADDRESS ; then
			QRM_SERVER_IP_ADDRESS=""
			BAD_PARAMETERS=y
		fi
		if ! qrm_validate_ipaddress $QRM_SERVER_TFTP_SERVER ; then
			QRM_SERVER_TFTP_SERVER=""
			BAD_PARAMETERS=y
		fi
		if ! qrm_validate_ipaddress $QRM_DHCPD_PLUGIN_RANGE_FIRST_IP_ADDRESS ; then
			QRM_DHCPD_PLUGIN_RANGE_FIRST_IP_ADDRESS=""
			BAD_PARAMETERS=y
		fi
		if ! qrm_validate_ipaddress $QRM_DHCPD_PLUGIN_RANGE_LAST_IP_ADDRESS ; then
			QRM_DHCPD_PLUGIN_RANGE_LAST_IP_ADDRESS=""
			BAD_PARAMETERS=y
		fi

		# check the config
		local CONFIG_FILE=`mktemp /tmp/dhcpd.conf.XXXX`
		local ERRORS_FILE=`mktemp /tmp/dhcpd.err.XXXX`
		interpolate $QRM_DHCPD_PLUGIN_DHCPD_CONF_TEMPLATE > $CONFIG_FILE
		dhcpd -cf $CONFIG_FILE -t 2>&1 | sed -n '/please visit/,/If you/p' | tail +2 | sed '$d' > $ERRORS_FILE
		cat $ERRORS_FILE
		if [ -s "$ERRORS_FILE" ]; then
			BAD_PARAMETERS=y
			unset QRM_SERVER_NETWORK QRM_SERVER_SUBNETMASK QRM_SERVER_BROADCAST QRM_SERVER_GATEWAY QRM_SERVER_DNS QRM_SERVER_IP_ADDRESS QRM_SERVER_TFTP_SERVER QRM_SERVER_DOMAIN QRM_DHCPD_PLUGIN_RANGE_FIRST_IP_ADDRESS QRM_DHCPD_PLUGIN_RANGE_LAST_IP_ADDRESS
		fi
		rm -f $CONFIG_FILE $ERRORS_FILE

		if [ -z "$BAD_PARAMETERS" ]; then
			_display_configuration
			echo -n "Do you want to continue with the above configured parameters ? (y/n)"
			read CONFIRM

			if [ "$CONFIRM" == "y" ] || [ "$CONFIRM" == "Y" ]; then
				break
			elif [ "$CONFIRM" == "n" ] || [ "$CONFIRM" == "N" ]; then
				echo "Restarting the configuration"
				echo
				unset QRM_SERVER_NETWORK QRM_SERVER_SUBNETMASK QRM_SERVER_BROADCAST QRM_SERVER_GATEWAY QRM_SERVER_DNS QRM_SERVER_IP_ADDRESS QRM_SERVER_TFTP_SERVER QRM_SERVER_DOMAIN QRM_DHCPD_PLUGIN_RANGE_FIRST_IP_ADDRESS QRM_DHCPD_PLUGIN_RANGE_LAST_IP_ADDRESS
			fi
		else
			echo "ERROR: Detected misconfigured parameter. Restarting the configuration"
			unset BAD_PARAMETERS
		fi
	done

# configure dhcpd.conf
	interpolate $QRM_DHCPD_PLUGIN_DHCPD_CONF_TEMPLATE > $QRM_DHCPD_PLUGIN_DHCPD_CONF


}

function dhcpd_uninstall() {
	:
}

function dhcpd_start() {
	${PLUGIN_INIT_SCRIPT} start
}

function dhcpd_stop() {
	${PLUGIN_INIT_SCRIPT} stop
}

function dhcpd_run_once() {
	:
}
