[X2Go-Commits] pyhoca-gui.git - twofactorauth (branch) updated: ca778d094c8e95177f2ac87b06b522413d95c79a

X2Go dev team git-admin at x2go.org
Sat Sep 14 15:54:10 CEST 2013


The branch, twofactorauth has been updated
       via  ca778d094c8e95177f2ac87b06b522413d95c79a (commit)
      from  66a75dce88b6ea0d3a5e38d2beab3dcb3eddb46e (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
-----------------------------------------------------------------------

Summary of changes:
 SessionProfile.py |   77 +++++++++++--
 pyhoca-gui.py     |   35 ++++--
 pyx2go_client.py  |  313 -----------------------------------------------------
 x2goLogon.py      |  280 ++++++++++++++++++++++++++++-------------------
 4 files changed, 261 insertions(+), 444 deletions(-)
 delete mode 100644 pyx2go_client.py

The diff of changes is:
diff --git a/SessionProfile.py b/SessionProfile.py
index 48e2844..4a38f63 100644
--- a/SessionProfile.py
+++ b/SessionProfile.py
@@ -2,17 +2,37 @@
 #-----------------------------------------------------------------------------
 # Name:        SessionProfile.py
 # Purpose:     Define the session info coming from an ini file
-#
-# Author:      Dick Kniep
-#
-# Created:     2010/10/21
-# RCS-ID:      $Id: SessionProfile.py,v 1.2 2010/10/21 20:07:56 dick Exp $
-# Copyright:   (c) 2010 Lindix
 #-----------------------------------------------------------------------------
 
+"""
+    Copyright (C) 2010 by Dick Kniep <dick.kniep at lindix.nl>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3 of the License, or
+    (at your option) any later version.
+
+    This program 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 General Public License
+    along with this program; if not, write to the
+    Free Software Foundation, Inc.,
+    59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+    Contributors to the code of this programme:
+        Jörg Sawatzki <joerg.sawatzki at web.de>
+        Mike Gabriel <m.gabriel at das-netzwerkteam.de>
+"""
+
 import os
 import ConfigParser
 from types import *
+import exceptions
+
+class profileError(exceptions.StandardError): pass
 
 class processINI:
     """
@@ -142,6 +162,16 @@ class SessionProfiles(processINI):
     def getSection(self, section):
         return self.iniConfig.items(section)
 
+    def newProfile(self, name, **kw):
+        for key, value in kw.items():
+            if key in defaultValues:
+                self.updValue(name, key, value)
+            else:
+                raise profileError('Keyword %s not supported in profile' % key)
+
+        for key, value in defaultValues.items():
+            if key in kw: continue
+            self.storeValueTypes(name, key, value)
 
 class SingleProfile:
     def __init__(self, prof, profiles):
@@ -164,7 +194,8 @@ class SingleProfile:
         for key, retType in self.fieldList:
             self.updValue(self.prof, key, self.__dict__[key])
 
-    def Connect(self, parent, printing):
+    def Connect(self, parent):
+        printing = parent.printProfile
         geometry = str(self.width) + 'x' + str(self.height)
         self.c = x2go.X2goClient(logger=parent.liblogger)
         self.session_uuid = c.register_session(self.host, port=self.sshport,
@@ -199,7 +230,7 @@ class SingleProfile:
         self.profiles.writeIni()
 
     def isAlive(self):
-        return True
+        return self.c.session_ok(self.session_uuid)
 
 class x2goProfiles:
     def __init__(self):
@@ -216,8 +247,12 @@ class x2goProfiles:
         if len(self.profiles.SessionProfiles):
             self.current_profile = self.x2goprofs[0]
 
-    def append(self, name):
-        self.x2goprofs.append(SingleProfile(name))
+    def Append(self, name, **kw):
+        if self.profileExists(name):
+            raise profileError('Profile %s already exists' % name)
+        else:
+            self.profiles.newProfile(name, kw)
+            self.x2goprofs.append(SingleProfile(name, self.profiles))
 
     def writeIni(self):
         for s in self.x2goprofs:
@@ -238,7 +273,7 @@ class x2goProfiles:
         running = []
         for idx, profs in enumerate(self.profiles.iniConfig.sections()):
             connected = self.profiles.getValue(profs, 'connected', getType='bool')
-            if running:
+            if connected:
                 running.append(x2goprofs[idx])
         return running
 
@@ -248,4 +283,22 @@ class x2goProfiles:
         for idx, run in enumerate(running):
             if running.isAlive(): continue
             suspended.appended(run)
-        return suspended
\ No newline at end of file
+        return suspended
+
+    def anyRunningSessions(self):
+        return len(self.runningSessions()) > 0
+
+    def listAllAvailableSessions(self):
+        availableSessions = []
+        for idx, profs in enumerate(self.profiles.iniConfig.sections()):
+            availableSessions.append([self.profiles.getValue(profs, 'name'), self.profiles.getValue(profs, 'connected', getType='bool')])
+        return availableSessions
+
+    def listNonRunningProfiles(self):
+        nonrunning = []
+        for idx, profs in enumerate(self.profiles.iniConfig.sections()):
+            connected = self.profiles.getValue(profs, 'connected', getType='bool')
+            if not connected:
+                nonrunning.append(self.profiles.getValue(profs,'name'))
+        return nonrunning
+
diff --git a/pyhoca-gui.py b/pyhoca-gui.py
index 67c1e70..60fafed 100644
--- a/pyhoca-gui.py
+++ b/pyhoca-gui.py
@@ -1,15 +1,34 @@
+# -*- coding: utf-8 -*-
+#!/usr/bin/env python
 #-----------------------------------------------------------------------------
 # Name:        pyhoca-gui.py
 # Purpose:     Main program to start the python x2go gui
-#
-# Author:      Dick Kniep
-#
-# Created:     2010/10/25
-# RCS-ID:      $Id: PyApp1.py $
-# Copyright:   (c) 2010 Lindix
 #-----------------------------------------------------------------------------
-#!/usr/bin/env python
-#Boa:PyApp:main
+
+"""
+    Copyright (C) 2010 by Dick Kniep <dick.kniep at lindix.nl>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3 of the License, or
+    (at your option) any later version.
+
+    This program 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 General Public License
+    along with this program; if not, write to the
+    Free Software Foundation, Inc.,
+    59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+    Contributors to the code of this programme:
+        Jörg Sawatzki <joerg.sawatzki at web.de>
+        Mike Gabriel <m.gabriel at das-netzwerkteam.de>
+"""
+
+
 
 modules ={}
 
diff --git a/pyx2go_client.py b/pyx2go_client.py
deleted file mode 100644
index e4028d1..0000000
--- a/pyx2go_client.py
+++ /dev/null
@@ -1,313 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-"""
-    Copyright (C) 2010 by Mike Gabriel <m.gabriel at das-netzwerkteam.de>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 3 of the License, or
-    (at your option) any later version.
-
-    This program 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 General Public License
-    along with this program; if not, write to the
-    Free Software Foundation, Inc.,
-    59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-
-    Contributors to the code of this programme:
-        Jörg Sawatzki <joerg.sawatzki at web.de>
-        Dick Kniep <dick.kniep at lindix.nl>
-
-
-
-"""
-
-
-###
-### module section
-###
-
-import sys, os
-import time
-import argparse
-import getpass
-import x2go
-import paramiko
-from types import *
-import SessionProfile
-
-# for debugging
-import pprint
-
-# Python X2go provides the current local username (OS independent)
-from x2go.utils import CURRENT_LOCAL_USER as current_user
-
-# version information
-PROG_NAME = os.path.basename(sys.argv[0])
-PROG_PID  = os.getpid()
-VERSION="0.0.14"
-VERSION_TEXT="""
-%s[%s] - an X2go client written in Python
-----------------------------------------------------------------------
-developed by Mike Gabriel <m.gabriel at das-netzwerkteam.de>
-and Dick Kniep <dick.kniep at lindix.nl>
-
-VERSION: %s
-
-""" % (PROG_NAME, PROG_PID, VERSION)
-
-class X2GoConnection:
-    def __init__(self):
-
-        self.x2goSession = SessionProfile.x2goSession()
-
-        # ,,constants'' needed for debugging
-        self.logger = x2go.X2goLogger(tag='MAIN')
-        self.liblogger = x2go.X2goLogger()
-        x2go_session_hash = ''
-
-        # use current_home as user home dir
-        current_home = os.path.expanduser("~")
-
-        # define and create known_hosts file (if not there)
-        ssh_known_hosts_filename = os.path.join(current_home, '.ssh', 'known_hosts')
-        if not os.path.isfile(ssh_known_hosts_filename):
-            self._touch_file(ssh_known_hosts_filename)
-        # define and create ssh_config file (if not there)
-        ssh_config_filename = os.path.join(current_home, '.ssh', 'config')
-        if not os.path.isfile(ssh_config_filename):
-            self._touch_file(ssh_config_filename)
-            
-
-    ###
-    ### beginning of code
-    ###
-
-    def _touch_file(self, filename):
-
-        if not os.path.isfile(filename):
-            f = open(filename, 'w')
-            f.close()
-
-
-    # print version text and exit
-    def version(self):
-
-        sys.stderr.write ("%s\n" % VERSION_TEXT)
-        sys.exit(0)
-
-
-    # sometimes we have to fail...
-    def runtime_error(self, m, parser=None, exitcode=-1):
-        if parser is not None:
-            parser.print_usage()
-        sys.stderr.write ("%s: error: %s\n" % (PROG_NAME, m))
-        sys.exit(exitcode)
-
-
-    def makeConnection(self):
-        
-        self.logger('preparing requested X2go session', x2go.loglevel_NOTICE, )
-        
-        x2goclient = x2go.X2goClient(logger=self.liblogger)
-        x2go_session_hash = x2goclient.register_session(self.x2goSession.server, port=int(self.x2goSession.remote_ssh_port), 
-                                                        username=self.x2goSession.username, 
-                                                        password=self.x2goSession.password,
-                                                        key_filename=self.x2goSession.ssh_privkey,
-                                                        add_to_known_hosts=self.x2goSession.add_to_known_hosts,
-                                                        profile_name = 'Pyhoca-Client_Session',
-                                                        session_type=self.x2goSession.session_type,
-                                                        link=self.x2goSession.link,
-                                                        geometry=self.x2goSession.geometry,
-                                                        pack=self.x2goSession.pack,
-                                                        cache_type='unix-kde',
-                                                        kblayout=self.x2goSession.kbd_layout,
-                                                        kbtype=self.x2goSession.kbd_type,
-                                                        snd_system=self.x2goSession.sound,
-                                                        printing=self.x2goSession.printing,
-                                                        cmd=self.x2goSession.command)
-
-        x2goclient.with_session(x2go_session_hash).load_host_keys(ssh_known_hosts_filename)
-        self.connected = False
-        force_password_auth = False
-        x2goclient.connect_session(x2go_session_hash, password=self.x2goSession.password, force_password_auth=force_password_auth)
-        self.connected = True
-
-    def checkSSHConfig(self)
-        ###
-        ### initialize SSH context
-        ###
-        # check if SERVER is in .ssh/config file, extract information from there...
-        ssh_config = paramiko.SSHConfig()
-        ssh_config_fileobj = open(ssh_config_filename)
-        ssh_config.parse(ssh_config_fileobj)
-        ssh_host = ssh_config.lookup(a.server)
-        if ssh_host:
-            if 'hostname' in ssh_host.keys():
-                a.server = ssh_host['hostname']
-            if 'port' in ssh_host.keys():
-                a.remote_ssh_port = ssh_host['port']
-        ssh_config_fileobj.close()
-        # check if ssh priv key exists
-        if a.ssh_privkey and not os.path.isfile(a.ssh_privkey):
-            runtime_error("SSH private key %s file does not exist." % a.ssh_privkey, parser=p, exitcode=30)
-        if not a.ssh_privkey and os.path.isfile('%s/.ssh/id_rsa' % current_home):
-            a.ssh_privkey = '%s/.ssh/id_rsa' % current_home
-        if not a.ssh_privkey and os.path.isfile('%s/.ssh/id_dsa' % current_home):
-            a.ssh_privkey = '%s/.ssh/id_dsa' % current_home
-
-        return p, a
-
-
-    def list_sessions(self, cli, s_hash):
-        # retrieve a session list
-        print
-        print "Available runing/suspended X2go sessions"
-        print "========================================"
-        print "Hostname: [%s]:%s" % cli.get_server(s_hash)
-        print "Username: %s" % cli.get_username(s_hash)
-        print 
-        session_infos = cli.list_sessions(s_hash)
-        for session_info in session_infos.values():
-            print "Session Name: %s" % session_info
-            print "-------------"
-            print "cookie: %s" % session_info.cookie
-            print "agent PID: %s" % session_info.agent_pid
-            print "display: %s" % session_info.display
-            print "status: %s" % session_info.status
-            print "graphic port: %s" % session_info.graphics_port
-            print "snd port: %s" % session_info.snd_port
-            print "sshfs port: %s" % session_info.sshfs_port
-            print "username: %s" % session_info.username
-            print "hostname: %s" % session_info.hostname
-            # TODO: turn into datetime object
-            print "create date: %s" % session_info.date_created
-            # TODO: turn into datetime object
-            print "suspended since: %s" % session_info.date_suspended
-            print
-
-
-    def clean_sessions(self, cli, s_hash):
-        # clean all sessions from X2go server
-        logger('cleaning up all running sessions from X2go server: %s' % self.x2goSession.server, x2go.loglevel_NOTICE, )
-        cli.clean_sessions(s_hash)
-
-
-    def new_session(self, cli, s_hash):
-        # start a new session and run a command
-        logger('starting a new X2go session', x2go.loglevel_INFO, )
-        logger('Command for new session is: %s' % self.x2goSession.command, x2go.loglevel_DEBUG, )
-        cli.start_session(s_hash)
-
-
-    def resume_session(self, cli, s_hash):
-        # resume a running session
-        logger('resuming X2go session: %s' % self.x2goSession.resume, x2go.loglevel_INFO, )
-        available_sessions = cli.list_sessions(s_hash)
-        if self.x2goSession.resume in available_sessions.keys():
-            cli.resume_session(s_hash, self.x2goSession.resume)
-        else:
-            runtime_error('requested session not available on X2go server [%s]:%s.' % (self.x2goSession.server, self.x2goSession.remote_ssh_port), exitcode=20)
-
-
-    def suspend_session(self, cli, s_hash):
-        # send a suspend request to a session
-        logger('requesting X2go session suspend of session: %s' % self.x2goSession.suspend, x2go.loglevel_INFO, )
-        available_sessions = cli.list_sessions(s_hash)
-        if self.x2goSession.suspend in available_sessions.keys():
-            cli.suspend_session(s_hash, self.x2goSession.suspend)
-        else:
-            runtime_error('requested session not available on X2go server [%s]:%s.' % (self.x2goSession.server, self.x2goSession.remote_ssh_port), exitcode=21)
-
-    def terminate_session(self, cli, s_hash):
-        # send a terminate request to a session
-        logger('requesting X2go session terminate of session: %s' % self.x2goSession.terminate, x2go.loglevel_INFO, )
-        available_sessions = cli.list_sessions(s_hash)
-        if self.x2goSession.terminate in available_sessions.keys():
-            cli.terminate_session(s_hash, self.x2goSession.terminate)
-        else:
-            runtime_error('requested session not available on X2go server [%s]:%s.' % (self.x2goSession.server, self.x2goSession.remote_ssh_port), exitcode=22)
-
-
-if __name__ == '__main__':
-
-
-        if self.x2goSession.clean_sessions:
-            clean_sessions(x2goclient, x2go_session_hash)
-
-        # go through the possible X2go client modes
-        if self.x2goSession.list_sessions:
-            # print a beautified session list for the user
-            list_sessions(x2goclient, x2go_session_hash)
-            sys.exit(0)
-
-        if args.resume:
-            resume_session(x2goclient, x2go_session_hash)
-
-        elif args.suspend:
-            suspend_session(x2goclient, x2go_session_hash)
-
-        elif args.terminate:
-            terminate_session(x2goclient, x2go_session_hash)
-
-        elif args.new:
-            new_session(x2goclient, x2go_session_hash)
-
-
-        if args.new or args.resume:
-            # give the session some time to come up...
-            # no CTRL-C is allowed during this phase...
-            i=0
-            logger("give the X2go session some time to come up...", x2go.loglevel_NOTICE, )
-            while i < args.time_to_wait:
-                time.sleep(1)
-                i+=1
-
-            if x2goclient.session_ok(x2go_session_hash):
-
-                profile_name = x2goclient.get_profile_name(x2go_session_hash)
-                session_name = x2goclient.get_session_name(x2go_session_hash)
-                logger("X2go session is now running, the X2go client's profile name is: %s." % profile_name, x2go.loglevel_INFO, )
-                logger("X2go session name is: %s." % session_name, x2go.loglevel_INFO, )
-                logger("Press CTRL+C to suspend the running session.", x2go.loglevel_NOTICE, )
-                try:
-
-                    session_duration = 0
-                    mounted = False
-                    while x2goclient.session_ok(x2go_session_hash):
-                        time.sleep(2)
-                        session_duration +=2
-
-                        if session_duration > 2 and not mounted and args.share_local_folders is not None:
-                            if x2goclient.with_session(x2go_session_hash).get_transport().reverse_tunnels['sshfs'][1] is not None:
-                                for _folder in args.share_local_folders:
-                                    x2goclient.share_local_folder(x2go_session_hash, _folder)
-                                mounted = True
-
-                    # wait a little longer before telling the user what had happened
-                    time.sleep(2)
-
-                    if x2goclient.has_terminated(x2go_session_hash):
-                        logger("X2go session %s has terminated." % session_name, x2go.loglevel_NOTICE, )
-                    elif x2goclient.is_suspended(x2go_session_hash):
-                        logger("X2go session %s has been suspended." % session_name, x2go.loglevel_NOTICE, )
-                    elif x2goclient.is_running(x2go_session_hash):
-                        logger("X2go session %s has been moved to a different screen." % session_name, x2go.loglevel_NOTICE, )
-
-                except KeyboardInterrupt:
-                    logger("Suspending X2go session %s." % session_name, x2go.loglevel_INFO, )
-                    x2goclient.suspend_session(x2go_session_hash)
-                    # giving nxproxy's SSH tunnel some time to settle
-                    time.sleep(2)
-                    logger("X2go session %s has been suspended." % session_name, x2go.loglevel_NOTICE, )
-
-        sys.exit(0)
-
-    except (KeyboardInterrupt, SystemExit), e:
-        x2go.x2go_cleanup(e)
-
diff --git a/x2goLogon.py b/x2goLogon.py
index b5f28a6..4e823cb 100644
--- a/x2goLogon.py
+++ b/x2goLogon.py
@@ -2,13 +2,30 @@
 #-----------------------------------------------------------------------------
 # Name:        x2goLogon.py
 # Purpose:     display the Logon screen for x2go
-#
-# Author:      Dick Kniep
-#
-# Created:     2010/10/21
-# Copyright:   (c) Lindix BV 2010
 #-----------------------------------------------------------------------------
 
+"""
+    Copyright (C) 2010 by Dick Kniep <dick.kniep at lindix.nl>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3 of the License, or
+    (at your option) any later version.
+
+    This program 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 General Public License
+    along with this program; if not, write to the
+    Free Software Foundation, Inc.,
+    59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+    Contributors to the code of this programme:
+        Jörg Sawatzki <joerg.sawatzki at web.de>
+        Mike Gabriel <m.gabriel at das-netzwerkteam.de>
+"""
 
 import wx
 import time
@@ -29,61 +46,96 @@ except ImportError: # if it's not there locally, try the wxPython lib.
 import wx.lib.sized_controls as sc
 
 class menuActions(wx.Menu):
-    def __init__(self, parent, settingsProfile, SessionProfiles):
-        OPENNEWMENUTXT = "Open new Session"
-        RUNNINGMENUTXT = "Running sessions"
-        SUSPENDMENUTXT = "Suspend session"
-        RESUMEMENUTXT = "Resume suspended session"
-        UPDATEPROFMNUTEXT = "Update Profile"
-        EXITMENUTXT = "E&xit sessions"
+    def __init__(self, parent):
+        self.parent = parent
+        if hasattr(parent,'logger'):
+            self.logger = self.parent.logger
+        else:
+            self.logger = self.parent.parent.logger
+        if hasattr(parent,'settingsProfile'):
+            self.settingsProfile = parent.settingsProfile
+            self.SessionProfiles = parent.SessionProfiles
+            self.printProfile = parent.printProfile
+        else:
+            self.settingsProfile = parent.parent.settingsProfile
+            self.SessionProfiles = parent.parent.SessionProfiles
+            self.printProfile = parent.parent.printProfile
+
+        ADDPROFILEMENUTXT = "Add &New profile"
+        OPENNEWMENUTXT = "&Open new Session"
+        RUNNINGMENUTXT = "R&Unning sessions"
+        SUSPENDMENUTXT = "&Suspend session"
+        RESUMEMENUTXT = "&Resume suspended session"
+        UPDATEPROFMNUTEXT = "&Update current Profile"
+        CLOSEMENUTXT = "&Close running Session"
+        EXITMENUTXT = "E&xit"
         MENU_NEWSESSION = wx.NewId()
         MENU_LISTSESSIONS = wx.NewId()
         MENU_SUSPEND = wx.NewId()
         MENU_RESUME = wx.NewId()
         MENU_EDITSESSION = wx.NewId()
+        MENU_CLOSESESSION = wx.NewId()
         MENU_EXIT = wx.NewId()
+        MENU_NEWPROFILE = wx.NewId()
         wx.Menu.__init__(self)
-        parent.logger('settingsProfile.newProfile %s' % dir(settingsProfile), x2go.loglevel_INFO, )
-        if settingsProfile.newprofile:
-            self.Append(MENU_NEWSESSION, OPENNEWMENUTXT)
-            self.Bind(wx.EVT_MENU, self.OnNewSession, id=MENU_NEWSESSION)
-        if SessionProfiles.runningSessions():
+        self.logger('settingsProfile.newProfile %s' % dir(self.settingsProfile), x2go.loglevel_INFO, )
+        self.Append(MENU_NEWSESSION, OPENNEWMENUTXT)
+        self.parent.Bind(wx.EVT_MENU, self.OnNewSession, id=MENU_NEWSESSION)
+        if self.settingsProfile.newprofile:
+            self.Append(MENU_NEWPROFILE, ADDPROFILEMENUTXT)
+            self.parent.Bind(wx.EVT_MENU, self.OnAddProfile, id=MENU_NEWPROFILE)
+        if self.SessionProfiles.runningSessions():
             self.Append(MENU_LISTSESSIONS, RUNNINGMENUTXT)
-            self.Bind(wx.EVT_MENU, self.OnListSessions, id=MENU_LISTSESSIONS)
+            self.parent.Bind(wx.EVT_MENU, self.OnListSessions, id=MENU_LISTSESSIONS)
             self.Append(MENU_SUSPEND, SUSPENDMENUTXT)
-            self.Bind(wx.EVT_MENU, self.OnSuspend, id=MENU_SUSPEND)
-        if SessionProfiles.suspendedSessions() and settingsProfile.resume:
+            self.parent.Bind(wx.EVT_MENU, self.OnSuspend, id=MENU_SUSPEND)
+        if self.SessionProfiles.suspendedSessions() and self.settingsProfile.resume:
             self.Append(MENU_RESUME, RESUMEMENUTXT)
-            self.Bind(wx.EVT_MENU, self.OnResume, id=MENU_RESUME)
-        if settingsProfile.editprofile:
+            self.parent.Bind(wx.EVT_MENU, self.OnResume, id=MENU_RESUME)
+        if self.settingsProfile.editprofile:
             self.AppendSeparator()
             self.Append(MENU_EDITSESSION, UPDATEPROFMNUTEXT)
-            self.Bind(wx.EVT_MENU, self.OnUpdateProfile, id=MENU_EDITSESSION)
+            self.parent.Bind(wx.EVT_MENU, self.OnUpdateProfile, id=MENU_EDITSESSION)
         self.AppendSeparator()
-        self.Bind(wx.EVT_CLOSE, self.OnClose)
-        self.Bind(wx.EVT_MENU, self.OnExit, id=MENU_EXIT)
+        self.Append(MENU_EXIT, EXITMENUTXT)
+        self.parent.Bind(wx.EVT_MENU, self.OnExit, id=MENU_EXIT)
+        self.parent.Bind(wx.EVT_CLOSE, self.OnClose)
+
+    def OnAddProfile(self, evt):
+        self.logger('Add Profile started', x2go.loglevel_INFO, )
 
     def OnNewSession(self, evt):
-        pass
+        self.logger('NewSession started', x2go.loglevel_INFO, )
+        X2GoChooseSessionScrn(self.parent)
 
     def OnListSessions(self, evt):
-        pass
+        self.logger('List Sessions started', x2go.loglevel_INFO, )
 
     def OnSuspend(self, evt):
-        pass
+        self.logger('Suspend Sessions started', x2go.loglevel_INFO, )
 
     def OnResume(self, evt):
-        pass
+        self.logger('Resume Sessions started', x2go.loglevel_INFO, )
 
     def OnUpdateProfile(self, evt):
-        pass
+        self.logger('Update Profile started', x2go.loglevel_INFO, )
 
     def OnExit(self, evt):
-        self.Close(True)
+        self.logger('Exit application', x2go.loglevel_INFO, )
+        self.__getFrameParent().Close(True)
 
     def OnClose(self, evt):
-        self.parent.env.exitAllChildren()
-        self.Destroy()
+        self.logger('Close application', x2go.loglevel_INFO, )
+        self.__getFrameParent().Close()
+
+    def __getFrameParent(self):
+        if isinstance(self, wx.Frame):
+            return self
+        if isinstance(self.parent, wx.Frame):
+            return self.parent
+        elif isinstance(self.parent.parent, wx.Frame):
+            return self.parent.parent
+
 
 class LogonStatusBar(wx.StatusBar):
     def __init__(self, parent):
@@ -110,41 +162,46 @@ class X2GoResumeSessions(sc.SizedFrame):
                         style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
 
 class X2GoPasswordScrn(sc.SizedFrame):
-    def __init__(self, parent, SessionProfiles, settingsProfile, printProfile, Iconize):
+    def __init__(self, parent, Iconize):
         """
         Screen to enter the userid and password for the session
 
         if the screen is iconized, but an error occurs, the screen is displayed
         and the user can enter another userid/password
         """
-        sc.SizedFrame.__init__(self, None, -1, "X2go Password entry",
+        captionText = "X2go Profile " + parent.SessionProfiles.current_profile.name
+        sc.SizedFrame.__init__(self, None, -1, captionText,
                         style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
         self.CentreOnScreen()
 
         self.SetSize((350,250))
 
-        self.settingsProfile = settingsProfile
-        self.SessionProfiles = SessionProfiles
-        self.current_profile = SessionProfiles.current_profile
+        self.settingsProfile = parent.settingsProfile
+        self.SessionProfiles = parent.SessionProfiles
+        self.current_profile = parent.SessionProfiles.current_profile
+        self.printProfile = parent.printProfile
         self.parent = parent
-        parent.logger('Password entry screen started', x2go.loglevel_INFO, )
+        self.logger = parent.logger
+        self.logger('Password entry screen started', x2go.loglevel_INFO, )
         pane = self.GetContentsPane()
         pane.SetSizerType("form")
         pwScrn = self.passwordScrn(pane)
         self.Main_MenuBar = wx.MenuBar()
         self.SetMenuBar(self.Main_MenuBar)
-        self.Main_MenuBar.Append(menuActions(parent, settingsProfile, SessionProfiles), '&Connection')
+        self.Main_MenuBar.Append(menuActions(self), '&Connection')
         self.tb = X2GoLogonTaskBarIcon(self)
+        self.Bind(wx.EVT_CLOSE, self.OnCancel)
         if Iconize:
-            if self.IsIconized():
+            if not self.IsIconized():
                 self.Iconize(True)
             if parent.args.password and parent.args.username and parent.args.profile and SessionProfiles.profileExists(parent.args.profile):
                 self.onConnect()
-            else:
+            elif parent.args.profile:
                 Message(self, 'Not all credentials are available')
                 self.Iconize(False)
         else:
             self.Show(True)
+        self.Fit()
 
     def passwordScrn(self, pnl):
         wx.StaticText(pnl, -1, 'User'),
@@ -163,17 +220,15 @@ class X2GoPasswordScrn(sc.SizedFrame):
 
         self.CancelButton = wx.Button(pnl, -1, "Cancel")
         self.CancelButton.Bind(wx.EVT_BUTTON, self.OnCancel)
-        #self.SetButtonSizer(self.CreateStdDialogButtonSizer(self.ConnectButton | self.CancelButton))
-        #self.SetButtonSizer(self.CreateStdDialogButtonSizer(wx.OK| wx.CANCEL))
 
     def OnOK(self, evt):
         username = self.username_ctl.GetValue()
         password = self.passwd_ctl.GetValue()
         if len(username) == 0:
-            self.Message(self,'Userid is invalid')
+            Message(self,'Userid is invalid')
             return
         if len(password) == 0:
-            self.Message(self,'Password is required')
+            Message(self,'Password is required')
             return
         self.current_profile.updValue('server','username',username)
         self.current_profile.password = password
@@ -182,11 +237,11 @@ class X2GoPasswordScrn(sc.SizedFrame):
     def onConnect(self):
         set_iconize = False
         try:
-            connection = x2goConnect.X2GoConnection(self.current_profile)
+            connection = self.current_profile.Connect(self)
             connection.makeConnection(self.session, self.StatusText)
             set_iconize = True
         except x2go.AuthenticationException:
-            self.Message(self,'Userid/Password verification failed')
+            Message(self,'Userid/Password verification failed')
         except x2go.BadHostKeyException:
             self.Message(self,'SSH host key verification for remote host [%s]:%s failed' % (self.current_profile.host, self.current_profile.ssh_port ))
         except x2go.SSHException, e:
@@ -196,32 +251,18 @@ class X2GoPasswordScrn(sc.SizedFrame):
         return
 
     def OnCancel(self, evt):
-        self.Close
-
+        if not self.SessionProfiles.anyRunningSessions():
+        #self.Close()
+            self.tb.Destroy()
+        self.Destroy()
 
-class Message:
-    def __init__(self, parent, message, extraCaption='', msgtype='error'):
-        if msgtype == 'warning':
-            msgstyle = wx.ICON_QUESTION|wx.STAY_ON_TOP
-            caption = 'Warning '
-        elif msgtype == 'error':
-            msgstyle = wx.ICON_QUESTION|wx.STAY_ON_TOP
-            caption = 'Error '
-        else:
-            msgstyle = wx.ICON_INFORMATION|wx.STAY_ON_TOP
-            caption = 'Information '
-        caption += extraCaption
-        md = wx.MessageDialog(parent, message, caption=caption, style=msgstyle)
-        result = md.ShowModal()
-        self.retValue = False
-        if result == wx.OK:
-            self.retValue = True
-        md.Destroy()
+class X2GoChooseSessionScrn(wx.Frame):
+    def __init__(self, parent):
+        wx.Frame.__init__(self)
+        self.logger = parent.logger
+        self.logger('Choose Session screen started', x2go.loglevel_INFO, )
 
-class X2GoChooseSessionScrn(sc.SizedDialog):
-    def __init__(self, parent, settingsProfile, printProfile):
-        parent.logger('Choose Session screen started', x2go.loglevel_INFO, )
-        pass
+        wx.SingleChoiceDialog(self, 'Choose profile', choices=parent.SessionProfiles.listNonRunningProfiles(), style=wx.CHOICEDLG_STYLE )
 
 class X2GoSessionDefScrn(sc.SizedDialog):
     SESSIONNOTEBOOK = wx.NewId()
@@ -229,7 +270,7 @@ class X2GoSessionDefScrn(sc.SizedDialog):
     CommandList = ['Internet Browser','Email client','OpenOffice','Terminal']
     ConnectList = ['Modem','ISDN','ADSL','WAN','LAN']
     CommpressionList = ['nopack','64k','256k','2m','256-rdp','32k-rdp','64k-rdp','16m-rdp','16m-rdp-compressed','64k-tight','2m-tight','4k-jpeg','16m-jpeg','64k-png-jpeg','16m-png-jpeg','64k-png','16m-png','16m-rgb','16m-rle']
-    def __init__(self, parent, SessionProfiles, settingsProfile, printProfile):
+    def __init__(self, parent):
 
         parent.logger('Session definition screen started', x2go.loglevel_INFO, )
         self.pnl = wx.Panel(self, -1)
@@ -361,11 +402,11 @@ class X2GoSessionDefScrn(sc.SizedDialog):
 
 class X2GoLogonTaskBarIcon(wx.TaskBarIcon):
 
-    def __init__(self, frame=None):
+    def __init__(self, parent=None):
         wx.TaskBarIcon.__init__(self)
-        self.frame = frame
-        self.frame.parent.logger('Start TaskBarIcon', x2go.loglevel_INFO, )
-        img = wx.Image('/usr/share/icons/hicolor/32x32/apps/x2goclient.png')
+        self.parent = parent
+        self.parent.parent.logger('Start TaskBarIcon type %s' % (wx.PlatformInfo, ), x2go.loglevel_INFO, )
+        img = wx.Image('Images/x2goclient.png')
         icon = self.MakeIcon(img)
         self.SetIcon(icon, "x2go connect")
         self.imgidx = 1
@@ -377,7 +418,7 @@ class X2GoLogonTaskBarIcon(wx.TaskBarIcon):
         the menu how you want it and return it from this function,
         the base class takes care of the rest.
         """
-        menu = menuActions(self.frame.parent, self.frame.settingsProfile, self.frame.SessionProfiles)
+        menu = menuActions(self)
         return menu
 
     def MakeIcon(self, img):
@@ -394,35 +435,52 @@ class X2GoLogonTaskBarIcon(wx.TaskBarIcon):
         return icon
 
     def OnTaskBarEditSession(self, evt):
-        if self.frame:
-            if self.frame.IsIconized():
-                self.frame.Iconize(False)
-            if not self.frame.IsShown():
-                self.frame.Show(True)
-            self.frame.Raise()
+        if self.parent.IsIconized():
+            self.parent.Iconize(False)
+        if not self.parent.IsShown():
+            self.parent.Show(True)
+        self.parent.Raise()
 
 
     def OnTaskBarExitSessions(self, evt):
-        if self.frame:
-            wx.CallAfter(self.frame.Close)
+        if self.parent:
+            wx.CallAfter(self.parent.Close)
 
 
-    def OnTaskBarResumeSession(self, evt):
-        names = [ "WXPdemo", "Mondrian", "Pencil", "Carrot" ]
-        name = names[self.imgidx]
+    #def OnTaskBarResumeSession(self, evt):
+        #names = [ "WXPdemo", "Mondrian", "Pencil", "Carrot" ]
+        #name = names[self.imgidx]
 
-        eImg = getattr(images, name)
-        self.imgidx += 1
-        if self.imgidx >= len(names):
-            self.imgidx = 0
+        #eImg = getattr(images, name)
+        #self.imgidx += 1
+        #if self.imgidx >= len(names):
+            #self.imgidx = 0
 
-        icon = self.MakeIcon(eImg.Image)
-        self.SetIcon(icon, "This is a new icon: " + name)
+        #icon = self.MakeIcon(eImg.Image)
+        #self.SetIcon(icon, "This is a new icon: " + name)
 
 
-    def OnTaskBarNewSession(self, evt):
-        self.RemoveIcon()
+    #def OnTaskBarNewSession(self, evt):
+        #self.RemoveIcon()
 
+class Message:
+    def __init__(self, parent, message, extraCaption='', msgtype='error'):
+        if msgtype == 'warning':
+            msgstyle = wx.ICON_QUESTION|wx.STAY_ON_TOP
+            caption = 'Warning '
+        elif msgtype == 'error':
+            msgstyle = wx.ICON_QUESTION|wx.STAY_ON_TOP
+            caption = 'Error '
+        else:
+            msgstyle = wx.ICON_INFORMATION|wx.STAY_ON_TOP
+            caption = 'Information '
+        caption += extraCaption
+        md = wx.MessageDialog(parent, message, caption=caption, style=msgstyle)
+        result = md.ShowModal()
+        self.retValue = False
+        if result == wx.OK:
+            self.retValue = True
+        md.Destroy()
 
 def checkArgs(parent, args, SessionProfiles):
     if args.profile and not SessionProfiles.profileExists(args.profile):
@@ -432,7 +490,7 @@ def checkArgs(parent, args, SessionProfiles):
 
 def startX2Go(parent):
     """
-    This routine starts processing
+    This routine starts all processing
 
     If there is only one profile available, or if there is one (1) single
     profile that has the default switch, the logon screen
@@ -440,32 +498,32 @@ def startX2Go(parent):
     """
     parent.logger('starting a new X2go GUI session', x2go.loglevel_INFO, )
 
-    printProfile = SessionProfile.Printing()
-    settingsProfile = SessionProfile.Settings()
-    SessionProfiles = SessionProfile.x2goProfiles()
-    noSessionsDefined = len(SessionProfiles.x2goprofs) == 0
-    moreSessionsDefined = len(SessionProfiles.x2goprofs) > 1
+    parent.printProfile = SessionProfile.Printing()
+    parent.settingsProfile = SessionProfile.Settings()
+    parent.SessionProfiles = SessionProfile.x2goProfiles()
+    noSessionsDefined = len(parent.SessionProfiles.x2goprofs) == 0
+    moreSessionsDefined = len(parent.SessionProfiles.x2goprofs) > 1
 
-    checkArgs(parent, parent.args, SessionProfiles)
-    sessionsSuspended = SessionProfiles.suspendedSessions()
-    if len(sessionsSuspended) and settingsProfile.autoresume:
+    #checkArgs(parent, parent.args, SessionProfiles)
+    sessionsSuspended = parent.SessionProfiles.suspendedSessions()
+    if len(sessionsSuspended) and parent.settingsProfile.autoresume:
         parent.logger('autoresume sessionsSuspended %s' % sessionsSuspended, x2go.loglevel_INFO, )
         for suspended in sessionsSuspended:
             suspended.Resume()
     elif len(sessionsSuspended):
         parent.logger('Choose SuspendedSessions %s' % sessionsSuspended, x2go.loglevel_INFO, )
-        X2GoResumeSessions(parent, sessionsSuspended, settingsProfile, printProfile)
+        X2GoResumeSessions(parent, sessionsSuspended)
     else:
         if parent.args.minimized:
             parent.logger('Start minimized', x2go.loglevel_INFO, )
-            pwScrn = X2GoPasswordScrn(parent, SessionProfiles, settingsProfile, printProfile, Iconize=True)
+            pwScrn = X2GoPasswordScrn(parent, Iconize=True)
         else:
             if not noSessionsDefined and (not moreSessionsDefined or SessionProfiles.defaultAvailable()):
                 parent.logger('Start password entry normally', x2go.loglevel_INFO, )
-                pwScrn = X2GoPasswordScrn(parent, SessionProfiles, settingsProfile, printProfile)
+                pwScrn = X2GoPasswordScrn(parent)
             elif noSessionsDefined:
                 parent.logger('Start Profile Definition', x2go.loglevel_INFO, )
-                defScrn = X2GoSessionDefScrn(parent, SessionProfiles, settingsProfile, printProfile)
+                defScrn = X2GoSessionDefScrn(parent)
             else:
                 parent.logger('Start Profile choice', x2go.loglevel_INFO, )
-                choiceScrn = X2GoChooseSessionScrn(parent, settingsProfile, printProfile)
+                choiceScrn = X2GoChooseSessionScrn(parent)


hooks/post-receive
-- 
pyhoca-gui.git (Python X2Go Client (wxPython GUI))

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "pyhoca-gui.git" (Python X2Go Client (wxPython GUI)).




More information about the x2go-commits mailing list