rendered paste bodyimport dbus, avahi, dbus.glibclass ServerDetector: # The known about servers __servers = None __serversByName = None def __init__(self): """Constructor""" self.__servers = [] self.__serversByName = {} # Connect to the Avahi server bus = dbus.SystemBus() self.server = dbus.Interface(bus.get_object(avahi.DBUS_NAME, avahi.DBUS_PATH_SERVER), avahi.DBUS_INTERFACE_SERVER) # FIXME: Can raise a dbus_bindings.DBusException (local name collision) browser = self.server.ServiceBrowserNew(avahi.IF_UNSPEC, avahi.PROTO_INET, '_workstation._udp', '', 0) listener = dbus.Interface(bus.get_object(avahi.DBUS_NAME, browser), avahi.DBUS_INTERFACE_SERVICE_BROWSER) listener.connect_to_signal('ItemNew', self.__serviceDetected) listener.connect_to_signal('ItemRemove', self.__serviceRemoved) # Methods to extend def onServerDetected(self, server): """Called when a server is detected. 'server' is the server that has been detected (RemoteServer). """ pass def onServerRemoved(self, server): """Called when a server is removed. 'server' is the server that has been removed (RemoteServer). """ pass # Public methods def getServers(self): """Returns a list of servers that are known of""" return self.__servers[:] # Private methods def __serviceDetected(self, interface, protocol, name, stype, domain, flags): """D-Dbus callback""" print "DETECTED SERVICE" # Get information on this service self.server.ResolveService(interface, protocol, name, stype, domain, avahi.PROTO_UNSPEC, dbus.UInt32(0), reply_handler = self.__serverResolved, error_handler = self.__resolveError) def __serverResolved(self, interface, protocol, name, stype, domain, host, aprotocol, address, port, txt, flags): """D-Dbus callback""" #print avahi.txt_array_to_string_array(txt) print 'Server detected: ' + str(address) + ':' + str(port) + ' (' + name + ')' assert(not self.__serversByName.has_key(name)) server = RemoteServer(name, (address, port)) self.__serversByName[name] = server self.__servers.append(server) self.onServerDetected(server) def __resolveError(self, error): """D-Dbus callback""" print 'Avahi/D-Bus error: ' + repr(error) def __serviceRemoved(self, interface, protocol, name, stype, domain, flags): """D-Dbus callback""" print 'Server removed: ' + str(name) server = self.__serversByName.pop(name) self.__servers.remove(server) self.onServerRemoved(server)if __name__ == '__main__': x = ServerDetector() print x.getServers()