summaryrefslogtreecommitdiffstats
path: root/plugins/gconfterminal.py.in
blob: 4330ac14855ed0e3b23580fef23fd61bda326ca8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# -*- coding: UTF-8 -*-
# -*- python -*-
# Copyright (C) 2005 by Sebastien Estienne
#
# This file may be distributed and/or modified under the terms of
# the GNU General Public License version 2 as published by
# the Free Software Foundation.
# This file is distributed without any warranty; without even the implied
# warranty of merchantability or fitness for a particular purpose.
# See "COPYING" in the source distribution for more information.
#
# $Id$
#

from sdapplet.pluginutils import *

import os
import pwd
import subprocess

try:
    import gettext
    gettext.bindtextdomain("service-discovery-applet", "/usr/share/locale")
    gettext.textdomain("service-discovery-applet")
    _ = gettext.gettext
    import pygtk
    pygtk.require('2.0')
    import gtk
    import gconf
    import gnome
except ImportError, e:
    error_msg(_("A required python module is missing!\n%s") % (e))
    os._exit()

class plugin_gnometerminal:
    def __init__(self):
        self.service_type = ["_ssh._tcp", "_sftp-ssh._tcp" ]
        self.author = "Sébastien Estienne"

    def enter_callback(self, widget, win):
        win.response(gtk.RESPONSE_OK)

    def SshLogin(self, hostname, username = None):
        self.win = gtk.Dialog(_("SSH Connection"), None,
                              gtk.DIALOG_MODAL,
                              (gtk.STOCK_OK, gtk.RESPONSE_OK,
                               gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))

        vbox = gtk.VBox(False, 5)
        self.win.vbox.pack_start(vbox, True, True, 0)
        vbox.set_border_width(5)
    
        label = gtk.Label()
        label.set_markup(_("Connecting to <b>%s</b>.\nPlease enter your <b>login</b>:") % (hostname))
        
        vbox.pack_start(label, False, False, 0)
    
        # Create our entry
        entry = gtk.Entry()
        if username!= None:
            entry.set_text(username)
        entry.connect("activate", self.enter_callback, self.win)
        vbox.pack_start(entry, False, False, 0)
    
        # Create the completion object
        completion = gtk.EntryCompletion()
    
        # Assign the completion to the entry
        entry.set_completion(completion)
    
        # Create a tree model and use it as the completion model
        completion_model = self.__create_completion_model()
        completion.set_model(completion_model)
    
        # Use model column 0 as the text column
        completion.set_text_column(0)
    
        self.win.show_all()
        if self.win.run() == gtk.RESPONSE_OK:
            self.win.destroy()
            return entry.get_text()
        else:
            self.win.destroy()
            return None
    
    def __create_completion_model(self):
        ''' Creates a tree model containing the completions.
        '''
        store = gtk.ListStore(str)
        
        iter = store.append()
        store.set(iter, 0, "root")
    
        current_user = pwd.getpwuid(os.getuid())[0]
        iter = store.append()
        store.set(iter, 0, current_user)
    
        return store

    def connect(self, use_host_names, name, stype, hostname, address, port, txts):
        try:
	   terminal = gconf.client_get_default().get_string ("/desktop/gnome/applications/terminal/exec")
	   terminal = terminal + " " + gconf.client_get_default().get_string ("/desktop/gnome/applications/terminal/exec_arg")
	except:
	    terminal = "gnome-terminal -x"
        if use_host_names == True:
            address = hostname
        print "connecting using %s" % (terminal)
        if txts.has_key("u"):
            username = self.SshLogin(name, txts["u"])
        else:
            username = self.SshLogin(name)


        if stype == "_ssh._tcp":
            scheme = "@toolsdir@/exec_wrapper ssh -X"
        else:
            scheme = "@toolsdir@/exec_wrapper sftp"
        if username == None:
            return
        elif username != "":
            sshline = "%s -p %i %s@%s" % (scheme, port, username, address)
        else:
            sshline = "%s -p %i %s " % (scheme, port, address)

        cmdline = terminal.split(" ")
        cmdline.extend(sshline.split(" "))
        print cmdline
        pid = subprocess.Popen(cmdline).pid
        os.waitpid(pid)
        
def load():
    return plugin_gnometerminal()