Package x2go :: Module guardian
[frames] | no frames]

Source Code for Module x2go.guardian

  1  # -*- coding: utf-8 -*- 
  2   
  3  # Copyright (C) 2010-2011 by Mike Gabriel <mike.gabriel@das-netzwerkteam.de> 
  4  # 
  5  # Python X2go is free software; you can redistribute it and/or modify 
  6  # it under the terms of the GNU General Public License as published by 
  7  # the Free Software Foundation; either version 3 of the License, or 
  8  # (at your option) any later version. 
  9  # 
 10  # Python X2go is distributed in the hope that it will be useful, 
 11  # but WITHOUT ANY WARRANTY; without even the implied warranty of 
 12  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 13  # GNU General Public License for more details. 
 14  # 
 15  # You should have received a copy of the GNU General Public License 
 16  # along with this program; if not, write to the 
 17  # Free Software Foundation, Inc., 
 18  # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. 
 19   
 20  """\ 
 21  X2goSessionGuardian class - a guardian thread that controls X2go session threads 
 22  and their sub-threads (like reverse forwarding tunnels, Paramiko transport threads, 
 23  etc.). 
 24   
 25  """ 
 26  __NAME__ = 'x2goguardian-pylib' 
 27   
 28  # modules 
 29  import gevent 
 30  import threading 
 31  import copy 
 32   
 33  # Python X2go modules 
 34  from cleanup import x2go_cleanup 
 35  import x2go_exceptions 
 36  import log 
 37   
 38  _sigterm_received = False 
39 -def _sigterm_handle(s, f):
40 global _sigterm_received 41 _sigterm_received = True 42 return 0
43
44 -class X2goSessionGuardian(threading.Thread):
45 """\ 46 L{X2goSessionGuardian} thread controls X2go session threads and their sub-threads (like 47 reverse forwarding tunnels, Paramiko transport threads, etc.). Its main function is 48 to tidy up once a session gets interrupted (SIGTERM, SIGINT). 49 50 There is one L{X2goSessionGuardian} for each L{X2goClient} instance (thus: for normal 51 setups there should be _one_ L{X2goClient} and _one_ L{X2goSessionGuardian} in use). 52 53 """ 54
55 - def __init__(self, client_instance, 56 auto_update_listsessions_cache=False, 57 auto_update_listdesktops_cache=False, 58 auto_update_sessionregistry=False, 59 auto_register_sessions=False, 60 refresh_interval=5, 61 logger=None, loglevel=log.loglevel_DEFAULT):
62 """\ 63 @param auto_update_listsessions_cache: let L{X2goSessionGuardian} refresh the session list cache for all L{X2goSession} objects 64 @type auto_update_listsessions_cache: C{bool} 65 @param auto_update_listdesktops_cache: let L{X2goSessionGuardian} refresh desktop lists in the session list cache for all L{X2goSession} objects 66 @type auto_update_listdesktops_cache: C{bool} 67 @param auto_update_sessionregistry: if set to C{True} the session status will be updated in regular intervals 68 @type auto_update_sessionregistry: C{bool} 69 @param auto_register_sessions: register new sessions automatically once they appear in the X2go session (e.g. 70 instantiated by another client that is connected to the same X2go server under same user ID) 71 @type auto_register_sessions: C{bool} 72 @param refresh_interval: refresh cache and session registry every <refresh_interval> seconds 73 @type refresh_interval: C{int} 74 @param logger: you can pass an L{X2goLogger} object to the L{X2goSessionGuardian} constructor 75 @type logger: C{instance} 76 @param loglevel: if no L{X2goLogger} object has been supplied a new one will be 77 constructed with the given loglevel 78 @type loglevel: C{int} 79 80 """ 81 if logger is None: 82 self.logger = log.X2goLogger(loglevel=loglevel) 83 else: 84 self.logger = copy.deepcopy(logger) 85 self.logger.tag = __NAME__ 86 87 self.client_instance = client_instance 88 self.auto_update_listsessions_cache = auto_update_listsessions_cache 89 self.auto_update_listdesktops_cache = auto_update_listdesktops_cache 90 self.auto_update_sessionregistry = auto_update_sessionregistry 91 self.auto_register_sessions = auto_register_sessions 92 self.refresh_interval = refresh_interval 93 94 threading.Thread.__init__(self, target=self.guardian) 95 self.daemon = True 96 self.start()
97
98 - def guardian(self):
99 """\ 100 The handler of this L{X2goSessionGuardian} thread. 101 102 """ 103 global _sigterm_received 104 105 seconds = 0 106 self._keepalive = True 107 while not _sigterm_received and self._keepalive: 108 gevent.sleep(1) 109 seconds += 1 110 111 if seconds % self.refresh_interval == 0: 112 113 self.logger('Entering X2go Guardian client management loop...', loglevel=log.loglevel_DEBUG) 114 115 116 if self.auto_update_listsessions_cache: 117 self.client_instance.update_cache_all_profiles(update_sessions=self.auto_update_listsessions_cache, 118 update_desktops=self.auto_update_listdesktops_cache, 119 ) 120 121 if self.auto_update_sessionregistry and not self.auto_register_sessions: 122 self.client_instance.update_sessionregistry_status_all_profiles() 123 124 # session auto-registration will automatically trigger an update of the session registry status 125 if self.auto_register_sessions: 126 self.client_instance.register_available_server_sessions_all_profiles() 127 128 self.logger('X2go session guardian thread waking up after %s seconds' % seconds, loglevel=log.loglevel_DEBUG) 129 130 for session_uuid in self.client_instance.session_registry.keys(): 131 session_summary = self.client_instance.get_session_summary(session_uuid) 132 self.logger('calling session cleanup on profile %s for terminal session: %s' % (session_summary['profile_name'], session_summary['session_name']), loglevel=log.loglevel_DEBUG) 133 x2go_cleanup(threads=session_summary['active_threads'])
134
135 - def stop_thread(self):
136 """\ 137 Stop this L{X2goSessionGuardian} thread. 138 139 """ 140 self._keepalive = False
141