The branch, build-59a18b6e3b5d3f1dd8f07f26433d37fe5984a57d 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@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@web.de> + Mike Gabriel <m.gabriel@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@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@web.de> + Mike Gabriel <m.gabriel@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@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@web.de> - Dick Kniep <dick.kniep@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@das-netzwerkteam.de> -and Dick Kniep <dick.kniep@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@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@web.de> + Mike Gabriel <m.gabriel@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)).