/** @page qh Query Handler

A brief intro to the Nagios query handler system

[TOC]

@section purpose Purpose
The purpose of the query handler is to provide Nagios Core and its
eventbroker modules with the ability to communicate directly with
the outside world through a well-defined API, as well as allowing
external apps a way to help out with various Nagios tasks.

@section caveats Caveats
The query handlers run in the main thread. Nagios doesn't provide any
parallelism here and main Nagios will be blocked while a query is
running. As such, it's a very good idea to make ones queryhandlers
complete in as little time as possible.

@section qh_registering Registering a query handler
This is really for module authors only.

To register a query handler, you *must* have a function like the one
below:
the following arguments:
@code
int lala_query_handler(int sd, char *query, unsigned int query_len)
@endcode

The parameters don't have to have those exact names, and the function
certainly doesn't have to be called "lala_query_handler()". We're not
quite that childish (well, we are, but we like to pretend we're not).
They will suffice for this explanation, however.
@li sd - The socket you should respond to.
@li query - The query, minus the address and the magic byte.
@li query_len - Length of the query, in bytes.

The call to register it with Nagios so you get all queries directed
to the 'lala' address is then:
@code
qh_register_handler("lala", "The LaLa query handler", 0,
lala_query_handler);
@endcode

The second argument is a description, which will be printed when
someone sends a help request.
@note It's a good idea to handle queries such as "help" and take
them to mean "print me some text telling me at least the basics
of how to use this query handler".

@section syntax Syntax
The query language is remarkably simple (although each handler may
implement its own parsers that handle and do pretty much whatever
they want). The first byte is magic. If it's an at-sign, we expect
the queryer to persist and issue more queries after the first one.
If it's a hash-sign, the query handler will disconnect the client
as soon as it regains control from whatever handler registered for
the particular address. Each particular handler has some control
over this behaviour though, and can use specific return codes to
denote that it will take over the socket from the query handler.
If no at-sign and no hash-sign is present at the first byte, the
-1'th byte will be considered an at-sign, and the connection will
consequently be considered persistent.

@subsection qh_examples Example queries
Subscribe for real-time push-events for servicechecks from the NERD radio:
@verbatim
@nerd subscribe servicechecks\0
@endverbatim

One-shot query the core query handler for current load-control options:
@verbatim
#core loadctl\0
@endverbatim

Get Nagios to say hi to you:
@verbatim
#echo Greetings, Exalted One
@endverbatim

Ask the help handler to list registered handlers:
@verbatim
#help list
@endverbatim


@section icqh In-core query handlers
There are a few in-core query handlers.

@subsection help The help service
The help query handler is quite possibly the most important one. It
can be used to list registered handlers (with short descriptions),
and can be used to get help about registered handlers (assuming
they've implemented it, that is). It should be noted that the ones
that *have* implemented it can also be queried directly for their
help output, like so:
@verbatim
@core help
@endverbatim


@subsection echo The echo service
As I'm sure you've already guessed, the echo service just prints the
inbound data right back at you. While that's not exactly nobel prize
winning material, it's actually pretty nifty to figure out how fast
Nagios can parse its inbound data, which in turn shows how fast it can
handle its inbound checkresults, which puts an upper cap on how many
checks Nagios can handle at any given time (although short bursts that
exceed that limit are ok and will be handled just fine).

It can be addressed as such:
@verbatim
@echo foo bar baz said the bunny\0
@endverbatim

@subsection nerd Nagios Event Radio Dispatcher
The nerd radio is subscribed in fuller detail at @see nerd, but its
worth knowing that it's a core part of Nagios 4 and that it will
always be available.

@subsection wproc Worker process manager
The worker process manager lets you register workers that can help out
with running checks, send notifications, run eventhandlers or whatever.

In order to register a worker that only handles checks supposed to be
run by the plugins check_foo and check_bar (irrespective of where in
the paths they are), you'd do something like this:
@verbatim
@wproc register name=foobar;plugin=check_foo;plugin=check_bar\0
@endverbatim
*/
