5 import avahi, dbus, gobject, sys
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):
25 print "Found service '%s' of type '%s' in domain '%s' on %i.%i." % (name, type, domain, interface, protocol)
27 # Asynchronous resolving
28 server.ResolveService(interface, protocol, name, type, domain, avahi.PROTO_UNSPEC, reply_handler=service_resolved, error_handler=print_error)
30 def remove_service(interface, protocol, name, type, domain):
31 print "Service '%s' of type '%s' in domain '%s' on %i.%i disappeared." % (name, type, domain, interface, protocol)
33 def new_service_type(interface, protocol, type, domain):
34 global server, service_browsers
36 # Are we already browsing this domain for this type?
37 if service_browsers.has_key((interface, protocol, type, domain)):
40 print "Browsing for services of type '%s' in domain '%s' on %i.%i ..." % (type, domain, interface, protocol)
42 b = dbus.Interface(bus.get_object("org.freedesktop.Avahi", server.ServiceBrowserNew(interface, protocol, type, domain)), 'org.freedesktop.Avahi.ServiceBrowser')
43 b.connect_to_signal('ItemNew', new_service)
44 b.connect_to_signal('ItemRemove', remove_service)
46 service_browsers[(interface, protocol, type, domain)] = b
48 def browse_domain(interface, protocol, domain):
49 global server, service_type_browsers
51 # Are we already browsing this domain?
52 if service_type_browsers.has_key((interface, protocol, domain)):
55 print "Browsing domain '%s' on %i.%i ..." % (domain, interface, protocol)
57 b = dbus.Interface(bus.get_object("org.freedesktop.Avahi", server.ServiceTypeBrowserNew(interface, protocol, domain)), 'org.freedesktop.Avahi.ServiceTypeBrowser')
58 b.connect_to_signal('ItemNew', new_service_type)
60 service_type_browsers[(interface, protocol, domain)] = b
62 def new_domain(interface, protocol, domain):
64 # We browse for .local anyway...
66 browse_domain(interface, protocol, domain)
74 bus = dbus.SystemBus()
75 server = dbus.Interface(bus.get_object("org.freedesktop.Avahi", '/org/freedesktop/Avahi/Server'), 'org.freedesktop.Avahi.Server')
78 # Explicitly browse .local
79 browse_domain(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, "local")
81 # Browse for other browsable domains
82 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')
83 db.connect_to_signal('ItemNew', new_domain)
86 # Just browse the domain the user wants us to browse
87 browse_domain(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, domain)
90 gobject.MainLoop().run()
91 except KeyboardInterrupt, k: