summaryrefslogtreecommitdiffstats
path: root/avahi-utils/avahi-browse.in
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2005-08-06 01:22:35 +0000
committerLennart Poettering <lennart@poettering.net>2005-08-06 01:22:35 +0000
commitd8c0d081ea456eeb570b760dc3d747c148691ea8 (patch)
treedfcd3722139fd8b439dc8bd20da51ab9ea6be000 /avahi-utils/avahi-browse.in
parent21ed65fbea62ab8ae807c3981323cd219d84c769 (diff)
* rename avahi-dump-all to avahi-browse
git-svn-id: file:///home/lennart/svn/public/avahi/trunk@244 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe
Diffstat (limited to 'avahi-utils/avahi-browse.in')
-rwxr-xr-xavahi-utils/avahi-browse.in156
1 files changed, 156 insertions, 0 deletions
diff --git a/avahi-utils/avahi-browse.in b/avahi-utils/avahi-browse.in
new file mode 100755
index 0000000..69a8bfd
--- /dev/null
+++ b/avahi-utils/avahi-browse.in
@@ -0,0 +1,156 @@
+#!@PYTHON@
+# -*-python-*-
+# $Id$
+
+# This file is part of avahi.
+#
+# avahi is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2 of the
+# License, or (at your option) any later version.
+#
+# avahi is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+# License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with avahi; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+# USA.
+
+import sys, getopt
+
+try:
+ import avahi, gobject, dbus
+except ImportError:
+ print "Sorry, to use this tool you need to install Avahi, pygtk and python-dbus."
+ sys.exit(1)
+
+try:
+ import dbus.glib
+except ImportError, e:
+ pass
+
+def usage(retval = 0):
+ print "%s [options] <type>\n" % sys.argv[0]
+ print " -h --help Show this help"
+ print " -d --domain The domain to browse"
+ print " -a --all Show all services, regardless of the type"
+ sys.exit(retval)
+
+try:
+ opts, args = getopt.getopt(sys.argv[1:], "hd:a", ["help", "domain=", "all"])
+except getopt.GetoptError:
+ usage(2)
+
+domain = None
+stype = None
+show_all = False
+
+for o, a in opts:
+ if o in ("-h", "--help"):
+ usage()
+
+ if o in ("-d", "--domain"):
+ domain = a
+
+ if o in ("-a", "--all"):
+ show_all = True
+
+if len(args) > 1:
+ usage(2)
+
+if len(args) >= 1:
+ stype = args[0];
+
+if stype is None and not show_all:
+ usage(2)
+
+service_type_browsers = {}
+service_browsers = {}
+
+def siocgifname(interface):
+ global server
+
+ if interface <= 0:
+ return "any"
+ else:
+ return server.GetNetworkInterfaceNameByIndex(interface)
+
+def service_resolved(interface, protocol, name, type, domain, host, aprotocol, address, port, txt):
+ print "Service data for service '%s' of type '%s' in domain '%s' on %s.%i:" % (name, type, domain, siocgifname(interface), protocol)
+ print "\tHost %s (%s), port %i, TXT data: %s" % (host, address, port, str(txt))
+
+def print_error(err):
+ print "Error:", str(err)
+
+def new_service(interface, protocol, name, type, domain):
+ global server
+
+ print "Found service '%s' of type '%s' in domain '%s' on %s.%i." % (name, type, domain, siocgifname(interface), protocol)
+
+ # Asynchronous resolving
+ server.ResolveService(interface, protocol, name, type, domain, avahi.PROTO_UNSPEC, reply_handler=service_resolved, error_handler=print_error)
+
+def remove_service(interface, protocol, name, type, domain):
+ print "Service '%s' of type '%s' in domain '%s' on %s.%i disappeared." % (name, type, domain, siocgifname(interface), protocol)
+
+def new_service_type(interface, protocol, type, domain):
+ global server, service_browsers
+
+ # Are we already browsing this domain for this type?
+ if service_browsers.has_key((interface, protocol, type, domain)):
+ return
+
+ print "Browsing for services of type '%s' in domain '%s' on %s.%i ..." % (type, domain, siocgifname(interface), protocol)
+
+ b = dbus.Interface(bus.get_object(avahi.DBUS_NAME, server.ServiceBrowserNew(interface, protocol, type, domain)), avahi.DBUS_INTERFACE_SERVICE_BROWSER)
+ b.connect_to_signal('ItemNew', new_service)
+ b.connect_to_signal('ItemRemove', remove_service)
+
+ service_browsers[(interface, protocol, type, domain)] = b
+
+def browse_domain(interface, protocol, domain):
+ global server, service_type_browsers, stype
+
+ # Are we already browsing this domain?
+ if service_type_browsers.has_key((interface, protocol, domain)):
+ return
+
+ if stype is None:
+ print "Browsing domain '%s' on %s.%i ..." % (domain, siocgifname(interface), protocol)
+
+ b = dbus.Interface(bus.get_object(avahi.DBUS_NAME, server.ServiceTypeBrowserNew(interface, protocol, domain)), avahi.DBUS_INTERFACE_SERVICE_TYPE_BROWSER)
+ b.connect_to_signal('ItemNew', new_service_type)
+
+ service_type_browsers[(interface, protocol, domain)] = b
+ else:
+ new_service_type(interface, protocol, stype, domain)
+
+def new_domain(interface, protocol, domain):
+
+ # We browse for .local anyway...
+ if domain != "local":
+ browse_domain(interface, protocol, domain)
+
+
+bus = dbus.SystemBus()
+server = dbus.Interface(bus.get_object(avahi.DBUS_NAME, avahi.DBUS_PATH_SERVER), avahi.DBUS_INTERFACE_SERVER)
+
+if domain is None:
+ # Explicitly browse .local
+ browse_domain(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, "local")
+
+ # Browse for other browsable domains
+ db = dbus.Interface(bus.get_object(avahi.DBUS_NAME, server.DomainBrowserNew(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, "", avahi.DOMAIN_BROWSER_BROWSE)), avahi.DBUS_INTERFACE_DOMAIN_BROWSER)
+ db.connect_to_signal('ItemNew', new_domain)
+
+else:
+ # Just browse the domain the user wants us to browse
+ browse_domain(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, domain)
+
+try:
+ gobject.MainLoop().run()
+except KeyboardInterrupt, k:
+ pass