[PATCH] put dnsmasq parameters into a file instead of the command line

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]