# Sample dhcpcd hook script for ntp
# Like our resolv.conf hook script, we store a database of ntp.conf files
# and merge into /etc/ntp.conf

# Detect OpenRC or BSD rc
# Distributions may want to just have their command here instead of this
if type rc-service >/dev/null 2>&1 && rc-service --exists ntpd; then
	ntpd_restart_cmd="rc-service ntpd -- --ifstarted --quiet restart"
elif [ -x /etc/rc.d/ntpd ]; then
	ntpd_restart_cmd="/etc/rc.d/ntpd restart"
elif [ -x /usr/local/etc/rc.d/ntpd ]; then
	ntpd_restart_cmd="/usr/local/etc/rc.d/ntpd restart"
fi

ntp_conf_dir="${state_dir}/ntp.conf"

build_ntp_conf()
{
	local cf="/etc/ntp.conf.${interface}"
	local interfaces= header= srvs= servers= x=

	# Build a list of interfaces
	interfaces=$(list_interfaces "${ntp_conf_dir}")

	if [ -n "${interfaces}" ]; then
		# Build the header
		for x in ${interfaces}; do
			header="${header}${header:+, }${x}"
		done

		# Build a server list
		srvs=$(cd "${ntp_conf_dir}";
			key_get_value "server " ${interfaces})
		if [ -n "${srvs}" ]; then
			for x in $(uniqify ${srvs}); do
				servers="${servers}server ${x}\n"
			done
		fi
	fi

	# Merge our config into ntp.conf
	[ -e "${cf}" ] && rm -f "${cf}"
	remove_markers "${signature_base}" "${signature_base_end}" \
		/etc/ntp.conf > "${cf}"
	if [ -n "${servers}" ]; then
		echo "${signature_base}${header:+ ${from} }${header}" >> "${cf}"
		printf "${search}${servers}" >> "${cf}"
		echo "${signature_base_end}${header:+ ${from} }${header}" >> "${cf}"
	fi

	# If we changed anything, restart ntpd
	if change_file /etc/ntp.conf "${cf}"; then
		[ -n "${ntpd_restart_cmd}" ] && ${ntpd_restart_cmd}
	fi
}

add_ntp_conf()
{
	local cf="${ntp_conf_dir}/${interface}" x=

	[ -e "${cf}" ] && rm "${cf}"
	[ -d "${ntp_conf_dir}" ] || mkdir -p "${ntp_conf_dir}"
	if [ -n "${new_ntp_servers}" ]; then
		for x in ${new_ntp_servers}; do
			echo "server ${x}" >> "${cf}"
		done
	fi
	build_ntp_conf
}

remove_ntp_conf()
{
	if [ -e "${ntp_conf_dir}/${interface}" ]; then
		rm "${ntp_conf_dir}/${interface}"
	fi
	build_ntp_conf
}

case "${reason}" in
BOUND|INFORM|REBIND|REBOOT|RENEW|TIMEOUT) 	add_ntp_conf add;;
PREINIT|EXPIRE|FAIL|IPV4LL|RELEASE|STOP)	remove_ntp_conf del;;
esac
