[X2Go-Commits] python-x2go.git - build-baikal (branch) updated: 2aeda6227a5d87de552ead247134b96357746a21
X2Go dev team
git-admin at x2go.org
Wed Jan 8 15:29:16 CET 2014
The branch, build-baikal has been updated
via 2aeda6227a5d87de552ead247134b96357746a21 (commit)
from d9715a4bd4b5f801808dfc073bfe91e4adfc6e9d (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:
x2go/backends/control/stdout.py | 28 +++++++++++++++++++++++-----
x2go/backends/proxy/base.py | 10 ++++++----
x2go/backends/terminal/stdout.py | 31 ++++++++++++++++++++++---------
x2go/client.py | 20 +++++++++++++++-----
x2go/forward.py | 10 ++++++----
x2go/registry.py | 4 ++--
x2go/session.py | 12 ++++++++----
7 files changed, 82 insertions(+), 33 deletions(-)
The diff of changes is:
diff --git a/x2go/backends/control/stdout.py b/x2go/backends/control/stdout.py
index 8c26c36..a97e622 100644
--- a/x2go/backends/control/stdout.py
+++ b/x2go/backends/control/stdout.py
@@ -28,6 +28,7 @@ __NAME__ = 'x2gocontrolsession-pylib'
# modules
import types
import paramiko
+import gevent
import copy
@@ -299,18 +300,35 @@ class X2goControlSessionSTDOUT(paramiko.SSHClient):
if self.get_transport().get_username() not in self._x2go_remote_group('x2gousers'):
raise x2go_exceptions.X2goSessionException('remote user %s is not member of X2go server group x2gousers' % self.get_transport().get_username())
- _terminal = self._terminal_backend(self,
+ if session_name is not None:
+ session_info = self.list_sessions()[session_name]
+ else:
+ session_info = None
+
+ _terminal = self._terminal_backend(self,
+ session_info=session_info,
info_backend=self._info_backend,
list_backend=self._list_backend,
proxy_backend=self._proxy_backend,
**kwargs)
+
if session_name is not None:
if self.is_running(session_name):
self.suspend(session_name)
- _terminal.resume()
+
+ while not _terminal.ok():
+
+ try:
+ _terminal.resume()
+ except x2go_exceptions.X2goFwTunnelException:
+ pass
+
else:
_terminal.start()
+ while not _terminal.ok():
+ gevent.sleep(.2)
+
if _terminal.ok():
self.associated_terminals[_terminal.get_session_name()] = _terminal
self.get_transport().reverse_tunnels[_terminal.get_session_name()] = {
@@ -439,15 +457,15 @@ class X2goControlSessionSTDOUT(paramiko.SSHClient):
"""
_ret = False
- _session_names = [ t.get_session_name() for t in associated_terminals.values() ]
+ _session_names = [ t.get_session_name() for t in self.associated_terminals.values() ]
if session_name in _session_names:
self.logger('suspending associated terminal session: %s' % session_name, log.loglevel_DEBUG)
(stdin, stdout, stderr) = self._x2go_exec_command("x2gosuspend-session %s" % session_name, loglevel=log.loglevel_DEBUG)
dummy_stdout = stdout.read()
dummy_stderr = stderr.read()
- associated_terminals[session_name].__del__()
- del associated_terminals[session_name]
+ self.associated_terminals[session_name].__del__()
+ del self.associated_terminals[session_name]
_ret = True
else:
diff --git a/x2go/backends/proxy/base.py b/x2go/backends/proxy/base.py
index 8353d3c..97c8fec 100644
--- a/x2go/backends/proxy/base.py
+++ b/x2go/backends/proxy/base.py
@@ -169,10 +169,12 @@ class X2goProxyBASE(threading.Thread):
self.session_log_stderr = open('%s/%s' % (self.session_info.local_container, self.session_log, ), 'a')
self.logger('forking threaded subprocess: %s' % " ".join(cmd_line), log.loglevel_DEBUG)
- p = self.proxy = subprocess.Popen(cmd_line,
- env=self.PROXY_ENV,
- stdout=self.session_log_stdout,
- stderr=self.session_log_stderr)
+ while not self.proxy:
+ gevent.sleep(.2)
+ p = self.proxy = subprocess.Popen(cmd_line,
+ env=self.PROXY_ENV,
+ stdout=self.session_log_stdout,
+ stderr=self.session_log_stderr)
while self._keepalive:
gevent.sleep(.5)
diff --git a/x2go/backends/terminal/stdout.py b/x2go/backends/terminal/stdout.py
index d26b9a8..dc427e9 100644
--- a/x2go/backends/terminal/stdout.py
+++ b/x2go/backends/terminal/stdout.py
@@ -27,7 +27,9 @@ via server-side STDOUT and use NX3 as graphical proxy.
__NAME__ = 'x2goterminalsession-pylib'
# modules
-import os, sys, types
+import os
+import sys
+import types
import gevent
import threading
import signal
@@ -231,14 +233,6 @@ class X2goTerminalSessionSTDOUT(object):
self.params = X2goSessionParams()
- if session_info is not None:
- if self.session_info.name:
- self.session_info.local_container = os.path.join(self.params.rootdir, 'S-%s' % self.session_info.name)
- else:
- raise X2goSessionException('no valid session info availble')
- else:
- self.session_info = info_backend()
-
self.params.geometry = geometry
self.params.depth = str(depth)
self.params.link = link
@@ -259,6 +253,15 @@ class X2goTerminalSessionSTDOUT(object):
self._mk_session_rootdir(self.params.rootdir)
+ self.session_info = session_info
+ if self.session_info is not None:
+ if self.session_info.name:
+ self.session_info.local_container = os.path.join(self.params.rootdir, 'S-%s' % self.session_info.name)
+ else:
+ raise X2goSessionException('no valid session info availble')
+ else:
+ self.session_info = info_backend()
+
# each terminal session has its own guardian
self.guardian_thread = guardian.X2goSessionGuardian(self, logger=self.logger)
self.guardian_thread.start()
@@ -595,6 +598,16 @@ class X2goTerminalSessionSTDOUT(object):
"""
return self.session_info.is_suspended()
+ def is_connected(self):
+ """\
+ Returns C{True} if this X2go session's Paramiko/SSH transport is
+ connected/authenticated, C{False} else.
+
+ @return: X2go session connected?
+ @rtype: bool
+ """
+ return self.control_session.is_connected()
+
def start(self):
"""\
Start a new X2go session.
diff --git a/x2go/client.py b/x2go/client.py
index 64fe8b1..effeada 100644
--- a/x2go/client.py
+++ b/x2go/client.py
@@ -275,9 +275,12 @@ class X2goClient(object):
# detect if we are re-registering a session profile that is already been initialized
# by register_all_session_profiles
- _profile_siblings = session_registry.registered_sessions_of_name(_profile_name)
- if len(_profile_siblings) == 1 and not _profile_siblings[0].terminal_session():
- session_uuid = _profiles_siblings[0].get_uuid()
+ _profile_siblings = self.session_registry.registered_sessions_of_name(_profile_name)
+ if (not force) and (len(_profile_siblings) == 1) and not _profile_siblings[0].has_terminal_session():
+
+ session_uuid = _profile_siblings[0].get_uuid()
+ self.logger('using already initially-registered-by-profile session %s' % session_uuid, log.loglevel_NOTICE, tag=self._logger_tag)
+
if return_object:
return self.session_registry(session_uuid)
else:
@@ -563,7 +566,7 @@ class X2goClient(object):
for session in self.session_registry.running_sessions:
if session_name == session.get_session_name():
return session.suspend()
- return self.session_registry(session_uuid).suspend(session_name=session_name)
+ return self.session_registry(session_uuid).control_session.suspend(session_name=session_name)
__suspend_session = suspend_session
def terminate_session(self, session_uuid, session_name=None):
@@ -602,7 +605,7 @@ class X2goClient(object):
for session in self.session_registry.running_sessions + self.session_registry.suspended_sessions:
if session_name == session.get_session_name():
return session.terminate()
- return self.session_registry(session_uuid).terminate(session_name=session_name)
+ return self.session_registry(session_uuid).control_session.terminate(session_name=session_name)
__terminate_session = terminate_session
def get_session_profile_name(self, session_uuid):
@@ -823,6 +826,13 @@ class X2goClient(object):
return self.session_registry.has_suspended_sessions
__client_has_suspended_sessions = client_has_suspended_sessions
+ def client_registered_sessions_of_name(self, profile_name):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ return self.session_registry.registered_sessions_of_name(profile_name)
+ __client_registered_sessions_of_name = client_registered_sessions_of_name
###
### Provide access to the X2go server's sessions DB
###
diff --git a/x2go/forward.py b/x2go/forward.py
index e8f9d2c..f7b8914 100644
--- a/x2go/forward.py
+++ b/x2go/forward.py
@@ -27,11 +27,13 @@ __NAME__ = "x2goproxytunnel-pylib"
import os, sys, copy
# gevent/greenlet
+import gevent
from gevent import select, socket
from gevent.server import StreamServer
# Python X2go modules
import log
+import x2go_exceptions
class X2goFwServer(StreamServer):
"""\
@@ -86,16 +88,16 @@ class X2goFwServer(StreamServer):
fw_socket.getpeername())
chan_peername = chan.getpeername()
except Exception, e:
- self.logger('Incoming request to %s:%d failed: %s' % (self.chain_host,
+ self.logger('incoming request to %s:%d failed: %s' % (self.chain_host,
self.chain_port,
repr(e)), loglevel=log.loglevel_ERROR)
- return
+ raise x2go_exceptions.X2goFwTunnelException('proxy tunnel setup failed')
if chan is None:
- self.logger('Incoming request to %s:%d was rejected by the SSH server.' %
+ self.logger('incoming request to %s:%d was rejected by the SSH server.' %
(self.chain_host, self.chain_port), loglevel=log.loglevel_ERROR)
return
- self.logger('Connected! Tunnel open %r -> %r -> %r' % (fw_socket.getpeername(),
+ self.logger('connected! Tunnel open %r -> %r -> %r' % (fw_socket.getpeername(),
chan_peername, (self.chain_host, self.chain_port)),
loglevel=log.loglevel_INFO)
try:
diff --git a/x2go/registry.py b/x2go/registry.py
index 89727cf..ec6587c 100644
--- a/x2go/registry.py
+++ b/x2go/registry.py
@@ -98,7 +98,7 @@ class X2goSessionRegistry(object):
control_session = None
if profile_id in self.control_sessions.keys():
- control_session = control_sessions[profile_id]
+ control_session = self.control_sessions[profile_id]
s = session.X2goSession(server=server, control_session=control_session,
profile_id=profile_id, profile_name=profile_name,
@@ -204,5 +204,5 @@ class X2goSessionRegistry(object):
"""\
STILL UNDOCUMENTED
- """
+ """
return self.running_sessions and [ s for s in self.running_sessions if s.profile_name == profile_name ]
diff --git a/x2go/session.py b/x2go/session.py
index 07cc1b5..11f35fd 100644
--- a/x2go/session.py
+++ b/x2go/session.py
@@ -125,7 +125,7 @@ class X2goSession(object):
def __str__(self):
return self.__get_uuid()
def __repr__(self):
- result = 'X2goRegisteredSession('
+ result = 'X2goSession('
for p in dir(self):
if '__' in p or not p in self.__dict__ or type(p) is types.InstanceType: continue
result += p + '=' + str(self.__dict__[p]) + ', '
@@ -295,6 +295,7 @@ class X2goSession(object):
"""
_control = self.control_session
_terminal = _control.resume(session_name=session_name, logger=self.logger, **self.terminal_params)
+ self.terminal_session = _terminal
if _terminal is not None:
if _terminal.params.snd_system is not 'none':
@@ -311,7 +312,10 @@ class X2goSession(object):
for _folder in self.share_local_folders:
_terminal.share_local_folder(_folder)
- _terminal.run_command()
+ # only run the session startup command if we do not resume...
+ if session_name is None:
+ _terminal.run_command()
+
self.suspended = False
self.running = True
self.terminated = False
@@ -433,7 +437,7 @@ class X2goSession(object):
@rtype: C{bool}
"""
- return self.is_connected() and self.terminal_session.is_running()
+ return self.is_connected() and self.control_session.is_running(self.get_session_name())
_is_running = is_running
def is_suspended(self):
@@ -444,7 +448,7 @@ class X2goSession(object):
@rtype: C{bool}
"""
- return self.is_connected() and self.terminal_session.is_suspended()
+ return self.is_connected() and self.control_session.is_suspended(self.get_session_name())
__is_suspended = is_suspended
def has_terminated(self):
hooks/post-receive
--
python-x2go.git (Python X2Go Client API)
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 "python-x2go.git" (Python X2Go Client API).
More information about the x2go-commits
mailing list