mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 17:34:18 +03:00
4f595ba61c
This resolves the issue that prompted the filing of
https://bugzilla.redhat.com/show_bug.cgi?id=928638
(although the request there is for something much larger and more
general than this patch).
commit f3868259ca
disabled the
forwarding to upstream DNS servers of unresolved DNS requests for
names that had no domain, but were just simple host names (no "."
character anywhere in the name). While this behavior is frowned upon
by DNS root servers (that's why it was changed in libvirt), it is
convenient in some cases, and since dnsmasq can be configured to allow
it, it must not be strictly forbidden.
This patch restores the old behavior, but since it is usually
undesirable, restoring it requires specification of a new option in
the network config. Adding the attribute "forwardPlainNames='yes'" to
the <dns> elemnt does the trick - when that attribute is added to a
network config, any simple hostnames that can't be resolved by the
network's dnsmasq instance will be forwarded to the DNS servers listed
in the host's /etc/resolv.conf for an attempt at resolution (just as
any FQDN would be forwarded).
When that attribute *isn't* specified, unresolved simple names will
*not* be forwarded to the upstream DNS server - this is the default
behavior.
156 lines
4.2 KiB
C
156 lines
4.2 KiB
C
#include <config.h>
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <string.h>
|
|
|
|
#include <sys/types.h>
|
|
#include <fcntl.h>
|
|
|
|
#include "internal.h"
|
|
#include "testutils.h"
|
|
#include "network_conf.h"
|
|
#include "vircommand.h"
|
|
#include "viralloc.h"
|
|
#include "network/bridge_driver.h"
|
|
#include "virstring.h"
|
|
|
|
#define VIR_FROM_THIS VIR_FROM_NONE
|
|
|
|
static int
|
|
testCompareXMLToConfFiles(const char *inxml, const char *outconf, dnsmasqCapsPtr caps)
|
|
{
|
|
char *inXmlData = NULL;
|
|
char *outConfData = NULL;
|
|
char *actual = NULL;
|
|
int ret = -1;
|
|
virNetworkDefPtr dev = NULL;
|
|
virNetworkObjPtr obj = NULL;
|
|
virCommandPtr cmd = NULL;
|
|
char *pidfile = NULL;
|
|
dnsmasqContext *dctx = NULL;
|
|
|
|
if (virtTestLoadFile(inxml, &inXmlData) < 0)
|
|
goto fail;
|
|
|
|
if (virtTestLoadFile(outconf, &outConfData) < 0)
|
|
goto fail;
|
|
|
|
if (!(dev = virNetworkDefParseString(inXmlData)))
|
|
goto fail;
|
|
|
|
if (VIR_ALLOC(obj) < 0)
|
|
goto fail;
|
|
|
|
obj->def = dev;
|
|
dctx = dnsmasqContextNew(dev->name, "/var/lib/libvirt/dnsmasq");
|
|
|
|
if (dctx == NULL)
|
|
goto fail;
|
|
|
|
if (networkDnsmasqConfContents(obj, pidfile, &actual,
|
|
dctx, caps) < 0)
|
|
goto fail;
|
|
|
|
if (STRNEQ(outConfData, actual)) {
|
|
virtTestDifference(stderr, outConfData, actual);
|
|
goto fail;
|
|
}
|
|
|
|
ret = 0;
|
|
|
|
fail:
|
|
VIR_FREE(inXmlData);
|
|
VIR_FREE(outConfData);
|
|
VIR_FREE(actual);
|
|
VIR_FREE(pidfile);
|
|
virCommandFree(cmd);
|
|
virNetworkObjFree(obj);
|
|
dnsmasqContextFree(dctx);
|
|
return ret;
|
|
}
|
|
|
|
typedef struct {
|
|
const char *name;
|
|
dnsmasqCapsPtr caps;
|
|
} testInfo;
|
|
|
|
static int
|
|
testCompareXMLToConfHelper(const void *data)
|
|
{
|
|
int result = -1;
|
|
const testInfo *info = data;
|
|
char *inxml = NULL;
|
|
char *outxml = NULL;
|
|
|
|
if (virAsprintf(&inxml, "%s/networkxml2confdata/%s.xml",
|
|
abs_srcdir, info->name) < 0 ||
|
|
virAsprintf(&outxml, "%s/networkxml2confdata/%s.conf",
|
|
abs_srcdir, info->name) < 0) {
|
|
goto cleanup;
|
|
}
|
|
|
|
result = testCompareXMLToConfFiles(inxml, outxml, info->caps);
|
|
|
|
cleanup:
|
|
VIR_FREE(inxml);
|
|
VIR_FREE(outxml);
|
|
|
|
return result;
|
|
}
|
|
|
|
static char *
|
|
testDnsmasqLeaseFileName(const char *netname)
|
|
{
|
|
char *leasefile;
|
|
|
|
ignore_value(virAsprintf(&leasefile, "/var/lib/libvirt/dnsmasq/%s.leases",
|
|
netname));
|
|
return leasefile;
|
|
}
|
|
|
|
static int
|
|
mymain(void)
|
|
{
|
|
int ret = 0;
|
|
dnsmasqCapsPtr restricted
|
|
= dnsmasqCapsNewFromBuffer("Dnsmasq version 2.48", DNSMASQ);
|
|
dnsmasqCapsPtr full
|
|
= dnsmasqCapsNewFromBuffer("Dnsmasq version 2.63\n--bind-dynamic", DNSMASQ);
|
|
dnsmasqCapsPtr dhcpv6
|
|
= dnsmasqCapsNewFromBuffer("Dnsmasq version 2.64\n--bind-dynamic", DNSMASQ);
|
|
|
|
networkDnsmasqLeaseFileName = testDnsmasqLeaseFileName;
|
|
|
|
#define DO_TEST(xname, xcaps) \
|
|
do { \
|
|
static testInfo info; \
|
|
\
|
|
info.name = xname; \
|
|
info.caps = xcaps; \
|
|
if (virtTestRun("Network XML-2-Conf " xname, \
|
|
1, testCompareXMLToConfHelper, &info) < 0) { \
|
|
ret = -1; \
|
|
} \
|
|
} while (0)
|
|
|
|
DO_TEST("isolated-network", restricted);
|
|
DO_TEST("netboot-network", restricted);
|
|
DO_TEST("netboot-proxy-network", restricted);
|
|
DO_TEST("nat-network-dns-srv-record-minimal", restricted);
|
|
DO_TEST("routed-network", full);
|
|
DO_TEST("nat-network", dhcpv6);
|
|
DO_TEST("nat-network-dns-txt-record", full);
|
|
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("dhcp6-network", dhcpv6);
|
|
DO_TEST("dhcp6-nat-network", dhcpv6);
|
|
DO_TEST("dhcp6host-routed-network", dhcpv6);
|
|
|
|
return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
|
}
|
|
|
|
VIRT_TEST_MAIN(mymain)
|