#!/bin/sh -u

PATH="$PATH:/sbin"

. shell-config
. shell-error
. alterator-sh-functions
. alterator-net-functions
. alterator-dhcp-functions
. alterator-service-functions

DATADIR="$1"; shift
HOOKSDIR=/usr/lib/alterator/hooks/dhcp.d

[ -n "$DATADIR" -a -f "$DATADIR"/dhcpd_data ] || \
	fatal "Couldn't find data file in $DATADIR"

status="$(shell_config_get "$DATADIR"/dhcpd_data dhcpd_status)"
new_iface="$(shell_config_get "$DATADIR"/dhcpd_data dhcpd_iface_name)"
ip_start="$(shell_config_get "$DATADIR"/dhcpd_data dhcpd_ip_start)"
ip_end="$(shell_config_get "$DATADIR"/dhcpd_data dhcpd_ip_end)"
client_time="$(shell_config_get "$DATADIR"/dhcpd_data dhcpd_client_time)"
client_dns="$(shell_config_get "$DATADIR"/dhcpd_data dhcpd_client_dns)"
client_search="$(shell_config_get "$DATADIR"/dhcpd_data dhcpd_client_search)"
client_gw="$(shell_config_get "$DATADIR"/dhcpd_data dhcpd_client_gw)"

[ -n "$new_iface" ] || fatal "No iface name"

ipv=4 # Currently IPv4 is supported only

# Based on code from alterator-dhcp
old_iface="$(dhcp_config_get iface "$ipv")" # previous value of iface
[ -n "$new_iface" ] || new_iface="$old_iface"

[ -n "$new_iface" -a -d /etc/net/ifaces/"$new_iface" ] || \
	fatal "Couldn't find configiration for network interface $new_face"

iface_ip="$(read_iface_addr "/etc/net/ifaces/$new_iface" "$ipv")"


if  [ -n "$ip_start" ]; then
	if ipv4_ip_subnet "$ip_start" "$iface_ip";then
		dhcp_config_set ip_start "$ip_start" "$ipv"
	else
		message "Invalid IP $ip_start for iface $new_iface"
	fi
fi
if  [ -n "$ip_end" ]; then
	if ipv4_ip_subnet "$ip_end" "$iface_ip";then
		dhcp_config_set ip_end "$ip_end" "$ipv"
	else
		message "Invalid IP $ip_end for iface $new_iface"
	fi
fi

dhcp_config_set iface "$new_iface" "$ipv"
dhcp_config_set client_time "$client_time" "$ipv"
dhcp_config_set client_dns "$client_dns" "$ipv"
dhcp_config_set client_gw "$client_gw" "$ipv"
dhcp_config_set client_search "$client_search" "$ipv"

#note: update config before daemon start to create initial config
dhcp_update_config "$ipv"
if test_bool "$status"; then
	dhcp_daemon_on "$ipv"
else
	dhcp_daemon_off "$ipv"
fi

#postinstall hook
if [ "$old_iface" != "$new_iface" ];then
	export old_iface new_iface
	run-parts "$HOOKSDIR"
fi

# Check

if test_bool "$status"; then
	service_control dhcpd is-enabled || exit 1
elif service_control dhcpd is-enabled; then
	exit 1
fi

[ "$(dhcp_config_get iface "$ipv")" = "$new_iface" ] || fatal "check: Wrong iface"
if [ -n "$ip_start" ]; then
	[ "$(dhcp_config_get ip_start "$ipv")" = "$ip_start" ] || fatal "check: Wrong ip_start"
fi
if [ -n "$ip_end" ]; then
	[ "$(dhcp_config_get ip_end "$ipv")" = "$ip_end" ] || fatal "check: Wrong ip_end"
fi
[ "$(dhcp_config_get client_time "$ipv")" = "$client_time" ] || fatal "check: Wrong client_time"
[ "$(dhcp_config_get client_dns "$ipv")" = "$client_dns" ] || fatal "check: Wrong client_dns"
[ "$(dhcp_config_get client_gw "$ipv")" = "$client_gw" ] || fatal "check: Wrong client_gw"
[ "$(dhcp_config_get client_search "$ipv")" = "$client_search" ] || fatal "check: Wrong client_search"

exit 0
