[libvirt] [PATCH 5/5] Make taint warnings also go into the domain logfile

Daniel P. Berrange berrange at redhat.com
Thu May 5 11:51:59 UTC 2011


As well as taint warnings going to the main libvirt log,
add taint warnings to the per-domain logfile

  Domain id=3 is tainted: high-privileges
  Domain id=3 is tainted: disk-probing
  Domain id=3 is tainted: shell-scripts
  Domain id=3 is tainted: custom-monitor

* src/qemu/qemu_domain.c, src/qemu/qemu_domain.h: Enhance
  qemuDomainTaint to also log to the domain logfile
* src/qemu/qemu_driver.c: Pass -1 for logFD to taint methods to
  auto-append to logfile
* src/qemu/qemu_process.c: Pass open logFD at startup for taint
  methods
---
 src/qemu/qemu_domain.c  |   44 ++++++++++++++++++++++++++++++++------------
 src/qemu/qemu_domain.h  |   12 ++++++++----
 src/qemu/qemu_driver.c  |    6 +++---
 src/qemu/qemu_process.c |    2 +-
 4 files changed, 44 insertions(+), 20 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 694c637..92940f5 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -746,10 +746,13 @@ cleanup:
     return ret;
 }
 
-void qemuDomainObjTaint(struct qemud_driver *driver ATTRIBUTE_UNUSED,
+void qemuDomainObjTaint(struct qemud_driver *driver,
                         virDomainObjPtr obj,
-                        enum virDomainTaintFlags taint)
+                        enum virDomainTaintFlags taint,
+                        int logFD)
 {
+    virErrorPtr orig_err = NULL;
+
     if (virDomainObjTaint(obj, taint)) {
         char uuidstr[VIR_UUID_STRING_BUFLEN];
         virUUIDFormat(obj->def->uuid, uuidstr);
@@ -759,53 +762,70 @@ void qemuDomainObjTaint(struct qemud_driver *driver ATTRIBUTE_UNUSED,
                  obj->def->name,
                  uuidstr,
                  virDomainTaintTypeToString(taint));
+
+        /* We don't care about errors logging taint info, so
+         * preserve original error, and clear any error that
+         * is raised */
+        orig_err = virSaveLastError();
+        if (qemuDomainAppendLog(driver, obj, logFD,
+                                "Domain id=%d is tainted: %s\n",
+                                obj->def->id,
+                                virDomainTaintTypeToString(taint)) < 0)
+            virResetLastError();
+        if (orig_err) {
+            virSetError(orig_err);
+            virFreeError(orig_err);
+        }
     }
 }
 
 
 void qemuDomainObjCheckTaint(struct qemud_driver *driver,
-                             virDomainObjPtr obj)
+                             virDomainObjPtr obj,
+                             int logFD)
 {
     int i;
 
     if (!driver->clearEmulatorCapabilities ||
         driver->user == 0 ||
         driver->group == 0)
-        qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_HIGH_PRIVILEGES);
+        qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_HIGH_PRIVILEGES, logFD);
 
     if (obj->def->namespaceData) {
         qemuDomainCmdlineDefPtr qemucmd = obj->def->namespaceData;
         if (qemucmd->num_args || qemucmd->num_env)
-            qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_CUSTOM_ARGV);
+            qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_CUSTOM_ARGV, logFD);
     }
 
     for (i = 0 ; i < obj->def->ndisks ; i++)
-        qemuDomainObjCheckDiskTaint(driver, obj, obj->def->disks[i]);
+        qemuDomainObjCheckDiskTaint(driver, obj, obj->def->disks[i], logFD);
 
     for (i = 0 ; i < obj->def->nnets ; i++)
