From 05ca13e17c29938ddf26a5e7050eb1fa7bae9b66 Mon Sep 17 00:00:00 2001 From: Philip Prindeville Date: Sun, 25 Mar 2018 01:49:13 -0600 Subject: [PATCH 1/2] isc-dhcp: allow explicitly configuring a domain Setting a domain now results in 'option domain-name "xyzzy";' being generated globally. Signed-off-by: Philip Prindeville --- net/isc-dhcp/files/dhcpd.init | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/net/isc-dhcp/files/dhcpd.init b/net/isc-dhcp/files/dhcpd.init index e853ffe0a..453adfa81 100644 --- a/net/isc-dhcp/files/dhcpd.init +++ b/net/isc-dhcp/files/dhcpd.init @@ -206,6 +206,8 @@ general_config() { config_get max_lease_time "isc_dhcpd" "max_lease_time" 86400 config_get log_facility "isc_dhcpd" "log_facility" + config_get domain "isc_dhcpd" "domain" + [ $always_broadcast -eq 1 ] && echo "always-broadcast true;" [ $authoritative -eq 1 ] && echo "authoritative;" [ $boot_unknown_clients -eq 0 ] && echo "boot-unknown-clients false;" @@ -220,6 +222,8 @@ general_config() { fi echo "default-lease-time $default_lease_time;" echo "max-lease-time $max_lease_time;" + + [ -n "$domain" ] && echo "option domain-name \"$domain\";" } start_service() { @@ -231,7 +235,7 @@ start_service() { touch $lease_file fi - dhcp_ifs="" + local domain dhcp_ifs if [ -e "/etc/dhcpd.conf" ] ; then config_file="/etc/dhcpd.conf" From a0cd1691c35e9f1bbee85efe68e6692084501de2 Mon Sep 17 00:00:00 2001 From: Philip Prindeville Date: Sun, 25 Mar 2018 02:17:52 -0600 Subject: [PATCH 2/2] isc-dhcp: support generic DHCP options Allow specifying NTP servers, search domains, etc. by the administrator directly specifying DHCP options (per interface, i.e. per pool). Signed-off-by: Philip Prindeville --- net/isc-dhcp/files/dhcpd.init | 40 ++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/net/isc-dhcp/files/dhcpd.init b/net/isc-dhcp/files/dhcpd.init index 453adfa81..fdcbe2490 100644 --- a/net/isc-dhcp/files/dhcpd.init +++ b/net/isc-dhcp/files/dhcpd.init @@ -120,7 +120,44 @@ static_hosts() { config_foreach static_host_add host "$@" } +typeof() { + echo "$1" | awk ' +/^\d+\.\d+\.\d+\.d+$/ { print "ip\n"; next; } +/^(true|false)$/ { print "bool\n"; next; } +/^\d+$/ { print "integer\n"; next; } +/^"[^"]*"$/ { print "string\n"; next; } + { print "other\n"; next; } +' +} + +append_dhcp_options() { + local tuple="$1" + + # strip redundant "option:" prefix + tuple="${tuple#option:}" + + local tag="${tuple%%,*}" + local values="${tuple#$tag,}" + + local formatted value + local IFS=$', \n' + for value in $values; do + # detect type of $value and quote if necessary + case $(typeof "$value") in + ip|bool|integer|string) + ;; + other) + value="\"$value\"" + ;; + esac + formatted="$formatted${formatted:+, }$value" + done + echo " option $tag $formatted;" +} + gen_dhcp_subnet() { + local cfg="$1" + echo "subnet $NETWORK netmask $NETMASK {" echo " range $START $END;" echo " option subnet-mask $netmask;" @@ -140,6 +177,7 @@ gen_dhcp_subnet() { fi echo " option routers $gateway;" echo " option domain-name-servers $DNS;" + config_list_foreach "$cfg" "dhcp_option" append_dhcp_options echo "}" } @@ -193,7 +231,7 @@ dhcpd_add() { gateway="$IP" fi - gen_dhcp_subnet >> $config_file + gen_dhcp_subnet "$cfg" >> $config_file } general_config() {