#!/bin/sh -efu

general_conf="/etc/alterator/dhcp/general"
static_conf="/etc/alterator/dhcp/static"
dhcpd_conf="/etc/dhcp/dhcpd.conf"
ddns_tool="/usr/sbin/dhcp-print-config"
ddns_key="/var/lib/bind/etc/ddns-key.conf"
kdc_tool="/usr/bin/alterator-kdc-dhcp-host-option"

. shell-config
. alterator-net-functions

tempfile=

exit_handler()
{
    local rc="$?"
    trap - EXIT
    rm -f "$tempfile"
    exit "$@"
}

trap exit_handler EXIT HUP PIPE INT QUIT TERM

smart_addr()
{
    if [ "$1" = "*" ]; then
	echo "${2%%/*}"
    else
	echo "$1"
    fi
}

generate()
{
    local iface="$(shell_config_get "$general_conf" iface)"
    local ip_start="$(shell_config_get "$general_conf" ip_start)"
    local ip_end="$(shell_config_get "$general_conf" ip_end)"

    [ -n "$iface" -a -n "$ip_start" -a -n "$ip_end" ] || return 1

    local ip="$(read_iface_addr "/etc/net/ifaces/$iface")"

    [ -n "$ip" ] || return 1

    local net="$(netname "$ip"|cut -f1)"
    local net_ip="${net%%/*}"
    local net_mask="$(maskname "${ip##*/}")"

    printf '#auto generated by alterator-dhcp-reset\n\n'

    [ -x "$ddns_tool" ] && [ -f "$ddns_key" ] && "$ddns_tool" || printf 'ddns-update-style none;\n'

    printf 'authoritative;\n\n'
    printf 'option space altlinux;\noption altlinux.keydata code 2 = string;\nvendor-option-space altlinux;\n\n'

    local static_map= static_ip=
    [ ! -s "$static_conf" ] ||
	while IFS="	" read static_mac static_ip static_hname; do
	    printf 'host %s { hardware ethernet %s; fixed-address %s; ' "$static_ip" "$static_mac" "$static_ip"
	    [ ! -x "$kdc_tool" ] || $kdc_tool "$static_hname"
	    echo '}'
	done <"$static_conf"

    printf '\n'

    printf 'subnet %s netmask %s {\n' "$net_ip" "$net_mask"

    local client_gw="$(shell_config_get "$general_conf" client_gw)"
    local client_dns="$(shell_config_get "$general_conf" client_dns)"
    local client_search="$(shell_config_get "$general_conf" client_search)"
    local client_time="$(shell_config_get "$general_conf" client_time)"
    local client_ntp="$(shell_config_get "$general_conf" client_ntp)"

    local client_pxe_root="$(shell_config_get "$general_conf" client_pxe_root)"
    local client_pxe_server="$(shell_config_get "$general_conf" client_pxe_server)"
    local client_pxe_filename="$(shell_config_get "$general_conf" client_pxe_filename)"

    [ -z "$client_pxe_server" ] || printf '\tnext-server %s;\n' "$(smart_addr "$client_pxe_server" "$ip")"
    [ -z "$client_pxe_filename" ] || printf '\tfilename "%s";\n' "$(smart_addr "$client_pxe_filename" "$ip")"
    [ -z "$client_pxe_root" ] || printf '\toption root-path "%s";\n' "$client_pxe_root"

    [ -z "$client_ntp" ] || printf '\toption ntp-servers %s;\n' "$(smart_addr "$client_ntp" "$ip")"
    [ -z "$client_gw" ] || printf '\toption routers %s;\n' "$client_gw"
    [ -z "$client_dns" ] || printf '\toption domain-name-servers %s;\n' "$(smart_addr "$client_dns" "$ip")"
    if [ -n "$client_search" ];then
	local client_domain="${client_search%% *}"
	printf '\toption domain-name "%s";\n' "$client_domain"
    fi
    [ -z "$client_time" ] || printf '\tdefault-lease-time %s;\n\tmax-lease-time %s;\n' "$client_time" "$client_time"

	printf '\trange %s %s;\n' "$ip_start" "$ip_end"

    printf '}\n'
}

tempfile="$(mktemp -t alterator-dhcp.XXXXXX)"
generate>"$tempfile" && mv "$tempfile" "$dhcpd_conf"
