From 668150fc3d3e20b0c63331f50bb0ab880b6bfe6e Mon Sep 17 00:00:00 2001 From: Daniel Veillard Date: Fri, 26 Mar 2010 15:57:58 +0100 Subject: [PATCH] Add script hook support to the QEmu driver Right now this implements only 2 basic hooks: - before the qemu process is being launched - after the qemu process is terminated the XML description of the domain is passed to the hook script stdin /etc/libvirt/hook/qemu * src/qemu/qemu_driver.c: implement synchronous script hooks for QEmu at domain startup and end --- src/qemu/qemu_driver.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 3df0398801..b738be86e3 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -84,6 +84,7 @@ #include "cpu/cpu.h" #include "macvtap.h" #include "nwfilter/nwfilter_gentech_driver.h" +#include "hooks.h" #define VIR_FROM_THIS VIR_FROM_QEMU @@ -3100,6 +3101,22 @@ static int qemudStartVMDaemon(virConnectPtr conn, &tapfds, &ntapfds, migrateFrom) < 0) goto cleanup; + /* now that we know it is about to start call the hook if present */ + if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) { + char *xml = virDomainDefFormat(vm->def, 0); + int hookret; + + hookret = virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name, + VIR_HOOK_QEMU_OP_START, VIR_HOOK_SUBOP_BEGIN, NULL, xml); + VIR_FREE(xml); + + /* + * If the script raised an error abort the launch + */ + if (hookret < 0) + goto cleanup; + } + tmp = progenv; while (*tmp) { if (safewrite(logfile, *tmp, strlen(*tmp)) < 0) @@ -3324,6 +3341,16 @@ static void qemudShutdownVMDaemon(struct qemud_driver *driver, /* shut it off for sure */ virKillProcess(vm->pid, SIGKILL); + /* now that we know it's stopped call the hook if present */ + if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) { + char *xml = virDomainDefFormat(vm->def, 0); + + /* we can't stop the operation even if the script raised an error */ + virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name, + VIR_HOOK_QEMU_OP_STOPPED, VIR_HOOK_SUBOP_END, NULL, xml); + VIR_FREE(xml); + } + /* Reset Security Labels */ if (driver->securityDriver && driver->securityDriver->domainRestoreSecurityAllLabel) -- GitLab