dnsmasq: fix dnssec timestamp logic, backport crashfix
[openwrt/staging/chunkeey.git] / package / network / services / dnsmasq / files / dnsmasq.init
index b5fb58c524687b1081b2e20c1c3efdd540cb185e..b0a5fbc04f81ee67bb37c73ff7e9f7b9f8e4b71d 100644 (file)
@@ -13,6 +13,9 @@ ADD_LOCAL_DOMAIN=1
 ADD_LOCAL_HOSTNAME=1
 
 CONFIGFILE="/var/etc/dnsmasq.conf"
+HOSTFILE="/tmp/hosts/dhcp"
+TRUSTANCHORSFILE="/usr/share/dnsmasq/trust-anchors.conf"
+TIMESTAMPFILE="/etc/dnsmasq.time"
 
 xappend() {
        local value="$1"
@@ -83,6 +86,10 @@ append_address() {
        xappend "--address=$1"
 }
 
+append_ipset() {
+       xappend "--ipset=$1"
+}
+
 append_interface() {
        local ifname=$(uci_get_state network "$1" ifname "$1")
        xappend "--interface=$ifname"
@@ -101,6 +108,10 @@ append_bogusnxdomain() {
        xappend "--bogus-nxdomain=$1"
 }
 
+append_pxe_service() {
+       xappend "--pxe-service=$1"
+}
+
 dnsmasq() {
        local cfg="$1"
        append_bool "$cfg" authoritative "--dhcp-authoritative"
@@ -118,9 +129,12 @@ dnsmasq() {
        append_bool "$cfg" boguspriv "--bogus-priv"
        append_bool "$cfg" expandhosts "--expand-hosts"
        append_bool "$cfg" enable_tftp "--enable-tftp"
+       append_bool "$cfg" tftp_no_fail "--tftp-no-fail"
        append_bool "$cfg" nonwildcard "--bind-interfaces"
        append_bool "$cfg" fqdn "--dhcp-fqdn"
        append_bool "$cfg" proxydnssec "--proxy-dnssec"
+       append_bool "$cfg" localservice "--local-service"
+       append_bool "$cfg" quietdhcp "--quiet-dhcp"
 
        append_parm "$cfg" dhcpscript "--dhcp-script"
        append_parm "$cfg" cachesize "--cache-size"
@@ -133,16 +147,19 @@ dnsmasq() {
        append_parm "$cfg" "local" "--server"
        config_list_foreach "$cfg" "server" append_server
        config_list_foreach "$cfg" "address" append_address
+       config_list_foreach "$cfg" "ipset" append_ipset
        config_list_foreach "$cfg" "interface" append_interface
        config_list_foreach "$cfg" "notinterface" append_notinterface
        config_list_foreach "$cfg" "addnhosts" append_addnhosts
        config_list_foreach "$cfg" "bogusnxdomain" append_bogusnxdomain
        append_parm "$cfg" "leasefile" "--dhcp-leasefile"
        append_parm "$cfg" "resolvfile" "--resolv-file"
+       append_parm "$cfg" "serversfile" "--servers-file"
        append_parm "$cfg" "tftp_root" "--tftp-root"
        append_parm "$cfg" "dhcp_boot" "--dhcp-boot"
        append_parm "$cfg" "local_ttl" "--local-ttl"
-
+       append_parm "$cfg" "pxe_prompt" "--pxe-prompt"
+       config_list_foreach "$cfg" "pxe_service" append_pxe_service
        config_get DOMAIN "$cfg" domain
 
        config_get_bool ADD_LOCAL_DOMAIN "$cfg" add_local_domain 1
@@ -185,6 +202,14 @@ dnsmasq() {
                config_list_foreach "$cfg" rebind_domain append_rebind_domain
        }
 
+       config_get_bool dnssec "$cfg" dnssec 0
+       [ "$dnssec" -gt 0 ] && {
+               xappend "--conf-file=$TRUSTANCHORSFILE"
+               xappend "--dnssec"
+               xappend "--dnssec-timestamp=$TIMESTAMPFILE"
+               append_bool "$cfg" dnsseccheckunsigned "--dnssec-check-unsigned"
+       }
+
        dhcp_option_add "$cfg" "" 0
 
        xappend "--dhcp-broadcast=tag:needs-broadcast"
@@ -284,15 +309,22 @@ dhcp_host_add() {
        config_get ip "$cfg" ip
        [ -n "$ip" -o -n "$name" ] || return 0
 
+       config_get_bool dns "$cfg" dns 0
+       [ "$dns" = "1" -a -n "$ip" -a -n "$name" ] && {
+               echo "$ip $name${DOMAIN:+.$DOMAIN}" >> $HOSTFILE
+       }
+
        config_get mac "$cfg" mac
-       [ -z "$mac" ] && {
+       if [ -n "$mac" ]; then
+               # --dhcp-host=00:20:e0:3b:13:af,192.168.0.199,lap
+               macs=""
+               for m in $mac; do append macs "$m" ","; done
+       else
+               # --dhcp-host=lap,192.168.0.199
                [ -n "$name" ] || return 0
-               mac="$name"
+               macs="$name"
                name=""
-       }
-
-       macs=""
-       for m in $mac; do append macs "$m" ","; done
+       fi
 
        config_get tag "$cfg" tag
 
@@ -341,12 +373,11 @@ dhcp_boot_add() {
        [ -n "$filename" ] || return 0
 
        config_get servername "$cfg" servername
-       [ -n "$servername" ] || return 0
-
        config_get serveraddress "$cfg" serveraddress
-       [ -n "$serveraddress" ] || return 0
 
-       xappend "--dhcp-boot=${networkid:+net:$networkid,}$filename,$servername,$serveraddress"
+       [ -n "$serveraddress" -a ! -n "$servername" ] && return 0
+
+       xappend "--dhcp-boot=${networkid:+net:$networkid,}${filename}${servername:+,$servername}${serveraddress:+,$serveraddress}"
 
        config_get_bool force "$cfg" force 0
 
@@ -359,6 +390,9 @@ dhcp_add() {
        config_get net "$cfg" interface
        [ -n "$net" ] || return 0
 
+       config_get dhcpv4 "$cfg" dhcpv4
+       [ "$dhcpv4" != "disabled" ] || return 0
+
        config_get networkid "$cfg" networkid
        [ -n "$networkid" ] || networkid="$net"
 
@@ -424,13 +458,10 @@ dhcp_domain_add() {
        [ -n "$ip" ] || return 0
 
        for name in $names; do
-               [ "${name%.*}" == "$name" ] && \
-                       name="$name${DOMAIN:+.$DOMAIN}"
-
-               record="${record:+$record/}$name"
+               record="${record:+$record }$name"
        done
 
-       xappend "--address=/$record/$ip"
+       echo "$ip $record" >> $HOSTFILE
 }
 
 dhcp_srv_add() {
@@ -520,14 +551,29 @@ start_service() {
        config_load dhcp
 
        procd_open_instance
-       procd_set_param command $PROG -C $CONFIGFILE -k
+       procd_set_param command $PROG -C $CONFIGFILE -k -x /var/run/dnsmasq/dnsmasq.pid
        procd_set_param file $CONFIGFILE
+       procd_set_param respawn
+
+       procd_add_jail dnsmasq ubus log
+       procd_add_jail_mount $CONFIGFILE $TRUSTANCHORSFILE $HOSTFILE /etc/passwd /dev/urandom /etc/dnsmasq.conf /tmp/dnsmasq.d /tmp/resolv.conf.auto /etc/hosts /etc/ethers
+       procd_add_jail_mount_rw /var/run/dnsmasq/ /tmp/dhcp.leases $TIMESTAMPFILE
+       
        procd_close_instance
 
        # before we can call xappend
+       mkdir -p /var/run/dnsmasq/
        mkdir -p $(dirname $CONFIGFILE)
+       mkdir -p /var/lib/misc
+       touch /tmp/dhcp.leases
+
+       if [ ! -f "$TIMESTAMPFILE" ]; then
+               touch "$TIMESTAMPFILE"
+               chown nobody.nogroup "$TIMESTAMPFILE"
+       fi
 
        echo "# auto-generated config file from /etc/config/dhcp" > $CONFIGFILE
+       echo "# auto-generated config file from /etc/config/dhcp" > $HOSTFILE
 
        # if we did this last, we could override auto-generated config
        [ -f /etc/dnsmasq.conf ] && {
@@ -553,7 +599,7 @@ start_service() {
        local lanaddr
        [ $ADD_LOCAL_HOSTNAME -eq 1 ] && network_get_ipaddr lanaddr "lan" && {
                local hostname="$(uci_get system @system[0] hostname OpenWrt)"
-               dhcp_hostrecord_add "" "${hostname%.$DOMAIN}${DOMAIN:+.$DOMAIN ${hostname%.$DOMAIN}}" "$lanaddr"
+               dhcp_domain_add "" "$hostname" "$lanaddr"
        }
 
        echo >> $CONFIGFILE