The branch, master has been updated via 991f0a1f718d54c71e4047fa9def3e401e1d8f7b (commit) from 7fdd38ce95451a7f174b95f18d584d41e560c21c (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 ----------------------------------------------------------------- commit 991f0a1f718d54c71e4047fa9def3e401e1d8f7b Author: Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Date: Tue May 29 15:30:45 2012 +0200 work on the terminal session __doc__ strings ----------------------------------------------------------------------- Summary of changes: x2go/backends/control/_stdout.py | 10 +- x2go/backends/printing/_file.py | 2 +- x2go/backends/printing/_gconf.py | 2 +- x2go/backends/printing/_winreg.py | 2 +- x2go/backends/terminal/_stdout.py | 320 +++++++++++++++++++++++++++++-------- x2go/cache.py | 4 +- x2go/forward.py | 16 +- x2go/guardian.py | 2 +- x2go/mimebox.py | 8 +- x2go/mimeboxactions.py | 16 +- x2go/printactions.py | 24 ++-- x2go/printqueue.py | 10 +- x2go/pulseaudio.py | 2 +- x2go/registry.py | 2 +- x2go/sftpserver.py | 4 +- x2go/xserver.py | 4 +- 16 files changed, 305 insertions(+), 123 deletions(-) The diff of changes is: diff --git a/x2go/backends/control/_stdout.py b/x2go/backends/control/_stdout.py index 5470c3d..2c18b70 100644 --- a/x2go/backends/control/_stdout.py +++ b/x2go/backends/control/_stdout.py @@ -57,12 +57,14 @@ monkey_patch_paramiko() def _rerewrite_blanks(cmd): """\ - In command strings X2Go server scripts expects blanks being rewritten to ,,X2GO_SPACE_CHAR''. + In command strings X2Go server scripts expect blanks being rewritten to ,,X2GO_SPACE_CHAR''. + Commands get rewritten in the terminal sessions. This re-rewrite function helps + displaying command string in log output. - @param cmd: command that is to be sent to an X2Go server script + @param cmd: command that has to be rewritten for log output @type cmd: C{str} - @return: the command with blanks replaced by ,,X2GO_SPACE_CHAR'' + @return: the command with ,,X2GO_SPACE_CHAR'' re-replaced by blanks @rtype: C{str} """ @@ -642,7 +644,7 @@ class X2goControlSessionSTDOUT(paramiko.SSHClient): @type force_password_auth: C{bool} @param session_instance: an instance L{X2goSession} using this L{X2goControlSessionSTDOUT} instance. - @type session_instance: C{instance} + @type session_instance: C{obj} @param use_sshproxy: connect through an SSH proxy @type use_sshproxy: C{True} if an SSH proxy is to be used for tunneling the connection @param sshproxy_host: hostname of the SSH proxy server, use <hostname>:<port> to name a diff --git a/x2go/backends/printing/_file.py b/x2go/backends/printing/_file.py index cd56045..ba136da 100644 --- a/x2go/backends/printing/_file.py +++ b/x2go/backends/printing/_file.py @@ -85,7 +85,7 @@ class X2goClientPrintingFILE(inifiles.X2goIniFile): @type defaults: C{dict} @param logger: you can pass an L{X2goLogger} object to the L{X2goPrintAction} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} diff --git a/x2go/backends/printing/_gconf.py b/x2go/backends/printing/_gconf.py index 56984aa..11bc718 100644 --- a/x2go/backends/printing/_gconf.py +++ b/x2go/backends/printing/_gconf.py @@ -60,7 +60,7 @@ class X2goClientPrintingGCONF(inifiles.X2goIniFile): @type defaults: C{dict} @param logger: you can pass an L{X2goLogger} object to the L{X2goPrintAction} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} diff --git a/x2go/backends/printing/_winreg.py b/x2go/backends/printing/_winreg.py index b89c5b7..839be52 100644 --- a/x2go/backends/printing/_winreg.py +++ b/x2go/backends/printing/_winreg.py @@ -60,7 +60,7 @@ class X2goClientPrintingWINREG(inifiles.X2goIniFile): @type defaults: C{dict} @param logger: you can pass an L{X2goLogger} object to the L{X2goPrintAction} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} diff --git a/x2go/backends/terminal/_stdout.py b/x2go/backends/terminal/_stdout.py index 066db33..b1f1259 100644 --- a/x2go/backends/terminal/_stdout.py +++ b/x2go/backends/terminal/_stdout.py @@ -62,7 +62,19 @@ from x2go.backends.printing import X2goClientPrinting as _X2goClientPrinting _local_color_depth = utils.local_color_depth() def _rewrite_cmd(cmd, params=None): + """\ + Mechansim that rewrites X2Go server commands into something that gets understood by + the server-side script C{x2goruncommand}. + + @param cmd: the current command for execution (as found in the session profile parameter C{cmd}) + @type cmd: C{str} + @param params: an session paramter object + @type params: L{X2goSessionParams} + + @return: the rewritten command for server-side execution + @rtype: C{str} + """ # start with an empty string cmd = cmd or '' @@ -85,7 +97,18 @@ def _rewrite_cmd(cmd, params=None): return cmd + def _rewrite_blanks(cmd): + """\ + In command strings X2Go server scripts expect blanks being rewritten to ,,X2GO_SPACE_CHAR''. + + @param cmd: command that has to be rewritten for passing to the server + @type cmd: C{str} + + @return: the command with blanks rewritten to ,,X2GO_SPACE_CHAR'' + @rtype: C{str} + + """ # X2Go run command replace X2GO_SPACE_CHAR string with blanks if cmd: cmd = cmd.replace(" ", "X2GO_SPACE_CHAR") @@ -101,15 +124,16 @@ class X2goSessionParams(object): def rewrite_session_type(self): """\ Rewrite the X2Go session type, so that the X2Go server - can understand it (C{desktop} -> C{D}). + can understand it (C{desktop} -> C{D}, etc.). Also if the object's C{command} property is a known window manager, the session type will be set to 'D' (i.e. desktop). @return: 'D' if session should probably a desktop session, - 'R' (for rootless) else - @rtype: str + 'R' for rootless sessions, 'P' for sessions providing published + applications, and 'S' for desktop sharing sessions + @rtype: C{str} """ cmd = self.cmd @@ -139,7 +163,9 @@ class X2goSessionParams(object): elif self.session_type in ("P", "published", "published_applications"): self.session_type = 'P' - def update(self, properties_to_be_updated={}): + return self.session_type + + def update(self, **properties_to_be_updated): """\ Update all properties in the object L{X2goSessionParams} object from the passed on dictionary. @@ -147,7 +173,7 @@ class X2goSessionParams(object): @param properties_to_be_updated: a dictionary with L{X2goSessionParams} property names as keys und their values to be update in L{X2goSessionParams} object. - @type properties_to_be_updated: dict + @type properties_to_be_updated: C{dict} """ for key in properties_to_be_updated.keys(): @@ -157,28 +183,23 @@ class X2goSessionParams(object): class X2goTerminalSessionSTDOUT(object): """\ - Class for managing X2Go sessions on a remote X2Go server via Paramiko/SSH. + Class for managing X2Go terminal sessions on a remote X2Go server via Paramiko/SSH. + With the L{X2goTerminalSessionSTDOUT} class you can start new X2Go sessions, resume suspended sessions or suspend resp. terminate currently running sessions on a connected X2Go server. - When suspending or terminating sessions there are two possible ways: - - 1. Initialize an X2Go session object, start a new session (or resume) - and use the L{X2goTerminalSessionSTDOUT.suspend()} or L{X2goTerminalSessionSTDOUT.terminate()} method - to suspend/terminate the current session object. - 2. Alternatively, you can pass a session name to L{X2goTerminalSessionSTDOUT.suspend()} - or L{X2goTerminalSessionSTDOUT.terminate()}. If a session of this name exists on the - X2Go server the respective action will be performed on the session. - - An L{X2goTerminalSessionSTDOUT} object uses two main data structure classes: + An L{X2goTerminalSessionSTDOUT} object uses two main data structure classes: - L{X2goSessionParams}: stores all parameters that have been passed to the constructor method. - - C{X2goServerSessionInfo} backend class: when starting or resuming a session, an object of this class + - C{X2goServerSessionInfo*} backend class: when starting or resuming a session, an object of this class will be used to store all information retrieved from the X2Go server. + The terminal session instance works closely together (i.e. depends on) a connected control + session instance (e.g. L{X2goControlSessionSTDOUT}). You never should use either of them as a standalone + instance. Both, control session and terminal session(s) get managed/controlled via L{X2goSession} instances. """ def __init__(self, control_session, session_info=None, @@ -233,26 +254,58 @@ class X2goTerminalSessionSTDOUT(object): @param snd_system: sound system to be used on server (C{none}, C{pulse} (default), C{arts} (obsolete) or C{esd}) @type snd_system: C{str} + @param snd_port: local sound port for network capable audio system + @type snd_port: C{int} @param cmd: command to be run on X2Go server after session start (only used when L{X2goTerminalSessionSTDOUT.start()} is called, ignored on resume, suspend etc. @type cmd: C{str} + @param published_applications: session is published applications provider + @type published_applications: C{bool} + @param set_session_title: modify the session title (i.e. the Window title) of desktop or shared desktop sessions + @type set_session_title: C{bool} + @param session_title: session title for this (desktop or shared desktop) session + @type session_title: C{str} + @param applications: applications available for rootless application execution + @type applications: C{list} + @param rdp_server: host name of server-side RDP server + @type rdp_server: C{str} + @param rdp_options: options for the C{rdesktop} command executed on the X2Go server (RDP proxy mode of X2Go) + @type rdp_options: C{str} + @param xdmcp_server: XDMCP server to connect to + @type xdmcp_server: C{str} + @param convert_encoding: convert file system encodings between server and client (for client-side shared folders) + @type convert_encoding: C{bool} + @param server_encoding: server-side file system / session encoding + @type server_encoding: C{str} + @param client_encoding: client-side file system encoding (if client-side is MS Windows, this parameter gets overwritten to WINDOWS-1252) + @type client_encoding: C{str} @param rootdir: X2Go session directory, normally C{~/.x2go} @type rootdir: C{str} - @param info_backend: backend for handling storage of server session information - @type info_backend: C{X2goServerSessionInfo*} instance - @param list_backend: backend for handling storage of session list information - @type list_backend: C{X2goServerSessionList*} instance - @param proxy_backend: backend for handling the X-proxy connections - @type proxy_backend: C{X2goProxy*} instance + @param profile_name: the session profile name for this terminal session + @type profile_name: C{str} + @param profile_id: the session profile ID for this terminal session + @type profile_id: C{str} @param print_action: either a print action short name (PDFVIEW, PDFSAVE, PRINT, PRINTCMD) or the resp. C{X2goPrintActionXXX} class (where XXX equals one of the given short names) @type print_action: C{str} or C{class} @param print_action_args: optional arguments for a given print_action (for further info refer to L{X2goPrintActionPDFVIEW}, L{X2goPrintActionPDFSAVE}, L{X2goPrintActionPRINT} and L{X2goPrintActionPRINTCMD}) @type print_action_args: dict + @param info_backend: backend for handling storage of server session information + @type info_backend: C{X2goServerSessionInfo*} instance + @param list_backend: backend for handling storage of session list information + @type list_backend: C{X2goServerSessionList*} instance + @param proxy_backend: backend for handling the X-proxy connections + @type proxy_backend: C{X2goProxy*} instance @param proxy_options: a set of very C{X2goProxy*} backend specific options; any option that is not known to the C{X2goProxy*} backend will simply be ignored @type proxy_options: C{dict} + @param client_rootdir: client base dir (default: ~/.x2goclient) + @type client_rootdir: C{str} + @param sessions_rootdir: sessions base dir (default: ~/.x2go) + @type sessions_rootdir: C{str} + @param session_instance: the L{X2goSession} instance that is parent to this terminal session + @type session_instance: C{obj} @param logger: you can pass an L{X2goLogger} object to the L{X2goTerminalSessionSTDOUT} constructor @type logger: L{X2goLogger} instance @@ -344,10 +397,21 @@ class X2goTerminalSessionSTDOUT(object): self._cleaned_up = False def __del__(self): + """\ + Tidy up if terminal session gets destructed. + + """ self._x2go_tidy_up() def _x2go_tidy_up(self): + """\ + Tidy up this terminal session... + - shutdown all forwarding and reverse forwarding tunnels + - shutdown the print queue (if running) + - shutdown the MIME box queue (if running) + - clear the session info + """ self.release_proxy() try: @@ -371,10 +435,16 @@ class X2goTerminalSessionSTDOUT(object): self.session_info.clear() - def _mk_sessions_rootdir(self, d): + def _mk_sessions_rootdir(self, rootdir): + """\ + Create the server-side session root dir (normally ~/.x2go). + + @param rootdir: server-side session root directory + @type rootdir: C{str} + """ try: - os.makedirs(d) + os.makedirs(rootdir) except OSError, e: if e.errno == 17: # file exists @@ -383,39 +453,57 @@ class X2goTerminalSessionSTDOUT(object): raise OSError, e def _rm_session_dirtree(self): + """\ + Purge client-side session dir (session cache directory). + """ if self.session_info.name: shutil.rmtree('%s/S-%s' % (self.params.rootdir, self.session_info), ignore_errors=True) def _rm_desktop_dirtree(self): + """\ + Purge client-side session dir (C-<display> directory) + """ if self.session_info.display: shutil.rmtree('%s/S-%s' % (self.params.rootdir, self.session_info.display), ignore_errors=True) def get_session_name(self): """\ - STILL UNDOCUMENTED + Retrieve the X2Go session's name from the session info object. + + @return: the session name + @rtype: C{str} """ return self.session_info.name def get_session_info(self): """\ - STILL UNDOCUMENTED + Retrieve the X2Go session's session info object. + + @return: the session info object + @rtype: C{X2goServerSessionInfo*} """ return self.session_info def get_session_cmd(self): """\ - STILL UNDOCUMENTED + Retrieve the X2Go session's command as stored in the session parameter object. + + @return: the session command + @rtype: C{str} """ return self.params.cmd def get_session_type(self): """\ - STILL UNDOCUMENTED + Retrieve the X2Go session's session type as stored in the session parameter object. + + @return: the session type + @rtype: C{str} """ return self.params.session_type @@ -427,7 +515,9 @@ class X2goTerminalSessionSTDOUT(object): Currently supported audio protocols: - PulseAudio - - Esound + - Esound (not tested very much) + + @raise X2goControlSessionException: if the control session of this terminal session is not connected """ _tunnel = None @@ -520,7 +610,13 @@ class X2goTerminalSessionSTDOUT(object): self.reverse_tunnels[self.session_info.name]['sshfs'][1].resume() def _x2go_pause_rev_fw_tunnel(self, name): - # pause reverse SSH tunnel of name <name> + """\ + Pause reverse SSH tunnel of name <name>. + + @param name: tunnel name (either of C{sshfs}, C{snd}) + @type name: C{str} + + """ _tunnel = self.reverse_tunnels[self.session_info.name][name][1] if _tunnel is not None: _tunnel.pause() @@ -543,6 +639,8 @@ class X2goTerminalSessionSTDOUT(object): """\ Initialize X2Go print spooling. + @raise X2goUserException: if the X2Go printing feature is not available to this user + """ if not self.control_session.is_sshfs_available(): raise x2go_exceptions.X2goUserException('Remote user %s is not allowed to use client-side printing.' % self.session_info.username) @@ -565,7 +663,14 @@ class X2goTerminalSessionSTDOUT(object): def set_print_action(self, print_action, **kwargs): """\ - STILL UNDOCUMENTED + Set a print action for the next incoming print jobs. + + This method is a wrapper for L{X2goPrintQueue}C{.set_print_action()}. + + @param print_action: print action name or object (i.e. an instance of C{X2goPrintAction*} classes) + @type print_action: C{str} or C{X2goPrintAction*} + @param kwargs: print action specific parameters + @type kwargs: dict """ self.print_queue.set_print_action(print_action, logger=self.logger, **kwargs) @@ -582,12 +687,22 @@ class X2goTerminalSessionSTDOUT(object): """\ Return the server-side printing spooldir path. + @return: the directory for remote print job spooling + @rtype: C{str} + """ return '%s/%s' % (self.session_info.remote_container, 'spool') def start_mimebox(self, mimebox_extensions=[], mimebox_action=None): """\ - Initialize X2Go mimebox handling. + Initialize the X2Go MIME box. Open/process incoming files from the server-side locally. + + @param mimebox_extensions: file name extensions that are allowed for local opening/processing + @type mimebox_extensions: C{list} + @param mimebox_action: MIME box action given as name or object (i.e. an instance of C{X2goMIMEboxAction*} classes). + @type mimebox_action: C{str} or C{obj} + + @raise X2goUserException: if the X2Go MIME box feature is not available to this user """ if not self.control_session.is_sshfs_available(): @@ -610,7 +725,14 @@ class X2goTerminalSessionSTDOUT(object): def set_mimebox_action(self, mimebox_action, **kwargs): """\ - STILL UNDOCUMENTED + Set a MIME box action for the next incoming MIME jobs. + + This method is a wrapper for L{X2goMIMEboxQueue}C{set_mimebox_action()}. + + @param mimebox_action: MIME box action name or object (i.e. an instance of C{X2goMIMEboxAction*} classes) + @type mimebox_action: C{str} or C{X2goMIMEboxAction*} + @param kwargs: MIME box action specific parameters + @type kwargs: dict """ self.mimebox_queue.set_mimebox_action(mimebox_action, logger=self.logger, **kwargs) @@ -625,7 +747,10 @@ class X2goTerminalSessionSTDOUT(object): def get_mimebox_spooldir(self): """\ - Return the server-side mimebox spooldir path. + Return the server-side MIME box spooldir path. + + @return: the directory where remote MIME box jobs are placed + @rtype: C{str} """ return '%s/%s' % (self.session_info.remote_container, 'mimebox') @@ -634,7 +759,7 @@ class X2goTerminalSessionSTDOUT(object): """\ Test if this terminal's session info object is write-protected. - @return: Boolean expression for being read-only or read-write. + @return: C{True}, if session info object is read-only, C{False} for read-write. @rtype: C{bool} """ @@ -668,6 +793,9 @@ class X2goTerminalSessionSTDOUT(object): @return: returns C{True} if the local folder has been successfully mounted within the X2Go server session @rtype: C{bool} + @raise X2goUserException: if local folder sharing is not available to this user + @raise Exception: any other exception occuring on the way is passed through by this method + """ if not self.control_session.is_sshfs_available(): raise x2go_exceptions.X2goUserException('Remote user %s is not allowed to share local folders with the server.' % self.session_info.username) @@ -828,7 +956,16 @@ class X2goTerminalSessionSTDOUT(object): return self.params.depth def auto_session_window_title(self, dont_set=False): + """\ + Automatically generate an appropriate human-readable session window title. + + The session window title will be provider in the C{session_title} property of + this method. + @param dont_set: generate the session window title, but do not actually set it + @type dont_set: C{bool} + + """ _generic_title = 'X2GO-%s' % self.session_info.name # no blanks at beginning or end, no blanks-only... @@ -856,6 +993,8 @@ class X2goTerminalSessionSTDOUT(object): Try for <timeout> seconds to find the X2Go session window of this terminal session. + A background thread will get spawned for this operation. + @param timeout: try for <timeout> seconds to find the session window @type timeout: C{int} @@ -863,7 +1002,14 @@ class X2goTerminalSessionSTDOUT(object): gevent.spawn(self._find_session_window, timeout=timeout) def _find_session_window(self, timeout=0): + """\ + Try for <timeout> seconds to find the X2Go session window of this + terminal session. + @param timeout: try for <timeout> seconds to find the session window + @type timeout: C{int} + + """ self.session_window = None # search for the window of our focus, do this in a loop till the window as been found @@ -883,11 +1029,11 @@ class X2goTerminalSessionSTDOUT(object): def set_session_window_title(self, title, timeout=30): """\ - Modify session window title. If the session ID does not occur in the - given title, it will be prepended, so that every X2Go session window - always contains the X2Go session ID of that window. + Modify the session window title. + + A background thread will get spawned for this operation. - @param title: new title for session window + @param title: new title for the terminal session's session window @type title: C{str} @param timeout: try for <timeout> seconds to find the session window @type timeout: C{int} @@ -896,7 +1042,15 @@ class X2goTerminalSessionSTDOUT(object): gevent.spawn(self._set_session_window_title, title=title.strip(), timeout=timeout) def _set_session_window_title(self, title, timeout=0): + """\ + Modify the session window title. + @param title: new title for the terminal session's session window + @type title: C{str} + @param timeout: try for <timeout> seconds to find the session window + @type timeout: C{int} + + """ self.session_title = title if not self.session_title: @@ -915,14 +1069,26 @@ class X2goTerminalSessionSTDOUT(object): def raise_session_window(self, timeout=30): """\ - Try to lift the session window above all other windows and bring - it to focus. + Try for <timeout> seconds to raise the X2Go session window of this + terminal session to the top and bring it to focus. + + A background thread will get spawned for this operation. + + @param timeout: try for <timeout> seconds to raise the session window + @type timeout: C{int} """ gevent.spawn(self._raise_session_window, timeout=timeout) def _raise_session_window(self, timeout=0): + """ + Try for <timeout> seconds to raise the X2Go session window of this + terminal session to the top and bring it to focus. + @param timeout: try for <timeout> seconds to raise the session window + @type timeout: C{int} + + """ timeout += 1 while timeout: @@ -937,7 +1103,15 @@ class X2goTerminalSessionSTDOUT(object): def has_command(self, cmd): """\ - Verify if the command <cmd> exists on the X2Go server. + ,,Guess'' if the command C{<cmd>} exists on the X2Go server and is executable. + The expected result is not 100% safe, however, it comes with a high probability to + be correct. + + @param cmd: session command + @type cmd: C{str} + + @return: C{True} if this method reckons that the command is executable on the remote X2Go server + @rtype: C{bool} """ test_cmd = None; @@ -978,6 +1152,8 @@ class X2goTerminalSessionSTDOUT(object): @param cmd: Command to be run @type cmd: C{str} + @param env: add server-side environment variables + @type env: C{dict} @return: stdout.read() and stderr.read() as returned by the run command on the X2Go server @@ -1003,7 +1179,7 @@ class X2goTerminalSessionSTDOUT(object): # do not run command when in DESKTOP SHARING mode... return None - self.params.update({'cmd': cmd}) + self.params.update(cmd=cmd) # do not allow the execution of full path names if '/' in cmd: @@ -1036,7 +1212,7 @@ class X2goTerminalSessionSTDOUT(object): def is_desktop_session(self): """\ - Returns true if this session is a desktop session. + Is this (terminal) session a desktop session? @return: Returns C{True} is this session is a desktop session. @rtype: C{bool} @@ -1048,7 +1224,7 @@ class X2goTerminalSessionSTDOUT(object): def is_published_applications_provider(self): """\ - Returns true if this session runs in published applications mode. + Is this (terminal) session a published applications provider? @return: Returns C{True} is this session is a provider session for published applications. @rtype: C{bool} @@ -1071,6 +1247,9 @@ class X2goTerminalSessionSTDOUT(object): @rtype: C{bool} """ + if not self.is_running(): + return False + cmd_line = [ 'export DISPLAY=:%s && ' % str(self.session_info.display), 'setxkbmap ' ] @@ -1127,10 +1306,10 @@ class X2goTerminalSessionSTDOUT(object): def ok(self): """\ - Returns C{True} if this X2Go session is up and running, - C{False} else + X2Go session OK? - @return: X2Go session OK? + @return: Returns C{True} if this X2Go (terminal) session is up and running, + C{False} otherwise. @rtype: C{bool} """ @@ -1139,10 +1318,10 @@ class X2goTerminalSessionSTDOUT(object): def is_running(self): """\ - Returns C{True} if this X2Go session is in running state, - C{False} else. + X2Go session running? - @return: X2Go session running? + @return: Returns C{True} if this X2Go (terminal) session is in running state, + C{False} otherwise. @rtype: C{bool} """ @@ -1150,10 +1329,10 @@ class X2goTerminalSessionSTDOUT(object): def is_suspended(self): """\ - Returns C{True} if this X2Go session is in suspended state, - C{False} else. + X2Go session suspended? - @return: X2Go session suspended? + @return: Returns C{True} if this X2Go (terminal) session is in suspended state, + C{False} otherwise. @rtype: C{bool} """ @@ -1161,10 +1340,10 @@ class X2goTerminalSessionSTDOUT(object): def is_connected(self): """\ - Returns C{True} if this X2Go session's Paramiko/SSH transport is - connected/authenticated, C{False} else. + X2Go session connected? - @return: X2Go session connected? + @return: Returns C{True} if this X2Go session's Paramiko/SSH transport is + connected/authenticated, C{False} else. @rtype: C{bool} """ @@ -1174,8 +1353,10 @@ class X2goTerminalSessionSTDOUT(object): """\ Start a new X2Go session. - The L{X2goTerminalSession.start()} method accepts any parameter - that can be passed to the class constructor. + @return: C{True} if session startup has been successful and the X2Go proxy is up-and-running + @rtype: C{bool} + + @raise X2goTerminalSessionException: if the session startup failed """ self.params.rewrite_session_type() @@ -1265,12 +1446,11 @@ class X2goTerminalSessionSTDOUT(object): """\ Resume a running/suspended X2Go session. - The L{X2goTerminalSessionSTDOUT.resume()} method accepts any parameter - that can be passed to the class constructor. - - @return: True if the session could be successfully resumed + @return: C{True} if the session could successfully be resumed @rtype: C{bool} + @raise X2goTerminalSessionException: if the terminal session failed to update server-side reported port changes + """ setkbd = "0" if self.params.kbtype != "null/null": @@ -1349,9 +1529,9 @@ class X2goTerminalSessionSTDOUT(object): def suspend(self): """\ - Suspend this X2Go session terminal. + Suspend this X2Go (terminal) session. - @return: True if the session terminal could be successfully suspended + @return: C{True} if the session terminal could be successfully suspended @rtype: C{bool} """ @@ -1365,9 +1545,9 @@ class X2goTerminalSessionSTDOUT(object): def terminate(self): """\ - Terminate this X2Go session. + Terminate this X2Go (terminal) session. - @return: True if the session terminal could be successfully terminate + @return: C{True} if the session could be successfully terminated @rtype: C{bool} """ @@ -1383,7 +1563,7 @@ class X2goTerminalSessionSTDOUT(object): def release_proxy(self): """\ - STILL UNDOCUMENTED + Let the X2Go proxy command cleanly die away... (by calling its destructor). """ if self.proxy is not None: @@ -1391,7 +1571,7 @@ class X2goTerminalSessionSTDOUT(object): def post_terminate_cleanup(self): """\ - STILL UNDOCUMENTED + Do some cleanup after this session has terminated. """ # this method might be called twice (directly and from update_status in the session diff --git a/x2go/cache.py b/x2go/cache.py index 1f34945..2b6f9ec 100644 --- a/x2go/cache.py +++ b/x2go/cache.py @@ -53,9 +53,9 @@ class X2goListSessionsCache(object): def __init__(self, client_instance, logger=None, loglevel=log.loglevel_DEFAULT): """\ @param client_instance: the L{X2goClient} instance that uses this L{X2goListSessionsCache} - @type client_instance: C{instance} + @type client_instance: C{obj} @param logger: you can pass an L{X2goLogger} object to the L{X2goListSessionsCache} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} diff --git a/x2go/forward.py b/x2go/forward.py index b10e86f..b382bee 100644 --- a/x2go/forward.py +++ b/x2go/forward.py @@ -55,10 +55,10 @@ class X2goFwServer(StreamServer): @param remote_port: port of remote host @type remote_port: C{int} @param ssh_transport: a valid Paramiko/SSH transport object - @type ssh_transport: C{instance} + @type ssh_transport: C{obj} @param logger: you can pass an L{X2goLogger} object to the L{X2goFwServer} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} @@ -88,7 +88,7 @@ class X2goFwServer(StreamServer): Handle for SSH/Paramiko forwarding tunnel. @param fw_socket: local end of the forwarding tunnel - @type fw_socket: C{instance} + @type fw_socket: C{obj} @param address: unused/ignored @type address: C{tuple} @@ -232,14 +232,14 @@ def start_forward_tunnel(local_host='127.0.0.1', local_port=22022, @param remote_port: ... on port C{<remote_port>} @type remote_port: C{int} @param ssh_transport: the Paramiko/SSH transport (i.e. the X2Go sessions Paramiko/SSH transport object) - @type ssh_transport: C{instance} + @type ssh_transport: C{obj} @param session_instance: the L{X2goSession} instance that initiates this tunnel - @type session_instance: C{instance} + @type session_instance: C{obj} @param logger: an X2goLogger object - @type logger: C{instance} + @type logger: C{obj} @return: returns an L{X2goFwServer} instance - @rtype: C{instance} + @rtype: C{obj} """ fw_server = X2goFwServer(listener=(local_host, local_port), @@ -261,7 +261,7 @@ def stop_forward_tunnel(fw_server): Tear down a given Paramiko/SSH port forwarding tunnel. @param fw_server: an L{X2goFwServer} instance as returned by the L{start_forward_tunnel()} function - @type fw_server: C{instance} + @type fw_server: C{obj} """ if fw_server is not None: diff --git a/x2go/guardian.py b/x2go/guardian.py index 897cce1..927811d 100644 --- a/x2go/guardian.py +++ b/x2go/guardian.py @@ -67,7 +67,7 @@ class X2goSessionGuardian(threading.Thread): @param refresh_interval: refresh cache and session registry every <refresh_interval> seconds @type refresh_interval: C{int} @param logger: you can pass an L{X2goLogger} object to the L{X2goSessionGuardian} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} diff --git a/x2go/mimebox.py b/x2go/mimebox.py index 7ac56c4..c424047 100644 --- a/x2go/mimebox.py +++ b/x2go/mimebox.py @@ -68,10 +68,10 @@ class X2goMIMEboxQueue(threading.Thread): @param mimebox_action: name or instance of either of the possible X2Go print action classes @type mimebox_action: C{str} or instance @param client_instance: the underlying L{X2goClient} instance - @type client_instance: C{instance} + @type client_instance: C{obj} @param logger: you can pass an L{X2goLogger} object to the L{X2goPrintQueue} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} @@ -220,9 +220,9 @@ def x2go_mimeboxjob_handler(mimebox_file=None, @param mimebox_action: an instance of either of the possible C{X2goMIMEboxActionXXX} classes @type mimebox_action: C{X2goMIMEboxActionXXX} nstance @param parent_thread: the L{X2goMIMEboxQueue} thread that actually created this handler's L{X2goMIMEboxJob} instance - @type parent_thread: C{instance} + @type parent_thread: C{obj} @param logger: the L{X2goMIMEboxQueue}'s logging instance - @type logger: C{instance} + @type logger: C{obj} """ mimebox_action.profile_name = parent_thread.profile_name diff --git a/x2go/mimeboxactions.py b/x2go/mimeboxactions.py index 217146b..5a2f0f4 100644 --- a/x2go/mimeboxactions.py +++ b/x2go/mimeboxactions.py @@ -57,10 +57,10 @@ class X2goMIMEboxAction(object): class by »real« X2Go MIME box actions. @param client_instance: the underlying L{X2goClient} instance - @type client_instance: C{instance} + @type client_instance: C{obj} @param logger: you can pass an L{X2goLogger} object to the L{X2goMIMEboxAction} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} @@ -134,10 +134,10 @@ class X2goMIMEboxActionOPEN(X2goMIMEboxAction): def __init__(self, client_instance=None, logger=None, loglevel=log.loglevel_DEFAULT): """\ @param client_instance: the underlying L{X2goClient} instance - @type client_instance: C{instance} + @type client_instance: C{obj} @param logger: you can pass an L{X2goLogger} object to the L{X2goMIMEboxActionOPEN} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} @@ -192,10 +192,10 @@ class X2goMIMEboxActionOPENWITH(X2goMIMEboxAction): def __init__(self, client_instance=None, logger=None, loglevel=log.loglevel_DEFAULT): """\ @param client_instance: the underlying L{X2goClient} instance - @type client_instance: C{instance} + @type client_instance: C{obj} @param logger: you can pass an L{X2goLogger} object to the L{X2goMIMEboxActionOPENWITH} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} @@ -252,10 +252,10 @@ class X2goMIMEboxActionSAVEAS(X2goMIMEboxAction): @param client_instance: an L{X2goClient} instance, within your customized L{X2goClient} make sure you have a C{HOOK_open_mimebox_saveas_dialog(filename=<str>)} method defined that will actually handle the incoming mimebox file. - @type client_instance: C{instance} + @type client_instance: C{obj} @param logger: you can pass an L{X2goLogger} object to the L{X2goMIMEboxActionSAVEAS} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} diff --git a/x2go/printactions.py b/x2go/printactions.py index 91faa81..1def760 100644 --- a/x2go/printactions.py +++ b/x2go/printactions.py @@ -66,10 +66,10 @@ class X2goPrintAction(object): class by »real« X2Go print actions. @param client_instance: the underlying L{X2goClient} instance - @type client_instance: C{instance} + @type client_instance: C{obj} @param logger: you can pass an L{X2goLogger} object to the L{X2goPrintAction} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} @@ -172,12 +172,12 @@ class X2goPrintActionPDFVIEW(X2goPrintAction): def __init__(self, client_instance=None, pdfview_cmd=None, logger=None, loglevel=log.loglevel_DEFAULT): """\ @param client_instance: the underlying L{X2goClient} instance - @type client_instance: C{instance} + @type client_instance: C{obj} @param pdfview_cmd: command that starts the external PDF viewer application @type pdfview_cmd: C{str} @param logger: you can pass an L{X2goLogger} object to the L{X2goPrintActionPDFVIEW} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} @@ -250,12 +250,12 @@ class X2goPrintActionPDFSAVE(X2goPrintAction): def __init__(self, client_instance=None, save_to_folder=None, logger=None, loglevel=log.loglevel_DEFAULT): """\ @param client_instance: the underlying L{X2goClient} instance - @type client_instance: C{instance} + @type client_instance: C{obj} @param save_to_folder: saving location for incoming print jobs (PDF files) @type save_to_folder: C{str} @param logger: you can pass an L{X2goLogger} object to the L{X2goPrintActionPDFSAVE} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} @@ -305,12 +305,12 @@ class X2goPrintActionPRINT(X2goPrintAction): def __init__(self, client_instance=None, printer=None, logger=None, loglevel=log.loglevel_DEFAULT): """\ @param client_instance: the underlying L{X2goClient} instance - @type client_instance: C{instance} + @type client_instance: C{obj} @param printer: name of the preferred printer, if C{None} the system's/user's default printer will be used @type printer: C{str} @param logger: you can pass an L{X2goLogger} object to the L{X2goPrintActionPRINT} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} @@ -434,12 +434,12 @@ class X2goPrintActionPRINTCMD(X2goPrintAction): def __init__(self, client_instance=None, print_cmd=None, logger=None, loglevel=log.loglevel_DEFAULT): """\ @param client_instance: the underlying L{X2goClient} instance - @type client_instance: C{instance} + @type client_instance: C{obj} @param print_cmd: external command to be called on incoming print jobs @type print_cmd: C{str} @param logger: you can pass an L{X2goLogger} object to the L{X2goPrintActionPRINTCMD} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} @@ -496,10 +496,10 @@ class X2goPrintActionDIALOG(X2goPrintAction): @param client_instance: an L{X2goClient} instance, within your customized L{X2goClient} make sure you have a C{HOOK_open_print_dialog(filename=<str>)} method defined that will actually open the print dialog. - @type client_instance: C{instance} + @type client_instance: C{obj} @param logger: you can pass an L{X2goLogger} object to the L{X2goPrintActionDIALOG} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} diff --git a/x2go/printqueue.py b/x2go/printqueue.py index 0fb8d4d..cbf7403 100644 --- a/x2go/printqueue.py +++ b/x2go/printqueue.py @@ -77,12 +77,12 @@ class X2goPrintQueue(threading.Thread): values; the C{print_action_args} will be passed on to the X2Go print action instance constructor, so refer to either of these: L{X2goPrintActionPDFVIEW}, L{X2goPrintActionPRINT} et al. @param client_instance: the underlying L{X2goClient} instance - @type client_instance: C{instance} + @type client_instance: C{obj} @param printing_backend: the client printing configuration backend class - @type printing_backend: C{instance} + @type printing_backend: C{obj} @param logger: you can pass an L{X2goLogger} object to the L{X2goPrintQueue} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} @@ -235,9 +235,9 @@ def x2go_printjob_handler(job_file=None, pdf_file=None, job_title=None, print_ac @param print_action: an instance of either of the possible C{X2goPrintActionXXX} classes @type print_action: C{X2goPrintActionXXX} nstance @param parent_thread: the L{X2goPrintQueue} thread that actually created this handler's L{X2goPrintJob} instance - @type parent_thread: C{instance} + @type parent_thread: C{obj} @param logger: the L{X2goPrintQueue}'s logging instance - @type logger: C{instance} + @type logger: C{obj} """ if print_action is None: diff --git a/x2go/pulseaudio.py b/x2go/pulseaudio.py index 6930bec..08b599e 100644 --- a/x2go/pulseaudio.py +++ b/x2go/pulseaudio.py @@ -63,7 +63,7 @@ class X2goPulseAudio(threading.Thread): @param client_instance: the calling L{X2goClient} instance @type client_instance: L{X2goClient} instance @param logger: you can pass an L{X2goLogger} object to the L{X2goClientXConfig} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} diff --git a/x2go/registry.py b/x2go/registry.py index fbbb44c..f9bf5ad 100644 --- a/x2go/registry.py +++ b/x2go/registry.py @@ -59,7 +59,7 @@ class X2goSessionRegistry(object): @param client_instance: the L{X2goClient} instance that instantiated this L{X2goSessionRegistry} instance. @type client_instance: L{X2goClient} instance @param logger: you can pass an L{X2goLogger} object to the L{X2goClientXConfig} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} diff --git a/x2go/sftpserver.py b/x2go/sftpserver.py index 1ddf617..839f664 100644 --- a/x2go/sftpserver.py +++ b/x2go/sftpserver.py @@ -58,7 +58,7 @@ class _SSHServer(paramiko.ServerInterface): @param session_instance: the calling L{X2goSession} instance @type session_instance: L{X2goSession} instance @param logger: you can pass an L{X2goLogger} object to the L{X2goClientXConfig} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} @@ -163,7 +163,7 @@ class _SFTPServerInterface(paramiko.SFTPServerInterface): @param chroot: chroot environment for this SFTP interface @type chroot: C{str} @param logger: you can pass an L{X2goLogger} object to the L{X2goClientXConfig} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} diff --git a/x2go/xserver.py b/x2go/xserver.py index de0c1cb..edcb596 100644 --- a/x2go/xserver.py +++ b/x2go/xserver.py @@ -72,7 +72,7 @@ class X2goClientXConfig(inifiles.X2goIniFile): @param defaults: a Python dictionary with configuration file defaults (use on your own risk) @type defaults: C{dict} @param logger: you can pass an L{X2goLogger} object to the L{X2goClientXConfig} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} @@ -256,7 +256,7 @@ class X2goXServer(threading.Thread): @param xserver_config: XServer configuration node (as derived from L{X2goClientXConfig.get_xserver_config()} @type xserver_config: C{dict} @param logger: you can pass an L{X2goLogger} object to the L{X2goClientXConfig} constructor - @type logger: C{instance} + @type logger: C{obj} @param loglevel: if no L{X2goLogger} object has been supplied a new one will be constructed with the given loglevel @type loglevel: C{int} 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).