提交 f79cddad 编写于 作者: D Daniel P. Berrange

Make taint warnings also go into the domain logfile

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
上级 1f1db0b5
...@@ -746,10 +746,13 @@ cleanup: ...@@ -746,10 +746,13 @@ cleanup:
return ret; return ret;
} }
void qemuDomainObjTaint(struct qemud_driver *driver ATTRIBUTE_UNUSED, void qemuDomainObjTaint(struct qemud_driver *driver,
virDomainObjPtr obj, virDomainObjPtr obj,
enum virDomainTaintFlags taint) enum virDomainTaintFlags taint,
int logFD)
{ {
virErrorPtr orig_err = NULL;
if (virDomainObjTaint(obj, taint)) { if (virDomainObjTaint(obj, taint)) {
char uuidstr[VIR_UUID_STRING_BUFLEN]; char uuidstr[VIR_UUID_STRING_BUFLEN];
virUUIDFormat(obj->def->uuid, uuidstr); virUUIDFormat(obj->def->uuid, uuidstr);
...@@ -759,53 +762,70 @@ void qemuDomainObjTaint(struct qemud_driver *driver ATTRIBUTE_UNUSED, ...@@ -759,53 +762,70 @@ void qemuDomainObjTaint(struct qemud_driver *driver ATTRIBUTE_UNUSED,
obj->def->name, obj->def->name,
uuidstr, uuidstr,
virDomainTaintTypeToString(taint)); 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, void qemuDomainObjCheckTaint(struct qemud_driver *driver,
virDomainObjPtr obj) virDomainObjPtr obj,
int logFD)
{ {
int i; int i;
if (!driver->clearEmulatorCapabilities || if (!driver->clearEmulatorCapabilities ||
driver->user == 0 || driver->user == 0 ||
driver->group == 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) { if (obj->def->namespaceData) {
qemuDomainCmdlineDefPtr qemucmd = obj->def->namespaceData; qemuDomainCmdlineDefPtr qemucmd = obj->def->namespaceData;
if (qemucmd->num_args || qemucmd->num_env) 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++) 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++) 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, void qemuDomainObjCheckDiskTaint(struct qemud_driver *driver,
virDomainObjPtr obj, virDomainObjPtr obj,
virDomainDiskDefPtr disk) virDomainDiskDefPtr disk,
int logFD)
{ {
if (!disk->driverType && if (!disk->driverType &&
driver->allowDiskFormatProbing) 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, void qemuDomainObjCheckNetTaint(struct qemud_driver *driver,
virDomainObjPtr obj, virDomainObjPtr obj,
virDomainNetDefPtr net) virDomainNetDefPtr net,
int logFD)
{ {
if ((net->type == VIR_DOMAIN_NET_TYPE_ETHERNET && if ((net->type == VIR_DOMAIN_NET_TYPE_ETHERNET &&
net->data.ethernet.script != NULL) || net->data.ethernet.script != NULL) ||
(net->type == VIR_DOMAIN_NET_TYPE_BRIDGE && (net->type == VIR_DOMAIN_NET_TYPE_BRIDGE &&
net->data.bridge.script != NULL)) net->data.bridge.script != NULL))
qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_SHELL_SCRIPTS); qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_SHELL_SCRIPTS, logFD);
} }
......
...@@ -117,16 +117,20 @@ char *qemuDomainFormatXML(struct qemud_driver *driver, ...@@ -117,16 +117,20 @@ char *qemuDomainFormatXML(struct qemud_driver *driver,
void qemuDomainObjTaint(struct qemud_driver *driver, void qemuDomainObjTaint(struct qemud_driver *driver,
virDomainObjPtr obj, virDomainObjPtr obj,
enum virDomainTaintFlags taint); enum virDomainTaintFlags taint,
int logFD);
void qemuDomainObjCheckTaint(struct qemud_driver *driver, void qemuDomainObjCheckTaint(struct qemud_driver *driver,
virDomainObjPtr obj); virDomainObjPtr obj,
int logFD);
void qemuDomainObjCheckDiskTaint(struct qemud_driver *driver, void qemuDomainObjCheckDiskTaint(struct qemud_driver *driver,
virDomainObjPtr obj, virDomainObjPtr obj,
virDomainDiskDefPtr disk); virDomainDiskDefPtr disk,
int logFD);
void qemuDomainObjCheckNetTaint(struct qemud_driver *driver, void qemuDomainObjCheckNetTaint(struct qemud_driver *driver,
virDomainObjPtr obj, virDomainObjPtr obj,
virDomainNetDefPtr net); virDomainNetDefPtr net,
int logFD);
int qemuDomainCreateLog(struct qemud_driver *driver, virDomainObjPtr vm, bool append); int qemuDomainCreateLog(struct qemud_driver *driver, virDomainObjPtr vm, bool append);
......
...@@ -3877,7 +3877,7 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm, ...@@ -3877,7 +3877,7 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm,
switch (dev->type) { switch (dev->type) {
case VIR_DOMAIN_DEVICE_DISK: case VIR_DOMAIN_DEVICE_DISK:
qemuDomainObjCheckDiskTaint(driver, vm, dev->data.disk); qemuDomainObjCheckDiskTaint(driver, vm, dev->data.disk, -1);
ret = qemuDomainAttachDeviceDiskLive(driver, vm, dev); ret = qemuDomainAttachDeviceDiskLive(driver, vm, dev);
if (!ret) if (!ret)
dev->data.disk = NULL; dev->data.disk = NULL;
...@@ -3890,7 +3890,7 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm, ...@@ -3890,7 +3890,7 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm,
break; break;
case VIR_DOMAIN_DEVICE_NET: case VIR_DOMAIN_DEVICE_NET:
qemuDomainObjCheckNetTaint(driver, vm, dev->data.net); qemuDomainObjCheckNetTaint(driver, vm, dev->data.net, -1);
ret = qemuDomainAttachNetDevice(dom->conn, driver, vm, ret = qemuDomainAttachNetDevice(dom->conn, driver, vm,
dev->data.net); dev->data.net);
if (!ret) if (!ret)
...@@ -6984,7 +6984,7 @@ static int qemuDomainMonitorCommand(virDomainPtr domain, const char *cmd, ...@@ -6984,7 +6984,7 @@ static int qemuDomainMonitorCommand(virDomainPtr domain, const char *cmd,
priv = vm->privateData; 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); hmp = !!(flags & VIR_DOMAIN_QEMU_MONITOR_COMMAND_HMP);
......
...@@ -2239,7 +2239,7 @@ int qemuProcessStart(virConnectPtr conn, ...@@ -2239,7 +2239,7 @@ int qemuProcessStart(virConnectPtr conn,
virCommandWriteArgLog(cmd, logfile); virCommandWriteArgLog(cmd, logfile);
qemuDomainObjCheckTaint(driver, vm); qemuDomainObjCheckTaint(driver, vm, logfile);
if ((pos = lseek(logfile, 0, SEEK_END)) < 0) if ((pos = lseek(logfile, 0, SEEK_END)) < 0)
VIR_WARN("Unable to seek to end of logfile: %s", VIR_WARN("Unable to seek to end of logfile: %s",
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册