]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
xml: print uuids in the warning
authorJán Tomko <jtomko@redhat.com>
Mon, 29 Oct 2012 12:15:55 +0000 (13:15 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 29 Oct 2012 13:38:43 +0000 (14:38 +0100)
In the XML warning, we print a virsh command line that can be used to
edit that XML. This patch prints UUIDs if the entity name contains
special characters (like shell metacharacters, or "--" that would break
parsing of the XML comment). If the entity doesn't have a UUID, just
print the virsh command that can be used to edit it.

src/conf/domain_conf.c
src/conf/network_conf.c
src/conf/nwfilter_conf.c
src/conf/storage_conf.c
src/libvirt_private.syms
src/parallels/parallels_storage.c
src/qemu/qemu_domain.c
src/util/xml.c
src/util/xml.h

index 90ec9aa0b3d532dc2cea6eb502f127e2ef200ae1..7bf0282b87d541a69ee7897b48fcc8181170040f 100644 (file)
@@ -14288,6 +14288,7 @@ int virDomainSaveXML(const char *configDir,
                      virDomainDefPtr def,
                      const char *xml)
 {
+    char uuidstr[VIR_UUID_STRING_BUFLEN];
     char *configFile = NULL;
     int ret = -1;
 
@@ -14301,7 +14302,10 @@ int virDomainSaveXML(const char *configDir,
         goto cleanup;
     }
 
-    ret = virXMLSaveFile(configFile, def->name, "edit", xml);
+    virUUIDFormat(def->uuid, uuidstr);
+    ret = virXMLSaveFile(configFile,
+                         virXMLPickShellSafeComment(def->name, uuidstr), "edit",
+                         xml);
 
  cleanup:
     VIR_FREE(configFile);
index 8976f2a122fb7d4b8a9a8433c8eb6cec87a7bc54..a55339d3a596eeac13d4bfe5dcc8a8742c77df47 100644 (file)
@@ -1978,6 +1978,7 @@ int virNetworkSaveXML(const char *configDir,
                       virNetworkDefPtr def,
                       const char *xml)
 {
+    char uuidstr[VIR_UUID_STRING_BUFLEN];
     char *configFile = NULL;
     int ret = -1;
 
@@ -1991,7 +1992,10 @@ int virNetworkSaveXML(const char *configDir,
         goto cleanup;
     }
 
-    ret = virXMLSaveFile(configFile, def->name, "net-edit", xml);
+    virUUIDFormat(def->uuid, uuidstr);
+    ret = virXMLSaveFile(configFile,
+                         virXMLPickShellSafeComment(def->name, uuidstr),
+                         "net-edit", xml);
 
  cleanup:
     VIR_FREE(configFile);
index 27dbee8b3101b8db3ced82048325575827438120..b6d5d40869d9eea17e4547aa03097d370777cfcb 100644 (file)
@@ -2717,6 +2717,7 @@ int virNWFilterSaveXML(const char *configDir,
                        virNWFilterDefPtr def,
                        const char *xml)
 {
+    char uuidstr[VIR_UUID_STRING_BUFLEN];
     char *configFile = NULL;
     int ret = -1;
 
@@ -2730,7 +2731,10 @@ int virNWFilterSaveXML(const char *configDir,
         goto cleanup;
     }
 
-    ret = virXMLSaveFile(configFile, def->name, "nwfilter-edit", xml);
+    virUUIDFormat(def->uuid, uuidstr);
+    ret = virXMLSaveFile(configFile,
+                         virXMLPickShellSafeComment(def->name, uuidstr),
+                         "nwfilter-edit", xml);
 
  cleanup:
     VIR_FREE(configFile);
@@ -3151,6 +3155,7 @@ virNWFilterObjSaveDef(virNWFilterDriverStatePtr driver,
                       virNWFilterObjPtr nwfilter,
                       virNWFilterDefPtr def)
 {
+    char uuidstr[VIR_UUID_STRING_BUFLEN];
     char *xml;
     int ret;
 
@@ -3174,7 +3179,10 @@ virNWFilterObjSaveDef(virNWFilterDriverStatePtr driver,
         return -1;
     }
 
-    ret = virXMLSaveFile(nwfilter->configFile, def->name, "nwfilter-edit", xml);
+    virUUIDFormat(def->uuid, uuidstr);
+    ret = virXMLSaveFile(nwfilter->configFile,
+                         virXMLPickShellSafeComment(def->name, uuidstr),
+                         "nwfilter-edit", xml);
     VIR_FREE(xml);
 
     return ret;
index 5d9e61a2b4bb5955268acbec151ab8800d79ba57..9a765d8d53f8e5a54e9171c97b37a53aa10f003f 100644 (file)
@@ -1637,6 +1637,7 @@ virStoragePoolObjSaveDef(virStorageDriverStatePtr driver,
                          virStoragePoolObjPtr pool,
                          virStoragePoolDefPtr def)
 {
+    char uuidstr[VIR_UUID_STRING_BUFLEN];
     char *xml;
     int ret = -1;
 
@@ -1666,7 +1667,10 @@ virStoragePoolObjSaveDef(virStorageDriverStatePtr driver,
         return -1;
     }
 
-    ret = virXMLSaveFile(pool->configFile, def->name, "pool-edit", xml);
+    virUUIDFormat(def->uuid, uuidstr);
+    ret = virXMLSaveFile(pool->configFile,
+                         virXMLPickShellSafeComment(def->name, uuidstr),
+                         "pool-edit", xml);
     VIR_FREE(xml);
 
     return ret;
index 8212726c4cb5df21c9dbff681c04d3fd6330cfa6..02ca2c7af877695bf81b22977f04ebebfa198cbb 100644 (file)
@@ -1819,6 +1819,7 @@ virURIParse;
 # xml.h
 virXMLChildElementCount;
 virXMLParseHelper;
+virXMLPickShellSafeComment;
 virXMLPropString;
 virXMLSaveFile;
 virXPathBoolean;
index 76d885c3621b1069fb10bb3d961d73613bea882b..71f3f892f2012260da8bb7105f3fc3be4a9c14b6 100644 (file)
@@ -973,8 +973,7 @@ parallelsStorageVolumeDefine(virStoragePoolObjPtr pool,
         if (!xml_path)
             goto cleanup;
 
-        if (virXMLSaveFile(xml_path, privvol->name,
-                           "volume-create", xmldesc)) {
+        if (virXMLSaveFile(xml_path, NULL, "volume-create", xmldesc)) {
             virReportError(VIR_ERR_OPERATION_FAILED, "%s",
                            _("Can't create file with volume description"));
             goto cleanup;
index 4e6a5e93a836ad0ef9960e17a9cf3b4397b5a0f1..d01e3667a41308c3178cf9726e45a107ecd1c34b 100644 (file)
@@ -1599,7 +1599,6 @@ qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm,
     char *snapDir = NULL;
     char *snapFile = NULL;
     char uuidstr[VIR_UUID_STRING_BUFLEN];
-    char *tmp;
 
     virUUIDFormat(vm->def->uuid, uuidstr);
     newxml = virDomainSnapshotDefFormat(uuidstr, snapshot->def,
@@ -1622,13 +1621,7 @@ qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm,
         goto cleanup;
     }
 
-    if (virAsprintf(&tmp, "snapshot-edit %s", vm->def->name) < 0) {
-        virReportOOMError();
-        goto cleanup;
-    }
-
-    ret = virXMLSaveFile(snapFile, snapshot->def->name, tmp, newxml);
-    VIR_FREE(tmp);
+    ret = virXMLSaveFile(snapFile, NULL, "snapshot-edit", newxml);
 
 cleanup:
     VIR_FREE(snapFile);
index f3dc2563358f00d12826db3260d745d7ec911daf..dad922715d9aa9e9da4af087d3cb163c8c0b38c0 100644 (file)
@@ -780,6 +780,16 @@ error:
     goto cleanup;
 }
 
+const char *virXMLPickShellSafeComment(const char *str1, const char *str2)
+{
+    if(str1 && !strpbrk(str1, "\r\t\n !\"#$&'()*;<>?[\\]^`{|}~") &&
+       !strstr(str1, "--"))
+        return str1;
+    if(str2 && !strpbrk(str2, "\r\t\n !\"#$&'()*;<>?[\\]^`{|}~") &&
+       !strstr(str2, "--"))
+        return str2;
+    return NULL;
+}
 
 static int virXMLEmitWarning(int fd,
                              const char *name,
@@ -794,7 +804,7 @@ OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:\n\
 or other application using the libvirt API.\n\
 -->\n\n";
 
-    if (fd < 0 || !name || !cmd) {
+    if (fd < 0 || !cmd) {
         errno = EINVAL;
         return -1;
     }
@@ -807,9 +817,7 @@ or other application using the libvirt API.\n\
     if (safewrite(fd, cmd, len) != len)
         return -1;
 
-    /* Omit the domain name if it contains a double hyphen
-     * because they aren't allowed in XML comments */
-    if (!strstr(name, "--")) {
+    if (name) {
         if (safewrite(fd, " ", 1) != 1)
             return -1;
 
@@ -837,7 +845,7 @@ virXMLRewriteFile(int fd, void *opaque)
 {
     struct virXMLRewriteFileData *data = opaque;
 
-    if (data->warnName && data->warnCommand) {
+    if (data->warnCommand) {
         if (virXMLEmitWarning(fd, data->warnName, data->warnCommand) < 0)
             return -1;
     }
index a3750fa253a0824516b3e99a3471e0646f6ad99e..c3b05dfdc76fa05305155c9905eff6c538cf9fcf 100644 (file)
@@ -61,6 +61,7 @@ xmlDocPtr      virXMLParseHelper(int domcode,
                                  const char *url,
                                  xmlXPathContextPtr *pctxt);
 
+const char *virXMLPickShellSafeComment(const char *str1, const char *str2);
 /**
  * virXMLParse:
  * @filename: file to parse, or NULL for string parsing