
On 08/05/2010 10:41 AM, Justin Clift wrote:
+ + <h2><a name="location">Script Location</a></h2> + <p>The libvirt hook scripts are located in the directory + <code>$SYSCONF_DIR/etc/libvirt/hooks/</code>.
$SYSCONF_DIR == /etc in a distro, and == /usr/local/etc if you use the default ./configure settings. Therefore, you should say that hooks live in: $SYSCONF_DIR/libvirt/hooks/
+ <p>With Fedora and RHEL, this is <code>/etc/libvirt/hooks/</code>.
At which point this sentence then makes sense.
+ + <h2><a name="structure">Script structure</a></h2> + <p>The hook scripts are executed using standard Linux process creation + functions. Therefore, they must begin with the declaration of the + command interpreter to use.</p>
and have the chmod o+rx permissions.
+ + <h2><a name="execution">Script execution</a></h2> + <ul> + <li>The "start" operation for the guest hook scripts, qemu and lxc, + executes <b>prior</b> to the guest being created. This allows the + guest start operation to be aborted if the script returns indicating + failure.<br/><br/></li> + <li>The "shutdown" operation for the guest hook scripts, qemu and lxc, + executes <b>after</b> the guest has stopped. If the hook script + indicates failure in its return, the shut down of the guest cannot + be aborted because it has already been performed.<br/><br/></li> + <li>Hook scripts execute in a synchronous fashion. Libvirt waits + for them to return before continuing the given operation.<br/><br/> + This is most noticeable with the guest start operation, as a lengthy + operation in the hook script can mean an extended wait for the guest + to be available to end users.<br/><br/></li> + <li>For a hook script to be utilised, it have it's execute bit set + (ie. chmod +x <i>qemu</i>), and must be present when the libvirt + daemon is started.<br/><br/></li>
Ah, you did catch that, but in later text. Grammar: s/it have it's/it must have its/
+ <h2><a name="return_codes">Return codes and logging</a></h2> + <p>If a hook script returns with an exit code of 0, the libvirt daemon + regards this as successful and performs no logging of it.</p> + <p>However, if a hook script returns with a non zero exit code, the libvirt + daemon regards this as a failure, logs it with return code 256, and + additionally logs anything on stderr the hook script returns.</p>
Huh? Process exit status is < 256. Oh, I see - we're mistakenly printing the raw process status code (a 16-bit number, where the upper 8 bits represent exit status if the lower 8 bits are all 0 and the process exited normally, while the lower 8 bits represent what signal killed a process if the process did not exit normally). We should fix the code to use the WEXITSTATUS() macro and display the right exit status.
+ <p>For example, a hook script might use this code to indicate failure, + and send a text string to stderr:</p> + <pre>echo "Could not find required XYZZY" >&2 +exit 1</pre> + <p>The resulting entry in the libvirt log will appear as:</p> + <pre>20:02:40.297: error : virHookCall:416 : Hook script execution failed: Hook script /etc/libvirt/hooks/qemu qemu failed with error code 256:Could not find required XYZZY</pre>
And once the code is fixed, this message would show an exit status of 1, not 256. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org