2006-10-04 20:05:48 +00:00
|
|
|
#!/bin/sh /etc/rc.common
|
2012-07-01 11:32:46 +00:00
|
|
|
# Copyright (C) 2007-2012 OpenWrt.org
|
2006-10-04 20:05:48 +00:00
|
|
|
|
2016-07-29 12:56:35 +00:00
|
|
|
START=19
|
2011-11-07 22:58:45 +00:00
|
|
|
|
2013-09-17 21:45:30 +00:00
|
|
|
USE_PROCD=1
|
|
|
|
PROG=/usr/sbin/dnsmasq
|
2011-11-07 22:58:45 +00:00
|
|
|
|
2012-07-01 11:32:46 +00:00
|
|
|
ADD_LOCAL_DOMAIN=1
|
|
|
|
ADD_LOCAL_HOSTNAME=1
|
dnsmasq: expand 'add_local_hostname' fexibility including FQDN
ref commit 612e2276b4a2f57fcbbe79b95bec4a46e89d748c
ref commit ec63e3bf1312ab4c666f7417ca9844857214047f
'option add_local_hostname' scripted implementation statically assigns
this host in auto generated host file at init. If IFUP or other signals
do not occur, then address changes are not tracked. The script doesn't
apply all the addresses at an interface. This may make logs obscure.
The script only puts the bare host name (maybe not FQDN) in host file,
but if '--exapandhosts' is enabled, then /etc/hosts entries will be
suffixed, and "127.0.0.1 localhost" becomes "localhost.lan".
dnsmasq provides an option to perform this function, but it is rather
greedy. '--interface-name=<name>,<iface>' will assign the name to all
IP on the specified interface (except link local). This is a useful
feature, but some setups depend on the original restrictive behavior.
'option add_local_fqdn' is added to enhance the feature set, but
if not entered or empty string, then it will default to original
option and behavior. This new option has a few settings. At each
increased setting the most detailed name becomes the PTR record:
0 - same as add_local_hostname 0 or disabled
1 - same as add_local_hostname 1
2 - assigns the bare host name to all IP w/ --dnsmasq-interface
3 - assigns the FQDN and host to all IP w/ --dnsmasq-interface
4 - assigns <iface>.<host>.<domain> and above w/ --dnsmasq-nterface
'option add_wan_fqdn' is added to run the same procedure on
inferred WAN intefaces. If an interface has 'config dhcp' and
'option ignore 1' set, then it is considered WAN. The original
option would only run on DHCP serving interfaces.
Signed-off-by: Eric Luehrsen <ericluehrsen@hotmail.com>
2017-01-14 02:37:25 +00:00
|
|
|
ADD_WAN_FQDN=0
|
|
|
|
ADD_LOCAL_FQDN=""
|
2012-07-01 11:32:46 +00:00
|
|
|
|
2016-10-12 08:33:16 +00:00
|
|
|
BASECONFIGFILE="/var/etc/dnsmasq.conf"
|
|
|
|
BASEHOSTFILE="/tmp/hosts/dhcp"
|
2014-06-18 10:04:29 +00:00
|
|
|
TRUSTANCHORSFILE="/usr/share/dnsmasq/trust-anchors.conf"
|
2016-06-14 10:00:21 +00:00
|
|
|
TIMEVALIDFILE="/var/state/dnsmasqsec"
|
2016-10-12 08:33:16 +00:00
|
|
|
BASEDHCPSTAMPFILE="/var/run/dnsmasq"
|
2018-10-08 19:40:36 +00:00
|
|
|
DHCPBOGUSHOSTNAMEFILE="/usr/share/dnsmasq/dhcpbogushostname.conf"
|
2017-02-20 10:15:55 +00:00
|
|
|
RFC6761FILE="/usr/share/dnsmasq/rfc6761.conf"
|
2017-05-06 10:56:26 +00:00
|
|
|
DHCPSCRIPT="/usr/lib/dnsmasq/dhcp-script.sh"
|
2021-08-01 02:33:52 +00:00
|
|
|
DHCPSCRIPT_DEPENDS="/usr/share/libubox/jshn.sh /usr/bin/jshn /bin/ubus"
|
2012-04-02 22:31:21 +00:00
|
|
|
|
2016-12-22 18:20:25 +00:00
|
|
|
DNSMASQ_DHCP_VER=4
|
|
|
|
|
2019-05-25 09:58:18 +00:00
|
|
|
dnsmasq_ignore_opt() {
|
|
|
|
local opt="$1"
|
|
|
|
|
2019-06-11 08:26:27 +00:00
|
|
|
if [ -z "$dnsmasq_features" ]; then
|
|
|
|
dnsmasq_features="$(dnsmasq --version | grep -m1 'Compile time options:' | cut -d: -f2) "
|
|
|
|
[ "${dnsmasq_features#* DHCP }" = "$dnsmasq_features" ] || dnsmasq_has_dhcp=1
|
|
|
|
[ "${dnsmasq_features#* DHCPv6 }" = "$dnsmasq_features" ] || dnsmasq_has_dhcp6=1
|
|
|
|
[ "${dnsmasq_features#* DNSSEC }" = "$dnsmasq_features" ] || dnsmasq_has_dnssec=1
|
|
|
|
[ "${dnsmasq_features#* TFTP }" = "$dnsmasq_features" ] || dnsmasq_has_tftp=1
|
|
|
|
[ "${dnsmasq_features#* ipset }" = "$dnsmasq_features" ] || dnsmasq_has_ipset=1
|
dnsmasq: Support nftables nftsets
Add build option for nftables sets. By default disable iptables ipset
support. By default enable nftable nftset support since this is what
fw4 uses.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
dnsmasq: nftset: serve from ipset config
Use existing ipset configs as source for nftsets to be compatible with
existing configs. As the OS can either have iptables XOR nftables
support, it's fine to provide both to dnsmasq. dnsmasq will silently
fail for the present one. Depending on the dnsmasq compile time options,
the ipsets or nftsets option will not be added to the dnsmasq config
file.
dnsmasq will try to add the IP addresses to all sets, regardless of the
IP version defined for the set. Adding an IPv6 to an IPv4 set and vice
versa will silently fail.
Signed-off-by: Mathias Kresin <dev@kresin.me>
dnsmasq: support populating nftsets in addition to ipsets
Tell dnsmasq to populate nftsets instead of ipsets, if firewall4 is present in
the system. Keep the same configuration syntax in /etc/config/dhcp, for
compatibility purposes.
Huge thanks to Jo-Philipp Wich for basically writing the function.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Signed-off-by: Rui Salvaterra <rsalvaterra@gmail.com>
dnsmasq: obtain nftset ip family from nft
Unfortunately dnsmasq nft is noisy if an attempt to add a mismatched ip address
family to an nft set is made.
Heuristic to guess which ip family a nft set might belong by inferring
from the set name.
In order of preference:
If setname ends with standalone '4' or '6' use that, else
if setname has '4' or '6' delimited by '-' or '_' use that (eg
foo-4-bar) else
If setname begins with '4' or '6' standalone use that.
By standalone I mean not as part of a larger number eg. 24
If the above fails then use the existing nft set query mechanism and if
that fails, well you're stuffed!
With-thanks-to: Jo-Philipp Wich <jo@mein.io> who improved my regexp
knowledge.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
dnsmasq: specify firewall table for nftset
Permit ipsets to specify an nftables table for the set. New config
parameter is 'table'. If not specified the default of 'fw4' is used.
config ipset
list name 'BK_4,BK_6'
option table 'dscpclassify'
option table_family 'ip'
option family '4'
list domain 'ms-acdc.office.com'
list domain 'windowsupdate.com'
list domain 'update.microsoft.com'
list domain 'graph.microsoft.com'
list domain '1drv.ms'
list domain '1drv.com'
The table family can also be specified, usually 'ip' or 'ip6' else the
default 'inet' capable of both ipv4 & ipv6 is used.
If the table family is not specified then finally a family option is
available to specify either '4' or '6' for ipv4 or ipv6 respectively.
This is all in addition to the existing heuristic that will look in the
nftset name for an ip family clue, or in total desperation, query the
value from the nftset itself.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
2021-11-29 17:16:39 +00:00
|
|
|
[ "${dnsmasq_features#* nftset }" = "$dnsmasq_features" ] || dnsmasq_has_nftset=1
|
2019-06-11 08:26:27 +00:00
|
|
|
fi
|
|
|
|
|
2019-05-25 09:58:18 +00:00
|
|
|
case "$opt" in
|
|
|
|
dhcp-duid|\
|
|
|
|
ra-param)
|
|
|
|
[ -z "$dnsmasq_has_dhcp6" ] ;;
|
|
|
|
dhcp-*|\
|
|
|
|
bootp-*|\
|
|
|
|
pxe-*)
|
|
|
|
[ -z "$dnsmasq_has_dhcp" ] ;;
|
2020-08-04 04:00:22 +00:00
|
|
|
dnssec*|\
|
2019-05-25 09:58:18 +00:00
|
|
|
trust-anchor)
|
2020-08-04 04:00:22 +00:00
|
|
|
if [ -z "$dnsmasq_has_dnssec" ]; then
|
|
|
|
echo "dnsmasq: \"$opt\" requested, but dnssec support is not available" >&2
|
|
|
|
exit 1
|
|
|
|
fi
|
2020-09-25 02:28:19 +00:00
|
|
|
return 1
|
2020-08-04 04:00:22 +00:00
|
|
|
;;
|
2019-05-25 09:58:18 +00:00
|
|
|
tftp-*)
|
|
|
|
[ -z "$dnsmasq_has_tftp" ] ;;
|
|
|
|
ipset)
|
|
|
|
[ -z "$dnsmasq_has_ipset" ] ;;
|
dnsmasq: Support nftables nftsets
Add build option for nftables sets. By default disable iptables ipset
support. By default enable nftable nftset support since this is what
fw4 uses.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
dnsmasq: nftset: serve from ipset config
Use existing ipset configs as source for nftsets to be compatible with
existing configs. As the OS can either have iptables XOR nftables
support, it's fine to provide both to dnsmasq. dnsmasq will silently
fail for the present one. Depending on the dnsmasq compile time options,
the ipsets or nftsets option will not be added to the dnsmasq config
file.
dnsmasq will try to add the IP addresses to all sets, regardless of the
IP version defined for the set. Adding an IPv6 to an IPv4 set and vice
versa will silently fail.
Signed-off-by: Mathias Kresin <dev@kresin.me>
dnsmasq: support populating nftsets in addition to ipsets
Tell dnsmasq to populate nftsets instead of ipsets, if firewall4 is present in
the system. Keep the same configuration syntax in /etc/config/dhcp, for
compatibility purposes.
Huge thanks to Jo-Philipp Wich for basically writing the function.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Signed-off-by: Rui Salvaterra <rsalvaterra@gmail.com>
dnsmasq: obtain nftset ip family from nft
Unfortunately dnsmasq nft is noisy if an attempt to add a mismatched ip address
family to an nft set is made.
Heuristic to guess which ip family a nft set might belong by inferring
from the set name.
In order of preference:
If setname ends with standalone '4' or '6' use that, else
if setname has '4' or '6' delimited by '-' or '_' use that (eg
foo-4-bar) else
If setname begins with '4' or '6' standalone use that.
By standalone I mean not as part of a larger number eg. 24
If the above fails then use the existing nft set query mechanism and if
that fails, well you're stuffed!
With-thanks-to: Jo-Philipp Wich <jo@mein.io> who improved my regexp
knowledge.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
dnsmasq: specify firewall table for nftset
Permit ipsets to specify an nftables table for the set. New config
parameter is 'table'. If not specified the default of 'fw4' is used.
config ipset
list name 'BK_4,BK_6'
option table 'dscpclassify'
option table_family 'ip'
option family '4'
list domain 'ms-acdc.office.com'
list domain 'windowsupdate.com'
list domain 'update.microsoft.com'
list domain 'graph.microsoft.com'
list domain '1drv.ms'
list domain '1drv.com'
The table family can also be specified, usually 'ip' or 'ip6' else the
default 'inet' capable of both ipv4 & ipv6 is used.
If the table family is not specified then finally a family option is
available to specify either '4' or '6' for ipv4 or ipv6 respectively.
This is all in addition to the existing heuristic that will look in the
nftset name for an ip family clue, or in total desperation, query the
value from the nftset itself.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
2021-11-29 17:16:39 +00:00
|
|
|
nftset)
|
|
|
|
[ -z "$dnsmasq_has_nftset" ] ;;
|
2019-05-25 09:58:18 +00:00
|
|
|
*)
|
|
|
|
return 1
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2012-04-02 22:31:21 +00:00
|
|
|
xappend() {
|
2019-05-25 09:58:18 +00:00
|
|
|
local value="${1#--}"
|
|
|
|
local opt="${value%%=*}"
|
2012-04-02 22:31:21 +00:00
|
|
|
|
2019-05-25 09:58:18 +00:00
|
|
|
if ! dnsmasq_ignore_opt "$opt"; then
|
|
|
|
echo "$value" >>$CONFIGFILE_TMP
|
|
|
|
fi
|
2012-04-02 22:31:21 +00:00
|
|
|
}
|
|
|
|
|
2015-08-31 17:11:41 +00:00
|
|
|
hex_to_hostid() {
|
2016-12-22 18:24:12 +00:00
|
|
|
local var="$1"
|
|
|
|
local hex="${2#0x}" # strip optional "0x" prefix
|
|
|
|
|
|
|
|
if [ -n "${hex//[0-9a-fA-F]/}" ]; then
|
|
|
|
# is invalid hex literal
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
# convert into host id
|
|
|
|
export "$var=$(
|
|
|
|
printf "%0x:%0x" \
|
|
|
|
$(((0x$hex >> 16) % 65536)) \
|
|
|
|
$(( 0x$hex % 65536))
|
|
|
|
)"
|
|
|
|
|
|
|
|
return 0
|
2015-08-31 17:11:41 +00:00
|
|
|
}
|
|
|
|
|
2007-03-17 13:31:13 +00:00
|
|
|
dhcp_calc() {
|
|
|
|
local ip="$1"
|
|
|
|
local res=0
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2007-03-17 13:31:13 +00:00
|
|
|
while [ -n "$ip" ]; do
|
|
|
|
part="${ip%%.*}"
|
|
|
|
res="$(($res * 256))"
|
|
|
|
res="$(($res + $part))"
|
|
|
|
[ "${ip%.*}" != "$ip" ] && ip="${ip#*.}" || ip=
|
|
|
|
done
|
|
|
|
echo "$res"
|
|
|
|
}
|
|
|
|
|
2013-12-21 13:31:28 +00:00
|
|
|
dhcp_check() {
|
|
|
|
local ifname="$1"
|
2016-10-12 08:33:16 +00:00
|
|
|
local stamp="${BASEDHCPSTAMPFILE_CFG}.${ifname}.dhcp"
|
2013-12-21 13:31:28 +00:00
|
|
|
local rv=0
|
|
|
|
|
|
|
|
[ -s "$stamp" ] && return $(cat "$stamp")
|
|
|
|
|
2020-08-18 13:09:22 +00:00
|
|
|
# If interface is down, skip it.
|
2016-07-29 12:26:55 +00:00
|
|
|
# The init script will be called again once the link is up
|
2020-08-18 13:09:22 +00:00
|
|
|
case "$(devstatus "$ifname" | jsonfilter -e @.up)" in
|
2016-07-29 12:26:55 +00:00
|
|
|
false) return 1;;
|
|
|
|
esac
|
|
|
|
|
2013-12-21 13:31:28 +00:00
|
|
|
udhcpc -n -q -s /bin/true -t 1 -i "$ifname" >&- && rv=1 || rv=0
|
|
|
|
|
|
|
|
echo $rv > "$stamp"
|
|
|
|
return $rv
|
|
|
|
}
|
|
|
|
|
|
|
|
log_once() {
|
|
|
|
pidof dnsmasq >/dev/null || \
|
|
|
|
logger -t dnsmasq "$@"
|
|
|
|
}
|
|
|
|
|
2017-06-09 14:24:12 +00:00
|
|
|
has_handler() {
|
|
|
|
local file
|
|
|
|
|
|
|
|
for file in /etc/hotplug.d/dhcp/* /etc/hotplug.d/tftp/* /etc/hotplug.d/neigh/*; do
|
|
|
|
[ -f "$file" ] && return 0
|
|
|
|
done
|
|
|
|
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
2007-08-29 18:40:52 +00:00
|
|
|
append_bool() {
|
|
|
|
local section="$1"
|
|
|
|
local option="$2"
|
|
|
|
local value="$3"
|
2017-02-24 10:08:30 +00:00
|
|
|
local default="$4"
|
2007-09-25 23:16:31 +00:00
|
|
|
local _loctmp
|
2017-02-24 10:08:30 +00:00
|
|
|
[ -z "$default" ] && default="0"
|
|
|
|
config_get_bool _loctmp "$section" "$option" "$default"
|
2012-04-02 22:31:21 +00:00
|
|
|
[ $_loctmp -gt 0 ] && xappend "$value"
|
2007-09-25 23:16:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
append_parm() {
|
|
|
|
local section="$1"
|
|
|
|
local option="$2"
|
|
|
|
local switch="$3"
|
2015-12-17 02:23:03 +00:00
|
|
|
local default="$4"
|
2007-09-25 23:16:31 +00:00
|
|
|
local _loctmp
|
2015-12-17 02:23:03 +00:00
|
|
|
config_get _loctmp "$section" "$option" "$default"
|
2007-09-25 23:16:31 +00:00
|
|
|
[ -z "$_loctmp" ] && return 0
|
2012-04-02 22:31:21 +00:00
|
|
|
xappend "$switch=$_loctmp"
|
2007-08-29 18:40:52 +00:00
|
|
|
}
|
|
|
|
|
2009-01-27 22:58:11 +00:00
|
|
|
append_server() {
|
2012-04-02 22:31:21 +00:00
|
|
|
xappend "--server=$1"
|
2009-01-27 22:58:11 +00:00
|
|
|
}
|
|
|
|
|
2017-06-28 15:07:39 +00:00
|
|
|
append_rev_server() {
|
2021-06-27 22:02:46 +00:00
|
|
|
xappend "--rev-server=$1"
|
2017-06-28 15:07:39 +00:00
|
|
|
}
|
|
|
|
|
2012-07-05 17:54:14 +00:00
|
|
|
append_address() {
|
|
|
|
xappend "--address=$1"
|
|
|
|
}
|
|
|
|
|
2021-09-09 05:43:31 +00:00
|
|
|
append_connmark_allowlist() {
|
|
|
|
xappend "--connmark-allowlist=$1"
|
|
|
|
}
|
|
|
|
|
2009-05-05 09:33:56 +00:00
|
|
|
append_interface() {
|
2017-07-10 08:53:29 +00:00
|
|
|
network_get_device ifname "$1" || ifname="$1"
|
2012-04-02 22:31:21 +00:00
|
|
|
xappend "--interface=$ifname"
|
2009-05-05 09:33:56 +00:00
|
|
|
}
|
|
|
|
|
2017-10-12 21:16:06 +00:00
|
|
|
append_listenaddress() {
|
|
|
|
xappend "--listen-address=$1"
|
|
|
|
}
|
|
|
|
|
2009-09-16 18:15:31 +00:00
|
|
|
append_notinterface() {
|
2017-07-10 08:53:29 +00:00
|
|
|
network_get_device ifname "$1" || ifname="$1"
|
2012-04-02 22:31:21 +00:00
|
|
|
xappend "--except-interface=$ifname"
|
2009-09-16 18:15:31 +00:00
|
|
|
}
|
|
|
|
|
2021-08-01 10:25:41 +00:00
|
|
|
ismounted() {
|
|
|
|
local filename="$1"
|
|
|
|
local dirname
|
|
|
|
for dirname in $EXTRA_MOUNT ; do
|
|
|
|
case "$filename" in
|
|
|
|
"${dirname}/"* | "${dirname}" )
|
2021-11-07 20:56:12 +00:00
|
|
|
return 0
|
2021-08-01 10:25:41 +00:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
2021-11-07 20:56:12 +00:00
|
|
|
return 1
|
2021-08-01 10:25:41 +00:00
|
|
|
}
|
|
|
|
|
2022-11-27 12:33:31 +00:00
|
|
|
append_extramount() {
|
2021-08-01 10:25:41 +00:00
|
|
|
ismounted "$1" || append EXTRA_MOUNT "$1"
|
2022-11-27 12:33:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
append_addnhosts() {
|
|
|
|
append_extramount "$1"
|
2012-04-02 22:31:21 +00:00
|
|
|
xappend "--addn-hosts=$1"
|
2009-11-22 11:52:08 +00:00
|
|
|
}
|
|
|
|
|
2010-08-11 10:37:33 +00:00
|
|
|
append_bogusnxdomain() {
|
2013-09-23 21:58:36 +00:00
|
|
|
xappend "--bogus-nxdomain=$1"
|
2010-08-11 10:37:33 +00:00
|
|
|
}
|
|
|
|
|
2015-03-13 08:39:08 +00:00
|
|
|
append_pxe_service() {
|
|
|
|
xappend "--pxe-service=$1"
|
|
|
|
}
|
|
|
|
|
2017-05-02 15:05:07 +00:00
|
|
|
append_interface_name() {
|
|
|
|
xappend "--interface-name=$1,$2"
|
|
|
|
}
|
|
|
|
|
2016-10-12 08:33:16 +00:00
|
|
|
filter_dnsmasq() {
|
|
|
|
local cfg="$1" func="$2" match_cfg="$3" found_cfg
|
2012-04-02 22:31:21 +00:00
|
|
|
|
2016-10-12 08:33:16 +00:00
|
|
|
# use entry when no instance entry set, or if it matches
|
|
|
|
config_get found_cfg "$cfg" "instance"
|
2020-03-01 02:31:45 +00:00
|
|
|
if [ -z "$found_cfg" ] || [ "$found_cfg" = "$match_cfg" ]; then
|
2016-10-12 08:33:16 +00:00
|
|
|
$func $cfg
|
2015-12-17 02:23:03 +00:00
|
|
|
fi
|
2007-08-29 18:40:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
dhcp_subscrid_add() {
|
|
|
|
local cfg="$1"
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2010-01-08 00:03:08 +00:00
|
|
|
config_get networkid "$cfg" networkid
|
|
|
|
[ -n "$networkid" ] || return 0
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2007-08-29 18:40:52 +00:00
|
|
|
config_get subscriberid "$cfg" subscriberid
|
|
|
|
[ -n "$subscriberid" ] || return 0
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2021-09-25 11:00:23 +00:00
|
|
|
xappend "--dhcp-subscrid=set:$networkid,$subscriberid"
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2012-05-19 20:17:56 +00:00
|
|
|
config_get_bool force "$cfg" force 0
|
|
|
|
|
|
|
|
dhcp_option_add "$cfg" "$networkid" "$force"
|
2007-08-29 18:40:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
dhcp_remoteid_add() {
|
|
|
|
local cfg="$1"
|
|
|
|
|
2010-01-08 00:03:08 +00:00
|
|
|
config_get networkid "$cfg" networkid
|
|
|
|
[ -n "$networkid" ] || return 0
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2007-08-29 18:40:52 +00:00
|
|
|
config_get remoteid "$cfg" remoteid
|
|
|
|
[ -n "$remoteid" ] || return 0
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2021-09-25 11:00:23 +00:00
|
|
|
xappend "--dhcp-remoteid=set:$networkid,$remoteid"
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2012-05-19 20:17:56 +00:00
|
|
|
config_get_bool force "$cfg" force 0
|
|
|
|
|
|
|
|
dhcp_option_add "$cfg" "$networkid" "$force"
|
2007-08-29 18:40:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
dhcp_circuitid_add() {
|
2016-12-22 18:20:25 +00:00
|
|
|
# TODO: DHCPV6 does not have circuitid; catch "option6:"
|
2007-08-29 18:40:52 +00:00
|
|
|
local cfg="$1"
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2010-01-08 00:03:08 +00:00
|
|
|
config_get networkid "$cfg" networkid
|
|
|
|
[ -n "$networkid" ] || return 0
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2007-08-29 18:40:52 +00:00
|
|
|
config_get circuitid "$cfg" circuitid
|
|
|
|
[ -n "$circuitid" ] || return 0
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2021-09-25 11:00:23 +00:00
|
|
|
xappend "--dhcp-circuitid=set:$networkid,$circuitid"
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2012-05-19 20:17:56 +00:00
|
|
|
config_get_bool force "$cfg" force 0
|
|
|
|
|
|
|
|
dhcp_option_add "$cfg" "$networkid" "$force"
|
2007-08-29 18:40:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
dhcp_userclass_add() {
|
|
|
|
local cfg="$1"
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2010-01-08 00:03:08 +00:00
|
|
|
config_get networkid "$cfg" networkid
|
|
|
|
[ -n "$networkid" ] || return 0
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2007-08-29 18:40:52 +00:00
|
|
|
config_get userclass "$cfg" userclass
|
|
|
|
[ -n "$userclass" ] || return 0
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2021-09-25 11:00:23 +00:00
|
|
|
xappend "--dhcp-userclass=set:$networkid,$userclass"
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2012-05-19 20:17:56 +00:00
|
|
|
config_get_bool force "$cfg" force 0
|
|
|
|
|
|
|
|
dhcp_option_add "$cfg" "$networkid" "$force"
|
2007-08-29 18:40:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
dhcp_vendorclass_add() {
|
2016-12-22 18:20:25 +00:00
|
|
|
# TODO: DHCPV6 vendor class has stricter definitions; catch? fixup?
|
2007-08-29 18:40:52 +00:00
|
|
|
local cfg="$1"
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2010-01-08 00:03:08 +00:00
|
|
|
config_get networkid "$cfg" networkid
|
|
|
|
[ -n "$networkid" ] || return 0
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2007-08-29 18:40:52 +00:00
|
|
|
config_get vendorclass "$cfg" vendorclass
|
|
|
|
[ -n "$vendorclass" ] || return 0
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2021-09-25 11:00:23 +00:00
|
|
|
xappend "--dhcp-vendorclass=set:$networkid,$vendorclass"
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2012-05-19 20:17:56 +00:00
|
|
|
config_get_bool force "$cfg" force 0
|
|
|
|
|
|
|
|
dhcp_option_add "$cfg" "$networkid" "$force"
|
2007-08-29 18:40:52 +00:00
|
|
|
}
|
|
|
|
|
2016-09-02 11:51:09 +00:00
|
|
|
dhcp_match_add() {
|
|
|
|
local cfg="$1"
|
|
|
|
|
|
|
|
config_get networkid "$cfg" networkid
|
|
|
|
[ -n "$networkid" ] || return 0
|
|
|
|
|
|
|
|
config_get match "$cfg" match
|
|
|
|
[ -n "$match" ] || return 0
|
|
|
|
|
2021-09-25 11:00:23 +00:00
|
|
|
xappend "--dhcp-match=set:$networkid,$match"
|
2016-09-02 11:51:09 +00:00
|
|
|
|
|
|
|
config_get_bool force "$cfg" force 0
|
|
|
|
|
|
|
|
dhcp_option_add "$cfg" "$networkid" "$force"
|
|
|
|
}
|
|
|
|
|
2007-08-29 18:40:52 +00:00
|
|
|
dhcp_host_add() {
|
|
|
|
local cfg="$1"
|
2021-09-23 07:28:45 +00:00
|
|
|
local hosttag nametime addrs duids macs tags mtags
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2012-05-19 20:17:56 +00:00
|
|
|
config_get_bool force "$cfg" force 0
|
|
|
|
|
2010-01-08 00:03:08 +00:00
|
|
|
config_get networkid "$cfg" networkid
|
2012-05-19 20:17:56 +00:00
|
|
|
[ -n "$networkid" ] && dhcp_option_add "$cfg" "$networkid" "$force"
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2016-04-17 12:52:54 +00:00
|
|
|
config_get_bool enable "$cfg" enable 1
|
|
|
|
[ "$enable" = "0" ] && return 0
|
|
|
|
|
2011-05-24 09:12:50 +00:00
|
|
|
config_get name "$cfg" name
|
2007-11-05 14:14:06 +00:00
|
|
|
config_get ip "$cfg" ip
|
2016-12-22 18:20:25 +00:00
|
|
|
config_get hostid "$cfg" hostid
|
|
|
|
|
2020-03-01 02:31:45 +00:00
|
|
|
[ -z "$ip" ] && [ -z "$name" ] && [ -z "$hostid" ] && return 0
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2014-08-28 06:27:53 +00:00
|
|
|
config_get_bool dns "$cfg" dns 0
|
2020-03-01 02:31:45 +00:00
|
|
|
[ "$dns" = "1" ] && [ -n "$ip" ] && [ -n "$name" ] && {
|
2017-12-07 09:11:50 +00:00
|
|
|
echo "$ip $name${DOMAIN:+.$DOMAIN}" >> $HOSTFILE_TMP
|
2014-08-28 06:27:53 +00:00
|
|
|
}
|
|
|
|
|
2010-03-08 23:28:55 +00:00
|
|
|
config_get mac "$cfg" mac
|
2016-12-22 18:20:25 +00:00
|
|
|
config_get duid "$cfg" duid
|
|
|
|
config_get tag "$cfg" tag
|
|
|
|
|
2021-09-23 07:28:45 +00:00
|
|
|
add_tag() {
|
|
|
|
mtags="${mtags}tag:$1,"
|
|
|
|
}
|
|
|
|
config_list_foreach "$cfg" match_tag add_tag
|
|
|
|
|
2014-08-28 06:27:57 +00:00
|
|
|
if [ -n "$mac" ]; then
|
|
|
|
# --dhcp-host=00:20:e0:3b:13:af,192.168.0.199,lap
|
2016-12-22 18:20:25 +00:00
|
|
|
# many MAC are possible to track a laptop ON/OFF dock
|
2014-08-28 06:27:57 +00:00
|
|
|
for m in $mac; do append macs "$m" ","; done
|
2016-12-22 18:20:25 +00:00
|
|
|
fi
|
|
|
|
|
2020-03-01 02:31:45 +00:00
|
|
|
if [ $DNSMASQ_DHCP_VER -eq 6 ] && [ -n "$duid" ]; then
|
2016-12-22 18:20:25 +00:00
|
|
|
# --dhcp-host=id:00:03:00:01:12:00:00:01:02:03,[::beef],lap
|
|
|
|
# one (virtual) machine gets one DUID per RFC3315
|
|
|
|
duids="id:${duid// */}"
|
|
|
|
fi
|
|
|
|
|
2020-03-01 02:31:45 +00:00
|
|
|
if [ -z "$macs" ] && [ -z "$duids" ]; then
|
2016-12-22 18:20:25 +00:00
|
|
|
# --dhcp-host=lap,192.168.0.199,[::beef]
|
2013-01-02 15:14:19 +00:00
|
|
|
[ -n "$name" ] || return 0
|
2014-08-28 06:27:57 +00:00
|
|
|
macs="$name"
|
2013-01-02 15:14:19 +00:00
|
|
|
name=""
|
2014-08-28 06:27:57 +00:00
|
|
|
fi
|
2010-03-08 23:28:55 +00:00
|
|
|
|
2016-12-22 18:20:25 +00:00
|
|
|
if [ -n "$hostid" ]; then
|
2017-08-25 12:21:48 +00:00
|
|
|
hex_to_hostid hostid "$hostid"
|
2015-08-31 17:11:41 +00:00
|
|
|
fi
|
|
|
|
|
2017-08-25 06:10:21 +00:00
|
|
|
if [ -n "$tag" ]; then
|
|
|
|
for t in $tag; do append tags "$t" ",set:"; done
|
|
|
|
fi
|
|
|
|
|
2013-10-11 18:33:15 +00:00
|
|
|
config_get_bool broadcast "$cfg" broadcast 0
|
2016-02-26 09:13:03 +00:00
|
|
|
config_get leasetime "$cfg" leasetime
|
|
|
|
|
2016-12-22 18:20:25 +00:00
|
|
|
[ "$broadcast" = "0" ] && broadcast= || broadcast=",set:needs-broadcast"
|
|
|
|
|
2017-08-25 06:10:21 +00:00
|
|
|
hosttag="${networkid:+,set:${networkid}}${tags:+,set:${tags}}$broadcast"
|
2016-12-22 18:20:25 +00:00
|
|
|
nametime="${name:+,$name}${leasetime:+,$leasetime}"
|
|
|
|
|
|
|
|
if [ $DNSMASQ_DHCP_VER -eq 6 ]; then
|
|
|
|
addrs="${ip:+,$ip}${hostid:+,[::$hostid]}"
|
2021-09-23 07:28:45 +00:00
|
|
|
xappend "--dhcp-host=$mtags$macs${duids:+,$duids}$hosttag$addrs$nametime"
|
2016-12-22 18:20:25 +00:00
|
|
|
else
|
2021-09-23 07:28:45 +00:00
|
|
|
xappend "--dhcp-host=$mtags$macs$hosttag${ip:+,$ip}$nametime"
|
2016-12-22 18:20:25 +00:00
|
|
|
fi
|
dnsmasq: add support for set: and tag: pairs
On my network, I have a variety of machines and appliances, some of which need different configuration issues than the default options.
For example:
config host
option name 'client'
option mac '00:01:02:03:04:05'
option ip '192.168.1.20'
option tag 'acme'
config tag acme
option force '1'
list dhcp_option 'option:router,192.168.1.253'
list dhcp_option 'option:domain-name,acme.com'
list dhcp_option 'option:domain-search,acme.com,redfish-solutions.com'
which allows me to override the default router for my client's host, as well as its domain-name, and its domain-search.
this causes the following config lines:
dhcp-host=00:01:02:03:04:05,set:acme,192.168.1.20,client
dhcp-option-force=tag:acme,option:router,192.168.1.253
dhcp-option-force=tag:acme,option:domain-name,acme.com
dhcp-option-force=tag:acme,option:domain-search:acme.com,redfish-solutions.com
This could be useful elsewhere, for instance, if you have an IP CCTV that you don't want to have a default-route, etc.
Signed-off-by: Philip Prindeville <philipp@redfish-solutions.com>
SVN-Revision: 31815
2012-05-19 20:17:54 +00:00
|
|
|
}
|
|
|
|
|
dnsmasq: expand 'add_local_hostname' fexibility including FQDN
ref commit 612e2276b4a2f57fcbbe79b95bec4a46e89d748c
ref commit ec63e3bf1312ab4c666f7417ca9844857214047f
'option add_local_hostname' scripted implementation statically assigns
this host in auto generated host file at init. If IFUP or other signals
do not occur, then address changes are not tracked. The script doesn't
apply all the addresses at an interface. This may make logs obscure.
The script only puts the bare host name (maybe not FQDN) in host file,
but if '--exapandhosts' is enabled, then /etc/hosts entries will be
suffixed, and "127.0.0.1 localhost" becomes "localhost.lan".
dnsmasq provides an option to perform this function, but it is rather
greedy. '--interface-name=<name>,<iface>' will assign the name to all
IP on the specified interface (except link local). This is a useful
feature, but some setups depend on the original restrictive behavior.
'option add_local_fqdn' is added to enhance the feature set, but
if not entered or empty string, then it will default to original
option and behavior. This new option has a few settings. At each
increased setting the most detailed name becomes the PTR record:
0 - same as add_local_hostname 0 or disabled
1 - same as add_local_hostname 1
2 - assigns the bare host name to all IP w/ --dnsmasq-interface
3 - assigns the FQDN and host to all IP w/ --dnsmasq-interface
4 - assigns <iface>.<host>.<domain> and above w/ --dnsmasq-nterface
'option add_wan_fqdn' is added to run the same procedure on
inferred WAN intefaces. If an interface has 'config dhcp' and
'option ignore 1' set, then it is considered WAN. The original
option would only run on DHCP serving interfaces.
Signed-off-by: Eric Luehrsen <ericluehrsen@hotmail.com>
2017-01-14 02:37:25 +00:00
|
|
|
dhcp_this_host_add() {
|
|
|
|
local net="$1"
|
|
|
|
local ifname="$2"
|
|
|
|
local mode="$3"
|
|
|
|
local routerstub routername ifdashname
|
|
|
|
local lanaddr lanaddr6 lanaddrs6 ulaprefix
|
|
|
|
|
|
|
|
if [ "$mode" -gt 0 ] ; then
|
|
|
|
ifdashname="${ifname//./-}"
|
|
|
|
routerstub="$( md5sum /etc/os-release )"
|
|
|
|
routerstub="router-${routerstub// */}"
|
|
|
|
routername="$( uci_get system @system[0] hostname $routerstub )"
|
|
|
|
|
|
|
|
if [ "$mode" -gt 1 ] ; then
|
|
|
|
if [ "$mode" -gt 2 ] ; then
|
|
|
|
if [ "$mode" -gt 3 ] ; then
|
2017-05-08 20:38:58 +00:00
|
|
|
append_interface_name "$ifdashname.$routername.$DOMAIN" "$ifname"
|
dnsmasq: expand 'add_local_hostname' fexibility including FQDN
ref commit 612e2276b4a2f57fcbbe79b95bec4a46e89d748c
ref commit ec63e3bf1312ab4c666f7417ca9844857214047f
'option add_local_hostname' scripted implementation statically assigns
this host in auto generated host file at init. If IFUP or other signals
do not occur, then address changes are not tracked. The script doesn't
apply all the addresses at an interface. This may make logs obscure.
The script only puts the bare host name (maybe not FQDN) in host file,
but if '--exapandhosts' is enabled, then /etc/hosts entries will be
suffixed, and "127.0.0.1 localhost" becomes "localhost.lan".
dnsmasq provides an option to perform this function, but it is rather
greedy. '--interface-name=<name>,<iface>' will assign the name to all
IP on the specified interface (except link local). This is a useful
feature, but some setups depend on the original restrictive behavior.
'option add_local_fqdn' is added to enhance the feature set, but
if not entered or empty string, then it will default to original
option and behavior. This new option has a few settings. At each
increased setting the most detailed name becomes the PTR record:
0 - same as add_local_hostname 0 or disabled
1 - same as add_local_hostname 1
2 - assigns the bare host name to all IP w/ --dnsmasq-interface
3 - assigns the FQDN and host to all IP w/ --dnsmasq-interface
4 - assigns <iface>.<host>.<domain> and above w/ --dnsmasq-nterface
'option add_wan_fqdn' is added to run the same procedure on
inferred WAN intefaces. If an interface has 'config dhcp' and
'option ignore 1' set, then it is considered WAN. The original
option would only run on DHCP serving interfaces.
Signed-off-by: Eric Luehrsen <ericluehrsen@hotmail.com>
2017-01-14 02:37:25 +00:00
|
|
|
fi
|
|
|
|
|
2017-05-08 20:38:58 +00:00
|
|
|
append_interface_name "$routername.$DOMAIN" "$ifname"
|
dnsmasq: expand 'add_local_hostname' fexibility including FQDN
ref commit 612e2276b4a2f57fcbbe79b95bec4a46e89d748c
ref commit ec63e3bf1312ab4c666f7417ca9844857214047f
'option add_local_hostname' scripted implementation statically assigns
this host in auto generated host file at init. If IFUP or other signals
do not occur, then address changes are not tracked. The script doesn't
apply all the addresses at an interface. This may make logs obscure.
The script only puts the bare host name (maybe not FQDN) in host file,
but if '--exapandhosts' is enabled, then /etc/hosts entries will be
suffixed, and "127.0.0.1 localhost" becomes "localhost.lan".
dnsmasq provides an option to perform this function, but it is rather
greedy. '--interface-name=<name>,<iface>' will assign the name to all
IP on the specified interface (except link local). This is a useful
feature, but some setups depend on the original restrictive behavior.
'option add_local_fqdn' is added to enhance the feature set, but
if not entered or empty string, then it will default to original
option and behavior. This new option has a few settings. At each
increased setting the most detailed name becomes the PTR record:
0 - same as add_local_hostname 0 or disabled
1 - same as add_local_hostname 1
2 - assigns the bare host name to all IP w/ --dnsmasq-interface
3 - assigns the FQDN and host to all IP w/ --dnsmasq-interface
4 - assigns <iface>.<host>.<domain> and above w/ --dnsmasq-nterface
'option add_wan_fqdn' is added to run the same procedure on
inferred WAN intefaces. If an interface has 'config dhcp' and
'option ignore 1' set, then it is considered WAN. The original
option would only run on DHCP serving interfaces.
Signed-off-by: Eric Luehrsen <ericluehrsen@hotmail.com>
2017-01-14 02:37:25 +00:00
|
|
|
fi
|
|
|
|
|
|
|
|
# All IP addresses discovered by dnsmasq will be labeled (except fe80::)
|
2017-05-08 20:38:58 +00:00
|
|
|
append_interface_name "$routername" "$ifname"
|
dnsmasq: expand 'add_local_hostname' fexibility including FQDN
ref commit 612e2276b4a2f57fcbbe79b95bec4a46e89d748c
ref commit ec63e3bf1312ab4c666f7417ca9844857214047f
'option add_local_hostname' scripted implementation statically assigns
this host in auto generated host file at init. If IFUP or other signals
do not occur, then address changes are not tracked. The script doesn't
apply all the addresses at an interface. This may make logs obscure.
The script only puts the bare host name (maybe not FQDN) in host file,
but if '--exapandhosts' is enabled, then /etc/hosts entries will be
suffixed, and "127.0.0.1 localhost" becomes "localhost.lan".
dnsmasq provides an option to perform this function, but it is rather
greedy. '--interface-name=<name>,<iface>' will assign the name to all
IP on the specified interface (except link local). This is a useful
feature, but some setups depend on the original restrictive behavior.
'option add_local_fqdn' is added to enhance the feature set, but
if not entered or empty string, then it will default to original
option and behavior. This new option has a few settings. At each
increased setting the most detailed name becomes the PTR record:
0 - same as add_local_hostname 0 or disabled
1 - same as add_local_hostname 1
2 - assigns the bare host name to all IP w/ --dnsmasq-interface
3 - assigns the FQDN and host to all IP w/ --dnsmasq-interface
4 - assigns <iface>.<host>.<domain> and above w/ --dnsmasq-nterface
'option add_wan_fqdn' is added to run the same procedure on
inferred WAN intefaces. If an interface has 'config dhcp' and
'option ignore 1' set, then it is considered WAN. The original
option would only run on DHCP serving interfaces.
Signed-off-by: Eric Luehrsen <ericluehrsen@hotmail.com>
2017-01-14 02:37:25 +00:00
|
|
|
|
|
|
|
else
|
|
|
|
# This uses a static host file entry for only limited addresses.
|
|
|
|
# Use dnsmasq option "--expandhosts" to enable FQDN on host files.
|
|
|
|
ulaprefix="$(uci_get network @globals[0] ula_prefix)"
|
|
|
|
network_get_ipaddr lanaddr "$net"
|
|
|
|
network_get_ipaddrs6 lanaddrs6 "$net"
|
|
|
|
|
|
|
|
if [ -n "$lanaddr" ] ; then
|
|
|
|
dhcp_domain_add "" "$routername" "$lanaddr"
|
|
|
|
fi
|
|
|
|
|
2020-03-01 02:31:45 +00:00
|
|
|
if [ -n "$ulaprefix" ] && [ -n "$lanaddrs6" ] ; then
|
dnsmasq: expand 'add_local_hostname' fexibility including FQDN
ref commit 612e2276b4a2f57fcbbe79b95bec4a46e89d748c
ref commit ec63e3bf1312ab4c666f7417ca9844857214047f
'option add_local_hostname' scripted implementation statically assigns
this host in auto generated host file at init. If IFUP or other signals
do not occur, then address changes are not tracked. The script doesn't
apply all the addresses at an interface. This may make logs obscure.
The script only puts the bare host name (maybe not FQDN) in host file,
but if '--exapandhosts' is enabled, then /etc/hosts entries will be
suffixed, and "127.0.0.1 localhost" becomes "localhost.lan".
dnsmasq provides an option to perform this function, but it is rather
greedy. '--interface-name=<name>,<iface>' will assign the name to all
IP on the specified interface (except link local). This is a useful
feature, but some setups depend on the original restrictive behavior.
'option add_local_fqdn' is added to enhance the feature set, but
if not entered or empty string, then it will default to original
option and behavior. This new option has a few settings. At each
increased setting the most detailed name becomes the PTR record:
0 - same as add_local_hostname 0 or disabled
1 - same as add_local_hostname 1
2 - assigns the bare host name to all IP w/ --dnsmasq-interface
3 - assigns the FQDN and host to all IP w/ --dnsmasq-interface
4 - assigns <iface>.<host>.<domain> and above w/ --dnsmasq-nterface
'option add_wan_fqdn' is added to run the same procedure on
inferred WAN intefaces. If an interface has 'config dhcp' and
'option ignore 1' set, then it is considered WAN. The original
option would only run on DHCP serving interfaces.
Signed-off-by: Eric Luehrsen <ericluehrsen@hotmail.com>
2017-01-14 02:37:25 +00:00
|
|
|
for lanaddr6 in $lanaddrs6 ; do
|
|
|
|
case "$lanaddr6" in
|
|
|
|
"${ulaprefix%%:/*}"*)
|
2017-08-25 12:21:48 +00:00
|
|
|
dhcp_domain_add "" "$routername" "$lanaddr6"
|
|
|
|
;;
|
dnsmasq: expand 'add_local_hostname' fexibility including FQDN
ref commit 612e2276b4a2f57fcbbe79b95bec4a46e89d748c
ref commit ec63e3bf1312ab4c666f7417ca9844857214047f
'option add_local_hostname' scripted implementation statically assigns
this host in auto generated host file at init. If IFUP or other signals
do not occur, then address changes are not tracked. The script doesn't
apply all the addresses at an interface. This may make logs obscure.
The script only puts the bare host name (maybe not FQDN) in host file,
but if '--exapandhosts' is enabled, then /etc/hosts entries will be
suffixed, and "127.0.0.1 localhost" becomes "localhost.lan".
dnsmasq provides an option to perform this function, but it is rather
greedy. '--interface-name=<name>,<iface>' will assign the name to all
IP on the specified interface (except link local). This is a useful
feature, but some setups depend on the original restrictive behavior.
'option add_local_fqdn' is added to enhance the feature set, but
if not entered or empty string, then it will default to original
option and behavior. This new option has a few settings. At each
increased setting the most detailed name becomes the PTR record:
0 - same as add_local_hostname 0 or disabled
1 - same as add_local_hostname 1
2 - assigns the bare host name to all IP w/ --dnsmasq-interface
3 - assigns the FQDN and host to all IP w/ --dnsmasq-interface
4 - assigns <iface>.<host>.<domain> and above w/ --dnsmasq-nterface
'option add_wan_fqdn' is added to run the same procedure on
inferred WAN intefaces. If an interface has 'config dhcp' and
'option ignore 1' set, then it is considered WAN. The original
option would only run on DHCP serving interfaces.
Signed-off-by: Eric Luehrsen <ericluehrsen@hotmail.com>
2017-01-14 02:37:25 +00:00
|
|
|
esac
|
|
|
|
done
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
dnsmasq: add support for set: and tag: pairs
On my network, I have a variety of machines and appliances, some of which need different configuration issues than the default options.
For example:
config host
option name 'client'
option mac '00:01:02:03:04:05'
option ip '192.168.1.20'
option tag 'acme'
config tag acme
option force '1'
list dhcp_option 'option:router,192.168.1.253'
list dhcp_option 'option:domain-name,acme.com'
list dhcp_option 'option:domain-search,acme.com,redfish-solutions.com'
which allows me to override the default router for my client's host, as well as its domain-name, and its domain-search.
this causes the following config lines:
dhcp-host=00:01:02:03:04:05,set:acme,192.168.1.20,client
dhcp-option-force=tag:acme,option:router,192.168.1.253
dhcp-option-force=tag:acme,option:domain-name,acme.com
dhcp-option-force=tag:acme,option:domain-search:acme.com,redfish-solutions.com
This could be useful elsewhere, for instance, if you have an IP CCTV that you don't want to have a default-route, etc.
Signed-off-by: Philip Prindeville <philipp@redfish-solutions.com>
SVN-Revision: 31815
2012-05-19 20:17:54 +00:00
|
|
|
dhcp_tag_add() {
|
2016-12-22 18:20:25 +00:00
|
|
|
# NOTE: dnsmasq has explicit "option6:" prefix for DHCPv6 so no collisions
|
dnsmasq: add support for set: and tag: pairs
On my network, I have a variety of machines and appliances, some of which need different configuration issues than the default options.
For example:
config host
option name 'client'
option mac '00:01:02:03:04:05'
option ip '192.168.1.20'
option tag 'acme'
config tag acme
option force '1'
list dhcp_option 'option:router,192.168.1.253'
list dhcp_option 'option:domain-name,acme.com'
list dhcp_option 'option:domain-search,acme.com,redfish-solutions.com'
which allows me to override the default router for my client's host, as well as its domain-name, and its domain-search.
this causes the following config lines:
dhcp-host=00:01:02:03:04:05,set:acme,192.168.1.20,client
dhcp-option-force=tag:acme,option:router,192.168.1.253
dhcp-option-force=tag:acme,option:domain-name,acme.com
dhcp-option-force=tag:acme,option:domain-search:acme.com,redfish-solutions.com
This could be useful elsewhere, for instance, if you have an IP CCTV that you don't want to have a default-route, etc.
Signed-off-by: Philip Prindeville <philipp@redfish-solutions.com>
SVN-Revision: 31815
2012-05-19 20:17:54 +00:00
|
|
|
local cfg="$1"
|
|
|
|
|
|
|
|
tag="$cfg"
|
|
|
|
|
|
|
|
[ -n "$tag" ] || return 0
|
|
|
|
|
|
|
|
config_get_bool force "$cfg" force 0
|
|
|
|
[ "$force" = "0" ] && force=
|
|
|
|
|
|
|
|
config_get option "$cfg" dhcp_option
|
|
|
|
for o in $option; do
|
|
|
|
xappend "--dhcp-option${force:+-force}=tag:$tag,$o"
|
|
|
|
done
|
2007-08-29 18:40:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
dhcp_mac_add() {
|
2007-03-17 13:31:13 +00:00
|
|
|
local cfg="$1"
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2010-01-08 00:03:08 +00:00
|
|
|
config_get networkid "$cfg" networkid
|
|
|
|
[ -n "$networkid" ] || return 0
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2007-08-29 18:40:52 +00:00
|
|
|
config_get mac "$cfg" mac
|
|
|
|
[ -n "$mac" ] || return 0
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2012-04-02 22:31:21 +00:00
|
|
|
xappend "--dhcp-mac=$networkid,$mac"
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2010-01-08 00:03:08 +00:00
|
|
|
dhcp_option_add "$cfg" "$networkid"
|
2007-08-29 18:40:52 +00:00
|
|
|
}
|
2007-03-17 13:31:13 +00:00
|
|
|
|
2008-07-05 13:43:55 +00:00
|
|
|
dhcp_boot_add() {
|
2016-12-22 18:20:25 +00:00
|
|
|
# TODO: BOOTURL is different between DHCPv4 and DHCPv6
|
2008-07-05 13:43:55 +00:00
|
|
|
local cfg="$1"
|
|
|
|
|
2010-01-08 00:03:08 +00:00
|
|
|
config_get networkid "$cfg" networkid
|
2008-07-05 13:43:55 +00:00
|
|
|
|
|
|
|
config_get filename "$cfg" filename
|
|
|
|
[ -n "$filename" ] || return 0
|
|
|
|
|
|
|
|
config_get servername "$cfg" servername
|
|
|
|
config_get serveraddress "$cfg" serveraddress
|
|
|
|
|
2020-03-01 02:31:45 +00:00
|
|
|
[ -n "$serveraddress" ] && [ ! -n "$servername" ] && return 0
|
2015-03-13 08:38:35 +00:00
|
|
|
|
2024-02-22 17:01:04 +00:00
|
|
|
xappend "--dhcp-boot=${networkid:+tag:$networkid,}${filename}${servername:+,$servername}${serveraddress:+,$serveraddress}"
|
2008-07-05 13:43:55 +00:00
|
|
|
|
2012-05-19 20:17:56 +00:00
|
|
|
config_get_bool force "$cfg" force 0
|
|
|
|
|
|
|
|
dhcp_option_add "$cfg" "$networkid" "$force"
|
2008-07-05 13:43:55 +00:00
|
|
|
}
|
|
|
|
|
2007-08-29 18:40:52 +00:00
|
|
|
dhcp_add() {
|
|
|
|
local cfg="$1"
|
2016-12-22 18:20:25 +00:00
|
|
|
local dhcp6range="::"
|
|
|
|
local nettag
|
2017-06-20 09:45:49 +00:00
|
|
|
local tags
|
2016-12-22 18:20:25 +00:00
|
|
|
|
2007-03-17 13:31:13 +00:00
|
|
|
config_get net "$cfg" interface
|
|
|
|
[ -n "$net" ] || return 0
|
2007-08-29 18:40:52 +00:00
|
|
|
|
2010-01-08 00:03:08 +00:00
|
|
|
config_get networkid "$cfg" networkid
|
|
|
|
[ -n "$networkid" ] || networkid="$net"
|
2007-08-29 18:40:52 +00:00
|
|
|
|
2013-12-16 16:47:41 +00:00
|
|
|
network_get_device ifname "$net" || return 0
|
2007-08-29 18:40:52 +00:00
|
|
|
|
2013-12-16 16:47:41 +00:00
|
|
|
[ "$cachelocal" = "0" ] && network_get_dnsserver dnsserver "$net" && {
|
2007-09-10 20:24:18 +00:00
|
|
|
DNS_SERVERS="$DNS_SERVERS $dnsserver"
|
|
|
|
}
|
|
|
|
|
dnsmasq: expand 'add_local_hostname' fexibility including FQDN
ref commit 612e2276b4a2f57fcbbe79b95bec4a46e89d748c
ref commit ec63e3bf1312ab4c666f7417ca9844857214047f
'option add_local_hostname' scripted implementation statically assigns
this host in auto generated host file at init. If IFUP or other signals
do not occur, then address changes are not tracked. The script doesn't
apply all the addresses at an interface. This may make logs obscure.
The script only puts the bare host name (maybe not FQDN) in host file,
but if '--exapandhosts' is enabled, then /etc/hosts entries will be
suffixed, and "127.0.0.1 localhost" becomes "localhost.lan".
dnsmasq provides an option to perform this function, but it is rather
greedy. '--interface-name=<name>,<iface>' will assign the name to all
IP on the specified interface (except link local). This is a useful
feature, but some setups depend on the original restrictive behavior.
'option add_local_fqdn' is added to enhance the feature set, but
if not entered or empty string, then it will default to original
option and behavior. This new option has a few settings. At each
increased setting the most detailed name becomes the PTR record:
0 - same as add_local_hostname 0 or disabled
1 - same as add_local_hostname 1
2 - assigns the bare host name to all IP w/ --dnsmasq-interface
3 - assigns the FQDN and host to all IP w/ --dnsmasq-interface
4 - assigns <iface>.<host>.<domain> and above w/ --dnsmasq-nterface
'option add_wan_fqdn' is added to run the same procedure on
inferred WAN intefaces. If an interface has 'config dhcp' and
'option ignore 1' set, then it is considered WAN. The original
option would only run on DHCP serving interfaces.
Signed-off-by: Eric Luehrsen <ericluehrsen@hotmail.com>
2017-01-14 02:37:25 +00:00
|
|
|
append_bool "$cfg" ignore "--no-dhcp-interface=$ifname" && {
|
|
|
|
# Many ISP do not have useful names for DHCP customers (your WAN).
|
|
|
|
dhcp_this_host_add "$net" "$ifname" "$ADD_WAN_FQDN"
|
|
|
|
return 0
|
|
|
|
}
|
2007-08-29 18:40:52 +00:00
|
|
|
|
2017-09-14 12:49:10 +00:00
|
|
|
network_get_subnet subnet "$net" || return 0
|
|
|
|
network_get_protocol proto "$net" || return 0
|
|
|
|
|
2013-12-16 16:47:41 +00:00
|
|
|
# Do not support non-static interfaces for now
|
2007-03-17 13:31:13 +00:00
|
|
|
[ static = "$proto" ] || return 0
|
2007-08-29 18:40:52 +00:00
|
|
|
|
2023-11-05 19:23:29 +00:00
|
|
|
ipaddr="${subnet%%/*}"
|
|
|
|
prefix_or_netmask="${subnet##*/}"
|
|
|
|
|
2013-12-16 16:47:41 +00:00
|
|
|
# Override interface netmask with dhcp config if applicable
|
2023-11-05 19:23:29 +00:00
|
|
|
config_get netmask "$cfg" netmask
|
|
|
|
|
|
|
|
[ -n "$netmask" ] && prefix_or_netmask="$netmask"
|
2007-03-17 13:31:13 +00:00
|
|
|
|
2007-08-29 18:40:52 +00:00
|
|
|
#check for an already active dhcp server on the interface, unless 'force' is set
|
2007-03-17 13:31:13 +00:00
|
|
|
config_get_bool force "$cfg" force 0
|
2020-04-28 15:00:58 +00:00
|
|
|
[ $force -gt 0 ] || dhcp_check "$ifname" || {
|
|
|
|
logger -t dnsmasq \
|
|
|
|
"found already running DHCP-server on interface '$ifname'" \
|
|
|
|
"refusing to start, use 'option force 1' to override"
|
|
|
|
return 0
|
|
|
|
}
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2016-12-22 18:20:25 +00:00
|
|
|
config_get start "$cfg" start 100
|
|
|
|
config_get limit "$cfg" limit 150
|
|
|
|
config_get leasetime "$cfg" leasetime 12h
|
2007-03-31 00:39:55 +00:00
|
|
|
config_get options "$cfg" options
|
2007-11-28 03:02:20 +00:00
|
|
|
config_get_bool dynamicdhcp "$cfg" dynamicdhcp 1
|
2023-03-10 06:32:34 +00:00
|
|
|
config_get_bool dynamicdhcpv4 "$cfg" dynamicdhcpv4 $dynamicdhcp
|
|
|
|
config_get_bool dynamicdhcpv6 "$cfg" dynamicdhcpv6 $dynamicdhcp
|
2007-03-17 13:31:13 +00:00
|
|
|
|
2016-12-22 18:20:25 +00:00
|
|
|
config_get dhcpv4 "$cfg" dhcpv4
|
|
|
|
config_get dhcpv6 "$cfg" dhcpv6
|
|
|
|
|
|
|
|
config_get ra "$cfg" ra
|
|
|
|
config_get ra_management "$cfg" ra_management
|
|
|
|
config_get ra_preference "$cfg" ra_preference
|
2017-05-12 09:26:49 +00:00
|
|
|
config_get dns "$cfg" dns
|
2023-10-20 04:27:46 +00:00
|
|
|
config_get dns_sl "$cfg" domain
|
2016-12-22 18:20:25 +00:00
|
|
|
|
2017-05-02 15:05:07 +00:00
|
|
|
config_list_foreach "$cfg" "interface_name" append_interface_name "$ifname"
|
|
|
|
|
dnsmasq: expand 'add_local_hostname' fexibility including FQDN
ref commit 612e2276b4a2f57fcbbe79b95bec4a46e89d748c
ref commit ec63e3bf1312ab4c666f7417ca9844857214047f
'option add_local_hostname' scripted implementation statically assigns
this host in auto generated host file at init. If IFUP or other signals
do not occur, then address changes are not tracked. The script doesn't
apply all the addresses at an interface. This may make logs obscure.
The script only puts the bare host name (maybe not FQDN) in host file,
but if '--exapandhosts' is enabled, then /etc/hosts entries will be
suffixed, and "127.0.0.1 localhost" becomes "localhost.lan".
dnsmasq provides an option to perform this function, but it is rather
greedy. '--interface-name=<name>,<iface>' will assign the name to all
IP on the specified interface (except link local). This is a useful
feature, but some setups depend on the original restrictive behavior.
'option add_local_fqdn' is added to enhance the feature set, but
if not entered or empty string, then it will default to original
option and behavior. This new option has a few settings. At each
increased setting the most detailed name becomes the PTR record:
0 - same as add_local_hostname 0 or disabled
1 - same as add_local_hostname 1
2 - assigns the bare host name to all IP w/ --dnsmasq-interface
3 - assigns the FQDN and host to all IP w/ --dnsmasq-interface
4 - assigns <iface>.<host>.<domain> and above w/ --dnsmasq-nterface
'option add_wan_fqdn' is added to run the same procedure on
inferred WAN intefaces. If an interface has 'config dhcp' and
'option ignore 1' set, then it is considered WAN. The original
option would only run on DHCP serving interfaces.
Signed-off-by: Eric Luehrsen <ericluehrsen@hotmail.com>
2017-01-14 02:37:25 +00:00
|
|
|
# Put the router host name on this DHCP served interface address(es)
|
|
|
|
dhcp_this_host_add "$net" "$ifname" "$ADD_LOCAL_FQDN"
|
|
|
|
|
2016-12-22 18:20:25 +00:00
|
|
|
start="$( dhcp_calc "$start" )"
|
2017-06-20 09:45:49 +00:00
|
|
|
|
|
|
|
add_tag() {
|
|
|
|
tags="${tags}tag:$1,"
|
|
|
|
}
|
|
|
|
config_list_foreach "$cfg" tag add_tag
|
|
|
|
|
2016-12-22 18:20:25 +00:00
|
|
|
nettag="${networkid:+set:${networkid},}"
|
|
|
|
|
2022-05-08 21:29:06 +00:00
|
|
|
# make sure the DHCP range is not empty
|
2023-11-05 19:23:29 +00:00
|
|
|
if [ "$dhcpv4" != "disabled" ] && ipcalc "$ipaddr/$prefix_or_netmask" "$start" "$limit" ; then
|
2023-03-10 06:32:34 +00:00
|
|
|
[ "$dynamicdhcpv4" = "0" ] && END="static"
|
2022-05-08 21:29:06 +00:00
|
|
|
|
|
|
|
xappend "--dhcp-range=$tags$nettag$START,$END,$NETMASK,$leasetime${options:+ $options}"
|
|
|
|
fi
|
2016-12-22 18:20:25 +00:00
|
|
|
|
2023-03-10 06:32:34 +00:00
|
|
|
if [ "$dynamicdhcpv6" = "0" ] ; then
|
2016-12-22 18:20:25 +00:00
|
|
|
dhcp6range="::,static"
|
|
|
|
else
|
|
|
|
dhcp6range="::1000,::ffff"
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
2020-03-01 02:31:45 +00:00
|
|
|
if [ $DNSMASQ_DHCP_VER -eq 6 ] && [ "$ra" = "server" ] ; then
|
2016-12-22 18:20:25 +00:00
|
|
|
# Note: dnsmasq cannot just be a DHCPv6 server (all-in-1)
|
|
|
|
# and let some other machine(s) send RA pointing to it.
|
|
|
|
|
|
|
|
case $ra_preference in
|
|
|
|
*high*)
|
|
|
|
xappend "--ra-param=$ifname,high,0,7200"
|
|
|
|
;;
|
|
|
|
*low*)
|
|
|
|
xappend "--ra-param=$ifname,low,0,7200"
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
# Send UNSOLICITED RA at default interval and live for 2 hours.
|
|
|
|
# TODO: convert flexible lease time into route life time (only seconds).
|
|
|
|
xappend "--ra-param=$ifname,0,7200"
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
if [ "$dhcpv6" = "disabled" ] ; then
|
|
|
|
ra_management="3"
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
case $ra_management in
|
|
|
|
0)
|
|
|
|
# SLACC with DCHP for extended options
|
|
|
|
xappend "--dhcp-range=$nettag::,constructor:$ifname,ra-stateless,ra-names"
|
|
|
|
;;
|
|
|
|
2)
|
|
|
|
# DHCP address and RA only for management redirection
|
|
|
|
xappend "--dhcp-range=$nettag$dhcp6range,constructor:$ifname,$leasetime"
|
|
|
|
;;
|
|
|
|
3)
|
|
|
|
# SLAAC only but dnsmasq attempts to link HOSTNAME, DHCPv4 MAC, and SLAAC
|
|
|
|
xappend "--dhcp-range=$nettag::,constructor:$ifname,ra-only,ra-names"
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
# SLAAC and full DHCP
|
|
|
|
xappend "--dhcp-range=$nettag$dhcp6range,constructor:$ifname,slaac,ra-names,$leasetime"
|
|
|
|
;;
|
|
|
|
esac
|
2017-05-12 09:26:49 +00:00
|
|
|
|
|
|
|
if [ -n "$dns" ]; then
|
|
|
|
dnss=""
|
|
|
|
for d in $dns; do append dnss "[$d]" ","; done
|
|
|
|
else
|
|
|
|
dnss="[::]"
|
|
|
|
fi
|
|
|
|
|
|
|
|
dhcp_option_append "option6:dns-server,$dnss" "$networkid"
|
2023-10-20 04:27:46 +00:00
|
|
|
|
|
|
|
if [ -n "$dns_sl" ]; then
|
|
|
|
ddssl=""
|
|
|
|
for dd in $dns_sl; do append ddssl "$dd" ","; done
|
|
|
|
fi
|
|
|
|
|
|
|
|
dhcp_option_append "option6:domain-search,$ddssl" "$networkid"
|
2016-12-22 18:20:25 +00:00
|
|
|
fi
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2017-06-21 14:48:41 +00:00
|
|
|
dhcp_option_add "$cfg" "$networkid" 0
|
|
|
|
dhcp_option_add "$cfg" "$networkid" 2
|
2007-08-29 18:40:52 +00:00
|
|
|
}
|
|
|
|
|
2017-04-26 20:37:27 +00:00
|
|
|
dhcp_option_append() {
|
|
|
|
local option="$1"
|
|
|
|
local networkid="$2"
|
|
|
|
local force="$3"
|
|
|
|
|
|
|
|
xappend "--dhcp-option${force:+-force}=${networkid:+$networkid,}$option"
|
|
|
|
}
|
|
|
|
|
2007-09-25 23:16:31 +00:00
|
|
|
dhcp_option_add() {
|
2016-12-22 18:20:25 +00:00
|
|
|
# NOTE: dnsmasq has explicit "option6:" prefix for DHCPv6 so no collisions
|
2007-08-29 18:40:52 +00:00
|
|
|
local cfg="$1"
|
2010-01-08 00:03:08 +00:00
|
|
|
local networkid="$2"
|
2012-05-19 20:17:56 +00:00
|
|
|
local force="$3"
|
2017-06-21 14:48:41 +00:00
|
|
|
local opt="dhcp_option"
|
2012-05-19 20:17:56 +00:00
|
|
|
|
|
|
|
[ "$force" = "0" ] && force=
|
2017-06-21 14:48:41 +00:00
|
|
|
[ "$force" = "2" ] && opt="dhcp_option_force"
|
2007-09-25 23:16:31 +00:00
|
|
|
|
2017-04-26 20:37:27 +00:00
|
|
|
local list_len
|
2017-06-21 14:48:41 +00:00
|
|
|
config_get list_len "$cfg" "${opt}_LENGTH"
|
2017-04-26 20:37:27 +00:00
|
|
|
|
|
|
|
if [ -n "$list_len" ]; then
|
2017-06-21 14:48:41 +00:00
|
|
|
config_list_foreach "$cfg" "$opt" dhcp_option_append "$networkid" "$force"
|
2017-04-26 20:37:27 +00:00
|
|
|
else
|
2017-06-21 14:48:41 +00:00
|
|
|
config_get dhcp_option "$cfg" "$opt"
|
2007-08-29 18:40:52 +00:00
|
|
|
|
2017-06-21 14:48:41 +00:00
|
|
|
[ -n "$dhcp_option" ] && echo "Warning: the 'option $opt' syntax is deprecated, use 'list $opt'" >&2
|
2017-05-04 20:33:37 +00:00
|
|
|
|
2017-04-26 20:37:27 +00:00
|
|
|
local option
|
|
|
|
for option in $dhcp_option; do
|
|
|
|
dhcp_option_append "$option" "$networkid" "$force"
|
|
|
|
done
|
|
|
|
fi
|
2007-03-17 13:31:13 +00:00
|
|
|
}
|
|
|
|
|
2009-10-05 16:58:06 +00:00
|
|
|
dhcp_domain_add() {
|
|
|
|
local cfg="$1"
|
2013-06-17 11:55:30 +00:00
|
|
|
local ip name names record
|
2009-10-05 16:58:06 +00:00
|
|
|
|
2011-12-01 21:34:45 +00:00
|
|
|
config_get names "$cfg" name "$2"
|
2010-04-02 22:56:22 +00:00
|
|
|
[ -n "$names" ] || return 0
|
2009-10-05 16:58:06 +00:00
|
|
|
|
2011-12-01 21:34:45 +00:00
|
|
|
config_get ip "$cfg" ip "$3"
|
2009-10-05 16:58:06 +00:00
|
|
|
[ -n "$ip" ] || return 0
|
|
|
|
|
2010-04-02 22:56:22 +00:00
|
|
|
for name in $names; do
|
2014-08-28 06:27:49 +00:00
|
|
|
record="${record:+$record }$name"
|
2010-04-02 22:56:22 +00:00
|
|
|
done
|
2013-06-17 11:55:30 +00:00
|
|
|
|
2017-12-07 09:11:50 +00:00
|
|
|
echo "$ip $record" >> $HOSTFILE_TMP
|
2009-10-05 16:58:06 +00:00
|
|
|
}
|
|
|
|
|
2010-05-08 12:35:29 +00:00
|
|
|
dhcp_srv_add() {
|
|
|
|
local cfg="$1"
|
|
|
|
|
|
|
|
config_get srv "$cfg" srv
|
|
|
|
[ -n "$srv" ] || return 0
|
|
|
|
|
|
|
|
config_get target "$cfg" target
|
|
|
|
[ -n "$target" ] || return 0
|
|
|
|
|
|
|
|
config_get port "$cfg" port
|
2012-03-23 11:19:56 +00:00
|
|
|
[ -n "$port" ] || return 0
|
2010-05-08 12:35:29 +00:00
|
|
|
|
2012-03-23 11:19:56 +00:00
|
|
|
config_get class "$cfg" class
|
|
|
|
config_get weight "$cfg" weight
|
|
|
|
|
|
|
|
local service="$srv,$target,$port${class:+,$class${weight:+,$weight}}"
|
2010-05-08 12:35:29 +00:00
|
|
|
|
2012-04-02 22:31:21 +00:00
|
|
|
xappend "--srv-host=$service"
|
2010-05-08 12:35:29 +00:00
|
|
|
}
|
|
|
|
|
2012-03-23 11:19:58 +00:00
|
|
|
dhcp_mx_add() {
|
|
|
|
local cfg="$1"
|
2012-03-23 11:26:47 +00:00
|
|
|
local domain relay pref
|
2012-03-23 11:19:58 +00:00
|
|
|
|
2012-03-23 11:26:47 +00:00
|
|
|
config_get domain "$cfg" domain
|
2012-03-23 11:19:58 +00:00
|
|
|
[ -n "$domain" ] || return 0
|
|
|
|
|
|
|
|
config_get relay "$cfg" relay
|
|
|
|
[ -n "$relay" ] || return 0
|
|
|
|
|
|
|
|
config_get pref "$cfg" pref 0
|
|
|
|
|
|
|
|
local service="$domain,$relay,$pref"
|
|
|
|
|
2012-05-19 20:17:19 +00:00
|
|
|
xappend "--mx-host=$service"
|
2012-03-23 11:19:58 +00:00
|
|
|
}
|
|
|
|
|
2011-10-20 12:12:26 +00:00
|
|
|
dhcp_cname_add() {
|
|
|
|
local cfg="$1"
|
|
|
|
local cname target
|
|
|
|
|
|
|
|
config_get cname "$cfg" cname
|
|
|
|
[ -n "$cname" ] || return 0
|
|
|
|
|
|
|
|
config_get target "$cfg" target
|
|
|
|
[ -n "$target" ] || return 0
|
|
|
|
|
2012-04-02 22:31:21 +00:00
|
|
|
xappend "--cname=${cname},${target}"
|
2011-10-20 12:12:26 +00:00
|
|
|
}
|
|
|
|
|
2013-06-17 11:55:30 +00:00
|
|
|
dhcp_hostrecord_add() {
|
|
|
|
local cfg="$1"
|
|
|
|
local names addresses record val
|
|
|
|
|
|
|
|
config_get names "$cfg" name "$2"
|
|
|
|
if [ -z "$names" ]; then
|
|
|
|
return 0
|
|
|
|
fi
|
|
|
|
|
|
|
|
config_get addresses "$cfg" ip "$3"
|
|
|
|
if [ -z "$addresses" ]; then
|
|
|
|
return 0
|
|
|
|
fi
|
|
|
|
|
|
|
|
for val in $names $addresses; do
|
|
|
|
record="${record:+$record,}$val"
|
|
|
|
done
|
|
|
|
|
|
|
|
xappend "--host-record=$record"
|
|
|
|
}
|
|
|
|
|
2016-02-26 08:35:48 +00:00
|
|
|
dhcp_relay_add() {
|
|
|
|
local cfg="$1"
|
|
|
|
local local_addr server_addr interface
|
|
|
|
|
|
|
|
config_get local_addr "$cfg" local_addr
|
|
|
|
[ -n "$local_addr" ] || return 0
|
|
|
|
|
|
|
|
config_get server_addr "$cfg" server_addr
|
|
|
|
[ -n "$server_addr" ] || return 0
|
|
|
|
|
|
|
|
config_get interface "$cfg" interface
|
|
|
|
if [ -z "$interface" ]; then
|
|
|
|
xappend "--dhcp-relay=$local_addr,$server_addr"
|
|
|
|
else
|
2017-03-29 09:39:35 +00:00
|
|
|
network_get_device ifname "$interface" || return
|
|
|
|
xappend "--dhcp-relay=$local_addr,$server_addr,$ifname"
|
2016-02-26 08:35:48 +00:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2020-10-23 05:02:37 +00:00
|
|
|
dnsmasq_ipset_add() {
|
|
|
|
local cfg="$1"
|
dnsmasq: Support nftables nftsets
Add build option for nftables sets. By default disable iptables ipset
support. By default enable nftable nftset support since this is what
fw4 uses.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
dnsmasq: nftset: serve from ipset config
Use existing ipset configs as source for nftsets to be compatible with
existing configs. As the OS can either have iptables XOR nftables
support, it's fine to provide both to dnsmasq. dnsmasq will silently
fail for the present one. Depending on the dnsmasq compile time options,
the ipsets or nftsets option will not be added to the dnsmasq config
file.
dnsmasq will try to add the IP addresses to all sets, regardless of the
IP version defined for the set. Adding an IPv6 to an IPv4 set and vice
versa will silently fail.
Signed-off-by: Mathias Kresin <dev@kresin.me>
dnsmasq: support populating nftsets in addition to ipsets
Tell dnsmasq to populate nftsets instead of ipsets, if firewall4 is present in
the system. Keep the same configuration syntax in /etc/config/dhcp, for
compatibility purposes.
Huge thanks to Jo-Philipp Wich for basically writing the function.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Signed-off-by: Rui Salvaterra <rsalvaterra@gmail.com>
dnsmasq: obtain nftset ip family from nft
Unfortunately dnsmasq nft is noisy if an attempt to add a mismatched ip address
family to an nft set is made.
Heuristic to guess which ip family a nft set might belong by inferring
from the set name.
In order of preference:
If setname ends with standalone '4' or '6' use that, else
if setname has '4' or '6' delimited by '-' or '_' use that (eg
foo-4-bar) else
If setname begins with '4' or '6' standalone use that.
By standalone I mean not as part of a larger number eg. 24
If the above fails then use the existing nft set query mechanism and if
that fails, well you're stuffed!
With-thanks-to: Jo-Philipp Wich <jo@mein.io> who improved my regexp
knowledge.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
dnsmasq: specify firewall table for nftset
Permit ipsets to specify an nftables table for the set. New config
parameter is 'table'. If not specified the default of 'fw4' is used.
config ipset
list name 'BK_4,BK_6'
option table 'dscpclassify'
option table_family 'ip'
option family '4'
list domain 'ms-acdc.office.com'
list domain 'windowsupdate.com'
list domain 'update.microsoft.com'
list domain 'graph.microsoft.com'
list domain '1drv.ms'
list domain '1drv.com'
The table family can also be specified, usually 'ip' or 'ip6' else the
default 'inet' capable of both ipv4 & ipv6 is used.
If the table family is not specified then finally a family option is
available to specify either '4' or '6' for ipv4 or ipv6 respectively.
This is all in addition to the existing heuristic that will look in the
nftset name for an ip family clue, or in total desperation, query the
value from the nftset itself.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
2021-11-29 17:16:39 +00:00
|
|
|
local ipsets nftsets domains
|
2020-10-23 05:02:37 +00:00
|
|
|
|
|
|
|
add_ipset() {
|
|
|
|
ipsets="${ipsets:+$ipsets,}$1"
|
|
|
|
}
|
|
|
|
|
dnsmasq: Support nftables nftsets
Add build option for nftables sets. By default disable iptables ipset
support. By default enable nftable nftset support since this is what
fw4 uses.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
dnsmasq: nftset: serve from ipset config
Use existing ipset configs as source for nftsets to be compatible with
existing configs. As the OS can either have iptables XOR nftables
support, it's fine to provide both to dnsmasq. dnsmasq will silently
fail for the present one. Depending on the dnsmasq compile time options,
the ipsets or nftsets option will not be added to the dnsmasq config
file.
dnsmasq will try to add the IP addresses to all sets, regardless of the
IP version defined for the set. Adding an IPv6 to an IPv4 set and vice
versa will silently fail.
Signed-off-by: Mathias Kresin <dev@kresin.me>
dnsmasq: support populating nftsets in addition to ipsets
Tell dnsmasq to populate nftsets instead of ipsets, if firewall4 is present in
the system. Keep the same configuration syntax in /etc/config/dhcp, for
compatibility purposes.
Huge thanks to Jo-Philipp Wich for basically writing the function.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Signed-off-by: Rui Salvaterra <rsalvaterra@gmail.com>
dnsmasq: obtain nftset ip family from nft
Unfortunately dnsmasq nft is noisy if an attempt to add a mismatched ip address
family to an nft set is made.
Heuristic to guess which ip family a nft set might belong by inferring
from the set name.
In order of preference:
If setname ends with standalone '4' or '6' use that, else
if setname has '4' or '6' delimited by '-' or '_' use that (eg
foo-4-bar) else
If setname begins with '4' or '6' standalone use that.
By standalone I mean not as part of a larger number eg. 24
If the above fails then use the existing nft set query mechanism and if
that fails, well you're stuffed!
With-thanks-to: Jo-Philipp Wich <jo@mein.io> who improved my regexp
knowledge.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
dnsmasq: specify firewall table for nftset
Permit ipsets to specify an nftables table for the set. New config
parameter is 'table'. If not specified the default of 'fw4' is used.
config ipset
list name 'BK_4,BK_6'
option table 'dscpclassify'
option table_family 'ip'
option family '4'
list domain 'ms-acdc.office.com'
list domain 'windowsupdate.com'
list domain 'update.microsoft.com'
list domain 'graph.microsoft.com'
list domain '1drv.ms'
list domain '1drv.com'
The table family can also be specified, usually 'ip' or 'ip6' else the
default 'inet' capable of both ipv4 & ipv6 is used.
If the table family is not specified then finally a family option is
available to specify either '4' or '6' for ipv4 or ipv6 respectively.
This is all in addition to the existing heuristic that will look in the
nftset name for an ip family clue, or in total desperation, query the
value from the nftset itself.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
2021-11-29 17:16:39 +00:00
|
|
|
add_nftset() {
|
|
|
|
local IFS=,
|
|
|
|
for set in $1; do
|
|
|
|
local fam="$family"
|
|
|
|
[ -n "$fam" ] || fam=$(echo "$set" | sed -nre \
|
|
|
|
's#^.*[^0-9]([46])$|^.*[-_]([46])[-_].*$|^([46])[^0-9].*$#\1\2\3#p')
|
|
|
|
[ -n "$fam" ] || \
|
|
|
|
fam=$(nft -t list set "$table_family" "$table" "$set" 2>&1 | sed -nre \
|
|
|
|
's#^\t\ttype .*\bipv([46])_addr\b.*$#\1#p')
|
|
|
|
|
|
|
|
[ -n "$fam" ] || \
|
|
|
|
logger -t dnsmasq "Cannot infer address family from non-existent nftables set '$set'"
|
|
|
|
|
|
|
|
nftsets="${nftsets:+$nftsets,}${fam:+$fam#}$table_family#$table#$set"
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2020-10-23 05:02:37 +00:00
|
|
|
add_domain() {
|
|
|
|
# leading '/' is expected
|
|
|
|
domains="$domains/$1"
|
|
|
|
}
|
|
|
|
|
dnsmasq: Support nftables nftsets
Add build option for nftables sets. By default disable iptables ipset
support. By default enable nftable nftset support since this is what
fw4 uses.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
dnsmasq: nftset: serve from ipset config
Use existing ipset configs as source for nftsets to be compatible with
existing configs. As the OS can either have iptables XOR nftables
support, it's fine to provide both to dnsmasq. dnsmasq will silently
fail for the present one. Depending on the dnsmasq compile time options,
the ipsets or nftsets option will not be added to the dnsmasq config
file.
dnsmasq will try to add the IP addresses to all sets, regardless of the
IP version defined for the set. Adding an IPv6 to an IPv4 set and vice
versa will silently fail.
Signed-off-by: Mathias Kresin <dev@kresin.me>
dnsmasq: support populating nftsets in addition to ipsets
Tell dnsmasq to populate nftsets instead of ipsets, if firewall4 is present in
the system. Keep the same configuration syntax in /etc/config/dhcp, for
compatibility purposes.
Huge thanks to Jo-Philipp Wich for basically writing the function.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Signed-off-by: Rui Salvaterra <rsalvaterra@gmail.com>
dnsmasq: obtain nftset ip family from nft
Unfortunately dnsmasq nft is noisy if an attempt to add a mismatched ip address
family to an nft set is made.
Heuristic to guess which ip family a nft set might belong by inferring
from the set name.
In order of preference:
If setname ends with standalone '4' or '6' use that, else
if setname has '4' or '6' delimited by '-' or '_' use that (eg
foo-4-bar) else
If setname begins with '4' or '6' standalone use that.
By standalone I mean not as part of a larger number eg. 24
If the above fails then use the existing nft set query mechanism and if
that fails, well you're stuffed!
With-thanks-to: Jo-Philipp Wich <jo@mein.io> who improved my regexp
knowledge.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
dnsmasq: specify firewall table for nftset
Permit ipsets to specify an nftables table for the set. New config
parameter is 'table'. If not specified the default of 'fw4' is used.
config ipset
list name 'BK_4,BK_6'
option table 'dscpclassify'
option table_family 'ip'
option family '4'
list domain 'ms-acdc.office.com'
list domain 'windowsupdate.com'
list domain 'update.microsoft.com'
list domain 'graph.microsoft.com'
list domain '1drv.ms'
list domain '1drv.com'
The table family can also be specified, usually 'ip' or 'ip6' else the
default 'inet' capable of both ipv4 & ipv6 is used.
If the table family is not specified then finally a family option is
available to specify either '4' or '6' for ipv4 or ipv6 respectively.
This is all in addition to the existing heuristic that will look in the
nftset name for an ip family clue, or in total desperation, query the
value from the nftset itself.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
2021-11-29 17:16:39 +00:00
|
|
|
config_get table "$cfg" table 'fw4'
|
|
|
|
config_get table_family "$cfg" table_family 'inet'
|
|
|
|
if [ "$table_family" = "ip" ] ; then
|
|
|
|
family="4"
|
|
|
|
elif [ "$table_family" = "ip6" ] ; then
|
|
|
|
family="6"
|
|
|
|
else
|
|
|
|
config_get family "$cfg" family
|
|
|
|
fi
|
|
|
|
|
2020-10-23 05:02:37 +00:00
|
|
|
config_list_foreach "$cfg" "name" add_ipset
|
dnsmasq: Support nftables nftsets
Add build option for nftables sets. By default disable iptables ipset
support. By default enable nftable nftset support since this is what
fw4 uses.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
dnsmasq: nftset: serve from ipset config
Use existing ipset configs as source for nftsets to be compatible with
existing configs. As the OS can either have iptables XOR nftables
support, it's fine to provide both to dnsmasq. dnsmasq will silently
fail for the present one. Depending on the dnsmasq compile time options,
the ipsets or nftsets option will not be added to the dnsmasq config
file.
dnsmasq will try to add the IP addresses to all sets, regardless of the
IP version defined for the set. Adding an IPv6 to an IPv4 set and vice
versa will silently fail.
Signed-off-by: Mathias Kresin <dev@kresin.me>
dnsmasq: support populating nftsets in addition to ipsets
Tell dnsmasq to populate nftsets instead of ipsets, if firewall4 is present in
the system. Keep the same configuration syntax in /etc/config/dhcp, for
compatibility purposes.
Huge thanks to Jo-Philipp Wich for basically writing the function.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Signed-off-by: Rui Salvaterra <rsalvaterra@gmail.com>
dnsmasq: obtain nftset ip family from nft
Unfortunately dnsmasq nft is noisy if an attempt to add a mismatched ip address
family to an nft set is made.
Heuristic to guess which ip family a nft set might belong by inferring
from the set name.
In order of preference:
If setname ends with standalone '4' or '6' use that, else
if setname has '4' or '6' delimited by '-' or '_' use that (eg
foo-4-bar) else
If setname begins with '4' or '6' standalone use that.
By standalone I mean not as part of a larger number eg. 24
If the above fails then use the existing nft set query mechanism and if
that fails, well you're stuffed!
With-thanks-to: Jo-Philipp Wich <jo@mein.io> who improved my regexp
knowledge.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
dnsmasq: specify firewall table for nftset
Permit ipsets to specify an nftables table for the set. New config
parameter is 'table'. If not specified the default of 'fw4' is used.
config ipset
list name 'BK_4,BK_6'
option table 'dscpclassify'
option table_family 'ip'
option family '4'
list domain 'ms-acdc.office.com'
list domain 'windowsupdate.com'
list domain 'update.microsoft.com'
list domain 'graph.microsoft.com'
list domain '1drv.ms'
list domain '1drv.com'
The table family can also be specified, usually 'ip' or 'ip6' else the
default 'inet' capable of both ipv4 & ipv6 is used.
If the table family is not specified then finally a family option is
available to specify either '4' or '6' for ipv4 or ipv6 respectively.
This is all in addition to the existing heuristic that will look in the
nftset name for an ip family clue, or in total desperation, query the
value from the nftset itself.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
2021-11-29 17:16:39 +00:00
|
|
|
config_list_foreach "$cfg" "name" add_nftset
|
2020-10-23 05:02:37 +00:00
|
|
|
config_list_foreach "$cfg" "domain" add_domain
|
|
|
|
|
dnsmasq: Support nftables nftsets
Add build option for nftables sets. By default disable iptables ipset
support. By default enable nftable nftset support since this is what
fw4 uses.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
dnsmasq: nftset: serve from ipset config
Use existing ipset configs as source for nftsets to be compatible with
existing configs. As the OS can either have iptables XOR nftables
support, it's fine to provide both to dnsmasq. dnsmasq will silently
fail for the present one. Depending on the dnsmasq compile time options,
the ipsets or nftsets option will not be added to the dnsmasq config
file.
dnsmasq will try to add the IP addresses to all sets, regardless of the
IP version defined for the set. Adding an IPv6 to an IPv4 set and vice
versa will silently fail.
Signed-off-by: Mathias Kresin <dev@kresin.me>
dnsmasq: support populating nftsets in addition to ipsets
Tell dnsmasq to populate nftsets instead of ipsets, if firewall4 is present in
the system. Keep the same configuration syntax in /etc/config/dhcp, for
compatibility purposes.
Huge thanks to Jo-Philipp Wich for basically writing the function.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Signed-off-by: Rui Salvaterra <rsalvaterra@gmail.com>
dnsmasq: obtain nftset ip family from nft
Unfortunately dnsmasq nft is noisy if an attempt to add a mismatched ip address
family to an nft set is made.
Heuristic to guess which ip family a nft set might belong by inferring
from the set name.
In order of preference:
If setname ends with standalone '4' or '6' use that, else
if setname has '4' or '6' delimited by '-' or '_' use that (eg
foo-4-bar) else
If setname begins with '4' or '6' standalone use that.
By standalone I mean not as part of a larger number eg. 24
If the above fails then use the existing nft set query mechanism and if
that fails, well you're stuffed!
With-thanks-to: Jo-Philipp Wich <jo@mein.io> who improved my regexp
knowledge.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
dnsmasq: specify firewall table for nftset
Permit ipsets to specify an nftables table for the set. New config
parameter is 'table'. If not specified the default of 'fw4' is used.
config ipset
list name 'BK_4,BK_6'
option table 'dscpclassify'
option table_family 'ip'
option family '4'
list domain 'ms-acdc.office.com'
list domain 'windowsupdate.com'
list domain 'update.microsoft.com'
list domain 'graph.microsoft.com'
list domain '1drv.ms'
list domain '1drv.com'
The table family can also be specified, usually 'ip' or 'ip6' else the
default 'inet' capable of both ipv4 & ipv6 is used.
If the table family is not specified then finally a family option is
available to specify either '4' or '6' for ipv4 or ipv6 respectively.
This is all in addition to the existing heuristic that will look in the
nftset name for an ip family clue, or in total desperation, query the
value from the nftset itself.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
2021-11-29 17:16:39 +00:00
|
|
|
if [ -z "$ipsets" ] || [ -z "$nftsets" ] || [ -z "$domains" ]; then
|
2020-10-23 05:02:37 +00:00
|
|
|
return 0
|
|
|
|
fi
|
|
|
|
|
|
|
|
xappend "--ipset=$domains/$ipsets"
|
dnsmasq: Support nftables nftsets
Add build option for nftables sets. By default disable iptables ipset
support. By default enable nftable nftset support since this is what
fw4 uses.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
dnsmasq: nftset: serve from ipset config
Use existing ipset configs as source for nftsets to be compatible with
existing configs. As the OS can either have iptables XOR nftables
support, it's fine to provide both to dnsmasq. dnsmasq will silently
fail for the present one. Depending on the dnsmasq compile time options,
the ipsets or nftsets option will not be added to the dnsmasq config
file.
dnsmasq will try to add the IP addresses to all sets, regardless of the
IP version defined for the set. Adding an IPv6 to an IPv4 set and vice
versa will silently fail.
Signed-off-by: Mathias Kresin <dev@kresin.me>
dnsmasq: support populating nftsets in addition to ipsets
Tell dnsmasq to populate nftsets instead of ipsets, if firewall4 is present in
the system. Keep the same configuration syntax in /etc/config/dhcp, for
compatibility purposes.
Huge thanks to Jo-Philipp Wich for basically writing the function.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Signed-off-by: Rui Salvaterra <rsalvaterra@gmail.com>
dnsmasq: obtain nftset ip family from nft
Unfortunately dnsmasq nft is noisy if an attempt to add a mismatched ip address
family to an nft set is made.
Heuristic to guess which ip family a nft set might belong by inferring
from the set name.
In order of preference:
If setname ends with standalone '4' or '6' use that, else
if setname has '4' or '6' delimited by '-' or '_' use that (eg
foo-4-bar) else
If setname begins with '4' or '6' standalone use that.
By standalone I mean not as part of a larger number eg. 24
If the above fails then use the existing nft set query mechanism and if
that fails, well you're stuffed!
With-thanks-to: Jo-Philipp Wich <jo@mein.io> who improved my regexp
knowledge.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
dnsmasq: specify firewall table for nftset
Permit ipsets to specify an nftables table for the set. New config
parameter is 'table'. If not specified the default of 'fw4' is used.
config ipset
list name 'BK_4,BK_6'
option table 'dscpclassify'
option table_family 'ip'
option family '4'
list domain 'ms-acdc.office.com'
list domain 'windowsupdate.com'
list domain 'update.microsoft.com'
list domain 'graph.microsoft.com'
list domain '1drv.ms'
list domain '1drv.com'
The table family can also be specified, usually 'ip' or 'ip6' else the
default 'inet' capable of both ipv4 & ipv6 is used.
If the table family is not specified then finally a family option is
available to specify either '4' or '6' for ipv4 or ipv6 respectively.
This is all in addition to the existing heuristic that will look in the
nftset name for an ip family clue, or in total desperation, query the
value from the nftset itself.
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
2021-11-29 17:16:39 +00:00
|
|
|
xappend "--nftset=$domains/$nftsets"
|
2020-10-23 05:02:37 +00:00
|
|
|
}
|
|
|
|
|
2016-10-12 08:33:16 +00:00
|
|
|
dnsmasq_start()
|
2016-07-29 12:56:35 +00:00
|
|
|
{
|
2019-02-18 14:11:19 +00:00
|
|
|
local cfg="$1"
|
2022-04-25 17:56:52 +00:00
|
|
|
local disabled user_dhcpscript logfacility
|
dnsmasq: invert logic for "localuse"
Prior to this commit, "localuse" (which enables local resolving through
dnsmsasq) was off by "default". That default was in turn overridden when
"noresolv" was unset (which itself is the default for "noresolv") *and*
"resolvfile" was "/tmp/resolv.conf.d/resolv.conf.auto" (also the default
for this parameter).
In other words, the "default" unset value for "localuse" would only be
ever used in specific *non-default* configurations.
However, the problem with that logic is that a user who wants to ignore
their ISP-provided resolvers by setting "noresolv" to true ends up with
a device that will *only use* said resolvers for local DNS queries,
serving clients' queries via dnsmasq (which now ignores the ISP
resolvers). This can lead to confusion and break random setups as the
DNS lookup performed on clients behalf can differ in their replies from
DNS lookups performed locally on the router.
Furthermore, "localuse" is not configurable through Luci, contrary to
the other two involved settings, adding further confusion for the end
user.
To work around this situation, the logic that sets "localuse" is
inverted: "localuse" now defaults to on by default, and IFF "noresolv"
is unset (default) AND "resolvfile" is changed from default THEN
"localuse" gets turned back off, allowing for more sensible behaviour.
"localuse" value set in config/dhcp still overrides the logic in all
cases, as it did already.
Signed-off-by: Thibaut VARÈNE <hacks@slashdirt.org>
2023-12-11 14:23:03 +00:00
|
|
|
local resolvfile resolvdir localuse=1
|
2013-12-21 13:31:28 +00:00
|
|
|
|
2016-10-12 08:33:16 +00:00
|
|
|
config_get_bool disabled "$cfg" disabled 0
|
|
|
|
[ "$disabled" -gt 0 ] && return 0
|
2016-07-29 12:56:35 +00:00
|
|
|
|
2021-08-01 14:05:18 +00:00
|
|
|
# reset list of DOMAINS, DNS servers and EXTRA mounts (for each dnsmasq instance)
|
2016-10-12 08:33:16 +00:00
|
|
|
DNS_SERVERS=""
|
|
|
|
DOMAIN=""
|
2021-08-01 14:05:18 +00:00
|
|
|
EXTRA_MOUNT=""
|
2016-10-12 08:33:16 +00:00
|
|
|
CONFIGFILE="${BASECONFIGFILE}.${cfg}"
|
|
|
|
CONFIGFILE_TMP="${CONFIGFILE}.$$"
|
|
|
|
HOSTFILE="${BASEHOSTFILE}.${cfg}"
|
2017-12-07 09:11:50 +00:00
|
|
|
HOSTFILE_TMP="${HOSTFILE}.$$"
|
2021-10-31 12:54:06 +00:00
|
|
|
HOSTFILE_DIR="$(dirname "$HOSTFILE")"
|
2016-10-12 08:33:16 +00:00
|
|
|
BASEDHCPSTAMPFILE_CFG="${BASEDHCPSTAMPFILE}.${cfg}"
|
2007-03-17 13:31:13 +00:00
|
|
|
|
2012-04-02 22:31:21 +00:00
|
|
|
# before we can call xappend
|
2021-10-31 12:54:06 +00:00
|
|
|
umask u=rwx,g=rx,o=rx
|
2015-03-26 10:58:30 +00:00
|
|
|
mkdir -p /var/run/dnsmasq/
|
2012-04-02 22:31:21 +00:00
|
|
|
mkdir -p $(dirname $CONFIGFILE)
|
2021-10-31 12:54:06 +00:00
|
|
|
mkdir -p "$HOSTFILE_DIR"
|
2015-03-26 10:58:30 +00:00
|
|
|
mkdir -p /var/lib/misc
|
2016-09-05 08:01:19 +00:00
|
|
|
chown dnsmasq:dnsmasq /var/run/dnsmasq
|
2015-03-26 10:58:30 +00:00
|
|
|
|
2016-06-13 13:21:47 +00:00
|
|
|
echo "# auto-generated config file from /etc/config/dhcp" > $CONFIGFILE_TMP
|
2017-12-07 09:11:50 +00:00
|
|
|
echo "# auto-generated config file from /etc/config/dhcp" > $HOSTFILE_TMP
|
2012-04-02 22:31:21 +00:00
|
|
|
|
2017-11-15 19:20:44 +00:00
|
|
|
local dnsmasqconffile="/etc/dnsmasq.${cfg}.conf"
|
|
|
|
if [ ! -r "$dnsmasqconffile" ]; then
|
|
|
|
dnsmasqconffile=/etc/dnsmasq.conf
|
|
|
|
fi
|
|
|
|
|
2012-04-02 22:31:21 +00:00
|
|
|
# if we did this last, we could override auto-generated config
|
2017-11-15 19:20:44 +00:00
|
|
|
[ -f "${dnsmasqconffile}" ] && {
|
|
|
|
xappend "--conf-file=${dnsmasqconffile}"
|
2012-04-02 22:31:21 +00:00
|
|
|
}
|
|
|
|
|
2015-08-31 17:11:41 +00:00
|
|
|
$PROG --version | grep -osqE "^Compile time options:.* DHCPv6( |$)" && DHCPv6CAPABLE=1 || DHCPv6CAPABLE=0
|
|
|
|
|
2016-12-22 18:20:25 +00:00
|
|
|
|
2020-03-01 02:31:45 +00:00
|
|
|
if [ -x /usr/sbin/odhcpd ] && [ -x /etc/init.d/odhcpd ] ; then
|
2016-12-22 18:20:25 +00:00
|
|
|
local odhcpd_is_main odhcpd_is_enabled
|
2017-04-16 16:21:49 +00:00
|
|
|
config_get odhcpd_is_main odhcpd maindhcp 0
|
2016-12-22 18:20:25 +00:00
|
|
|
/etc/init.d/odhcpd enabled && odhcpd_is_enabled=1 || odhcpd_is_enabled=0
|
|
|
|
|
|
|
|
|
2020-03-01 02:31:45 +00:00
|
|
|
if [ "$odhcpd_is_enabled" -eq 0 ] && [ "$DHCPv6CAPABLE" -eq 1 ] ; then
|
2016-12-22 18:20:25 +00:00
|
|
|
# DHCP V4 and V6 in DNSMASQ
|
|
|
|
DNSMASQ_DHCP_VER=6
|
|
|
|
elif [ "$odhcpd_is_main" -gt 0 ] ; then
|
|
|
|
# ODHCPD is doing it all
|
|
|
|
DNSMASQ_DHCP_VER=0
|
|
|
|
else
|
|
|
|
# You have ODHCPD but use DNSMASQ for DHCPV4
|
|
|
|
DNSMASQ_DHCP_VER=4
|
|
|
|
fi
|
|
|
|
|
|
|
|
elif [ "$DHCPv6CAPABLE" -eq 1 ] ; then
|
|
|
|
# DHCP V4 and V6 in DNSMASQ
|
|
|
|
DNSMASQ_DHCP_VER=6
|
|
|
|
else
|
|
|
|
DNSMASQ_DHCP_VER=4
|
|
|
|
fi
|
|
|
|
|
2017-04-05 18:31:01 +00:00
|
|
|
# Allow DHCP/DHCPv6 to be handled by ISC DHCPD
|
|
|
|
if [ -x /usr/sbin/dhcpd ] ; then
|
|
|
|
if [ -x /etc/init.d/dhcpd ] ; then
|
|
|
|
/etc/init.d/dhcpd enabled && DNSMASQ_DHCP_VER=0
|
|
|
|
fi
|
2020-03-01 02:31:45 +00:00
|
|
|
if [ -x /etc/init.d/dhcpd6 ] && [ "$DNSMASQ_DHCP_VER" -gt 0 ] ; then
|
2017-04-05 18:31:01 +00:00
|
|
|
/etc/init.d/dhcpd6 enabled && DNSMASQ_DHCP_VER=4
|
|
|
|
fi
|
|
|
|
fi
|
2016-12-22 18:20:25 +00:00
|
|
|
|
2016-10-12 08:33:16 +00:00
|
|
|
append_bool "$cfg" authoritative "--dhcp-authoritative"
|
|
|
|
append_bool "$cfg" nodaemon "--no-daemon"
|
|
|
|
append_bool "$cfg" domainneeded "--domain-needed"
|
|
|
|
append_bool "$cfg" filterwin2k "--filterwin2k"
|
|
|
|
append_bool "$cfg" nohosts "--no-hosts"
|
|
|
|
append_bool "$cfg" nonegcache "--no-negcache"
|
|
|
|
append_bool "$cfg" strictorder "--strict-order"
|
|
|
|
append_bool "$cfg" logqueries "--log-queries=extra"
|
|
|
|
append_bool "$cfg" noresolv "--no-resolv"
|
|
|
|
append_bool "$cfg" localise_queries "--localise-queries"
|
|
|
|
append_bool "$cfg" readethers "--read-ethers"
|
2021-06-27 22:02:46 +00:00
|
|
|
|
|
|
|
local instance_name="dnsmasq.$cfg"
|
|
|
|
if [ "$cfg" = "$DEFAULT_INSTANCE" ]; then
|
|
|
|
instance_name="dnsmasq"
|
|
|
|
fi
|
|
|
|
config_get_bool dbus "$cfg" "dbus" 0
|
|
|
|
[ $dbus -gt 0 ] && xappend "--enable-dbus=uk.org.thekelleys.$instance_name"
|
|
|
|
config_get_bool ubus "$cfg" "ubus" 1
|
|
|
|
[ $ubus -gt 0 ] && xappend "--enable-ubus=$instance_name"
|
|
|
|
|
2016-10-12 08:33:16 +00:00
|
|
|
append_bool "$cfg" expandhosts "--expand-hosts"
|
|
|
|
config_get tftp_root "$cfg" "tftp_root"
|
2017-05-02 17:31:17 +00:00
|
|
|
[ -n "$tftp_root" ] && mkdir -p "$tftp_root" && append_bool "$cfg" enable_tftp "--enable-tftp"
|
2016-10-12 08:33:16 +00:00
|
|
|
append_bool "$cfg" tftp_no_fail "--tftp-no-fail"
|
2017-02-24 10:08:30 +00:00
|
|
|
append_bool "$cfg" nonwildcard "--bind-dynamic" 1
|
2016-10-12 08:33:16 +00:00
|
|
|
append_bool "$cfg" fqdn "--dhcp-fqdn"
|
|
|
|
append_bool "$cfg" proxydnssec "--proxy-dnssec"
|
|
|
|
append_bool "$cfg" localservice "--local-service"
|
2016-10-31 14:00:06 +00:00
|
|
|
append_bool "$cfg" logdhcp "--log-dhcp"
|
2016-10-12 08:33:16 +00:00
|
|
|
append_bool "$cfg" quietdhcp "--quiet-dhcp"
|
|
|
|
append_bool "$cfg" sequential_ip "--dhcp-sequential-ip"
|
|
|
|
append_bool "$cfg" allservers "--all-servers"
|
|
|
|
append_bool "$cfg" noping "--no-ping"
|
2019-02-13 09:30:10 +00:00
|
|
|
append_bool "$cfg" rapidcommit "--dhcp-rapid-commit"
|
2020-03-19 12:23:22 +00:00
|
|
|
append_bool "$cfg" scriptarp "--script-arp"
|
2016-10-12 08:33:16 +00:00
|
|
|
|
2022-11-07 08:20:15 +00:00
|
|
|
append_bool "$cfg" filter_aaaa "--filter-AAAA"
|
|
|
|
append_bool "$cfg" filter_a "--filter-A"
|
|
|
|
|
2016-12-21 19:53:39 +00:00
|
|
|
append_parm "$cfg" logfacility "--log-facility"
|
2022-04-25 17:56:52 +00:00
|
|
|
config_get logfacility "$cfg" "logfacility"
|
2016-10-12 08:33:16 +00:00
|
|
|
append_parm "$cfg" cachesize "--cache-size"
|
|
|
|
append_parm "$cfg" dnsforwardmax "--dns-forward-max"
|
|
|
|
append_parm "$cfg" port "--port"
|
|
|
|
append_parm "$cfg" ednspacket_max "--edns-packet-max"
|
|
|
|
append_parm "$cfg" dhcpleasemax "--dhcp-lease-max"
|
|
|
|
append_parm "$cfg" "queryport" "--query-port"
|
|
|
|
append_parm "$cfg" "minport" "--min-port"
|
|
|
|
append_parm "$cfg" "maxport" "--max-port"
|
|
|
|
append_parm "$cfg" "domain" "--domain"
|
2021-07-01 18:50:22 +00:00
|
|
|
append_parm "$cfg" "local" "--local"
|
2017-10-12 21:16:06 +00:00
|
|
|
config_list_foreach "$cfg" "listen_address" append_listenaddress
|
2016-10-12 08:33:16 +00:00
|
|
|
config_list_foreach "$cfg" "server" append_server
|
2017-06-28 15:07:39 +00:00
|
|
|
config_list_foreach "$cfg" "rev_server" append_rev_server
|
2016-10-12 08:33:16 +00:00
|
|
|
config_list_foreach "$cfg" "address" append_address
|
2021-09-09 05:43:31 +00:00
|
|
|
|
|
|
|
local connmark_allowlist_enable
|
|
|
|
config_get connmark_allowlist_enable "$cfg" connmark_allowlist_enable 0
|
|
|
|
[ "$connmark_allowlist_enable" -gt 0 ] && {
|
|
|
|
append_parm "$cfg" "connmark_allowlist_enable" "--connmark-allowlist-enable"
|
|
|
|
config_list_foreach "$cfg" "connmark_allowlist" append_connmark_allowlist
|
|
|
|
}
|
|
|
|
|
2018-07-17 11:42:17 +00:00
|
|
|
[ -n "$BOOT" ] || {
|
|
|
|
config_list_foreach "$cfg" "interface" append_interface
|
|
|
|
config_list_foreach "$cfg" "notinterface" append_notinterface
|
|
|
|
}
|
2021-08-01 10:25:41 +00:00
|
|
|
config_get_bool ignore_hosts_dir "$cfg" ignore_hosts_dir 0
|
|
|
|
if [ "$ignore_hosts_dir" = "1" ]; then
|
|
|
|
xappend "--addn-hosts=$HOSTFILE"
|
|
|
|
append EXTRA_MOUNT "$HOSTFILE"
|
|
|
|
else
|
2021-11-01 11:59:46 +00:00
|
|
|
xappend "--addn-hosts=$HOSTFILE_DIR"
|
|
|
|
append EXTRA_MOUNT "$HOSTFILE_DIR"
|
2021-08-01 10:25:41 +00:00
|
|
|
fi
|
2016-10-12 08:33:16 +00:00
|
|
|
config_list_foreach "$cfg" "addnhosts" append_addnhosts
|
|
|
|
config_list_foreach "$cfg" "bogusnxdomain" append_bogusnxdomain
|
|
|
|
append_parm "$cfg" "leasefile" "--dhcp-leasefile" "/tmp/dhcp.leases"
|
2022-04-15 14:30:01 +00:00
|
|
|
|
|
|
|
local serversfile
|
|
|
|
config_get serversfile "$cfg" "serversfile"
|
|
|
|
[ -n "$serversfile" ] && {
|
|
|
|
xappend "--servers-file=$serversfile"
|
|
|
|
append EXTRA_MOUNT "$serversfile"
|
|
|
|
}
|
|
|
|
|
2016-10-12 08:33:16 +00:00
|
|
|
append_parm "$cfg" "tftp_root" "--tftp-root"
|
|
|
|
append_parm "$cfg" "dhcp_boot" "--dhcp-boot"
|
|
|
|
append_parm "$cfg" "local_ttl" "--local-ttl"
|
2019-02-20 17:09:50 +00:00
|
|
|
append_parm "$cfg" "max_ttl" "--max-ttl"
|
|
|
|
append_parm "$cfg" "min_cache_ttl" "--min-cache-ttl"
|
|
|
|
append_parm "$cfg" "max_cache_ttl" "--max-cache-ttl"
|
2016-10-12 08:33:16 +00:00
|
|
|
append_parm "$cfg" "pxe_prompt" "--pxe-prompt"
|
2020-09-24 02:42:00 +00:00
|
|
|
append_parm "$cfg" "tftp_unique_root" "--tftp-unique-root"
|
2016-10-12 08:33:16 +00:00
|
|
|
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
|
|
|
|
config_get_bool ADD_LOCAL_HOSTNAME "$cfg" add_local_hostname 1
|
dnsmasq: expand 'add_local_hostname' fexibility including FQDN
ref commit 612e2276b4a2f57fcbbe79b95bec4a46e89d748c
ref commit ec63e3bf1312ab4c666f7417ca9844857214047f
'option add_local_hostname' scripted implementation statically assigns
this host in auto generated host file at init. If IFUP or other signals
do not occur, then address changes are not tracked. The script doesn't
apply all the addresses at an interface. This may make logs obscure.
The script only puts the bare host name (maybe not FQDN) in host file,
but if '--exapandhosts' is enabled, then /etc/hosts entries will be
suffixed, and "127.0.0.1 localhost" becomes "localhost.lan".
dnsmasq provides an option to perform this function, but it is rather
greedy. '--interface-name=<name>,<iface>' will assign the name to all
IP on the specified interface (except link local). This is a useful
feature, but some setups depend on the original restrictive behavior.
'option add_local_fqdn' is added to enhance the feature set, but
if not entered or empty string, then it will default to original
option and behavior. This new option has a few settings. At each
increased setting the most detailed name becomes the PTR record:
0 - same as add_local_hostname 0 or disabled
1 - same as add_local_hostname 1
2 - assigns the bare host name to all IP w/ --dnsmasq-interface
3 - assigns the FQDN and host to all IP w/ --dnsmasq-interface
4 - assigns <iface>.<host>.<domain> and above w/ --dnsmasq-nterface
'option add_wan_fqdn' is added to run the same procedure on
inferred WAN intefaces. If an interface has 'config dhcp' and
'option ignore 1' set, then it is considered WAN. The original
option would only run on DHCP serving interfaces.
Signed-off-by: Eric Luehrsen <ericluehrsen@hotmail.com>
2017-01-14 02:37:25 +00:00
|
|
|
config_get ADD_LOCAL_FQDN "$cfg" add_local_fqdn ""
|
|
|
|
config_get ADD_WAN_FQDN "$cfg" add_wan_fqdn 0
|
|
|
|
|
|
|
|
if [ -z "$ADD_LOCAL_FQDN" ] ; then
|
|
|
|
# maintain support for previous UCI
|
|
|
|
ADD_LOCAL_FQDN="$ADD_LOCAL_HOSTNAME"
|
|
|
|
fi
|
2016-10-12 08:33:16 +00:00
|
|
|
|
2017-05-06 10:56:26 +00:00
|
|
|
config_get user_dhcpscript $cfg dhcpscript
|
2017-06-09 14:24:12 +00:00
|
|
|
if has_handler || [ -n "$user_dhcpscript" ]; then
|
|
|
|
xappend "--dhcp-script=$DHCPSCRIPT"
|
2020-03-19 12:23:22 +00:00
|
|
|
xappend "--script-arp"
|
2017-06-09 14:24:12 +00:00
|
|
|
fi
|
2016-10-12 08:33:16 +00:00
|
|
|
|
|
|
|
config_get leasefile $cfg leasefile "/tmp/dhcp.leases"
|
2020-03-01 02:31:45 +00:00
|
|
|
[ -n "$leasefile" ] && [ ! -e "$leasefile" ] && touch "$leasefile"
|
2016-10-12 08:33:16 +00:00
|
|
|
config_get_bool cachelocal "$cfg" cachelocal 1
|
|
|
|
|
2017-06-14 20:50:48 +00:00
|
|
|
config_get_bool noresolv "$cfg" noresolv 0
|
|
|
|
if [ "$noresolv" != "1" ]; then
|
2020-01-03 11:39:06 +00:00
|
|
|
config_get resolvfile "$cfg" resolvfile /tmp/resolv.conf.d/resolv.conf.auto
|
2020-03-01 02:31:45 +00:00
|
|
|
[ -n "$resolvfile" ] && [ ! -e "$resolvfile" ] && touch "$resolvfile"
|
2019-02-18 14:11:19 +00:00
|
|
|
xappend "--resolv-file=$resolvfile"
|
dnsmasq: invert logic for "localuse"
Prior to this commit, "localuse" (which enables local resolving through
dnsmsasq) was off by "default". That default was in turn overridden when
"noresolv" was unset (which itself is the default for "noresolv") *and*
"resolvfile" was "/tmp/resolv.conf.d/resolv.conf.auto" (also the default
for this parameter).
In other words, the "default" unset value for "localuse" would only be
ever used in specific *non-default* configurations.
However, the problem with that logic is that a user who wants to ignore
their ISP-provided resolvers by setting "noresolv" to true ends up with
a device that will *only use* said resolvers for local DNS queries,
serving clients' queries via dnsmasq (which now ignores the ISP
resolvers). This can lead to confusion and break random setups as the
DNS lookup performed on clients behalf can differ in their replies from
DNS lookups performed locally on the router.
Furthermore, "localuse" is not configurable through Luci, contrary to
the other two involved settings, adding further confusion for the end
user.
To work around this situation, the logic that sets "localuse" is
inverted: "localuse" now defaults to on by default, and IFF "noresolv"
is unset (default) AND "resolvfile" is changed from default THEN
"localuse" gets turned back off, allowing for more sensible behaviour.
"localuse" value set in config/dhcp still overrides the logic in all
cases, as it did already.
Signed-off-by: Thibaut VARÈNE <hacks@slashdirt.org>
2023-12-11 14:23:03 +00:00
|
|
|
[ "$resolvfile" != "/tmp/resolv.conf.d/resolv.conf.auto" ] && localuse=0
|
2020-01-03 11:39:06 +00:00
|
|
|
resolvdir="$(dirname "$resolvfile")"
|
2017-06-14 20:50:48 +00:00
|
|
|
fi
|
2019-02-20 06:58:51 +00:00
|
|
|
config_get_bool localuse "$cfg" localuse "$localuse"
|
2017-06-14 20:50:48 +00:00
|
|
|
|
2016-10-12 08:33:16 +00:00
|
|
|
config_get hostsfile "$cfg" dhcphostsfile
|
|
|
|
[ -e "$hostsfile" ] && xappend "--dhcp-hostsfile=$hostsfile"
|
|
|
|
|
|
|
|
local rebind
|
|
|
|
config_get_bool rebind "$cfg" rebind_protection 1
|
|
|
|
[ $rebind -gt 0 ] && {
|
|
|
|
log_once \
|
|
|
|
"DNS rebinding protection is active," \
|
|
|
|
"will discard upstream RFC1918 responses!"
|
|
|
|
xappend "--stop-dns-rebind"
|
|
|
|
|
|
|
|
local rebind_localhost
|
|
|
|
config_get_bool rebind_localhost "$cfg" rebind_localhost 0
|
|
|
|
[ $rebind_localhost -gt 0 ] && {
|
|
|
|
log_once "Allowing 127.0.0.0/8 responses"
|
|
|
|
xappend "--rebind-localhost-ok"
|
|
|
|
}
|
|
|
|
|
|
|
|
append_rebind_domain() {
|
|
|
|
log_once "Allowing RFC1918 responses for domain $1"
|
|
|
|
xappend "--rebind-domain-ok=$1"
|
|
|
|
}
|
|
|
|
|
|
|
|
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"
|
|
|
|
[ -x /etc/init.d/sysntpd ] && {
|
2020-03-01 03:08:43 +00:00
|
|
|
if /etc/init.d/sysntpd enabled || [ "$(uci_get system.ntp.enabled)" = "1" ] ; then
|
2016-10-12 08:33:16 +00:00
|
|
|
[ -f "$TIMEVALIDFILE" ] || xappend "--dnssec-no-timecheck"
|
2020-03-01 03:08:43 +00:00
|
|
|
fi
|
2016-10-12 08:33:16 +00:00
|
|
|
}
|
2019-11-22 14:04:02 +00:00
|
|
|
config_get_bool dnsseccheckunsigned "$cfg" dnsseccheckunsigned 1
|
|
|
|
[ "$dnsseccheckunsigned" -eq 0 ] && xappend "--dnssec-check-unsigned=no"
|
2016-10-12 08:33:16 +00:00
|
|
|
}
|
|
|
|
|
2016-11-03 20:44:29 +00:00
|
|
|
config_get addmac "$cfg" addmac 0
|
|
|
|
[ "$addmac" != "0" ] && {
|
|
|
|
[ "$addmac" = "1" ] && addmac=
|
|
|
|
xappend "--add-mac${addmac:+="$addmac"}"
|
|
|
|
}
|
|
|
|
|
2016-10-12 08:33:16 +00:00
|
|
|
dhcp_option_add "$cfg" "" 0
|
2017-06-21 14:48:41 +00:00
|
|
|
dhcp_option_add "$cfg" "" 2
|
2016-10-12 08:33:16 +00:00
|
|
|
|
|
|
|
xappend "--dhcp-broadcast=tag:needs-broadcast"
|
|
|
|
|
|
|
|
|
|
|
|
config_get dnsmasqconfdir "$cfg" confdir "/tmp/dnsmasq.d"
|
|
|
|
xappend "--conf-dir=$dnsmasqconfdir"
|
2018-06-11 09:17:52 +00:00
|
|
|
dnsmasqconfdir="${dnsmasqconfdir%%,*}"
|
|
|
|
[ ! -d "$dnsmasqconfdir" ] && mkdir -p $dnsmasqconfdir
|
2016-10-12 08:33:16 +00:00
|
|
|
xappend "--user=dnsmasq"
|
|
|
|
xappend "--group=dnsmasq"
|
|
|
|
echo >> $CONFIGFILE_TMP
|
|
|
|
|
|
|
|
config_get_bool enable_tftp "$cfg" enable_tftp 0
|
|
|
|
[ "$enable_tftp" -gt 0 ] && {
|
|
|
|
config_get tftp_root "$cfg" tftp_root
|
|
|
|
append EXTRA_MOUNT $tftp_root
|
|
|
|
}
|
|
|
|
|
|
|
|
config_foreach filter_dnsmasq host dhcp_host_add "$cfg"
|
2016-06-13 13:21:47 +00:00
|
|
|
echo >> $CONFIGFILE_TMP
|
2018-10-08 19:40:36 +00:00
|
|
|
|
|
|
|
config_get_bool dhcpbogushostname "$cfg" dhcpbogushostname 1
|
|
|
|
[ "$dhcpbogushostname" -gt 0 ] && {
|
|
|
|
xappend "--dhcp-ignore-names=tag:dhcp_bogus_hostname"
|
|
|
|
[ -r "$DHCPBOGUSHOSTNAMEFILE" ] && xappend "--conf-file=$DHCPBOGUSHOSTNAMEFILE"
|
|
|
|
}
|
|
|
|
|
2016-10-12 08:33:16 +00:00
|
|
|
config_foreach filter_dnsmasq boot dhcp_boot_add "$cfg"
|
|
|
|
config_foreach filter_dnsmasq mac dhcp_mac_add "$cfg"
|
|
|
|
config_foreach filter_dnsmasq tag dhcp_tag_add "$cfg"
|
|
|
|
config_foreach filter_dnsmasq vendorclass dhcp_vendorclass_add "$cfg"
|
|
|
|
config_foreach filter_dnsmasq userclass dhcp_userclass_add "$cfg"
|
|
|
|
config_foreach filter_dnsmasq circuitid dhcp_circuitid_add "$cfg"
|
|
|
|
config_foreach filter_dnsmasq remoteid dhcp_remoteid_add "$cfg"
|
|
|
|
config_foreach filter_dnsmasq subscrid dhcp_subscrid_add "$cfg"
|
|
|
|
config_foreach filter_dnsmasq match dhcp_match_add "$cfg"
|
|
|
|
config_foreach filter_dnsmasq domain dhcp_domain_add "$cfg"
|
|
|
|
config_foreach filter_dnsmasq hostrecord dhcp_hostrecord_add "$cfg"
|
2018-07-17 11:42:17 +00:00
|
|
|
[ -n "$BOOT" ] || config_foreach filter_dnsmasq relay dhcp_relay_add "$cfg"
|
2013-06-17 11:55:30 +00:00
|
|
|
|
2016-06-13 13:21:47 +00:00
|
|
|
echo >> $CONFIGFILE_TMP
|
2016-10-12 08:33:16 +00:00
|
|
|
config_foreach filter_dnsmasq srvhost dhcp_srv_add "$cfg"
|
|
|
|
config_foreach filter_dnsmasq mxhost dhcp_mx_add "$cfg"
|
2016-06-13 13:21:47 +00:00
|
|
|
echo >> $CONFIGFILE_TMP
|
2014-01-17 14:00:09 +00:00
|
|
|
|
2017-02-20 10:15:55 +00:00
|
|
|
config_get_bool boguspriv "$cfg" boguspriv 1
|
|
|
|
[ "$boguspriv" -gt 0 ] && {
|
|
|
|
xappend "--bogus-priv"
|
|
|
|
[ -r "$RFC6761FILE" ] && xappend "--conf-file=$RFC6761FILE"
|
|
|
|
}
|
2016-12-22 18:20:25 +00:00
|
|
|
|
|
|
|
if [ "$DNSMASQ_DHCP_VER" -gt 4 ] ; then
|
|
|
|
# Enable RA feature for when/if it is constructed,
|
|
|
|
# and RA is selected per interface pool (RA, DHCP, or both),
|
|
|
|
# but no one (should) want RA broadcast in syslog
|
2018-07-17 11:42:17 +00:00
|
|
|
[ -n "$BOOT" ] || config_foreach filter_dnsmasq dhcp dhcp_add "$cfg"
|
2016-12-22 18:20:25 +00:00
|
|
|
xappend "--enable-ra"
|
|
|
|
xappend "--quiet-ra"
|
2017-02-03 10:13:59 +00:00
|
|
|
append_bool "$cfg" quietdhcp "--quiet-dhcp6"
|
2016-12-22 18:20:25 +00:00
|
|
|
|
|
|
|
elif [ "$DNSMASQ_DHCP_VER" -gt 0 ] ; then
|
2018-07-17 11:42:17 +00:00
|
|
|
[ -n "$BOOT" ] || config_foreach filter_dnsmasq dhcp dhcp_add "$cfg"
|
2014-01-17 14:00:09 +00:00
|
|
|
fi
|
|
|
|
|
2016-12-22 18:20:25 +00:00
|
|
|
|
2016-06-13 13:21:47 +00:00
|
|
|
echo >> $CONFIGFILE_TMP
|
2016-10-12 08:33:16 +00:00
|
|
|
config_foreach filter_dnsmasq cname dhcp_cname_add "$cfg"
|
|
|
|
echo >> $CONFIGFILE_TMP
|
|
|
|
|
2020-10-23 05:02:37 +00:00
|
|
|
echo >> $CONFIGFILE_TMP
|
|
|
|
config_foreach filter_dnsmasq ipset dnsmasq_ipset_add "$cfg"
|
|
|
|
echo >> $CONFIGFILE_TMP
|
|
|
|
|
2016-06-13 13:21:47 +00:00
|
|
|
mv -f $CONFIGFILE_TMP $CONFIGFILE
|
2017-12-07 09:11:50 +00:00
|
|
|
mv -f $HOSTFILE_TMP $HOSTFILE
|
2007-08-29 18:40:52 +00:00
|
|
|
|
2019-02-18 14:11:19 +00:00
|
|
|
[ "$localuse" -gt 0 ] && {
|
2017-06-14 20:50:48 +00:00
|
|
|
rm -f /tmp/resolv.conf
|
|
|
|
[ $ADD_LOCAL_DOMAIN -eq 1 ] && [ -n "$DOMAIN" ] && {
|
|
|
|
echo "search $DOMAIN" >> /tmp/resolv.conf
|
|
|
|
}
|
|
|
|
DNS_SERVERS="$DNS_SERVERS 127.0.0.1"
|
2020-08-21 14:32:00 +00:00
|
|
|
[ -e /proc/sys/net/ipv6 ] && DNS_SERVERS="$DNS_SERVERS ::1"
|
2017-06-14 20:50:48 +00:00
|
|
|
for DNS_SERVER in $DNS_SERVERS ; do
|
|
|
|
echo "nameserver $DNS_SERVER" >> /tmp/resolv.conf
|
|
|
|
done
|
|
|
|
}
|
2016-02-25 09:24:31 +00:00
|
|
|
|
2022-11-27 12:33:31 +00:00
|
|
|
config_list_foreach "$cfg" addnmount append_extramount
|
|
|
|
|
2016-10-12 08:33:16 +00:00
|
|
|
procd_open_instance $cfg
|
|
|
|
procd_set_param command $PROG -C $CONFIGFILE -k -x /var/run/dnsmasq/dnsmasq."${cfg}".pid
|
2016-02-25 09:24:31 +00:00
|
|
|
procd_set_param file $CONFIGFILE
|
2017-05-06 10:56:26 +00:00
|
|
|
[ -n "$user_dhcpscript" ] && procd_set_param env USER_DHCPSCRIPT="$user_dhcpscript"
|
2016-02-25 09:24:31 +00:00
|
|
|
procd_set_param respawn
|
|
|
|
|
2022-04-06 13:13:13 +00:00
|
|
|
local instance_ifc instance_netdev
|
|
|
|
config_get instance_ifc "$cfg" interface
|
|
|
|
[ -n "$instance_ifc" ] && network_get_device instance_netdev "$instance_ifc" &&
|
|
|
|
[ -n "$instance_netdev" ] && procd_set_param netdev $instance_netdev
|
|
|
|
|
2016-02-25 09:24:31 +00:00
|
|
|
procd_add_jail dnsmasq ubus log
|
2021-08-01 10:25:41 +00:00
|
|
|
procd_add_jail_mount $CONFIGFILE $DHCPBOGUSHOSTNAMEFILE $DHCPSCRIPT $DHCPSCRIPT_DEPENDS
|
|
|
|
procd_add_jail_mount $EXTRA_MOUNT $RFC6761FILE $TRUSTANCHORSFILE
|
2021-08-01 02:33:52 +00:00
|
|
|
procd_add_jail_mount $dnsmasqconffile $dnsmasqconfdir $resolvdir $user_dhcpscript
|
|
|
|
procd_add_jail_mount /etc/passwd /etc/group /etc/TZ /etc/hosts /etc/ethers
|
2016-10-12 08:33:16 +00:00
|
|
|
procd_add_jail_mount_rw /var/run/dnsmasq/ $leasefile
|
2022-04-25 17:56:52 +00:00
|
|
|
case "$logfacility" in */*)
|
|
|
|
[ ! -e "$logfacility" ] && touch "$logfacility"
|
|
|
|
procd_add_jail_mount_rw "$logfacility"
|
|
|
|
esac
|
2023-03-23 10:15:52 +00:00
|
|
|
[ -e "$hostsfile" ] && procd_add_jail_mount $hostsfile
|
2016-02-25 09:24:31 +00:00
|
|
|
|
|
|
|
procd_close_instance
|
2006-10-04 20:05:48 +00:00
|
|
|
}
|
|
|
|
|
2016-10-12 08:33:16 +00:00
|
|
|
dnsmasq_stop()
|
|
|
|
{
|
2019-02-18 14:11:19 +00:00
|
|
|
local cfg="$1"
|
dnsmasq: invert logic for "localuse"
Prior to this commit, "localuse" (which enables local resolving through
dnsmsasq) was off by "default". That default was in turn overridden when
"noresolv" was unset (which itself is the default for "noresolv") *and*
"resolvfile" was "/tmp/resolv.conf.d/resolv.conf.auto" (also the default
for this parameter).
In other words, the "default" unset value for "localuse" would only be
ever used in specific *non-default* configurations.
However, the problem with that logic is that a user who wants to ignore
their ISP-provided resolvers by setting "noresolv" to true ends up with
a device that will *only use* said resolvers for local DNS queries,
serving clients' queries via dnsmasq (which now ignores the ISP
resolvers). This can lead to confusion and break random setups as the
DNS lookup performed on clients behalf can differ in their replies from
DNS lookups performed locally on the router.
Furthermore, "localuse" is not configurable through Luci, contrary to
the other two involved settings, adding further confusion for the end
user.
To work around this situation, the logic that sets "localuse" is
inverted: "localuse" now defaults to on by default, and IFF "noresolv"
is unset (default) AND "resolvfile" is changed from default THEN
"localuse" gets turned back off, allowing for more sensible behaviour.
"localuse" value set in config/dhcp still overrides the logic in all
cases, as it did already.
Signed-off-by: Thibaut VARÈNE <hacks@slashdirt.org>
2023-12-11 14:23:03 +00:00
|
|
|
local noresolv resolvfile localuse=1
|
2016-10-12 08:33:16 +00:00
|
|
|
|
2019-02-18 14:11:19 +00:00
|
|
|
config_get_bool noresolv "$cfg" noresolv 0
|
2017-06-14 20:50:48 +00:00
|
|
|
config_get resolvfile "$cfg" "resolvfile"
|
|
|
|
|
dnsmasq: invert logic for "localuse"
Prior to this commit, "localuse" (which enables local resolving through
dnsmsasq) was off by "default". That default was in turn overridden when
"noresolv" was unset (which itself is the default for "noresolv") *and*
"resolvfile" was "/tmp/resolv.conf.d/resolv.conf.auto" (also the default
for this parameter).
In other words, the "default" unset value for "localuse" would only be
ever used in specific *non-default* configurations.
However, the problem with that logic is that a user who wants to ignore
their ISP-provided resolvers by setting "noresolv" to true ends up with
a device that will *only use* said resolvers for local DNS queries,
serving clients' queries via dnsmasq (which now ignores the ISP
resolvers). This can lead to confusion and break random setups as the
DNS lookup performed on clients behalf can differ in their replies from
DNS lookups performed locally on the router.
Furthermore, "localuse" is not configurable through Luci, contrary to
the other two involved settings, adding further confusion for the end
user.
To work around this situation, the logic that sets "localuse" is
inverted: "localuse" now defaults to on by default, and IFF "noresolv"
is unset (default) AND "resolvfile" is changed from default THEN
"localuse" gets turned back off, allowing for more sensible behaviour.
"localuse" value set in config/dhcp still overrides the logic in all
cases, as it did already.
Signed-off-by: Thibaut VARÈNE <hacks@slashdirt.org>
2023-12-11 14:23:03 +00:00
|
|
|
[ "$noresolv" = 0 ] && [ "$resolvfile" != "/tmp/resolv.conf.d/resolv.conf.auto" ] && localuse=0
|
2019-02-20 06:58:51 +00:00
|
|
|
config_get_bool localuse "$cfg" localuse "$localuse"
|
2020-01-03 11:39:06 +00:00
|
|
|
[ "$localuse" -gt 0 ] && ln -sf "/tmp/resolv.conf.d/resolv.conf.auto" /tmp/resolv.conf
|
2016-10-12 08:33:16 +00:00
|
|
|
|
|
|
|
rm -f ${BASEDHCPSTAMPFILE}.${cfg}.*.dhcp
|
|
|
|
}
|
|
|
|
|
2018-05-07 22:37:48 +00:00
|
|
|
add_interface_trigger()
|
|
|
|
{
|
2024-02-15 08:43:09 +00:00
|
|
|
local interface ifname ignore
|
2018-05-07 22:37:48 +00:00
|
|
|
|
|
|
|
config_get interface "$1" interface
|
|
|
|
config_get_bool ignore "$1" ignore 0
|
2024-02-15 08:43:09 +00:00
|
|
|
network_get_device ifname "$interface" || ignore=0
|
2018-05-07 22:37:48 +00:00
|
|
|
|
2020-03-01 02:31:45 +00:00
|
|
|
[ -n "$interface" ] && [ $ignore -eq 0 ] && procd_add_interface_trigger "interface.*" "$interface" /etc/init.d/dnsmasq reload
|
2018-05-07 22:37:48 +00:00
|
|
|
}
|
|
|
|
|
2016-10-12 08:33:16 +00:00
|
|
|
service_triggers()
|
|
|
|
{
|
2017-12-19 14:08:48 +00:00
|
|
|
procd_add_reload_trigger "dhcp" "system"
|
2018-05-07 22:37:48 +00:00
|
|
|
|
|
|
|
config_load dhcp
|
|
|
|
config_foreach add_interface_trigger dhcp
|
2018-07-17 11:42:17 +00:00
|
|
|
config_foreach add_interface_trigger relay
|
|
|
|
}
|
|
|
|
|
|
|
|
boot()
|
|
|
|
{
|
|
|
|
BOOT=1
|
|
|
|
start "$@"
|
2016-10-12 08:33:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
start_service() {
|
|
|
|
local instance="$1"
|
|
|
|
local instance_found=0
|
2021-06-27 22:02:46 +00:00
|
|
|
local first_instance=""
|
2016-10-12 08:33:16 +00:00
|
|
|
|
|
|
|
. /lib/functions/network.sh
|
|
|
|
|
|
|
|
config_cb() {
|
|
|
|
local type="$1"
|
|
|
|
local name="$2"
|
|
|
|
if [ "$type" = "dnsmasq" ]; then
|
2020-03-01 02:31:45 +00:00
|
|
|
if [ -n "$instance" ] && [ "$instance" = "$name" ]; then
|
2016-10-12 08:33:16 +00:00
|
|
|
instance_found=1
|
|
|
|
fi
|
2021-06-27 22:02:46 +00:00
|
|
|
if [ -z "$DEFAULT_INSTANCE" ]; then
|
|
|
|
local disabled
|
|
|
|
config_get_bool disabled "$name" disabled 0
|
|
|
|
if [ "$disabled" -eq 0 ]; then
|
|
|
|
# First enabled section will be assigned default instance name.
|
|
|
|
# Unnamed sections get precedence over named sections.
|
|
|
|
if expr "$cfg" : 'cfg[0-9a-f]*$' >/dev/null = "9"; then # See uci_fixup_section.
|
|
|
|
DEFAULT_INSTANCE="$name" # Unnamed config section.
|
|
|
|
elif [ -z "$first_instance" ]; then
|
|
|
|
first_instance="$name"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
fi
|
2016-10-12 08:33:16 +00:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2021-06-27 22:02:46 +00:00
|
|
|
DEFAULT_INSTANCE=""
|
2016-10-12 08:33:16 +00:00
|
|
|
config_load dhcp
|
2021-06-27 22:02:46 +00:00
|
|
|
if [ -z "$DEFAULT_INSTANCE" ]; then
|
|
|
|
DEFAULT_INSTANCE="$first_instance" # No unnamed config section was found.
|
|
|
|
fi
|
2016-10-12 08:33:16 +00:00
|
|
|
|
|
|
|
if [ -n "$instance" ]; then
|
|
|
|
[ "$instance_found" -gt 0 ] || return
|
|
|
|
dnsmasq_start "$instance"
|
|
|
|
else
|
|
|
|
config_foreach dnsmasq_start dnsmasq
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2013-12-21 13:31:28 +00:00
|
|
|
reload_service() {
|
|
|
|
rc_procd start_service "$@"
|
2017-12-19 15:11:58 +00:00
|
|
|
procd_send_signal dnsmasq "$@"
|
2013-12-21 13:31:28 +00:00
|
|
|
}
|
|
|
|
|
2013-09-17 21:45:30 +00:00
|
|
|
stop_service() {
|
2016-10-12 08:33:16 +00:00
|
|
|
local instance="$1"
|
|
|
|
local instance_found=0
|
|
|
|
|
|
|
|
config_cb() {
|
|
|
|
local type="$1"
|
|
|
|
local name="$2"
|
|
|
|
if [ "$type" = "dnsmasq" ]; then
|
2020-03-01 02:31:45 +00:00
|
|
|
if [ -n "$instance" ] && [ "$instance" = "$name" ]; then
|
2016-10-12 08:33:16 +00:00
|
|
|
instance_found=1
|
|
|
|
fi
|
|
|
|
fi
|
2008-09-07 15:22:25 +00:00
|
|
|
}
|
2016-10-12 08:33:16 +00:00
|
|
|
|
|
|
|
config_load dhcp
|
|
|
|
|
|
|
|
if [ -n "$instance" ]; then
|
|
|
|
[ "$instance_found" -gt 0 ] || return
|
|
|
|
dnsmasq_stop "$instance"
|
|
|
|
else
|
|
|
|
config_foreach dnsmasq_stop dnsmasq
|
|
|
|
fi
|
2006-10-04 20:05:48 +00:00
|
|
|
}
|