-        qemuDomainObjCheckNetTaint(driver, obj, obj->def->nets[i]);
+        qemuDomainObjCheckNetTaint(driver, obj, obj->def->nets[i], logFD);
 }
 
 
 void qemuDomainObjCheckDiskTaint(struct qemud_driver *driver,
                                  virDomainObjPtr obj,
-                                 virDomainDiskDefPtr disk)
+                                 virDomainDiskDefPtr disk,
+                                 int logFD)
 {
     if (!disk->driverType &&
         driver->allowDiskFormatProbing)
-        qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_DISK_PROBING);
+        qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_DISK_PROBING, logFD);
 }
 
 
 void qemuDomainObjCheckNetTaint(struct qemud_driver *driver,
                                 virDomainObjPtr obj,
-                                virDomainNetDefPtr net)
+                                virDomainNetDefPtr net,
+                                int logFD)
 {
     if ((net->type == VIR_DOMAIN_NET_TYPE_ETHERNET &&
          net->data.ethernet.script != NULL) ||
         (net->type == VIR_DOMAIN_NET_TYPE_BRIDGE &&
          net->data.bridge.script != NULL))
-        qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_SHELL_SCRIPTS);
+        qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_SHELL_SCRIPTS, logFD);
 }
 
 
@@ -909,7 +929,7 @@ int qemuDomainAppendLog(struct qemud_driver *driver,
         virReportOOMError();
         goto cleanup;
     }
-    if (safewrite(logFD, message, strlen(message)) < 0) {
+    if (safewrite(fd, message, strlen(message)) < 0) {
         virReportSystemError(errno, _("Unable to write to domain logfile %s"),
                              obj->def->name);
         goto cleanup;
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 3e4d1ec..fb1743f 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -117,16 +117,20 @@ char *qemuDomainFormatXML(struct qemud_driver *driver,
 
 void qemuDomainObjTaint(struct qemud_driver *driver,
                         virDomainObjPtr obj,
-                        enum virDomainTaintFlags taint);
+                        enum virDomainTaintFlags taint,
+                        int logFD);
 
 void qemuDomainObjCheckTaint(struct qemud_driver *driver,
-                             virDomainObjPtr obj);
+                             virDomainObjPtr obj,
+                             int logFD);
 void qemuDomainObjCheckDiskTaint(struct qemud_driver *driver,
                                  virDomainObjPtr obj,
-                                 virDomainDiskDefPtr disk);
+                                 virDomainDiskDefPtr disk,
+                                 int logFD);
 void qemuDomainObjCheckNetTaint(struct qemud_driver *driver,
                                 virDomainObjPtr obj,
-                                virDomainNetDefPtr net);
+                                virDomainNetDefPtr net,
+                                int logFD);
 
 
 int qemuDomainCreateLog(struct qemud_driver *driver, virDomainObjPtr vm, bool append);
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 535a762..0fd0f10 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3877,7 +3877,7 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm,
 
     switch (dev->type) {
     case VIR_DOMAIN_DEVICE_DISK:
-        qemuDomainObjCheckDiskTaint(driver, vm, dev->data.disk);
+        qemuDomainObjCheckDiskTaint(driver, vm, dev->data.disk, -1);
         ret = qemuDomainAttachDeviceDiskLive(driver, vm, dev);
         if (!ret)
             dev->data.disk = NULL;
@@ -3890,7 +3890,7 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm,
         break;
 
     case VIR_DOMAIN_DEVICE_NET:
-        qemuDomainObjCheckNetTaint(driver, vm, dev->data.net);
+        qemuDomainObjCheckNetTaint(driver, vm, dev->data.net, -1);
         ret = qemuDomainAttachNetDevice(dom->conn, driver, vm,
                                         dev->data.net);
         if (!ret)
@@ -6984,7 +6984,7 @@ static int qemuDomainMonitorCommand(virDomainPtr domain, const char *cmd,
 
     priv = vm->privateData;
 
-    qemuDomainObjTaint(driver, vm, VIR_DOMAIN_TAINT_CUSTOM_MONITOR);
+    qemuDomainObjTaint(driver, vm, VIR_DOMAIN_TAINT_CUSTOM_MONITOR, -1);
 
     hmp = !!(flags & VIR_DOMAIN_QEMU_MONITOR_COMMAND_HMP);
 
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index eca85ae..bd7c932 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -2239,7 +2239,7 @@ int qemuProcessStart(virConnectPtr conn,
 
     virCommandWriteArgLog(cmd, logfile);
 
-    qemuDomainObjCheckTaint(driver, vm);
+    qemuDomainObjCheckTaint(driver, vm, logfile);
 
     if ((pos = lseek(logfile, 0, SEEK_END)) < 0)
         VIR_WARN("Unable to seek to end of logfile: %s",
-- 
1.7.4.4




More information about the libvir-list mailing list