Avahi 0.6 is now officially released. Get it while it is hot!
In related news: I prepared a patch for distcc that adds Zeroconf support using Avahi.
Category: projects
Avahi 0.6 is now officially released. Get it while it is hot!
In related news: I prepared a patch for distcc that adds Zeroconf support using Avahi.
Unless we find any major bugs Avahi 0.6 will be released on friday. We ask everyone to do some testing for us:
There have been a bunch of API changes. However, the API is now frozen, so feel free to start porting your application to the new API now.
A rough overview about the many improvements in Avahi 0.6.
A short while ago I checked in to SVN two API/ABI compatibility modules which implement the HOWL and the Apple Bonjour (dns_sd.h) DNS-SD/mDNS APIs on top of Avahi's native API. Effectively this means that you can run *all* Zeroconf-enabled software that is available for free operating systems seamlessly on top of Avahi. Or at least the software that uses the limited subset of API functions we support. Missing functions will be implemented on an on-demand basis. Gnome-VFS/Nautilus works perfectly, as does Gobby, which are the only real-world applications we tested until now.
The list of supported/unsupported functions is available from SVN for HOWL and for dns-sd.h.
The compatibility layers are actually pretty interesting pieces of code: for compatibility with the way HOWL/Bonjour integrates with event loops we had to hook up the timeout and I/O watches D-BUS depends on to a single file descriptor. This involves all kinds of ugly things like threading and "creative" ways to use the event loop abstraction Avahi provides. Some might call this "cracktastic", but it actually works pretty well.
The compatibility layers are not intended to be long term solutions. For every session object we create a background thread that polls for events and a DBUS session object. This is an utter waste of resources, especially on dns_sd.h where every basic operation uses a session object of its own. In addition, our compatibility layers are incomplete. We do not offer the full set of functions or the full semantics. Our compatibility is just good enough to make most Zeroconf-aware programs work with Avahi right now.
We consider neither dns_sd.h nor the HOWL API a "well designed" API and encourage people to port their programs to our more powerful native API. To stress this the two modules will warn the user about their usage and write a warning line to STDERR and syslog. Hopefully this will annoy people sufficiently that Avahi adoption speeds up a little.
To our own surprise we actually support at least one API function more than each of the reference implementations! From dns_sd.h we support DNSServiceEnumerateDomains() which is actually unsupported by Apple Bonjour on POSIX/Linux systems. The documented HOWL function sw_ipv4_address_decompose() is actually a NOOP in the reference implementation, but isn't in our compatibility layer.
Since dns_sd.h is the only file licensed under a BSD license in the otherwise APSL-licensed mDNSResponder distribution, we were able to copy it into our sources untouched.
Here's a screenshot of Nautilus and Gobby running on top of Avahi through the HOWL compatibility layers.
Yesterday in the late evening I commited "Wide Area" support to Avahi SVN, i.e. "DNS-SD over Unicast DNS". Only browsing, no "Long-Lived Query" support and no publishing for now, but it is a start.
To show off how cool this is, here is a "screenshot" of avahi-browse showing all services defined in the domain 0pointer.de:
$ avahi-browse -a -d 0pointer.de
Browsing domain '0pointer.de' on any.-1 ...
Browsing for services of type '_http-rss091._tcp' (Web Syndication RSS 0.91) in domain '0pointer.de' on any.-1 ...
Browsing for services of type '_http-rss20._tcp' (Web Syndication RSS 2.0) in domain '0pointer.de' on any.-1 ...
Browsing for services of type '_http._tcp' (Web Site) in domain '0pointer.de' on any.-1 ...
Found service 'Lennart's Blog' of type '_http-rss091._tcp' (Web Syndication RSS 0.91) in domain '0pointer.de' on any.-1.
Found service 'Lennart's Blog' of type '_http-rss20._tcp' (Web Syndication RSS 2.0) in domain '0pointer.de' on any.-1.
Found service 'Lennart's Homepage' of type '_http._tcp' (Web Site) in domain '0pointer.de' on any.-1.
Found service 'Avahi mDNS/DNS-SD' of type '_http._tcp' (Web Site) in domain '0pointer.de' on any.-1.
Found service 'Lennart's Photos' of type '_http._tcp' (Web Site) in domain '0pointer.de' on any.-1.
Found service 'Lennart's Blog' of type '_http._tcp' (Web Site) in domain '0pointer.de' on any.-1.
Service data for service 'Lennart's Blog' of type '_http-rss091._tcp' (Web Syndication RSS 0.91) in domain '0pointer.de' on any.-1:
Host 0pointer.de (217.160.223.3), port 80, TXT data: ['path=/blog/index.rss']
Service data for service 'Lennart's Blog' of type '_http-rss20._tcp' (Web Syndication RSS 2.0) in domain '0pointer.de' on any.-1:
Host 0pointer.de (217.160.223.3), port 80, TXT data: ['path=/blog/index.rss2']
Service data for service 'Lennart's Homepage' of type '_http._tcp' (Web Site) in domain '0pointer.de' on any.-1:
Host 0pointer.de (217.160.223.3), port 80, TXT data: ['path=/lennart/']
Service data for service 'Avahi mDNS/DNS-SD' of type '_http._tcp' (Web Site) in domain '0pointer.de' on any.-1:
Host freedesktop.org (131.252.208.82), port 80, TXT data: ['path=/Software/Avahi']
Service data for service 'Lennart's Photos' of type '_http._tcp' (Web Site) in domain '0pointer.de' on any.-1:
Host 0pointer.de (217.160.223.3), port 80, TXT data: ['path=/photos/']
Service data for service 'Lennart's Blog' of type '_http._tcp' (Web Site) in domain '0pointer.de' on any.-1:
Host 0pointer.de (217.160.223.3), port 80, TXT data: ['path=/blog']
I finally found the time to write up my experiences running Linux on my new shiny laptop. Read it here.
Jakub Stachowski completed support for using Avahi as backend for KDE's KDNSSD subsystem. This means that you can use any Zeroconf-enabled KDE application (including Konqueror) with Avahi as mDNS stack. You can find more information in the KDNSSD Wiki.
The list of software supporting Avahi grows longer and longer. There are some patches for vino and GnomeMeeting floating around, Rhythmbox already merged DAAP support based on Avahi, KDE is now fully compatible with Avahi. Shall your project be the next in this list? To get started with Avahi, read the developer's documentation.
Oh, yes, we released Avahi 0.3 and 0.4 recently. Get it while it's hot. No major changes, just bugfixes an Qt main loop support.
Yesterday we released Avahi 0.2. Get it while it is hot! Full announcement here.
In related news: Jakub Stachowski is working on a kdnssd-to-Avahi bridge. Soon KDE applications will be able to make use of Avahi without even knowing.
Sebastien's Zeroconf Gnome Applet now has an SVN repository: svn checkout svn://svn.0pointer.de/service-discovery-applet/trunk service-discovery-applet.
Sebastien successfully completed porting GnomeMeeting to Avahi. Therefore I declare him the first one to port a "real world" application to Avahi. Hurrah! Screenshot here.
Shortly after, Sebestien - not lazy - announced his new Zeroconf service browser applet based on Avahi. It contains a drop down menu with all Zeroconf services found on your LAN. If you select a menu item the applet will execute the application that has been defined as Gnome URL handler for the specific protocol.
Seems today's edition of LWN features a front page story about Avahi. It's actually quite nice, even though I missed an emphasis on the fact that Avahi's mDNS stack itself is embeddable into applications via a shared library.
I guess you'll have to wait a week if you want to read the article without subscription.
We finally released Avahi 0.1. Full release announcement here. Avahi comes with a powerful DBUS API. Just two show off the coolnes of that interface a Python example:
import avahi, dbus, gobject
bus = dbus.SystemBus()
server = dbus.Interface(bus.get_object(avahi.DBUS_NAME, avahi.DBUS_PATH_SERVER), avahi.DBUS_INTERFACE_SERVER)
def new_service(interface, protocol, name, type, domain):
print "Found service '%s' of type '%s' in domain '%s'" % (name, type, domain)
def remove_service(interface, protocol, name, type, domain):
print "Service '%s' of type '%s' in domain '%s' disappeared." % (name, type, domain)
path = server.ServiceBrowserNew(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, "_http._tcp", "")
b = dbus.Interface(bus.get_object(avahi.DBUS_NAME, path), avahi.DBUS_INTERFACE_SERVICE_BROWSER)
b.connect_to_signal('ItemNew', new_service)
b.connect_to_signal('ItemRemove', remove_service)
gobject.MainLoop().run()
This short program will connect to running avahi-daemon and browse for web services.