Useful to set custom forwarders instead of using the contents of /etc/resolv.conf. It helps me to setup dnsmasq as local nameserver to resolv VM domain names from domain 0, when domain option is used. Signed-off-by: Diego Woitasen <diego.woitasen@xxxxxxxxxxx> --- src/conf/network_conf.c | 34 +++++++++++++++++++++- src/conf/network_conf.h | 1 + src/network/bridge_driver.c | 8 +++++ .../nat-network-dns-forwarders.conf | 15 ++++++++++ .../nat-network-dns-forwarders.xml | 9 ++++++ tests/networkxml2conftest.c | 1 + 6 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 tests/networkxml2confdata/nat-network-dns-forwarders.conf create mode 100644 tests/networkxml2confdata/nat-network-dns-forwarders.xml diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index d54f2aa..99f12d2 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -175,6 +175,12 @@ virNetworkDNSSrvDefClear(virNetworkDNSSrvDefPtr def) static void virNetworkDNSDefClear(virNetworkDNSDefPtr def) { + if (def->forwarders) { + size_t i; + for (i = 0; def->forwarders[i] != NULL; i++) + VIR_FREE(def->forwarders[i]); + VIR_FREE(def->forwarders); + } if (def->txts) { while (def->ntxts) virNetworkDNSTxtDefClear(&def->txts[--def->ntxts]); @@ -1038,6 +1044,7 @@ virNetworkDNSDefParseXML(const char *networkName, xmlNodePtr *srvNodes = NULL; xmlNodePtr *txtNodes = NULL; char *forwardPlainNames = NULL; + char *forwarders = NULL; int nhosts, nsrvs, ntxts; size_t i; int ret = -1; @@ -1058,6 +1065,20 @@ virNetworkDNSDefParseXML(const char *networkName, } } + forwarders = virXPathString("string(./@forwarders)", ctxt); + if (forwarders) { + def->forwarders = virStringSplit(forwarders, ",", 0); + for (i = 0; def->forwarders[i] != NULL; i++) { + if (virSocketAddrParse(NULL, def->forwarders[i], AF_UNSPEC) < 0) { + virReportError(VIR_ERR_XML_ERROR, + _("Invalid forwarder IP address '%s' " + "in network '%s'"), + def->forwarders[i], networkName); + goto cleanup; + } + } + } + nhosts = virXPathNodeSet("./host", ctxt, &hostNodes); if (nhosts < 0) { virReportError(VIR_ERR_XML_ERROR, @@ -1120,6 +1141,7 @@ virNetworkDNSDefParseXML(const char *networkName, ret = 0; cleanup: + VIR_FREE(forwarders); VIR_FREE(forwardPlainNames); VIR_FREE(hostNodes); VIR_FREE(srvNodes); @@ -2267,12 +2289,22 @@ virNetworkDNSDefFormat(virBufferPtr buf, int result = 0; size_t i, j; - if (!(def->forwardPlainNames || def->nhosts || def->nsrvs || def->ntxts)) + if (!(def->forwardPlainNames || def->forwarders || def->nhosts || + def->nsrvs || def->ntxts)) goto out; virBufferAddLit(buf, "<dns"); if (def->forwardPlainNames) { virBufferAddLit(buf, " forwardPlainNames='yes'"); + if (!(def->forwarders || def->nhosts || def->nsrvs || def->ntxts)) { + virBufferAddLit(buf, "/>\n"); + goto out; + } + } + + if (def->forwarders) { + char *forwarders = virStringJoin((const char **)def->forwarders, ","); + virBufferAsprintf(buf, " forwarders='%s'", forwarders); if (!(def->nhosts || def->nsrvs || def->ntxts)) { virBufferAddLit(buf, "/>\n"); goto out; diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index c28bfae..3bedc2f 100644 --- a/src/conf/network_conf.h +++ b/src/conf/network_conf.h @@ -122,6 +122,7 @@ struct _virNetworkDNSDef { virNetworkDNSHostDefPtr hosts; size_t nsrvs; virNetworkDNSSrvDefPtr srvs; + char **forwarders; }; typedef struct _virNetworkIpDef virNetworkIpDef; diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 3a8be90..c167254 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -708,6 +708,14 @@ networkDnsmasqConfContents(virNetworkObjPtr network, if (!network->def->dns.forwardPlainNames) virBufferAddLit(&configbuf, "domain-needed\n"); + if (network->def->dns.forwarders) { + virBufferAddLit(&configbuf, "no-resolv\n"); + for (i=0; network->def->dns.forwarders[i] != NULL; i++) { + virBufferAsprintf(&configbuf, "server=%s\n", + network->def->dns.forwarders[i]); + } + } + if (network->def->domain) { virBufferAsprintf(&configbuf, "domain=%s\n" diff --git a/tests/networkxml2confdata/nat-network-dns-forwarders.conf b/tests/networkxml2confdata/nat-network-dns-forwarders.conf new file mode 100644 index 0000000..ea6a54a --- /dev/null +++ b/tests/networkxml2confdata/nat-network-dns-forwarders.conf @@ -0,0 +1,15 @@ +##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE +##OVERWRITTEN AND LOST. Changes to this configuration should be made using: +## virsh net-edit default +## or other application using the libvirt API. +## +## dnsmasq conf file created by libvirt +strict-order +domain-needed +no-resolv +server=8.8.8.8 +local=// +except-interface=lo +bind-dynamic +interface=virbr0 +addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts diff --git a/tests/networkxml2confdata/nat-network-dns-forwarders.xml b/tests/networkxml2confdata/nat-network-dns-forwarders.xml new file mode 100644 index 0000000..7955cc7 --- /dev/null +++ b/tests/networkxml2confdata/nat-network-dns-forwarders.xml @@ -0,0 +1,9 @@ +<network> + <name>default</name> + <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9c</uuid> + <forward dev='eth0' mode='nat'/> + <bridge name='virbr0' stp='on' delay='0' /> + <dns forwarders='8.8.8.8'/> + <ip address='192.168.122.1' netmask='255.255.255.0'> + </ip> +</network> diff --git a/tests/networkxml2conftest.c b/tests/networkxml2conftest.c index 5825af3..ad50e88 100644 --- a/tests/networkxml2conftest.c +++ b/tests/networkxml2conftest.c @@ -145,6 +145,7 @@ mymain(void) DO_TEST("nat-network-dns-srv-record", full); DO_TEST("nat-network-dns-hosts", full); DO_TEST("nat-network-dns-forward-plain", full); + DO_TEST("nat-network-dns-forwarders", full); DO_TEST("dhcp6-network", dhcpv6); DO_TEST("dhcp6-nat-network", dhcpv6); DO_TEST("dhcp6host-routed-network", dhcpv6); -- 1.8.1.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list