summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastien Estienne <sebastien.estienne@gmail.com>2005-10-02 00:13:49 +0000
committerSebastien Estienne <sebastien.estienne@gmail.com>2005-10-02 00:13:49 +0000
commitc69a69f7b314aaa4b1fb265232ae420d076ad245 (patch)
tree7e5f47a6e30458ec393319fb5a7dc767eab5eb42
parent693768da1faf295fd580bd4b2acfdef958daa0c0 (diff)
* 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
-rw-r--r--Makefile.am1
-rw-r--r--README2
-rw-r--r--actions/Makefile.am2
-rw-r--r--actions/services/Makefile.am5
-rwxr-xr-xactions/services/__init__.py112
-rw-r--r--configure.ac10
-rw-r--r--src/Makefile.am2
-rwxr-xr-xsrc/service-discovery-applet.in28
8 files changed, 149 insertions, 13 deletions
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])
@@ -25,6 +25,12 @@ 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 ========================================================
ICONSDIR="${datadir}/${PACKAGE}/icons/"
@@ -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)