mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
hooks: Add support for capturing hook output
Hooks may now be used as filters.
This commit is contained in:
parent
c0f722240d
commit
8ab785783f
@ -1148,7 +1148,7 @@ static void daemonReloadHandler(virNetServerPtr srv ATTRIBUTE_UNUSED,
|
|||||||
{
|
{
|
||||||
VIR_INFO("Reloading configuration on SIGHUP");
|
VIR_INFO("Reloading configuration on SIGHUP");
|
||||||
virHookCall(VIR_HOOK_DRIVER_DAEMON, "-",
|
virHookCall(VIR_HOOK_DRIVER_DAEMON, "-",
|
||||||
VIR_HOOK_DAEMON_OP_RELOAD, SIGHUP, "SIGHUP", NULL);
|
VIR_HOOK_DAEMON_OP_RELOAD, SIGHUP, "SIGHUP", NULL, NULL);
|
||||||
if (virStateReload() < 0)
|
if (virStateReload() < 0)
|
||||||
VIR_WARN("Error while reloading drivers");
|
VIR_WARN("Error while reloading drivers");
|
||||||
}
|
}
|
||||||
@ -1571,7 +1571,7 @@ int main(int argc, char **argv) {
|
|||||||
* an error ?
|
* an error ?
|
||||||
*/
|
*/
|
||||||
virHookCall(VIR_HOOK_DRIVER_DAEMON, "-", VIR_HOOK_DAEMON_OP_START,
|
virHookCall(VIR_HOOK_DRIVER_DAEMON, "-", VIR_HOOK_DAEMON_OP_START,
|
||||||
0, "start", NULL);
|
0, "start", NULL, NULL);
|
||||||
|
|
||||||
if (daemonSetupNetworking(srv, config,
|
if (daemonSetupNetworking(srv, config,
|
||||||
sock_file, sock_file_ro,
|
sock_file, sock_file_ro,
|
||||||
@ -1604,7 +1604,7 @@ int main(int argc, char **argv) {
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
virHookCall(VIR_HOOK_DRIVER_DAEMON, "-", VIR_HOOK_DAEMON_OP_SHUTDOWN,
|
virHookCall(VIR_HOOK_DRIVER_DAEMON, "-", VIR_HOOK_DAEMON_OP_SHUTDOWN,
|
||||||
0, "shutdown", NULL);
|
0, "shutdown", NULL, NULL);
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
virNetServerProgramFree(remoteProgram);
|
virNetServerProgramFree(remoteProgram);
|
||||||
|
@ -1115,7 +1115,8 @@ static void lxcVmCleanup(lxc_driver_t *driver,
|
|||||||
|
|
||||||
/* we can't stop the operation even if the script raised an error */
|
/* we can't stop the operation even if the script raised an error */
|
||||||
virHookCall(VIR_HOOK_DRIVER_LXC, vm->def->name,
|
virHookCall(VIR_HOOK_DRIVER_LXC, vm->def->name,
|
||||||
VIR_HOOK_LXC_OP_STOPPED, VIR_HOOK_SUBOP_END, NULL, xml);
|
VIR_HOOK_LXC_OP_STOPPED, VIR_HOOK_SUBOP_END,
|
||||||
|
NULL, xml, NULL);
|
||||||
VIR_FREE(xml);
|
VIR_FREE(xml);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1632,7 +1633,8 @@ lxcBuildControllerCmd(lxc_driver_t *driver,
|
|||||||
int hookret;
|
int hookret;
|
||||||
|
|
||||||
hookret = virHookCall(VIR_HOOK_DRIVER_LXC, vm->def->name,
|
hookret = virHookCall(VIR_HOOK_DRIVER_LXC, vm->def->name,
|
||||||
VIR_HOOK_LXC_OP_START, VIR_HOOK_SUBOP_BEGIN, NULL, xml);
|
VIR_HOOK_LXC_OP_START, VIR_HOOK_SUBOP_BEGIN,
|
||||||
|
NULL, xml, NULL);
|
||||||
VIR_FREE(xml);
|
VIR_FREE(xml);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -3120,7 +3120,8 @@ int qemuProcessStart(virConnectPtr conn,
|
|||||||
int hookret;
|
int hookret;
|
||||||
|
|
||||||
hookret = virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name,
|
hookret = virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name,
|
||||||
VIR_HOOK_QEMU_OP_PREPARE, VIR_HOOK_SUBOP_BEGIN, NULL, xml);
|
VIR_HOOK_QEMU_OP_PREPARE, VIR_HOOK_SUBOP_BEGIN,
|
||||||
|
NULL, xml, NULL);
|
||||||
VIR_FREE(xml);
|
VIR_FREE(xml);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -3305,7 +3306,8 @@ int qemuProcessStart(virConnectPtr conn,
|
|||||||
int hookret;
|
int hookret;
|
||||||
|
|
||||||
hookret = virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name,
|
hookret = virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name,
|
||||||
VIR_HOOK_QEMU_OP_START, VIR_HOOK_SUBOP_BEGIN, NULL, xml);
|
VIR_HOOK_QEMU_OP_START, VIR_HOOK_SUBOP_BEGIN,
|
||||||
|
NULL, xml, NULL);
|
||||||
VIR_FREE(xml);
|
VIR_FREE(xml);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -3726,7 +3728,8 @@ void qemuProcessStop(struct qemud_driver *driver,
|
|||||||
|
|
||||||
/* we can't stop the operation even if the script raised an error */
|
/* we can't stop the operation even if the script raised an error */
|
||||||
virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name,
|
virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name,
|
||||||
VIR_HOOK_QEMU_OP_STOPPED, VIR_HOOK_SUBOP_END, NULL, xml);
|
VIR_HOOK_QEMU_OP_STOPPED, VIR_HOOK_SUBOP_END,
|
||||||
|
NULL, xml, NULL);
|
||||||
VIR_FREE(xml);
|
VIR_FREE(xml);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3819,7 +3822,8 @@ retry:
|
|||||||
|
|
||||||
/* we can't stop the operation even if the script raised an error */
|
/* we can't stop the operation even if the script raised an error */
|
||||||
virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name,
|
virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name,
|
||||||
VIR_HOOK_QEMU_OP_RELEASE, VIR_HOOK_SUBOP_END, NULL, xml);
|
VIR_HOOK_QEMU_OP_RELEASE, VIR_HOOK_SUBOP_END,
|
||||||
|
NULL, xml, NULL);
|
||||||
VIR_FREE(xml);
|
VIR_FREE(xml);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,7 +173,7 @@ virHookPresent(int driver) {
|
|||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* virHookCall:
|
* virHookCall:
|
||||||
* @driver: the driver number (from virHookDriver enum)
|
* @driver: the driver number (from virHookDriver enum)
|
||||||
* @id: an id for the object '-' if non available for example on daemon hooks
|
* @id: an id for the object '-' if non available for example on daemon hooks
|
||||||
@ -181,17 +181,26 @@ virHookPresent(int driver) {
|
|||||||
* @sub_op: a sub_operation, currently unused
|
* @sub_op: a sub_operation, currently unused
|
||||||
* @extra: optional string information
|
* @extra: optional string information
|
||||||
* @input: extra input given to the script on stdin
|
* @input: extra input given to the script on stdin
|
||||||
|
* @output: optional address of variable to store malloced result buffer
|
||||||
*
|
*
|
||||||
* Implement a hook call, where the external script for the driver is
|
* Implement a hook call, where the external script for the driver is
|
||||||
* called with the given information. This is a synchronous call, we wait for
|
* called with the given information. This is a synchronous call, we wait for
|
||||||
* execution completion
|
* execution completion. If @output is non-NULL, *output is guaranteed to be
|
||||||
|
* allocated after successful virHookCall, and is best-effort allocated after
|
||||||
|
* failed virHookCall; the caller is responsible for freeing *output.
|
||||||
*
|
*
|
||||||
* Returns: 0 if the execution succeeded, 1 if the script was not found or
|
* Returns: 0 if the execution succeeded, 1 if the script was not found or
|
||||||
* invalid parameters, and -1 if script returned an error
|
* invalid parameters, and -1 if script returned an error
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
virHookCall(int driver, const char *id, int op, int sub_op, const char *extra,
|
virHookCall(int driver,
|
||||||
const char *input) {
|
const char *id,
|
||||||
|
int op,
|
||||||
|
int sub_op,
|
||||||
|
const char *extra,
|
||||||
|
const char *input,
|
||||||
|
char **output)
|
||||||
|
{
|
||||||
int ret;
|
int ret;
|
||||||
int exitstatus;
|
int exitstatus;
|
||||||
char *path;
|
char *path;
|
||||||
@ -200,6 +209,9 @@ virHookCall(int driver, const char *id, int op, int sub_op, const char *extra,
|
|||||||
const char *opstr;
|
const char *opstr;
|
||||||
const char *subopstr;
|
const char *subopstr;
|
||||||
|
|
||||||
|
if (output)
|
||||||
|
*output = NULL;
|
||||||
|
|
||||||
if ((driver < VIR_HOOK_DRIVER_DAEMON) ||
|
if ((driver < VIR_HOOK_DRIVER_DAEMON) ||
|
||||||
(driver >= VIR_HOOK_DRIVER_LAST))
|
(driver >= VIR_HOOK_DRIVER_LAST))
|
||||||
return(1);
|
return(1);
|
||||||
@ -257,6 +269,8 @@ virHookCall(int driver, const char *id, int op, int sub_op, const char *extra,
|
|||||||
|
|
||||||
if (input)
|
if (input)
|
||||||
virCommandSetInputBuffer(cmd, input);
|
virCommandSetInputBuffer(cmd, input);
|
||||||
|
if (output)
|
||||||
|
virCommandSetOutputBuffer(cmd, output);
|
||||||
|
|
||||||
ret = virCommandRun(cmd, &exitstatus);
|
ret = virCommandRun(cmd, &exitstatus);
|
||||||
if (ret == 0 && exitstatus != 0) {
|
if (ret == 0 && exitstatus != 0) {
|
||||||
|
@ -72,6 +72,6 @@ int virHookInitialize(void);
|
|||||||
int virHookPresent(int driver);
|
int virHookPresent(int driver);
|
||||||
|
|
||||||
int virHookCall(int driver, const char *id, int op, int sub_op,
|
int virHookCall(int driver, const char *id, int op, int sub_op,
|
||||||
const char *extra, const char *input);
|
const char *extra, const char *input, char **output);
|
||||||
|
|
||||||
#endif /* __VIR_HOOKS_H__ */
|
#endif /* __VIR_HOOKS_H__ */
|
||||||
|
Loading…
Reference in New Issue
Block a user