Python Avahi Object

A simple class to publish a network service via zeroconf with avahi. Requires python-avahi and python-dbus. All calls to the avahi and dbus libraries are wrapped by the class.

Example usage :

from ZeroconfService import ZeroconfService
import time
 
service = ZeroconfService(name="Joe's awesome FTP server",
                          port=3000,  stype="_ftp._tcp")
service.publish()
time.sleep(10)
service.unpublish()

[download ZeroconfService.py]

import avahi
import dbus
 
__all__ = ["ZeroconfService"]
 
class ZeroconfService:
    """A simple class to publish a network service with zeroconf using
    avahi.
 
    """
 
    def __init__(self, name, port, stype="_http._tcp",
                 domain="", host="", text=""):
        self.name = name
        self.stype = stype
        self.domain = domain
        self.host = host
        self.port = port
        self.text = text
 
    def publish(self):
        bus = dbus.SystemBus()
        server = dbus.Interface(
                         bus.get_object(
                                 avahi.DBUS_NAME,
                                 avahi.DBUS_PATH_SERVER),
                        avahi.DBUS_INTERFACE_SERVER)
 
        g = dbus.Interface(
                    bus.get_object(avahi.DBUS_NAME,
                                   server.EntryGroupNew()),
                    avahi.DBUS_INTERFACE_ENTRY_GROUP)
 
        g.AddService(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC,dbus.UInt32(0),
                     self.name, self.stype, self.domain, self.host,
                     dbus.UInt16(self.port), self.text)
 
        g.Commit()
        self.group = g
 
    def unpublish(self):
        self.group.Reset()
 
 
def test():
    service = ZeroconfService(name="TestService", port=3000)
    service.publish()
    raw_input("Press any key to unpublish the service ")
    service.unpublish()
 
 
if __name__ == "__main__":
    test()

Leave a Reply

*