Category: projects

Avahi Support for Apache

The first release of mod_dnssd is now available. It adds DNS-SD based Zeroconf support to Apache 2.0 using Avahi.

This work has been inspired by Sander Temme's and Sebastien Estienne's mod_zeroconf module, but supersedes it in every way. MacOSX ships with mod_rendezvous/mod_bonjour, but mod_dnssd is much more powerful than this piece of software as well. In short: mod_dnssd is definitely the greatest way to add Zeroconf support to Apache available today.

A few examples just to show how great mod_dnssd is:

DNSSDEnable On

This is everything you need to enable DNS-SD support in Apache after loading the module. It will publish all virtual hosts and all existing mod_userdir directories (i.e. ~/public_html) as services of type _http._tcp.

In case you want to publish some subdirectory of the web server as service, just place DNSSDServiceName inside a <Location> section for that path:

<Location /foobar>
	DNSSDServiceName "A special service called foobar"
</Location>

You can even use it to publish WebDAV shares using Apache's mod_dav module:

<Location /webdav>
	Dav On
	DNSSDServiceName "A WebDAV folder"
	DNSSDServiceTypes _webdav._tcp
</Location>

This especially cool since we now have a free software server counterpart for Gnome's and KDE's WebDAV client functionality.

Or to publish your blog as RSS service:

<Location /blog.cgi?rss>
	DNSSDServiceName "The blog"
	DNSSDServiceTypes _rss._tcp
</Location>

Get it while it is hot!


Avahi 0.6.3

A few days ago we relased Avahi 0.6.3. This is an important bugfix release, everyone should update as soon as possible.

Avahi now has its own domain avahi.org and finally has a logo, thanks to the great work of Mathieu Drouet:

Avahi Logo

Avahi has moved from Debian Experimental to Unstable. Ubuntu moved it from Universe to Main since it successfully passed their security auditing. The Fedora Core development distribution contains it too, as does SuSE's and Gentoo's. But where's Mandriva? Apparently they are considering it, for whatever it is worth. FreeBSD Ports has it too. I guess this means that Avahi has now been accepted by all major distributions. Hurrah!


Fractals with Python

It's impressing how easy it is to draw fractals with Python. Using the ubercool Python Imaging Library and native complex number support in Python you can code an elaborate and easy to understand fractal generator in less than 50 lines of code:

#!/usr/bin/python
import Image, ImageDraw, math, colorsys

dimensions = (800, 800)
scale = 1.0/(dimensions[0]/3)
center = (2.2, 1.5)       # Use this for Mandelbrot set
#center = (1.5, 1.5)       # Use this for Julia set
iterate_max = 100
colors_max = 50

img = Image.new("RGB", dimensions)
d = ImageDraw.Draw(img)

# Calculate a tolerable palette
palette = [0] * colors_max
for i in xrange(colors_max):
    f = 1-abs((float(i)/colors_max-1)**15)
    r, g, b = colorsys.hsv_to_rgb(.66+f/3, 1-f/2, f)
    palette[i] = (int(r*255), int(g*255), int(b*255))

# Calculate the mandelbrot sequence for the point c with start value z
def iterate_mandelbrot(c, z = 0):
    for n in xrange(iterate_max + 1):
        z = z*z +c
        if abs(z) > 2:
            return n
    return None

# Draw our image
for y in xrange(dimensions[1]):
    for x in xrange(dimensions[0]):
        c = complex(x * scale - center[0], y * scale - center[1])

        n = iterate_mandelbrot(c)            # Use this for Mandelbrot set
        #n = iterate_mandelbrot(complex(0.3, 0.6), c)  # Use this for Julia set

        if n is None:
            v = 1
        else:
            v = n/100.0

        d.point((x, y), fill = palette[int(v * (colors_max-1))])

del d
img.save("result.png")

Some example pictures:

Julia Set Mandelbrot Set.


Introducing nss-myhostname

I am doing a lot of embedded Linux work lately. The machines we use configure their hostname depending on some external configuration options. They boot from a CF card, which is mostly mounted read-only. Since the hostname changes often but we wanted to use sudo we had a problem: sudo requires the local host name to be resolvable using gethostbyname(). On Debian this is usually done by patching /etc/hosts correctly. Unfortunately that file resides on a read-only partition. Instead of hacking some ugly symlink based solution I decided to fix it the right way and wrote a tiny NSS module which does nothing more than mapping the hostname to the IP address 127.0.0.2 (and back). (That IP address is on the loopback device, but is not identical to localhost.)

Get nss-myhostname while it is hot!

BTW: This tool I wrote is pretty useful on embedded machines too, and certainly easier to use than setterm -dump 1 -file /dev/stdout | fold -w 80. And it does color too. And looping. And is much cooler anyway.


Mission accomplished

Avahi 0.6 is now officially released. Get it while it is hot!

Read the announcement.

In related news: I prepared a patch for distcc that adds Zeroconf support using Avahi.


Avahi 0.6 in Beta

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.

  • Support for (read-only) wide area support. (i.e. DNS-SD over unicast DNS)
  • Ported to FreeBSD, NetBSD, Darwin/MacOSX and to some extent OpenBSD
  • Compatibility layers for HOWL and Bonjour
  • Support for registering/browsing abritrary records
  • Proper support for DNS-SD service subtypes
  • Native C implementations of the client utilities
  • Now passes the Bonjour conformance test suite without any exceptions
  • "Passive observation of failures"
  • chroot() support
  • Many traffic reduction improvements
  • Bugfixes, cleanups

Avahi Gains Compatibility Layers for Apple Bonjour and HOWL

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.


Avahi Gains "Wide-Area" Support

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']

Linux on the MSI S270 aka Cytron/TCM/Medion/Tchibo MD96100

I finally found the time to write up my experiences running Linux on my new shiny laptop. Read it here.


KDE Ported to Avahi

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.

© Lennart Poettering. Built using Pelican. Theme by Giulio Fidente on github. .