Ticket #8862: 2011.02.13-dnsmasq_multi_instances.patch

File 2011.02.13-dnsmasq_multi_instances.patch, 10.2 KB (added by debugger@…, 6 years ago)

multiple instance patch for dnsmasq

  • dhcp.conf

     
    1919        #list interface         br-lan 
    2020        #list notinterface      lo 
    2121        #list bogusnxdomain     '64.94.110.11' 
     22        #option nonwildcard     1 # to allow multiple instances of dnsmasq 
    2223 
     24#config dnsmasq 'hotspot' 
     25#       option domainneeded     1 
     26#       option nonwildcard      1 
     27#       option boguspriv        1 
     28#       option filterwin2k      0  # enable for dial on demand 
     29#       option localise_queries 1 
     30#       option rebind_protection 1  # disable if upstream must serve RFC1918 addresses 
     31#       option rebind_localhost 1  # enable for RBL checking and similar services 
     32#       #list rebind_domain example.lan  # whitelist RFC1918 responses for domains 
     33#       option local    '/hotspot/' 
     34#       option domain   'hotspot' 
     35#       option expandhosts      1 
     36#       option authoritative    1 
     37#       option leasefile        '/tmp/dhcp.leases.hotspot' 
     38#       # allows to configure a second DNS forwarder/server 
     39#       option resolvfile       '/tmp/resolv.conf.hotspot' 
     40 
     41#config dhcp dialin 
     42#       option interface        eth0.2 
     43#       option dnsmasq_config   hotspot # use this dhcp range only for dnsmasq hotspot instance 
     44#       option start    200 
     45#       option limit    250 
     46#       option leasetime        1h 
     47 
     48#config host 
     49#       option ip       192.168.16.12 
     50#       option name     clientA 
     51#       option dnsmasq_config   hotspot # use this dhcp range only for dnsmasq hotspot instance 
     52 
     53 
    2354config dhcp lan 
    2455        option interface        lan 
    2556        option start    100 
  • dnsmasq.init

     
    11#!/bin/sh /etc/rc.common 
    22# Copyright (C) 2007 OpenWrt.org 
    33 
     4NAME="dnsmasq" 
     5PROG="/usr/sbin/dnsmasq" 
    46START=60 
    5 DNS_SERVERS="" 
    6 DOMAIN="" 
     7debug=0 
    78 
    89dhcp_calc() { 
    910        local ip="$1" 
     
    4243} 
    4344 
    4445append_interface() { 
    45         local ifname=$(uci_get_state network "$1" ifname "$1") 
     46        local ifname=$(uci_get_state network "$1" ifname "$1") dnsmasq_instance="$2" 
    4647        append args "-i $ifname" 
     48        [ -z "$debug" ] || echo "DEBUG  [$dnsmasq_instance] Listen IF $ifname" 
    4749} 
    4850 
    4951append_notinterface() { 
    50         local ifname=$(uci_get_state network "$1" ifname "$1") 
     52        local ifname=$(uci_get_state network "$1" ifname "$1") dnsmasq_instance="$2" 
    5153        append args "-I $ifname" 
     54        [ -z "$debug" ] || echo "DEBUG  [$dnsmasq_instance] Ignore IF $ifname" 
    5255} 
    5356 
    5457append_addnhosts() { 
     
    6063} 
    6164 
    6265dnsmasq() { 
    63         local cfg="$1" 
     66        local cfg="$1" args="" resolv DNS_SERVER enabled 
     67         
     68        config_get_bool enabled "$cfg" enabled 1 
     69        [ "$enabled" -eq 0 ] && { 
     70                echo "Setup for dnsmasq: $cfg (disabled)" 
     71                return 0; 
     72        } 
     73 
     74        echo "Setup for dnsmasq: $cfg" 
     75         
     76        # reset list of DOMAINS and DNS servers (for each dnsmasq instance) 
     77        DNS_SERVERS="" 
     78        DOMAIN="" 
     79 
     80        config_get resolv "$cfg" "resolvfile" 
     81        [ -n $resolv ] || resolv="/tmp/resolv.${cfg}.conf" || echo "Default resolvfile: $resolv" 
     82 
     83        append args "-x /var/run/${NAME}.${cfg}.pid" 
     84         
    6485        append_bool "$cfg" authoritative "-K" 
    6586        append_bool "$cfg" nodaemon "-d" 
    6687        append_bool "$cfg" domainneeded "-D" 
     
    86107        append_parm "$cfg" "queryport" "-Q" 
    87108        append_parm "$cfg" "domain" "-s" 
    88109        append_parm "$cfg" "local" "-S" 
     110        append_parm "$cfg" listen "-a" 
    89111        config_list_foreach "$cfg" "server" append_server 
    90112        config_list_foreach "$cfg" "interface" append_interface 
    91113        config_list_foreach "$cfg" "notinterface" append_notinterface 
     
    93115        config_list_foreach "$cfg" "bogusnxdomain" append_bogusnxdomain 
    94116        append_parm "$cfg" "leasefile" "-l" 
    95117        append_parm "$cfg" "resolvfile" "-r" 
     118 
    96119        append_parm "$cfg" "tftp_root" "--tftp-root" 
    97120        append_parm "$cfg" "dhcp_boot" "--dhcp-boot" 
    98121 
    99122        config_get DOMAIN "$cfg" domain 
    100  
     123         
    101124        config_get_bool readethers "$cfg" readethers 
    102125        [ "$readethers" = "1" ] && [ -e "/etc/ethers" ] || touch /etc/ethers 
    103126 
     
    130153 
    131154                config_list_foreach "$cfg" rebind_domain append_rebind_domain 
    132155        } 
     156        config_foreach dhcp_host_add host $cfg 
     157        config_foreach filter_dnsmasq boot dhcp_boot_add $cfg 
     158        config_foreach filter_dnsmasq mac dhcp_mac_add $cfg 
     159        config_foreach filter_dnsmasq vendorclass dhcp_vendorclass_add $cfg 
     160        config_foreach filter_dnsmasq userclass dhcp_userclass_add $cfg 
     161        config_foreach filter_dnsmasq circuitid dhcp_circuitid_add $cfg 
     162        config_foreach filter_dnsmasq remoteid dhcp_remoteid_add $cfg 
     163        config_foreach filter_dnsmasq subscrid dhcp_subscrid_add $cfg 
     164        config_foreach filter_dnsmasq domain dhcp_domain_add $cfg 
     165        config_foreach filter_dnsmasq dhcp dhcp_add $cfg 
     166                 
     167         
     168        [ "$debug" -ge 1 ] && echo "DEBUG       [$cfg] dnsmasq $args" 
     169        [ "$debug" -ge 1 ] && echo "DEBUG       [$cfg] resolv=$resolv" 
     170        /usr/sbin/dnsmasq $args && { 
     171                rm -f $resolv 
     172                [ -n "$DOMAIN" ] && echo "search $DOMAIN" >> $resolv 
     173                DNS_SERVERS="$DNS_SERVERS 127.0.0.1" 
     174 
     175                echo "  [$cfg] Upstream DNS server(s): $DNS_SERVERS" 
     176                for DNS_SERVER in $DNS_SERVERS ; do 
     177                        echo "nameserver $DNS_SERVER" >> $resolv 
     178                done 
     179        } 
    133180} 
    134181 
     182match_dnsmasq_instance() { 
     183        local cfg="$1" dnsmasq_instance="$2" dnsmasq_cfg 
     184        config_get dnsmasq_cfg "$cfg" "dnsmasq_config" 
     185         
     186        [ "$debug" -ge 2 ] && [ -z "$dnsmasq_cfg" ] && echo "DEBUG      [$dnsmasq_instance] dnsmasq_config = undefined for cfg=$cfg" 
     187        [ -z "$dnsmasq_cfg" ] && return 2 
     188 
     189        [ "$debug" -ge 2 ] && [ "$dnsmasq_cfg" = "dnsmasq_instance" ] && echo "DEBUG    [$dnsmasq_instance] dnsmasq_config = [$dnsmasq_cfg] for cfg=$cfg MATCHING instance" 
     190        [ "$dnsmasq_cfg" = "$dnsmasq_instance" ] && return 1 
     191 
     192        [ "$debug" -ge 2 ] && echo "DEBUG       [$dnsmasq_instance] dnsmasq_config = [$dnsmasq_cfg] for cfg=$cfg DIFFERENT instance" 
     193        return 0 
     194} 
     195 
     196 
     197filter_dnsmasq() { 
     198        local function="$2" cfg="$1" dnsmasq_instance="$3" match_dnsmasq 
     199        match_dnsmasq_instance $cfg $dnsmasq_instance 
     200        match_dnsmasq=$? 
     201        [ "$debug" -ge 2 ] && echo "DEBUG       [$dnsmasq_instance] Filtering for $function match_dnsmasq=$match_dnsmasq" 
     202        [ "$match_dnsmasq" -eq 0 ] && return 0 
     203        [ "$debug" -ge 1 ] && echo "DEBUG       [$dnsmasq_instance] Calling $function" 
     204        # call function 
     205        $function $cfg $dnsmasq_instance 
     206} 
     207 
    135208dhcp_subscrid_add() { 
    136209        local cfg="$1" 
    137210 
     
    201274 
    202275        dhcp_option_add "$cfg" "$networkid" 
    203276} 
    204  
     277  
    205278dhcp_host_add() { 
    206         local cfg="$1" 
     279        local cfg="$1" dnsmasq_instance="$2" ignore match_dnsmasq name macs mac networkid ip 
     280         
     281        match_dnsmasq_instance $cfg $dnsmasq_instance 
     282        match_dnsmasq=$? 
     283         
     284        config_get ignore "cfg" ignore 
     285        [ "$debug" -ge 2 ] && echo "DEBUG       [$dnsmasq_instance] ignore=$ignore (from uci)" 
     286         
     287        # if this entry belongs to another dnsmasq instance then ignore the mac address/lease! 
     288        # if someone sets ignore explicitly keep their selection 
     289        [ "$match_dnsmasq" -eq 0 ] && [ -z "$ignore" ] && ignore=1 
     290        [ "$debug" -ge 1 ] && echo "DEBUG       [$dnsmasq_instance] ignore=$ignore" 
    207291 
    208292        config_get name "$cfg" name 
    209293 
    210294        config_get networkid "$cfg" networkid 
     295         
    211296        [ -n "$networkid" ] && dhcp_option_add "$cfg" "$networkid" 
    212297 
    213298        config_get ip "$cfg" ip 
     
    218303        for m in $mac; do append macs "$m" ","; done 
    219304        [ -n "$macs" ] || return 0 
    220305 
    221         append args "--dhcp-host=$macs,${networkid:+net:$networkid,}$ip${name:+,$name}" 
     306        append args "--dhcp-host=$macs,${networkid:+net:$networkid,}$ip${name:+,$name}${ignore:+,ignore}" 
     307        [ -n "$ignore" ] && echo "      [$dnsmasq_instance] Ignore Host $name $mac" && return 0 
     308        echo "  [$dnsmasq_instance] Adding Host $name $mac" 
    222309} 
    223310 
    224311dhcp_mac_add() { 
     
    256343 
    257344 
    258345dhcp_add() { 
    259         local cfg="$1" 
     346        local cfg="$1" dnsmasq_instance="$2" 
     347         
     348        echo "  [$dnsmasq_instance] Adding DHCP range $1" 
     349         
    260350        config_get net "$cfg" interface 
    261351        [ -n "$net" ] || return 0 
    262352 
     
    267357        [ -n "$ifname" ] || return 0 
    268358 
    269359        config_get dnsserver "$net" dns 
     360        [ "$debug" -ge 2 ] && echo "DEBUG       [$dnsmasq_instance] DNS servers=$dnsserver" 
    270361        [ "$cachelocal" = "0" -a -n "$dnsserver" ] && { 
    271362                DNS_SERVERS="$DNS_SERVERS $dnsserver" 
     363                [ "$debug" -ge 1 ] && echo "DEBUG       [$dnsmasq_instance] adding DNS server(s) $dnsserver to list: $DNS_SERVERS" 
    272364        } 
    273365 
    274         append_bool "$cfg" ignore "-2 $ifname" && return 0 
     366        append_bool "$cfg" ignore "-2 '$ifname'" && return 0 
    275367 
    276368        config_get proto "$net" proto 
    277369        [ static = "$proto" ] || return 0 
     
    284376        config_get_bool force "$cfg" force 0 
    285377        [ $force -gt 0 ] || { 
    286378                udhcpc -n -q -s /bin/true -t 1 -i $ifname >&- && { 
    287                         logger -t dnsmasq \ 
    288                                 "found already running DHCP-server on interface '$ifname'" \ 
    289                                 "refusing to start, use 'option force 1' to override" 
     379                        echo "WARNING: DHCP range ignored! A DHCP server is already present on interace $ifname." 
     380                        logger -t dnsmasq -p WARN "WARNING: DHCP range ignored! A DHCP server is already present on interface $ifname."  
    290381                        return 0 
    291382                } 
    292383        } 
     
    319410} 
    320411 
    321412dhcp_domain_add() { 
    322         local cfg="$1" 
     413        local cfg="$1" dnsmasq_instance="$2" 
    323414        local ip name names 
    324415 
    325416        config_get names "$cfg" name 
     
    328419        config_get ip "$cfg" ip 
    329420        [ -n "$ip" ] || return 0 
    330421 
     422         
    331423        local oIFS="$IFS"; IFS="."; set -- $ip; IFS="$oIFS" 
    332424        local raddr="${4:+$4.$3.$2.$1.in-addr.arpa}" 
    333425 
     
    337429                [ "${fqdn%.*}" == "$fqdn" ] && \ 
    338430                        fqdn="$fqdn${DOMAIN:+.$DOMAIN}" 
    339431 
     432                echo "  [$dnsmasq_instance] Adding DNS entry $fqdn to $ip" 
    340433                append args "-A /$fqdn/$ip" 
    341434                 
    342435                [ -n "$raddr" ] && { 
     
    350443        include /lib/network 
    351444        scan_interfaces 
    352445        config_load dhcp 
    353  
    354         args="" 
     446         
    355447        config_foreach dnsmasq dnsmasq 
    356         config_foreach dhcp_host_add host 
    357         config_foreach dhcp_boot_add boot 
    358         config_foreach dhcp_mac_add mac 
    359         config_foreach dhcp_vendorclass_add vendorclass 
    360         config_foreach dhcp_userclass_add userclass 
    361         config_foreach dhcp_circuitid_add circuitid 
    362         config_foreach dhcp_remoteid_add remoteid 
    363         config_foreach dhcp_subscrid_add subscrid 
    364         config_foreach dhcp_domain_add domain 
    365         config_foreach dhcp_add dhcp 
    366  
    367         /usr/sbin/dnsmasq $args && { 
    368                 rm -f /tmp/resolv.conf 
    369                 [ -n "$DOMAIN" ] && echo "search $DOMAIN" >> /tmp/resolv.conf 
    370                 DNS_SERVERS="$DNS_SERVERS 127.0.0.1" 
    371                 for DNS_SERVER in $DNS_SERVERS ; do 
    372                         echo "nameserver $DNS_SERVER" >> /tmp/resolv.conf 
    373                 done 
    374         } 
    375448} 
    376449 
    377450stop() { 
     
    379452                rm -f /tmp/resolv.conf 
    380453                ln -s /tmp/resolv.conf.auto /tmp/resolv.conf 
    381454        } 
    382         killall dnsmasq 
     455        #killing all server processes 
     456        local pidfile 
     457        for pidfile in `ls /var/run/${NAME}.*.pid 2>/dev/null` 
     458        do 
     459                echo Stopping pid `cat $pidfile 2>/dev/null` 
     460                start-stop-daemon -q -K -s KILL -p "${pidfile}" -n "${NAME}" 
     461                rm -f "${pidfile}" 
     462        done 
     463        [ -z "${pidfile}" ] && echo "${initscript}: no pid files." 
     464         
    383465        return 0 
    384466}