#!/bin/sh

usage() {
	echo "usage: $PROGRAMNAME action [level]"
	echo "    action:"
	echo "        apply [level]    apply with level"
	echo "                         level=1, dhcp option 12,53,55,61 [default]"
	echo "                         level=2, level 1 + 51"
	echo "                         level=3, level 1 + 60 (origin)"
	echo "                         level=4, level 1 + 60 (synology)"
	echo "                         level=5, level 2 + level 3"
	echo ""
	echo "        disable          disable"
	echo ""
}

apply() {
	echo "Applying diagnostic tools..."

	mkdir -p $TMPDIR
	tar xzf $TARFILE -C $TMPDIR

	# UI chang WAN to static mode
	# confirm all the dhcpcd process has been killed

	# upstart script
	if ! [ -e /etc/init/backup/dhcp-client.conf ]; then
		mkdir -p /etc/init/backup
		cp /etc/init/dhcp-client.conf /etc/init/backup/
		sed -i 's/\bexec \/sbin\/dhcpcd\b/& -d/' /etc/init/dhcp-client.conf
		sed -i '/post-start script/ r '$TMPDIR'/etc/init/post-start' /etc/init/dhcp-client.conf
		sed -i '/post-stop script/ r '$TMPDIR'/etc/init/post-stop' /etc/init/dhcp-client.conf
	fi

	# syslog-ng script
	# syslog-ng script need to modified the etc.default folder, because reboot will copy etc.default into etc
	if ! [ -e /etc.defaults/syslog-ng/backup/syslog-ng.conf ]; then
		mkdir -p /etc.defaults/syslog-ng/backup
		cp /etc.defaults/syslog-ng/syslog-ng.conf /etc.defaults/syslog-ng/backup
		sed -i '/and not filter(f_scemd)/a \ \ and not filter(f_dhcpcd)' /etc.defaults/syslog-ng/syslog-ng.conf
		sed -i '/filter f_scemd { program(scemd); };/a filter f_dhcpcd { program(dhcpcd); };' /etc.defaults/syslog-ng/syslog-ng.conf
		cp /etc.defaults/syslog-ng/syslog-ng.conf /etc/syslog-ng/syslog-ng.conf
		cp "${TMPDIR}/etc/syslog-ng/patterndb.d/dhcpcd.conf" /etc.defaults/syslog-ng/patterndb.d/dhcpcd.conf
	fi

	# dhcpcd binary
	if ! [ -e /sbin/backup/dhcpcd ]; then
		mkdir -p /sbin/backup
		cp /sbin/dhcpcd /sbin/backup
	fi

	# copy the target dhcpcd into /sbin/dhcpcd
	case $DIAG_LEVEL in
		1 )
			BIN_TO_REPLACE="$TMPDIR/binary/dhcpcd-base"
			;;
		2 )
			BIN_TO_REPLACE="$TMPDIR/binary/dhcpcd-base-plus-51"
			;;
		3 )
			BIN_TO_REPLACE="$TMPDIR/binary/dhcpcd-base-plus-60-origin"
			;;
		4 )
			BIN_TO_REPLACE="$TMPDIR/binary/dhcpcd-base-plus-60-synology"
			;;
		5 )
			BIN_TO_REPLACE="$TMPDIR/binary/dhcpcd-base-plus-51-60-origin"
			;;
		* )
			usage
			exit 1
	esac

	for index in $(seq 0 "${MAX_WAN_INDEX}"); do
		if [ "$(/usr/syno/sbin/synonettool --wan --is-enabled --index "${index}")" = "true" ]; then
			local ifname
			if ifname="$(/usr/syno/sbin/synonettool --wan --ifname --index "${index}")"; then
				/sbin/stop dhcp-client IFACE="${ifname}" > /dev/null 2>&1 || true
			fi
		fi
	done
	cp -f $BIN_TO_REPLACE /sbin/dhcpcd

	# UI chang WAN to auto mode

	rm -rf $TMPDIR

	echo "Finished!"
	echo "## Please reboot device to enable diagnostic tools ##"
}

disable() {
	echo "Removing diagnostic tools..."

	if ! [ -e /sbin/backup/dhcpcd ] \
		&& ! [ -e /etc/init/backup/dhcp-client.conf ] \
		&& ! [ -e /etc.defaults/syslog-ng/backup/syslog-ng.conf ]; then

		echo "There's no backup files, have you tried \"apply\" yet?"
		exit 1
	fi

	# UI chang WAN to static mode
	# confirm all the dhcpcd process has been killed

	# upstart script
	cp /etc/init/backup/dhcp-client.conf /etc/init/dhcp-client.conf
	rm -rf /etc/init/backup

	# syslog-ng script
	# syslog-ng script need to modified the etc.default folder, because reboot will copy etc.default into etc
	cp /etc.defaults/syslog-ng/backup/syslog-ng.conf /etc.defaults/syslog-ng/syslog-ng.conf
	cp /etc.defaults/syslog-ng/backup/syslog-ng.conf /etc/syslog-ng/syslog-ng.conf
	rm -rf /etc.defaults/syslog-ng/backup
	rm -rf /etc.defaults/syslog-ng/patterndb.d/dhcpcd.conf
	rm -rf /etc/syslog-ng/patterndb.d/dhcpcd.conf

	# dhcpcd binary
	for index in $(seq 0 "${MAX_WAN_INDEX}"); do
		if [ "$(/usr/syno/sbin/synonettool --wan --is-enabled --index "${index}")" = "true" ]; then
			local ifname
			if ifname="$(/usr/syno/sbin/synonettool --wan --ifname --index "${index}")"; then
				/sbin/stop dhcp-client IFACE="${ifname}" > /dev/null 2>&1 || true
			fi
		fi
	done
	cp /sbin/backup/dhcpcd /sbin/dhcpcd
	rm -rf /sbin/backup

	# UI chang WAN to auto mode

	echo "Finished!"
	echo "## Please reboot device ##"
}

PROGRAMNAME=`basename $0`
TMPDIR=/tmp/dhcpcd_diag/
TARFILE="/etc/dhcpc/$PROGRAMNAME.tar.gz"
MAXLEVEL=5
MINLEVEL=1
MAX_WAN_INDEX=1

case $1 in
	-a | --apply )
		if ! [ -z $2 ]; then
			if [ $2 -ge $MINLEVEL ] && [ $2 -le $MAXLEVEL ]; then
				DIAG_LEVEL=$2
			else
				echo "level must between $MINLEVEL and $MAXLEVEL!!"
				usage
				exit 1
			fi
		else
			DIAG_LEVEL=1
		fi
		apply
		;;
	-d | --disable )
		disable
		;;
	-h | --help )
		usage
		exit
		;;
	* )
		usage
		exit 1
esac
