From c69a69f7b314aaa4b1fb265232ae420d076ad245 Mon Sep 17 00:00:00 2001 From: Sebastien Estienne Date: Sun, 2 Oct 2005 00:13:49 +0000 Subject: * remove support for shell scripts (too dangerous) * add support for python modules for servicetype's actions (not finnished) git-svn-id: file:///home/lennart/svn/public/service-discovery-applet/trunk@23 3be567f1-68ff-0310-b24a-ad7cc433fd2f --- Makefile.am | 1 + README | 2 - actions/Makefile.am | 2 + actions/services/Makefile.am | 5 ++ actions/services/__init__.py | 112 ++++++++++++++++++++++++++++++++++++++++ configure.ac | 10 +++- src/Makefile.am | 2 + src/service-discovery-applet.in | 28 ++++++---- 8 files changed, 149 insertions(+), 13 deletions(-) create mode 100644 actions/Makefile.am create mode 100644 actions/services/Makefile.am create mode 100755 actions/services/__init__.py diff --git a/Makefile.am b/Makefile.am index 6d61bcb..1cafdee 100644 --- a/Makefile.am +++ b/Makefile.am @@ -4,6 +4,7 @@ SUBDIRS = \ icons \ schemas \ scripts \ + actions \ servers EXTRA_DIST = README INSTALL AUTHORS COPYING diff --git a/README b/README index 304ec7d..a9a8181 100644 --- a/README +++ b/README @@ -4,8 +4,6 @@ You should test that the applet is functionning with the following command: $ /usr/bin/service-discovery-applet -window before trying to put it in your panel -To add actions when you click on a specified service, add a file in $(prefix)/share/service-discovery-applet/scripts, you must name it type.sh (eg: _ssh._tcp.sh), look at the included scripts to know how to access ADDRESS, PORT and TXT records. - To add icons for services in the applet, just drop a png named TYPE.png (eg: _ssh._tcp.png) in $(prefix)/share/service-discovery-applet/icons All of this will be configurable from the GUI in the upcoming releases. diff --git a/actions/Makefile.am b/actions/Makefile.am new file mode 100644 index 0000000..a829c18 --- /dev/null +++ b/actions/Makefile.am @@ -0,0 +1,2 @@ +SUBDIRS = \ + services \ No newline at end of file diff --git a/actions/services/Makefile.am b/actions/services/Makefile.am new file mode 100644 index 0000000..2a28c48 --- /dev/null +++ b/actions/services/Makefile.am @@ -0,0 +1,5 @@ +servicesdir = $(ACTIONSDIR)/services +services_SCRIPTS = \ + __init__.py + +EXTRA_DIST = $(services_SCRIPTS) diff --git a/actions/services/__init__.py b/actions/services/__init__.py new file mode 100755 index 0000000..bb51b49 --- /dev/null +++ b/actions/services/__init__.py @@ -0,0 +1,112 @@ +#!/usr/bin/python + +import subprocess +import gnome + +def pair_to_dict(l): + res = dict() + for el in l: + if "=" not in el: + res[el]='' + else: + tmp = el.split('=',1) + if len(tmp[0]) > 0: + res[tmp[0]] = tmp[1] + return res + + +def build_url(uri = "http", hostname="127.0.0.1", port = None, path = None, username = None, password = None): + if path and path != None: + if path[0] == "/": + path = path[1:] + else: + path = "" + + if username: + if password: + username="%s:%s@" % (username,password) + else: + username="%s@" % (username) + else: + username="" + if port and port != None: + hostname="%s:%i" % (hostname,port) + return "%s://%s%s/%s" % (uri,username,hostname,path) + +def get_txt_value(txts, txt): + if txts.has_key(txt): + return txts[txt] + else: + return None + + +def _http_tcp(name, hostname, address, port, txts): + path = get_txt_value(txts,"path") + username = get_txt_value(txts,"u") + password = get_txt_value(txts,"p") + url = build_url("http",address,port, path, username,password) + gnome.url_show(url) + +def _https_tcp(name, hostname, address, port, txts): + path = get_txt_value(txts,"path") + username = get_txt_value(txts,"u") + password = get_txt_value(txts,"p") + url = build_url("https",address,port, path, username,password) + gnome.url_show(url) + +def _ftp_tcp(name, hostname, address, port, txts): + path = get_txt_value(txts,"path") + username = get_txt_value(txts,"u") + password = get_txt_value(txts,"p") + url = build_url("ftp",address,port, path, username,password) + gnome.url_show(url) + +def _ssh_tcp(name, hostname, address, port, txts): + if txts.has_key("u"): + sshline = "ssh -l %s -p %i %s" % (txts["u"], port, address) + else: + sshline = "ssh -p %i %s" % (port, address) + + cmdline = [] + cmdline.append("gnome-terminal") + cmdline.append("--tab") + cmdline.append("-t %s" % name) + cmdline.append("-e %s" % sshline) + pid = subprocess.Popen(cmdline).pid + +def _sftp-ssh_tcp(name, hostname, address, port, txts): + path = get_txt_value(txts,"path") + username = get_txt_value(txts,"u") + password = get_txt_value(txts,"p") + url = build_url("ftp",address,port, path, username,password) + gnome.url_show(url) + +def handle(name, stype, hostname, address, port, txts): + if stype == "_http._tcp": + _http_tcp(name, hostname, address, port, txts) + return + if stype == "_https._tcp": + _https_tcp(name, hostname, address, port, txts) + return + if stype == "_ftp._tcp": + _ftp_tcp(name, hostname, address, port, txts) + return + if stype == "_ssh._tcp": + _ssh_tcp(name, hostname, address, port, txts) + return + if stype == "_sftp-ssh._tcp": + _sftp-ssh_tcp(name, hostname, address, port, txts) + return + + +if __name__ == "__main__": + print build_url() + print build_url("ftp") + print build_url("https","www.google.com") + print build_url("https","www.google.com",80) + print build_url("https","www.google.com",80) + print build_url("https","www.google.com",80,"test") + print build_url("https","www.google.com",80,"/test") + print build_url("https","www.google.com",80,"/test", "user") + print build_url("https","www.google.com",0, "", None, "pass") + print build_url("https","www.google.com",80,"/test", "user", "pass") diff --git a/configure.ac b/configure.ac index 7e6ea22..8dfeaed 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ AC_PREREQ(2.59) -AC_INIT([service-discovery-applet],[0.1],[sebastien (dot) estienne (at) gmail (dot) com]) +AC_INIT([service-discovery-applet],[0.2],[sebastien (dot) estienne (at) gmail (dot) com]) AC_CONFIG_SRCDIR([src/service-discovery-applet.in]) AM_INIT_AUTOMAKE([foreign 1.9 -Wall]) AC_CONFIG_MACRO_DIR([common]) @@ -24,6 +24,12 @@ dnl ======================================================== SCRIPTSDIR="${datadir}/${PACKAGE}/scripts/" AC_SUBST(SCRIPTSDIR) +dnl ======================================================== +dnl Directory where services' actions will be installed +dnl ======================================================== +ACTIONSDIR="${datadir}/${PACKAGE}/actions/" +AC_SUBST(ACTIONSDIR) + dnl ======================================================== dnl Directory where services' icons will be installed dnl ======================================================== @@ -51,6 +57,8 @@ AC_CONFIG_FILES([ schemas/Makefile scripts/Makefile servers/Makefile + actions/Makefile + actions/services/Makefile src/Makefile ]) AC_OUTPUT diff --git a/src/Makefile.am b/src/Makefile.am index 01c41b7..49b5bec 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -19,6 +19,7 @@ service-discovery-applet: service-discovery-applet.in -e 's,@version\@,$(VERSION),g' \ -e 's,@iconsdir\@,$(ICONSDIR),g' \ -e 's,@scriptsdir\@,$(SCRIPTSDIR),g' \ + -e 's,@actionsdir\@,$(ACTIONSDIR),g' \ $< > $@ chmod +x $@ @@ -29,6 +30,7 @@ service-discovery-config: service-discovery-config.in -e 's,@iconsdir\@,$(ICONSDIR),g' \ -e 's,@interfacesdir\@,$(INTERFACESDIR),g' \ -e 's,@scriptsdir\@,$(SCRIPTSDIR),g' \ + -e 's,@actionsdir\@,$(ACTIONSDIR),g' \ $< > $@ chmod +x $@ diff --git a/src/service-discovery-applet.in b/src/service-discovery-applet.in index ad74f70..f4b246f 100755 --- a/src/service-discovery-applet.in +++ b/src/service-discovery-applet.in @@ -18,6 +18,10 @@ import os import subprocess import sys import pygtk + +sys.path.append("@actionsdir@") +import services + pygtk.require('2.0') def error_msg(msg): @@ -140,16 +144,20 @@ class ServiceDiscoveryApplet(gnomeapplet.Applet): 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 %s.%i:" % (name, type, domain, self.siocgifname(interface), protocol) print "\tHost %s (%s), port %i, TXT data: %s" % (host, address, port, avahi.txt_array_to_string_array(txt)) - if os.path.exists("@scriptsdir@/%s.sh" % type): - cmd = [] - cmd.append("@scriptsdir@/%s.sh" % type) - cmd.append("%s" % name) - cmd.append("%s" % host) - cmd.append("%s" % address) - cmd.append("%i" % port) - cmd.append('%s' % " ".join(avahi.txt_array_to_string_array(txt))) - print cmd - pid = subprocess.Popen(cmd).pid + + txts = avahi.txt_array_to_string_array(txt) + txts = services.pair_to_dict(txts) + services.handle(name, type, host, address, port, txts) +# if os.path.exists("@scriptsdir@/%s.sh" % type): +# cmd = [] +# cmd.append("@scriptsdir@/%s.sh" % type) +# cmd.append("%s" % name) +# cmd.append("%s" % host) +# cmd.append("%s" % address) +# cmd.append("%i" % port) +# cmd.append('%s' % " ".join(avahi.txt_array_to_string_array(txt))) +# print cmd +# pid = subprocess.Popen(cmd).pid def print_error(self, err): print "Error:", str(err) -- cgit