On Tue, Sep 18, 2007 at 04:13:46AM -0400, Daniel Veillard wrote:
On Tue, Sep 18, 2007 at 03:50:18AM +0100, Daniel P. Berrange wrote:
> This is a serious patch at supporting Avahi advertisement of the libvirtd
> service.
>
> - configure by default will probe to see if avahi is available and if
> found will enable appropriate code.
>
> --with-avahi will force error if not found
> --without-avahi will disable it with no checking
>
> - HAVE_AVAHI is defined in config.h if avahi is found & used to conditionally
> enable some code in qemud/qemud.c
>
> - HAVE_AVAHI is also a Makefile conditional to enable compilation of the
> mdns.c and mdns.h files. A little makefile rearrangement was needed to
> make sure variables like EXTRA_DIST were defined before we appended to
> them with +=
>
> - The code in mdns.c contains all the support for dealing with the Avahi
> APIs.
>
> - The primary Avahi API is horribily complicated for day-to-day
> use in application code, exposing far too much of the event loop and
> state machine. So we expose a simplified API to libvirt in mdns.h
Heh, did you tell the Avahi devels ?
No, but perhaps I should. I don;t know if glib has a higher level API for accessing
the Avahi stuff. I know there's a out-of-box glib event loop impl for it.
> - The Avahi client library is basically a shim which talks to
the Avahi
> daemon using DBus system daemon. The DBus stuff doesn't leak out of
> the Avahi APIs - it is loosely couple - all we need do is provide Avahi
> with an event loop implementation which was surprisingly easy. The
> libvirtd daemon does now indirectly link with DBus, but I don't see any
> problem with this. Don't want it - then use --without-avahi
That's fine, as long as the extensions don't decrease portability I
don't see this as a problem.
Ok I tweaked the configure.in checks I did for avahi slightly. Now, if you don't
have 'pkg-config' available, it'll simply disable the avahi feature instead
of
failing the entire script. It'll auto-detect by default, and can be overriden
with the --with/--without-avahi flags.
> - We advertise a service name of _libvirt._tcp The IETF draft
recommends
> use of the name from /etc/services associated with your app. There is a
> way to register official Avahi services names. We don't have an /etc/service
> name registered either though.
I rememember we looked at the IANA stuff for registering a port number
http://www.redhat.com/archives/libvir-list/2007-June/msg00204.html
I suggested using
"10 " What SHORT name (14 CHARACTER MAXIMUM) do you want associated with this
port number?"
libvirt"
But we never did that registration step.
Ok, well our mDNS name matches. So guess we should look at actually doing a
application to register both the mDNS & service name.
> - This patch does not advertise any per-VM VNC server
instances, but I have
> prepared the APIs in mdns.h to be ready to support that with minimal effort.
> A pre-requisite for this is an extension to the driver API to get async
> signals when VMs start & stop, since making the daemon poll hypervisors
> will suck big time.
>
> When implemented each VM will be its own mdns 'group' and the VNC server
> associated with it will be the 'service' advertised in that group.
>
> Having applied this patch & started the daemon, if /etc/init.d/avahi-daemon
> is running, you should see the service advertised on the LAN. As mentioned
> earlier if you start Avahi daemon after libvirt it should detect this too.
Sounds excellent !
I've now tested it on Fedora 7, 8 and RHEL-5 & its working very nicely.
> These are all mildy abusing mdns / zeroconf, but then x509
certificates don't
> really fit into the model of 'zero conf' in the first place. If people want
> true zero-conf then the (SSH) tunnel is better (and always available), but
> if they've setup certificates they should still be allowed to use zero-conf
> to at least locate hosts. So mildly abusing the rules is reasonable IMHO.
Maybe suggesting that application developpers default to SSH when using
a server autodetected with Avahi is the most practical ATM assuming we don't
find a way to advertise the FQDN. Unless we can find the domain from the
locally installed certificate, after all if people want to use the certificate
they should have some installed locally and then we can probably guess the
right domain name, no ?
Yeah, I reckon recommending SSH is a good general rule for this. I'll keep
thinking about a better way to handle x509 validation by the client - we can
easily add more TXT records to the mDNS stuff increemntally if needed.
> +dnl Avahi library
> +AC_ARG_WITH(avahi,
> + [ --with-avahi use avahi to advertise remote daemon],
> + [],
> + [with_avahi=check])
> +
> +if test "$with_avahi" = "check"; then
> + PKG_CHECK_EXISTS(avahi-client >= $AVAHI_REQUIRED, [with_avahi=yes],
[with_avahi=no])
> +fi
> +
> +if test "$with_avahi" = "yes"; then
> + PKG_CHECK_MODULES(AVAHI, avahi-client >= $AVAHI_REQUIRED)
> + AC_DEFINE_UNQUOTED(HAVE_AVAHI, 1, [whether Avahi is used to broadcast server
presense])
> +else
> + AVAHI_CFLAGS=
> + AVAHI_LIBS=
> +fi
> +AM_CONDITIONAL(HAVE_AVAHI, [test "$with_avahi" = "yes"])
> +AC_SUBST(AVAHI_CFLAGS)
> +AC_SUBST(AVAHI_LIBS)
I assume that if an OS has Avahi, then it has pkg-check, in that case it
really should not be a problem.
As mentioned above, I also tweaked it to disable Avahi if pkg-config is missing
completely.
> +
> +if HAVE_AVAHI
> +libvirtd_SOURCES += mdns.c mdns.h
> +libvirtd_CFLAGS += $(AVAHI_CFLAGS)
> +libvirtd_LDADD += $(AVAHI_LIBS)
> +else
> +EXTRA_DIST += mdns.c mdns.h
> +endif
Wouldn't adding them to EXTRA_DIST in any case be good enough ?
if SOURCES and EXTRA_DIST carry the same is that really a problem when
building the archive ?
Yep, I made this change - adding them to EXTRA_DIST unconditionally.
Patch is surprizingly small, looks good, I would commit to CVS, no
pending
issue looks like a potential real problem for users, and more testing would
be good.
Ok, its committed!
Also added the BuildRequires to the spec file & docs on the two new config
file options.
Dan
--
|=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=|
|=- Perl modules:
http://search.cpan.org/~danberr/ -=|
|=- Projects:
http://freshmeat.net/~danielpb/ -=|
|=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|