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

qemu: include libvirt & QEMU versions in QEMU log files

It is often helpful to know which version of libvirt and QEMU
was present when a guest was first launched. Ensure this info
is written into the QEMU log file for each guest.
上级 490be8c7
...@@ -299,6 +299,7 @@ struct _virQEMUCaps { ...@@ -299,6 +299,7 @@ struct _virQEMUCaps {
unsigned int version; unsigned int version;
unsigned int kvmVersion; unsigned int kvmVersion;
char *package;
virArch arch; virArch arch;
...@@ -1941,6 +1942,10 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps) ...@@ -1941,6 +1942,10 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps)
ret->usedQMP = qemuCaps->usedQMP; ret->usedQMP = qemuCaps->usedQMP;
ret->version = qemuCaps->version; ret->version = qemuCaps->version;
ret->kvmVersion = qemuCaps->kvmVersion; ret->kvmVersion = qemuCaps->kvmVersion;
if (VIR_STRDUP(ret->package, qemuCaps->package) < 0)
goto error;
ret->arch = qemuCaps->arch; ret->arch = qemuCaps->arch;
if (VIR_ALLOC_N(ret->cpuDefinitions, qemuCaps->ncpuDefinitions) < 0) if (VIR_ALLOC_N(ret->cpuDefinitions, qemuCaps->ncpuDefinitions) < 0)
...@@ -1992,6 +1997,7 @@ void virQEMUCapsDispose(void *obj) ...@@ -1992,6 +1997,7 @@ void virQEMUCapsDispose(void *obj)
virBitmapFree(qemuCaps->flags); virBitmapFree(qemuCaps->flags);
VIR_FREE(qemuCaps->package);
VIR_FREE(qemuCaps->binary); VIR_FREE(qemuCaps->binary);
} }
...@@ -2116,6 +2122,12 @@ unsigned int virQEMUCapsGetKVMVersion(virQEMUCapsPtr qemuCaps) ...@@ -2116,6 +2122,12 @@ unsigned int virQEMUCapsGetKVMVersion(virQEMUCapsPtr qemuCaps)
} }
const char *virQEMUCapsGetPackage(virQEMUCapsPtr qemuCaps)
{
return qemuCaps->package;
}
int virQEMUCapsAddCPUDefinition(virQEMUCapsPtr qemuCaps, int virQEMUCapsAddCPUDefinition(virQEMUCapsPtr qemuCaps,
const char *name) const char *name)
{ {
...@@ -2672,6 +2684,9 @@ virQEMUCapsLoadCache(virQEMUCapsPtr qemuCaps, const char *filename, ...@@ -2672,6 +2684,9 @@ virQEMUCapsLoadCache(virQEMUCapsPtr qemuCaps, const char *filename,
goto cleanup; goto cleanup;
} }
/* Don't check for NULL, since it is optional and thus may be missing */
qemuCaps->package = virXPathString("string(./package)", ctxt);
if (!(str = virXPathString("string(./arch)", ctxt))) { if (!(str = virXPathString("string(./arch)", ctxt))) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("missing arch in QEMU capabilities cache")); _("missing arch in QEMU capabilities cache"));
...@@ -2783,6 +2798,10 @@ virQEMUCapsSaveCache(virQEMUCapsPtr qemuCaps, const char *filename) ...@@ -2783,6 +2798,10 @@ virQEMUCapsSaveCache(virQEMUCapsPtr qemuCaps, const char *filename)
virBufferAsprintf(&buf, "<kvmVersion>%d</kvmVersion>\n", virBufferAsprintf(&buf, "<kvmVersion>%d</kvmVersion>\n",
qemuCaps->kvmVersion); qemuCaps->kvmVersion);
if (qemuCaps->package)
virBufferAsprintf(&buf, "<package>%s</package>\n",
qemuCaps->package);
virBufferAsprintf(&buf, "<arch>%s</arch>\n", virBufferAsprintf(&buf, "<arch>%s</arch>\n",
virArchToString(qemuCaps->arch)); virArchToString(qemuCaps->arch));
...@@ -2872,6 +2891,7 @@ virQEMUCapsReset(virQEMUCapsPtr qemuCaps) ...@@ -2872,6 +2891,7 @@ virQEMUCapsReset(virQEMUCapsPtr qemuCaps)
virBitmapClearAll(qemuCaps->flags); virBitmapClearAll(qemuCaps->flags);
qemuCaps->version = qemuCaps->kvmVersion = 0; qemuCaps->version = qemuCaps->kvmVersion = 0;
VIR_FREE(qemuCaps->package);
qemuCaps->arch = VIR_ARCH_NONE; qemuCaps->arch = VIR_ARCH_NONE;
qemuCaps->usedQMP = false; qemuCaps->usedQMP = false;
...@@ -3204,6 +3224,7 @@ virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps, ...@@ -3204,6 +3224,7 @@ virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps,
} }
qemuCaps->version = major * 1000000 + minor * 1000 + micro; qemuCaps->version = major * 1000000 + minor * 1000 + micro;
qemuCaps->package = package;
qemuCaps->usedQMP = true; qemuCaps->usedQMP = true;
virQEMUCapsInitQMPBasic(qemuCaps); virQEMUCapsInitQMPBasic(qemuCaps);
...@@ -3249,7 +3270,6 @@ virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps, ...@@ -3249,7 +3270,6 @@ virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps,
ret = 0; ret = 0;
cleanup: cleanup:
VIR_FREE(package);
return ret; return ret;
} }
......
...@@ -266,6 +266,7 @@ char *virQEMUCapsFlagsString(virQEMUCapsPtr qemuCaps); ...@@ -266,6 +266,7 @@ char *virQEMUCapsFlagsString(virQEMUCapsPtr qemuCaps);
const char *virQEMUCapsGetBinary(virQEMUCapsPtr qemuCaps); const char *virQEMUCapsGetBinary(virQEMUCapsPtr qemuCaps);
virArch virQEMUCapsGetArch(virQEMUCapsPtr qemuCaps); virArch virQEMUCapsGetArch(virQEMUCapsPtr qemuCaps);
unsigned int virQEMUCapsGetVersion(virQEMUCapsPtr qemuCaps); unsigned int virQEMUCapsGetVersion(virQEMUCapsPtr qemuCaps);
const char *virQEMUCapsGetPackage(virQEMUCapsPtr qemuCaps);
unsigned int virQEMUCapsGetKVMVersion(virQEMUCapsPtr qemuCaps); unsigned int virQEMUCapsGetKVMVersion(virQEMUCapsPtr qemuCaps);
int virQEMUCapsAddCPUDefinition(virQEMUCapsPtr qemuCaps, int virQEMUCapsAddCPUDefinition(virQEMUCapsPtr qemuCaps,
const char *name); const char *name);
......
...@@ -76,7 +76,6 @@ ...@@ -76,7 +76,6 @@
VIR_LOG_INIT("qemu.qemu_process"); VIR_LOG_INIT("qemu.qemu_process");
#define START_POSTFIX ": starting up\n"
#define ATTACH_POSTFIX ": attaching\n" #define ATTACH_POSTFIX ": attaching\n"
#define SHUTDOWN_POSTFIX ": shutting down\n" #define SHUTDOWN_POSTFIX ": shutting down\n"
...@@ -4249,6 +4248,45 @@ qemuPrepareNVRAM(virQEMUDriverConfigPtr cfg, ...@@ -4249,6 +4248,45 @@ qemuPrepareNVRAM(virQEMUDriverConfigPtr cfg,
} }
static void
qemuLogOperation(virDomainObjPtr vm,
const char *msg,
int logfd,
virCommandPtr cmd)
{
char *timestamp;
char *logline;
qemuDomainObjPrivatePtr priv = vm->privateData;
int qemuVersion = virQEMUCapsGetVersion(priv->qemuCaps);
const char *package = virQEMUCapsGetPackage(priv->qemuCaps);
char ebuf[1024];
if ((timestamp = virTimeStringNow()) == NULL)
goto error;
if (virAsprintf(&logline, "%s: %s %s, qemu version: %d.%d.%d%s\n",
timestamp, msg, VIR_LOG_VERSION_STRING,
(qemuVersion / 1000000) % 1000, (qemuVersion / 1000) % 1000, qemuVersion % 1000,
package ? package : "") < 0)
goto error;
if (safewrite(logfd, logline, strlen(logline)) < 0)
goto error;
if (cmd)
virCommandWriteArgLog(cmd, logfd);
cleanup:
VIR_FREE(timestamp);
VIR_FREE(logline);
return;
error:
VIR_WARN("Unable to write banner to logfile: %s",
virStrerror(errno, ebuf, sizeof(ebuf)));
goto cleanup;
}
int qemuProcessStart(virConnectPtr conn, int qemuProcessStart(virConnectPtr conn,
virQEMUDriverPtr driver, virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
...@@ -4264,7 +4302,6 @@ int qemuProcessStart(virConnectPtr conn, ...@@ -4264,7 +4302,6 @@ int qemuProcessStart(virConnectPtr conn,
off_t pos = -1; off_t pos = -1;
char ebuf[1024]; char ebuf[1024];
int logfile = -1; int logfile = -1;
char *timestamp;
qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainObjPrivatePtr priv = vm->privateData;
virCommandPtr cmd = NULL; virCommandPtr cmd = NULL;
struct qemuProcessHookData hookData; struct qemuProcessHookData hookData;
...@@ -4620,19 +4657,7 @@ int qemuProcessStart(virConnectPtr conn, ...@@ -4620,19 +4657,7 @@ int qemuProcessStart(virConnectPtr conn,
goto cleanup; goto cleanup;
} }
if ((timestamp = virTimeStringNow()) == NULL) { qemuLogOperation(vm, "starting up", logfile, cmd);
goto cleanup;
} else {
if (safewrite(logfile, timestamp, strlen(timestamp)) < 0 ||
safewrite(logfile, START_POSTFIX, strlen(START_POSTFIX)) < 0) {
VIR_WARN("Unable to write timestamp to logfile: %s",
virStrerror(errno, ebuf, sizeof(ebuf)));
}
VIR_FREE(timestamp);
}
virCommandWriteArgLog(cmd, logfile);
qemuDomainObjCheckTaint(driver, vm, logfile); qemuDomainObjCheckTaint(driver, vm, logfile);
......
...@@ -448,21 +448,8 @@ static int ...@@ -448,21 +448,8 @@ static int
virLogVersionString(const char **rawmsg, virLogVersionString(const char **rawmsg,
char **msg) char **msg)
{ {
#ifdef PACKAGER_VERSION *rawmsg = VIR_LOG_VERSION_STRING;
# ifdef PACKAGER return virLogFormatString(msg, 0, NULL, VIR_LOG_INFO, VIR_LOG_VERSION_STRING);
# define LOG_VERSION_STRING \
"libvirt version: " VERSION ", package: " PACKAGER_VERSION " (" PACKAGER ")"
# else
# define LOG_VERSION_STRING \
"libvirt version: " VERSION ", package: " PACKAGER_VERSION
# endif
#else
# define LOG_VERSION_STRING \
"libvirt version: " VERSION
#endif
*rawmsg = LOG_VERSION_STRING;
return virLogFormatString(msg, 0, NULL, VIR_LOG_INFO, LOG_VERSION_STRING);
} }
......
...@@ -25,6 +25,19 @@ ...@@ -25,6 +25,19 @@
# include "internal.h" # include "internal.h"
# include "virbuffer.h" # include "virbuffer.h"
# ifdef PACKAGER_VERSION
# ifdef PACKAGER
# define VIR_LOG_VERSION_STRING \
"libvirt version: " VERSION ", package: " PACKAGER_VERSION " (" PACKAGER ")"
# else
# define VIR_LOG_VERSION_STRING \
"libvirt version: " VERSION ", package: " PACKAGER_VERSION
# endif
# else
# define VIR_LOG_VERSION_STRING \
"libvirt version: " VERSION
# endif
/* /*
* To be made public * To be made public
*/ */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册