From 1a912326734243e57a461c48131c1a0402318b5a Mon Sep 17 00:00:00 2001 From: Sebastien Estienne Date: Tue, 2 Aug 2005 23:14:13 +0000 Subject: * add avahi-utils in autoconf git-svn-id: file:///home/lennart/svn/public/avahi/trunk@211 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe --- avahi-utils/avahi-discover.in | 165 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100755 avahi-utils/avahi-discover.in (limited to 'avahi-utils/avahi-discover.in') diff --git a/avahi-utils/avahi-discover.in b/avahi-utils/avahi-discover.in new file mode 100755 index 0000000..9734ae6 --- /dev/null +++ b/avahi-utils/avahi-discover.in @@ -0,0 +1,165 @@ +#!/usr/bin/env @PYTHON@ +# -*-python-*- +# $Id$ + +import os +import gtk +import gobject + +import avahi, dbus, gobject, sys +from avahi.SimpleGladeApp import SimpleGladeApp + +try: + import dbus.glib +except ImportError, e: + pass + +service_type_browsers = {} +service_browsers = {} + + +glade_dir = "@prefix@/share/@PACKAGE@/interfaces" + +class Main_window(SimpleGladeApp): + def __init__(self, path="avahi-discover.glade", root="main_window", domain=None, **kwargs): + path = os.path.join(glade_dir, path) + SimpleGladeApp.__init__(self, path, root, domain, **kwargs) + + def on_tree_view_cursor_changed(self, widget, *args): + (model, iter) = widget.get_selection().get_selected() + (name,interface,protocol,type,domain) = self.treemodel.get(iter,0,1,2,3,4) + if type == None: + self.info_label.set_markup("No service currently selected.") + return + #Asynchronous resolving + self.server.ResolveService( int(interface), int(protocol), name, type, domain, avahi.PROTO_UNSPEC, reply_handler=self.service_resolved, error_handler=self.print_error) + + + def service_resolved(self, interface, protocol, name, type, domain, host, aprotocol, address, port, txt): + print "Service data for service '%s' of type '%s' in domain '%s' on %i.%i:" % (name, type, domain, interface, protocol) + print "\tHost %s (%s), port %i, TXT data: %s" % (host, address, port, str(txt)) + self.update_label(interface, protocol, name, type, domain, host, aprotocol, address, port, str(txt)) + + def print_error(err): + print "Error:", str(err) + + def new_service(self, interface, protocol, name, type, domain): + print "Found service '%s' of type '%s' in domain '%s' on %i.%i." % (name, type, domain, interface, protocol) + if self.service_type.has_key(type) == False: + self.service_type[type] = self.insert_row(self.treemodel,None,type, interface,None,None,None) + treeiter = self.insert_row(self.treemodel,self.service_type[type],name, interface,protocol,type,domain) + self.services_browsed[(interface, protocol, name, type, domain)] = treeiter + + + def remove_service(self, interface, protocol, name, type, domain): + print "Service '%s' of type '%s' in domain '%s' on %i.%i disappeared." % (name, type, domain, interface, protocol) + treeiter=self.services_browsed[(interface, protocol, name, type, domain)] + parent = self.treemodel.iter_parent(treeiter) + self.treemodel.remove(treeiter) + del self.services_browsed[(interface, protocol, name, type, domain)] + if self.treemodel.iter_has_child(parent) == False: + self.treemodel.remove(parent) + del self.service_type[type] + + def new_service_type(self, interface, protocol, type, domain): + global 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 %i.%i ..." % (type, domain, interface, protocol) + + b = dbus.Interface(self.bus.get_object(avahi.DBUS_NAME, self.server.ServiceBrowserNew(interface, protocol, type, domain)), avahi.DBUS_INTERFACE_SERVICE_BROWSER) + b.connect_to_signal('ItemNew', self.new_service) + b.connect_to_signal('ItemRemove', self.remove_service) + + service_browsers[(interface, protocol, type, domain)] = b + + def browse_domain(self, interface, protocol, domain): + global service_type_browsers + + # Are we already browsing this domain? + if service_type_browsers.has_key((interface, protocol, domain)): + return + + print "Browsing domain '%s' on %i.%i ..." % (domain, interface, protocol) + + b = dbus.Interface(self.bus.get_object(avahi.DBUS_NAME, self.server.ServiceTypeBrowserNew(interface, protocol, domain)), avahi.DBUS_INTERFACE_SERVICE_TYPE_BROWSER) + b.connect_to_signal('ItemNew', self.new_service_type) + + service_type_browsers[(interface, protocol, domain)] = b + + def new_domain(self,interface, protocol, domain): + + # We browse for .local anyway... + if domain != "local": + browse_domain(interface, protocol, domain) + + def update_label(self,interface, protocol, name, type, domain, host, aprotocol, address, port, txt): + if protocol == avahi.PROTO_INET: + protocol = "IPv4" + if protocol == avahi.PROTO_INET6: + protocol = "IPv6" + infos = "Service Type: %s\nService Name: %s\nDomain Name: %s\nInterface:#%i %s\nAddress: %s/%s:%i\nTXT Data: %s" % (type, name, domain, interface, protocol, host, address, port, str(txt)) + self.info_label.set_markup(infos) + + def insert_row(self, model,parent, + name, interface,protocol,type,domain): + myiter=model.insert_after(parent,None) + model.set(myiter,0,name,1,interface,2,protocol,3,type,4,domain) + return myiter + + def new(self): + print "A new main_window has been created" + self.treemodel=gtk.TreeStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING) + self.tree_view.set_model(self.treemodel) + + #creating the columns headers + self.tree_view.set_headers_visible(True) + renderer=gtk.CellRendererText() + column=gtk.TreeViewColumn("Name",renderer, text=0) + column.set_resizable(True) + column.set_sizing("GTK_TREE_VIEW_COLUMN_GROW_ONLY"); + column.set_expand(True); + self.tree_view.append_column(column) + renderer=gtk.CellRendererText() + column=gtk.TreeViewColumn("Interface",renderer, + text=1) + column.set_resizable(True) + self.tree_view.append_column(column) + + # testing with fake data + self.service_type = {} + self.services_browsed = {} + + model=self.treemodel + + domain = None + + self.bus = dbus.SystemBus() + self.server = dbus.Interface(self.bus.get_object(avahi.DBUS_NAME, avahi.DBUS_PATH_SERVER), avahi.DBUS_INTERFACE_SERVER) + + if domain is None: + # Explicitly browse .local + self.browse_domain(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, "local") + + # Browse for other browsable domains + db = dbus.Interface(self.bus.get_object(avahi.DBUS_NAME, self.server.DomainBrowserNew(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, "", avahi.DOMAIN_BROWSER_BROWSE)), avahi.DBUS_INTERFACE_DOMAIN_BROWSER) + db.connect_to_signal('ItemNew', self.new_domain) + + else: + # Just browse the domain the user wants us to browse + self.browse_domain(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, domain) + + + +def main(): + main_window = Main_window() + + main_window.run() + +if __name__ == "__main__": + main() + + -- cgit