This patch changes the way parameters are passed to dnsmasq. They are put into a conf-file instead of being on the dnsmasq command line. This patch includes the --interface patch and has updated the related tests for the new data format, etc. **NOTE** The command line now contains --conf-file=<filename> and a new parameter --conf-dir=<directoryname> has been added. The new file and directory are put in the same directory as the leases file. --- src/network/bridge_driver.c | 245 ++++++++++++--------- src/network/bridge_driver.h | 8 +- tests/networkxml2argvdata/isolated-network.argv | 25 ++- .../networkxml2argvdata/nat-network-dns-hosts.argv | 15 +- .../nat-network-dns-srv-record-minimal.argv | 36 +-- .../nat-network-dns-srv-record.argv | 36 +-- .../nat-network-dns-txt-record.argv | 30 ++- tests/networkxml2argvdata/nat-network.argv | 28 ++- tests/networkxml2argvdata/netboot-network.argv | 29 ++- .../networkxml2argvdata/netboot-proxy-network.argv | 26 ++- tests/networkxml2argvdata/routed-network.argv | 13 +- tests/networkxml2argvtest.c | 44 +--- 12 files changed, 296 insertions(+), 239 deletions(-) diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 8837843..137e480 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -65,7 +65,6 @@ #include "virnetdevtap.h" #include "virnetdevvportprofile.h" #include "virdbus.h" -#include "virfile.h" #define NETWORK_PID_DIR LOCALSTATEDIR "/run/libvirt/network" #define NETWORK_STATE_DIR LOCALSTATEDIR "/lib/libvirt/network" @@ -136,6 +135,16 @@ networkDnsmasqLeaseFileNameFunc networkDnsmasqLeaseFileName = networkDnsmasqLeaseFileNameDefault; static char * +networkDnsmasqConfigFileName(const char *netname) +{ + char *conffile; + + ignore_value(virAsprintf(&conffile, DNSMASQ_STATE_DIR "/%s.conf", + netname)); + return conffile; +} + +static char * networkRadvdPidfileBasename(const char *netname) { /* this is simple but we want to be sure it's consistently done */ @@ -559,23 +568,25 @@ networkBuildDnsmasqHostsfile(dnsmasqContext *dctx, return 0; } - + /* build the dnsmasq conf file contents */ static int -networkBuildDnsmasqArgv(virNetworkObjPtr network, +networkDnsmasqConfContents(virNetworkObjPtr network, virNetworkIpDefPtr ipdef, const char *pidfile, - virCommandPtr cmd, + char **configstr, dnsmasqContext *dctx) { - int r, ret = -1; + virBuffer configbuf = VIR_BUFFER_INITIALIZER;; + int r, ret = -1, ii; int nbleases = 0; - int ii; char *record = NULL; char *recordPort = NULL; char *recordWeight = NULL; char *recordPriority = NULL; virNetworkIpDefPtr tmpipdef; + *configstr = NULL; + /* * NB, be careful about syntax for dnsmasq options in long format. * @@ -595,28 +606,22 @@ networkBuildDnsmasqArgv(virNetworkObjPtr network, * very explicit on this. */ - /* - * Needed to ensure dnsmasq uses same algorithm for processing - * multiple namedriver entries in /etc/resolv.conf as GLibC. - */ - virCommandAddArgList(cmd, "--strict-order", "--bind-interfaces", NULL); - + /* create dnsmasq config file appropriate for this network */ + virBufferAsprintf(&configbuf, "# dnsmasq conf file created by libvirt\n" + "strict-order\n" + "bind-interfaces\n" + "except-interface=lo\n" + "domain-needed\n" + "local=/%s/\n", + network->def->domain ? network->def->domain : ""); if (network->def->domain) - virCommandAddArgPair(cmd, "--domain", network->def->domain); - /* need to specify local even if no domain specified */ - virCommandAddArgFormat(cmd, "--local=/%s/", - network->def->domain ? network->def->domain : ""); - virCommandAddArg(cmd, "--domain-needed"); + virBufferAsprintf(&configbuf, + "domain=%s\n" + "expand-hosts\n", + network->def->domain); if (pidfile) - virCommandAddArgPair(cmd, "--pid-file", pidfile); - - /* *no* conf file */ - virCommandAddArg(cmd, "--conf-file="); - - virCommandAddArgList(cmd, - "--except-interface", "lo", - NULL); + virBufferAsprintf(&configbuf, "pid-file=%s\n", pidfile); /* If this is an isolated network, set the default route option * (3) to be empty to avoid setting a default route that's @@ -626,16 +631,21 @@ networkBuildDnsmasqArgv(virNetworkObjPtr network, * to build a connection to the outside). */ if (network->def->forwardType == VIR_NETWORK_FORWARD_NONE) { - virCommandAddArgList(cmd, "--dhcp-option=3", - "--no-resolv", NULL); + virBufferAsprintf(&configbuf, "dhcp-option=3\n" + "no-resolv\n"); } + /* + * Needed to ensure dnsmasq uses same algorithm for processing + * multiple namedriver entries in /etc/resolv.conf as GLibC. + */ + if (network->def->dns != NULL) { virNetworkDNSDefPtr dns = network->def->dns; int i; for (i = 0; i < dns->ntxtrecords; i++) { - virCommandAddArgFormat(cmd, "--txt-record=%s,%s", + virBufferAsprintf(&configbuf, "txt-record=%s,%s\n", dns->txtrecords[i].name, dns->txtrecords[i].value); } @@ -673,7 +683,7 @@ networkBuildDnsmasqArgv(virNetworkObjPtr network, goto cleanup; } - virCommandAddArgPair(cmd, "--srv-host", record); + virBufferAsprintf(&configbuf, "srv-host=%s\n", record); VIR_FREE(record); VIR_FREE(recordPort); VIR_FREE(recordWeight); @@ -682,21 +692,20 @@ networkBuildDnsmasqArgv(virNetworkObjPtr network, } } - /* - * --interface does not actually work with dnsmasq < 2.47, - * due to DAD for ipv6 addresses on the interface. - * - * virCommandAddArgList(cmd, "--interface", ipdef->bridge, NULL); - * - * So listen on all defined IPv[46] addresses + /* This must be defined so that the kernel knows which dnsmasq to route + * packets to when more than one instance if running */ + if (network->def->bridge != NULL) + virBufferAsprintf(&configbuf, "interface=%s\n", network->def->bridge); + for (ii = 0; (tmpipdef = virNetworkDefGetIpByIndex(network->def, AF_UNSPEC, ii)); - ii++) { + ii++) + { char *ipaddr = virSocketAddrFormat(&tmpipdef->address); if (!ipaddr) goto cleanup; - virCommandAddArgList(cmd, "--listen-address", ipaddr, NULL); + virBufferAsprintf(&configbuf, "listen-address=%s\n", ipaddr); VIR_FREE(ipaddr); } @@ -710,8 +719,8 @@ networkBuildDnsmasqArgv(virNetworkObjPtr network, VIR_FREE(saddr); goto cleanup; } - virCommandAddArg(cmd, "--dhcp-range"); - virCommandAddArgFormat(cmd, "%s,%s", saddr, eaddr); + virBufferAsprintf(&configbuf, "dhcp-range=%s,%s\n", + saddr, eaddr); VIR_FREE(saddr); VIR_FREE(eaddr); nbleases += virSocketAddrGetRange(&ipdef->ranges[r].start, @@ -727,8 +736,7 @@ networkBuildDnsmasqArgv(virNetworkObjPtr network, char *bridgeaddr = virSocketAddrFormat(&ipdef->address); if (!bridgeaddr) goto cleanup; - virCommandAddArg(cmd, "--dhcp-range"); - virCommandAddArgFormat(cmd, "%s,static", bridgeaddr); + virBufferAsprintf(&configbuf, "dhcp-range=%s,static\n", bridgeaddr); VIR_FREE(bridgeaddr); } @@ -736,17 +744,13 @@ networkBuildDnsmasqArgv(virNetworkObjPtr network, char *leasefile = networkDnsmasqLeaseFileName(network->def->name); if (!leasefile) goto cleanup; - virCommandAddArgFormat(cmd, "--dhcp-leasefile=%s", leasefile); + virBufferAsprintf(&configbuf, "dhcp-leasefile=%s\n", leasefile); VIR_FREE(leasefile); - virCommandAddArgFormat(cmd, "--dhcp-lease-max=%d", nbleases); + virBufferAsprintf(&configbuf, "dhcp-lease-max=%d\n", nbleases); } if (ipdef->nranges || ipdef->nhosts) - virCommandAddArg(cmd, "--dhcp-no-override"); - - /* add domain to any non-qualified hostnames in /etc/hosts or addn-hosts */ - if (network->def->domain) - virCommandAddArg(cmd, "--expand-hosts"); + virBufferAsprintf(&configbuf, "dhcp-no-override\n"); if (networkBuildDnsmasqHostsfile(dctx, ipdef, network->def->dns) < 0) goto cleanup; @@ -756,38 +760,42 @@ networkBuildDnsmasqArgv(virNetworkObjPtr network, * file to allow for runtime additions. */ if (ipdef->nranges || ipdef->nhosts) - virCommandAddArgPair(cmd, "--dhcp-hostsfile", + virBufferAsprintf(&configbuf, "dhcp-hostsfile=%s\n", dctx->hostsfile->path); /* Likewise, always create this file and put it on the commandline, to allow for * for runtime additions. */ - virCommandAddArgPair(cmd, "--addn-hosts", + virBufferAsprintf(&configbuf, "addn-hosts=%s\n", dctx->addnhostsfile->path); if (ipdef->tftproot) { - virCommandAddArgList(cmd, "--enable-tftp", - "--tftp-root", ipdef->tftproot, - NULL); + virBufferAsprintf(&configbuf, "enable-tftp\n"); + virBufferAsprintf(&configbuf, "tftp-root=%s\n", ipdef->tftproot); } if (ipdef->bootfile) { - virCommandAddArg(cmd, "--dhcp-boot"); if (VIR_SOCKET_ADDR_VALID(&ipdef->bootserver)) { char *bootserver = virSocketAddrFormat(&ipdef->bootserver); if (!bootserver) goto cleanup; - virCommandAddArgFormat(cmd, "%s%s%s", + virBufferAsprintf(&configbuf, "dhcp-boot=%s%s%s\n", ipdef->bootfile, ",,", bootserver); VIR_FREE(bootserver); } else { - virCommandAddArg(cmd, ipdef->bootfile); + virBufferAsprintf(&configbuf, "dhcp-boot=%s\n", ipdef->bootfile); } } } + if (!(*configstr = virBufferContentAndReset(&configbuf))) { + virReportOOMError(); + goto cleanup; + } ret = 0; + cleanup: + virBufferFreeAndReset(&configbuf); VIR_FREE(record); VIR_FREE(recordPort); VIR_FREE(recordWeight); @@ -795,13 +803,18 @@ cleanup: return ret; } + /* build the dnsmasq command line */ int networkBuildDhcpDaemonCommandLine(virNetworkObjPtr network, virCommandPtr *cmdout, - char *pidfile, dnsmasqContext *dctx) + char *pidfile, dnsmasqContext *dctx, + char *configdir, + int testOnly, char **testConfigStr) { virCommandPtr cmd = NULL; int ret = -1, ii; virNetworkIpDefPtr ipdef; + char *configfile = NULL; + char *configstr = NULL; network->dnsmasqPid = -1; @@ -825,15 +838,41 @@ networkBuildDhcpDaemonCommandLine(virNetworkObjPtr network, virCommandPtr *cmdou if (!virNetworkDefGetIpByIndex(network->def, AF_UNSPEC, 0)) return 0; - cmd = virCommandNew(DNSMASQ); - if (networkBuildDnsmasqArgv(network, ipdef, pidfile, cmd, dctx) < 0) { + if (networkDnsmasqConfContents(network, ipdef, pidfile, &configstr, dctx) < 0) + goto cleanup; + if (!configstr) + goto cleanup; + + if (testOnly) { + *testConfigStr = configstr; + return 0; + } + + /* construct the filename */ + if (!(configfile = networkDnsmasqConfigFileName(network->def->name))) { + virReportOOMError(); + goto cleanup; + } + + /* Write the file */ + if (virFileWriteStr(configfile, configstr, 0600) < 0) { + virReportSystemError(errno, + _("couldn't write dnsmasq config file '%s'"), + configfile); goto cleanup; } + VIR_INFO("dnsmasq conf file %s written", configfile); + + cmd = virCommandNew(DNSMASQ); + virCommandAddArgFormat(cmd, "--conf-file=%s", configfile); + virCommandAddArgFormat(cmd, "--conf-dir=%s", configdir); if (cmdout) *cmdout = cmd; ret = 0; cleanup: + VIR_FREE(configstr); + VIR_FREE(configfile); if (ret < 0) virCommandFree(cmd); return ret; @@ -844,9 +883,12 @@ networkStartDhcpDaemon(virNetworkObjPtr network) { virCommandPtr cmd = NULL; char *pidfile = NULL; + char *testconfigstr = NULL; + char *configdir = NULL; int ret = -1; dnsmasqContext *dctx = NULL; + VIR_INFO("starting dhcp daemon (dnsmasq)"); if (!virNetworkDefGetIpByIndex(network->def, AF_UNSPEC, 0)) { /* no IPv6 addresses, so we don't need to run radvd */ ret = 0; @@ -882,7 +924,18 @@ networkStartDhcpDaemon(virNetworkObjPtr network) if (dctx == NULL) goto cleanup; - ret = networkBuildDhcpDaemonCommandLine(network, &cmd, pidfile, dctx); + ignore_value(virAsprintf(&configdir, DNSMASQ_STATE_DIR "/%s.d", + network->def->name)); + if (virFileMakePath(configdir) < 0) { + virReportSystemError(errno, + _("cannot create directory %s"), + configdir); + goto cleanup; + } + + + ret = networkBuildDhcpDaemonCommandLine(network, &cmd, pidfile, dctx, + configdir, 0, &testconfigstr); if (ret < 0) goto cleanup; @@ -911,6 +964,7 @@ networkStartDhcpDaemon(virNetworkObjPtr network) ret = 0; cleanup: VIR_FREE(pidfile); + VIR_FREE(configdir); virCommandFree(cmd); dnsmasqContextFree(dctx); return ret; @@ -988,22 +1042,19 @@ networkRestartDhcpDaemon(virNetworkObjPtr network) static int networkRadvdConfContents(virNetworkObjPtr network, char **configstr) { - virBuffer configbuf = VIR_BUFFER_INITIALIZER; + virBuffer configbuf = VIR_BUFFER_INITIALIZER;; int ret = -1, ii; virNetworkIpDefPtr ipdef; bool v6present = false; *configstr = NULL; - /* create radvd config file appropriate for this network; - * IgnoreIfMissing allows radvd to start even when the bridge is down - */ + /* create radvd config file appropriate for this network */ virBufferAsprintf(&configbuf, "interface %s\n" "{\n" " AdvSendAdvert on;\n" " AdvManagedFlag off;\n" " AdvOtherConfigFlag off;\n" - " IgnoreIfMissing on;\n" "\n", network->def->bridge); @@ -2072,7 +2123,6 @@ networkStartNetworkVirtual(struct network_driver *driver, virErrorPtr save_err = NULL; virNetworkIpDefPtr ipdef; char *macTapIfName = NULL; - int tapfd = -1; /* Check to see if any network IP collides with an existing route */ if (networkCheckRouteCollision(network) < 0) @@ -2094,13 +2144,10 @@ networkStartNetworkVirtual(struct network_driver *driver, virReportOOMError(); goto err0; } - /* Keep tun fd open and interface up to allow for IPv6 DAD to happen */ if (virNetDevTapCreateInBridgePort(network->def->bridge, &macTapIfName, &network->def->mac, - NULL, &tapfd, NULL, NULL, - VIR_NETDEV_TAP_CREATE_USE_MAC_FOR_BRIDGE | - VIR_NETDEV_TAP_CREATE_IFUP | - VIR_NETDEV_TAP_CREATE_PERSIST) < 0) { + NULL, NULL, NULL, NULL, + VIR_NETDEV_TAP_CREATE_USE_MAC_FOR_BRIDGE) < 0) { VIR_FREE(macTapIfName); goto err0; } @@ -2164,15 +2211,6 @@ networkStartNetworkVirtual(struct network_driver *driver, if (v6present && networkStartRadvd(network) < 0) goto err4; - /* DAD has happened (dnsmasq waits for it), dnsmasq is now bound to the - * bridge's IPv6 address, so we can now set the dummy tun down. - */ - if (tapfd >= 0) { - if (virNetDevSetOnline(macTapIfName, false) < 0) - goto err4; - VIR_FORCE_CLOSE(tapfd); - } - if (virNetDevBandwidthSet(network->def->bridge, network->def->bandwidth) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("cannot set bandwidth limits on %s"), @@ -2211,7 +2249,6 @@ networkStartNetworkVirtual(struct network_driver *driver, save_err = virSaveLastError(); if (macTapIfName) { - VIR_FORCE_CLOSE(tapfd); ignore_value(virNetDevTapDelete(macTapIfName)); VIR_FREE(macTapIfName); } @@ -2334,10 +2371,8 @@ networkStartNetwork(struct network_driver *driver, break; } - if (ret < 0) { - virNetworkObjUnsetDefTransient(network); + if (ret < 0) return ret; - } /* Persist the live configuration now that anything autogenerated * is setup. @@ -2397,7 +2432,13 @@ static int networkShutdownNetwork(struct network_driver *driver, } network->active = 0; - virNetworkObjUnsetDefTransient(network); + + if (network->newDef) { + virNetworkDefFree(network->def); + network->def = network->newDef; + network->newDef = NULL; + } + return ret; } @@ -2618,7 +2659,6 @@ networkValidate(virNetworkDefPtr def) { int ii; bool vlanUsed, vlanAllowed; - const char *defaultPortGroup = NULL; /* The only type of networks that currently support transparent * vlan configuration are those using hostdev sr-iov devices from @@ -2639,17 +2679,6 @@ networkValidate(virNetworkDefPtr def) == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH)) { vlanAllowed = true; } - if (def->portGroups[ii].isDefault) { - if (defaultPortGroup) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("network '%s' has multiple default " - "<portgroup> elements (%s and %s), " - "but only one default is allowed"), - def->name, defaultPortGroup, - def->portGroups[ii].name); - } - defaultPortGroup = def->portGroups[ii].name; - } } if (vlanUsed && !vlanAllowed) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, @@ -2841,6 +2870,14 @@ static int networkUndefine(virNetworkPtr net) { } } + { + char *configfile = networkDnsmasqConfigFileName(network->def->name); + if (!configfile) + goto cleanup; + unlink(configfile); + VIR_FREE(configfile); + } + if (dhcp_present) { char *leasefile; dnsmasqContext *dctx = dnsmasqContextNew(network->def->name, DNSMASQ_STATE_DIR); @@ -2933,8 +2970,8 @@ networkUpdate(virNetworkPtr net, * is active, else change CONFIG */ isActive = virNetworkObjIsActive(network); - if ((flags & (VIR_NETWORK_UPDATE_AFFECT_LIVE | - VIR_NETWORK_UPDATE_AFFECT_CONFIG)) == + if ((flags & (VIR_NETWORK_UPDATE_AFFECT_LIVE + | VIR_NETWORK_UPDATE_AFFECT_CONFIG)) == VIR_NETWORK_UPDATE_AFFECT_CURRENT) { if (isActive) flags |= VIR_NETWORK_UPDATE_AFFECT_LIVE; @@ -3870,8 +3907,8 @@ networkNotifyActualDevice(virDomainNetDefPtr iface) for (ii = 0; ii < netdef->nForwardIfs; ii++) { if (netdef->forwardIfs[ii].type == VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_PCI && - virDevicePCIAddressEqual(&hostdev->source.subsys.u.pci, - &netdef->forwardIfs[ii].device.pci)) { + (virDevicePCIAddressEqual(hostdev->source.subsys.u.pci, + netdef->forwardIfs[ii].device.pci) == 0)) { dev = &netdef->forwardIfs[ii]; break; } @@ -4022,8 +4059,8 @@ networkReleaseActualDevice(virDomainNetDefPtr iface) for (ii = 0; ii < netdef->nForwardIfs; ii++) { if (netdef->forwardIfs[ii].type == VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_PCI && - virDevicePCIAddressEqual(&hostdev->source.subsys.u.pci, - &netdef->forwardIfs[ii].device.pci)) { + (virDevicePCIAddressEqual(hostdev->source.subsys.u.pci, + netdef->forwardIfs[ii].device.pci) == 0)) { dev = &netdef->forwardIfs[ii]; break; } diff --git a/src/network/bridge_driver.h b/src/network/bridge_driver.h index 0fae275..608c622 100644 --- a/src/network/bridge_driver.h +++ b/src/network/bridge_driver.h @@ -48,15 +48,17 @@ int networkGetNetworkAddress(const char *netname, char **netaddr) int networkBuildDhcpDaemonCommandLine(virNetworkObjPtr network, virCommandPtr *cmdout, char *pidfile, - dnsmasqContext *dctx) - ; + dnsmasqContext *dctx, + char *configdir, + int testOnly, char **testConfigStr); # else /* Define no-op replacements that don't drag in any link dependencies. */ # define networkAllocateActualDevice(iface) 0 # define networkNotifyActualDevice(iface) 0 # define networkReleaseActualDevice(iface) 0 # define networkGetNetworkAddress(netname, netaddr) (-2) -# define networkBuildDhcpDaemonCommandLine(network, cmdout, pidfile, dctx) 0 +# define networkBuildDhcpDaemonCommandLine(network, cmdout, pidfile, \ + dctx, configdir, testOnly, testConfigStr) 0 # endif typedef char *(*networkDnsmasqLeaseFileNameFunc)(const char *netname); diff --git a/tests/networkxml2argvdata/isolated-network.argv b/tests/networkxml2argvdata/isolated-network.argv index 13e77b2..abcde93 100644 --- a/tests/networkxml2argvdata/isolated-network.argv +++ b/tests/networkxml2argvdata/isolated-network.argv @@ -1,9 +1,16 @@ -@DNSMASQ@ --strict-order --bind-interfaces \ ---local=// --domain-needed --conf-file= \ ---except-interface lo --dhcp-option=3 --no-resolv \ ---listen-address 192.168.152.1 \ ---dhcp-range 192.168.152.2,192.168.152.254 \ ---dhcp-leasefile=/var/lib/libvirt/dnsmasq/private.leases --dhcp-lease-max=253 \ ---dhcp-no-override \ ---dhcp-hostsfile=/var/lib/libvirt/dnsmasq/private.hostsfile \ ---addn-hosts=/var/lib/libvirt/dnsmasq/private.addnhosts\ +# dnsmasq conf file created by libvirt +strict-order +bind-interfaces +except-interface=lo +domain-needed +local=// +dhcp-option=3 +no-resolv +interface=virbr2 +listen-address=192.168.152.1 +dhcp-range=192.168.152.2,192.168.152.254 +dhcp-leasefile=/var/lib/libvirt/dnsmasq/private.leases +dhcp-lease-max=253 +dhcp-no-override +dhcp-hostsfile=/var/lib/libvirt/dnsmasq/private.hostsfile +addn-hosts=/var/lib/libvirt/dnsmasq/private.addnhosts diff --git a/tests/networkxml2argvdata/nat-network-dns-hosts.argv b/tests/networkxml2argvdata/nat-network-dns-hosts.argv index 03a0676..7dce6f9 100644 --- a/tests/networkxml2argvdata/nat-network-dns-hosts.argv +++ b/tests/networkxml2argvdata/nat-network-dns-hosts.argv @@ -1,4 +1,11 @@ -@DNSMASQ@ --strict-order --bind-interfaces --domain=example.com \ ---local=/example.com/ --domain-needed \ ---conf-file= --except-interface lo --listen-address 192.168.122.1 \ ---expand-hosts --addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts\ +# dnsmasq conf file created by libvirt +strict-order +bind-interfaces +except-interface=lo +domain-needed +local=/example.com/ +domain=example.com +expand-hosts +interface=virbr0 +listen-address=192.168.122.1 +addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts diff --git a/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.argv b/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.argv index 210a60c..d87d438 100644 --- a/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.argv +++ b/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.argv @@ -1,17 +1,19 @@ -@DNSMASQ@ \ ---strict-order \ ---bind-interfaces \ ---local=// --domain-needed --conf-file= \ ---except-interface lo \ ---srv-host=name.tcp.,,,, \ ---listen-address 192.168.122.1 \ ---listen-address 192.168.123.1 \ ---listen-address 2001:db8:ac10:fe01::1 \ ---listen-address 2001:db8:ac10:fd01::1 \ ---listen-address 10.24.10.1 \ ---dhcp-range 192.168.122.2,192.168.122.254 \ ---dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases \ ---dhcp-lease-max=253 \ ---dhcp-no-override \ ---dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile \ ---addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts\ +# dnsmasq conf file created by libvirt +strict-order +bind-interfaces +except-interface=lo +domain-needed +local=// +srv-host=name.tcp.,,,, +interface=virbr0 +listen-address=192.168.122.1 +listen-address=192.168.123.1 +listen-address=2001:db8:ac10:fe01::1 +listen-address=2001:db8:ac10:fd01::1 +listen-address=10.24.10.1 +dhcp-range=192.168.122.2,192.168.122.254 +dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases +dhcp-lease-max=253 +dhcp-no-override +dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile +addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts diff --git a/tests/networkxml2argvdata/nat-network-dns-srv-record.argv b/tests/networkxml2argvdata/nat-network-dns-srv-record.argv index 833d3cd..53882fe 100644 --- a/tests/networkxml2argvdata/nat-network-dns-srv-record.argv +++ b/tests/networkxml2argvdata/nat-network-dns-srv-record.argv @@ -1,17 +1,19 @@ -@DNSMASQ@ \ ---strict-order \ ---bind-interfaces \ ---local=// --domain-needed --conf-file= \ ---except-interface lo \ ---srv-host=name.tcp.test-domain-name,.,1024,10,10 \ ---listen-address 192.168.122.1 \ ---listen-address 192.168.123.1 \ ---listen-address 2001:db8:ac10:fe01::1 \ ---listen-address 2001:db8:ac10:fd01::1 \ ---listen-address 10.24.10.1 \ ---dhcp-range 192.168.122.2,192.168.122.254 \ ---dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases \ ---dhcp-lease-max=253 \ ---dhcp-no-override \ ---dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile \ ---addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts\ +# dnsmasq conf file created by libvirt +strict-order +bind-interfaces +except-interface=lo +domain-needed +local=// +srv-host=name.tcp.test-domain-name,.,1024,10,10 +interface=virbr0 +listen-address=192.168.122.1 +listen-address=192.168.123.1 +listen-address=2001:db8:ac10:fe01::1 +listen-address=2001:db8:ac10:fd01::1 +listen-address=10.24.10.1 +dhcp-range=192.168.122.2,192.168.122.254 +dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases +dhcp-lease-max=253 +dhcp-no-override +dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile +addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts diff --git a/tests/networkxml2argvdata/nat-network-dns-txt-record.argv b/tests/networkxml2argvdata/nat-network-dns-txt-record.argv index 3481507..cc3ed28 100644 --- a/tests/networkxml2argvdata/nat-network-dns-txt-record.argv +++ b/tests/networkxml2argvdata/nat-network-dns-txt-record.argv @@ -1,11 +1,19 @@ -@DNSMASQ@ --strict-order --bind-interfaces \ ---local=// --domain-needed --conf-file= \ ---except-interface lo '--txt-record=example,example value' \ ---listen-address 192.168.122.1 --listen-address 192.168.123.1 \ ---listen-address 2001:db8:ac10:fe01::1 \ ---listen-address 2001:db8:ac10:fd01::1 --listen-address 10.24.10.1 \ ---dhcp-range 192.168.122.2,192.168.122.254 \ ---dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases \ ---dhcp-lease-max=253 --dhcp-no-override \ ---dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile \ ---addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts\ +# dnsmasq conf file created by libvirt +strict-order +bind-interfaces +except-interface=lo +domain-needed +local=// +txt-record=example,example value +interface=virbr0 +listen-address=192.168.122.1 +listen-address=192.168.123.1 +listen-address=2001:db8:ac10:fe01::1 +listen-address=2001:db8:ac10:fd01::1 +listen-address=10.24.10.1 +dhcp-range=192.168.122.2,192.168.122.254 +dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases +dhcp-lease-max=253 +dhcp-no-override +dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile +addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts diff --git a/tests/networkxml2argvdata/nat-network.argv b/tests/networkxml2argvdata/nat-network.argv index 37fd2fc..431fffb 100644 --- a/tests/networkxml2argvdata/nat-network.argv +++ b/tests/networkxml2argvdata/nat-network.argv @@ -1,10 +1,18 @@ -@DNSMASQ@ --strict-order --bind-interfaces \ ---local=// --domain-needed --conf-file= \ ---except-interface lo --listen-address 192.168.122.1 \ ---listen-address 192.168.123.1 --listen-address 2001:db8:ac10:fe01::1 \ ---listen-address 2001:db8:ac10:fd01::1 --listen-address 10.24.10.1 \ ---dhcp-range 192.168.122.2,192.168.122.254 \ ---dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases \ ---dhcp-lease-max=253 --dhcp-no-override \ ---dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile \ ---addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts\ +# dnsmasq conf file created by libvirt +strict-order +bind-interfaces +except-interface=lo +domain-needed +local=// +interface=virbr0 +listen-address=192.168.122.1 +listen-address=192.168.123.1 +listen-address=2001:db8:ac10:fe01::1 +listen-address=2001:db8:ac10:fd01::1 +listen-address=10.24.10.1 +dhcp-range=192.168.122.2,192.168.122.254 +dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases +dhcp-lease-max=253 +dhcp-no-override +dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile +addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts diff --git a/tests/networkxml2argvdata/netboot-network.argv b/tests/networkxml2argvdata/netboot-network.argv index 5408eb7..8405095 100644 --- a/tests/networkxml2argvdata/netboot-network.argv +++ b/tests/networkxml2argvdata/netboot-network.argv @@ -1,10 +1,19 @@ -@DNSMASQ@ --strict-order --bind-interfaces --domain=example.com \ ---local=/example.com/ --domain-needed --conf-file= \ ---except-interface lo --listen-address 192.168.122.1 \ ---dhcp-range 192.168.122.2,192.168.122.254 \ ---dhcp-leasefile=/var/lib/libvirt/dnsmasq/netboot.leases \ ---dhcp-lease-max=253 --dhcp-no-override --expand-hosts \ ---dhcp-hostsfile=/var/lib/libvirt/dnsmasq/netboot.hostsfile \ ---addn-hosts=/var/lib/libvirt/dnsmasq/netboot.addnhosts \ ---enable-tftp \ ---tftp-root /var/lib/tftproot --dhcp-boot pxeboot.img\ +# dnsmasq conf file created by libvirt +strict-order +bind-interfaces +except-interface=lo +domain-needed +local=/example.com/ +domain=example.com +expand-hosts +interface=virbr1 +listen-address=192.168.122.1 +dhcp-range=192.168.122.2,192.168.122.254 +dhcp-leasefile=/var/lib/libvirt/dnsmasq/netboot.leases +dhcp-lease-max=253 +dhcp-no-override +dhcp-hostsfile=/var/lib/libvirt/dnsmasq/netboot.hostsfile +addn-hosts=/var/lib/libvirt/dnsmasq/netboot.addnhosts +enable-tftp +tftp-root=/var/lib/tftproot +dhcp-boot=pxeboot.img diff --git a/tests/networkxml2argvdata/netboot-proxy-network.argv b/tests/networkxml2argvdata/netboot-proxy-network.argv index 21e01e3..d7c8966 100644 --- a/tests/networkxml2argvdata/netboot-proxy-network.argv +++ b/tests/networkxml2argvdata/netboot-proxy-network.argv @@ -1,9 +1,17 @@ -@DNSMASQ@ --strict-order --bind-interfaces --domain=example.com \ ---local=/example.com/ --domain-needed --conf-file= \ ---except-interface lo --listen-address 192.168.122.1 \ ---dhcp-range 192.168.122.2,192.168.122.254 \ ---dhcp-leasefile=/var/lib/libvirt/dnsmasq/netboot.leases \ ---dhcp-lease-max=253 --dhcp-no-override --expand-hosts \ ---dhcp-hostsfile=/var/lib/libvirt/dnsmasq/netboot.hostsfile \ ---addn-hosts=/var/lib/libvirt/dnsmasq/netboot.addnhosts \ ---dhcp-boot pxeboot.img,,10.20.30.40\ +# dnsmasq conf file created by libvirt +strict-order +bind-interfaces +except-interface=lo +domain-needed +local=/example.com/ +domain=example.com +expand-hosts +interface=virbr1 +listen-address=192.168.122.1 +dhcp-range=192.168.122.2,192.168.122.254 +dhcp-leasefile=/var/lib/libvirt/dnsmasq/netboot.leases +dhcp-lease-max=253 +dhcp-no-override +dhcp-hostsfile=/var/lib/libvirt/dnsmasq/netboot.hostsfile +addn-hosts=/var/lib/libvirt/dnsmasq/netboot.addnhosts +dhcp-boot=pxeboot.img,,10.20.30.40 diff --git a/tests/networkxml2argvdata/routed-network.argv b/tests/networkxml2argvdata/routed-network.argv index 9fedb2b..771240f 100644 --- a/tests/networkxml2argvdata/routed-network.argv +++ b/tests/networkxml2argvdata/routed-network.argv @@ -1,4 +1,9 @@ -@DNSMASQ@ --strict-order --bind-interfaces \ ---local=// --domain-needed --conf-file= \ ---except-interface lo --listen-address 192.168.122.1 \ ---addn-hosts=/var/lib/libvirt/dnsmasq/local.addnhosts\ +# dnsmasq conf file created by libvirt +strict-order +bind-interfaces +except-interface=lo +domain-needed +local=// +interface=virbr1 +listen-address=192.168.122.1 +addn-hosts=/var/lib/libvirt/dnsmasq/local.addnhosts diff --git a/tests/networkxml2argvtest.c b/tests/networkxml2argvtest.c index 87519e4..275b190 100644 --- a/tests/networkxml2argvtest.c +++ b/tests/networkxml2argvtest.c @@ -15,37 +15,6 @@ #include "memory.h" #include "network/bridge_driver.h" -/* Replace all occurrences of @token in @buf by @replacement and adjust size of - * @buf accordingly. Returns 0 on success and -1 on out-of-memory errors. */ -static int replaceTokens(char **buf, const char *token, const char *replacement) { - size_t token_start, token_end; - size_t buf_len, rest_len; - const size_t token_len = strlen(token); - const size_t replacement_len = strlen(replacement); - const int diff = replacement_len - token_len; - - buf_len = rest_len = strlen(*buf) + 1; - token_end = 0; - for (;;) { - char *match = strstr(*buf + token_end, token); - if (match == NULL) - break; - token_start = match - *buf; - rest_len -= token_start + token_len - token_end; - token_end = token_start + token_len; - buf_len += diff; - if (diff > 0) - if (VIR_REALLOC_N(*buf, buf_len) < 0) - return -1; - if (diff != 0) - memmove(*buf + token_end + diff, *buf + token_end, rest_len); - memcpy(*buf + token_start, replacement, replacement_len); - token_end += diff; - } - /* if diff < 0, we could shrink the buffer here... */ - return 0; -} - static int testCompareXMLToArgvFiles(const char *inxml, const char *outargv) { char *inXmlData = NULL; char *outArgvData = NULL; @@ -55,6 +24,7 @@ static int testCompareXMLToArgvFiles(const char *inxml, const char *outargv) { virNetworkObjPtr obj = NULL; virCommandPtr cmd = NULL; char *pidfile = NULL; + char *configdir = NULL; dnsmasqContext *dctx = NULL; if (virtTestLoadFile(inxml, &inXmlData) < 0) @@ -62,10 +32,6 @@ static int testCompareXMLToArgvFiles(const char *inxml, const char *outargv) { if (virtTestLoadFile(outargv, &outArgvData) < 0) goto fail; - - if (replaceTokens(&outArgvData, "@DNSMASQ@", DNSMASQ)) - goto fail; - if (!(dev = virNetworkDefParseString(inXmlData))) goto fail; @@ -78,12 +44,9 @@ static int testCompareXMLToArgvFiles(const char *inxml, const char *outargv) { if (dctx == NULL) goto fail; - if (networkBuildDhcpDaemonCommandLine(obj, &cmd, pidfile, dctx) < 0) - goto fail; - - if (!(actual = virCommandToString(cmd))) + if (networkBuildDhcpDaemonCommandLine(obj, &cmd, pidfile, + dctx, configdir, 1, &actual) < 0) goto fail; - if (STRNEQ(outArgvData, actual)) { virtTestDifference(stderr, outArgvData, actual); goto fail; @@ -147,7 +110,6 @@ mymain(void) if (virtTestRun("Network XML-2-Argv " name, \ 1, testCompareXMLToArgvHelper, (name)) < 0) \ ret = -1 - DO_TEST("isolated-network"); DO_TEST("routed-network"); DO_TEST("nat-network"); -- 1.7.11.7 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list