mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-11-30 21:12:49 +02:00
5949fd8b7c
This tiny patch makes the dnsmasq init.d script listen to a parameter called "notinterface", which tells dnsmasq to not listen on a defined set of interfaces. By default dnsmasq *always* listens on the loopback interface, even if you tell it to specifically listen on a certain other interface. Sometimes this is not desirable behaviour, so you might want to turn it off. This is useful when, for example, you want to have your own DNS server listening on the loopback interface. Signed-off-by: Johnny Halfmoon <jhalfmoon at milksnot.com> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@17599 3c298f89-4303-0410-b956-a3cf2f4a3e73
307 lines
6.6 KiB
Bash
307 lines
6.6 KiB
Bash
#!/bin/sh /etc/rc.common
|
|
# Copyright (C) 2007 OpenWrt.org
|
|
|
|
START=60
|
|
DNS_SERVERS=""
|
|
|
|
dhcp_calc() {
|
|
local ip="$1"
|
|
local res=0
|
|
|
|
while [ -n "$ip" ]; do
|
|
part="${ip%%.*}"
|
|
res="$(($res * 256))"
|
|
res="$(($res + $part))"
|
|
[ "${ip%.*}" != "$ip" ] && ip="${ip#*.}" || ip=
|
|
done
|
|
echo "$res"
|
|
}
|
|
|
|
append_bool() {
|
|
local section="$1"
|
|
local option="$2"
|
|
local value="$3"
|
|
local _loctmp
|
|
config_get_bool _loctmp "$section" "$option"
|
|
[ "$_loctmp" -gt 0 ] && append args "$value"
|
|
}
|
|
|
|
append_parm() {
|
|
local section="$1"
|
|
local option="$2"
|
|
local switch="$3"
|
|
local _loctmp
|
|
config_get _loctmp "$section" "$option"
|
|
[ -z "$_loctmp" ] && return 0
|
|
append args "$switch $_loctmp"
|
|
}
|
|
|
|
append_server() {
|
|
append args "-S $1"
|
|
}
|
|
|
|
append_interface() {
|
|
append args "-i $1"
|
|
}
|
|
|
|
append_notinterface() {
|
|
append args "-I $1"
|
|
}
|
|
|
|
dnsmasq() {
|
|
local cfg="$1"
|
|
append_bool "$cfg" authoritative "-K"
|
|
append_bool "$cfg" nodaemon "-d"
|
|
append_bool "$cfg" domainneeded "-D"
|
|
append_bool "$cfg" filterwin2k "-f"
|
|
append_bool "$cfg" nohosts "-h"
|
|
append_bool "$cfg" nonegcache "-N"
|
|
append_bool "$cfg" strictorder "-o"
|
|
append_bool "$cfg" logqueries "-q"
|
|
append_bool "$cfg" noresolv "-R"
|
|
append_bool "$cfg" localise_queries "-y"
|
|
append_bool "$cfg" readethers "-Z"
|
|
append_bool "$cfg" dbus "-1"
|
|
append_bool "$cfg" boguspriv "-b"
|
|
append_bool "$cfg" expandhosts "-E"
|
|
append_bool "$cfg" enable_tftp "--enable-tftp"
|
|
append_bool "$cfg" nonwildcard "-z"
|
|
|
|
append_parm "$cfg" dnsforwardmax "-0"
|
|
append_parm "$cfg" port "-p"
|
|
append_parm "$cfg" ednspacket_max "-P"
|
|
append_parm "$cfg" dhcpleasemax "-X"
|
|
append_parm "$cfg" "addnhosts" "-H"
|
|
append_parm "$cfg" "queryport" "-Q"
|
|
append_parm "$cfg" "domain" "-s"
|
|
append_parm "$cfg" "local" "-S"
|
|
config_list_foreach "$cfg" "server" append_server
|
|
config_list_foreach "$cfg" "interface" append_interface
|
|
config_list_foreach "$cfg" "notinterface" append_notinterface
|
|
append_parm "$cfg" "leasefile" "-l"
|
|
append_parm "$cfg" "resolvfile" "-r"
|
|
append_parm "$cfg" "tftp_root" "--tftp-root"
|
|
append_parm "$cfg" "dhcp_boot" "--dhcp-boot"
|
|
|
|
config_get leasefile $cfg leasefile
|
|
[ -e "$leasefile" ] || touch "$leasefile"
|
|
config_get_bool cachelocal "$cfg" cachelocal 1
|
|
|
|
config_get hostsfile "$cfg" dhcphostsfile
|
|
[ -e "$hostsfile" ] && append args "--dhcp-hostsfile=$hostsfile"
|
|
}
|
|
|
|
dhcp_subscrid_add() {
|
|
local cfg="$1"
|
|
|
|
config_get name "$cfg" name
|
|
[ -n "$name" ] || return 0
|
|
|
|
config_get subscriberid "$cfg" subscriberid
|
|
[ -n "$subscriberid" ] || return 0
|
|
|
|
append args "--dhcp-subscrid=$name,$subscriberid"
|
|
|
|
dhcp_option_add "$cfg" "$name"
|
|
}
|
|
|
|
dhcp_remoteid_add() {
|
|
local cfg="$1"
|
|
|
|
config_get name "$cfg" name
|
|
[ -n "$name" ] || return 0
|
|
|
|
config_get remoteid "$cfg" remoteid
|
|
[ -n "$remoteid" ] || return 0
|
|
|
|
append args "--dhcp-remoteid=$name,$remoteid"
|
|
|
|
dhcp_option_add "$cfg" "$name"
|
|
}
|
|
|
|
dhcp_circuitid_add() {
|
|
local cfg="$1"
|
|
|
|
config_get name "$cfg" name
|
|
[ -n "$name" ] || return 0
|
|
|
|
config_get circuitid "$cfg" circuitid
|
|
[ -n "$circuitid" ] || return 0
|
|
|
|
append args "--dhcp-circuitid=$name,$circuitid"
|
|
|
|
dhcp_option_add "$cfg" "$name"
|
|
}
|
|
|
|
dhcp_userclass_add() {
|
|
local cfg="$1"
|
|
|
|
config_get name "$cfg" name
|
|
[ -n "$name" ] || return 0
|
|
|
|
config_get userclass "$cfg" userclass
|
|
[ -n "$userclass" ] || return 0
|
|
|
|
append args "--dhcp-userclass=$name,$userclass"
|
|
|
|
dhcp_option_add "$cfg" "$name"
|
|
}
|
|
|
|
dhcp_vendorclass_add() {
|
|
local cfg="$1"
|
|
|
|
config_get name "$cfg" name
|
|
[ -n "$name" ] || return 0
|
|
|
|
config_get vendorclass "$cfg" vendorclass
|
|
[ -n "$vendorclass" ] || return 0
|
|
|
|
append args "--dhcp-vendorclass=$name,$vendorclass"
|
|
|
|
dhcp_option_add "$cfg" "$name"
|
|
}
|
|
|
|
dhcp_host_add() {
|
|
local cfg="$1"
|
|
|
|
config_get name "$cfg" name
|
|
[ -n "$name" ] || return 0
|
|
|
|
config_get mac "$cfg" mac
|
|
[ -n "$mac" ] || return 0
|
|
|
|
config_get ip "$cfg" ip
|
|
[ -n "$ip" ] || return 0
|
|
|
|
append args "--dhcp-host=$mac,$ip"
|
|
|
|
dhcp_option_add "$cfg" "$name"
|
|
}
|
|
|
|
dhcp_mac_add() {
|
|
local cfg="$1"
|
|
|
|
config_get name "$cfg" name
|
|
[ -n "$name" ] || return 0
|
|
|
|
config_get mac "$cfg" mac
|
|
[ -n "$mac" ] || return 0
|
|
|
|
append args "--dhcp-mac=$name,$mac"
|
|
|
|
dhcp_option_add "$cfg" "$name"
|
|
}
|
|
|
|
dhcp_boot_add() {
|
|
local cfg="$1"
|
|
|
|
config_get name "$cfg" name
|
|
|
|
config_get filename "$cfg" filename
|
|
[ -n "$filename" ] || return 0
|
|
|
|
config_get servername "$cfg" servername
|
|
[ -n "$servername" ] || return 0
|
|
|
|
config_get serveraddress "$cfg" serveraddress
|
|
[ -n "$serveraddress" ] || return 0
|
|
|
|
append args "--dhcp-boot=${name:+net:$name,}$filename,$servername,$serveraddress"
|
|
|
|
dhcp_option_add "$cfg" "$name"
|
|
}
|
|
|
|
|
|
dhcp_add() {
|
|
local cfg="$1"
|
|
config_get net "$cfg" interface
|
|
[ -n "$net" ] || return 0
|
|
|
|
config_get name "$cfg" name
|
|
[ -n "$name" ] || name="$net"
|
|
|
|
config_get ifname "$net" ifname
|
|
[ -n "$ifname" ] || return 0
|
|
|
|
config_get dnsserver "$net" dns
|
|
[ "$cachelocal" = "0" -a -n "$dnsserver" ] && {
|
|
DNS_SERVERS="$DNS_SERVERS $dnsserver"
|
|
}
|
|
|
|
append_bool "$cfg" ignore "-2 $ifname" && return 0
|
|
|
|
config_get proto "$net" proto
|
|
[ static = "$proto" ] || return 0
|
|
|
|
config_get ipaddr "$net" ipaddr
|
|
config_get netmask "$cfg" netmask
|
|
[ -n "$netmask" ] || config_get netmask "$net" netmask
|
|
|
|
#check for an already active dhcp server on the interface, unless 'force' is set
|
|
config_get_bool force "$cfg" force 0
|
|
[ "$force" -gt 0 ] || {
|
|
udhcpc -n -q -s /bin/true -t 1 -i $ifname >&- && return 0
|
|
}
|
|
|
|
config_get start "$cfg" start
|
|
config_get limit "$cfg" limit
|
|
config_get leasetime "$cfg" leasetime
|
|
config_get options "$cfg" options
|
|
config_get_bool dynamicdhcp "$cfg" dynamicdhcp 1
|
|
|
|
leasetime="${leasetime:-12h}"
|
|
start="$(dhcp_calc "${start:-100}")"
|
|
limit="$((${limit:-150} + 1))"
|
|
eval "$(ipcalc.sh $ipaddr $netmask $start $limit)"
|
|
if [ "$dynamicdhcp" = "0" ]; then END="static"; fi
|
|
append args "--dhcp-range=$name,$START,$END,$NETMASK,$leasetime${options:+ $options}"
|
|
|
|
dhcp_option_add "$cfg" "$name"
|
|
}
|
|
|
|
dhcp_option_add() {
|
|
local cfg="$1"
|
|
local name="$2"
|
|
|
|
config_get dhcp_option "$cfg" dhcp_option
|
|
for o in $dhcp_option; do
|
|
append args "-O $name","$o"
|
|
done
|
|
|
|
}
|
|
|
|
start() {
|
|
include /lib/network
|
|
scan_interfaces
|
|
config_load dhcp
|
|
|
|
args=""
|
|
config_foreach dnsmasq dnsmasq
|
|
config_foreach dhcp_host_add host
|
|
config_foreach dhcp_boot_add boot
|
|
config_foreach dhcp_mac_add mac
|
|
config_foreach dhcp_vendorclass_add vendorclass
|
|
config_foreach dhcp_userclass_add userclass
|
|
config_foreach dhcp_circuitid_add circuitid
|
|
config_foreach dhcp_remoteid_add remoteid
|
|
config_foreach dhcp_subscrid_add subscrid
|
|
config_foreach dhcp_add dhcp
|
|
|
|
/usr/sbin/dnsmasq $args && {
|
|
rm -f /tmp/resolv.conf
|
|
DNS_SERVERS="$DNS_SERVERS 127.0.0.1"
|
|
for DNS_SERVER in $DNS_SERVERS ; do
|
|
echo "nameserver $DNS_SERVER" >> /tmp/resolv.conf
|
|
done
|
|
}
|
|
}
|
|
|
|
stop() {
|
|
[ -f /tmp/resolv.conf ] && {
|
|
rm -f /tmp/resolv.conf
|
|
ln -s /tmp/resolv.conf.auto /tmp/resolv.conf
|
|
}
|
|
killall dnsmasq
|
|
return 0
|
|
}
|