isc-dhcp: support generic DHCP options 5819/head
authorPhilip Prindeville <philipp@redfish-solutions.com>
Sun, 25 Mar 2018 08:17:52 +0000 (02:17 -0600)
committerPhilip Prindeville <philipp@redfish-solutions.com>
Fri, 30 Mar 2018 02:12:03 +0000 (20:12 -0600)
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 <philipp@redfish-solutions.com>
net/isc-dhcp/files/dhcpd.init

index 453adfa81076baa35e3c1cd749751b1b09577ef8..fdcbe24909f00e709a64eee5401cf64034e6fd1d 100644 (file)
@@ -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() {