[libvirt] [PATCH 2/3] network: allow disabling dnsmasq's DNS server
Michal Privoznik
mprivozn at redhat.com
Thu Aug 18 09:01:46 UTC 2016
On 12.08.2016 04:41, Laine Stump wrote:
> If you define a libvirt virtual network with one or more IP addresses,
> it starts up an instance of dnsmasq. It's always been possible to
> avoid dnsmasq's dhcp server (simply don't include a <dhcp> element),
> but until now it wasn't possible to avoid having the DNS server
> listening; even if the network has no <dns> element, it is started
> using default settings.
>
> This patch adds a new attribute to <dns>: enable='yes|no'. For
> backward compatibility, it defaults to 'yes', but if you don't want a
> DNS server created for the network, you can simply add:
>
> <dns enable='no'/>
>
> to the network configuration, and next time the network is started
> there will be no dns server created (if there is dhcp configuration,
> dnsmasq will be started with "port=0" which disables the DNS server;
> if there is no dhcp configuration, dnsmasq won't be started at all).
> ---
> docs/formatnetwork.html.in | 12 ++
> docs/schemas/network.rng | 5 +
> src/conf/network_conf.c | 36 ++++-
> src/conf/network_conf.h | 1 +
> src/network/bridge_driver.c | 146 ++++++++++++---------
> .../networkxml2confdata/routed-network-no-dns.conf | 11 ++
> .../networkxml2confdata/routed-network-no-dns.xml | 10 ++
> tests/networkxml2conftest.c | 1 +
> tests/networkxml2xmlin/routed-network-no-dns.xml | 10 ++
> tests/networkxml2xmlout/routed-network-no-dns.xml | 12 ++
> tests/networkxml2xmltest.c | 1 +
> 11 files changed, 179 insertions(+), 66 deletions(-)
> create mode 100644 tests/networkxml2confdata/routed-network-no-dns.conf
> create mode 100644 tests/networkxml2confdata/routed-network-no-dns.xml
> create mode 100644 tests/networkxml2xmlin/routed-network-no-dns.xml
> create mode 100644 tests/networkxml2xmlout/routed-network-no-dns.xml
>
> diff --git a/docs/formatnetwork.html.in b/docs/formatnetwork.html.in
> index 12d1bed..e103dd7 100644
> --- a/docs/formatnetwork.html.in
> +++ b/docs/formatnetwork.html.in
> @@ -886,6 +886,18 @@
> server <span class="since">Since 0.9.3</span>.
>
> <p>
> + The dns element can have an optional <code>enable</code>
> + attribute <span class="since">Since 2.2.0</span>.
> + If <code>enable</code> is "no", then no DNS server will be
> + setup by libvirt for this network (and any other
> + configuration in <code><dns></code> will be ignored).
> + If <code>enable</code> is "yes" or unspecified (including
> + the complete absence of any <code><dns></code>
> + element) then a DNS server will be setup by libvirt to
> + listen on all IP addresses specified in the network's
> + configuration.
> + </p>
Le sigh. I wish that we could just disable dns if the tag is not present
in the nework XML. But we can't do that, can we?
> + <p>
> The dns element
> can have an optional <code>forwardPlainNames</code>
> attribute <span class="since">Since 1.1.2</span>.
> diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
> index 6820bde..490574f 100644
> --- a/src/conf/network_conf.c
> +++ b/src/conf/network_conf.c
> @@ -1335,6 +1335,7 @@ virNetworkDNSDefParseXML(const char *networkName,
> xmlNodePtr *txtNodes = NULL;
> xmlNodePtr *fwdNodes = NULL;
> char *forwardPlainNames = NULL;
> + char *enable = NULL;
> int nhosts, nsrvs, ntxts, nfwds;
> size_t i;
> int ret = -1;
> @@ -1342,6 +1343,18 @@ virNetworkDNSDefParseXML(const char *networkName,
>
> ctxt->node = node;
>
> + enable = virXPathString("string(./@enable)", ctxt);
> + if (enable) {
> + def->enable = virTristateBoolTypeFromString(enable);
> + if (def->enable <= 0) {
> + virReportError(VIR_ERR_XML_ERROR,
> + _("Invalid dns enable setting '%s' "
> + "in network '%s'"),
> + enable, networkName);
> + goto cleanup;
> + }
> + }
> +
> forwardPlainNames = virXPathString("string(./@forwardPlainNames)", ctxt);
> if (forwardPlainNames) {
> def->forwardPlainNames = virTristateBoolTypeFromString(forwardPlainNames);
> @@ -1440,6 +1453,7 @@ virNetworkDNSDefParseXML(const char *networkName,
>
> ret = 0;
> cleanup:
> + VIR_FREE(enable);
> VIR_FREE(forwardPlainNames);
> VIR_FREE(fwdNodes);
> VIR_FREE(hostNodes);
> @@ -2496,12 +2510,22 @@ virNetworkDNSDefFormat(virBufferPtr buf,
> {
> size_t i, j;
>
> - if (!(def->forwardPlainNames || def->nfwds || def->nhosts ||
> + if (!(def->enable || def->forwardPlainNames || def->nfwds || def->nhosts ||
> def->nsrvs || def->ntxts))
> return 0;
>
> virBufferAddLit(buf, "<dns");
> - /* default to "yes", but don't format it in the XML */
> + if (def->enable) {
> + const char *fwd = virTristateBoolTypeToString(def->enable);
> +
> + if (!fwd) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Unknown enable type %d in network"),
> + def->enable);
> + return -1;
I don't think check is needed. We've validated the forward mode when
parsing the XML.
Also, I think that we need slightly different approach here. I mean, for
"<dns enable='no'/>" case we just want to put that string into XML and
nothing more. With this code I'm able to get the following which makes
not much sense to me:
<dns enable='no'>
<txt name='example' value='example value'/>
</dns>
> + }
> + virBufferAsprintf(buf, " enable='%s'", fwd);
> + }
> if (def->forwardPlainNames) {
> const char *fwd = virTristateBoolTypeToString(def->forwardPlainNames);
>
The rest of the patch looks okay. ACK if you fix the XML formatting issue.
Michal
More information about the libvir-list
mailing list