5 import avahi, dbus, gobject
12 service_type_browsers = {}
15 def service_resolved(interface, protocol, name, type, domain, host, aprotocol, address, port, txt):
16 print "Service data for service '%s' of type '%s' in domain '%s' on %i.%i:" % (name, type, domain, interface, protocol)
17 print "\tHost %s (%s), port %i, TXT data: %s" % (host, address, port, str(txt))
20 print "Error:", str(err)
22 def new_service(interface, protocol, name, type, domain):
23 print "Found service '%s' of type '%s' in domain '%s' on %i.%i." % (name, type, domain, interface, protocol)
25 # Asynchronous resolving
26 server.ResolveService(interface, protocol, name, type, domain, avahi.PROTO_UNSPEC, reply_handler=service_resolved, error_handler=print_error)
28 def remove_service(interface, protocol, name, type, domain):
29 print "Service '%s' of type '%s' in domain '%s' on %i.%i disappeared." % (name, type, domain, interface, protocol)
31 def new_service_type(interface, protocol, type, domain):
33 # Are we already browsing this domain for this type?
34 if service_browsers.has_key((interface, protocol, type, domain)):
37 print "Browsing for services of type '%s' in domain '%s' on %i.%i ..." % (type, domain, interface, protocol)
39 b = dbus.Interface(bus.get_object("org.freedesktop.Avahi", server.ServiceBrowserNew(interface, protocol, type, domain)), 'org.freedesktop.Avahi.ServiceBrowser')
40 b.connect_to_signal('ItemNew', new_service)
41 b.connect_to_signal('ItemRemove', remove_service)
43 service_browsers[(interface, protocol, type, domain)] = b
45 def browse_domain(interface, protocol, domain):
47 # Are we already browsing this domain?
48 if service_type_browsers.has_key((interface, protocol, domain)):
51 print "Browsing domain '%s' on %i.%i ..." % (domain, interface, protocol)
53 b = dbus.Interface(bus.get_object("org.freedesktop.Avahi", server.ServiceTypeBrowserNew(interface, protocol, domain)), 'org.freedesktop.Avahi.ServiceTypeBrowser')
54 b.connect_to_signal('ItemNew', new_service_type)
56 service_type_browsers[(interface, protocol, domain)] = b
58 def new_domain(interface, protocol, domain):
60 # We browse for .local anyway...
62 browse_domain(interface, protocol, domain)
64 bus = dbus.SystemBus()
65 server = dbus.Interface(bus.get_object("org.freedesktop.Avahi", '/org/freedesktop/Avahi/Server'), 'org.freedesktop.Avahi.Server')
67 # Explicitly browse .local
68 browse_domain(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, "local")
70 # Browse for other browsable domains
71 db = dbus.Interface(bus.get_object("org.freedesktop.Avahi", server.DomainBrowserNew(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, "", avahi.DOMAIN_BROWSER_BROWSE)), 'org.freedesktop.Avahi.DomainBrowser')
72 db.connect_to_signal('ItemNew', new_domain)
75 gobject.MainLoop().run()
76 except KeyboardInterrupt, k: