mirror of
http://thekelleys.org.uk/git/dnsmasq.git
synced 2026-11-06 15:51:41 +00:00
Compare commits
132
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3705ec5592 | ||
|
|
b6769234bc | ||
|
|
214a046f47 | ||
|
|
b38da6b191 | ||
|
|
9621c16a78 | ||
|
|
3ae7f1ab0d | ||
|
|
39de57499e | ||
|
|
3c91bca943 | ||
|
|
76bceb06c4 | ||
|
|
6f23a0a75e | ||
|
|
06945c4b77 | ||
|
|
c5aa221e44 | ||
|
|
bfefd6e38c | ||
|
|
59d30390c9 | ||
|
|
51471cafa5 | ||
|
|
be73efc020 | ||
|
|
40595f80d9 | ||
|
|
8c8e5385fd | ||
|
|
3de7289bd6 | ||
|
|
febeea9d01 | ||
|
|
762a3f2430 | ||
|
|
6d35601da4 | ||
|
|
a827127c77 | ||
|
|
d4a6f3a93e | ||
|
|
86c15032ba | ||
|
|
12ddb2a4b9 | ||
|
|
db07664f2a | ||
|
|
1205fc3541 | ||
|
|
3a8ebcac77 | ||
|
|
729e54b386 | ||
|
|
a61dbc84bf | ||
|
|
3cbd4b0fc0 | ||
|
|
75965b19bd | ||
|
|
830459d3a1 | ||
|
|
aa9e9651a1 | ||
|
|
9142942483 | ||
|
|
68fe0d78bb | ||
|
|
c9d7b983c4 | ||
|
|
7c07dc3526 | ||
|
|
cd93d15ab1 | ||
|
|
34bbb7a1b8 | ||
|
|
b5820d1fd8 | ||
|
|
2748d4e901 | ||
|
|
63ba726e1f | ||
|
|
f1beb79429 | ||
|
|
cd4db8246e | ||
|
|
69877f565a | ||
|
|
744231d995 | ||
|
|
65c2d6afd6 | ||
|
|
b27b94cfdc | ||
|
|
b8b5b734b4 | ||
|
|
568fb02449 | ||
|
|
77ef9b2603 | ||
|
|
416390f996 | ||
|
|
24804b7431 | ||
|
|
1fe9d2ba45 | ||
|
|
3868066085 | ||
|
|
a889c554a7 | ||
|
|
ca8d04a8ff | ||
|
|
8b606543a3 | ||
|
|
d16b995756 | ||
|
|
768b45a023 | ||
|
|
3b5ddf37d9 | ||
|
|
9bbf098a97 | ||
|
|
6536187b62 | ||
|
|
50adf82199 | ||
|
|
1419de285f | ||
|
|
31c91b40bd | ||
|
|
1d6fe0ea84 | ||
|
|
d774add784 | ||
|
|
7500157cff | ||
|
|
52e6ad2761 | ||
|
|
bcb46809dc | ||
|
|
33635d8564 | ||
|
|
bd188e306a | ||
|
|
aaba66efbd | ||
|
|
597378cdf5 | ||
|
|
15dcdc824a | ||
|
|
86ee779e22 | ||
|
|
df242de5c6 | ||
|
|
b14aa762ff | ||
|
|
a78487a4df | ||
|
|
3a601d06bd | ||
|
|
047256a6d8 | ||
|
|
c244d92d8a | ||
|
|
138e1e2a2d | ||
|
|
153eeb070b | ||
|
|
a3c8b75972 | ||
|
|
042c64273d | ||
|
|
638c7c4d20 | ||
|
|
88fc6c8023 | ||
|
|
3fb10cd0d8 | ||
|
|
ff28a485cf | ||
|
|
1f0f86a0d0 | ||
|
|
2842972035 | ||
|
|
5a9eae429a | ||
|
|
9461807011 | ||
|
|
00be8b39e2 | ||
|
|
ef5aac95d4 | ||
|
|
ef8e930e42 | ||
|
|
eb92fb32b7 | ||
|
|
9a698434dd | ||
|
|
f5ef0f064c | ||
|
|
997982f78b | ||
|
|
7d6b68c5d7 | ||
|
|
137ae2e9cf | ||
|
|
5dc14b6e05 | ||
|
|
0427e37116 | ||
|
|
e5e8cae1ca | ||
|
|
7f42ca8af8 | ||
|
|
e4251eb13b | ||
|
|
5083876910 | ||
|
|
f172fdbb77 | ||
|
|
3822825e54 | ||
|
|
1da54210fc | ||
|
|
43a2a66531 | ||
|
|
e6841ea2e0 | ||
|
|
e939b45c9f | ||
|
|
e3068ed111 | ||
|
|
efbf80be58 | ||
|
|
022ad63f0c | ||
|
|
02f8754339 | ||
|
|
142456cfd0 | ||
|
|
207ce40db2 | ||
|
|
881eaa4dbc | ||
|
|
d6d7527c95 | ||
|
|
11b4be2036 | ||
|
|
3e306c1202 | ||
|
|
7f227a83f2 | ||
|
|
9ed3ee67ec | ||
|
|
1f9215f5f9 | ||
|
|
f52cfdd8c3 |
No files matched your search
+11
-4
@@ -7,8 +7,15 @@ src/.copts_*
|
|||||||
contrib/lease-tools/dhcp_lease_time
|
contrib/lease-tools/dhcp_lease_time
|
||||||
contrib/lease-tools/dhcp_release
|
contrib/lease-tools/dhcp_release
|
||||||
contrib/lease-tools/dhcp_release6
|
contrib/lease-tools/dhcp_release6
|
||||||
|
debian/.debhelper
|
||||||
|
debian/auto-build
|
||||||
|
debian/debhelper-build-stamp
|
||||||
debian/files
|
debian/files
|
||||||
debian/substvars
|
debian/*.substvars
|
||||||
debian/utils-substvars
|
debian/*.debhelper
|
||||||
debian/trees/
|
debian/*.log
|
||||||
debian/build/
|
debian/dnsmasq-base-lua/
|
||||||
|
debian/dnsmasq-base/
|
||||||
|
debian/dnsmasq-utils/
|
||||||
|
debian/dnsmasq/
|
||||||
|
debian/tmp
|
||||||
@@ -1,14 +1,95 @@
|
|||||||
|
version 2.90
|
||||||
|
Fix reversion in --rev-server introduced in 2.88 which
|
||||||
|
caused breakage if the prefix length is not exactly divisible
|
||||||
|
by 8 (IPv4) or 4 (IPv6).
|
||||||
|
|
||||||
|
Fix possible SEGV when there server(s) for a particular
|
||||||
|
domain are configured, but no server which is not qualified
|
||||||
|
for a particular domain. Thanks to Daniel Danzberger for
|
||||||
|
spotting this bug.
|
||||||
|
|
||||||
|
Set the default maximum DNS UDP packet sice to 1232. This
|
||||||
|
has been the recommended value since 2020 because it's the
|
||||||
|
largest value that avoid fragmentation, and fragmentation
|
||||||
|
is just not reliable on the modern internet, especially
|
||||||
|
for IPv6. It's still possible to override this with
|
||||||
|
--edns-packet-max for special circumstances.
|
||||||
|
|
||||||
|
Add --no-dhcpv4-interface and --no-dhcpv6-interface for
|
||||||
|
better control over which inetrfaces are providing DHCP service.
|
||||||
|
|
||||||
|
Fix issue with stale caching: After replying with stale data,
|
||||||
|
dnsmasq sends the query upstream to refresh the cache asynchronously
|
||||||
|
and sometimes sends the wrong packet: packet length can be wrong,
|
||||||
|
and if an EDE marking stale data is added to the answer that can
|
||||||
|
end up in the query also. This bug only seems to cause problems
|
||||||
|
when the usptream server is a DOH/DOT proxy. Thanks to Justin He
|
||||||
|
for the bug report.
|
||||||
|
|
||||||
|
Add configurable caching for arbitrary RR-types.
|
||||||
|
|
||||||
|
Add --filter-rr option, to filter arbitrary RR-types.
|
||||||
|
--filter-rr=ANY has a special meaning: it filters the
|
||||||
|
answers to queries for the ANY RR-type.
|
||||||
|
|
||||||
|
Add limits on the resources used to do DNSSEC validation.
|
||||||
|
DNSSEC introduces a potential CPU DoS, because a crafted domain
|
||||||
|
can force a validator to a large number of cryptographic
|
||||||
|
operations whilst attempting to do validation. When using TCP
|
||||||
|
transport a DNSKEY RRset contain thousands of members and any
|
||||||
|
RRset can have thousands of signatures. The potential number
|
||||||
|
of signature validations to follow the RFC for validation
|
||||||
|
for one RRset is the cross product of the keys and signatures,
|
||||||
|
so millions. In practice, the actual numbers are much lower,
|
||||||
|
so attacks can be mitigated by limiting the amount of
|
||||||
|
cryptographic "work" to a much lower amount. The actual
|
||||||
|
limits are number a signature validation fails per RRset(20),
|
||||||
|
number of signature validations and hash computations
|
||||||
|
per query(200), number of sub-queries to fetch DS and DNSKEY
|
||||||
|
RRsets per query(40), and the number of iterations in a
|
||||||
|
NSEC3 record(150). These values are sensible, but there is, as yet,
|
||||||
|
no standardisation on the values for a "conforming" domain, so a
|
||||||
|
new option --dnssec-limit is provided should they need to be altered.
|
||||||
|
The algorithm to validate DS records has also been altered to reduce
|
||||||
|
the maximum work from cross product of the number of DS records and
|
||||||
|
number of DNSKEYs to the cross product of the number of DS records
|
||||||
|
and supported DS digest types. As the number of DS digest types
|
||||||
|
is in single figures, this reduces the exposure.
|
||||||
|
|
||||||
|
Credit is due to Elias Heftrig, Haya Schulmann, Niklas Vogel,
|
||||||
|
and Michael Waidner from the German National Research Center for
|
||||||
|
Applied Cybersecurity ATHENE for finding this vulnerability.
|
||||||
|
|
||||||
|
CVE 2023-50387 and CVE 2023-50868 apply.
|
||||||
|
Note that the is a security vulnerablity only when DNSSEC validation
|
||||||
|
is enabled.
|
||||||
|
|
||||||
|
|
||||||
|
version 2.89
|
||||||
|
Fix bug introduced in 2.88 (commit fe91134b) which can result
|
||||||
|
in corruption of the DNS cache internal data structures and
|
||||||
|
logging of "cache internal error". This has only been seen
|
||||||
|
in one place in the wild, and it took considerable effort
|
||||||
|
to even generate a test case to reproduce it, but there's
|
||||||
|
no way to be sure it won't strike, and the effect is to break
|
||||||
|
the cache badly. Installations with DNSSEC enabled are more
|
||||||
|
likely to see the problem, but not running DNSSEC does not
|
||||||
|
guarantee that it won't happen. Thanks to Timo van Roermund
|
||||||
|
for reporting the bug and for his great efforts in chasing
|
||||||
|
it down.
|
||||||
|
|
||||||
|
|
||||||
version 2.88
|
version 2.88
|
||||||
Fix bug in --dynamic-host when an interface has /16 IPv4
|
Fix bug in --dynamic-host when an interface has /16 IPv4
|
||||||
address. Thanks to Mark Dietzer for spotting this.
|
address. Thanks to Mark Dietzer for spotting this.
|
||||||
|
|
||||||
Add --fast-dns-retry option. This gives dnsmasq the ability
|
Add --fast-dns-retry option. This gives dnsmasq the ability
|
||||||
to originate retries for upstream DNS queries itself, rather
|
to originate retries for upstream DNS queries itself, rather
|
||||||
than relying on the downstream client. This is most useful
|
than relying on the downstream client. This is most useful
|
||||||
when doing DNSSEC over unreliable upstream network. It comes
|
when doing DNSSEC over unreliable upstream networks. It comes
|
||||||
with some cost in memory usage and network bandwidth.
|
with some cost in memory usage and network bandwidth.
|
||||||
|
|
||||||
Add -use-stale-cache option. When set, if a DNS name exists
|
Add --use-stale-cache option. When set, if a DNS name exists
|
||||||
in the cache, but its time-to-live has expired, dnsmasq will
|
in the cache, but its time-to-live has expired, dnsmasq will
|
||||||
return the data anyway. (It attempts to refresh the
|
return the data anyway. (It attempts to refresh the
|
||||||
data with an upstream query after returning the stale data.)
|
data with an upstream query after returning the stale data.)
|
||||||
@@ -18,6 +99,12 @@ version 2.88
|
|||||||
flushed when its TTL expires, so the cache becomes
|
flushed when its TTL expires, so the cache becomes
|
||||||
strictly least-recently-used.
|
strictly least-recently-used.
|
||||||
|
|
||||||
|
Add --port-limit option which allows tuning for robustness in
|
||||||
|
the face of some upstream network errors. Thanks to
|
||||||
|
Prashant Kumar Singh, Ravi Nagayach and Mike Danilov,
|
||||||
|
all of Amazon Web Services, for their efforts in developing this
|
||||||
|
and the stale-cache and fast-retry options.
|
||||||
|
|
||||||
Make --hostsdir (but NOT --dhcp-hostsdir and --dhcp-optsdir)
|
Make --hostsdir (but NOT --dhcp-hostsdir and --dhcp-optsdir)
|
||||||
handle removal of whole files or entries within files.
|
handle removal of whole files or entries within files.
|
||||||
Thanks to Dominik Derigs for the initial patches for this.
|
Thanks to Dominik Derigs for the initial patches for this.
|
||||||
@@ -26,26 +113,44 @@ version 2.88
|
|||||||
servers being removed from the configuration when reloading
|
servers being removed from the configuration when reloading
|
||||||
server configuration from DBus, or re-reading /etc/resolv.conf
|
server configuration from DBus, or re-reading /etc/resolv.conf
|
||||||
Only servers from the same source should be replaced, but some
|
Only servers from the same source should be replaced, but some
|
||||||
servers from other sources (ie hard coded or another dynamic source)
|
servers from other sources (i.e., hard coded or another dynamic source)
|
||||||
could mysteriously disappear. Thanks to all reporting this,
|
could mysteriously disappear. Thanks to all reporting this,
|
||||||
but especially Christopher J. Masden who reduced the problem
|
but especially Christopher J. Madsen who reduced the problem
|
||||||
to an easily reproducible case which saved mucg labour in
|
to an easily reproducible case which saved much labour in
|
||||||
finding it.
|
finding it.
|
||||||
|
|
||||||
Add --no-round-robin option.
|
Add --no-round-robin option.
|
||||||
|
|
||||||
Allow domain names as well as IP addresses when specifying
|
Allow domain names as well as IP addresses when specifying
|
||||||
upstream DNS servers. There are some gotchas associated with this,
|
upstream DNS servers. There are some gotchas associated with this
|
||||||
(it will mysteriously fail to work if the dnsmasq instance
|
(it will mysteriously fail to work if the dnsmasq instance
|
||||||
being started is in the path from the system resolver to the DNS)
|
being started is in the path from the system resolver to the DNS),
|
||||||
and a seemingly sensible configuration like
|
and a seemingly sensible configuration like
|
||||||
--server=domain.name@1.2.3.4 is unactionable if domain.name
|
--server=domain.name@1.2.3.4 is unactionable if domain.name
|
||||||
only resolves to an IPv6 address). There are, however,
|
only resolves to an IPv6 address). There are, however,
|
||||||
cases where is can be useful. Thanks to Dominik Derigs for
|
cases where is can be useful. Thanks to Dominik Derigs for
|
||||||
the patch.
|
the patch.
|
||||||
|
|
||||||
|
Handle DS records for unsupported crypto algorithms correctly.
|
||||||
|
Such a DS, as long as it is validated, should allow answers
|
||||||
|
in the domain it attests to be returned as unvalidated, and not
|
||||||
|
as a validation error.
|
||||||
|
|
||||||
(version 2.87
|
Optimise reading large numbers of --server options. When re-reading
|
||||||
|
upstream servers from /etc/resolv.conf or other sources that
|
||||||
|
can change dnsmasq tries to avoid memory fragmentation by re-using
|
||||||
|
existing records that are being re-read unchanged. This involves
|
||||||
|
seaching all the server records for each new one installed.
|
||||||
|
During startup this search is pointless, and can cause long
|
||||||
|
start times with thousands of --server options because the work
|
||||||
|
needed is O(n^2). Handle this case more intelligently.
|
||||||
|
Thanks to Ye Zhou for spotting the problem and an initial patch.
|
||||||
|
|
||||||
|
If we detect that a DNS reply from upstream is malformed don't
|
||||||
|
return it to the requestor; send a SEVFAIL rcode instead.
|
||||||
|
|
||||||
|
|
||||||
|
version 2.87
|
||||||
Allow arbitrary prefix lengths in --rev-server and
|
Allow arbitrary prefix lengths in --rev-server and
|
||||||
--domain=....,local
|
--domain=....,local
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# dnsmasq is Copyright (c) 2000-2022 Simon Kelley
|
# dnsmasq is Copyright (c) 2000-2024 Simon Kelley
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
@@ -29,6 +29,7 @@ LDFLAGS =
|
|||||||
COPTS =
|
COPTS =
|
||||||
RPM_OPT_FLAGS =
|
RPM_OPT_FLAGS =
|
||||||
LIBS =
|
LIBS =
|
||||||
|
LUA = lua
|
||||||
|
|
||||||
#################################################################
|
#################################################################
|
||||||
|
|
||||||
@@ -60,8 +61,8 @@ idn2_cflags = `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_LIBIDN2 $(PKG_CONFI
|
|||||||
idn2_libs = `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_LIBIDN2 $(PKG_CONFIG) --libs libidn2`
|
idn2_libs = `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_LIBIDN2 $(PKG_CONFIG) --libs libidn2`
|
||||||
ct_cflags = `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_CONNTRACK $(PKG_CONFIG) --cflags libnetfilter_conntrack`
|
ct_cflags = `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_CONNTRACK $(PKG_CONFIG) --cflags libnetfilter_conntrack`
|
||||||
ct_libs = `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_CONNTRACK $(PKG_CONFIG) --libs libnetfilter_conntrack`
|
ct_libs = `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_CONNTRACK $(PKG_CONFIG) --libs libnetfilter_conntrack`
|
||||||
lua_cflags = `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_LUASCRIPT $(PKG_CONFIG) --cflags lua5.2`
|
lua_cflags = `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_LUASCRIPT $(PKG_CONFIG) --cflags $(LUA)`
|
||||||
lua_libs = `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_LUASCRIPT $(PKG_CONFIG) --libs lua5.2`
|
lua_libs = `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_LUASCRIPT $(PKG_CONFIG) --libs $(LUA)`
|
||||||
nettle_cflags = `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_DNSSEC $(PKG_CONFIG) --cflags 'nettle hogweed' \
|
nettle_cflags = `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_DNSSEC $(PKG_CONFIG) --cflags 'nettle hogweed' \
|
||||||
HAVE_CRYPTOHASH $(PKG_CONFIG) --cflags nettle \
|
HAVE_CRYPTOHASH $(PKG_CONFIG) --cflags nettle \
|
||||||
HAVE_NETTLEHASH $(PKG_CONFIG) --cflags nettle`
|
HAVE_NETTLEHASH $(PKG_CONFIG) --cflags nettle`
|
||||||
|
|||||||
@@ -44,6 +44,14 @@ SetFilterWin2KOption
|
|||||||
--------------------
|
--------------------
|
||||||
Takes boolean, sets or resets the --filterwin2k option.
|
Takes boolean, sets or resets the --filterwin2k option.
|
||||||
|
|
||||||
|
SetFilterA
|
||||||
|
------------------------
|
||||||
|
Takes boolean, sets or resets the --filter-A option.
|
||||||
|
|
||||||
|
SetFilterAAAA
|
||||||
|
------------------------
|
||||||
|
Takes boolean, sets or resets the --filter-AAAA option.
|
||||||
|
|
||||||
SetBogusPrivOption
|
SetBogusPrivOption
|
||||||
------------------
|
------------------
|
||||||
Takes boolean, sets or resets the --bogus-priv option.
|
Takes boolean, sets or resets the --bogus-priv option.
|
||||||
|
|||||||
Vendored
+105
-10
@@ -1,3 +1,108 @@
|
|||||||
|
dnsmasq (2.90-2) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ Sven Geuer ]
|
||||||
|
* Relax limits imposed by d/t/functions.d/ip-addr.patterns to allow for
|
||||||
|
successful tests on ci.debian.net.
|
||||||
|
|
||||||
|
-- Simon Kelley <simon@thekelleys.org.uk> Wed, 14 Feb 2024 11:33:14 +0000
|
||||||
|
|
||||||
|
dnsmasq (2.90-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ Simon Kelley ]
|
||||||
|
* New upstream. (closes: #1033165)
|
||||||
|
* Move hard-coding of Lua version from the upstream Makefile
|
||||||
|
to d/rules.
|
||||||
|
* Security fixes for Keytrap - DNSSEC validation CPU exhaustion.
|
||||||
|
CVE-2023-50387 and CVE-2023-50868
|
||||||
|
[ Sven Geuer ]
|
||||||
|
* Introduce autokpgtests per d/tests/* (closes: #1034135).
|
||||||
|
* Switch to dpkg-source 3.0 (quilt) format (closes: #1007041).
|
||||||
|
* doc.html: Add patch to eliminate privacy breaches leaving the Donations
|
||||||
|
paragraph as untouched as possible.
|
||||||
|
* Prepend dnsmasq. to default, init, preinst, postinst, prerm, postrm.
|
||||||
|
* Rename d/systemd.service to d/dnsmasq.service.
|
||||||
|
* Rename d/systemd@.service to d/dnsmasq@.service.
|
||||||
|
* Refactor d/rules to use the DH sequencer and fix major lintian issues
|
||||||
|
(closes: #844989, #1040923, #1063551).
|
||||||
|
Modified files:
|
||||||
|
- d/rules
|
||||||
|
Complete rewrite making use of debhelper and its tools, fixes lintian
|
||||||
|
warning debian-rules-sets-dpkg-architecture-variable.
|
||||||
|
- d/control
|
||||||
|
Build-Depends, Pre-Depends, Depends added or changed as needed, lintian
|
||||||
|
error depends-on-obsolete-package fixed.
|
||||||
|
- d/dnsmasq.default
|
||||||
|
ENABLED removed and comment changed to fix lintian error
|
||||||
|
init.d-script-should-always-start-service.
|
||||||
|
- d/dnsmasq.init
|
||||||
|
Remove handling of obsolete ENABLED flag.
|
||||||
|
Extract code used with System-V-style init and systemd into
|
||||||
|
d/init-system-common, extract code used with systemd only
|
||||||
|
into d/systemd-helper. This fixes lintian warning
|
||||||
|
systemd-service-file-wraps-init-script.
|
||||||
|
Drop workaround for hypothetically non-existent file
|
||||||
|
/lib/lsb/init-functions, it has been around for more than a decade.
|
||||||
|
- d/dnsmasq.service, d/dnsmasq@.service
|
||||||
|
Adapt these files to make use of init-system-common and systemd-helper.
|
||||||
|
- d/dnsmasq.{post,pre}{inst,rm}
|
||||||
|
Rely mostly on the script snippets created by the DH tools to get
|
||||||
|
things done, implicitly fixes the lintian warnings
|
||||||
|
maintainer-script-should-not-use-dpkg-maintscript-helper and
|
||||||
|
command-with-path-in-maintainer-script.
|
||||||
|
- d/resolvconf*
|
||||||
|
Change file mode bits to 0755, the installed files need it
|
||||||
|
New files:
|
||||||
|
- d/dnsmasq.{install,links,maintscript}
|
||||||
|
- d/dnsmasq-base.{dirs,docs,install}
|
||||||
|
- d/dnsmasq-base-lua.{dirs,docs,install,links}
|
||||||
|
- d/dnsmasq-utils.{install,manpages}
|
||||||
|
The DH tools use these to install what was scripted explicitly
|
||||||
|
in the previous version of the d/rules file,
|
||||||
|
lintian warning dbus-policy-in-etc fixed
|
||||||
|
- d/init-system-common
|
||||||
|
- d/systemd-helper
|
||||||
|
These files contain slightly modified code formerly part of in
|
||||||
|
d/dnsmasq.init.
|
||||||
|
Deleted files:
|
||||||
|
- d/*conffiles
|
||||||
|
- d/lintian-override
|
||||||
|
- d/installed-marker
|
||||||
|
These are not in use anymore.
|
||||||
|
* Deal with a removed conffile and changed links.
|
||||||
|
Modified files:
|
||||||
|
- d/dnsmasq-base.{postinst,postrm}
|
||||||
|
New files:
|
||||||
|
- d/dnsmasq-base.maintscript
|
||||||
|
- d/dnsmasq-base-lua.maintscript
|
||||||
|
* Add watch file and upstream's signing key.
|
||||||
|
New files:
|
||||||
|
- d/watch
|
||||||
|
- d/u/signing-key.asc
|
||||||
|
* Remove dependency on package adduser.
|
||||||
|
Modified files:
|
||||||
|
- d/control
|
||||||
|
- d/dnsmasq.post{inst,rm}
|
||||||
|
* Refactor d/copyright to comply with DEP 5 (closes: #966505).
|
||||||
|
* Remove trailing whitespace from various files under debian/.
|
||||||
|
* Bump Standards-Version to 4.6.2.
|
||||||
|
* Specify Rules-Requires-Root.
|
||||||
|
* Update http:// to https:// with Homepage, Vcs-Git and Vcs-Browser.
|
||||||
|
* Introduce d/u/metadata.
|
||||||
|
* Fix lintian issue duplicate-short-description.
|
||||||
|
* Fix lintian issue capitalization-error-in-description.
|
||||||
|
* Bump Lua version to 5.4 (closes: #1050750).
|
||||||
|
Modified files:
|
||||||
|
- d/control
|
||||||
|
- d/t/functions.d/log.patterns
|
||||||
|
|
||||||
|
-- Simon Kelley <simon@thekelleys.org.uk> Fri, 23 Jan 2024 22:52:01 +0000
|
||||||
|
|
||||||
|
dnsmasq (2.89-1) unstable; urgency=low
|
||||||
|
|
||||||
|
* New upstream.
|
||||||
|
|
||||||
|
-- Simon Kelley <simon@thekelleys.org.uk> Tue, 13 Jan 2023 21:57:01 +0000
|
||||||
|
|
||||||
dnsmasq (2.88-1) unstable; urgency=low
|
dnsmasq (2.88-1) unstable; urgency=low
|
||||||
|
|
||||||
* New upstream.
|
* New upstream.
|
||||||
@@ -1453,13 +1558,3 @@ dnsmasq (0.95-1) unstable; urgency=low
|
|||||||
* Initial Release.
|
* Initial Release.
|
||||||
|
|
||||||
-- Simon Kelley <simon@thkelleys.org.uk> Sat, 29 Aug 1998 20:27:27 -0400
|
-- Simon Kelley <simon@thkelleys.org.uk> Sat, 29 Aug 1998 20:27:27 -0400
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Vendored
-5
@@ -1,5 +0,0 @@
|
|||||||
/etc/init.d/dnsmasq
|
|
||||||
/etc/default/dnsmasq
|
|
||||||
/etc/dnsmasq.conf
|
|
||||||
/etc/resolvconf/update.d/dnsmasq
|
|
||||||
/etc/insserv.conf.d/dnsmasq
|
|
||||||
Vendored
+16
-14
@@ -1,25 +1,27 @@
|
|||||||
Source: dnsmasq
|
Source: dnsmasq
|
||||||
Section: net
|
Section: net
|
||||||
Priority: optional
|
Priority: optional
|
||||||
Build-depends: gettext, libnetfilter-conntrack-dev [linux-any],
|
Build-Depends: dh-exec, gettext, libnetfilter-conntrack-dev [linux-any],
|
||||||
libidn2-dev, libdbus-1-dev (>=0.61), libgmp-dev,
|
libidn2-dev, libdbus-1-dev (>=0.61), libgmp-dev,
|
||||||
nettle-dev (>=2.4-3), libbsd-dev [kfreebsd-any],
|
nettle-dev (>=2.4-3), libbsd-dev [kfreebsd-any],
|
||||||
liblua5.2-dev, dh-runit, debhelper-compat (= 10),
|
liblua5.4-dev, dh-runit, debhelper-compat (= 13),
|
||||||
pkg-config, libnftables-dev
|
pkg-config, libnftables-dev
|
||||||
Maintainer: Simon Kelley <simon@thekelleys.org.uk>
|
Maintainer: Simon Kelley <simon@thekelleys.org.uk>
|
||||||
Homepage: http://www.thekelleys.org.uk/dnsmasq/doc.html
|
Homepage: https://www.thekelleys.org.uk/dnsmasq/doc.html
|
||||||
Vcs-Git: http://thekelleys.org.uk/git/dnsmasq.git
|
Vcs-Git: https://thekelleys.org.uk/git/dnsmasq.git
|
||||||
Vcs-Browser: http://thekelleys.org.uk/gitweb/?p=dnsmasq.git
|
Vcs-Browser: https://thekelleys.org.uk/gitweb/?p=dnsmasq.git
|
||||||
Standards-Version: 3.9.8
|
Standards-Version: 4.6.2
|
||||||
|
Rules-Requires-Root: no
|
||||||
|
|
||||||
Package: dnsmasq
|
Package: dnsmasq
|
||||||
Architecture: all
|
Architecture: all
|
||||||
|
Pre-Depends: ${misc:Pre-Depends}
|
||||||
Depends: netbase, dnsmasq-base,
|
Depends: netbase, dnsmasq-base,
|
||||||
init-system-helpers (>= 1.18~), lsb-base (>= 3.0-6), ${misc:Depends}
|
${misc:Depends}
|
||||||
Suggests: resolvconf
|
Suggests: resolvconf
|
||||||
Breaks: ${runit:Breaks}
|
Breaks: ${runit:Breaks}
|
||||||
Conflicts: resolvconf (<<1.15), ${runit:Conflicts}
|
Conflicts: resolvconf (<<1.15), ${runit:Conflicts}
|
||||||
Description: Small caching DNS proxy and DHCP/TFTP server
|
Description: Small caching DNS proxy and DHCP/TFTP server - system daemon
|
||||||
Dnsmasq is a lightweight, easy to configure, DNS forwarder and DHCP
|
Dnsmasq is a lightweight, easy to configure, DNS forwarder and DHCP
|
||||||
server. It is designed to provide DNS and optionally, DHCP, to a
|
server. It is designed to provide DNS and optionally, DHCP, to a
|
||||||
small network. It can serve the names of local machines which are
|
small network. It can serve the names of local machines which are
|
||||||
@@ -31,34 +33,34 @@ Description: Small caching DNS proxy and DHCP/TFTP server
|
|||||||
|
|
||||||
Package: dnsmasq-base
|
Package: dnsmasq-base
|
||||||
Architecture: any
|
Architecture: any
|
||||||
Depends: adduser, ${shlibs:Depends}
|
Depends: ${misc:Depends}, ${shlibs:Depends}
|
||||||
Breaks: dnsmasq (<< 2.63-1~)
|
Breaks: dnsmasq (<< 2.63-1~)
|
||||||
Replaces: dnsmasq (<< 2.63-1~), dnsmasq-base
|
Replaces: dnsmasq (<< 2.63-1~), dnsmasq-base
|
||||||
Recommends: dns-root-data
|
Recommends: dns-root-data
|
||||||
Provides: dnsmasq-base
|
Provides: dnsmasq-base
|
||||||
Conflicts: dnsmasq-base-lua
|
Conflicts: dnsmasq-base-lua
|
||||||
Description: Small caching DNS proxy and DHCP/TFTP server
|
Description: Small caching DNS proxy and DHCP/TFTP server - executable
|
||||||
This package contains the dnsmasq executable and documentation, but
|
This package contains the dnsmasq executable and documentation, but
|
||||||
not the infrastructure required to run it as a system daemon. For
|
not the infrastructure required to run it as a system daemon. For
|
||||||
that, install the dnsmasq package.
|
that, install the dnsmasq package.
|
||||||
|
|
||||||
Package: dnsmasq-base-lua
|
Package: dnsmasq-base-lua
|
||||||
Architecture: any
|
Architecture: any
|
||||||
Depends: adduser, ${shlibs:Depends}
|
Depends: ${misc:Depends}, ${shlibs:Depends}
|
||||||
Breaks: dnsmasq (<< 2.63-1~)
|
Breaks: dnsmasq (<< 2.63-1~)
|
||||||
Replaces: dnsmasq (<< 2.63-1~), dnsmasq-base
|
Replaces: dnsmasq (<< 2.63-1~), dnsmasq-base
|
||||||
Recommends: dns-root-data
|
Recommends: dns-root-data
|
||||||
Provides: dnsmasq-base
|
Provides: dnsmasq-base
|
||||||
Conflicts: dnsmasq-base
|
Conflicts: dnsmasq-base
|
||||||
Description: Small caching DNS proxy and DHCP/TFTP server
|
Description: Small caching DNS proxy and DHCP/TFTP server - executable, Lua-enabled
|
||||||
This package contains the dnsmasq executable and documentation, but
|
This package contains the dnsmasq executable and documentation, but
|
||||||
not the infrastructure required to run it as a system daemon. For
|
not the infrastructure required to run it as a system daemon. For
|
||||||
that, install the dnsmasq package. This package is an alternative
|
that, install the dnsmasq package. This package is an alternative
|
||||||
to dnsmasq-base which includes the LUA interpreter.
|
to dnsmasq-base which includes the Lua interpreter.
|
||||||
|
|
||||||
Package: dnsmasq-utils
|
Package: dnsmasq-utils
|
||||||
Architecture: linux-any
|
Architecture: linux-any
|
||||||
Depends: ${shlibs:Depends}
|
Depends: ${misc:Depends}, ${shlibs:Depends}
|
||||||
Conflicts: dnsmasq (<<2.40)
|
Conflicts: dnsmasq (<<2.40)
|
||||||
Description: Utilities for manipulating DHCP leases
|
Description: Utilities for manipulating DHCP leases
|
||||||
Small utilities to query a DHCP server's lease database and
|
Small utilities to query a DHCP server's lease database and
|
||||||
|
|||||||
Vendored
+53
-16
@@ -1,21 +1,58 @@
|
|||||||
dnsmasq is Copyright (c) 2000-2021 Simon Kelley
|
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||||
|
Upstream-Name: dnsmasq
|
||||||
|
Upstream-Contact: Simon Kelley <simon@thekelleys.org.uk>
|
||||||
|
Source: https://thekelleys.org.uk/dnsmasq/
|
||||||
|
|
||||||
It was downloaded from: http://www.thekelleys.org.uk/dnsmasq/
|
Files: *
|
||||||
|
Copyright: 2000-2024 Simon Kelley <simon@thekelleys.org.uk>
|
||||||
|
License: GPL-2 or GPL-3
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
Files: src/dnssec.c
|
||||||
it under the terms of the GNU General Public License as published by
|
Copyright: 2012-2024 Simon Kelley <simon@thekelleys.org.uk>
|
||||||
the Free Software Foundation; version 2 dated June, 1991, or
|
2012 Giovanni Bajo <rasky@develer.com>
|
||||||
(at your option) version 3 dated 29 June, 2007.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
Files: debian/*
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
Copyright: 2004-2024 Simon Kelley <simon@thekelleys.org.uk>
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
2012 Lars Bahner <bahner@debian.org>
|
||||||
GNU General Public License for more details.
|
2024 Sven Geuer <debmaint@g-e-u-e-r.de>
|
||||||
|
License: GPL-2 or GPL-3
|
||||||
|
|
||||||
On Debian GNU/Linux systems, the text of the GNU general public license is
|
License: GPL-2
|
||||||
available in the file /usr/share/common-licenses/GPL-2 or
|
This program is free software; you can redistribute it
|
||||||
/usr/share/common-licenses/GPL-3
|
and/or modify it under the terms of the GNU General Public
|
||||||
|
License as published by the Free Software Foundation;
|
||||||
The Debian package of dnsmasq was created by Simon Kelley with assistance
|
version 2 dated June, 1991.
|
||||||
from Lars Bahner.
|
.
|
||||||
|
This program is distributed in the hope that it will be
|
||||||
|
useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||||
|
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. See the GNU General Public License for more
|
||||||
|
details.
|
||||||
|
.
|
||||||
|
You should have received a copy of the GNU General Public
|
||||||
|
License along with this program. If not, see
|
||||||
|
<https://www.gnu.org/licenses/gpl-2.0>.
|
||||||
|
.
|
||||||
|
On Debian systems, the full text of the GNU General Public
|
||||||
|
License can be found in the file
|
||||||
|
`/usr/share/common-licenses/GPL-2'.
|
||||||
|
|
||||||
|
License: GPL-3
|
||||||
|
This program is free software; you can redistribute it
|
||||||
|
and/or modify it under the terms of the GNU General Public
|
||||||
|
License as published by the Free Software Foundation;
|
||||||
|
version 3 dated 29 June, 2007.
|
||||||
|
.
|
||||||
|
This program is distributed in the hope that it will be
|
||||||
|
useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||||
|
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. See the GNU General Public License for more
|
||||||
|
details.
|
||||||
|
.
|
||||||
|
You should have received a copy of the GNU General Public
|
||||||
|
License along with this program. If not, see
|
||||||
|
<https://www.gnu.org/licenses/gpl-3.0>.
|
||||||
|
.
|
||||||
|
On Debian systems, the full text of the GNU General Public
|
||||||
|
License can be found in the file
|
||||||
|
`/usr/share/common-licenses/GPL-3'.
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
dnsmasq-base.dirs
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
dnsmasq-base.docs
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
#!/usr/bin/dh-exec
|
||||||
|
debian/dbus.conf => /usr/share/dbus-1/system.d/dnsmasq.conf
|
||||||
|
trust-anchors.conf /usr/share/dnsmasq-base-lua
|
||||||
Vendored
+2
@@ -0,0 +1,2 @@
|
|||||||
|
usr/share/dnsmasq-base-lua usr/share/dnsmasq-base
|
||||||
|
usr/share/doc/dnsmasq-base-lua usr/share/doc/dnsmasq-base
|
||||||
Vendored
+9
@@ -0,0 +1,9 @@
|
|||||||
|
# With the use of debhelper /usr/share/doc/dnsmasq-base-lua has become a
|
||||||
|
# directory as required in
|
||||||
|
# https://www.debian.org/doc/debian-policy/ch-docs.html#additional-documentation
|
||||||
|
# thus /usr/share/doc/dnsmasq-base will be a link from now onwards.
|
||||||
|
symlink_to_dir /usr/share/doc/dnsmasq-base-lua /usr/share/doc/dnsmasq-base 2.89-1.1~ dnsmasq-base-lua
|
||||||
|
dir_to_symlink /usr/share/doc/dnsmasq-base /usr/share/doc/dnsmasq-base-lua 2.89-1.1~ dnsmasq-base-lua
|
||||||
|
# Due to lintian warning dbus-policy-in-etc this file has been moved to
|
||||||
|
# /usr/share/dbus-1/system.d/dnsmasq.conf and thus is not a conffile any more.
|
||||||
|
rm_conffile /etc/dbus-1/system.d/dnsmasq.conf 2.89-1.1~ dnsmasq-base-lua
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
dnsmasq-base.postinst
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
dnsmasq-base.postrm
|
||||||
Vendored
-1
@@ -1 +0,0 @@
|
|||||||
/etc/dbus-1/system.d/dnsmasq.conf
|
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
/var/lib/misc
|
||||||
Vendored
+8
@@ -0,0 +1,8 @@
|
|||||||
|
doc.html
|
||||||
|
setup.html
|
||||||
|
dnsmasq.conf.example
|
||||||
|
FAQ
|
||||||
|
CHANGELOG.archive
|
||||||
|
dbus/DBus-interface
|
||||||
|
debian/systemd_howto
|
||||||
|
debian/readme
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
#!/usr/bin/dh-exec
|
||||||
|
debian/dbus.conf => /usr/share/dbus-1/system.d/dnsmasq.conf
|
||||||
|
trust-anchors.conf /usr/share/dnsmasq-base
|
||||||
Vendored
+3
@@ -0,0 +1,3 @@
|
|||||||
|
# Due to lintian warning dbus-policy-in-etc this file has been moved to
|
||||||
|
# /usr/share/dbus-1/system.d/dnsmasq.conf and thus is not a conffile any more.
|
||||||
|
rm_conffile /etc/dbus-1/system.d/dnsmasq.conf 2.89-1.1~ dnsmasq-base
|
||||||
Vendored
+10
-4
@@ -3,12 +3,15 @@ set -e
|
|||||||
|
|
||||||
# Create the dnsmasq user in dnsmasq-base, so that Dbus doesn't complain.
|
# Create the dnsmasq user in dnsmasq-base, so that Dbus doesn't complain.
|
||||||
|
|
||||||
# create a user to run as (code stolen from dovecot-common)
|
|
||||||
if [ "$1" = "configure" ]; then
|
if [ "$1" = "configure" ]; then
|
||||||
|
# Create the user to run as.
|
||||||
if [ -z "`id -u dnsmasq 2> /dev/null`" ]; then
|
if [ -z "`id -u dnsmasq 2> /dev/null`" ]; then
|
||||||
adduser --system --home /var/lib/misc --gecos "dnsmasq" \
|
useradd --system \
|
||||||
--no-create-home --disabled-password \
|
--gid nogroup \
|
||||||
--quiet dnsmasq || true
|
--comment dnsmasq \
|
||||||
|
--home-dir /var/lib/misc --no-create-home \
|
||||||
|
--shell /usr/sbin/nologin \
|
||||||
|
dnsmasq
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Make the directory where we keep the pid file - this
|
# Make the directory where we keep the pid file - this
|
||||||
@@ -22,3 +25,6 @@ if [ "$1" = "configure" ]; then
|
|||||||
chown dnsmasq:nogroup /run/dnsmasq
|
chown dnsmasq:nogroup /run/dnsmasq
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
#DEBHELPER#
|
||||||
|
|
||||||
Vendored
+4
-5
@@ -2,10 +2,9 @@
|
|||||||
set -e
|
set -e
|
||||||
|
|
||||||
if [ purge = "$1" ]; then
|
if [ purge = "$1" ]; then
|
||||||
if [ -x "$(command -v deluser)" ]; then
|
userdel dnsmasq
|
||||||
deluser --quiet --system dnsmasq > /dev/null || true
|
|
||||||
else
|
|
||||||
echo >&2 "not removing dnsmasq system account because deluser command was not found"
|
|
||||||
fi
|
|
||||||
rm -rf /run/dnsmasq
|
rm -rf /run/dnsmasq
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
#DEBHELPER#
|
||||||
|
|
||||||
Vendored
+3
@@ -0,0 +1,3 @@
|
|||||||
|
dhcp_lease_time /usr/bin
|
||||||
|
dhcp_release /usr/bin
|
||||||
|
dhcp_release6 /usr/bin
|
||||||
Vendored
+3
@@ -0,0 +1,3 @@
|
|||||||
|
dhcp_lease_time.1
|
||||||
|
dhcp_release.1
|
||||||
|
dhcp_release6.1
|
||||||
+4
-4
@@ -16,10 +16,10 @@
|
|||||||
#DOMAIN_SUFFIX=`dnsdomainname`
|
#DOMAIN_SUFFIX=`dnsdomainname`
|
||||||
#DNSMASQ_OPTS="--conf-file=/etc/dnsmasq.alt"
|
#DNSMASQ_OPTS="--conf-file=/etc/dnsmasq.alt"
|
||||||
|
|
||||||
# Whether or not to run the dnsmasq daemon; set to 0 to disable.
|
# The dnsmasq daemon is run by default conforming to the Debian Policy.
|
||||||
# Note that this is only valid when using SYSV init. For systemd,
|
# To disable the service,
|
||||||
# use "systemctl disable dnsmasq"
|
# for SYSV init, use "update-rc.d dnsmasq disable",
|
||||||
ENABLED=1
|
# for systemd, use "systemctl disable dnsmasq".
|
||||||
|
|
||||||
# By default search this drop directory for configuration options.
|
# By default search this drop directory for configuration options.
|
||||||
# Libvirt leaves a file here to make the system dnsmasq play nice.
|
# Libvirt leaves a file here to make the system dnsmasq play nice.
|
||||||
Vendored
+170
@@ -0,0 +1,170 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
### BEGIN INIT INFO
|
||||||
|
# Provides: dnsmasq
|
||||||
|
# Required-Start: $network $remote_fs $syslog
|
||||||
|
# Required-Stop: $network $remote_fs $syslog
|
||||||
|
# Default-Start: 2 3 4 5
|
||||||
|
# Default-Stop: 0 1 6
|
||||||
|
# Description: DHCP and DNS server
|
||||||
|
### END INIT INFO
|
||||||
|
|
||||||
|
# Don't exit on error status
|
||||||
|
set +e
|
||||||
|
|
||||||
|
# The following test ensures the dnsmasq service is not started, when the
|
||||||
|
# package 'dnsmasq' is removed but not purged, even if the dnsmasq-base
|
||||||
|
# package is still in place.
|
||||||
|
if [ -r /usr/share/dnsmasq/init-system-common ]; then
|
||||||
|
# 'dnsmasq' is installed: source initial code used also with systemd.
|
||||||
|
. /usr/share/dnsmasq/init-system-common
|
||||||
|
else
|
||||||
|
# 'dnsmasq' is removed but not purged, or damaged: do nothing.
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Double-check 'dnsmasq-base' or 'dnsmasq-base-lua' is installed.
|
||||||
|
test -x ${DAEMON} || exit 0
|
||||||
|
|
||||||
|
# Source the SysV init-functions which should always be available.
|
||||||
|
. /lib/lsb/init-functions || exit 0
|
||||||
|
|
||||||
|
start()
|
||||||
|
{
|
||||||
|
# Return
|
||||||
|
# 0 if daemon has been started
|
||||||
|
# 1 if daemon was already running
|
||||||
|
# 2 if daemon could not be started
|
||||||
|
|
||||||
|
# /run may be volatile, so we need to ensure that
|
||||||
|
# /run/dnsmasq exists here as well as in postinst
|
||||||
|
if [ ! -d /run/dnsmasq ]; then
|
||||||
|
mkdir /run/dnsmasq || { [ -d /run/dnsmasq ] || return 2 ; }
|
||||||
|
chown dnsmasq:nogroup /run/dnsmasq || return 2
|
||||||
|
fi
|
||||||
|
[ -x /sbin/restorecon ] && /sbin/restorecon /run/dnsmasq
|
||||||
|
|
||||||
|
start-stop-daemon --start --quiet --pidfile /run/dnsmasq/${NAME}${INSTANCE:+.${INSTANCE}}.pid --exec ${DAEMON} --test > /dev/null || return 1
|
||||||
|
start-stop-daemon --start --quiet --pidfile /run/dnsmasq/${NAME}${INSTANCE:+.${INSTANCE}}.pid --exec ${DAEMON} -- \
|
||||||
|
-x /run/dnsmasq/${NAME}${INSTANCE:+.${INSTANCE}}.pid \
|
||||||
|
${MAILHOSTNAME:+ -m ${MAILHOSTNAME}} \
|
||||||
|
${MAILTARGET:+ -t ${MAILTARGET}} \
|
||||||
|
${DNSMASQ_USER:+ -u ${DNSMASQ_USER}} \
|
||||||
|
${DNSMASQ_INTERFACES:+ ${DNSMASQ_INTERFACES}} \
|
||||||
|
${DHCP_LEASE:+ -l ${DHCP_LEASE}} \
|
||||||
|
${DOMAIN_SUFFIX:+ -s ${DOMAIN_SUFFIX}} \
|
||||||
|
${RESOLV_CONF:+ -r ${RESOLV_CONF}} \
|
||||||
|
${CACHESIZE:+ -c ${CACHESIZE}} \
|
||||||
|
${CONFIG_DIR:+ -7 ${CONFIG_DIR}} \
|
||||||
|
${DNSMASQ_OPTS:+ ${DNSMASQ_OPTS}} \
|
||||||
|
|| return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
stop()
|
||||||
|
{
|
||||||
|
# Return
|
||||||
|
# 0 if daemon has been stopped
|
||||||
|
# 1 if daemon was already stopped
|
||||||
|
# 2 if daemon could not be stopped
|
||||||
|
# other if a failure occurred
|
||||||
|
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile /run/dnsmasq/${NAME}${INSTANCE:+.${INSTANCE}}.pid --name ${NAME}
|
||||||
|
}
|
||||||
|
|
||||||
|
status()
|
||||||
|
{
|
||||||
|
# Return
|
||||||
|
# 0 if daemon is running
|
||||||
|
# 1 if daemon is dead and pid file exists
|
||||||
|
# 3 if daemon is not running
|
||||||
|
# 4 if daemon status is unknown
|
||||||
|
start-stop-daemon --start --quiet --pidfile /run/dnsmasq/${NAME}${INSTANCE:+.${INSTANCE}}.pid --exec ${DAEMON} --test > /dev/null
|
||||||
|
case "${?}" in
|
||||||
|
0) [ -e "/run/dnsmasq/${NAME}${INSTANCE:+.${INSTANCE}}.pid" ] && return 1 ; return 3 ;;
|
||||||
|
1) return 0 ;;
|
||||||
|
*) return 4 ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
case "${1}" in
|
||||||
|
start)
|
||||||
|
log_daemon_msg "Starting ${DESC}" "${NAME}${INSTANCE:+.${INSTANCE}}"
|
||||||
|
start
|
||||||
|
case "${?}" in
|
||||||
|
0)
|
||||||
|
log_end_msg 0
|
||||||
|
start_resolvconf
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
1)
|
||||||
|
log_success_msg "(already running)"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log_end_msg 1
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
stop_resolvconf
|
||||||
|
log_daemon_msg "Stopping ${DESC}" "${NAME}${INSTANCE:+.${INSTANCE}}"
|
||||||
|
stop
|
||||||
|
RETVAL="${?}"
|
||||||
|
case "${RETVAL}" in
|
||||||
|
0) log_end_msg 0 ; exit 0 ;;
|
||||||
|
1) log_warning_msg "(not running)" ; exit 0 ;;
|
||||||
|
*) log_end_msg 1; exit 1 ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
restart|force-reload)
|
||||||
|
checkconfig
|
||||||
|
if [ ${?} -ne 0 ]; then
|
||||||
|
NAME="configuration syntax check"
|
||||||
|
RETVAL="2"
|
||||||
|
else
|
||||||
|
stop_resolvconf
|
||||||
|
stop
|
||||||
|
RETVAL="${?}"
|
||||||
|
fi
|
||||||
|
log_daemon_msg "Restarting ${DESC}" "${NAME}${INSTANCE:+.${INSTANCE}}"
|
||||||
|
case "${RETVAL}" in
|
||||||
|
0|1)
|
||||||
|
sleep 2
|
||||||
|
start
|
||||||
|
case "${?}" in
|
||||||
|
0)
|
||||||
|
log_end_msg 0
|
||||||
|
start_resolvconf
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log_end_msg 1
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log_end_msg 1
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
status)
|
||||||
|
log_daemon_msg "Checking ${DESC}" "${NAME}${INSTANCE:+.${INSTANCE}}"
|
||||||
|
status
|
||||||
|
case "${?}" in
|
||||||
|
0) log_success_msg "(running)" ; exit 0 ;;
|
||||||
|
1) log_success_msg "(dead, pid file exists)" ; exit 1 ;;
|
||||||
|
3) log_success_msg "(not running)" ; exit 3 ;;
|
||||||
|
*) log_success_msg "(unknown)" ; exit 4 ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
dump-stats)
|
||||||
|
kill -s USR1 `cat /run/dnsmasq/${NAME}${INSTANCE:+.${INSTANCE}}.pid`
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: /etc/init.d/${NAME} {start|stop|restart|force-reload|dump-stats|status}" >&2
|
||||||
|
exit 3
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
#!/usr/bin/dh-exec
|
||||||
|
debian/resolvconf => /etc/resolvconf/update.d/dnsmasq
|
||||||
|
debian/resolvconf-package => /usr/lib/resolvconf/dpkg-event.d/dnsmasq
|
||||||
|
debian/init-system-common => /usr/share/dnsmasq/init-system-common
|
||||||
|
debian/systemd-helper => /usr/share/dnsmasq/systemd-helper
|
||||||
|
dnsmasq.conf.example => /etc/dnsmasq.conf
|
||||||
|
debian/readme.dnsmasq.d => /etc/dnsmasq.d/README
|
||||||
|
debian/insserv => /etc/insserv.conf.d/dnsmasq
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
usr/share/dnsmasq-base/trust-anchors.conf usr/share/dnsmasq/trust-anchors.conf
|
||||||
Vendored
+2
@@ -0,0 +1,2 @@
|
|||||||
|
# /usr/share/doc/dnsmasq was a symlink in versions < 2.81-1 (see #985282)
|
||||||
|
symlink_to_dir /usr/share/doc/dnsmasq dnsmasq-base 2.84-1.2~ dnsmasq
|
||||||
+8
-8
@@ -10,19 +10,19 @@ Type=forking
|
|||||||
PIDFile=/run/dnsmasq/dnsmasq.pid
|
PIDFile=/run/dnsmasq/dnsmasq.pid
|
||||||
|
|
||||||
# Test the config file and refuse starting if it is not valid.
|
# Test the config file and refuse starting if it is not valid.
|
||||||
ExecStartPre=/etc/init.d/dnsmasq checkconfig
|
ExecStartPre=/usr/share/dnsmasq/systemd-helper checkconfig
|
||||||
|
|
||||||
# We run dnsmasq via the /etc/init.d/dnsmasq script which acts as a
|
# We run dnsmasq via the /usr/share/dnsmasq/systemd-helper script which acts
|
||||||
# wrapper picking up extra configuration files and then execs dnsmasq
|
# as a wrapper picking up extra configuration files and then execs dnsmasq
|
||||||
# itself, when called with the "systemd-exec" function.
|
# itself, when called with the "exec" function.
|
||||||
ExecStart=/etc/init.d/dnsmasq systemd-exec
|
ExecStart=/usr/share/dnsmasq/systemd-helper exec
|
||||||
|
|
||||||
# The systemd-*-resolvconf functions configure (and deconfigure)
|
# The *-resolvconf functions configure (and deconfigure)
|
||||||
# resolvconf to work with the dnsmasq DNS server. They're called like
|
# resolvconf to work with the dnsmasq DNS server. They're called like
|
||||||
# this to get correct error handling (ie don't start-resolvconf if the
|
# this to get correct error handling (ie don't start-resolvconf if the
|
||||||
# dnsmasq daemon fails to start).
|
# dnsmasq daemon fails to start).
|
||||||
ExecStartPost=/etc/init.d/dnsmasq systemd-start-resolvconf
|
ExecStartPost=/usr/share/dnsmasq/systemd-helper start-resolvconf
|
||||||
ExecStop=/etc/init.d/dnsmasq systemd-stop-resolvconf
|
ExecStop=/usr/share/dnsmasq/systemd-helper stop-resolvconf
|
||||||
|
|
||||||
|
|
||||||
ExecReload=/bin/kill -HUP $MAINPID
|
ExecReload=/bin/kill -HUP $MAINPID
|
||||||
File renamed without changes.
+8
-8
@@ -10,19 +10,19 @@ Type=forking
|
|||||||
PIDFile=/run/dnsmasq/dnsmasq.%i.pid
|
PIDFile=/run/dnsmasq/dnsmasq.%i.pid
|
||||||
|
|
||||||
# Test the config file and refuse starting if it is not valid.
|
# Test the config file and refuse starting if it is not valid.
|
||||||
ExecStartPre=/etc/init.d/dnsmasq checkconfig "%i"
|
ExecStartPre=/usr/share/dnsmasq/systemd-helper checkconfig "%i"
|
||||||
|
|
||||||
# We run dnsmasq via the /etc/init.d/dnsmasq script which acts as a
|
# We run dnsmasq via the /usr/share/dnsmasq/systemd-helper script which acts
|
||||||
# wrapper picking up extra configuration files and then execs dnsmasq
|
# as a wrapper picking up extra configuration files and then execs dnsmasq
|
||||||
# itself, when called with the "systemd-exec" function.
|
# itself, when called with the "exec" function.
|
||||||
ExecStart=/etc/init.d/dnsmasq systemd-exec "%i"
|
ExecStart=/usr/share/dnsmasq/systemd-helper exec "%i"
|
||||||
|
|
||||||
# The systemd-*-resolvconf functions configure (and deconfigure)
|
# The *-resolvconf functions configure (and deconfigure)
|
||||||
# resolvconf to work with the dnsmasq DNS server. They're called like
|
# resolvconf to work with the dnsmasq DNS server. They're called like
|
||||||
# this to get correct error handling (ie don't start-resolvconf if the
|
# this to get correct error handling (ie don't start-resolvconf if the
|
||||||
# dnsmasq daemon fails to start).
|
# dnsmasq daemon fails to start).
|
||||||
ExecStartPost=/etc/init.d/dnsmasq systemd-start-resolvconf "%i"
|
ExecStartPost=/usr/share/dnsmasq/systemd-helper start-resolvconf "%i"
|
||||||
ExecStop=/etc/init.d/dnsmasq systemd-stop-resolvconf "%i"
|
ExecStop=/usr/share/dnsmasq/systemd-helper stop-resolvconf "%i"
|
||||||
|
|
||||||
|
|
||||||
ExecReload=/bin/kill -HUP $MAINPID
|
ExecReload=/bin/kill -HUP $MAINPID
|
||||||
Vendored
-325
@@ -1,325 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
### BEGIN INIT INFO
|
|
||||||
# Provides: dnsmasq
|
|
||||||
# Required-Start: $network $remote_fs $syslog
|
|
||||||
# Required-Stop: $network $remote_fs $syslog
|
|
||||||
# Default-Start: 2 3 4 5
|
|
||||||
# Default-Stop: 0 1 6
|
|
||||||
# Description: DHCP and DNS server
|
|
||||||
### END INIT INFO
|
|
||||||
|
|
||||||
# Don't exit on error status
|
|
||||||
set +e
|
|
||||||
|
|
||||||
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
|
|
||||||
DAEMON=/usr/sbin/dnsmasq
|
|
||||||
NAME=dnsmasq
|
|
||||||
DESC="DNS forwarder and DHCP server"
|
|
||||||
INSTANCE="${2}"
|
|
||||||
|
|
||||||
# Most configuration options in /etc/default/dnsmasq are deprecated
|
|
||||||
# but still honoured.
|
|
||||||
ENABLED=1
|
|
||||||
if [ -r /etc/default/${NAME}${INSTANCE:+.${INSTANCE}} ]; then
|
|
||||||
. /etc/default/${NAME}${INSTANCE:+.${INSTANCE}}
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Get the system locale, so that messages are in the correct language, and the
|
|
||||||
# charset for IDN is correct
|
|
||||||
if [ -r /etc/default/locale ]; then
|
|
||||||
. /etc/default/locale
|
|
||||||
export LANG
|
|
||||||
fi
|
|
||||||
|
|
||||||
# The following test ensures the dnsmasq service is not started, when the
|
|
||||||
# package 'dnsmasq' is removed but not purged, even if the dnsmasq-base
|
|
||||||
# package is still in place.
|
|
||||||
test -e /usr/share/dnsmasq/installed-marker || exit 0
|
|
||||||
|
|
||||||
test -x ${DAEMON} || exit 0
|
|
||||||
|
|
||||||
# Provide skeleton LSB log functions for backports which don't have LSB functions.
|
|
||||||
if [ -f /lib/lsb/init-functions ]; then
|
|
||||||
. /lib/lsb/init-functions
|
|
||||||
else
|
|
||||||
log_warning_msg () {
|
|
||||||
echo "${@}."
|
|
||||||
}
|
|
||||||
|
|
||||||
log_success_msg () {
|
|
||||||
echo "${@}."
|
|
||||||
}
|
|
||||||
|
|
||||||
log_daemon_msg () {
|
|
||||||
echo -n "${1}: ${2}"
|
|
||||||
}
|
|
||||||
|
|
||||||
log_end_msg () {
|
|
||||||
if [ "${1}" -eq 0 ]; then
|
|
||||||
echo "."
|
|
||||||
elif [ "${1}" -eq 255 ]; then
|
|
||||||
/bin/echo -e " (warning)."
|
|
||||||
else
|
|
||||||
/bin/echo -e " failed!"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
fi
|
|
||||||
|
|
||||||
# RESOLV_CONF:
|
|
||||||
# If the resolvconf package is installed then use the resolv conf file
|
|
||||||
# that it provides as the default. Otherwise use /etc/resolv.conf as
|
|
||||||
# the default.
|
|
||||||
#
|
|
||||||
# If IGNORE_RESOLVCONF is set in /etc/default/dnsmasq or an explicit
|
|
||||||
# filename is set there then this inhibits the use of the resolvconf-provided
|
|
||||||
# information.
|
|
||||||
#
|
|
||||||
# Note that if the resolvconf package is installed it is not possible to
|
|
||||||
# override it just by configuration in /etc/dnsmasq.conf, it is necessary
|
|
||||||
# to set IGNORE_RESOLVCONF=yes in /etc/default/dnsmasq.
|
|
||||||
|
|
||||||
if [ ! "${RESOLV_CONF}" ] &&
|
|
||||||
[ "${IGNORE_RESOLVCONF}" != "yes" ] &&
|
|
||||||
[ -x /sbin/resolvconf ]
|
|
||||||
then
|
|
||||||
RESOLV_CONF=/run/dnsmasq/resolv.conf
|
|
||||||
fi
|
|
||||||
|
|
||||||
for INTERFACE in ${DNSMASQ_INTERFACE}; do
|
|
||||||
DNSMASQ_INTERFACES="${DNSMASQ_INTERFACES} -i ${INTERFACE}"
|
|
||||||
done
|
|
||||||
|
|
||||||
for INTERFACE in ${DNSMASQ_EXCEPT}; do
|
|
||||||
DNSMASQ_INTERFACES="${DNSMASQ_INTERFACES} -I ${INTERFACE}"
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ ! "${DNSMASQ_USER}" ]; then
|
|
||||||
DNSMASQ_USER="dnsmasq"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# This tells dnsmasq to ignore DNS requests that don't come from a local network.
|
|
||||||
# It's automatically ignored if --interface --except-interface, --listen-address
|
|
||||||
# or --auth-server exist in the configuration, so for most installations, it will
|
|
||||||
# have no effect, but for otherwise-unconfigured installations, it stops dnsmasq
|
|
||||||
# from being vulnerable to DNS-reflection attacks.
|
|
||||||
|
|
||||||
DNSMASQ_OPTS="${DNSMASQ_OPTS} --local-service"
|
|
||||||
|
|
||||||
# If the dns-root-data package is installed, then the trust anchors will be
|
|
||||||
# available in ROOT_DS, in BIND zone-file format. Reformat as dnsmasq
|
|
||||||
# --trust-anchor options.
|
|
||||||
|
|
||||||
ROOT_DS="/usr/share/dns/root.ds"
|
|
||||||
|
|
||||||
if [ -f ${ROOT_DS} ]; then
|
|
||||||
DNSMASQ_OPTS="$DNSMASQ_OPTS `env LC_ALL=C sed -rne "s/^([.a-zA-Z0-9]+)([[:space:]]+[0-9]+)*([[:space:]]+IN)*[[:space:]]+DS[[:space:]]+/--trust-anchor=\1,/;s/[[:space:]]+/,/gp" $ROOT_DS | tr '\n' ' '`"
|
|
||||||
fi
|
|
||||||
|
|
||||||
start()
|
|
||||||
{
|
|
||||||
# Return
|
|
||||||
# 0 if daemon has been started
|
|
||||||
# 1 if daemon was already running
|
|
||||||
# 2 if daemon could not be started
|
|
||||||
|
|
||||||
# /run may be volatile, so we need to ensure that
|
|
||||||
# /run/dnsmasq exists here as well as in postinst
|
|
||||||
if [ ! -d /run/dnsmasq ]; then
|
|
||||||
mkdir /run/dnsmasq || { [ -d /run/dnsmasq ] || return 2 ; }
|
|
||||||
chown dnsmasq:nogroup /run/dnsmasq || return 2
|
|
||||||
fi
|
|
||||||
[ -x /sbin/restorecon ] && /sbin/restorecon /run/dnsmasq
|
|
||||||
|
|
||||||
start-stop-daemon --start --quiet --pidfile /run/dnsmasq/${NAME}${INSTANCE:+.${INSTANCE}}.pid --exec ${DAEMON} --test > /dev/null || return 1
|
|
||||||
start-stop-daemon --start --quiet --pidfile /run/dnsmasq/${NAME}${INSTANCE:+.${INSTANCE}}.pid --exec ${DAEMON} -- \
|
|
||||||
-x /run/dnsmasq/${NAME}${INSTANCE:+.${INSTANCE}}.pid \
|
|
||||||
${MAILHOSTNAME:+ -m ${MAILHOSTNAME}} \
|
|
||||||
${MAILTARGET:+ -t ${MAILTARGET}} \
|
|
||||||
${DNSMASQ_USER:+ -u ${DNSMASQ_USER}} \
|
|
||||||
${DNSMASQ_INTERFACES:+ ${DNSMASQ_INTERFACES}} \
|
|
||||||
${DHCP_LEASE:+ -l ${DHCP_LEASE}} \
|
|
||||||
${DOMAIN_SUFFIX:+ -s ${DOMAIN_SUFFIX}} \
|
|
||||||
${RESOLV_CONF:+ -r ${RESOLV_CONF}} \
|
|
||||||
${CACHESIZE:+ -c ${CACHESIZE}} \
|
|
||||||
${CONFIG_DIR:+ -7 ${CONFIG_DIR}} \
|
|
||||||
${DNSMASQ_OPTS:+ ${DNSMASQ_OPTS}} \
|
|
||||||
|| return 2
|
|
||||||
}
|
|
||||||
|
|
||||||
start_resolvconf()
|
|
||||||
{
|
|
||||||
# If interface "lo" is explicitly disabled in /etc/default/dnsmasq
|
|
||||||
# Then dnsmasq won't be providing local DNS, so don't add it to
|
|
||||||
# the resolvconf server set.
|
|
||||||
for interface in ${DNSMASQ_EXCEPT}; do
|
|
||||||
[ ${interface} = lo ] && return
|
|
||||||
done
|
|
||||||
|
|
||||||
# Also skip this if DNS functionality is disabled in /etc/dnsmasq.conf
|
|
||||||
if grep -qs '^port=0' /etc/dnsmasq.conf; then
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -x /sbin/resolvconf ] ; then
|
|
||||||
echo "nameserver 127.0.0.1" | /sbin/resolvconf -a lo.${NAME}${INSTANCE:+.${INSTANCE}}
|
|
||||||
fi
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
stop()
|
|
||||||
{
|
|
||||||
# Return
|
|
||||||
# 0 if daemon has been stopped
|
|
||||||
# 1 if daemon was already stopped
|
|
||||||
# 2 if daemon could not be stopped
|
|
||||||
# other if a failure occurred
|
|
||||||
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile /run/dnsmasq/${NAME}${INSTANCE:+.${INSTANCE}}.pid --name ${NAME}
|
|
||||||
}
|
|
||||||
|
|
||||||
stop_resolvconf()
|
|
||||||
{
|
|
||||||
if [ -x /sbin/resolvconf ] ; then
|
|
||||||
/sbin/resolvconf -d lo.${NAME}${INSTANCE:+.${INSTANCE}}
|
|
||||||
fi
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
status()
|
|
||||||
{
|
|
||||||
# Return
|
|
||||||
# 0 if daemon is running
|
|
||||||
# 1 if daemon is dead and pid file exists
|
|
||||||
# 3 if daemon is not running
|
|
||||||
# 4 if daemon status is unknown
|
|
||||||
start-stop-daemon --start --quiet --pidfile /run/dnsmasq/${NAME}${INSTANCE:+.${INSTANCE}}.pid --exec ${DAEMON} --test > /dev/null
|
|
||||||
case "${?}" in
|
|
||||||
0) [ -e "/run/dnsmasq/${NAME}${INSTANCE:+.${INSTANCE}}.pid" ] && return 1 ; return 3 ;;
|
|
||||||
1) return 0 ;;
|
|
||||||
*) return 4 ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
case "${1}" in
|
|
||||||
start)
|
|
||||||
test "${ENABLED}" != "0" || exit 0
|
|
||||||
log_daemon_msg "Starting ${DESC}" "${NAME}${INSTANCE:+.${INSTANCE}}"
|
|
||||||
start
|
|
||||||
case "${?}" in
|
|
||||||
0)
|
|
||||||
log_end_msg 0
|
|
||||||
start_resolvconf
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
1)
|
|
||||||
log_success_msg "(already running)"
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
log_end_msg 1
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
stop)
|
|
||||||
stop_resolvconf
|
|
||||||
if [ "${ENABLED}" != "0" ]; then
|
|
||||||
log_daemon_msg "Stopping ${DESC}" "${NAME}${INSTANCE:+.${INSTANCE}}"
|
|
||||||
fi
|
|
||||||
stop
|
|
||||||
RETVAL="${?}"
|
|
||||||
if [ "${ENABLED}" = "0" ]; then
|
|
||||||
case "${RETVAL}" in
|
|
||||||
0) log_daemon_msg "Stopping ${DESC}" "${NAME}${INSTANCE:+.${INSTANCE}}"; log_end_msg 0 ;;
|
|
||||||
esac
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
case "${RETVAL}" in
|
|
||||||
0) log_end_msg 0 ; exit 0 ;;
|
|
||||||
1) log_warning_msg "(not running)" ; exit 0 ;;
|
|
||||||
*) log_end_msg 1; exit 1 ;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
checkconfig)
|
|
||||||
${DAEMON} --test ${CONFIG_DIR:+ -7 ${CONFIG_DIR}} ${DNSMASQ_OPTS:+ ${DNSMASQ_OPTS}} >/dev/null 2>&1
|
|
||||||
RETVAL="${?}"
|
|
||||||
exit ${RETVAL}
|
|
||||||
;;
|
|
||||||
restart|force-reload)
|
|
||||||
test "${ENABLED}" != "0" || exit 1
|
|
||||||
${DAEMON} --test ${CONFIG_DIR:+ -7 ${CONFIG_DIR}} ${DNSMASQ_OPTS:+ ${DNSMASQ_OPTS}} >/dev/null 2>&1
|
|
||||||
if [ ${?} -ne 0 ]; then
|
|
||||||
NAME="configuration syntax check"
|
|
||||||
RETVAL="2"
|
|
||||||
else
|
|
||||||
stop_resolvconf
|
|
||||||
stop
|
|
||||||
RETVAL="${?}"
|
|
||||||
fi
|
|
||||||
log_daemon_msg "Restarting ${DESC}" "${NAME}${INSTANCE:+.${INSTANCE}}"
|
|
||||||
case "${RETVAL}" in
|
|
||||||
0|1)
|
|
||||||
sleep 2
|
|
||||||
start
|
|
||||||
case "${?}" in
|
|
||||||
0)
|
|
||||||
log_end_msg 0
|
|
||||||
start_resolvconf
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
log_end_msg 1
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
log_end_msg 1
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
status)
|
|
||||||
log_daemon_msg "Checking ${DESC}" "${NAME}${INSTANCE:+.${INSTANCE}}"
|
|
||||||
status
|
|
||||||
case "${?}" in
|
|
||||||
0) log_success_msg "(running)" ; exit 0 ;;
|
|
||||||
1) log_success_msg "(dead, pid file exists)" ; exit 1 ;;
|
|
||||||
3) log_success_msg "(not running)" ; exit 3 ;;
|
|
||||||
*) log_success_msg "(unknown)" ; exit 4 ;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
dump-stats)
|
|
||||||
kill -s USR1 `cat /run/dnsmasq/${NAME}${INSTANCE:+.${INSTANCE}}.pid`
|
|
||||||
;;
|
|
||||||
systemd-start-resolvconf)
|
|
||||||
start_resolvconf
|
|
||||||
;;
|
|
||||||
systemd-stop-resolvconf)
|
|
||||||
stop_resolvconf
|
|
||||||
;;
|
|
||||||
systemd-exec)
|
|
||||||
# /run may be volatile, so we need to ensure that
|
|
||||||
# /run/dnsmasq exists here as well as in postinst
|
|
||||||
if [ ! -d /run/dnsmasq ]; then
|
|
||||||
mkdir /run/dnsmasq || { [ -d /run/dnsmasq ] || return 2 ; }
|
|
||||||
chown dnsmasq:nogroup /run/dnsmasq || return 2
|
|
||||||
fi
|
|
||||||
exec ${DAEMON} -x /run/dnsmasq/${NAME}${INSTANCE:+.${INSTANCE}}.pid \
|
|
||||||
${MAILHOSTNAME:+ -m ${MAILHOSTNAME}} \
|
|
||||||
${MAILTARGET:+ -t ${MAILTARGET}} \
|
|
||||||
${DNSMASQ_USER:+ -u ${DNSMASQ_USER}} \
|
|
||||||
${DNSMASQ_INTERFACES:+ ${DNSMASQ_INTERFACES}} \
|
|
||||||
${DHCP_LEASE:+ -l ${DHCP_LEASE}} \
|
|
||||||
${DOMAIN_SUFFIX:+ -s ${DOMAIN_SUFFIX}} \
|
|
||||||
${RESOLV_CONF:+ -r ${RESOLV_CONF}} \
|
|
||||||
${CACHESIZE:+ -c ${CACHESIZE}} \
|
|
||||||
${CONFIG_DIR:+ -7 ${CONFIG_DIR}} \
|
|
||||||
${DNSMASQ_OPTS:+ ${DNSMASQ_OPTS}}
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Usage: /etc/init.d/${NAME} {start|stop|restart|force-reload|dump-stats|status}" >&2
|
|
||||||
exit 3
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
Vendored
+102
@@ -0,0 +1,102 @@
|
|||||||
|
# -*- shell-script -*-
|
||||||
|
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
|
||||||
|
DAEMON=/usr/sbin/dnsmasq
|
||||||
|
NAME=dnsmasq
|
||||||
|
DESC="DNS forwarder and DHCP server"
|
||||||
|
INSTANCE="${2}"
|
||||||
|
|
||||||
|
# Most configuration options in /etc/default/dnsmasq are deprecated
|
||||||
|
# but still honoured.
|
||||||
|
if [ -r /etc/default/${NAME}${INSTANCE:+.${INSTANCE}} ]; then
|
||||||
|
. /etc/default/${NAME}${INSTANCE:+.${INSTANCE}}
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Get the system locale, so that messages are in the correct language, and the
|
||||||
|
# charset for IDN is correct
|
||||||
|
if [ -r /etc/default/locale ]; then
|
||||||
|
. /etc/default/locale
|
||||||
|
export LANG
|
||||||
|
fi
|
||||||
|
|
||||||
|
# RESOLV_CONF:
|
||||||
|
# If the resolvconf package is installed then use the resolv conf file
|
||||||
|
# that it provides as the default. Otherwise use /etc/resolv.conf as
|
||||||
|
# the default.
|
||||||
|
#
|
||||||
|
# If IGNORE_RESOLVCONF is set in /etc/default/dnsmasq or an explicit
|
||||||
|
# filename is set there then this inhibits the use of the resolvconf-provided
|
||||||
|
# information.
|
||||||
|
#
|
||||||
|
# Note that if the resolvconf package is installed it is not possible to
|
||||||
|
# override it just by configuration in /etc/dnsmasq.conf, it is necessary
|
||||||
|
# to set IGNORE_RESOLVCONF=yes in /etc/default/dnsmasq.
|
||||||
|
|
||||||
|
if [ ! "${RESOLV_CONF}" ] &&
|
||||||
|
[ "${IGNORE_RESOLVCONF}" != "yes" ] &&
|
||||||
|
[ -x /sbin/resolvconf ]
|
||||||
|
then
|
||||||
|
RESOLV_CONF=/run/dnsmasq/resolv.conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
for INTERFACE in ${DNSMASQ_INTERFACE}; do
|
||||||
|
DNSMASQ_INTERFACES="${DNSMASQ_INTERFACES} -i ${INTERFACE}"
|
||||||
|
done
|
||||||
|
|
||||||
|
for INTERFACE in ${DNSMASQ_EXCEPT}; do
|
||||||
|
DNSMASQ_INTERFACES="${DNSMASQ_INTERFACES} -I ${INTERFACE}"
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ ! "${DNSMASQ_USER}" ]; then
|
||||||
|
DNSMASQ_USER="dnsmasq"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# This tells dnsmasq to ignore DNS requests that don't come from a local network.
|
||||||
|
# It's automatically ignored if --interface --except-interface, --listen-address
|
||||||
|
# or --auth-server exist in the configuration, so for most installations, it will
|
||||||
|
# have no effect, but for otherwise-unconfigured installations, it stops dnsmasq
|
||||||
|
# from being vulnerable to DNS-reflection attacks.
|
||||||
|
|
||||||
|
DNSMASQ_OPTS="${DNSMASQ_OPTS} --local-service"
|
||||||
|
|
||||||
|
# If the dns-root-data package is installed, then the trust anchors will be
|
||||||
|
# available in ROOT_DS, in BIND zone-file format. Reformat as dnsmasq
|
||||||
|
# --trust-anchor options.
|
||||||
|
|
||||||
|
ROOT_DS="/usr/share/dns/root.ds"
|
||||||
|
|
||||||
|
if [ -f ${ROOT_DS} ]; then
|
||||||
|
DNSMASQ_OPTS="$DNSMASQ_OPTS `env LC_ALL=C sed -rne "s/^([.a-zA-Z0-9]+)([[:space:]]+[0-9]+)*([[:space:]]+IN)*[[:space:]]+DS[[:space:]]+/--trust-anchor=\1,/;s/[[:space:]]+/,/gp" $ROOT_DS | tr '\n' ' '`"
|
||||||
|
fi
|
||||||
|
|
||||||
|
checkconfig()
|
||||||
|
{
|
||||||
|
${DAEMON} --test ${CONFIG_DIR:+ -7 ${CONFIG_DIR}} ${DNSMASQ_OPTS:+ ${DNSMASQ_OPTS}} >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
start_resolvconf()
|
||||||
|
{
|
||||||
|
# If interface "lo" is explicitly disabled in /etc/default/dnsmasq
|
||||||
|
# Then dnsmasq won't be providing local DNS, so don't add it to
|
||||||
|
# the resolvconf server set.
|
||||||
|
for interface in ${DNSMASQ_EXCEPT}; do
|
||||||
|
[ ${interface} = lo ] && return
|
||||||
|
done
|
||||||
|
|
||||||
|
# Also skip this if DNS functionality is disabled in /etc/dnsmasq.conf
|
||||||
|
if grep -qs '^port=0' /etc/dnsmasq.conf; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -x /sbin/resolvconf ] ; then
|
||||||
|
echo "nameserver 127.0.0.1" | /sbin/resolvconf -a lo.${NAME}${INSTANCE:+.${INSTANCE}}
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_resolvconf()
|
||||||
|
{
|
||||||
|
if [ -x /sbin/resolvconf ] ; then
|
||||||
|
/sbin/resolvconf -d lo.${NAME}${INSTANCE:+.${INSTANCE}}
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
Vendored
-2
@@ -1,2 +0,0 @@
|
|||||||
# This file indicates dnsmasq (and not just dnsmasq-base) is installed.
|
|
||||||
# It is an implementation detail of the dnsmasq init script.
|
|
||||||
Vendored
-3
@@ -1,3 +0,0 @@
|
|||||||
# dnsmasq-base and dnsmasq-base-lua are mutually exclusive and both
|
|
||||||
# provide /usr/share/doc/dnsmasq-base
|
|
||||||
dnsmasq-base-lua binary: usr-share-doc-symlink-without-dependency dnsmasq-base
|
|
||||||
+40
@@ -0,0 +1,40 @@
|
|||||||
|
Description: Remove or replace privacy breaching logos and forms
|
||||||
|
Lintian complains about these by issuing the tags privacy-breach-logo and
|
||||||
|
privacy-breach-donation.
|
||||||
|
Forwarded: not-needed
|
||||||
|
Author: Sven Geuer <debmaint@g-e-u-e-r.de>
|
||||||
|
Last-Update: 2023-11-18
|
||||||
|
|
||||||
|
--- a/doc.html
|
||||||
|
+++ b/doc.html
|
||||||
|
@@ -1,14 +1,11 @@
|
||||||
|
<HTML>
|
||||||
|
<HEAD>
|
||||||
|
<TITLE> Dnsmasq - network services for small networks.</TITLE>
|
||||||
|
-<link rel="icon" href="http://www.thekelleys.org.uk/dnsmasq/images/favicon.ico">
|
||||||
|
</HEAD>
|
||||||
|
<BODY BGCOLOR="WHITE">
|
||||||
|
<table width="100%" border="0" cellpadding="0" cellspacing="0">
|
||||||
|
<tr>
|
||||||
|
-<td align="left" valign="middle"><img border="0" src="http://www.thekelleys.org.uk/dnsmasq/images/icon.png" /></td>
|
||||||
|
<td align="middle" valign="middle"><h1>Dnsmasq</h1></td>
|
||||||
|
-<td align="right" valign="middle"><img border="0" src="http://www.thekelleys.org.uk/dnsmasq/images/icon.png" /></td></tr>
|
||||||
|
</table>
|
||||||
|
Dnsmasq provides network infrastructure for small networks: DNS, DHCP, router advertisement and network boot. It is designed to be
|
||||||
|
lightweight and have a small footprint, suitable for resource constrained routers and firewalls. It has also been widely used
|
||||||
|
@@ -88,14 +85,6 @@
|
||||||
|
Dnsmasq is mainly written and maintained by Simon Kelley. For most of its life, dnsmasq has been a spare-time project.
|
||||||
|
These days I'm working on it as my main activity.
|
||||||
|
I don't have an employer or anyone who pays me regularly to work on dnsmasq. If you'd like to make
|
||||||
|
-a contribution towards my expenses, please use the donation button below.
|
||||||
|
-<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
|
||||||
|
-<input type="hidden" name="cmd" value="_s-xclick">
|
||||||
|
-<input type="hidden" name="hosted_button_id" value="V3X9GVW5GX6DA">
|
||||||
|
-<input type="image" src="https://www.paypalobjects.com/en_US/GB/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal – The safer, easier way to pay online.">
|
||||||
|
-<img alt="" border="0" src="https://www.paypalobjects.com/en_GB/i/scr/pixel.gif" width="1" height="1">
|
||||||
|
-</form>
|
||||||
|
-
|
||||||
|
-
|
||||||
|
+a contribution towards my expenses, please use the donation button at <A HREF="https://www.thekelleys.org.uk/dnsmasq/doc.html">the project's home page</A>.
|
||||||
|
</BODY>
|
||||||
|
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
eliminate-privacy-breaches.patch
|
||||||
Vendored
-41
@@ -1,41 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# /usr/share/doc/dnsmasq was a symlink in versions < 2.81-1 (see #985282)
|
|
||||||
dpkg-maintscript-helper symlink_to_dir /usr/share/doc/dnsmasq dnsmasq-base 2.84-1.2~ dnsmasq -- "$@"
|
|
||||||
|
|
||||||
# Code copied from dh_systemd_enable ----------------------
|
|
||||||
# This will only remove masks created by d-s-h on package removal.
|
|
||||||
deb-systemd-helper unmask dnsmasq.service >/dev/null || true
|
|
||||||
|
|
||||||
# was-enabled defaults to true, so new installations run enable.
|
|
||||||
if deb-systemd-helper --quiet was-enabled dnsmasq.service; then
|
|
||||||
# Enables the unit on first installation, creates new
|
|
||||||
# symlinks on upgrades if the unit file has changed.
|
|
||||||
deb-systemd-helper enable dnsmasq.service >/dev/null || true
|
|
||||||
else
|
|
||||||
# Update the statefile to add new symlinks (if any), which need to be
|
|
||||||
# cleaned up on purge. Also remove old symlinks.
|
|
||||||
deb-systemd-helper update-state dnsmasq.service >/dev/null || true
|
|
||||||
fi
|
|
||||||
# End code copied from dh_systemd_enable ------------------
|
|
||||||
|
|
||||||
if [ -x /etc/init.d/dnsmasq ]; then
|
|
||||||
update-rc.d dnsmasq defaults 15 85 >/dev/null
|
|
||||||
|
|
||||||
if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ]; then
|
|
||||||
if [ -e /run/dnsmasq/dnsmasq.pid ]; then
|
|
||||||
ACTION=restart
|
|
||||||
else
|
|
||||||
ACTION=start
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -x /usr/sbin/invoke-rc.d ] ; then
|
|
||||||
invoke-rc.d dnsmasq $ACTION || true
|
|
||||||
else
|
|
||||||
/etc/init.d/dnsmasq $ACTION || true
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
Vendored
-25
@@ -1,25 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# /usr/share/doc/dnsmasq was a symlink in versions < 2.81-1 (see #985282)
|
|
||||||
dpkg-maintscript-helper symlink_to_dir /usr/share/doc/dnsmasq dnsmasq-base 2.84-1.2~ dnsmasq -- "$@"
|
|
||||||
|
|
||||||
if [ purge = "$1" ]; then
|
|
||||||
update-rc.d dnsmasq remove >/dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Code copied from dh_systemd_enable ----------------------
|
|
||||||
if [ "$1" = "remove" ]; then
|
|
||||||
if [ -x "/usr/bin/deb-systemd-helper" ]; then
|
|
||||||
deb-systemd-helper mask dnsmasq.service >/dev/null
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$1" = "purge" ]; then
|
|
||||||
if [ -x "/usr/bin/deb-systemd-helper" ]; then
|
|
||||||
deb-systemd-helper purge dnsmasq.service >/dev/null
|
|
||||||
deb-systemd-helper unmask dnsmasq.service >/dev/null
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
# End code copied from dh_systemd_enable ------------------
|
|
||||||
|
|
||||||
Vendored
-5
@@ -1,5 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# /usr/share/doc/dnsmasq was a symlink in versions < 2.81-1 (see #985282)
|
|
||||||
dpkg-maintscript-helper symlink_to_dir /usr/share/doc/dnsmasq dnsmasq-base 2.84-1.2~ dnsmasq -- "$@"
|
|
||||||
Vendored
-14
@@ -1,14 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
set -e
|
|
||||||
|
|
||||||
if [ "$1" = "remove" ]; then
|
|
||||||
if [ -x /usr/sbin/invoke-rc.d ] ; then
|
|
||||||
invoke-rc.d dnsmasq stop || true
|
|
||||||
else
|
|
||||||
/etc/init.d/dnsmasq stop || true
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
|
|
||||||
|
|
||||||
File mode changed.
File mode changed.
Vendored
+77
-259
@@ -1,309 +1,127 @@
|
|||||||
#!/usr/bin/make -f
|
#!/usr/bin/make -f
|
||||||
# debian/rules file - for dnsmasq.
|
# -*- makefile -*-
|
||||||
# Copyright 2001-2020 by Simon Kelley
|
|
||||||
# Based on the sample in the debian hello package which carries the following:
|
|
||||||
# Copyright 1994,1995 by Ian Jackson.
|
|
||||||
# I hereby give you perpetual unlimited permission to copy,
|
|
||||||
# modify and relicense this file, provided that you do not remove
|
|
||||||
# my name from the file itself. (I assert my moral right of
|
|
||||||
# paternity under the Copyright, Designs and Patents Act 1988.)
|
|
||||||
# This file may have to be extensively modified
|
|
||||||
|
|
||||||
package=dnsmasq-base
|
# Uncomment this to turn on verbose mode.
|
||||||
|
export DH_VERBOSE=1
|
||||||
|
|
||||||
dpkg_buildflags := DEB_BUILD_MAINT_OPTIONS="hardening=+all,+pie,+bindnow" dpkg-buildflags
|
# Make sure lintian does not complain about missing hardenings.
|
||||||
|
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
|
||||||
|
|
||||||
CFLAGS = $(shell $(dpkg_buildflags) --get CFLAGS)
|
include /usr/share/dpkg/architecture.mk
|
||||||
CFLAGS += $(shell $(dpkg_buildflags) --get CPPFLAGS)
|
|
||||||
CFLAGS += -Wall -W
|
|
||||||
|
|
||||||
LDFLAGS = $(shell $(dpkg_buildflags) --get LDFLAGS)
|
PREFIX = /usr
|
||||||
|
# Upstream does not handle CPPFLAGS, so we add it to CFLAGS here.
|
||||||
DEB_COPTS = $(COPTS)
|
CFLAGS += $(CPPFLAGS)
|
||||||
|
COPTS =
|
||||||
TARGET = install-i18n
|
|
||||||
|
|
||||||
DEB_HOST_ARCH_OS := $(shell dpkg-architecture -qDEB_HOST_ARCH_OS)
|
|
||||||
DEB_HOST_GNU_TYPE := $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
|
|
||||||
DEB_BUILD_GNU_TYPE := $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
|
|
||||||
BUILD_DATE := $(shell dpkg-parsechangelog --show-field Date)
|
|
||||||
|
|
||||||
ifeq ($(origin CC),default)
|
|
||||||
CC = $(DEB_HOST_GNU_TYPE)-gcc
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Support non-cross-builds on systems without gnu-triplet-binaries for pkg-config.
|
|
||||||
ifeq ($(DEB_BUILD_GNU_TYPE),$(DEB_HOST_GNU_TYPE))
|
|
||||||
PKG_CONFIG=pkg-config
|
|
||||||
else
|
|
||||||
PKG_CONFIG=$(DEB_HOST_GNU_TYPE)-pkg-config
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Force package version based on git tags.
|
|
||||||
ifneq (,$(filter gitversion,$(DEB_BUILD_OPTIONS)))
|
|
||||||
PACKAGE_VERSION = $(shell bld/get-version `pwd` | sed 's/test/~&/; s/[a-z]/~&/; s/-/./g; s/$$/-1/; s/^/-v/';)
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq (,$(filter nodbus,$(DEB_BUILD_OPTIONS)))
|
ifeq (,$(filter nodbus,$(DEB_BUILD_OPTIONS)))
|
||||||
DEB_COPTS += -DHAVE_DBUS
|
COPTS += -DHAVE_DBUS
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq (,$(filter noidn, $(DEB_BUILD_OPTIONS)))
|
ifeq (,$(filter noidn, $(DEB_BUILD_OPTIONS)))
|
||||||
DEB_COPTS += -DHAVE_LIBIDN2
|
COPTS += -DHAVE_LIBIDN2
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq (,$(filter nonftset, $(DEB_BUILD_OPTIONS)))
|
ifeq (,$(filter nonftset, $(DEB_BUILD_OPTIONS)))
|
||||||
DEB_COPTS += -DHAVE_NFTSET
|
COPTS += -DHAVE_NFTSET
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq (,$(filter noconntrack,$(DEB_BUILD_OPTIONS)))
|
ifeq (,$(filter noconntrack,$(DEB_BUILD_OPTIONS)))
|
||||||
ifeq ($(DEB_HOST_ARCH_OS),linux)
|
ifeq ($(DEB_HOST_ARCH_OS),linux)
|
||||||
DEB_COPTS += -DHAVE_CONNTRACK
|
COPTS += -DHAVE_CONNTRACK
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq (,$(filter noipset,$(DEB_BUILD_OPTIONS)))
|
ifneq (,$(filter noipset,$(DEB_BUILD_OPTIONS)))
|
||||||
DEB_COPTS += -DNO_IPSET
|
COPTS += -DNO_IPSET
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq (,$(filter nodhcp6,$(DEB_BUILD_OPTIONS)))
|
ifneq (,$(filter nodhcp6,$(DEB_BUILD_OPTIONS)))
|
||||||
DEB_COPTS += -DNO_DHCP6
|
COPTS += -DNO_DHCP6
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq (,$(filter noipv6,$(DEB_BUILD_OPTIONS)))
|
ifneq (,$(filter noipv6,$(DEB_BUILD_OPTIONS)))
|
||||||
DEB_COPTS += -DNO_IPV6
|
COPTS += -DNO_IPV6
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq (,$(filter notftp,$(DEB_BUILD_OPTIONS)))
|
ifneq (,$(filter notftp,$(DEB_BUILD_OPTIONS)))
|
||||||
DEB_COPTS += -DNO_TFTP
|
COPTS += -DNO_TFTP
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq (,$(filter nodhcp,$(DEB_BUILD_OPTIONS)))
|
ifneq (,$(filter nodhcp,$(DEB_BUILD_OPTIONS)))
|
||||||
DEB_COPTS += -DNO_DHCP
|
COPTS += -DNO_DHCP
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq (,$(filter noscript,$(DEB_BUILD_OPTIONS)))
|
ifneq (,$(filter noscript,$(DEB_BUILD_OPTIONS)))
|
||||||
DEB_COPTS += -DNO_SCRIPT
|
COPTS += -DNO_SCRIPT
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq (,$(filter nortc,$(DEB_BUILD_OPTIONS)))
|
ifneq (,$(filter nortc,$(DEB_BUILD_OPTIONS)))
|
||||||
DEB_COPTS += -DHAVE_BROKEN_RTC
|
COPTS += -DHAVE_BROKEN_RTC
|
||||||
endif
|
|
||||||
|
|
||||||
ifneq (,$(filter noi18n,$(DEB_BUILD_OPTIONS)))
|
|
||||||
TARGET = install
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifneq (,$(filter uselua,$(DEB_BUILD_OPTIONS)))
|
|
||||||
DEB_COPTS += -DHAVE_LUASCRIPT
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq (,$(filter nodnssec,$(DEB_BUILD_OPTIONS)))
|
ifeq (,$(filter nodnssec,$(DEB_BUILD_OPTIONS)))
|
||||||
DEB_COPTS += -DHAVE_DNSSEC
|
COPTS += -DHAVE_DNSSEC
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(DEB_HOST_ARCH_OS),kfreebsd)
|
|
||||||
# For strlcpy in FreeBSD
|
|
||||||
LIBS += $(shell ${PKG_CONFIG} --libs libbsd-overlay)
|
|
||||||
CFLAGS += $(shell ${PKG_CONFIG} --cflags libbsd-overlay)
|
|
||||||
endif
|
|
||||||
|
|
||||||
define build_tree
|
%:
|
||||||
rm -rf $1
|
# Ubuntu and derivates do not support runit, see
|
||||||
install -m 755 \
|
# https://bugs.debian.org/960401 for details.
|
||||||
-d $1/DEBIAN \
|
if dpkg-vendor --derives-from Ubuntu; then \
|
||||||
-d $1/etc/dbus-1/system.d \
|
dh $@; \
|
||||||
-d $1/usr/share/doc/$(package) \
|
else \
|
||||||
-d $1/usr/share/doc/$(package)/examples \
|
dh $@ --with runit; \
|
||||||
-d $1/usr/share/$(package) \
|
|
||||||
-d $1/var/lib/misc
|
|
||||||
|
|
||||||
endef
|
|
||||||
|
|
||||||
define add_docs
|
|
||||||
# Need to remove paypal links in Debian Package for policy reasons.
|
|
||||||
sed -e /\<H2\>Donations/Q -e /icon.png/d doc.html -e /favicon.ico/d >$1/usr/share/doc/$(package)/doc.html
|
|
||||||
echo "</BODY>" >>$1/usr/share/doc/$(package)/doc.html
|
|
||||||
install -m 644 setup.html $1/usr/share/doc/$(package)/.
|
|
||||||
install -m 644 dnsmasq.conf.example $1/usr/share/doc/$(package)/examples/.
|
|
||||||
install -m 644 FAQ $1/usr/share/doc/$(package)/.
|
|
||||||
gzip -9n $1/usr/share/doc/$(package)/FAQ
|
|
||||||
install -m 644 CHANGELOG $1/usr/share/doc/$(package)/changelog
|
|
||||||
gzip -9n $1/usr/share/doc/$(package)/changelog
|
|
||||||
install -m 644 CHANGELOG.archive $1/usr/share/doc/$(package)/changelog.archive
|
|
||||||
gzip -9n $1/usr/share/doc/$(package)/changelog.archive
|
|
||||||
install -m 644 dbus/DBus-interface $1/usr/share/doc/$(package)/.
|
|
||||||
gzip -9n $1/usr/share/doc/$(package)/DBus-interface
|
|
||||||
install -m 644 debian/systemd_howto $1/usr/share/doc/$(package)/.
|
|
||||||
gzip -9n $1/usr/share/doc/$(package)/systemd_howto
|
|
||||||
gzip -9n $1/usr/share/man/man8/dnsmasq.8
|
|
||||||
for f in $1/usr/share/man/*; do \
|
|
||||||
if [ -f $$f/man8/dnsmasq.8 ]; then \
|
|
||||||
gzip -9n $$f/man8/dnsmasq.8 ; \
|
|
||||||
fi \
|
|
||||||
done
|
|
||||||
endef
|
|
||||||
|
|
||||||
define add_files
|
|
||||||
install -m 644 trust-anchors.conf $1/usr/share/$(package)/.
|
|
||||||
install -m 644 debian/dnsmasq-base.conffiles $1/DEBIAN/conffiles
|
|
||||||
install -m 755 debian/dnsmasq-base.postinst $1/DEBIAN/postinst
|
|
||||||
install -m 755 debian/dnsmasq-base.postrm $1/DEBIAN/postrm
|
|
||||||
install -m 644 debian/changelog $1/usr/share/doc/$(package)/changelog.Debian
|
|
||||||
gzip -9n $1/usr/share/doc/$(package)/changelog.Debian
|
|
||||||
install -m 644 debian/readme $1/usr/share/doc/$(package)/README.Debian
|
|
||||||
install -m 644 debian/copyright $1/usr/share/doc/$(package)/copyright
|
|
||||||
install -m 644 debian/dbus.conf $1/etc/dbus-1/system.d/dnsmasq.conf
|
|
||||||
endef
|
|
||||||
|
|
||||||
clean:
|
|
||||||
$(checkdir)
|
|
||||||
make BUILDDIR=debian/build/no-lua clean
|
|
||||||
make BUILDDIR=debian/build/lua clean
|
|
||||||
make -C contrib/lease-tools clean
|
|
||||||
rm -rf debian/build debian/trees debian/*~ debian/files debian/substvars debian/utils-substvars
|
|
||||||
|
|
||||||
binary-indep: checkroot
|
|
||||||
$(checkdir)
|
|
||||||
rm -rf debian/trees/daemon
|
|
||||||
install -m 755 \
|
|
||||||
-d debian/trees/daemon/DEBIAN \
|
|
||||||
-d debian/trees/daemon/usr/share/doc/dnsmasq \
|
|
||||||
-d debian/trees/daemon/etc/init.d \
|
|
||||||
-d debian/trees/daemon/etc/dnsmasq.d \
|
|
||||||
-d debian/trees/daemon/etc/resolvconf/update.d \
|
|
||||||
-d debian/trees/daemon/usr/lib/resolvconf/dpkg-event.d \
|
|
||||||
-d debian/trees/daemon/usr/share/dnsmasq \
|
|
||||||
-d debian/trees/daemon/usr/share/doc/dnsmasq \
|
|
||||||
-d debian/trees/daemon/etc/default \
|
|
||||||
-d debian/trees/daemon/lib/systemd/system \
|
|
||||||
-d debian/trees/daemon/usr/lib/tmpfiles.d \
|
|
||||||
-d debian/trees/daemon/etc/insserv.conf.d
|
|
||||||
install -m 644 debian/conffiles debian/trees/daemon/DEBIAN
|
|
||||||
install -m 755 debian/postinst debian/postrm debian/preinst debian/prerm debian/trees/daemon/DEBIAN
|
|
||||||
if ! dpkg-vendor --derives-from Ubuntu; then \
|
|
||||||
rm -f debian/dnsmasq.postinst.debhelper debian/dnsmasq.postrm.debhelper; \
|
|
||||||
dh_runit -pdnsmasq -Pdebian/trees/daemon; \
|
|
||||||
cat debian/dnsmasq.postinst.debhelper >> debian/trees/daemon/DEBIAN/postinst; \
|
|
||||||
cat debian/dnsmasq.postrm.debhelper >> debian/trees/daemon/DEBIAN/postrm; \
|
|
||||||
cd debian/trees/daemon && find etc/sv -type f -printf '/%p\n' >>DEBIAN/conffiles; \
|
|
||||||
fi
|
fi
|
||||||
install -m 755 debian/init debian/trees/daemon/etc/init.d/dnsmasq
|
|
||||||
install -m 755 debian/resolvconf debian/trees/daemon/etc/resolvconf/update.d/dnsmasq
|
|
||||||
install -m 755 debian/resolvconf-package debian/trees/daemon/usr/lib/resolvconf/dpkg-event.d/dnsmasq
|
|
||||||
install -m 644 debian/installed-marker debian/trees/daemon/usr/share/dnsmasq
|
|
||||||
install -m 644 debian/default debian/trees/daemon/etc/default/dnsmasq
|
|
||||||
install -m 644 dnsmasq.conf.example debian/trees/daemon/etc/dnsmasq.conf
|
|
||||||
install -m 644 debian/readme.dnsmasq.d debian/trees/daemon/etc/dnsmasq.d/README
|
|
||||||
install -m 644 debian/systemd.service debian/trees/daemon/lib/systemd/system/dnsmasq.service
|
|
||||||
install -m 644 debian/systemd@.service debian/trees/daemon/lib/systemd/system/dnsmasq@.service
|
|
||||||
install -m 644 debian/tmpfiles.conf debian/trees/daemon/usr/lib/tmpfiles.d/dnsmasq.conf
|
|
||||||
install -m 644 debian/insserv debian/trees/daemon/etc/insserv.conf.d/dnsmasq
|
|
||||||
install -m 644 debian/copyright debian/trees/daemon/usr/share/doc/dnsmasq/copyright
|
|
||||||
install -m 644 debian/changelog debian/trees/daemon/usr/share/doc/dnsmasq/changelog.Debian
|
|
||||||
gzip -9n debian/trees/daemon/usr/share/doc/dnsmasq/changelog.Debian
|
|
||||||
cd debian/trees/daemon && find . -type f ! -regex '.*DEBIAN/.*' -printf '%P\0' | LC_ALL=C sort -z | xargs -r0 md5sum > DEBIAN/md5sums
|
|
||||||
dpkg-gencontrol $(PACKAGE_VERSION) -Tdebian/dnsmasq.substvars -pdnsmasq -Pdebian/trees/daemon
|
|
||||||
find debian/trees/daemon -depth -newermt '$(BUILD_DATE)' -print0 | xargs -0r touch --no-dereference --date='$(BUILD_DATE)'
|
|
||||||
chown -R root.root debian/trees/daemon
|
|
||||||
chmod -R g-ws debian/trees/daemon
|
|
||||||
dpkg --build debian/trees/daemon ..
|
|
||||||
|
|
||||||
binary-arch: checkroot
|
# Upstream builds and installs in one go, so do we.
|
||||||
$(call build_tree,debian/trees/base)
|
override_dh_auto_build:
|
||||||
make $(TARGET) BUILDDIR=debian/build/no-lua PREFIX=/usr DESTDIR=`pwd`/debian/trees/base CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" COPTS="$(DEB_COPTS)" CC=$(CC) PKG_CONFIG=$(PKG_CONFIG) LIBS="$(LIBS)"
|
|
||||||
|
override_dh_auto_install:
|
||||||
|
dh_auto_build -p dnsmasq-base --no-parallel -- install-i18n \
|
||||||
|
BUILDDIR=debian/auto-build/dnsmasq-base \
|
||||||
|
DESTDIR=$(CURDIR)/debian/dnsmasq-base \
|
||||||
|
PREFIX=$(PREFIX) CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \
|
||||||
|
COPTS="$(COPTS)"
|
||||||
|
dh_auto_build -p dnsmasq-base-lua --no-parallel -- install-i18n \
|
||||||
|
BUILDDIR=debian/auto-build/dnsmasq-base-lua \
|
||||||
|
DESTDIR=$(CURDIR)/debian/dnsmasq-base-lua \
|
||||||
|
PREFIX=$(PREFIX) CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \
|
||||||
|
LUA=lua5.4 COPTS="$(COPTS) -DHAVE_LUASCRIPT"
|
||||||
|
dh_auto_build -p dnsmasq-utils -D contrib/lease-tools
|
||||||
|
|
||||||
|
override_dh_auto_clean:
|
||||||
|
dh_auto_clean -p dnsmasq-base -- \
|
||||||
|
BUILDDIR=debian/auto-build/dnsmasq-base
|
||||||
|
dh_auto_clean -p dnsmasq-base-lua -- \
|
||||||
|
BUILDDIR=debian/auto-build/dnsmasq-base-lua
|
||||||
|
rm -rf debian/auto-build
|
||||||
|
dh_auto_clean -p dnsmasq-utils -D contrib/lease-tools
|
||||||
|
|
||||||
|
override_dh_install:
|
||||||
|
dh_install -p dnsmasq-utils --sourcedir=contrib/lease-tools
|
||||||
|
dh_install --remaining-packages
|
||||||
|
|
||||||
|
# If 'nodoc' is absent from DEB_BUILD_OPTIONS, Correct name or location of
|
||||||
|
# some doc files.
|
||||||
|
# We would prefer do this via dh-exec if it would support dh_installdocs.
|
||||||
ifeq (,$(findstring nodoc,$(DEB_BUILD_OPTIONS)))
|
ifeq (,$(findstring nodoc,$(DEB_BUILD_OPTIONS)))
|
||||||
$(call add_docs,debian/trees/base)
|
execute_after_dh_installdocs:
|
||||||
else
|
for d in $(CURDIR)/debian/dnsmasq-base*/usr/share/doc/dnsmasq-base*; do \
|
||||||
rm -rf debian/trees/base/usr/share/man
|
cd $$d; \
|
||||||
endif
|
mv readme README.Debian; \
|
||||||
$(call add_files,debian/trees/base)
|
mv CHANGELOG.archive changelog.archive; \
|
||||||
ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
|
mkdir examples; \
|
||||||
$(DEB_HOST_GNU_TYPE)-strip -R .note -R .comment debian/trees/base/usr/sbin/dnsmasq
|
mv dnsmasq.conf.example examples/; \
|
||||||
endif
|
done
|
||||||
cd debian/trees/base && find . -type f ! -regex '.*DEBIAN/.*' -printf '%P\0' | LC_ALL=C sort -z | xargs -r0 md5sum > DEBIAN/md5sums
|
|
||||||
dpkg-shlibdeps --warnings=1 debian/trees/base/usr/sbin/dnsmasq
|
|
||||||
dpkg-gencontrol $(PACKAGE_VERSION) -pdnsmasq-base -Pdebian/trees/base
|
|
||||||
find debian/trees/base -depth -newermt '$(BUILD_DATE)' -print0 | xargs -0r touch --no-dereference --date='$(BUILD_DATE)'
|
|
||||||
chown -R root.root debian/trees/base
|
|
||||||
chmod -R g-ws debian/trees/base
|
|
||||||
dpkg --build debian/trees/base ..
|
|
||||||
|
|
||||||
$(call build_tree,debian/trees/lua-base)
|
|
||||||
make $(TARGET) BUILDDIR=debian/build/lua PREFIX=/usr DESTDIR=`pwd`/debian/trees/lua-base CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" COPTS="-DHAVE_LUASCRIPT $(DEB_COPTS)" CC=$(CC) PKG_CONFIG=$(PKG_CONFIG) LIBS="$(LIBS)"
|
|
||||||
ifeq (,$(findstring nodoc,$(DEB_BUILD_OPTIONS)))
|
|
||||||
$(call add_docs,debian/trees/lua-base)
|
|
||||||
else
|
|
||||||
rm -rf debian/trees/lua-base/usr/share/man
|
|
||||||
endif
|
|
||||||
$(call add_files,debian/trees/lua-base)
|
|
||||||
install -m 755 -d debian/trees/lua-base/usr/share/lintian/overrides
|
|
||||||
install -m 644 debian/lintian-override debian/trees/lua-base/usr/share/lintian/overrides/dnsmasq-base-lua
|
|
||||||
ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
|
|
||||||
$(DEB_HOST_GNU_TYPE)-strip -R .note -R .comment debian/trees/lua-base/usr/sbin/dnsmasq
|
|
||||||
endif
|
|
||||||
ln -s $(package) debian/trees/lua-base/usr/share/doc/dnsmasq-base-lua
|
|
||||||
cd debian/trees/lua-base && find . -type f ! -regex '.*DEBIAN/.*' -printf '%P\0' | LC_ALL=C sort -z | xargs -r0 md5sum > DEBIAN/md5sums
|
|
||||||
dpkg-shlibdeps --warnings=1 debian/trees/lua-base/usr/sbin/dnsmasq
|
|
||||||
dpkg-gencontrol $(PACKAGE_VERSION) -pdnsmasq-base-lua -Pdebian/trees/lua-base
|
|
||||||
find debian/trees/lua-base -depth -newermt '$(BUILD_DATE)' -print0 | xargs -0r touch --no-dereference --date='$(BUILD_DATE)'
|
|
||||||
chown -R root.root debian/trees/lua-base
|
|
||||||
chmod -R g-ws debian/trees/lua-base
|
|
||||||
dpkg --build debian/trees/lua-base ..
|
|
||||||
|
|
||||||
|
|
||||||
ifeq ($(DEB_HOST_ARCH_OS),linux)
|
|
||||||
rm -rf debian/trees/utils
|
|
||||||
install -m 755 -d debian/trees/utils/DEBIAN \
|
|
||||||
-d debian/trees/utils/usr/bin \
|
|
||||||
-d debian/trees/utils/usr/share/doc/dnsmasq-utils
|
|
||||||
ifeq (,$(findstring nodoc,$(DEB_BUILD_OPTIONS)))
|
|
||||||
install -m 755 -d debian/trees/utils/usr/share/man/man1
|
|
||||||
endif
|
|
||||||
make -C contrib/lease-tools PREFIX=/usr DESTDIR=`pwd`/debian/trees/utils CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" COPTS="$(DEB_COPTS)" CC=$(CC) PKG_CONFIG=$(PKG_CONFIG) LIBS="$(LIBS)"
|
|
||||||
install -m 755 contrib/lease-tools/dhcp_release debian/trees/utils/usr/bin/dhcp_release
|
|
||||||
install -m 755 contrib/lease-tools/dhcp_release6 debian/trees/utils/usr/bin/dhcp_release6
|
|
||||||
install -m 755 contrib/lease-tools/dhcp_lease_time debian/trees/utils/usr/bin/dhcp_lease_time
|
|
||||||
ifeq (,$(findstring nodoc,$(DEB_BUILD_OPTIONS)))
|
|
||||||
install -m 644 contrib/lease-tools/dhcp_release.1 debian/trees/utils/usr/share/man/man1/dhcp_release.1
|
|
||||||
gzip -9n debian/trees/utils/usr/share/man/man1/dhcp_release.1
|
|
||||||
install -m 644 contrib/lease-tools/dhcp_release6.1 debian/trees/utils/usr/share/man/man1/dhcp_release6.1
|
|
||||||
gzip -9n debian/trees/utils/usr/share/man/man1/dhcp_release6.1
|
|
||||||
install -m 644 contrib/lease-tools/dhcp_lease_time.1 debian/trees/utils/usr/share/man/man1/dhcp_lease_time.1
|
|
||||||
gzip -9n debian/trees/utils/usr/share/man/man1/dhcp_lease_time.1
|
|
||||||
endif
|
|
||||||
install -m 644 debian/copyright debian/trees/utils/usr/share/doc/dnsmasq-utils/copyright
|
|
||||||
install -m 644 debian/changelog debian/trees/utils/usr/share/doc/dnsmasq-utils/changelog.Debian
|
|
||||||
gzip -9n debian/trees/utils/usr/share/doc/dnsmasq-utils/changelog.Debian
|
|
||||||
ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
|
|
||||||
$(DEB_HOST_GNU_TYPE)-strip -R .note -R .comment debian/trees/utils/usr/bin/dhcp_release
|
|
||||||
$(DEB_HOST_GNU_TYPE)-strip -R .note -R .comment debian/trees/utils/usr/bin/dhcp_release6
|
|
||||||
$(DEB_HOST_GNU_TYPE)-strip -R .note -R .comment debian/trees/utils/usr/bin/dhcp_lease_time
|
|
||||||
endif
|
|
||||||
cd debian/trees/utils && find . -type f ! -regex '.*DEBIAN/.*' -printf '%P\0' | LC_ALL=C sort -z | xargs -r0 md5sum > DEBIAN/md5sums
|
|
||||||
dpkg-shlibdeps -Tdebian/utils-substvars debian/trees/utils/usr/bin/dhcp_release debian/trees/utils/usr/bin/dhcp_release6 debian/trees/utils/usr/bin/dhcp_lease_time
|
|
||||||
dpkg-gencontrol $(PACKAGE_VERSION) -Tdebian/utils-substvars -pdnsmasq-utils -Pdebian/trees/utils
|
|
||||||
find debian/trees/utils -depth -newermt '$(BUILD_DATE)' -print0 | xargs -0r touch --no-dereference --date='$(BUILD_DATE)'
|
|
||||||
chown -R root.root debian/trees/utils
|
|
||||||
chmod -R g-ws debian/trees/utils
|
|
||||||
dpkg --build debian/trees/utils ..
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
define checkdir
|
# If 'nodoc' is present in DEB_BUILD_OPTIONS, drop the man pages already
|
||||||
test -f Makefile -a -f debian/rules
|
# installed by the upstream build script. Then, let dh_installman do what
|
||||||
endef
|
# else needs doing.
|
||||||
|
override_dh_installman:
|
||||||
# Below here is fairly generic really
|
ifneq (,$(findstring nodoc,$(DEB_BUILD_OPTIONS)))
|
||||||
|
rm -rf debian/dnsmasq-base*/usr/share/man
|
||||||
binary: binary-arch binary-indep
|
endif
|
||||||
|
dh_installman -p dnsmasq-utils --sourcedir=contrib/lease-tools
|
||||||
build:
|
dh_installman --remaining-packages
|
||||||
build-arch:
|
|
||||||
build-indep:
|
|
||||||
|
|
||||||
checkroot:
|
|
||||||
test root = "`whoami`"
|
|
||||||
|
|
||||||
.PHONY: binary binary-arch binary-indep clean checkroot
|
|
||||||
|
|
||||||
|
|
||||||
Vendored
+1
-1
@@ -1 +1 @@
|
|||||||
1.0
|
3.0 (quilt)
|
||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
. /usr/share/dnsmasq/init-system-common
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
checkconfig)
|
||||||
|
checkconfig
|
||||||
|
;;
|
||||||
|
start-resolvconf)
|
||||||
|
start_resolvconf
|
||||||
|
;;
|
||||||
|
stop-resolvconf)
|
||||||
|
stop_resolvconf
|
||||||
|
;;
|
||||||
|
exec)
|
||||||
|
# /run may be volatile, so we need to ensure that
|
||||||
|
# /run/dnsmasq exists here as well as in postinst
|
||||||
|
if [ ! -d /run/dnsmasq ]; then
|
||||||
|
mkdir /run/dnsmasq || { [ -d /run/dnsmasq ] || exit 2 ; }
|
||||||
|
chown dnsmasq:nogroup /run/dnsmasq || exit 2
|
||||||
|
fi
|
||||||
|
exec ${DAEMON} -x /run/dnsmasq/${NAME}${INSTANCE:+.${INSTANCE}}.pid \
|
||||||
|
${MAILHOSTNAME:+ -m ${MAILHOSTNAME}} \
|
||||||
|
${MAILTARGET:+ -t ${MAILTARGET}} \
|
||||||
|
${DNSMASQ_USER:+ -u ${DNSMASQ_USER}} \
|
||||||
|
${DNSMASQ_INTERFACES:+ ${DNSMASQ_INTERFACES}} \
|
||||||
|
${DHCP_LEASE:+ -l ${DHCP_LEASE}} \
|
||||||
|
${DOMAIN_SUFFIX:+ -s ${DOMAIN_SUFFIX}} \
|
||||||
|
${RESOLV_CONF:+ -r ${RESOLV_CONF}} \
|
||||||
|
${CACHESIZE:+ -c ${CACHESIZE}} \
|
||||||
|
${CONFIG_DIR:+ -7 ${CONFIG_DIR}} \
|
||||||
|
${DNSMASQ_OPTS:+ ${DNSMASQ_OPTS}}
|
||||||
|
;;
|
||||||
|
esac
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
. debian/tests/functions
|
||||||
|
|
||||||
|
check_compile_time_options
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
. debian/tests/functions
|
||||||
|
|
||||||
|
check_compile_time_options +lua
|
||||||
Vendored
+39
@@ -0,0 +1,39 @@
|
|||||||
|
Tests: compile-time-options
|
||||||
|
Depends: dnsmasq,
|
||||||
|
dnsmasq-base,
|
||||||
|
Restrictions: needs-root,
|
||||||
|
isolation-container,
|
||||||
|
|
||||||
|
Tests: compile-time-options+lua
|
||||||
|
Depends: dnsmasq,
|
||||||
|
dnsmasq-base-lua,
|
||||||
|
Restrictions: needs-root,
|
||||||
|
isolation-container,
|
||||||
|
|
||||||
|
Tests: get-address+query-dns+check-utils
|
||||||
|
Depends: bind9,
|
||||||
|
bind9-dnsutils,
|
||||||
|
dnsmasq,
|
||||||
|
dnsmasq-base,
|
||||||
|
dnsmasq-utils,
|
||||||
|
Restrictions: needs-root,
|
||||||
|
allow-stderr,
|
||||||
|
isolation-container,
|
||||||
|
|
||||||
|
Tests: get-address+query-dns+lua+alt
|
||||||
|
Depends: bind9,
|
||||||
|
bind9-dnsutils,
|
||||||
|
dnsmasq,
|
||||||
|
dnsmasq-base-lua,
|
||||||
|
Restrictions: needs-root,
|
||||||
|
allow-stderr,
|
||||||
|
isolation-container,
|
||||||
|
|
||||||
|
Tests: get-address+query-dns+sysv+alt
|
||||||
|
Depends: bind9,
|
||||||
|
bind9-dnsutils,
|
||||||
|
dnsmasq,
|
||||||
|
dnsmasq-base,
|
||||||
|
Restrictions: needs-root,
|
||||||
|
allow-stderr,
|
||||||
|
isolation-container,
|
||||||
Vendored
+151
@@ -0,0 +1,151 @@
|
|||||||
|
# -*- shell-script -*-
|
||||||
|
|
||||||
|
FUNCTIONS_DIR="debian/tests/functions.d"
|
||||||
|
|
||||||
|
match_or_exit () {
|
||||||
|
file_to_match="$1"
|
||||||
|
pattern_file="$2"
|
||||||
|
|
||||||
|
while read line_to_match <&3 && read pattern_line <&4 ; do
|
||||||
|
if [ "${line_to_match##$pattern_line}" ]; then
|
||||||
|
echo '!!! MISMATCH !!!' >&2
|
||||||
|
echo "Line: ${line_to_match}" >&2
|
||||||
|
echo "Pattern: ${pattern_line}" >&2
|
||||||
|
exit 1
|
||||||
|
fi;
|
||||||
|
done 3<"${file_to_match}" 4<"${pattern_file}"
|
||||||
|
}
|
||||||
|
|
||||||
|
linecount () {
|
||||||
|
wc -l $1 | cut -d' ' -f1
|
||||||
|
}
|
||||||
|
|
||||||
|
error_exit () {
|
||||||
|
echo "ERROR: $1"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_dnsmasq_bind_networking () {
|
||||||
|
systemctl stop dnsmasq.service
|
||||||
|
systemctl stop named.service
|
||||||
|
systemctl stop networking.service
|
||||||
|
}
|
||||||
|
|
||||||
|
configure_and_start_networking () {
|
||||||
|
#Add interfaces needed for the test
|
||||||
|
cat ${FUNCTIONS_DIR}/add-to.interfaces >> /etc/network/interfaces
|
||||||
|
systemctl start networking.service
|
||||||
|
}
|
||||||
|
|
||||||
|
configure_and_start_bind () {
|
||||||
|
cp ${FUNCTIONS_DIR}/db.autopkg.test /etc/bind/
|
||||||
|
cat ${FUNCTIONS_DIR}/add-to.named.conf.local >> /etc/bind/named.conf.local
|
||||||
|
cp ${FUNCTIONS_DIR}/named.conf.options /etc/bind/named.conf.options
|
||||||
|
systemctl start named.service
|
||||||
|
}
|
||||||
|
|
||||||
|
configure_and_start_dnsmasq () {
|
||||||
|
alt_mode=0
|
||||||
|
lua_mode=0
|
||||||
|
sysv_mode=0
|
||||||
|
service='dnsmasq.service'
|
||||||
|
sysv_param2=''
|
||||||
|
conf_dir='/etc/dnsmasq.d'
|
||||||
|
|
||||||
|
while [ -n "$1" ]; do
|
||||||
|
case "$1" in
|
||||||
|
alt|lua|sysv) eval ${1}_mode=1 ;;
|
||||||
|
*) error_exit "configure_and_start_dnsmasq(): invalid flag '$1'"
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ ${alt_mode} -eq 1 ]; then
|
||||||
|
cp ${FUNCTIONS_DIR}/dnsmasq.alt-autopkgtest.default /etc/default/dnsmasq.alt
|
||||||
|
cp /etc/dnsmasq.conf /etc/dnsmasq.alt.conf
|
||||||
|
mkdir /etc/dnsmasq.alt.d
|
||||||
|
service='dnsmasq@alt.service'
|
||||||
|
sysv_param2='alt'
|
||||||
|
conf_dir='/etc/dnsmasq.alt.d'
|
||||||
|
fi
|
||||||
|
|
||||||
|
cp ${FUNCTIONS_DIR}/dnsmasq-autopkgtest.conf "${conf_dir}"
|
||||||
|
|
||||||
|
if [ ${lua_mode} -eq 1 ]; then
|
||||||
|
mkdir -p /usr/local/share/dnsmasq
|
||||||
|
cp ${FUNCTIONS_DIR}/log.lua /usr/local/share/dnsmasq/
|
||||||
|
echo "dhcp-luascript=/usr/local/share/dnsmasq/log.lua\n" \
|
||||||
|
>>"${conf_dir}"/dnsmasq-autopkgtest.conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ${sysv_mode} -eq 1 ]; then
|
||||||
|
SYSTEMCTL_SKIP_REDIRECT=1 /etc/init.d/dnsmasq start "${sysv_param2}"
|
||||||
|
else
|
||||||
|
systemctl enable "${service}"
|
||||||
|
systemctl start "${service}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
check_compile_time_options () {
|
||||||
|
journalctl -b -u dnsmasq
|
||||||
|
echo ~~~ Check compile time options...
|
||||||
|
journalctl -b -u dnsmasq -g '[a-z]+: ' --output cat >options.msg
|
||||||
|
cat options.msg
|
||||||
|
match_or_exit options.msg ${FUNCTIONS_DIR}/options${1}.patterns
|
||||||
|
}
|
||||||
|
|
||||||
|
get_address_on_veth1_and_check_the_result () {
|
||||||
|
echo ~~~ Get an address on veth1 and check the result...
|
||||||
|
ip netns exec clientnet ifup veth1
|
||||||
|
ip netns exec clientnet ip addr show dev veth1 >ip-addr.out 2>&1
|
||||||
|
cat ip-addr.out
|
||||||
|
match_or_exit ip-addr.out ${FUNCTIONS_DIR}/ip-addr.patterns
|
||||||
|
}
|
||||||
|
|
||||||
|
query_test_zone_records_and_check_the_result () {
|
||||||
|
echo ~~~ Query some test zone records and check the result...
|
||||||
|
ip netns exec clientnet dig +short SOA autopkg.test >dig.out 2>&1
|
||||||
|
ip netns exec clientnet dig +short NS autopkg.test >>dig.out 2>&1
|
||||||
|
ip netns exec clientnet dig +short A ns.autopkg.test >>dig.out 2>&1
|
||||||
|
ip netns exec clientnet dig +short A dhcp3.autopkg.test >>dig.out 2>&1
|
||||||
|
cat dig.out
|
||||||
|
if [ `linecount dig.out` -ne `linecount ${FUNCTIONS_DIR}/dig.patterns` ] ; then
|
||||||
|
error_exit 'empty or unexpected output'
|
||||||
|
fi
|
||||||
|
match_or_exit dig.out ${FUNCTIONS_DIR}/dig.patterns
|
||||||
|
}
|
||||||
|
|
||||||
|
check_utils () {
|
||||||
|
#Test dhcp_lease_time and dhcp_release
|
||||||
|
leases_file='/var/lib/misc/dnsmasq.leases'
|
||||||
|
client_ip_address=`cut -d' ' -f3 $leases_file`
|
||||||
|
client_mac_address=`cut -d' ' -f2 $leases_file`
|
||||||
|
echo ~~~ Test dhcp_lease_time...
|
||||||
|
if ! dhcp_lease_time $client_ip_address; then
|
||||||
|
error_exit "'dhcp_lease_time $client_ip_address' failed with return code $?"
|
||||||
|
else
|
||||||
|
#Add \n to dhcp_lease_time's output
|
||||||
|
echo ''
|
||||||
|
fi
|
||||||
|
echo ~~~ Test dhcp_release...
|
||||||
|
cat $leases_file
|
||||||
|
if ! dhcp_release veth0 $client_ip_address 1-$client_mac_address; then
|
||||||
|
error_exit "'dhcp_release veth0 $client_ip_address 1-$client_mac_address' failed with return code $?0"
|
||||||
|
fi
|
||||||
|
if [ -n "`cat $leases_file`" ]; then
|
||||||
|
cat $leases_file
|
||||||
|
error_exit "$leases_file is not empty"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
check_lua_log () {
|
||||||
|
log_file='/var/log/dnsmasq-lua.log'
|
||||||
|
echo ~~~ Check log file generated by lua script
|
||||||
|
ls -l ${log_file}
|
||||||
|
if [ -s ${log_file} ]; then
|
||||||
|
cat ${log_file}
|
||||||
|
match_or_exit ${log_file} ${FUNCTIONS_DIR}/log.patterns
|
||||||
|
else
|
||||||
|
error_exit "${log_file} is empty"
|
||||||
|
fi
|
||||||
|
}
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
|
||||||
|
auto dummy0
|
||||||
|
iface dummy0 inet static
|
||||||
|
pre-up ip link add dummy0 type dummy
|
||||||
|
address 192.168.141.1
|
||||||
|
netmask 255.255.255.248
|
||||||
|
post-down ip link del dummy0
|
||||||
|
|
||||||
|
auto veth0
|
||||||
|
iface veth0 inet static
|
||||||
|
pre-up ip netns add clientnet
|
||||||
|
pre-up ip link add veth0 type veth peer veth1 netns clientnet
|
||||||
|
address 192.168.142.1
|
||||||
|
netmask 255.255.255.248
|
||||||
|
post-down ip link del veth0
|
||||||
|
post-down ip netns del clientnet
|
||||||
|
|
||||||
|
iface veth1 inet dhcp
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
zone "autopkg.test" { type master; file "/etc/bind/db.autopkg.test"; };
|
||||||
|
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
$TTL 604800
|
||||||
|
@ IN SOA ns.autopkg.test. hostmaster.autopkg.test. (
|
||||||
|
2 ; Serial
|
||||||
|
604800 ; Refresh
|
||||||
|
86400 ; Retry
|
||||||
|
2419200 ; Expire
|
||||||
|
300 ) ; Negative Cache TTL
|
||||||
|
;
|
||||||
|
@ IN NS ns
|
||||||
|
ns IN A 192.168.141.1
|
||||||
|
host IN A 192.168.142.1
|
||||||
|
dhcp0 IN A 192.168.142.2
|
||||||
|
dhcp1 IN A 192.168.142.3
|
||||||
|
dhcp2 IN A 192.168.142.4
|
||||||
|
dhcp3 IN A 192.168.142.5
|
||||||
|
dhcp4 IN A 192.168.142.6
|
||||||
|
brdcst IN A 192.168.142.7
|
||||||
|
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
ns.autopkg.test. hostmaster.autopkg.test. 2 604800 86400 2419200 300
|
||||||
|
ns.autopkg.test.
|
||||||
|
192.168.141.1
|
||||||
|
192.168.142.5
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
no-resolv
|
||||||
|
server=/autopkg.test/192.168.141.1
|
||||||
|
listen-address=192.168.142.1,127.0.0.1
|
||||||
|
bind-interfaces
|
||||||
|
dhcp-range=192.168.142.2,192.168.142.6
|
||||||
|
dhcp-authoritative
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
# This file has six functions:
|
||||||
|
# 1) to completely disable starting this dnsmasq instance
|
||||||
|
# 2) to set DOMAIN_SUFFIX by running `dnsdomainname`
|
||||||
|
# 3) to select an alternative config file
|
||||||
|
# by setting DNSMASQ_OPTS to --conf-file=<file>
|
||||||
|
# 4) to tell dnsmasq to read the files in /etc/dnsmasq.d for
|
||||||
|
# more configuration variables.
|
||||||
|
# 5) to stop the resolvconf package from controlling dnsmasq's
|
||||||
|
# idea of which upstream nameservers to use.
|
||||||
|
# 6) to avoid using this dnsmasq instance as the system's default resolver
|
||||||
|
# by setting DNSMASQ_EXCEPT="lo"
|
||||||
|
# For upgraders from very old versions, all the shell variables set
|
||||||
|
# here in previous versions are still honored by the init script
|
||||||
|
# so if you just keep your old version of this file nothing will break.
|
||||||
|
|
||||||
|
#DOMAIN_SUFFIX=`dnsdomainname`
|
||||||
|
DNSMASQ_OPTS="--conf-file=/etc/dnsmasq.alt.conf"
|
||||||
|
|
||||||
|
# The dnsmasq daemon is run by default conforming to the Debian Policy.
|
||||||
|
# To disable the service,
|
||||||
|
# for SYSV init, use "update-rc.d dnsmasq disable",
|
||||||
|
# for systemd, use "systemctl disable dnsmasq".
|
||||||
|
|
||||||
|
# By default search this drop directory for configuration options.
|
||||||
|
# Libvirt leaves a file here to make the system dnsmasq play nice.
|
||||||
|
# Comment out this line if you don't want this. The dpkg-* are file
|
||||||
|
# endings which cause dnsmasq to skip that file. This avoids pulling
|
||||||
|
# in backups made by dpkg.
|
||||||
|
CONFIG_DIR=/etc/dnsmasq.alt.d,.dpkg-dist,.dpkg-old,.dpkg-new
|
||||||
|
|
||||||
|
# If the resolvconf package is installed, dnsmasq will use its output
|
||||||
|
# rather than the contents of /etc/resolv.conf to find upstream
|
||||||
|
# nameservers. Uncommenting this line inhibits this behaviour.
|
||||||
|
# Note that including a "resolv-file=<filename>" line in
|
||||||
|
# /etc/dnsmasq.conf is not enough to override resolvconf if it is
|
||||||
|
# installed: the line below must be uncommented.
|
||||||
|
#IGNORE_RESOLVCONF=yes
|
||||||
|
|
||||||
|
# If the resolvconf package is installed, dnsmasq will tell resolvconf
|
||||||
|
# to use dnsmasq under 127.0.0.1 as the system's default resolver.
|
||||||
|
# Uncommenting this line inhibits this behaviour.
|
||||||
|
#DNSMASQ_EXCEPT="lo"
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
*: veth1@if*: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
|
||||||
|
link/ether ??:??:??:??:??:?? brd ff:ff:ff:ff:ff:ff link-netnsid 0
|
||||||
|
inet 192.168.142.?/29 brd 192.168.142.7 scope global dynamic veth1
|
||||||
|
valid_lft 3[56][0-9][0-9]sec preferred_lft 3[56][0-9][0-9]sec
|
||||||
|
inet6 fe80::*:*:*:*/64 scope link*
|
||||||
|
valid_lft forever preferred_lft forever
|
||||||
Vendored
+40
@@ -0,0 +1,40 @@
|
|||||||
|
-- Lua script logging calls from dnsmasq
|
||||||
|
|
||||||
|
-- Open the log file in append mode
|
||||||
|
logfile = assert(io.open("/var/log/dnsmasq-lua.log", "a"))
|
||||||
|
|
||||||
|
-- Prepend date and time to a string and write the result to the log file
|
||||||
|
function __log(str)
|
||||||
|
logfile:write(os.date("!%FT%TZ ")..str.."\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- flush the log file
|
||||||
|
function __flush_log()
|
||||||
|
logfile:flush()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Log a call to init()
|
||||||
|
function init()
|
||||||
|
__log("initialising")
|
||||||
|
__flush_log()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Log a call to shutdown()
|
||||||
|
function shutdown()
|
||||||
|
__log("shutting down")
|
||||||
|
__flush_log()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Log a call to lease() including all arguments
|
||||||
|
function lease(operation, params)
|
||||||
|
local lines = {}
|
||||||
|
__log(operation.." lease")
|
||||||
|
for key,value in pairs(params) do
|
||||||
|
table.insert(lines, key..": "..value)
|
||||||
|
end
|
||||||
|
table.sort(lines)
|
||||||
|
for index,line in ipairs(lines) do
|
||||||
|
__log("\t"..line)
|
||||||
|
end
|
||||||
|
__flush_log()
|
||||||
|
end
|
||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
????-??-??T??:??:??Z initialising
|
||||||
|
????-??-??T??:??:??Z add lease
|
||||||
|
????-??-??T??:??:??Z client_id: ??:??:??:??:??:??:??:??:??:??:??:??:??:??:??:??:??:??:??
|
||||||
|
????-??-??T??:??:??Z data_missing: 1.0
|
||||||
|
????-??-??T??:??:??Z hostname: ?*
|
||||||
|
????-??-??T??:??:??Z interface: veth0
|
||||||
|
????-??-??T??:??:??Z ip_address: 192.168.142.[2-6]
|
||||||
|
????-??-??T??:??:??Z lease_expires: [1-9]*
|
||||||
|
????-??-??T??:??:??Z mac_address: ??:??:??:??:??:??
|
||||||
|
????-??-??T??:??:??Z time_remaining: 3600.0
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
options {
|
||||||
|
directory "/var/cache/bind";
|
||||||
|
listen-on { 192.168.141.1; };
|
||||||
|
recursion no;
|
||||||
|
};
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
*: IPv6 GNU-getopt DBus no-UBus i18n IDN2 DHCP DHCPv6 Lua TFTP conntrack ipset nftset auth cryptohash DNSSEC loop-detect inotify dumpfile
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
*: IPv6 GNU-getopt DBus no-UBus i18n IDN2 DHCP DHCPv6 no-Lua TFTP conntrack ipset nftset auth cryptohash DNSSEC loop-detect inotify dumpfile
|
||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
. debian/tests/functions
|
||||||
|
|
||||||
|
stop_dnsmasq_bind_networking
|
||||||
|
configure_and_start_networking
|
||||||
|
configure_and_start_bind
|
||||||
|
configure_and_start_dnsmasq
|
||||||
|
|
||||||
|
get_address_on_veth1_and_check_the_result
|
||||||
|
|
||||||
|
query_test_zone_records_and_check_the_result
|
||||||
|
|
||||||
|
check_utils
|
||||||
|
|
||||||
|
#Done
|
||||||
|
echo Looks good.
|
||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
. debian/tests/functions
|
||||||
|
|
||||||
|
stop_dnsmasq_bind_networking
|
||||||
|
configure_and_start_networking
|
||||||
|
configure_and_start_bind
|
||||||
|
configure_and_start_dnsmasq lua alt
|
||||||
|
|
||||||
|
get_address_on_veth1_and_check_the_result
|
||||||
|
|
||||||
|
query_test_zone_records_and_check_the_result
|
||||||
|
|
||||||
|
check_lua_log
|
||||||
|
|
||||||
|
#Done
|
||||||
|
echo Looks good.
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
. debian/tests/functions
|
||||||
|
|
||||||
|
stop_dnsmasq_bind_networking
|
||||||
|
configure_and_start_networking
|
||||||
|
configure_and_start_bind
|
||||||
|
configure_and_start_dnsmasq sysv alt
|
||||||
|
|
||||||
|
get_address_on_veth1_and_check_the_result
|
||||||
|
|
||||||
|
query_test_zone_records_and_check_the_result
|
||||||
|
|
||||||
|
#Done
|
||||||
|
echo Looks good.
|
||||||
|
SYSTEMCTL_SKIP_REDIRECT=1 /etc/init.d/dnsmasq stop alt
|
||||||
Vendored
+9
@@ -0,0 +1,9 @@
|
|||||||
|
Cite-As: dnsmasq
|
||||||
|
Contact: simon@thekelleys.org.uk
|
||||||
|
Security-Contact: https://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss
|
||||||
|
Repository: https://thekelleys.org.uk/git/dnsmasq.git
|
||||||
|
Repository-Browse: https://thekelleys.org.uk/gitweb/?p=dnsmasq.git;a=summary
|
||||||
|
Changelog: https://thekelleys.org.uk/dnsmasq/CHANGELOG
|
||||||
|
Documentation: https://thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html
|
||||||
|
FAQ: https://thekelleys.org.uk/dnsmasq/docs/FAQ
|
||||||
|
Bug-Submit: https://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss
|
||||||
Vendored
+63
@@ -0,0 +1,63 @@
|
|||||||
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
||||||
|
mQINBFMbjUMBEACsU1Xk8+uu/EsGVJTh9Tn31C2e0ycd0voBVT7cTdtXpzeiNR+o
|
||||||
|
/zUAi95ds7FiecpZJp1nRO4vNzvaaAPZhFsFVLzZYyIVABgTXsskT88xbZvzb4W5
|
||||||
|
KKRWVhoTQxVDgj1+dXLUXULTB6rg02WEhqnix/qf/zFdM9I4/3pRHJn9k+3XKygR
|
||||||
|
on+nYtljfn3AKBelCo1y28istC6wCncoH11b/qdQtlfxVXaJY4HF27V0MqFFmDMg
|
||||||
|
cuhOHR7DnhymeDh7GmLfTHJ4LUFG+TecqCjiYhyWcuv2wuSb0EPXUKHJQVViQ8qg
|
||||||
|
KyPm1ly6uFP0CYdVavO7/oJwKFBIChECrj7BQ4GsImMHeuSzfWno7qy6Fxoxx2+g
|
||||||
|
0F9cdXWvcxFDGPQsL5vXp8KYNwBrzmijRzQ2ZAnrbG+ilFCkJCbxXcrhzpd4tKwE
|
||||||
|
0dgcyPL1Ma/lrznhL4ZuOzjVMgLNne7WiPpBNRqI1GoT0pUn6as4pU3En8B+K7zy
|
||||||
|
MLVfHvI1+iH45fP5bZwYSbXCa85v4+xqljYrzs9giaROEsXe/tsXvuc6JPCcmJXk
|
||||||
|
CUO3c3QVxqDFt9OYuTHIR8hqehDPLgFgzKqVuoAwMkhTf/zZNGlsy4jvKXQNcZ50
|
||||||
|
uD4mWO3e+gykNW/OH+88IoCR0rgjQ6trMLOceZFnrtvxwRL//lMndGCTYQARAQAB
|
||||||
|
tB1TaW1vbiBLZWxsZXkgPHNya0BkZWJpYW4ub3JnPokCNwQTAQgAIQUCUyDDdAIb
|
||||||
|
AwULCQgHAwUVCgkICwUWAgMBAAIeAQIXgAAKCRAVzdpq4ZE1oqFGD/9LkbZFigc1
|
||||||
|
jbZ5zIbmGkGvfniWp1mJhEcpgKNfb2MMiu1lKULccIvfVyIY5WDrrpoPnHLnhYA9
|
||||||
|
OXHcwVADGBayoVOQgIePrMV0V24uYjUh9+9zGRwQrCLo0rl/l07GKH0S1dxDUeyh
|
||||||
|
JRYZGYEqW2+3XDJqIbfsDzSmPNCyjVvqSvkkt0YyuNbH0+cVEoJ1Q2HmfEhvgd4L
|
||||||
|
lHZDyhMVqKlKmlnCa8DmhwK+EyzJgLKITqjxBO3NOqPmYZlp8irLXyHAH1sDafaB
|
||||||
|
wRjV9cNX2TLTwn3wDdUmoAwMz1jopi/61A0kEglENYaa+NH/UnqfWOo7riXuZNwG
|
||||||
|
VP/F/KlMV+JdXMY34fcSIQMWk9cpxzhpuOJjwhoK7g/yq8q9578QXv4VR6ndH+Le
|
||||||
|
HDRrm2Ftnih/Ut8unqqDteMJnd3YxSK3Ep78WgVBL9y2Qo3CyKY6VSXlshWZokwy
|
||||||
|
rwVS8uLqIGAUzLwsKTYi1nmsDb7mQZqUbPBxYN2mrroD7Pr1/XAV8oNxw6l84nzf
|
||||||
|
zObEKvNZLFtWctNpFJXhWhtm/AeQBdkYKcMyTrwQt9Q0XMYKUGE05U+oAdtTvgCR
|
||||||
|
JLltqzmt5yMpTPncNmXVoA5YvEVdCU6/Gxpn3Aea8ckBmIqxxQY1QFdEr2nvxPNA
|
||||||
|
SbkvHDNDr9XUlKQDqjherurKBIBEiKCMnLQmU2ltb24gS2VsbGV5IDxzaW1vbkB0
|
||||||
|
aGVrZWxsZXlzLm9yZy51az6JAjoEEwEIACQCGwMFCwkIBwMFFQoJCAsFFgIDAQAC
|
||||||
|
HgECF4AFAlMgw44CGQEACgkQFc3aauGRNaLaZg/+PR41J3P7omGv6XD+TiAXfJQo
|
||||||
|
R5RfzQoeLNUQEnir/XBulg45203cYHEurchEhSTn2f4WVtFgxJrgId7XGYdf8oIZ
|
||||||
|
IjBd82fpwdMwhbfcv/6iqzWL0+2vaPmBqE7iwDTatI888q5TyXppGe8L5/VjX0aB
|
||||||
|
vmVIPyEE9BFQas+vv5byUkU542FxPApGsv0W0P1pKabLl0F7ItPFPuaD0+K1kwBr
|
||||||
|
WbuGhBKMV9jGHB4qdX/21FBczgAf3J9yJ22vm6orCwwhptxde+DSn7vqZNjDtHGr
|
||||||
|
kUWDzKAQBy1g4BmTl6IoVgYKZXAVBGMtYUjS+80VV+QE9meVqmtX1aJJEnf0/BRd
|
||||||
|
v9CeD46hZArwXwi/AWFs300pEfzwcC+9T5xc3jlSdYdWxeQDV7XwK2VCOhxjFqTm
|
||||||
|
+ehP2Gh14Wfpc34jN9jMJ3OowxzN5iZxGYzkHLFhM+0IKEeWEjxRWOoJgV5PmNvG
|
||||||
|
7IBbzt8O9xo550h7JmXZVsfSpkFpzJPy0Puz1JeyH/niCeDwKkhEHXQTk/4O+EOD
|
||||||
|
RxruJbwIYGeO2lNfPn2Hcb1aHvSclx7GGOYDzI4jN0UcYroJpvHZU+0X2ClpCTAW
|
||||||
|
5IshgHkOkdUQ1c7S+5zPTeLbW+pxTlbWClA0NYMbSn68//i/DMstyBEwtTWYJLmg
|
||||||
|
5V3HWzRd/6BwKZfDSuu5Ag0EUyDDoQEQAMfQfa2tw3+OJFGMQEzLJSoXYN8/HnZE
|
||||||
|
gKNlcMuYzhheQLgu/MfcQJ7mnCIdn6xdPaalfLmYx63tM47/NGEM1+MSEvovPiRG
|
||||||
|
0OLxzSgwei9DiGeNEgsPTLXSZ5EVSXCM1+e9mT1ExT9aGLNnpCd6kIyWIcKCVMot
|
||||||
|
+XC70R9prWLeyKSh0FAZ0Pwv9i23osJVGOtJjND+WZ0uCeN29ocfN0b64yF4nPRc
|
||||||
|
9IbcmYIDgNU3RybK2Z/dupbthTisRjHRI3iX3/tiymXF3J0sSvsCluWIJWmyltS3
|
||||||
|
Xyk/wfKVJz6OouiJjTj5utXVnCGptCDw+DCcj89vx1N0+0Dhm1cQcNZvXjMbVDTs
|
||||||
|
uU+eVpJbxU6y8N+nXpAXjEw4jMi3zNpqKtkyv2YpoqY5HhGLybgrY0zwSQOyMNf9
|
||||||
|
lZ5J7znq5gEmiMXnG9OPEw7PPSvm6QfbHPY/jAOgxsu7Fme7k303D5KkyGkkbzQi
|
||||||
|
YyEtMZvbOMH/uECi2uHGB72qiGpEYjMtHhihaRCBl+0bY8sH83He690qNQHSdStj
|
||||||
|
aKXcecduE/v5iO0mOYIHdsEHhKlWsE1GXXVLofBr68UBhYV6/AGXko4Pr+dXLzau
|
||||||
|
N4kALDx6WltFu3qUvoD+uEoLq7IXULMo5Pyd7bO4qGQMKykaXTb5o6dqdu4GzWIU
|
||||||
|
w1fr9kLEmo29ABEBAAGJAh8EGAEIAAkFAlMgw6ECGwwACgkQFc3aauGRNaIjqA/+
|
||||||
|
PXuaM6JHuudLycmB0iKAwyB5csOFGpF3b9FgMR68TC4jzi5J5hJZASl0cO/e0ytQ
|
||||||
|
srDUBbH74y+WaA4ldwBVYr0j/2hqzIjrnGMtgWeHFPLV3sKw8DGuNx1/cOoljJXz
|
||||||
|
i1WWSHIwDvaj3uZ9CwHt+4/abR7kdvMcnFhQVA4zuzZWFqpp+CDkkJNVwB9zxtAQ
|
||||||
|
wGTGF4cQ0IvTkhCo6DQhZZVTeyn+nBKxzzWijniWc0LyRsum03MxZ6E7UVIInCTj
|
||||||
|
dXTalnO8wColwIx5FV4nTMxdsKKgnIXmLexBdd03bW9TkowWf2C2XfDN+pDS8X3M
|
||||||
|
zO6zAyogqJhAiBFjnRzkOw0cw1VTL00o8uiWdMeu7OKOKeQbUilMAn4MweKB57mc
|
||||||
|
582kjeGmwdZgWFA4BJ2eiH7HwjxiynwMdZwQEBdOTNLbggHk3/mScF8U1KcJhjAF
|
||||||
|
f7Ne+Z0feG/8GgKl5aj3ucl821+dfpzB79lLo+kmd1qkDyDiUR5yN6P8l8k6IAUJ
|
||||||
|
z2KUe0BjtO6VFFw0xni05dkrXdfo7IO79ictHmEn+g3QO8ZLUGRwdtZ1cMhTkm7F
|
||||||
|
hH8Bdby0y4SoqluvHbri++cC91i1I3a92kHi/8O45rnLhVt+sOfxY1QnSIYh5OFw
|
||||||
|
GMqMCNDTEL7ESiFaFhSXkmzzVntlyvOBMlgz3IGh2hA=
|
||||||
|
=otES
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----
|
||||||
Vendored
+5
@@ -0,0 +1,5 @@
|
|||||||
|
version=4
|
||||||
|
opts=\
|
||||||
|
pgpmode=auto \
|
||||||
|
https://thekelleys.org.uk/dnsmasq/ \
|
||||||
|
dnsmasq-([\d.]+)@ARCHIVE_EXT@
|
||||||
@@ -394,7 +394,7 @@
|
|||||||
|
|
||||||
# The following DHCP options set up dnsmasq in the same way as is specified
|
# The following DHCP options set up dnsmasq in the same way as is specified
|
||||||
# for the ISC dhcpcd in
|
# for the ISC dhcpcd in
|
||||||
# http://www.samba.org/samba/ftp/docs/textdocs/DHCP-Server-Configuration.txt
|
# https://web.archive.org/web/20040313070105/http://us1.samba.org/samba/ftp/docs/textdocs/DHCP-Server-Configuration.txt
|
||||||
# adapted for a typical dnsmasq installation where the host running
|
# adapted for a typical dnsmasq installation where the host running
|
||||||
# dnsmasq is also the host running samba.
|
# dnsmasq is also the host running samba.
|
||||||
# you may want to uncomment some or all of them if you use
|
# you may want to uncomment some or all of them if you use
|
||||||
@@ -664,7 +664,7 @@
|
|||||||
# Provide an alias for a "local" DNS name. Note that this _only_ works
|
# Provide an alias for a "local" DNS name. Note that this _only_ works
|
||||||
# for targets which are names from DHCP or /etc/hosts. Give host
|
# for targets which are names from DHCP or /etc/hosts. Give host
|
||||||
# "bert" another name, bertrand
|
# "bert" another name, bertrand
|
||||||
#cname=bertand,bert
|
#cname=bertrand,bert
|
||||||
|
|
||||||
# For debugging purposes, log each DNS query as it passes through
|
# For debugging purposes, log each DNS query as it passes through
|
||||||
# dnsmasq.
|
# dnsmasq.
|
||||||
|
|||||||
+69
-17
@@ -183,7 +183,8 @@ to zero completely disables DNS function, leaving only DHCP and/or TFTP.
|
|||||||
.TP
|
.TP
|
||||||
.B \-P, --edns-packet-max=<size>
|
.B \-P, --edns-packet-max=<size>
|
||||||
Specify the largest EDNS.0 UDP packet which is supported by the DNS
|
Specify the largest EDNS.0 UDP packet which is supported by the DNS
|
||||||
forwarder. Defaults to 4096, which is the RFC5625-recommended size.
|
forwarder. Defaults to 1232, which is the recommended size following the
|
||||||
|
DNS flag day in 2020. Only increase if you know what you are doing.
|
||||||
.TP
|
.TP
|
||||||
.B \-Q, --query-port=<query_port>
|
.B \-Q, --query-port=<query_port>
|
||||||
Send outbound DNS queries from, and listen for their replies on, the
|
Send outbound DNS queries from, and listen for their replies on, the
|
||||||
@@ -269,16 +270,25 @@ the address dnsmasq is listening on. When an interface is specified,
|
|||||||
it may be qualified with "/4" or "/6" to specify only the IPv4 or IPv6
|
it may be qualified with "/4" or "/6" to specify only the IPv4 or IPv6
|
||||||
addresses associated with the interface. Since any defined authoritative zones are also available as part of the normal recusive DNS service supplied by dnsmasq, it can make sense to have an --auth-server declaration with no interfaces or address, but simply specifying the primary external nameserver.
|
addresses associated with the interface. Since any defined authoritative zones are also available as part of the normal recusive DNS service supplied by dnsmasq, it can make sense to have an --auth-server declaration with no interfaces or address, but simply specifying the primary external nameserver.
|
||||||
.TP
|
.TP
|
||||||
.B --local-service
|
.B --local-service[=net|host]
|
||||||
|
Without parameter or with net parameter, restricts service to connected network.
|
||||||
Accept DNS queries only from hosts whose address is on a local subnet,
|
Accept DNS queries only from hosts whose address is on a local subnet,
|
||||||
ie a subnet for which an interface exists on the server. This option
|
ie a subnet for which an interface exists on the server. With host parameter, listens
|
||||||
|
only on lo interface and accepts queries from localhost only. This option
|
||||||
only has effect if there are no \fB--interface\fP, \fB--except-interface\fP,
|
only has effect if there are no \fB--interface\fP, \fB--except-interface\fP,
|
||||||
\fB--listen-address\fP or \fB--auth-server\fP options. It is intended to be set as
|
\fB--listen-address\fP or \fB--auth-server\fP options. It is intended to be set as
|
||||||
a default on installation, to allow unconfigured installations to be
|
a default on installation, to allow unconfigured installations to be
|
||||||
useful but also safe from being used for DNS amplification attacks.
|
useful but also safe from being used for DNS amplification attacks.
|
||||||
.TP
|
.TP
|
||||||
.B \-2, --no-dhcp-interface=<interface name>
|
.B \-2, --no-dhcp-interface=<interface name>
|
||||||
Do not provide DHCP or TFTP on the specified interface, but do provide DNS service.
|
Do not provide DHCP, TFTP or router advertisement on the specified interface, but do provide DNS service.
|
||||||
|
.TP
|
||||||
|
.B --no-dhcpv4-interface=<interface name>
|
||||||
|
Disable only IPv4 DHCP on the specified interface.
|
||||||
|
.TP
|
||||||
|
.B
|
||||||
|
--no-dhcpv6-interface=<interface name>
|
||||||
|
Disable IPv6 DHCP and router advertisement on the specified interface.
|
||||||
.TP
|
.TP
|
||||||
.B \-a, --listen-address=<ipaddr>
|
.B \-a, --listen-address=<ipaddr>
|
||||||
Listen on the given IP address(es). Both
|
Listen on the given IP address(es). Both
|
||||||
@@ -375,6 +385,20 @@ Remove A records from answers. No IPv4 addresses will be returned.
|
|||||||
.B --filter-AAAA
|
.B --filter-AAAA
|
||||||
Remove AAAA records from answers. No IPv6 addresses will be returned.
|
Remove AAAA records from answers. No IPv6 addresses will be returned.
|
||||||
.TP
|
.TP
|
||||||
|
.B --filter-rr=<rrtype>[,<rrtype>...]
|
||||||
|
Remove records of the specified type(s) from answers. The otherwise-nonsensical --filter-rr=ANY has
|
||||||
|
a special meaning: it filters replies to queries for type ANY. Everything other than A, AAAA, MX and CNAME
|
||||||
|
records are removed. Since ANY queries with forged source addresses can be used in DNS amplification attacks
|
||||||
|
(replies to ANY queries can be large) this defangs such attacks, whilst still supporting the
|
||||||
|
one remaining possible use of ANY queries. See RFC 8482 para 4.3 for details.
|
||||||
|
.TP
|
||||||
|
.B --cache-rr=<rrtype>[,<rrtype>...]
|
||||||
|
By default, dnsmasq caches A, AAAA, CNAME and SRV DNS record types.
|
||||||
|
This option adds other record types to the cache. The RR-type can be given
|
||||||
|
as a name such as TXT or MX or a decimal number. A single --cache-rr option
|
||||||
|
can take a comma-separated list of RR-types and more than one --cache-rr option
|
||||||
|
is allowed. Use --cache-rr=ANY to enable caching for all RR-types.
|
||||||
|
.TP
|
||||||
.B \-r, --resolv-file=<file>
|
.B \-r, --resolv-file=<file>
|
||||||
Read the IP addresses of the upstream nameservers from <file>, instead of
|
Read the IP addresses of the upstream nameservers from <file>, instead of
|
||||||
/etc/resolv.conf. For the format of this file see
|
/etc/resolv.conf. For the format of this file see
|
||||||
@@ -828,11 +852,12 @@ name on successive queries, for load-balancing. This turns off that
|
|||||||
behaviour, so that the records are always returned in the order
|
behaviour, so that the records are always returned in the order
|
||||||
that they are received from upstream.
|
that they are received from upstream.
|
||||||
.TP
|
.TP
|
||||||
.B --use-stale-cache
|
.B --use-stale-cache[=<max TTL excess in s>]
|
||||||
When set, if a DNS name exists in the cache, but its time-to-live has expired, dnsmasq will return the data anyway. (It attempts to refresh the
|
When set, if a DNS name exists in the cache, but its time-to-live has expired, dnsmasq will return the data anyway. (It attempts to refresh the
|
||||||
data with an upstream query after returning the stale data.) This can improve speed and reliability. It comes at the expense
|
data with an upstream query after returning the stale data.) This can improve speed and reliability. It comes at the expense
|
||||||
of sometimes returning out-of-date data and less efficient cache utilisation, since old data cannot be flushed when its TTL expires, so the cache becomes
|
of sometimes returning out-of-date data and less efficient cache utilisation, since old data cannot be flushed when its TTL expires, so the cache becomes
|
||||||
strictly least-recently-used.
|
mostly least-recently-used. To mitigate issues caused by massively outdated DNS replies, the maximum overaging of cached records can be specified in seconds
|
||||||
|
(defaulting to not serve anything older than one day). Setting the TTL excess time to zero will serve stale cache data regardless how long it has expired.
|
||||||
.TP
|
.TP
|
||||||
.B \-0, --dns-forward-max=<queries>
|
.B \-0, --dns-forward-max=<queries>
|
||||||
Set the maximum number of concurrent DNS queries. The default value is
|
Set the maximum number of concurrent DNS queries. The default value is
|
||||||
@@ -906,6 +931,15 @@ Authenticated Data bit correctly in all cases is not technically possible. If th
|
|||||||
when using this option, then the cache should be disabled using --cache-size=0. In most cases, enabling DNSSEC validation
|
when using this option, then the cache should be disabled using --cache-size=0. In most cases, enabling DNSSEC validation
|
||||||
within dnsmasq is a better option. See --dnssec for details.
|
within dnsmasq is a better option. See --dnssec for details.
|
||||||
.TP
|
.TP
|
||||||
|
.B --dnssec-limits=<limit>[,<limit>.......]
|
||||||
|
Override the default resource limits applied to DNSSEC validation. Cryptographic operations are expensive and crafted domains
|
||||||
|
can DoS a DNSSEC validator by forcing it to do hundreds of thousands of such operations. To avoid this, the dnsmasq validation code
|
||||||
|
applies limits on how much work will be expended in validation. If any of the limits are exceeded, the validation will fail and the
|
||||||
|
domain treated as BOGUS. There are four limits, in order(default values in parens): number a signature validation fails per RRset(20), number of signature validations and
|
||||||
|
hash computations per query(200), number of sub-queries to fetch DS and DNSKEY RRsets per query(40), and the number of iterations in a NSEC3 record(150).
|
||||||
|
The maximum values reached during validation are stored, and dumped as part of the stats generated by SIGUSR1. Supplying a limit value of 0 leaves the default in place, so
|
||||||
|
\fB--dnssec-limits=0,0,20\fP sets the number of sub-queries to 20 whilst leaving the other limits at default values.
|
||||||
|
.TP
|
||||||
.B --dnssec-debug
|
.B --dnssec-debug
|
||||||
Set debugging mode for the DNSSEC validation, set the Checking Disabled bit on upstream queries,
|
Set debugging mode for the DNSSEC validation, set the Checking Disabled bit on upstream queries,
|
||||||
and don't convert replies which do not validate to responses with
|
and don't convert replies which do not validate to responses with
|
||||||
@@ -1166,7 +1200,8 @@ given in a
|
|||||||
.B --dhcp-host
|
.B --dhcp-host
|
||||||
option, but aliases are possible by using CNAMEs. (See
|
option, but aliases are possible by using CNAMEs. (See
|
||||||
.B --cname
|
.B --cname
|
||||||
).
|
). Note that /etc/hosts is NOT used when the DNS server side of dnsmasq
|
||||||
|
is disabled by setting the DNS server port to zero.
|
||||||
|
|
||||||
More than one
|
More than one
|
||||||
.B --dhcp-host
|
.B --dhcp-host
|
||||||
@@ -1297,6 +1332,14 @@ or
|
|||||||
The special address 0.0.0.0 is taken to mean "the address of the
|
The special address 0.0.0.0 is taken to mean "the address of the
|
||||||
machine running dnsmasq".
|
machine running dnsmasq".
|
||||||
|
|
||||||
|
An option without data is valid, and includes just the option without data.
|
||||||
|
(There is only one option with a zero length data field currently defined for DHCPv4, 80:rapid commit, so this feature is not very useful in practice). Options for which dnsmasq normally
|
||||||
|
provides default values can be ommitted by defining the option with no data. These are
|
||||||
|
netmask, broadcast, router, DNS server, domainname and hostname. Thus, for DHCPv4
|
||||||
|
.B --dhcp-option = option:router
|
||||||
|
will result in no router option being sent, rather than the default of the host on which dnsmasq is running. For DHCPv6, the same is true of the options DNS server and refresh time.
|
||||||
|
|
||||||
|
|
||||||
Data types allowed are comma separated
|
Data types allowed are comma separated
|
||||||
dotted-quad IPv4 addresses, []-wrapped IPv6 addresses, a decimal number, colon-separated hex digits
|
dotted-quad IPv4 addresses, []-wrapped IPv6 addresses, a decimal number, colon-separated hex digits
|
||||||
and a text string. If the optional tags are given then
|
and a text string. If the optional tags are given then
|
||||||
@@ -2213,6 +2256,24 @@ exit 0
|
|||||||
|
|
||||||
and /share/ads-domains.gz containing a compressed
|
and /share/ads-domains.gz containing a compressed
|
||||||
list of ad server domains will save disk space with large ad-server blocklists.
|
list of ad server domains will save disk space with large ad-server blocklists.
|
||||||
|
.TP
|
||||||
|
.B --no-ident
|
||||||
|
Do not respond to class CHAOS and type TXT in domain bind queries.
|
||||||
|
|
||||||
|
Without this option being set, the cache statistics are also available in the
|
||||||
|
DNS as answers to queries of class CHAOS and type TXT in domain bind. The domain
|
||||||
|
names are cachesize.bind, insertions.bind, evictions.bind, misses.bind,
|
||||||
|
hits.bind, auth.bind and servers.bind unless disabled at compile-time. An
|
||||||
|
example command to query this, using the
|
||||||
|
.B dig
|
||||||
|
utility would be
|
||||||
|
|
||||||
|
dig +short chaos txt cachesize.bind
|
||||||
|
.TP
|
||||||
|
.B --max-tcp-connections=<number>
|
||||||
|
The maximum number of concurrent TCP connections. The application forks to
|
||||||
|
handle each TCP request. The default maximum is 20.
|
||||||
|
|
||||||
.SH CONFIG FILE
|
.SH CONFIG FILE
|
||||||
At startup, dnsmasq reads
|
At startup, dnsmasq reads
|
||||||
.I /etc/dnsmasq.conf,
|
.I /etc/dnsmasq.conf,
|
||||||
@@ -2257,20 +2318,11 @@ they expired in order to make room for new names and the total number
|
|||||||
of names that have been inserted into the cache. The number of cache hits and
|
of names that have been inserted into the cache. The number of cache hits and
|
||||||
misses and the number of authoritative queries answered are also given. For each upstream
|
misses and the number of authoritative queries answered are also given. For each upstream
|
||||||
server it gives the number of queries sent, and the number which
|
server it gives the number of queries sent, and the number which
|
||||||
resulted in an error. In
|
resulted in an error. It also gives information on the number of forks for TCP connections. In
|
||||||
.B --no-daemon
|
.B --no-daemon
|
||||||
mode or when full logging is enabled (\fB--log-queries\fP), a complete dump of the
|
mode or when full logging is enabled (\fB--log-queries\fP), a complete dump of the
|
||||||
contents of the cache is made.
|
contents of the cache is made.
|
||||||
|
|
||||||
The cache statistics are also available in the DNS as answers to
|
|
||||||
queries of class CHAOS and type TXT in domain bind. The domain names are cachesize.bind, insertions.bind, evictions.bind,
|
|
||||||
misses.bind, hits.bind, auth.bind and servers.bind. An example command to query this, using the
|
|
||||||
.B dig
|
|
||||||
utility would be
|
|
||||||
|
|
||||||
dig +short chaos txt cachesize.bind
|
|
||||||
|
|
||||||
.PP
|
|
||||||
When it receives SIGUSR2 and it is logging direct to a file (see
|
When it receives SIGUSR2 and it is logging direct to a file (see
|
||||||
.B --log-facility
|
.B --log-facility
|
||||||
)
|
)
|
||||||
|
|||||||
+846
-679
File diff suppressed because it is too large.
Load diff
@@ -1,4 +1,4 @@
|
|||||||
/* dnsmasq is Copyright (c) 2000-2022 Simon Kelley
|
/* dnsmasq is Copyright (c) 2000-2024 Simon Kelley
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
/* dnsmasq is Copyright (c) 2000-2022 Simon Kelley
|
/* dnsmasq is Copyright (c) 2000-2024 Simon Kelley
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+93
-30
@@ -1,4 +1,4 @@
|
|||||||
/* dnsmasq is Copyright (c) 2000-2022 Simon Kelley
|
/* dnsmasq is Copyright (c) 2000-2024 Simon Kelley
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
static struct blockdata *keyblock_free;
|
static struct blockdata *keyblock_free;
|
||||||
static unsigned int blockdata_count, blockdata_hwm, blockdata_alloced;
|
static unsigned int blockdata_count, blockdata_hwm, blockdata_alloced;
|
||||||
|
|
||||||
static void blockdata_expand(int n)
|
static void add_blocks(int n)
|
||||||
{
|
{
|
||||||
struct blockdata *new = whine_malloc(n * sizeof(struct blockdata));
|
struct blockdata *new = whine_malloc(n * sizeof(struct blockdata));
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ void blockdata_init(void)
|
|||||||
|
|
||||||
/* Note that daemon->cachesize is enforced to have non-zero size if OPT_DNSSEC_VALID is set */
|
/* Note that daemon->cachesize is enforced to have non-zero size if OPT_DNSSEC_VALID is set */
|
||||||
if (option_bool(OPT_DNSSEC_VALID))
|
if (option_bool(OPT_DNSSEC_VALID))
|
||||||
blockdata_expand(daemon->cachesize);
|
add_blocks(daemon->cachesize);
|
||||||
}
|
}
|
||||||
|
|
||||||
void blockdata_report(void)
|
void blockdata_report(void)
|
||||||
@@ -58,50 +58,61 @@ void blockdata_report(void)
|
|||||||
blockdata_alloced * sizeof(struct blockdata));
|
blockdata_alloced * sizeof(struct blockdata));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct blockdata *new_block(void)
|
||||||
|
{
|
||||||
|
struct blockdata *block;
|
||||||
|
|
||||||
|
if (!keyblock_free)
|
||||||
|
add_blocks(50);
|
||||||
|
|
||||||
|
if (keyblock_free)
|
||||||
|
{
|
||||||
|
block = keyblock_free;
|
||||||
|
keyblock_free = block->next;
|
||||||
|
blockdata_count++;
|
||||||
|
if (blockdata_hwm < blockdata_count)
|
||||||
|
blockdata_hwm = blockdata_count;
|
||||||
|
block->next = NULL;
|
||||||
|
return block;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static struct blockdata *blockdata_alloc_real(int fd, char *data, size_t len)
|
static struct blockdata *blockdata_alloc_real(int fd, char *data, size_t len)
|
||||||
{
|
{
|
||||||
struct blockdata *block, *ret = NULL;
|
struct blockdata *block, *ret = NULL;
|
||||||
struct blockdata **prev = &ret;
|
struct blockdata **prev = &ret;
|
||||||
size_t blen;
|
size_t blen;
|
||||||
|
|
||||||
while (len > 0)
|
do
|
||||||
{
|
{
|
||||||
if (!keyblock_free)
|
if (!(block = new_block()))
|
||||||
blockdata_expand(50);
|
|
||||||
|
|
||||||
if (keyblock_free)
|
|
||||||
{
|
|
||||||
block = keyblock_free;
|
|
||||||
keyblock_free = block->next;
|
|
||||||
blockdata_count++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
/* failed to alloc, free partial chain */
|
/* failed to alloc, free partial chain */
|
||||||
blockdata_free(ret);
|
blockdata_free(ret);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (blockdata_hwm < blockdata_count)
|
if ((blen = len > KEYBLOCK_LEN ? KEYBLOCK_LEN : len) > 0)
|
||||||
blockdata_hwm = blockdata_count;
|
{
|
||||||
|
if (data)
|
||||||
|
{
|
||||||
|
memcpy(block->key, data, blen);
|
||||||
|
data += blen;
|
||||||
|
}
|
||||||
|
else if (!read_write(fd, block->key, blen, 1))
|
||||||
|
{
|
||||||
|
/* failed read free partial chain */
|
||||||
|
blockdata_free(ret);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
blen = len > KEYBLOCK_LEN ? KEYBLOCK_LEN : len;
|
|
||||||
if (data)
|
|
||||||
{
|
|
||||||
memcpy(block->key, data, blen);
|
|
||||||
data += blen;
|
|
||||||
}
|
|
||||||
else if (!read_write(fd, block->key, blen, 1))
|
|
||||||
{
|
|
||||||
/* failed read free partial chain */
|
|
||||||
blockdata_free(ret);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
len -= blen;
|
len -= blen;
|
||||||
*prev = block;
|
*prev = block;
|
||||||
prev = &block->next;
|
prev = &block->next;
|
||||||
block->next = NULL;
|
} while (len != 0);
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -111,6 +122,58 @@ struct blockdata *blockdata_alloc(char *data, size_t len)
|
|||||||
return blockdata_alloc_real(0, data, len);
|
return blockdata_alloc_real(0, data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Add data to the end of the block.
|
||||||
|
newlen is length of new data, NOT total new length.
|
||||||
|
Use blockdata_alloc(NULL, 0) to make empty block to add to. */
|
||||||
|
int blockdata_expand(struct blockdata *block, size_t oldlen, char *data, size_t newlen)
|
||||||
|
{
|
||||||
|
struct blockdata *b;
|
||||||
|
|
||||||
|
/* find size of current final block */
|
||||||
|
for (b = block; oldlen > KEYBLOCK_LEN && b; b = b->next, oldlen -= KEYBLOCK_LEN);
|
||||||
|
|
||||||
|
/* chain to short for length, something is broken */
|
||||||
|
if (oldlen > KEYBLOCK_LEN)
|
||||||
|
{
|
||||||
|
blockdata_free(block);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
struct blockdata *new;
|
||||||
|
size_t blocksize = KEYBLOCK_LEN - oldlen;
|
||||||
|
size_t size = (newlen <= blocksize) ? newlen : blocksize;
|
||||||
|
|
||||||
|
if (size != 0)
|
||||||
|
{
|
||||||
|
memcpy(&b->key[oldlen], data, size);
|
||||||
|
data += size;
|
||||||
|
newlen -= size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* full blocks from now on. */
|
||||||
|
oldlen = 0;
|
||||||
|
|
||||||
|
if (newlen == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if ((new = new_block()))
|
||||||
|
{
|
||||||
|
b->next = new;
|
||||||
|
b = new;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* failed to alloc, free partial chain */
|
||||||
|
blockdata_free(block);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
void blockdata_free(struct blockdata *blocks)
|
void blockdata_free(struct blockdata *blocks)
|
||||||
{
|
{
|
||||||
struct blockdata *tmp;
|
struct blockdata *tmp;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* dnsmasq is Copyright (c) 2000-2022 Simon Kelley
|
/* dnsmasq is Copyright (c) 2000-2024 Simon Kelley
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+265
-162
@@ -1,4 +1,4 @@
|
|||||||
/* dnsmasq is Copyright (c) 2000-2022 Simon Kelley
|
/* dnsmasq is Copyright (c) 2000-2024 Simon Kelley
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -28,6 +28,8 @@ static int bignames_left, hash_size;
|
|||||||
static void make_non_terminals(struct crec *source);
|
static void make_non_terminals(struct crec *source);
|
||||||
static struct crec *really_insert(char *name, union all_addr *addr, unsigned short class,
|
static struct crec *really_insert(char *name, union all_addr *addr, unsigned short class,
|
||||||
time_t now, unsigned long ttl, unsigned int flags);
|
time_t now, unsigned long ttl, unsigned int flags);
|
||||||
|
static void dump_cache_entry(struct crec *cache, time_t now);
|
||||||
|
static char *querystr(char *desc, unsigned short type);
|
||||||
|
|
||||||
/* type->string mapping: this is also used by the name-hash function as a mixing table. */
|
/* type->string mapping: this is also used by the name-hash function as a mixing table. */
|
||||||
/* taken from https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml */
|
/* taken from https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml */
|
||||||
@@ -122,6 +124,7 @@ static const struct {
|
|||||||
{ 258, "AVC" }, /* Application Visibility and Control [Wolfgang_Riedel] AVC/avc-completed-template 2016-02-26*/
|
{ 258, "AVC" }, /* Application Visibility and Control [Wolfgang_Riedel] AVC/avc-completed-template 2016-02-26*/
|
||||||
{ 259, "DOA" }, /* Digital Object Architecture [draft-durand-doa-over-dns] DOA/doa-completed-template 2017-08-30*/
|
{ 259, "DOA" }, /* Digital Object Architecture [draft-durand-doa-over-dns] DOA/doa-completed-template 2017-08-30*/
|
||||||
{ 260, "AMTRELAY" }, /* Automatic Multicast Tunneling Relay [RFC8777] AMTRELAY/amtrelay-completed-template 2019-02-06*/
|
{ 260, "AMTRELAY" }, /* Automatic Multicast Tunneling Relay [RFC8777] AMTRELAY/amtrelay-completed-template 2019-02-06*/
|
||||||
|
{ 261, "RESINFO" }, /* Resolver Information as Key/Value Pairs https://datatracker.ietf.org/doc/draft-ietf-add-resolver-info/06/ */
|
||||||
{ 32768, "TA" }, /* DNSSEC Trust Authorities [Sam_Weiler][http://cameo.library.cmu.edu/][ Deploying DNSSEC Without a Signed Root. Technical Report 1999-19, Information Networking Institute, Carnegie Mellon University, April 2004.] 2005-12-13*/
|
{ 32768, "TA" }, /* DNSSEC Trust Authorities [Sam_Weiler][http://cameo.library.cmu.edu/][ Deploying DNSSEC Without a Signed Root. Technical Report 1999-19, Information Networking Institute, Carnegie Mellon University, April 2004.] 2005-12-13*/
|
||||||
{ 32769, "DLV" }, /* DNSSEC Lookaside Validation (OBSOLETE) [RFC8749][RFC4431] */
|
{ 32769, "DLV" }, /* DNSSEC Lookaside Validation (OBSOLETE) [RFC8749][RFC4431] */
|
||||||
};
|
};
|
||||||
@@ -132,6 +135,17 @@ static void cache_link(struct crec *crecp);
|
|||||||
static void rehash(int size);
|
static void rehash(int size);
|
||||||
static void cache_hash(struct crec *crecp);
|
static void cache_hash(struct crec *crecp);
|
||||||
|
|
||||||
|
unsigned short rrtype(char *in)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i = 0; i < (sizeof(typestr)/sizeof(typestr[0])); i++)
|
||||||
|
if (strcasecmp(in, typestr[i].name) == 0)
|
||||||
|
return typestr[i].type;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void next_uid(struct crec *crecp)
|
void next_uid(struct crec *crecp)
|
||||||
{
|
{
|
||||||
static unsigned int uid = 0;
|
static unsigned int uid = 0;
|
||||||
@@ -235,19 +249,23 @@ static void cache_hash(struct crec *crecp)
|
|||||||
|
|
||||||
char *name = cache_get_name(crecp);
|
char *name = cache_get_name(crecp);
|
||||||
struct crec **up = hash_bucket(name);
|
struct crec **up = hash_bucket(name);
|
||||||
|
unsigned int flags = crecp->flags & (F_IMMORTAL | F_REVERSE);
|
||||||
|
|
||||||
if (!(crecp->flags & F_REVERSE))
|
if (!(flags & F_REVERSE))
|
||||||
{
|
{
|
||||||
while (*up && ((*up)->flags & F_REVERSE))
|
while (*up && ((*up)->flags & F_REVERSE))
|
||||||
up = &((*up)->hash_next);
|
up = &((*up)->hash_next);
|
||||||
|
|
||||||
if (crecp->flags & F_IMMORTAL)
|
if (flags & F_IMMORTAL)
|
||||||
while (*up && !((*up)->flags & F_IMMORTAL))
|
while (*up && !((*up)->flags & F_IMMORTAL))
|
||||||
up = &((*up)->hash_next);
|
up = &((*up)->hash_next);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Preserve order when inserting the same name multiple times. */
|
/* Preserve order when inserting the same name multiple times.
|
||||||
while (*up && hostname_isequal(cache_get_name(*up), name))
|
Do not mess up the flag invariants. */
|
||||||
|
while (*up &&
|
||||||
|
hostname_isequal(cache_get_name(*up), name) &&
|
||||||
|
flags == ((*up)->flags & (F_IMMORTAL | F_REVERSE)))
|
||||||
up = &((*up)->hash_next);
|
up = &((*up)->hash_next);
|
||||||
|
|
||||||
crecp->hash_next = *up;
|
crecp->hash_next = *up;
|
||||||
@@ -258,8 +276,8 @@ static void cache_blockdata_free(struct crec *crecp)
|
|||||||
{
|
{
|
||||||
if (!(crecp->flags & F_NEG))
|
if (!(crecp->flags & F_NEG))
|
||||||
{
|
{
|
||||||
if (crecp->flags & F_SRV)
|
if ((crecp->flags & F_RR) && (crecp->flags & F_KEYTAG))
|
||||||
blockdata_free(crecp->addr.srv.target);
|
blockdata_free(crecp->addr.rrblock.rrdata);
|
||||||
#ifdef HAVE_DNSSEC
|
#ifdef HAVE_DNSSEC
|
||||||
else if (crecp->flags & F_DNSKEY)
|
else if (crecp->flags & F_DNSKEY)
|
||||||
blockdata_free(crecp->addr.key.keydata);
|
blockdata_free(crecp->addr.key.keydata);
|
||||||
@@ -380,9 +398,17 @@ static int is_outdated_cname_pointer(struct crec *crecp)
|
|||||||
|
|
||||||
static int is_expired(time_t now, struct crec *crecp)
|
static int is_expired(time_t now, struct crec *crecp)
|
||||||
{
|
{
|
||||||
/* Don't dump expired entries if we're using them, cache becomes strictly LRU in that case.
|
/* Don't dump expired entries if they are within the accepted timeout range.
|
||||||
Never use expired DS or DNSKEY entries. */
|
The cache becomes approx. LRU. Never use expired DS or DNSKEY entries.
|
||||||
if (option_bool(OPT_STALE_CACHE) && !(crecp->flags & (F_DS | F_DNSKEY)))
|
Possible values for daemon->cache_max_expiry:
|
||||||
|
-1 == serve cached content regardless how long ago it expired
|
||||||
|
0 == the option is disabled, expired content isn't served
|
||||||
|
<n> == serve cached content only if it expire less than <n> seconds
|
||||||
|
ago (where n is a positive integer) */
|
||||||
|
if (daemon->cache_max_expiry != 0 &&
|
||||||
|
(daemon->cache_max_expiry == -1 ||
|
||||||
|
difftime(now, crecp->ttd) < daemon->cache_max_expiry) &&
|
||||||
|
!(crecp->flags & (F_DS | F_DNSKEY)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (crecp->flags & F_IMMORTAL)
|
if (crecp->flags & F_IMMORTAL)
|
||||||
@@ -399,18 +425,21 @@ unsigned int cache_remove_uid(const unsigned int uid)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
unsigned int removed = 0;
|
unsigned int removed = 0;
|
||||||
struct crec *crecp, **up;
|
struct crec *crecp, *tmp, **up;
|
||||||
|
|
||||||
for (i = 0; i < hash_size; i++)
|
for (i = 0; i < hash_size; i++)
|
||||||
for (crecp = hash_table[i], up = &hash_table[i]; crecp; crecp = crecp->hash_next)
|
for (crecp = hash_table[i], up = &hash_table[i]; crecp; crecp = tmp)
|
||||||
if ((crecp->flags & (F_HOSTS | F_DHCP | F_CONFIG)) && crecp->uid == uid)
|
{
|
||||||
{
|
tmp = crecp->hash_next;
|
||||||
*up = crecp->hash_next;
|
if ((crecp->flags & (F_HOSTS | F_DHCP | F_CONFIG)) && crecp->uid == uid)
|
||||||
free(crecp);
|
{
|
||||||
removed++;
|
*up = tmp;
|
||||||
}
|
free(crecp);
|
||||||
else
|
removed++;
|
||||||
up = &crecp->hash_next;
|
}
|
||||||
|
else
|
||||||
|
up = &crecp->hash_next;
|
||||||
|
}
|
||||||
|
|
||||||
return removed;
|
return removed;
|
||||||
}
|
}
|
||||||
@@ -444,9 +473,20 @@ static struct crec *cache_scan_free(char *name, union all_addr *addr, unsigned s
|
|||||||
{
|
{
|
||||||
if ((crecp->flags & F_FORWARD) && hostname_isequal(cache_get_name(crecp), name))
|
if ((crecp->flags & F_FORWARD) && hostname_isequal(cache_get_name(crecp), name))
|
||||||
{
|
{
|
||||||
|
int rrmatch = 0;
|
||||||
|
if (crecp->flags & flags & F_RR)
|
||||||
|
{
|
||||||
|
unsigned short rrc = (crecp->flags & F_KEYTAG) ? crecp->addr.rrblock.rrtype : crecp->addr.rrdata.rrtype;
|
||||||
|
unsigned short rra = (flags & F_KEYTAG) ? addr->rrblock.rrtype : addr->rrdata.rrtype;
|
||||||
|
|
||||||
|
if (rrc == rra)
|
||||||
|
rrmatch = 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* Don't delete DNSSEC in favour of a CNAME, they can co-exist */
|
/* Don't delete DNSSEC in favour of a CNAME, they can co-exist */
|
||||||
if ((flags & crecp->flags & (F_IPV4 | F_IPV6 | F_SRV | F_NXDOMAIN)) ||
|
if ((flags & crecp->flags & (F_IPV4 | F_IPV6 | F_NXDOMAIN)) ||
|
||||||
(((crecp->flags | flags) & F_CNAME) && !(crecp->flags & (F_DNSKEY | F_DS))))
|
(((crecp->flags | flags) & F_CNAME) && !(crecp->flags & (F_DNSKEY | F_DS))) ||
|
||||||
|
rrmatch)
|
||||||
{
|
{
|
||||||
if (crecp->flags & (F_HOSTS | F_DHCP | F_CONFIG))
|
if (crecp->flags & (F_HOSTS | F_DHCP | F_CONFIG))
|
||||||
return crecp;
|
return crecp;
|
||||||
@@ -586,15 +626,15 @@ static struct crec *really_insert(char *name, union all_addr *addr, unsigned sho
|
|||||||
struct crec *new, *target_crec = NULL;
|
struct crec *new, *target_crec = NULL;
|
||||||
union bigname *big_name = NULL;
|
union bigname *big_name = NULL;
|
||||||
int freed_all = (flags & F_REVERSE);
|
int freed_all = (flags & F_REVERSE);
|
||||||
int free_avail = 0;
|
struct crec *free_avail = NULL;
|
||||||
unsigned int target_uid;
|
unsigned int target_uid;
|
||||||
|
|
||||||
/* if previous insertion failed give up now. */
|
/* if previous insertion failed give up now. */
|
||||||
if (insert_error)
|
if (insert_error)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* we don't cache zero-TTL records. */
|
/* we don't cache zero-TTL records unless we're doing stale-caching. */
|
||||||
if (ttl == 0)
|
if (daemon->cache_max_expiry == 0 && ttl == 0)
|
||||||
{
|
{
|
||||||
insert_error = 1;
|
insert_error = 1;
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -646,12 +686,9 @@ static struct crec *really_insert(char *name, union all_addr *addr, unsigned sho
|
|||||||
insert. Once in this state, all inserts will probably fail. */
|
insert. Once in this state, all inserts will probably fail. */
|
||||||
if (free_avail)
|
if (free_avail)
|
||||||
{
|
{
|
||||||
static int warned = 0;
|
my_syslog(LOG_ERR, _("Internal error in cache."));
|
||||||
if (!warned)
|
/* Log the entry we tried to delete. */
|
||||||
{
|
dump_cache_entry(free_avail, now);
|
||||||
my_syslog(LOG_ERR, _("Internal error in cache."));
|
|
||||||
warned = 1;
|
|
||||||
}
|
|
||||||
insert_error = 1;
|
insert_error = 1;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -659,7 +696,7 @@ static struct crec *really_insert(char *name, union all_addr *addr, unsigned sho
|
|||||||
if (freed_all)
|
if (freed_all)
|
||||||
{
|
{
|
||||||
/* For DNSSEC records, uid holds class. */
|
/* For DNSSEC records, uid holds class. */
|
||||||
free_avail = 1; /* Must be free space now. */
|
free_avail = new; /* Must be free space now. */
|
||||||
|
|
||||||
/* condition valid when stale-caching */
|
/* condition valid when stale-caching */
|
||||||
if (difftime(now, new->ttd) < 0)
|
if (difftime(now, new->ttd) < 0)
|
||||||
@@ -765,14 +802,13 @@ void cache_end_insert(void)
|
|||||||
read_write(daemon->pipe_to_parent, (unsigned char *)name, m, 0);
|
read_write(daemon->pipe_to_parent, (unsigned char *)name, m, 0);
|
||||||
read_write(daemon->pipe_to_parent, (unsigned char *)&new_chain->ttd, sizeof(new_chain->ttd), 0);
|
read_write(daemon->pipe_to_parent, (unsigned char *)&new_chain->ttd, sizeof(new_chain->ttd), 0);
|
||||||
read_write(daemon->pipe_to_parent, (unsigned char *)&flags, sizeof(flags), 0);
|
read_write(daemon->pipe_to_parent, (unsigned char *)&flags, sizeof(flags), 0);
|
||||||
|
read_write(daemon->pipe_to_parent, (unsigned char *)&new_chain->addr, sizeof(new_chain->addr), 0);
|
||||||
|
|
||||||
if (flags & (F_IPV4 | F_IPV6 | F_DNSKEY | F_DS | F_SRV))
|
if (flags & F_RR)
|
||||||
read_write(daemon->pipe_to_parent, (unsigned char *)&new_chain->addr, sizeof(new_chain->addr), 0);
|
|
||||||
if (flags & F_SRV)
|
|
||||||
{
|
{
|
||||||
/* A negative SRV entry is possible and has no data, obviously. */
|
/* A negative RR entry is possible and has no data, obviously. */
|
||||||
if (!(flags & F_NEG))
|
if (!(flags & F_NEG) && (flags & F_KEYTAG))
|
||||||
blockdata_write(new_chain->addr.srv.target, new_chain->addr.srv.targetlen, daemon->pipe_to_parent);
|
blockdata_write(new_chain->addr.rrblock.rrdata, new_chain->addr.rrblock.datalen, daemon->pipe_to_parent);
|
||||||
}
|
}
|
||||||
#ifdef HAVE_DNSSEC
|
#ifdef HAVE_DNSSEC
|
||||||
if (flags & F_DNSKEY)
|
if (flags & F_DNSKEY)
|
||||||
@@ -798,7 +834,18 @@ void cache_end_insert(void)
|
|||||||
if (daemon->pipe_to_parent != -1)
|
if (daemon->pipe_to_parent != -1)
|
||||||
{
|
{
|
||||||
ssize_t m = -1;
|
ssize_t m = -1;
|
||||||
|
|
||||||
read_write(daemon->pipe_to_parent, (unsigned char *)&m, sizeof(m), 0);
|
read_write(daemon->pipe_to_parent, (unsigned char *)&m, sizeof(m), 0);
|
||||||
|
|
||||||
|
#ifdef HAVE_DNSSEC
|
||||||
|
/* Sneak out possibly updated crypto HWM values. */
|
||||||
|
m = daemon->metrics[METRIC_CRYPTO_HWM];
|
||||||
|
read_write(daemon->pipe_to_parent, (unsigned char *)&m, sizeof(m), 0);
|
||||||
|
m = daemon->metrics[METRIC_SIG_FAIL_HWM];
|
||||||
|
read_write(daemon->pipe_to_parent, (unsigned char *)&m, sizeof(m), 0);
|
||||||
|
m = daemon->metrics[METRIC_WORK_HWM];
|
||||||
|
read_write(daemon->pipe_to_parent, (unsigned char *)&m, sizeof(m), 0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
new_chain = NULL;
|
new_chain = NULL;
|
||||||
@@ -817,7 +864,7 @@ int cache_recv_insert(time_t now, int fd)
|
|||||||
|
|
||||||
cache_start_insert();
|
cache_start_insert();
|
||||||
|
|
||||||
while(1)
|
while (1)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (!read_write(fd, (unsigned char *)&m, sizeof(m), 1))
|
if (!read_write(fd, (unsigned char *)&m, sizeof(m), 1))
|
||||||
@@ -825,47 +872,36 @@ int cache_recv_insert(time_t now, int fd)
|
|||||||
|
|
||||||
if (m == -1)
|
if (m == -1)
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_DNSSEC
|
||||||
|
/* Sneak in possibly updated crypto HWM. */
|
||||||
|
if (!read_write(fd, (unsigned char *)&m, sizeof(m), 1))
|
||||||
|
return 0;
|
||||||
|
if (m > daemon->metrics[METRIC_CRYPTO_HWM])
|
||||||
|
daemon->metrics[METRIC_CRYPTO_HWM] = m;
|
||||||
|
if (!read_write(fd, (unsigned char *)&m, sizeof(m), 1))
|
||||||
|
return 0;
|
||||||
|
if (m > daemon->metrics[METRIC_SIG_FAIL_HWM])
|
||||||
|
daemon->metrics[METRIC_SIG_FAIL_HWM] = m;
|
||||||
|
if (!read_write(fd, (unsigned char *)&m, sizeof(m), 1))
|
||||||
|
return 0;
|
||||||
|
if (m > daemon->metrics[METRIC_WORK_HWM])
|
||||||
|
daemon->metrics[METRIC_WORK_HWM] = m;
|
||||||
|
#endif
|
||||||
cache_end_insert();
|
cache_end_insert();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!read_write(fd, (unsigned char *)daemon->namebuff, m, 1) ||
|
if (!read_write(fd, (unsigned char *)daemon->namebuff, m, 1) ||
|
||||||
!read_write(fd, (unsigned char *)&ttd, sizeof(ttd), 1) ||
|
!read_write(fd, (unsigned char *)&ttd, sizeof(ttd), 1) ||
|
||||||
!read_write(fd, (unsigned char *)&flags, sizeof(flags), 1))
|
!read_write(fd, (unsigned char *)&flags, sizeof(flags), 1) ||
|
||||||
|
!read_write(fd, (unsigned char *)&addr, sizeof(addr), 1))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
daemon->namebuff[m] = 0;
|
daemon->namebuff[m] = 0;
|
||||||
|
|
||||||
ttl = difftime(ttd, now);
|
ttl = difftime(ttd, now);
|
||||||
|
|
||||||
if (flags & (F_IPV4 | F_IPV6 | F_DNSKEY | F_DS | F_SRV))
|
if (flags & F_CNAME)
|
||||||
{
|
|
||||||
unsigned short class = C_IN;
|
|
||||||
|
|
||||||
if (!read_write(fd, (unsigned char *)&addr, sizeof(addr), 1))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if ((flags & F_SRV) && !(flags & F_NEG) && !(addr.srv.target = blockdata_read(fd, addr.srv.targetlen)))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
#ifdef HAVE_DNSSEC
|
|
||||||
if (flags & F_DNSKEY)
|
|
||||||
{
|
|
||||||
if (!read_write(fd, (unsigned char *)&class, sizeof(class), 1) ||
|
|
||||||
!(addr.key.keydata = blockdata_read(fd, addr.key.keylen)))
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else if (flags & F_DS)
|
|
||||||
{
|
|
||||||
if (!read_write(fd, (unsigned char *)&class, sizeof(class), 1) ||
|
|
||||||
(!(flags & F_NEG) && !(addr.key.keydata = blockdata_read(fd, addr.key.keylen))))
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
crecp = really_insert(daemon->namebuff, &addr, class, now, ttl, flags);
|
|
||||||
}
|
|
||||||
else if (flags & F_CNAME)
|
|
||||||
{
|
{
|
||||||
struct crec *newc = really_insert(daemon->namebuff, NULL, C_IN, now, ttl, flags);
|
struct crec *newc = really_insert(daemon->namebuff, NULL, C_IN, now, ttl, flags);
|
||||||
/* This relies on the fact that the target of a CNAME immediately precedes
|
/* This relies on the fact that the target of a CNAME immediately precedes
|
||||||
@@ -873,11 +909,11 @@ int cache_recv_insert(time_t now, int fd)
|
|||||||
the order reversal on the new_chain. */
|
the order reversal on the new_chain. */
|
||||||
if (newc)
|
if (newc)
|
||||||
{
|
{
|
||||||
newc->addr.cname.is_name_ptr = 0;
|
newc->addr.cname.is_name_ptr = 0;
|
||||||
|
|
||||||
if (!crecp)
|
if (!crecp)
|
||||||
newc->addr.cname.target.cache = NULL;
|
newc->addr.cname.target.cache = NULL;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
next_uid(crecp);
|
next_uid(crecp);
|
||||||
newc->addr.cname.target.cache = crecp;
|
newc->addr.cname.target.cache = crecp;
|
||||||
@@ -885,6 +921,29 @@ int cache_recv_insert(time_t now, int fd)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
unsigned short class = C_IN;
|
||||||
|
|
||||||
|
if ((flags & F_RR) && !(flags & F_NEG) && (flags & F_KEYTAG)
|
||||||
|
&& !(addr.rrblock.rrdata = blockdata_read(fd, addr.rrblock.datalen)))
|
||||||
|
return 0;
|
||||||
|
#ifdef HAVE_DNSSEC
|
||||||
|
if (flags & F_DNSKEY)
|
||||||
|
{
|
||||||
|
if (!read_write(fd, (unsigned char *)&class, sizeof(class), 1) ||
|
||||||
|
!(addr.key.keydata = blockdata_read(fd, addr.key.keylen)))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if (flags & F_DS)
|
||||||
|
{
|
||||||
|
if (!read_write(fd, (unsigned char *)&class, sizeof(class), 1) ||
|
||||||
|
(!(flags & F_NEG) && !(addr.key.keydata = blockdata_read(fd, addr.key.keylen))))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
crecp = really_insert(daemon->namebuff, &addr, class, now, ttl, flags);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1072,7 +1131,6 @@ static void add_hosts_entry(struct crec *cache, union all_addr *addr, int addrle
|
|||||||
the array rhash, hashed on address. Note that rhash and the values
|
the array rhash, hashed on address. Note that rhash and the values
|
||||||
in ->next are only valid whilst reading hosts files: the buckets are
|
in ->next are only valid whilst reading hosts files: the buckets are
|
||||||
then freed, and the ->next pointer used for other things.
|
then freed, and the ->next pointer used for other things.
|
||||||
|
|
||||||
Only insert each unique address once into this hashing structure.
|
Only insert each unique address once into this hashing structure.
|
||||||
|
|
||||||
This complexity avoids O(n^2) divergent CPU use whilst reading
|
This complexity avoids O(n^2) divergent CPU use whilst reading
|
||||||
@@ -1578,7 +1636,7 @@ static void make_non_terminals(struct crec *source)
|
|||||||
if (!is_outdated_cname_pointer(crecp) &&
|
if (!is_outdated_cname_pointer(crecp) &&
|
||||||
(crecp->flags & F_FORWARD) &&
|
(crecp->flags & F_FORWARD) &&
|
||||||
(crecp->flags & type) &&
|
(crecp->flags & type) &&
|
||||||
!(crecp->flags & (F_IPV4 | F_IPV6 | F_CNAME | F_SRV | F_DNSKEY | F_DS)) &&
|
!(crecp->flags & (F_IPV4 | F_IPV6 | F_CNAME | F_DNSKEY | F_DS | F_RR)) &&
|
||||||
hostname_isequal(name, cache_get_name(crecp)))
|
hostname_isequal(name, cache_get_name(crecp)))
|
||||||
{
|
{
|
||||||
*up = crecp->hash_next;
|
*up = crecp->hash_next;
|
||||||
@@ -1635,7 +1693,7 @@ static void make_non_terminals(struct crec *source)
|
|||||||
|
|
||||||
if (crecp)
|
if (crecp)
|
||||||
{
|
{
|
||||||
crecp->flags = (source->flags | F_NAMEP) & ~(F_IPV4 | F_IPV6 | F_CNAME | F_SRV | F_DNSKEY | F_DS | F_REVERSE);
|
crecp->flags = (source->flags | F_NAMEP) & ~(F_IPV4 | F_IPV6 | F_CNAME | F_RR | F_DNSKEY | F_DS | F_REVERSE);
|
||||||
if (!(crecp->flags & F_IMMORTAL))
|
if (!(crecp->flags & F_IMMORTAL))
|
||||||
crecp->ttd = source->ttd;
|
crecp->ttd = source->ttd;
|
||||||
crecp->name.namep = name;
|
crecp->name.namep = name;
|
||||||
@@ -1752,6 +1810,100 @@ static char *sanitise(char *name)
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void dump_cache_entry(struct crec *cache, time_t now)
|
||||||
|
{
|
||||||
|
(void)now;
|
||||||
|
static char *buff = NULL;
|
||||||
|
|
||||||
|
char *p, *t = " ";
|
||||||
|
char *a = daemon->addrbuff, *n = cache_get_name(cache);
|
||||||
|
|
||||||
|
/* String length is limited below */
|
||||||
|
if (!buff && !(buff = whine_malloc(150)))
|
||||||
|
return;
|
||||||
|
|
||||||
|
p = buff;
|
||||||
|
|
||||||
|
*a = 0;
|
||||||
|
|
||||||
|
if (cache->flags & F_REVERSE)
|
||||||
|
{
|
||||||
|
if ((cache->flags & F_NEG))
|
||||||
|
n = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (strlen(n) == 0)
|
||||||
|
n = "<Root>";
|
||||||
|
}
|
||||||
|
|
||||||
|
p += sprintf(p, "%-30.30s ", sanitise(n));
|
||||||
|
if ((cache->flags & F_CNAME) && !is_outdated_cname_pointer(cache))
|
||||||
|
a = sanitise(cache_get_cname_target(cache));
|
||||||
|
else if (cache->flags & F_RR)
|
||||||
|
{
|
||||||
|
if (cache->flags & F_KEYTAG)
|
||||||
|
sprintf(a, "%s", querystr(NULL, cache->addr.rrblock.rrtype));
|
||||||
|
else
|
||||||
|
sprintf(a, "%s", querystr(NULL, cache->addr.rrdata.rrtype));
|
||||||
|
}
|
||||||
|
#ifdef HAVE_DNSSEC
|
||||||
|
else if (cache->flags & F_DS)
|
||||||
|
{
|
||||||
|
if (!(cache->flags & F_NEG))
|
||||||
|
sprintf(a, "%5u %3u %3u", cache->addr.ds.keytag,
|
||||||
|
cache->addr.ds.algo, cache->addr.ds.digest);
|
||||||
|
}
|
||||||
|
else if (cache->flags & F_DNSKEY)
|
||||||
|
sprintf(a, "%5u %3u %3u", cache->addr.key.keytag,
|
||||||
|
cache->addr.key.algo, cache->addr.key.flags);
|
||||||
|
#endif
|
||||||
|
else if (!(cache->flags & F_NEG) || !(cache->flags & F_FORWARD))
|
||||||
|
{
|
||||||
|
a = daemon->addrbuff;
|
||||||
|
if (cache->flags & F_IPV4)
|
||||||
|
inet_ntop(AF_INET, &cache->addr, a, ADDRSTRLEN);
|
||||||
|
else if (cache->flags & F_IPV6)
|
||||||
|
inet_ntop(AF_INET6, &cache->addr, a, ADDRSTRLEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cache->flags & F_IPV4)
|
||||||
|
t = "4";
|
||||||
|
else if (cache->flags & F_IPV6)
|
||||||
|
t = "6";
|
||||||
|
else if (cache->flags & F_CNAME)
|
||||||
|
t = "C";
|
||||||
|
else if (cache->flags & F_RR)
|
||||||
|
t = "T";
|
||||||
|
#ifdef HAVE_DNSSEC
|
||||||
|
else if (cache->flags & F_DS)
|
||||||
|
t = "S";
|
||||||
|
else if (cache->flags & F_DNSKEY)
|
||||||
|
t = "K";
|
||||||
|
#endif
|
||||||
|
else if (!(cache->flags & F_NXDOMAIN)) /* non-terminal */
|
||||||
|
t = "!";
|
||||||
|
|
||||||
|
p += sprintf(p, "%-40.40s %s%s%s%s%s%s%s%s%s%s ", a, t,
|
||||||
|
cache->flags & F_FORWARD ? "F" : " ",
|
||||||
|
cache->flags & F_REVERSE ? "R" : " ",
|
||||||
|
cache->flags & F_IMMORTAL ? "I" : " ",
|
||||||
|
cache->flags & F_DHCP ? "D" : " ",
|
||||||
|
cache->flags & F_NEG ? "N" : " ",
|
||||||
|
cache->flags & F_NXDOMAIN ? "X" : " ",
|
||||||
|
cache->flags & F_HOSTS ? "H" : " ",
|
||||||
|
cache->flags & F_CONFIG ? "C" : " ",
|
||||||
|
cache->flags & F_DNSSECOK ? "V" : " ");
|
||||||
|
#ifdef HAVE_BROKEN_RTC
|
||||||
|
p += sprintf(p, "%-24lu", cache->flags & F_IMMORTAL ? 0: (unsigned long)(cache->ttd - now));
|
||||||
|
#else
|
||||||
|
p += sprintf(p, "%-24.24s", cache->flags & F_IMMORTAL ? "" : ctime(&(cache->ttd)));
|
||||||
|
#endif
|
||||||
|
if(cache->flags & (F_HOSTS | F_CONFIG) && cache->uid > 0)
|
||||||
|
p += sprintf(p, " %-40.40s", record_source(cache->uid));
|
||||||
|
|
||||||
|
my_syslog(LOG_INFO, "%s", buff);
|
||||||
|
}
|
||||||
|
|
||||||
void dump_cache(time_t now)
|
void dump_cache(time_t now)
|
||||||
{
|
{
|
||||||
@@ -1762,13 +1914,23 @@ void dump_cache(time_t now)
|
|||||||
daemon->cachesize, daemon->metrics[METRIC_DNS_CACHE_LIVE_FREED], daemon->metrics[METRIC_DNS_CACHE_INSERTED]);
|
daemon->cachesize, daemon->metrics[METRIC_DNS_CACHE_LIVE_FREED], daemon->metrics[METRIC_DNS_CACHE_INSERTED]);
|
||||||
my_syslog(LOG_INFO, _("queries forwarded %u, queries answered locally %u"),
|
my_syslog(LOG_INFO, _("queries forwarded %u, queries answered locally %u"),
|
||||||
daemon->metrics[METRIC_DNS_QUERIES_FORWARDED], daemon->metrics[METRIC_DNS_LOCAL_ANSWERED]);
|
daemon->metrics[METRIC_DNS_QUERIES_FORWARDED], daemon->metrics[METRIC_DNS_LOCAL_ANSWERED]);
|
||||||
if (option_bool(OPT_STALE_CACHE))
|
if (daemon->cache_max_expiry != 0)
|
||||||
my_syslog(LOG_INFO, _("queries answered from stale cache %u"), daemon->metrics[METRIC_DNS_STALE_ANSWERED]);
|
my_syslog(LOG_INFO, _("queries answered from stale cache %u"), daemon->metrics[METRIC_DNS_STALE_ANSWERED]);
|
||||||
#ifdef HAVE_AUTH
|
#ifdef HAVE_AUTH
|
||||||
my_syslog(LOG_INFO, _("queries for authoritative zones %u"), daemon->metrics[METRIC_DNS_AUTH_ANSWERED]);
|
my_syslog(LOG_INFO, _("queries for authoritative zones %u"), daemon->metrics[METRIC_DNS_AUTH_ANSWERED]);
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_DNSSEC
|
||||||
|
my_syslog(LOG_INFO, _("DNSSEC per-query subqueries HWM %u"), daemon->metrics[METRIC_WORK_HWM]);
|
||||||
|
my_syslog(LOG_INFO, _("DNSSEC per-query crypto work HWM %u"), daemon->metrics[METRIC_CRYPTO_HWM]);
|
||||||
|
my_syslog(LOG_INFO, _("DNSSEC per-RRSet signature fails HWM %u"), daemon->metrics[METRIC_SIG_FAIL_HWM]);
|
||||||
|
#endif
|
||||||
|
|
||||||
blockdata_report();
|
blockdata_report();
|
||||||
|
my_syslog(LOG_INFO, _("child processes for TCP requests: in use %zu, highest since last SIGUSR1 %zu, max allowed %zu."),
|
||||||
|
daemon->metrics[METRIC_TCP_CONNECTIONS],
|
||||||
|
daemon->max_procs_used,
|
||||||
|
daemon->max_procs);
|
||||||
|
daemon->max_procs_used = daemon->metrics[METRIC_TCP_CONNECTIONS];
|
||||||
|
|
||||||
/* sum counts from different records for same server */
|
/* sum counts from different records for same server */
|
||||||
for (serv = daemon->servers; serv; serv = serv->next)
|
for (serv = daemon->servers; serv; serv = serv->next)
|
||||||
@@ -1799,97 +1961,23 @@ void dump_cache(time_t now)
|
|||||||
|
|
||||||
if (option_bool(OPT_DEBUG) || option_bool(OPT_LOG))
|
if (option_bool(OPT_DEBUG) || option_bool(OPT_LOG))
|
||||||
{
|
{
|
||||||
struct crec *cache ;
|
struct crec *cache;
|
||||||
int i;
|
int i;
|
||||||
my_syslog(LOG_INFO, "Host Address Flags Expires Source");
|
my_syslog(LOG_INFO, "Host Address Flags Expires Source");
|
||||||
my_syslog(LOG_INFO, "------------------------------ ---------------------------------------- ---------- ------------------------ ------------");
|
my_syslog(LOG_INFO, "------------------------------ ---------------------------------------- ---------- ------------------------ ------------");
|
||||||
|
|
||||||
for (i=0; i<hash_size; i++)
|
for (i=0; i<hash_size; i++)
|
||||||
for (cache = hash_table[i]; cache; cache = cache->hash_next)
|
for (cache = hash_table[i]; cache; cache = cache->hash_next)
|
||||||
{
|
dump_cache_entry(cache, now);
|
||||||
char *t = " ";
|
|
||||||
char *a = daemon->addrbuff, *p = daemon->namebuff, *n = cache_get_name(cache);
|
|
||||||
*a = 0;
|
|
||||||
if (strlen(n) == 0 && !(cache->flags & F_REVERSE))
|
|
||||||
n = "<Root>";
|
|
||||||
p += sprintf(p, "%-30.30s ", sanitise(n));
|
|
||||||
if ((cache->flags & F_CNAME) && !is_outdated_cname_pointer(cache))
|
|
||||||
a = sanitise(cache_get_cname_target(cache));
|
|
||||||
else if ((cache->flags & F_SRV) && !(cache->flags & F_NEG))
|
|
||||||
{
|
|
||||||
int targetlen = cache->addr.srv.targetlen;
|
|
||||||
ssize_t len = sprintf(a, "%u %u %u ", cache->addr.srv.priority,
|
|
||||||
cache->addr.srv.weight, cache->addr.srv.srvport);
|
|
||||||
|
|
||||||
if (targetlen > (40 - len))
|
|
||||||
targetlen = 40 - len;
|
|
||||||
blockdata_retrieve(cache->addr.srv.target, targetlen, a + len);
|
|
||||||
a[len + targetlen] = 0;
|
|
||||||
}
|
|
||||||
#ifdef HAVE_DNSSEC
|
|
||||||
else if (cache->flags & F_DS)
|
|
||||||
{
|
|
||||||
if (!(cache->flags & F_NEG))
|
|
||||||
sprintf(a, "%5u %3u %3u", cache->addr.ds.keytag,
|
|
||||||
cache->addr.ds.algo, cache->addr.ds.digest);
|
|
||||||
}
|
|
||||||
else if (cache->flags & F_DNSKEY)
|
|
||||||
sprintf(a, "%5u %3u %3u", cache->addr.key.keytag,
|
|
||||||
cache->addr.key.algo, cache->addr.key.flags);
|
|
||||||
#endif
|
|
||||||
else if (!(cache->flags & F_NEG) || !(cache->flags & F_FORWARD))
|
|
||||||
{
|
|
||||||
a = daemon->addrbuff;
|
|
||||||
if (cache->flags & F_IPV4)
|
|
||||||
inet_ntop(AF_INET, &cache->addr, a, ADDRSTRLEN);
|
|
||||||
else if (cache->flags & F_IPV6)
|
|
||||||
inet_ntop(AF_INET6, &cache->addr, a, ADDRSTRLEN);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cache->flags & F_IPV4)
|
|
||||||
t = "4";
|
|
||||||
else if (cache->flags & F_IPV6)
|
|
||||||
t = "6";
|
|
||||||
else if (cache->flags & F_CNAME)
|
|
||||||
t = "C";
|
|
||||||
else if (cache->flags & F_SRV)
|
|
||||||
t = "V";
|
|
||||||
#ifdef HAVE_DNSSEC
|
|
||||||
else if (cache->flags & F_DS)
|
|
||||||
t = "S";
|
|
||||||
else if (cache->flags & F_DNSKEY)
|
|
||||||
t = "K";
|
|
||||||
#endif
|
|
||||||
else /* non-terminal */
|
|
||||||
t = "!";
|
|
||||||
|
|
||||||
p += sprintf(p, "%-40.40s %s%s%s%s%s%s%s%s%s%s ", a, t,
|
|
||||||
cache->flags & F_FORWARD ? "F" : " ",
|
|
||||||
cache->flags & F_REVERSE ? "R" : " ",
|
|
||||||
cache->flags & F_IMMORTAL ? "I" : " ",
|
|
||||||
cache->flags & F_DHCP ? "D" : " ",
|
|
||||||
cache->flags & F_NEG ? "N" : " ",
|
|
||||||
cache->flags & F_NXDOMAIN ? "X" : " ",
|
|
||||||
cache->flags & F_HOSTS ? "H" : " ",
|
|
||||||
cache->flags & F_CONFIG ? "C" : " ",
|
|
||||||
cache->flags & F_DNSSECOK ? "V" : " ");
|
|
||||||
#ifdef HAVE_BROKEN_RTC
|
|
||||||
p += sprintf(p, "%-24lu", cache->flags & F_IMMORTAL ? 0: (unsigned long)(cache->ttd - now));
|
|
||||||
#else
|
|
||||||
p += sprintf(p, "%-24.24s", cache->flags & F_IMMORTAL ? "" : ctime(&(cache->ttd)));
|
|
||||||
#endif
|
|
||||||
if(cache->flags & (F_HOSTS | F_CONFIG) && cache->uid > 0)
|
|
||||||
p += sprintf(p, " %s", record_source(cache->uid));
|
|
||||||
|
|
||||||
my_syslog(LOG_INFO, "%s", daemon->namebuff);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char *record_source(unsigned int index)
|
char *record_source(unsigned int index)
|
||||||
{
|
{
|
||||||
struct hostsfile *ah;
|
struct hostsfile *ah;
|
||||||
|
#ifdef HAVE_INOTIFY
|
||||||
struct dyndir *dd;
|
struct dyndir *dd;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (index == SRC_CONFIG)
|
if (index == SRC_CONFIG)
|
||||||
return "config";
|
return "config";
|
||||||
@@ -1995,15 +2083,21 @@ static char *edestr(int ede)
|
|||||||
case EDE_NO_AUTH: return "no reachable authority";
|
case EDE_NO_AUTH: return "no reachable authority";
|
||||||
case EDE_NETERR: return "network error";
|
case EDE_NETERR: return "network error";
|
||||||
case EDE_INVALID_DATA: return "invalid data";
|
case EDE_INVALID_DATA: return "invalid data";
|
||||||
|
case EDE_SIG_E_B_V: return "signature expired before valid";
|
||||||
|
case EDE_TOO_EARLY: return "too early";
|
||||||
|
case EDE_UNS_NS3_ITER: return "unsupported NSEC3 iterations value";
|
||||||
|
case EDE_UNABLE_POLICY: return "uanble to conform to policy";
|
||||||
|
case EDE_SYNTHESIZED: return "synthesized";
|
||||||
default: return "unknown";
|
default: return "unknown";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void log_query(unsigned int flags, char *name, union all_addr *addr, char *arg, unsigned short type)
|
void log_query(unsigned int flags, char *name, union all_addr *addr, char *arg, unsigned short type)
|
||||||
{
|
{
|
||||||
char *source, *dest = arg;
|
char *source, *dest;
|
||||||
char *verb = "is";
|
char *verb = "is";
|
||||||
char *extra = "";
|
char *extra = "";
|
||||||
|
char *gap = " ";
|
||||||
char portstring[7]; /* space for #<portnum> */
|
char portstring[7]; /* space for #<portnum> */
|
||||||
|
|
||||||
if (!option_bool(OPT_LOG))
|
if (!option_bool(OPT_LOG))
|
||||||
@@ -2013,6 +2107,8 @@ void log_query(unsigned int flags, char *name, union all_addr *addr, char *arg,
|
|||||||
if (!(flags & (F_SERVER | F_IPSET)) && type > 0)
|
if (!(flags & (F_SERVER | F_IPSET)) && type > 0)
|
||||||
arg = querystr(arg, type);
|
arg = querystr(arg, type);
|
||||||
|
|
||||||
|
dest = arg;
|
||||||
|
|
||||||
#ifdef HAVE_DNSSEC
|
#ifdef HAVE_DNSSEC
|
||||||
if ((flags & F_DNSSECOK) && option_bool(OPT_EXTRALOG))
|
if ((flags & F_DNSSECOK) && option_bool(OPT_EXTRALOG))
|
||||||
extra = " (DNSSEC signed)";
|
extra = " (DNSSEC signed)";
|
||||||
@@ -2024,7 +2120,14 @@ void log_query(unsigned int flags, char *name, union all_addr *addr, char *arg,
|
|||||||
{
|
{
|
||||||
dest = daemon->addrbuff;
|
dest = daemon->addrbuff;
|
||||||
|
|
||||||
if (flags & F_KEYTAG)
|
if (flags & F_RR)
|
||||||
|
{
|
||||||
|
if (flags & F_KEYTAG)
|
||||||
|
dest = querystr(NULL, addr->rrblock.rrtype);
|
||||||
|
else
|
||||||
|
dest = querystr(NULL, addr->rrdata.rrtype);
|
||||||
|
}
|
||||||
|
else if (flags & F_KEYTAG)
|
||||||
sprintf(daemon->addrbuff, arg, addr->log.keytag, addr->log.algo, addr->log.digest);
|
sprintf(daemon->addrbuff, arg, addr->log.keytag, addr->log.algo, addr->log.digest);
|
||||||
else if (flags & F_RCODE)
|
else if (flags & F_RCODE)
|
||||||
{
|
{
|
||||||
@@ -2081,8 +2184,6 @@ void log_query(unsigned int flags, char *name, union all_addr *addr, char *arg,
|
|||||||
}
|
}
|
||||||
else if (flags & F_CNAME)
|
else if (flags & F_CNAME)
|
||||||
dest = "<CNAME>";
|
dest = "<CNAME>";
|
||||||
else if (flags & F_SRV)
|
|
||||||
dest = "<SRV>";
|
|
||||||
else if (flags & F_RRNAME)
|
else if (flags & F_RRNAME)
|
||||||
dest = arg;
|
dest = arg;
|
||||||
|
|
||||||
@@ -2133,19 +2234,21 @@ void log_query(unsigned int flags, char *name, union all_addr *addr, char *arg,
|
|||||||
else
|
else
|
||||||
source = "cached";
|
source = "cached";
|
||||||
|
|
||||||
if (name && !name[0])
|
if (!name)
|
||||||
|
gap = name = "";
|
||||||
|
else if (!name[0])
|
||||||
name = ".";
|
name = ".";
|
||||||
|
|
||||||
if (option_bool(OPT_EXTRALOG))
|
if (option_bool(OPT_EXTRALOG))
|
||||||
{
|
{
|
||||||
if (flags & F_NOEXTRA)
|
if (flags & F_NOEXTRA)
|
||||||
my_syslog(LOG_INFO, "%u %s %s %s %s%s", daemon->log_display_id, source, name, verb, dest, extra);
|
my_syslog(LOG_INFO, "%u %s %s%s%s %s%s", daemon->log_display_id, source, name, gap, verb, dest, extra);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int port = prettyprint_addr(daemon->log_source_addr, daemon->addrbuff2);
|
int port = prettyprint_addr(daemon->log_source_addr, daemon->addrbuff2);
|
||||||
my_syslog(LOG_INFO, "%u %s/%u %s %s %s %s%s", daemon->log_display_id, daemon->addrbuff2, port, source, name, verb, dest, extra);
|
my_syslog(LOG_INFO, "%u %s/%u %s %s%s%s %s%s", daemon->log_display_id, daemon->addrbuff2, port, source, name, gap, verb, dest, extra);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
my_syslog(LOG_INFO, "%s %s %s %s%s", source, name, verb, dest, extra);
|
my_syslog(LOG_INFO, "%s %s%s%s %s%s", source, name, gap, verb, dest, extra);
|
||||||
}
|
}
|
||||||
+8
-4
@@ -1,4 +1,4 @@
|
|||||||
/* dnsmasq is Copyright (c) 2000-2022 Simon Kelley
|
/* dnsmasq is Copyright (c) 2000-2024 Simon Kelley
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -15,14 +15,17 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define FTABSIZ 150 /* max number of outstanding requests (default) */
|
#define FTABSIZ 150 /* max number of outstanding requests (default) */
|
||||||
#define MAX_PROCS 20 /* max no children for TCP requests */
|
#define MAX_PROCS 20 /* default max no children for TCP requests */
|
||||||
#define CHILD_LIFETIME 150 /* secs 'till terminated (RFC1035 suggests > 120s) */
|
#define CHILD_LIFETIME 150 /* secs 'till terminated (RFC1035 suggests > 120s) */
|
||||||
#define TCP_MAX_QUERIES 100 /* Maximum number of queries per incoming TCP connection */
|
#define TCP_MAX_QUERIES 100 /* Maximum number of queries per incoming TCP connection */
|
||||||
#define TCP_BACKLOG 32 /* kernel backlog limit for TCP connections */
|
#define TCP_BACKLOG 32 /* kernel backlog limit for TCP connections */
|
||||||
#define EDNS_PKTSZ 4096 /* default max EDNS.0 UDP packet from RFC5625 */
|
#define EDNS_PKTSZ 1232 /* default max EDNS.0 UDP packet from from /dnsflagday.net/2020 */
|
||||||
#define SAFE_PKTSZ 1232 /* "go anywhere" UDP packet size, see https://dnsflagday.net/2020/ */
|
#define SAFE_PKTSZ 1232 /* "go anywhere" UDP packet size, see https://dnsflagday.net/2020/ */
|
||||||
#define KEYBLOCK_LEN 40 /* choose to minimise fragmentation when storing DNSSEC keys */
|
#define KEYBLOCK_LEN 40 /* choose to minimise fragmentation when storing DNSSEC keys */
|
||||||
#define DNSSEC_WORK 50 /* Max number of queries to validate one question */
|
#define DNSSEC_LIMIT_WORK 40 /* Max number of queries to validate one question */
|
||||||
|
#define DNSSEC_LIMIT_SIG_FAIL 20 /* Number of signature that can fail to validate in one answer */
|
||||||
|
#define DNSSEC_LIMIT_CRYPTO 200 /* max no. of crypto operations to validate one query. */
|
||||||
|
#define DNSSEC_LIMIT_NSEC3_ITERS 150 /* Max. number if iterations allowed in NSEC3 record. */
|
||||||
#define TIMEOUT 10 /* drop UDP queries after TIMEOUT seconds */
|
#define TIMEOUT 10 /* drop UDP queries after TIMEOUT seconds */
|
||||||
#define SMALL_PORT_RANGE 30 /* If DNS port range is smaller than this, use different allocation. */
|
#define SMALL_PORT_RANGE 30 /* If DNS port range is smaller than this, use different allocation. */
|
||||||
#define FORWARD_TEST 50 /* try all servers every 50 queries */
|
#define FORWARD_TEST 50 /* try all servers every 50 queries */
|
||||||
@@ -60,6 +63,7 @@
|
|||||||
#define LOOP_TEST_DOMAIN "test" /* domain for loop testing, "test" is reserved by RFC 2606 and won't therefore clash */
|
#define LOOP_TEST_DOMAIN "test" /* domain for loop testing, "test" is reserved by RFC 2606 and won't therefore clash */
|
||||||
#define LOOP_TEST_TYPE T_TXT
|
#define LOOP_TEST_TYPE T_TXT
|
||||||
#define DEFAULT_FAST_RETRY 1000 /* ms, default delay before fast retry */
|
#define DEFAULT_FAST_RETRY 1000 /* ms, default delay before fast retry */
|
||||||
|
#define STALE_CACHE_EXPIRY 86400 /* 1 day in secs, default maximum expiry time for stale cache data */
|
||||||
|
|
||||||
/* compile-time options: uncomment below to enable or do eg.
|
/* compile-time options: uncomment below to enable or do eg.
|
||||||
make COPTS=-DHAVE_BROKEN_RTC
|
make COPTS=-DHAVE_BROKEN_RTC
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
/* dnsmasq is Copyright (c) 2000-2022 Simon Kelley
|
/* dnsmasq is Copyright (c) 2000-2024 Simon Kelley
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+21
-8
@@ -1,4 +1,4 @@
|
|||||||
/* dnsmasq is Copyright (c) 2000-2022 Simon Kelley
|
/* dnsmasq is Copyright (c) 2000-2024 Simon Kelley
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -309,14 +309,14 @@ static int dnsmasq_gostdsa_verify(struct blockdata *key_data, unsigned int key_l
|
|||||||
mpz_init(y);
|
mpz_init(y);
|
||||||
}
|
}
|
||||||
|
|
||||||
mpz_import(x, 32 , 1, 1, 0, 0, p);
|
mpz_import(x, 32, -1, 1, 0, 0, p);
|
||||||
mpz_import(y, 32 , 1, 1, 0, 0, p + 32);
|
mpz_import(y, 32, -1, 1, 0, 0, p + 32);
|
||||||
|
|
||||||
if (!ecc_point_set(gost_key, x, y))
|
if (!ecc_point_set(gost_key, x, y))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
mpz_import(sig_struct->r, 32, 1, 1, 0, 0, sig);
|
mpz_import(sig_struct->s, 32, 1, 1, 0, 0, sig);
|
||||||
mpz_import(sig_struct->s, 32, 1, 1, 0, 0, sig + 32);
|
mpz_import(sig_struct->r, 32, 1, 1, 0, 0, sig + 32);
|
||||||
|
|
||||||
return nettle_gostdsa_verify(gost_key, digest_len, digest, sig_struct);
|
return nettle_gostdsa_verify(gost_key, digest_len, digest, sig_struct);
|
||||||
}
|
}
|
||||||
@@ -390,7 +390,12 @@ static int (*verify_func(int algo))(struct blockdata *key_data, unsigned int key
|
|||||||
return dnsmasq_ecdsa_verify;
|
return dnsmasq_ecdsa_verify;
|
||||||
|
|
||||||
#if MIN_VERSION(3, 1)
|
#if MIN_VERSION(3, 1)
|
||||||
case 15: case 16:
|
case 15:
|
||||||
|
return dnsmasq_eddsa_verify;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if MIN_VERSION(3, 6)
|
||||||
|
case 16:
|
||||||
return dnsmasq_eddsa_verify;
|
return dnsmasq_eddsa_verify;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -425,7 +430,9 @@ char *ds_digest_name(int digest)
|
|||||||
{
|
{
|
||||||
case 1: return "sha1";
|
case 1: return "sha1";
|
||||||
case 2: return "sha256";
|
case 2: return "sha256";
|
||||||
case 3: return "gosthash94";
|
#if MIN_VERSION(3, 6)
|
||||||
|
case 3: return "gosthash94cp";
|
||||||
|
#endif
|
||||||
case 4: return "sha384";
|
case 4: return "sha384";
|
||||||
default: return NULL;
|
default: return NULL;
|
||||||
}
|
}
|
||||||
@@ -444,11 +451,17 @@ char *algo_digest_name(int algo)
|
|||||||
case 7: return "sha1"; /* RSASHA1-NSEC3-SHA1 */
|
case 7: return "sha1"; /* RSASHA1-NSEC3-SHA1 */
|
||||||
case 8: return "sha256"; /* RSA/SHA-256 */
|
case 8: return "sha256"; /* RSA/SHA-256 */
|
||||||
case 10: return "sha512"; /* RSA/SHA-512 */
|
case 10: return "sha512"; /* RSA/SHA-512 */
|
||||||
case 12: return "gosthash94"; /* ECC-GOST */
|
#if MIN_VERSION(3, 6)
|
||||||
|
case 12: return "gosthash94cp"; /* ECC-GOST */
|
||||||
|
#endif
|
||||||
case 13: return "sha256"; /* ECDSAP256SHA256 */
|
case 13: return "sha256"; /* ECDSAP256SHA256 */
|
||||||
case 14: return "sha384"; /* ECDSAP384SHA384 */
|
case 14: return "sha384"; /* ECDSAP384SHA384 */
|
||||||
|
#if MIN_VERSION(3, 1)
|
||||||
case 15: return "null_hash"; /* ED25519 */
|
case 15: return "null_hash"; /* ED25519 */
|
||||||
|
# if MIN_VERSION(3, 6)
|
||||||
case 16: return "null_hash"; /* ED448 */
|
case 16: return "null_hash"; /* ED448 */
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
default: return NULL;
|
default: return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+58
-15
@@ -1,4 +1,4 @@
|
|||||||
/* dnsmasq is Copyright (c) 2000-2022 Simon Kelley
|
/* dnsmasq is Copyright (c) 2000-2024 Simon Kelley
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -52,6 +52,12 @@ const char* introspection_xml_template =
|
|||||||
" <method name=\"SetFilterWin2KOption\">\n"
|
" <method name=\"SetFilterWin2KOption\">\n"
|
||||||
" <arg name=\"filterwin2k\" direction=\"in\" type=\"b\"/>\n"
|
" <arg name=\"filterwin2k\" direction=\"in\" type=\"b\"/>\n"
|
||||||
" </method>\n"
|
" </method>\n"
|
||||||
|
" <method name=\"SetFilterA\">\n"
|
||||||
|
" <arg name=\"filter-a\" direction=\"in\" type=\"b\"/>\n"
|
||||||
|
" </method>\n"
|
||||||
|
" <method name=\"SetFilterAAAA\">\n"
|
||||||
|
" <arg name=\"filter-aaaa\" direction=\"in\" type=\"b\"/>\n"
|
||||||
|
" </method>\n"
|
||||||
" <method name=\"SetLocaliseQueriesOption\">\n"
|
" <method name=\"SetLocaliseQueriesOption\">\n"
|
||||||
" <arg name=\"localise-queries\" direction=\"in\" type=\"b\"/>\n"
|
" <arg name=\"localise-queries\" direction=\"in\" type=\"b\"/>\n"
|
||||||
" </method>\n"
|
" </method>\n"
|
||||||
@@ -100,6 +106,7 @@ const char* introspection_xml_template =
|
|||||||
"</node>\n";
|
"</node>\n";
|
||||||
|
|
||||||
static char *introspection_xml = NULL;
|
static char *introspection_xml = NULL;
|
||||||
|
static int watches_modified = 0;
|
||||||
|
|
||||||
struct watch {
|
struct watch {
|
||||||
DBusWatch *watch;
|
DBusWatch *watch;
|
||||||
@@ -121,6 +128,7 @@ static dbus_bool_t add_watch(DBusWatch *watch, void *data)
|
|||||||
w->watch = watch;
|
w->watch = watch;
|
||||||
w->next = daemon->watches;
|
w->next = daemon->watches;
|
||||||
daemon->watches = w;
|
daemon->watches = w;
|
||||||
|
watches_modified++;
|
||||||
|
|
||||||
(void)data; /* no warning */
|
(void)data; /* no warning */
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@@ -137,6 +145,7 @@ static void remove_watch(DBusWatch *watch, void *data)
|
|||||||
{
|
{
|
||||||
*up = tmp;
|
*up = tmp;
|
||||||
free(w);
|
free(w);
|
||||||
|
watches_modified++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
up = &(w->next);
|
up = &(w->next);
|
||||||
@@ -461,8 +470,8 @@ static DBusMessage* dbus_read_servers_ex(DBusMessage *message, int strings)
|
|||||||
} while (dbus_message_iter_get_arg_type(&string_iter) == DBUS_TYPE_STRING);
|
} while (dbus_message_iter_get_arg_type(&string_iter) == DBUS_TYPE_STRING);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sdetails.resolved)
|
if (sdetails.orig_hostinfo)
|
||||||
freeaddrinfo(sdetails.hostinfo);
|
freeaddrinfo(sdetails.orig_hostinfo);
|
||||||
|
|
||||||
/* jump to next element in outer array */
|
/* jump to next element in outer array */
|
||||||
dbus_message_iter_next(&array_iter);
|
dbus_message_iter_next(&array_iter);
|
||||||
@@ -817,6 +826,28 @@ DBusHandlerResult message_handler(DBusConnection *connection,
|
|||||||
{
|
{
|
||||||
reply = dbus_set_bool(message, OPT_FILTER, "filterwin2k");
|
reply = dbus_set_bool(message, OPT_FILTER, "filterwin2k");
|
||||||
}
|
}
|
||||||
|
else if (strcmp(method, "SetFilterA") == 0)
|
||||||
|
{
|
||||||
|
static int done = 0;
|
||||||
|
static struct rrlist list = { T_A, NULL };
|
||||||
|
|
||||||
|
if (!done)
|
||||||
|
{
|
||||||
|
list.next = daemon->filter_rr;
|
||||||
|
daemon->filter_rr = &list;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (strcmp(method, "SetFilterAAAA") == 0)
|
||||||
|
{
|
||||||
|
static int done = 0;
|
||||||
|
static struct rrlist list = { T_AAAA, NULL };
|
||||||
|
|
||||||
|
if (!done)
|
||||||
|
{
|
||||||
|
list.next = daemon->filter_rr;
|
||||||
|
daemon->filter_rr = &list;
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (strcmp(method, "SetLocaliseQueriesOption") == 0)
|
else if (strcmp(method, "SetLocaliseQueriesOption") == 0)
|
||||||
{
|
{
|
||||||
reply = dbus_set_bool(message, OPT_LOCALISE, "localise-queries");
|
reply = dbus_set_bool(message, OPT_LOCALISE, "localise-queries");
|
||||||
@@ -927,41 +958,53 @@ void set_dbus_listeners(void)
|
|||||||
{
|
{
|
||||||
unsigned int flags = dbus_watch_get_flags(w->watch);
|
unsigned int flags = dbus_watch_get_flags(w->watch);
|
||||||
int fd = dbus_watch_get_unix_fd(w->watch);
|
int fd = dbus_watch_get_unix_fd(w->watch);
|
||||||
|
int poll_flags = POLLERR;
|
||||||
|
|
||||||
if (flags & DBUS_WATCH_READABLE)
|
if (flags & DBUS_WATCH_READABLE)
|
||||||
poll_listen(fd, POLLIN);
|
poll_flags |= POLLIN;
|
||||||
|
|
||||||
if (flags & DBUS_WATCH_WRITABLE)
|
if (flags & DBUS_WATCH_WRITABLE)
|
||||||
poll_listen(fd, POLLOUT);
|
poll_flags |= POLLOUT;
|
||||||
|
|
||||||
poll_listen(fd, POLLERR);
|
poll_listen(fd, poll_flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void check_dbus_listeners()
|
static int check_dbus_watches()
|
||||||
{
|
{
|
||||||
DBusConnection *connection = (DBusConnection *)daemon->dbus;
|
|
||||||
struct watch *w;
|
struct watch *w;
|
||||||
|
|
||||||
|
watches_modified = 0;
|
||||||
for (w = daemon->watches; w; w = w->next)
|
for (w = daemon->watches; w; w = w->next)
|
||||||
if (dbus_watch_get_enabled(w->watch))
|
if (dbus_watch_get_enabled(w->watch))
|
||||||
{
|
{
|
||||||
unsigned int flags = 0;
|
unsigned int flags = 0;
|
||||||
int fd = dbus_watch_get_unix_fd(w->watch);
|
int fd = dbus_watch_get_unix_fd(w->watch);
|
||||||
|
int poll_flags = poll_check(fd, POLLIN|POLLOUT|POLLERR);
|
||||||
|
|
||||||
if (poll_check(fd, POLLIN))
|
if ((poll_flags & POLLIN) != 0)
|
||||||
flags |= DBUS_WATCH_READABLE;
|
flags |= DBUS_WATCH_READABLE;
|
||||||
|
if ((poll_flags & POLLOUT) != 0)
|
||||||
if (poll_check(fd, POLLOUT))
|
|
||||||
flags |= DBUS_WATCH_WRITABLE;
|
flags |= DBUS_WATCH_WRITABLE;
|
||||||
|
if ((poll_flags & POLLERR) != 0)
|
||||||
if (poll_check(fd, POLLERR))
|
|
||||||
flags |= DBUS_WATCH_ERROR;
|
flags |= DBUS_WATCH_ERROR;
|
||||||
|
|
||||||
if (flags != 0)
|
if (flags != 0)
|
||||||
dbus_watch_handle(w->watch, flags);
|
{
|
||||||
|
dbus_watch_handle(w->watch, flags);
|
||||||
|
if (watches_modified)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void check_dbus_listeners()
|
||||||
|
{
|
||||||
|
DBusConnection *connection = (DBusConnection *)daemon->dbus;
|
||||||
|
|
||||||
|
while (!check_dbus_watches()) ;
|
||||||
|
|
||||||
if (connection)
|
if (connection)
|
||||||
{
|
{
|
||||||
dbus_connection_ref (connection);
|
dbus_connection_ref (connection);
|
||||||
|
|||||||
+8
-6
@@ -1,4 +1,4 @@
|
|||||||
/* dnsmasq is Copyright (c) 2000-2022 Simon Kelley
|
/* dnsmasq is Copyright (c) 2000-2024 Simon Kelley
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -553,11 +553,11 @@ char *whichdevice(void)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
for (if_tmp = daemon->if_names; if_tmp; if_tmp = if_tmp->next)
|
for (if_tmp = daemon->if_names; if_tmp; if_tmp = if_tmp->next)
|
||||||
if (if_tmp->name && (!if_tmp->used || strchr(if_tmp->name, '*')))
|
if (if_tmp->name && (!(if_tmp->flags & INAME_USED) || strchr(if_tmp->name, '*')))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
for (found = NULL, iface = daemon->interfaces; iface; iface = iface->next)
|
for (found = NULL, iface = daemon->interfaces; iface; iface = iface->next)
|
||||||
if (iface->dhcp_ok)
|
if (iface->dhcp4_ok || iface->dhcp6_ok)
|
||||||
{
|
{
|
||||||
if (!found)
|
if (!found)
|
||||||
found = iface;
|
found = iface;
|
||||||
@@ -722,6 +722,8 @@ static const struct opttab_t opttab6[] = {
|
|||||||
{ "sntp-server", 31, OT_ADDR_LIST },
|
{ "sntp-server", 31, OT_ADDR_LIST },
|
||||||
{ "information-refresh-time", 32, OT_TIME },
|
{ "information-refresh-time", 32, OT_TIME },
|
||||||
{ "FQDN", 39, OT_INTERNAL | OT_RFC1035_NAME },
|
{ "FQDN", 39, OT_INTERNAL | OT_RFC1035_NAME },
|
||||||
|
{ "posix-timezone", 41, OT_NAME }, /* RFC 4833, Sec. 3 */
|
||||||
|
{ "tzdb-timezone", 42, OT_NAME }, /* RFC 4833, Sec. 3 */
|
||||||
{ "ntp-server", 56, 0 /* OT_ADDR_LIST | OT_RFC1035_NAME */ },
|
{ "ntp-server", 56, 0 /* OT_ADDR_LIST | OT_RFC1035_NAME */ },
|
||||||
{ "bootfile-url", 59, OT_NAME },
|
{ "bootfile-url", 59, OT_NAME },
|
||||||
{ "bootfile-param", 60, OT_CSTRING },
|
{ "bootfile-param", 60, OT_CSTRING },
|
||||||
@@ -836,7 +838,7 @@ char *option_string(int prot, unsigned int opt, unsigned char *val, int opt_len,
|
|||||||
for (i = 0, j = 0; i < opt_len && j < buf_len ; i++)
|
for (i = 0, j = 0; i < opt_len && j < buf_len ; i++)
|
||||||
{
|
{
|
||||||
char c = val[i];
|
char c = val[i];
|
||||||
if (isprint((int)c))
|
if (isprint((unsigned char)c))
|
||||||
buf[j++] = c;
|
buf[j++] = c;
|
||||||
}
|
}
|
||||||
#ifdef HAVE_DHCP6
|
#ifdef HAVE_DHCP6
|
||||||
@@ -850,7 +852,7 @@ char *option_string(int prot, unsigned int opt, unsigned char *val, int opt_len,
|
|||||||
for (k = i + 1; k < opt_len && k < l && j < buf_len ; k++)
|
for (k = i + 1; k < opt_len && k < l && j < buf_len ; k++)
|
||||||
{
|
{
|
||||||
char c = val[k];
|
char c = val[k];
|
||||||
if (isprint((int)c))
|
if (isprint((unsigned char)c))
|
||||||
buf[j++] = c;
|
buf[j++] = c;
|
||||||
}
|
}
|
||||||
i = l;
|
i = l;
|
||||||
@@ -871,7 +873,7 @@ char *option_string(int prot, unsigned int opt, unsigned char *val, int opt_len,
|
|||||||
for (k = 0; k < len && j < buf_len; k++)
|
for (k = 0; k < len && j < buf_len; k++)
|
||||||
{
|
{
|
||||||
char c = *p++;
|
char c = *p++;
|
||||||
if (isprint((int)c))
|
if (isprint((unsigned char)c))
|
||||||
buf[j++] = c;
|
buf[j++] = c;
|
||||||
}
|
}
|
||||||
i += len +2;
|
i += len +2;
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
/* dnsmasq is Copyright (c) 2000-2022 Simon Kelley
|
/* dnsmasq is Copyright (c) 2000-2024 Simon Kelley
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+5
-5
@@ -1,4 +1,4 @@
|
|||||||
/* dnsmasq is Copyright (c) 2000-2022 Simon Kelley
|
/* dnsmasq is Copyright (c) 2000-2024 Simon Kelley
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -297,7 +297,7 @@ void dhcp_packet(time_t now, int pxe_fd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (tmp = daemon->dhcp_except; tmp; tmp = tmp->next)
|
for (tmp = daemon->dhcp_except; tmp; tmp = tmp->next)
|
||||||
if (tmp->name && wildcard_match(tmp->name, ifr.ifr_name))
|
if (tmp->name && (tmp->flags & INAME_4) && wildcard_match(tmp->name, ifr.ifr_name))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* unlinked contexts/relays are marked by context->current == context */
|
/* unlinked contexts/relays are marked by context->current == context */
|
||||||
@@ -916,14 +916,14 @@ void dhcp_read_ethers(void)
|
|||||||
|
|
||||||
lineno++;
|
lineno++;
|
||||||
|
|
||||||
while (strlen(buff) > 0 && isspace((int)buff[strlen(buff)-1]))
|
while (strlen(buff) > 0 && isspace((unsigned char)buff[strlen(buff)-1]))
|
||||||
buff[strlen(buff)-1] = 0;
|
buff[strlen(buff)-1] = 0;
|
||||||
|
|
||||||
if ((*buff == '#') || (*buff == '+') || (*buff == 0))
|
if ((*buff == '#') || (*buff == '+') || (*buff == 0))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (ip = buff; *ip && !isspace((int)*ip); ip++);
|
for (ip = buff; *ip && !isspace((unsigned char)*ip); ip++);
|
||||||
for(; *ip && isspace((int)*ip); ip++)
|
for(; *ip && isspace((unsigned char)*ip); ip++)
|
||||||
*ip = 0;
|
*ip = 0;
|
||||||
if (!*ip || parse_hex(buff, hwaddr, ETHER_ADDR_LEN, NULL, NULL) != ETHER_ADDR_LEN)
|
if (!*ip || parse_hex(buff, hwaddr, ETHER_ADDR_LEN, NULL, NULL) != ETHER_ADDR_LEN)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* dnsmasq is Copyright (c) 2000-2022 Simon Kelley
|
/* dnsmasq is Copyright (c) 2000-2024 Simon Kelley
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+32
-8
@@ -1,4 +1,4 @@
|
|||||||
/* dnsmasq is Copyright (c) 2000-2022 Simon Kelley
|
/* dnsmasq is Copyright (c) 2000-2024 Simon Kelley
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -92,7 +92,7 @@ void dhcp6_packet(time_t now)
|
|||||||
struct iface_param parm;
|
struct iface_param parm;
|
||||||
struct cmsghdr *cmptr;
|
struct cmsghdr *cmptr;
|
||||||
struct msghdr msg;
|
struct msghdr msg;
|
||||||
int if_index = 0;
|
uint32_t if_index = 0;
|
||||||
union {
|
union {
|
||||||
struct cmsghdr align; /* this ensures alignment */
|
struct cmsghdr align; /* this ensures alignment */
|
||||||
char control6[CMSG_SPACE(sizeof(struct in6_pktinfo))];
|
char control6[CMSG_SPACE(sizeof(struct in6_pktinfo))];
|
||||||
@@ -118,11 +118,6 @@ void dhcp6_packet(time_t now)
|
|||||||
if ((sz = recv_dhcp_packet(daemon->dhcp6fd, &msg)) == -1)
|
if ((sz = recv_dhcp_packet(daemon->dhcp6fd, &msg)) == -1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#ifdef HAVE_DUMPFILE
|
|
||||||
dump_packet_udp(DUMP_DHCPV6, (void *)daemon->dhcp_packet.iov_base, sz,
|
|
||||||
(union mysockaddr *)&from, NULL, daemon->dhcp6fd);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr))
|
for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr))
|
||||||
if (cmptr->cmsg_level == IPPROTO_IPV6 && cmptr->cmsg_type == daemon->v6pktinfo)
|
if (cmptr->cmsg_level == IPPROTO_IPV6 && cmptr->cmsg_type == daemon->v6pktinfo)
|
||||||
{
|
{
|
||||||
@@ -139,6 +134,34 @@ void dhcp6_packet(time_t now)
|
|||||||
if (!indextoname(daemon->dhcp6fd, if_index, ifr.ifr_name))
|
if (!indextoname(daemon->dhcp6fd, if_index, ifr.ifr_name))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
#ifdef HAVE_LINUX_NETWORK
|
||||||
|
/* This works around a possible Linux kernel bug when using interfaces
|
||||||
|
enslaved to a VRF. The scope_id in the source address gets set
|
||||||
|
to the index of the VRF interface, not the slave. Fortunately,
|
||||||
|
the interface index returned by packetinfo is correct so we use
|
||||||
|
that instead. Log this once, so if it triggers in other circumstances
|
||||||
|
we've not anticipated and breaks things, we get some clues. */
|
||||||
|
if (from.sin6_scope_id != if_index)
|
||||||
|
{
|
||||||
|
static int logged = 0;
|
||||||
|
|
||||||
|
if (!logged)
|
||||||
|
{
|
||||||
|
my_syslog(MS_DHCP | LOG_WARNING,
|
||||||
|
_("Working around kernel bug: faulty source address scope for VRF slave %s"),
|
||||||
|
ifr.ifr_name);
|
||||||
|
logged = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
from.sin6_scope_id = if_index;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_DUMPFILE
|
||||||
|
dump_packet_udp(DUMP_DHCPV6, (void *)daemon->dhcp_packet.iov_base, sz,
|
||||||
|
(union mysockaddr *)&from, NULL, daemon->dhcp6fd);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (relay_reply6(&from, sz, ifr.ifr_name))
|
if (relay_reply6(&from, sz, ifr.ifr_name))
|
||||||
{
|
{
|
||||||
#ifdef HAVE_DUMPFILE
|
#ifdef HAVE_DUMPFILE
|
||||||
@@ -159,7 +182,8 @@ void dhcp6_packet(time_t now)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
for (tmp = daemon->dhcp_except; tmp; tmp = tmp->next)
|
for (tmp = daemon->dhcp_except; tmp; tmp = tmp->next)
|
||||||
if (tmp->name && wildcard_match(tmp->name, ifr.ifr_name))
|
if (tmp->name && (tmp->flags & INAME_6) &&
|
||||||
|
wildcard_match(tmp->name, ifr.ifr_name))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
parm.current = NULL;
|
parm.current = NULL;
|
||||||
|
|||||||
+6
-3
@@ -1,4 +1,4 @@
|
|||||||
/* dnsmasq is Copyright (c) 2000-2022 Simon Kelley
|
/* dnsmasq is Copyright (c) 2000-2024 Simon Kelley
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -112,8 +112,11 @@
|
|||||||
#define EDE_NO_AUTH 22 /* No Reachable Authority */
|
#define EDE_NO_AUTH 22 /* No Reachable Authority */
|
||||||
#define EDE_NETERR 23 /* Network error */
|
#define EDE_NETERR 23 /* Network error */
|
||||||
#define EDE_INVALID_DATA 24 /* Invalid Data */
|
#define EDE_INVALID_DATA 24 /* Invalid Data */
|
||||||
|
#define EDE_SIG_E_B_V 25 /* Signature Expired before Valid */
|
||||||
|
#define EDE_TOO_EARLY 26 /* To Early */
|
||||||
|
#define EDE_UNS_NS3_ITER 27 /* Unsupported NSEC3 Iterations Value */
|
||||||
|
#define EDE_UNABLE_POLICY 28 /* Unable to conform to policy */
|
||||||
|
#define EDE_SYNTHESIZED 29 /* Synthesized */
|
||||||
|
|
||||||
|
|
||||||
struct dns_header {
|
struct dns_header {
|
||||||
|
|||||||
+85
-56
@@ -1,4 +1,4 @@
|
|||||||
/* dnsmasq is Copyright (c) 2000-2022 Simon Kelley
|
/* dnsmasq is Copyright (c) 2000-2024 Simon Kelley
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -30,12 +30,14 @@ static volatile pid_t pid = 0;
|
|||||||
static volatile int pipewrite;
|
static volatile int pipewrite;
|
||||||
|
|
||||||
static void set_dns_listeners(void);
|
static void set_dns_listeners(void);
|
||||||
|
static void set_tftp_listeners(void);
|
||||||
static void check_dns_listeners(time_t now);
|
static void check_dns_listeners(time_t now);
|
||||||
static void sig_handler(int sig);
|
static void sig_handler(int sig);
|
||||||
static void async_event(int pipe, time_t now);
|
static void async_event(int pipe, time_t now);
|
||||||
static void fatal_event(struct event_desc *ev, char *msg);
|
static void fatal_event(struct event_desc *ev, char *msg);
|
||||||
static int read_event(int fd, struct event_desc *evp, char **msg);
|
static int read_event(int fd, struct event_desc *evp, char **msg);
|
||||||
static void poll_resolv(int force, int do_reload, time_t now);
|
static void poll_resolv(int force, int do_reload, time_t now);
|
||||||
|
static void tcp_init(void);
|
||||||
|
|
||||||
int main (int argc, char **argv)
|
int main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
@@ -125,30 +127,16 @@ int main (int argc, char **argv)
|
|||||||
{
|
{
|
||||||
/* Note that both /000 and '.' are allowed within labels. These get
|
/* Note that both /000 and '.' are allowed within labels. These get
|
||||||
represented in presentation format using NAME_ESCAPE as an escape
|
represented in presentation format using NAME_ESCAPE as an escape
|
||||||
character when in DNSSEC mode.
|
character. In theory, if all the characters in a name were /000 or
|
||||||
In theory, if all the characters in a name were /000 or
|
|
||||||
'.' or NAME_ESCAPE then all would have to be escaped, so the
|
'.' or NAME_ESCAPE then all would have to be escaped, so the
|
||||||
presentation format would be twice as long as the spec.
|
presentation format would be twice as long as the spec. */
|
||||||
|
daemon->keyname = safe_malloc((MAXDNAME * 2) + 1);
|
||||||
daemon->namebuff was previously allocated by the option-reading
|
|
||||||
code before we knew if we're in DNSSEC mode, so reallocate here. */
|
|
||||||
free(daemon->namebuff);
|
|
||||||
daemon->namebuff = safe_malloc(MAXDNAME * 2);
|
|
||||||
daemon->keyname = safe_malloc(MAXDNAME * 2);
|
|
||||||
daemon->workspacename = safe_malloc(MAXDNAME * 2);
|
|
||||||
/* one char flag per possible RR in answer section (may get extended). */
|
/* one char flag per possible RR in answer section (may get extended). */
|
||||||
daemon->rr_status_sz = 64;
|
daemon->rr_status_sz = 64;
|
||||||
daemon->rr_status = safe_malloc(sizeof(*daemon->rr_status) * daemon->rr_status_sz);
|
daemon->rr_status = safe_malloc(sizeof(*daemon->rr_status) * daemon->rr_status_sz);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(HAVE_CONNTRACK) && defined(HAVE_UBUS)
|
|
||||||
/* CONNTRACK UBUS code uses this buffer, so if not allocated above,
|
|
||||||
we need to allocate it here. */
|
|
||||||
if (option_bool(OPT_CMARK_ALST_EN) && !daemon->workspacename)
|
|
||||||
daemon->workspacename = safe_malloc(MAXDNAME);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_DHCP
|
#ifdef HAVE_DHCP
|
||||||
if (!daemon->lease_file)
|
if (!daemon->lease_file)
|
||||||
{
|
{
|
||||||
@@ -379,13 +367,20 @@ int main (int argc, char **argv)
|
|||||||
if (!enumerate_interfaces(1) || !enumerate_interfaces(0))
|
if (!enumerate_interfaces(1) || !enumerate_interfaces(0))
|
||||||
die(_("failed to find list of interfaces: %s"), NULL, EC_MISC);
|
die(_("failed to find list of interfaces: %s"), NULL, EC_MISC);
|
||||||
|
|
||||||
|
#ifdef HAVE_DHCP
|
||||||
|
/* Determine lease FQDNs after enumerate_interfaces() call, since it needs
|
||||||
|
to call get_domain and that's only valid for some domain configs once we
|
||||||
|
have interface addresses. */
|
||||||
|
lease_calc_fqdns();
|
||||||
|
#endif
|
||||||
|
|
||||||
if (option_bool(OPT_NOWILD) || option_bool(OPT_CLEVERBIND))
|
if (option_bool(OPT_NOWILD) || option_bool(OPT_CLEVERBIND))
|
||||||
{
|
{
|
||||||
create_bound_listeners(1);
|
create_bound_listeners(1);
|
||||||
|
|
||||||
if (!option_bool(OPT_CLEVERBIND))
|
if (!option_bool(OPT_CLEVERBIND))
|
||||||
for (if_tmp = daemon->if_names; if_tmp; if_tmp = if_tmp->next)
|
for (if_tmp = daemon->if_names; if_tmp; if_tmp = if_tmp->next)
|
||||||
if (if_tmp->name && !if_tmp->used)
|
if (if_tmp->name && !(if_tmp->flags & INAME_USED))
|
||||||
die(_("unknown interface %s"), if_tmp->name, EC_BADNET);
|
die(_("unknown interface %s"), if_tmp->name, EC_BADNET);
|
||||||
|
|
||||||
#if defined(HAVE_LINUX_NETWORK) && defined(HAVE_DHCP)
|
#if defined(HAVE_LINUX_NETWORK) && defined(HAVE_DHCP)
|
||||||
@@ -421,11 +416,13 @@ int main (int argc, char **argv)
|
|||||||
daemon->numrrand = max_fd/3;
|
daemon->numrrand = max_fd/3;
|
||||||
/* safe_malloc returns zero'd memory */
|
/* safe_malloc returns zero'd memory */
|
||||||
daemon->randomsocks = safe_malloc(daemon->numrrand * sizeof(struct randfd));
|
daemon->randomsocks = safe_malloc(daemon->numrrand * sizeof(struct randfd));
|
||||||
|
|
||||||
|
tcp_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_INOTIFY
|
#ifdef HAVE_INOTIFY
|
||||||
if ((daemon->port != 0 || daemon->dhcp || daemon->doing_dhcp6)
|
if ((daemon->port != 0 && !option_bool(OPT_NO_RESOLV)) ||
|
||||||
&& (!option_bool(OPT_NO_RESOLV) || daemon->dynamic_dirs))
|
daemon->dynamic_dirs)
|
||||||
inotify_dnsmasq_init();
|
inotify_dnsmasq_init();
|
||||||
else
|
else
|
||||||
daemon->inotifyfd = -1;
|
daemon->inotifyfd = -1;
|
||||||
@@ -863,6 +860,8 @@ int main (int argc, char **argv)
|
|||||||
|
|
||||||
if (option_bool(OPT_LOCAL_SERVICE))
|
if (option_bool(OPT_LOCAL_SERVICE))
|
||||||
my_syslog(LOG_INFO, _("DNS service limited to local subnets"));
|
my_syslog(LOG_INFO, _("DNS service limited to local subnets"));
|
||||||
|
else if (option_bool(OPT_LOCALHOST_SERVICE))
|
||||||
|
my_syslog(LOG_INFO, _("DNS service limited to localhost"));
|
||||||
}
|
}
|
||||||
|
|
||||||
my_syslog(LOG_INFO, _("compile time options: %s"), compile_opts);
|
my_syslog(LOG_INFO, _("compile time options: %s"), compile_opts);
|
||||||
@@ -941,7 +940,7 @@ int main (int argc, char **argv)
|
|||||||
|
|
||||||
if (!option_bool(OPT_NOWILD))
|
if (!option_bool(OPT_NOWILD))
|
||||||
for (if_tmp = daemon->if_names; if_tmp; if_tmp = if_tmp->next)
|
for (if_tmp = daemon->if_names; if_tmp; if_tmp = if_tmp->next)
|
||||||
if (if_tmp->name && !if_tmp->used)
|
if (if_tmp->name && !(if_tmp->flags & INAME_USED))
|
||||||
my_syslog(LOG_WARNING, _("warning: interface %s does not currently exist"), if_tmp->name);
|
my_syslog(LOG_WARNING, _("warning: interface %s does not currently exist"), if_tmp->name);
|
||||||
|
|
||||||
if (daemon->port != 0 && option_bool(OPT_NO_RESOLV))
|
if (daemon->port != 0 && option_bool(OPT_NO_RESOLV))
|
||||||
@@ -1049,8 +1048,10 @@ int main (int argc, char **argv)
|
|||||||
pid = getpid();
|
pid = getpid();
|
||||||
|
|
||||||
daemon->pipe_to_parent = -1;
|
daemon->pipe_to_parent = -1;
|
||||||
for (i = 0; i < MAX_PROCS; i++)
|
|
||||||
daemon->tcp_pipes[i] = -1;
|
if (daemon->port != 0)
|
||||||
|
for (i = 0; i < daemon->max_procs; i++)
|
||||||
|
daemon->tcp_pipes[i] = -1;
|
||||||
|
|
||||||
#ifdef HAVE_INOTIFY
|
#ifdef HAVE_INOTIFY
|
||||||
/* Using inotify, have to select a resolv file at startup */
|
/* Using inotify, have to select a resolv file at startup */
|
||||||
@@ -1073,7 +1074,12 @@ int main (int argc, char **argv)
|
|||||||
(timeout == -1 || timeout > 1000))
|
(timeout == -1 || timeout > 1000))
|
||||||
timeout = 1000;
|
timeout = 1000;
|
||||||
|
|
||||||
set_dns_listeners();
|
if (daemon->port != 0)
|
||||||
|
set_dns_listeners();
|
||||||
|
|
||||||
|
#ifdef HAVE_TFTP
|
||||||
|
set_tftp_listeners();
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_DBUS
|
#ifdef HAVE_DBUS
|
||||||
if (option_bool(OPT_DBUS))
|
if (option_bool(OPT_DBUS))
|
||||||
@@ -1259,7 +1265,8 @@ int main (int argc, char **argv)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
check_dns_listeners(now);
|
if (daemon->port != 0)
|
||||||
|
check_dns_listeners(now);
|
||||||
|
|
||||||
#ifdef HAVE_TFTP
|
#ifdef HAVE_TFTP
|
||||||
check_tftp_listeners(now);
|
check_tftp_listeners(now);
|
||||||
@@ -1525,10 +1532,15 @@ static void async_event(int pipe, time_t now)
|
|||||||
if (errno != EINTR)
|
if (errno != EINTR)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
else if (daemon->port != 0)
|
||||||
for (i = 0 ; i < MAX_PROCS; i++)
|
for (i = 0 ; i < daemon->max_procs; i++)
|
||||||
if (daemon->tcp_pids[i] == p)
|
if (daemon->tcp_pids[i] == p)
|
||||||
daemon->tcp_pids[i] = 0;
|
{
|
||||||
|
daemon->tcp_pids[i] = 0;
|
||||||
|
/* tcp_pipes == -1 && tcp_pids == 0 required to free slot */
|
||||||
|
if (daemon->tcp_pipes[i] == -1)
|
||||||
|
daemon->metrics[METRIC_TCP_CONNECTIONS]--;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#if defined(HAVE_SCRIPT)
|
#if defined(HAVE_SCRIPT)
|
||||||
@@ -1590,9 +1602,10 @@ static void async_event(int pipe, time_t now)
|
|||||||
|
|
||||||
case EVENT_TERM:
|
case EVENT_TERM:
|
||||||
/* Knock all our children on the head. */
|
/* Knock all our children on the head. */
|
||||||
for (i = 0; i < MAX_PROCS; i++)
|
if (daemon->port != 0)
|
||||||
if (daemon->tcp_pids[i] != 0)
|
for (i = 0; i < daemon->max_procs; i++)
|
||||||
kill(daemon->tcp_pids[i], SIGALRM);
|
if (daemon->tcp_pids[i] != 0)
|
||||||
|
kill(daemon->tcp_pids[i], SIGALRM);
|
||||||
|
|
||||||
#if defined(HAVE_SCRIPT) && defined(HAVE_DHCP)
|
#if defined(HAVE_SCRIPT) && defined(HAVE_DHCP)
|
||||||
/* handle pending lease transitions */
|
/* handle pending lease transitions */
|
||||||
@@ -1737,24 +1750,34 @@ void clear_cache_and_reload(time_t now)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_dns_listeners(void)
|
|
||||||
{
|
|
||||||
struct serverfd *serverfdp;
|
|
||||||
struct listener *listener;
|
|
||||||
struct randfd_list *rfl;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
#ifdef HAVE_TFTP
|
#ifdef HAVE_TFTP
|
||||||
|
static void set_tftp_listeners(void)
|
||||||
|
{
|
||||||
int tftp = 0;
|
int tftp = 0;
|
||||||
struct tftp_transfer *transfer;
|
struct tftp_transfer *transfer;
|
||||||
|
struct listener *listener;
|
||||||
|
|
||||||
if (!option_bool(OPT_SINGLE_PORT))
|
if (!option_bool(OPT_SINGLE_PORT))
|
||||||
for (transfer = daemon->tftp_trans; transfer; transfer = transfer->next)
|
for (transfer = daemon->tftp_trans; transfer; transfer = transfer->next)
|
||||||
{
|
{
|
||||||
tftp++;
|
tftp++;
|
||||||
poll_listen(transfer->sockfd, POLLIN);
|
poll_listen(transfer->sockfd, POLLIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (listener = daemon->listeners; listener; listener = listener->next)
|
||||||
|
/* tftp == 0 in single-port mode. */
|
||||||
|
if (tftp <= daemon->tftp_max && listener->tftpfd != -1)
|
||||||
|
poll_listen(listener->tftpfd, POLLIN);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void set_dns_listeners(void)
|
||||||
|
{
|
||||||
|
struct serverfd *serverfdp;
|
||||||
|
struct listener *listener;
|
||||||
|
struct randfd_list *rfl;
|
||||||
|
int i;
|
||||||
|
|
||||||
for (serverfdp = daemon->sfds; serverfdp; serverfdp = serverfdp->next)
|
for (serverfdp = daemon->sfds; serverfdp; serverfdp = serverfdp->next)
|
||||||
poll_listen(serverfdp->fd, POLLIN);
|
poll_listen(serverfdp->fd, POLLIN);
|
||||||
|
|
||||||
@@ -1767,7 +1790,7 @@ static void set_dns_listeners(void)
|
|||||||
poll_listen(rfl->rfd->fd, POLLIN);
|
poll_listen(rfl->rfd->fd, POLLIN);
|
||||||
|
|
||||||
/* check to see if we have free tcp process slots. */
|
/* check to see if we have free tcp process slots. */
|
||||||
for (i = MAX_PROCS - 1; i >= 0; i--)
|
for (i = daemon->max_procs - 1; i >= 0; i--)
|
||||||
if (daemon->tcp_pids[i] == 0 && daemon->tcp_pipes[i] == -1)
|
if (daemon->tcp_pids[i] == 0 && daemon->tcp_pipes[i] == -1)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -1782,16 +1805,10 @@ static void set_dns_listeners(void)
|
|||||||
we'll be called again when a slot becomes available. */
|
we'll be called again when a slot becomes available. */
|
||||||
if (listener->tcpfd != -1 && i >= 0)
|
if (listener->tcpfd != -1 && i >= 0)
|
||||||
poll_listen(listener->tcpfd, POLLIN);
|
poll_listen(listener->tcpfd, POLLIN);
|
||||||
|
|
||||||
#ifdef HAVE_TFTP
|
|
||||||
/* tftp == 0 in single-port mode. */
|
|
||||||
if (tftp <= daemon->tftp_max && listener->tftpfd != -1)
|
|
||||||
poll_listen(listener->tftpfd, POLLIN);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!option_bool(OPT_DEBUG))
|
if (!option_bool(OPT_DEBUG))
|
||||||
for (i = 0; i < MAX_PROCS; i++)
|
for (i = 0; i < daemon->max_procs; i++)
|
||||||
if (daemon->tcp_pipes[i] != -1)
|
if (daemon->tcp_pipes[i] != -1)
|
||||||
poll_listen(daemon->tcp_pipes[i], POLLIN);
|
poll_listen(daemon->tcp_pipes[i], POLLIN);
|
||||||
}
|
}
|
||||||
@@ -1826,13 +1843,16 @@ static void check_dns_listeners(time_t now)
|
|||||||
to free the process slot. Once the child process has gone, poll()
|
to free the process slot. Once the child process has gone, poll()
|
||||||
returns POLLHUP, not POLLIN, so have to check for both here. */
|
returns POLLHUP, not POLLIN, so have to check for both here. */
|
||||||
if (!option_bool(OPT_DEBUG))
|
if (!option_bool(OPT_DEBUG))
|
||||||
for (i = 0; i < MAX_PROCS; i++)
|
for (i = 0; i < daemon->max_procs; i++)
|
||||||
if (daemon->tcp_pipes[i] != -1 &&
|
if (daemon->tcp_pipes[i] != -1 &&
|
||||||
poll_check(daemon->tcp_pipes[i], POLLIN | POLLHUP) &&
|
poll_check(daemon->tcp_pipes[i], POLLIN | POLLHUP) &&
|
||||||
!cache_recv_insert(now, daemon->tcp_pipes[i]))
|
!cache_recv_insert(now, daemon->tcp_pipes[i]))
|
||||||
{
|
{
|
||||||
close(daemon->tcp_pipes[i]);
|
close(daemon->tcp_pipes[i]);
|
||||||
daemon->tcp_pipes[i] = -1;
|
daemon->tcp_pipes[i] = -1;
|
||||||
|
/* tcp_pipes == -1 && tcp_pids == 0 required to free slot */
|
||||||
|
if (daemon->tcp_pids[i] == 0)
|
||||||
|
daemon->metrics[METRIC_TCP_CONNECTIONS]--;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (listener = daemon->listeners; listener; listener = listener->next)
|
for (listener = daemon->listeners; listener; listener = listener->next)
|
||||||
@@ -1840,17 +1860,12 @@ static void check_dns_listeners(time_t now)
|
|||||||
if (listener->fd != -1 && poll_check(listener->fd, POLLIN))
|
if (listener->fd != -1 && poll_check(listener->fd, POLLIN))
|
||||||
receive_query(listener, now);
|
receive_query(listener, now);
|
||||||
|
|
||||||
#ifdef HAVE_TFTP
|
|
||||||
if (listener->tftpfd != -1 && poll_check(listener->tftpfd, POLLIN))
|
|
||||||
tftp_request(listener, now);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* check to see if we have a free tcp process slot.
|
/* check to see if we have a free tcp process slot.
|
||||||
Note that we can't assume that because we had
|
Note that we can't assume that because we had
|
||||||
at least one a poll() time, that we still do.
|
at least one a poll() time, that we still do.
|
||||||
There may be more waiting connections after
|
There may be more waiting connections after
|
||||||
poll() returns then free process slots. */
|
poll() returns then free process slots. */
|
||||||
for (i = MAX_PROCS - 1; i >= 0; i--)
|
for (i = daemon->max_procs - 1; i >= 0; i--)
|
||||||
if (daemon->tcp_pids[i] == 0 && daemon->tcp_pipes[i] == -1)
|
if (daemon->tcp_pids[i] == 0 && daemon->tcp_pipes[i] == -1)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -1966,6 +1981,9 @@ static void check_dns_listeners(time_t now)
|
|||||||
/* i holds index of free slot */
|
/* i holds index of free slot */
|
||||||
daemon->tcp_pids[i] = p;
|
daemon->tcp_pids[i] = p;
|
||||||
daemon->tcp_pipes[i] = pipefd[0];
|
daemon->tcp_pipes[i] = pipefd[0];
|
||||||
|
daemon->metrics[METRIC_TCP_CONNECTIONS]++;
|
||||||
|
if (daemon->metrics[METRIC_TCP_CONNECTIONS] > daemon->max_procs_used)
|
||||||
|
daemon->max_procs_used = daemon->metrics[METRIC_TCP_CONNECTIONS];
|
||||||
}
|
}
|
||||||
close(confd);
|
close(confd);
|
||||||
|
|
||||||
@@ -2141,7 +2159,11 @@ int delay_dhcp(time_t start, int sec, int fd, uint32_t addr, unsigned short id)
|
|||||||
poll_reset();
|
poll_reset();
|
||||||
if (fd != -1)
|
if (fd != -1)
|
||||||
poll_listen(fd, POLLIN);
|
poll_listen(fd, POLLIN);
|
||||||
set_dns_listeners();
|
if (daemon->port != 0)
|
||||||
|
set_dns_listeners();
|
||||||
|
#ifdef HAVE_TFTP
|
||||||
|
set_tftp_listeners();
|
||||||
|
#endif
|
||||||
set_log_writer();
|
set_log_writer();
|
||||||
|
|
||||||
#ifdef HAVE_DHCP6
|
#ifdef HAVE_DHCP6
|
||||||
@@ -2159,7 +2181,8 @@ int delay_dhcp(time_t start, int sec, int fd, uint32_t addr, unsigned short id)
|
|||||||
now = dnsmasq_time();
|
now = dnsmasq_time();
|
||||||
|
|
||||||
check_log_writer(0);
|
check_log_writer(0);
|
||||||
check_dns_listeners(now);
|
if (daemon->port != 0)
|
||||||
|
check_dns_listeners(now);
|
||||||
|
|
||||||
#ifdef HAVE_DHCP6
|
#ifdef HAVE_DHCP6
|
||||||
if (daemon->doing_ra && poll_check(daemon->icmp6fd, POLLIN))
|
if (daemon->doing_ra && poll_check(daemon->icmp6fd, POLLIN))
|
||||||
@@ -2192,3 +2215,9 @@ int delay_dhcp(time_t start, int sec, int fd, uint32_t addr, unsigned short id)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif /* HAVE_DHCP */
|
#endif /* HAVE_DHCP */
|
||||||
|
|
||||||
|
void tcp_init(void)
|
||||||
|
{
|
||||||
|
daemon->tcp_pids = safe_malloc(daemon->max_procs*sizeof(pid_t));
|
||||||
|
daemon->tcp_pipes = safe_malloc(daemon->max_procs*sizeof(int));
|
||||||
|
}
|
||||||
+74
-32
@@ -1,4 +1,4 @@
|
|||||||
/* dnsmasq is Copyright (c) 2000-2022 Simon Kelley
|
/* dnsmasq is Copyright (c) 2000-2024 Simon Kelley
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define COPYRIGHT "Copyright (c) 2000-2022 Simon Kelley"
|
#define COPYRIGHT "Copyright (c) 2000-2024 Simon Kelley"
|
||||||
|
|
||||||
/* We do defines that influence behavior of stdio.h, so complain
|
/* We do defines that influence behavior of stdio.h, so complain
|
||||||
if included too early. */
|
if included too early. */
|
||||||
@@ -276,12 +276,12 @@ struct event_desc {
|
|||||||
#define OPT_UMBRELLA_DEVID 64
|
#define OPT_UMBRELLA_DEVID 64
|
||||||
#define OPT_CMARK_ALST_EN 65
|
#define OPT_CMARK_ALST_EN 65
|
||||||
#define OPT_QUIET_TFTP 66
|
#define OPT_QUIET_TFTP 66
|
||||||
#define OPT_FILTER_A 67
|
#define OPT_STRIP_ECS 67
|
||||||
#define OPT_FILTER_AAAA 68
|
#define OPT_STRIP_MAC 68
|
||||||
#define OPT_STRIP_ECS 69
|
#define OPT_NORR 69
|
||||||
#define OPT_STRIP_MAC 70
|
#define OPT_NO_IDENT 70
|
||||||
#define OPT_STALE_CACHE 71
|
#define OPT_CACHE_RR 71
|
||||||
#define OPT_NORR 72
|
#define OPT_LOCALHOST_SERVICE 72
|
||||||
#define OPT_LAST 73
|
#define OPT_LAST 73
|
||||||
|
|
||||||
#define OPTION_BITS (sizeof(unsigned int)*8)
|
#define OPTION_BITS (sizeof(unsigned int)*8)
|
||||||
@@ -325,17 +325,28 @@ union all_addr {
|
|||||||
unsigned char algo;
|
unsigned char algo;
|
||||||
unsigned char digest;
|
unsigned char digest;
|
||||||
} ds;
|
} ds;
|
||||||
struct {
|
|
||||||
struct blockdata *target;
|
|
||||||
unsigned short targetlen, srvport, priority, weight;
|
|
||||||
} srv;
|
|
||||||
/* for log_query */
|
/* for log_query */
|
||||||
struct {
|
struct {
|
||||||
unsigned short keytag, algo, digest, rcode;
|
unsigned short keytag, algo, digest, rcode;
|
||||||
int ede;
|
int ede;
|
||||||
} log;
|
} log;
|
||||||
|
/* for arbitrary RR record stored in block */
|
||||||
|
struct {
|
||||||
|
unsigned short rrtype;
|
||||||
|
unsigned short datalen;
|
||||||
|
struct blockdata *rrdata;
|
||||||
|
} rrblock;
|
||||||
|
/* for arbitrary RR record small enough to go in addr.
|
||||||
|
NOTE: rrblock and rrdata are discriminated by the F_KEYTAG bit
|
||||||
|
in the cache flags. */
|
||||||
|
struct datablock {
|
||||||
|
unsigned short rrtype;
|
||||||
|
unsigned char datalen; /* also length of SOA in negative records. */
|
||||||
|
char data[];
|
||||||
|
} rrdata;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define RR_IMDATALEN (sizeof(union all_addr) - offsetof(struct datablock, data))
|
||||||
|
|
||||||
struct bogus_addr {
|
struct bogus_addr {
|
||||||
int is6, prefix;
|
int is6, prefix;
|
||||||
@@ -512,7 +523,7 @@ struct crec {
|
|||||||
#define F_NOEXTRA (1u<<27)
|
#define F_NOEXTRA (1u<<27)
|
||||||
#define F_DOMAINSRV (1u<<28)
|
#define F_DOMAINSRV (1u<<28)
|
||||||
#define F_RCODE (1u<<29)
|
#define F_RCODE (1u<<29)
|
||||||
#define F_SRV (1u<<30)
|
#define F_RR (1u<<30)
|
||||||
#define F_STALE (1u<<31)
|
#define F_STALE (1u<<31)
|
||||||
|
|
||||||
#define UID_NONE 0
|
#define UID_NONE 0
|
||||||
@@ -638,7 +649,8 @@ struct allowlist {
|
|||||||
struct irec {
|
struct irec {
|
||||||
union mysockaddr addr;
|
union mysockaddr addr;
|
||||||
struct in_addr netmask; /* only valid for IPv4 */
|
struct in_addr netmask; /* only valid for IPv4 */
|
||||||
int tftp_ok, dhcp_ok, mtu, done, warned, dad, dns_auth, index, multicast_done, found, label;
|
int tftp_ok, dhcp4_ok, dhcp6_ok, mtu, done, warned, dad;
|
||||||
|
int dns_auth, index, multicast_done, found, label;
|
||||||
char *name;
|
char *name;
|
||||||
struct irec *next;
|
struct irec *next;
|
||||||
};
|
};
|
||||||
@@ -654,10 +666,19 @@ struct listener {
|
|||||||
struct iname {
|
struct iname {
|
||||||
char *name;
|
char *name;
|
||||||
union mysockaddr addr;
|
union mysockaddr addr;
|
||||||
int used;
|
int flags;
|
||||||
struct iname *next;
|
struct iname *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define INAME_USED 1
|
||||||
|
#define INAME_4 2
|
||||||
|
#define INAME_6 4
|
||||||
|
|
||||||
|
struct rrlist {
|
||||||
|
unsigned short rr;
|
||||||
|
struct rrlist *next;
|
||||||
|
};
|
||||||
|
|
||||||
/* subnet parameters from command line */
|
/* subnet parameters from command line */
|
||||||
struct mysubnet {
|
struct mysubnet {
|
||||||
union mysockaddr addr;
|
union mysockaddr addr;
|
||||||
@@ -736,6 +757,9 @@ struct dyndir {
|
|||||||
#define DNSSEC_FAIL_NONSEC 0x0040 /* No NSEC */
|
#define DNSSEC_FAIL_NONSEC 0x0040 /* No NSEC */
|
||||||
#define DNSSEC_FAIL_NODSSUP 0x0080 /* no supported DS algo. */
|
#define DNSSEC_FAIL_NODSSUP 0x0080 /* no supported DS algo. */
|
||||||
#define DNSSEC_FAIL_NOKEY 0x0100 /* no DNSKEY */
|
#define DNSSEC_FAIL_NOKEY 0x0100 /* no DNSKEY */
|
||||||
|
#define DNSSEC_FAIL_NSEC3_ITERS 0x0200 /* too many iterations in NSEC3 */
|
||||||
|
#define DNSSEC_FAIL_BADPACKET 0x0400 /* bad packet */
|
||||||
|
#define DNSSEC_FAIL_WORK 0x0800 /* too much crypto */
|
||||||
|
|
||||||
#define STAT_ISEQUAL(a, b) (((a) & 0xffff0000) == (b))
|
#define STAT_ISEQUAL(a, b) (((a) & 0xffff0000) == (b))
|
||||||
|
|
||||||
@@ -773,7 +797,7 @@ struct frec {
|
|||||||
struct blockdata *stash; /* Saved reply, whilst we validate */
|
struct blockdata *stash; /* Saved reply, whilst we validate */
|
||||||
size_t stash_len;
|
size_t stash_len;
|
||||||
#ifdef HAVE_DNSSEC
|
#ifdef HAVE_DNSSEC
|
||||||
int class, work_counter;
|
int class, work_counter, validate_counter;
|
||||||
struct frec *dependent; /* Query awaiting internally-generated DNSKEY or DS query */
|
struct frec *dependent; /* Query awaiting internally-generated DNSKEY or DS query */
|
||||||
struct frec *next_dependent; /* list of above. */
|
struct frec *next_dependent; /* list of above. */
|
||||||
struct frec *blocking_query; /* Query which is blocking us. */
|
struct frec *blocking_query; /* Query which is blocking us. */
|
||||||
@@ -810,6 +834,12 @@ struct frec {
|
|||||||
#define LEASE_HAVE_HWADDR 128 /* Have set hwaddress */
|
#define LEASE_HAVE_HWADDR 128 /* Have set hwaddress */
|
||||||
#define LEASE_EXP_CHANGED 256 /* Lease expiry time changed */
|
#define LEASE_EXP_CHANGED 256 /* Lease expiry time changed */
|
||||||
|
|
||||||
|
#define LIMIT_SIG_FAIL 0
|
||||||
|
#define LIMIT_CRYPTO 1
|
||||||
|
#define LIMIT_WORK 2
|
||||||
|
#define LIMIT_NSEC3_ITERS 3
|
||||||
|
#define LIMIT_MAX 4
|
||||||
|
|
||||||
struct dhcp_lease {
|
struct dhcp_lease {
|
||||||
int clid_len; /* length of client identifier */
|
int clid_len; /* length of client identifier */
|
||||||
unsigned char *clid; /* clientid */
|
unsigned char *clid; /* clientid */
|
||||||
@@ -1123,6 +1153,7 @@ extern struct daemon {
|
|||||||
struct naptr *naptr;
|
struct naptr *naptr;
|
||||||
struct txt_record *txt, *rr;
|
struct txt_record *txt, *rr;
|
||||||
struct ptr_record *ptr;
|
struct ptr_record *ptr;
|
||||||
|
struct rrlist *cache_rr, *filter_rr;
|
||||||
struct host_record *host_records, *host_records_tail;
|
struct host_record *host_records, *host_records_tail;
|
||||||
struct cname *cnames;
|
struct cname *cnames;
|
||||||
struct auth_zone *auth_zones;
|
struct auth_zone *auth_zones;
|
||||||
@@ -1201,6 +1232,7 @@ extern struct daemon {
|
|||||||
unsigned long soa_sn, soa_refresh, soa_retry, soa_expiry;
|
unsigned long soa_sn, soa_refresh, soa_retry, soa_expiry;
|
||||||
u32 metrics[__METRIC_MAX];
|
u32 metrics[__METRIC_MAX];
|
||||||
int fast_retry_time, fast_retry_timeout;
|
int fast_retry_time, fast_retry_timeout;
|
||||||
|
int cache_max_expiry;
|
||||||
#ifdef HAVE_DNSSEC
|
#ifdef HAVE_DNSSEC
|
||||||
struct ds_config *ds;
|
struct ds_config *ds;
|
||||||
char *timestamp_file;
|
char *timestamp_file;
|
||||||
@@ -1210,16 +1242,14 @@ extern struct daemon {
|
|||||||
char *packet; /* packet buffer */
|
char *packet; /* packet buffer */
|
||||||
int packet_buff_sz; /* size of above */
|
int packet_buff_sz; /* size of above */
|
||||||
char *namebuff; /* MAXDNAME size buffer */
|
char *namebuff; /* MAXDNAME size buffer */
|
||||||
#if (defined(HAVE_CONNTRACK) && defined(HAVE_UBUS)) || defined(HAVE_DNSSEC)
|
|
||||||
/* CONNTRACK UBUS code uses this buffer, as well as DNSSEC code. */
|
|
||||||
char *workspacename;
|
char *workspacename;
|
||||||
#endif
|
|
||||||
#ifdef HAVE_DNSSEC
|
#ifdef HAVE_DNSSEC
|
||||||
char *keyname; /* MAXDNAME size buffer */
|
char *keyname; /* MAXDNAME size buffer */
|
||||||
unsigned long *rr_status; /* ceiling in TTL from DNSSEC or zero for insecure */
|
unsigned long *rr_status; /* ceiling in TTL from DNSSEC or zero for insecure */
|
||||||
int rr_status_sz;
|
int rr_status_sz;
|
||||||
int dnssec_no_time_check;
|
int dnssec_no_time_check;
|
||||||
int back_to_the_future;
|
int back_to_the_future;
|
||||||
|
int limit[LIMIT_MAX];
|
||||||
#endif
|
#endif
|
||||||
struct frec *frec_list;
|
struct frec *frec_list;
|
||||||
struct frec_src *free_frec_src;
|
struct frec_src *free_frec_src;
|
||||||
@@ -1230,8 +1260,8 @@ extern struct daemon {
|
|||||||
struct server *srv_save; /* Used for resend on DoD */
|
struct server *srv_save; /* Used for resend on DoD */
|
||||||
size_t packet_len; /* " " */
|
size_t packet_len; /* " " */
|
||||||
int fd_save; /* " " */
|
int fd_save; /* " " */
|
||||||
pid_t tcp_pids[MAX_PROCS];
|
pid_t *tcp_pids;
|
||||||
int tcp_pipes[MAX_PROCS];
|
int *tcp_pipes;
|
||||||
int pipe_to_parent;
|
int pipe_to_parent;
|
||||||
int numrrand;
|
int numrrand;
|
||||||
struct randfd *randomsocks;
|
struct randfd *randomsocks;
|
||||||
@@ -1291,18 +1321,21 @@ extern struct daemon {
|
|||||||
/* file for packet dumps. */
|
/* file for packet dumps. */
|
||||||
int dumpfd;
|
int dumpfd;
|
||||||
#endif
|
#endif
|
||||||
|
int max_procs;
|
||||||
|
uint max_procs_used;
|
||||||
} *daemon;
|
} *daemon;
|
||||||
|
|
||||||
struct server_details {
|
struct server_details {
|
||||||
union mysockaddr *addr, *source_addr;
|
union mysockaddr *addr, *source_addr;
|
||||||
struct addrinfo *hostinfo;
|
struct addrinfo *hostinfo, *orig_hostinfo;
|
||||||
char *interface, *source, *scope_id, *interface_opt;
|
char *interface, *source, *scope_id, *interface_opt;
|
||||||
int serv_port, source_port, addr_type, scope_index, valid, resolved;
|
int serv_port, source_port, addr_type, scope_index, valid;
|
||||||
u16 *flags;
|
u16 *flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* cache.c */
|
/* cache.c */
|
||||||
void cache_init(void);
|
void cache_init(void);
|
||||||
|
unsigned short rrtype(char *in);
|
||||||
void next_uid(struct crec *crecp);
|
void next_uid(struct crec *crecp);
|
||||||
void log_query(unsigned int flags, char *name, union all_addr *addr, char *arg, unsigned short type);
|
void log_query(unsigned int flags, char *name, union all_addr *addr, char *arg, unsigned short type);
|
||||||
char *record_source(unsigned int index);
|
char *record_source(unsigned int index);
|
||||||
@@ -1336,6 +1369,8 @@ int read_hostsfile(char *filename, unsigned int index, int cache_size,
|
|||||||
void blockdata_init(void);
|
void blockdata_init(void);
|
||||||
void blockdata_report(void);
|
void blockdata_report(void);
|
||||||
struct blockdata *blockdata_alloc(char *data, size_t len);
|
struct blockdata *blockdata_alloc(char *data, size_t len);
|
||||||
|
int blockdata_expand(struct blockdata *block, size_t oldlen,
|
||||||
|
char *data, size_t newlen);
|
||||||
void *blockdata_retrieve(struct blockdata *block, size_t len, void *data);
|
void *blockdata_retrieve(struct blockdata *block, size_t len, void *data);
|
||||||
struct blockdata *blockdata_read(int fd, size_t len);
|
struct blockdata *blockdata_read(int fd, size_t len);
|
||||||
void blockdata_write(struct blockdata *block, size_t len, int fd);
|
void blockdata_write(struct blockdata *block, size_t len, int fd);
|
||||||
@@ -1348,6 +1383,7 @@ int is_name_synthetic(int flags, char *name, union all_addr *addr);
|
|||||||
int is_rev_synth(int flag, union all_addr *addr, char *name);
|
int is_rev_synth(int flag, union all_addr *addr, char *name);
|
||||||
|
|
||||||
/* rfc1035.c */
|
/* rfc1035.c */
|
||||||
|
int do_doctor(struct dns_header *header, size_t qlen, char *namebuff);
|
||||||
int extract_name(struct dns_header *header, size_t plen, unsigned char **pp,
|
int extract_name(struct dns_header *header, size_t plen, unsigned char **pp,
|
||||||
char *name, int isExtract, int extrabytes);
|
char *name, int isExtract, int extrabytes);
|
||||||
unsigned char *skip_name(unsigned char *ansp, struct dns_header *header, size_t plen, int extrabytes);
|
unsigned char *skip_name(unsigned char *ansp, struct dns_header *header, size_t plen, int extrabytes);
|
||||||
@@ -1358,14 +1394,14 @@ unsigned int extract_request(struct dns_header *header, size_t qlen,
|
|||||||
void setup_reply(struct dns_header *header, unsigned int flags, int ede);
|
void setup_reply(struct dns_header *header, unsigned int flags, int ede);
|
||||||
int extract_addresses(struct dns_header *header, size_t qlen, char *name,
|
int extract_addresses(struct dns_header *header, size_t qlen, char *name,
|
||||||
time_t now, struct ipsets *ipsets, struct ipsets *nftsets, int is_sign,
|
time_t now, struct ipsets *ipsets, struct ipsets *nftsets, int is_sign,
|
||||||
int check_rebind, int no_cache_dnssec, int secure, int *doctored);
|
int check_rebind, int no_cache_dnssec, int secure);
|
||||||
#if defined(HAVE_CONNTRACK) && defined(HAVE_UBUS)
|
#if defined(HAVE_CONNTRACK) && defined(HAVE_UBUS)
|
||||||
void report_addresses(struct dns_header *header, size_t len, u32 mark);
|
void report_addresses(struct dns_header *header, size_t len, u32 mark);
|
||||||
#endif
|
#endif
|
||||||
size_t answer_request(struct dns_header *header, char *limit, size_t qlen,
|
size_t answer_request(struct dns_header *header, char *limit, size_t qlen,
|
||||||
struct in_addr local_addr, struct in_addr local_netmask,
|
struct in_addr local_addr, struct in_addr local_netmask,
|
||||||
time_t now, int ad_reqd, int do_bit, int have_pseudoheader,
|
time_t now, int ad_reqd, int do_bit, int have_pseudoheader,
|
||||||
int *stale);
|
int *stale, int *filtered);
|
||||||
int check_for_bogus_wildcard(struct dns_header *header, size_t qlen, char *name,
|
int check_for_bogus_wildcard(struct dns_header *header, size_t qlen, char *name,
|
||||||
time_t now);
|
time_t now);
|
||||||
int check_for_ignored_address(struct dns_header *header, size_t qlen);
|
int check_for_ignored_address(struct dns_header *header, size_t qlen);
|
||||||
@@ -1389,10 +1425,12 @@ int in_zone(struct auth_zone *zone, char *name, char **cut);
|
|||||||
/* dnssec.c */
|
/* dnssec.c */
|
||||||
#ifdef HAVE_DNSSEC
|
#ifdef HAVE_DNSSEC
|
||||||
size_t dnssec_generate_query(struct dns_header *header, unsigned char *end, char *name, int class, int type, int edns_pktsz);
|
size_t dnssec_generate_query(struct dns_header *header, unsigned char *end, char *name, int class, int type, int edns_pktsz);
|
||||||
int dnssec_validate_by_ds(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int class);
|
int dnssec_validate_by_ds(time_t now, struct dns_header *header, size_t plen, char *name,
|
||||||
int dnssec_validate_ds(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int class);
|
char *keyname, int class, int *validate_count);
|
||||||
|
int dnssec_validate_ds(time_t now, struct dns_header *header, size_t plen, char *name,
|
||||||
|
char *keyname, int class, int *validate_count);
|
||||||
int dnssec_validate_reply(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int *class,
|
int dnssec_validate_reply(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int *class,
|
||||||
int check_unsigned, int *neganswer, int *nons, int *nsec_ttl);
|
int check_unsigned, int *neganswer, int *nons, int *nsec_ttl, int *validate_count);
|
||||||
int dnskey_keytag(int alg, int flags, unsigned char *key, int keylen);
|
int dnskey_keytag(int alg, int flags, unsigned char *key, int keylen);
|
||||||
size_t filter_rrsigs(struct dns_header *header, size_t plen);
|
size_t filter_rrsigs(struct dns_header *header, size_t plen);
|
||||||
int setup_timestamp(void);
|
int setup_timestamp(void);
|
||||||
@@ -1417,6 +1455,7 @@ void rand_init(void);
|
|||||||
unsigned short rand16(void);
|
unsigned short rand16(void);
|
||||||
u32 rand32(void);
|
u32 rand32(void);
|
||||||
u64 rand64(void);
|
u64 rand64(void);
|
||||||
|
int rr_on_list(struct rrlist *list, unsigned short rr);
|
||||||
int legal_hostname(char *name);
|
int legal_hostname(char *name);
|
||||||
char *canonicalise(char *in, int *nomem);
|
char *canonicalise(char *in, int *nomem);
|
||||||
unsigned char *do_rfc1035_name(unsigned char *p, char *sval, char *limit);
|
unsigned char *do_rfc1035_name(unsigned char *p, char *sval, char *limit);
|
||||||
@@ -1577,6 +1616,7 @@ void lease_update_from_configs(void);
|
|||||||
int do_script_run(time_t now);
|
int do_script_run(time_t now);
|
||||||
void rerun_scripts(void);
|
void rerun_scripts(void);
|
||||||
void lease_find_interfaces(time_t now);
|
void lease_find_interfaces(time_t now);
|
||||||
|
void lease_calc_fqdns(void);
|
||||||
#ifdef HAVE_SCRIPT
|
#ifdef HAVE_SCRIPT
|
||||||
void lease_add_extradata(struct dhcp_lease *lease, unsigned char *data,
|
void lease_add_extradata(struct dhcp_lease *lease, unsigned char *data,
|
||||||
unsigned int len, int delim);
|
unsigned int len, int delim);
|
||||||
@@ -1810,14 +1850,16 @@ void poll_listen(int fd, short event);
|
|||||||
int do_poll(int timeout);
|
int do_poll(int timeout);
|
||||||
|
|
||||||
/* rrfilter.c */
|
/* rrfilter.c */
|
||||||
size_t rrfilter(struct dns_header *header, size_t plen, int mode);
|
size_t rrfilter(struct dns_header *header, size_t *plen, int mode);
|
||||||
u16 *rrfilter_desc(int type);
|
short *rrfilter_desc(int type);
|
||||||
int expand_workspace(unsigned char ***wkspc, int *szp, int new);
|
int expand_workspace(unsigned char ***wkspc, int *szp, int new);
|
||||||
|
int to_wire(char *name);
|
||||||
|
void from_wire(char *name);
|
||||||
/* modes. */
|
/* modes. */
|
||||||
#define RRFILTER_EDNS0 0
|
#define RRFILTER_EDNS0 0
|
||||||
#define RRFILTER_DNSSEC 1
|
#define RRFILTER_DNSSEC 1
|
||||||
#define RRFILTER_A 2
|
#define RRFILTER_CONF 2
|
||||||
#define RRFILTER_AAAA 3
|
|
||||||
/* edns0.c */
|
/* edns0.c */
|
||||||
unsigned char *find_pseudoheader(struct dns_header *header, size_t plen,
|
unsigned char *find_pseudoheader(struct dns_header *header, size_t plen,
|
||||||
size_t *len, unsigned char **p, int *is_sign, int *is_last);
|
size_t *len, unsigned char **p, int *is_sign, int *is_last);
|
||||||
|
|||||||
+416
-353
File diff suppressed because it is too large.
Load diff
Loaded 100 of 131 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user