# 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

# You can set the env var NTP_CONF to another file like this
#   dhcpcd -e NTP_CONF=/usr/pkg/etc/ntpd.conf
# or by adding this to /etc/dhcpcd.enter-hook
#   NTP_CONF=/usr/pkg/etc/ntpd.conf
# to use openntpd from pkgsrc instead of the system provided ntp.

# 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 status && /etc/rc.d/ntpd restart"
elif [ -x /usr/local/etc/rc.d/ntpd ]; then
	ntpd_restart_cmd="/usr/local/etc/rc.d/ntpd status && /usr/local/etc/rc.d/ntpd restart"
fi

ntp_conf_dir="${state_dir}/ntp.conf"
ntp_conf=${NTP_CONF:-/etc/ntp.conf}

build_ntp_conf()
{
	local cf="${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 "${ntp_conf}" "${cf}"; then
		[ -n "${ntpd_restart_cmd}" ] && eval ${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
