def unregisterUser(self, user): """ Deletes user, disconnection @param user: channel-id (ip, port) @type user: tuple """ userLogin = None for cur_user in self.usersConnected: if self.usersConnected[cur_user]['address'] == user: userLogin = self.usersConnected[cur_user]['profile']['login'] break if userLogin is None: self.trace('client %s not connected' % str(user)) else: user_removed = self.usersConnected.pop(userLogin) self.info("Conn id %s: User (%s, %s) unregistered" % (user_removed['connection-id'], user_removed['address'], userLogin)) # update db UsersManager.instance().setOnlineStatus(login=userLogin, online=False) UsersManager.instance().addStats( user=userLogin, connId=user_removed['connection-id'], startTime=user_removed['connected-at'], duration=time.time() - user_removed['connected-at'])
def registerUser(self, user): """ Adds new user, new connection @param user: user description @type user: dict """ connStart = time.time() connId = self.getUniqueId() # user = { 'address' : client, <user>:{}, 'profile': <user profile> } self.usersConnected[user['profile']['login']] = user self.usersConnected[user['profile'] ['login']]['connected-at'] = connStart self.usersConnected[user['profile']['login']]['connection-id'] = connId self.info( "User Registered: ConnectionID=%s PrivateAddress=%s Login=%s" % (connId, user['address'], user['profile']['login'])) # update db UsersManager.instance().setOnlineStatus(login=user['profile']['login'], online=True) UsersManager.instance().addStats(user=user['profile']['login'], connId=connId, startTime=connStart, duration=0) return True
def apiAuthorizationV2(self, authorization): """ Check authorization for rest api New version in v17 """ if authorization.startswith("Basic "): try: encoded = authorization.split("Basic ")[1].strip() decoded = base64.b64decode(encoded) apikey_id, apikey_secret = decoded.rsplit(":", 1) usersDb = UsersManager.instance().cache() userOk = None for user, profile in usersDb.items(): if profile["apikey_id"] == apikey_id and profile[ "apikey_secret"] == apikey_secret: userOk = profile break return userOk except Exception as e: self.error("unable to decode authorization: %s" % e) return None return None
def unregisterChannelUser(self, login): """ Force channel disconnection """ self.info("Unregister user Login=%s" % login) UsersManager.instance().setOnlineStatus(login=login, online=False) if not login in self.usersConnected: self.trace("unregister user from api, user %s not found" % login) return self.CODE_NOT_FOUND else: userProfile = self.usersConnected[login] # close the network link with the client if exists if userProfile['address'] in ESI.instance().clients: ESI.instance().stopClient(client=userProfile['address']) else: user_removed = self.usersConnected.pop(login) del user_removed return self.CODE_OK
def apiAuthorization(self, login, password): """ Check authorization for rest api """ self.trace('Rest authorization called for Login=%s' % (login)) expires = '' # check if this login exists on the database usersDb = UsersManager.instance().cache() if not login in usersDb: self.trace("Login=%s account not found" % login) return (self.CODE_NOT_FOUND, expires) user_profile = usersDb[login] # account disable ? if not user_profile['active']: self.trace("%s account not active" % login) return (self.CODE_DISABLED, expires) # check password, create a sha1 hash with salt: sha1( salt + sha1(password) ) sha1 = hashlib.sha1() _pwd = "%s%s" % (Settings.get('Misc', 'salt'), password) sha1.update(_pwd.encode('utf8')) if user_profile['password'] != sha1.hexdigest(): self.trace("incorrect password for %s account" % login) return (self.CODE_FAILED, expires) session_id = self.generateSessionid() user_profile['last_activity'] = time.time() lease = int(Settings.get('Users_Session', 'max-expiry-age')) #in seconds end = time.gmtime(user_profile['last_activity'] + lease) expires = time.strftime("%a, %d-%b-%Y %T GMT", end) self.userSessions.update({session_id: user_profile}) self.trace('Rest authorized for Login=%s SessionId=%s Expires=%s' % (login, session_id, expires)) return (session_id, expires)
def cleanup(self): """ Cleanup the server """ self.info('Cleanup...') self.trace("finalize probes manager") try: ProbesManager.finalize() except Exception: pass self.trace("finalize agent manager") try: AgentsManager.finalize() except Exception: pass self.trace("finalize toolbox manager") try: ToolboxManager.finalize() except Exception: pass self.trace("finalize settings") try: Settings.finalize() except Exception: pass self.trace("finalize context") try: Context.finalize() except Exception: pass self.trace("finalize projects manager") try: ProjectsManager.finalize() except Exception: pass self.trace("finalize users manager") try: UsersManager.finalize() except Exception: pass self.trace("finalize stats manager") try: StatsManager.finalize() except Exception: pass self.trace("finalize task manager") try: TaskManager.finalize() except Exception: pass self.trace("finalize test public manager") try: RepoPublic.finalize() except Exception: pass self.trace("finalize test repo manager") try: RepoTests.finalize() except Exception: pass self.trace("finalize test archives manager") try: RepoArchives.finalize() except Exception: pass self.trace("finalize helper manager") try: HelperManager.finalize() except Exception: pass self.trace("finalize libraries manager") try: RepoLibraries.finalize() except Exception: pass self.trace("finalize adapters manager") try: RepoAdapters.finalize() except Exception: pass self.trace("finalize adapters data storage") try: StorageDataAdapters.finalize() except Exception: pass self.trace("finalize WSU") try: RestServerInterface.instance().stop() RestServerInterface.finalize() except Exception: pass self.trace("finalize ESI") try: EventServerInterface.instance().stopSA() EventServerInterface.finalize() except Exception: pass self.trace("finalize TSI") try: TestServerInterface.instance().stopSA() TestServerInterface.finalize() except Exception: pass self.trace("finalize PSI") try: ProbeServerInterface.instance().stopSA() ProbeServerInterface.finalize() except Exception: pass self.trace("finalize ASI") try: AgentServerInterface.instance().stopSA() AgentServerInterface.finalize() except Exception: pass self.trace("finalize db manager") try: DbManager.finalize() except Exception: pass self.trace("finalize logger, cli") try: CliFunctions.finalize() Logger.finalize() except Exception: pass
def initialize(self): """ Starts all modules Exit if the service is alreayd running or if the config file is missing """ starttime = time.time() if self.isrunning(): sys.stdout.write(" (server is already running)") sys.exit(1) self.daemonize() try: # Initialize self.info("Starting up server...") self.trace("** System encoding (in): %s" % sys.stdin.encoding) self.trace("** System encoding (out): %s" % sys.stdout.encoding) self.info("Settings, Logger and CLI ready") DbManager.initialize() DbManager.instance().isUp() self.info("Database manager ready") WebServer.isUp() self.info("Web server ready") # Initialize the core Context.initialize() Context.instance().setStartTime() Context.instance().setMysqlVersion() Context.instance().setApacheVersion() Context.instance().setPhpVersion() Context.instance().synchronizeDynamicCfg() if Settings.getInt('Server', 'use-ifconfig'): Context.instance().listEths() else: Context.instance().listEthsNew() Context.instance().listRoutes() self.info("Context ready") self.deploy() self.info("Symbolic links created") ProjectsManager.initialize(context=Context.instance()) self.info("Projects Manager ready") UsersManager.initialize(context=Context.instance()) self.info("Users Manager ready") StatsManager.initialize() self.info("Stats Manager ready") TaskManager.initialize(statsmgr=StatsManager.instance(), context=Context) self.info("Task Manager ready") # Initialize all repositories RepoTests.initialize(context=Context.instance(), taskmgr=TaskManager.instance()) self.info("Repo manager for tests ready") RepoArchives.initialize(context=Context.instance(), taskmgr=TaskManager.instance()) self.info("Repo manager for archives ready") RepoAdapters.initialize(context=Context.instance(), taskmgr=TaskManager.instance()) StorageDataAdapters.initialize(context=Context.instance()) self.info("Adapters Manager and Storage Data ready") RepoLibraries.initialize(context=Context.instance(), taskmgr=TaskManager.instance()) self.info("Libraries adapters manager ready") RepoPublic.initialize() self.info("Repo manager for public area is ready") HelperManager.initialize() self.info("Helper manager ready") ProbesManager.initialize(context=Context.instance()) self.info("Probes Manager ready") AgentsManager.initialize(context=Context.instance()) self.info("Agents Manager ready") ToolboxManager.initialize() self.info("Toolbox Manager ready") # Initialize all interfaces self.info("Starting ESI on %s:%s" % (Settings.get( 'Bind', 'ip-esi'), Settings.getInt('Bind', 'port-esi'))) EventServerInterface.initialize( listeningAddress=(Settings.get('Bind', 'ip-esi'), Settings.getInt('Bind', 'port-esi')), sslSupport=Settings.getInt('Client_Channel', 'channel-ssl'), wsSupport=Settings.getInt('Client_Channel', 'channel-websocket-support'), context=Context.instance()) self.info("Starting TSI on %s:%s" % (Settings.get( 'Bind', 'ip-tsi'), Settings.getInt('Bind', 'port-tsi'))) TestServerInterface.initialize(listeningAddress=(Settings.get( 'Bind', 'ip-tsi'), Settings.getInt('Bind', 'port-tsi')), statsmgr=StatsManager.instance(), context=Context.instance()) self.info("Starting RSU on %s:%s" % (Settings.get( 'Bind', 'ip-rsi'), Settings.getInt('Bind', 'port-rsi'))) RestServerInterface.initialize( listeningAddress=(Settings.get('Bind', 'ip-rsi'), Settings.getInt('Bind', 'port-rsi'))) self.info("Starting PSI on %s:%s" % (Settings.get( 'Bind', 'ip-psi'), Settings.getInt('Bind', 'port-psi'))) ProbeServerInterface.initialize( listeningAddress=(Settings.get('Bind', 'ip-psi'), Settings.getInt('Bind', 'port-psi')), sslSupport=Settings.getInt('Probe_Channel', 'channel-ssl'), wsSupport=Settings.getInt('Probe_Channel', 'channel-websocket-support'), context=Context.instance()) self.info("Starting ASI on %s:%s" % (Settings.get( 'Bind', 'ip-asi'), Settings.getInt('Bind', 'port-asi'))) AgentServerInterface.initialize( listeningAddress=(Settings.get('Bind', 'ip-asi'), Settings.getInt('Bind', 'port-asi')), sslSupport=Settings.getInt('Agent_Channel', 'channel-ssl'), wsSupport=Settings.getInt('Agent_Channel', 'channel-websocket-support'), tsi=TestServerInterface.instance(), context=Context.instance()) # Start on modules RestServerInterface.instance().start() self.info("RSI is listening on tcp://%s:%s" % (Settings.get( 'Bind', 'ip-rsi'), Settings.get('Bind', 'port-rsi'))) EventServerInterface.instance().startSA() self.info("ESI is listening on tcp://%s:%s" % (Settings.get( 'Bind', 'ip-esi'), Settings.get('Bind', 'port-esi'))) TestServerInterface.instance().startSA() self.info("TSI is listening on tcp://%s:%s" % (Settings.get( 'Bind', 'ip-tsi'), Settings.get('Bind', 'port-tsi'))) ProbeServerInterface.instance().startSA() self.info("PSI is listening on tcp://%s:%s" % (Settings.get( 'Bind', 'ip-psi'), Settings.get('Bind', 'port-psi'))) AgentServerInterface.instance().startSA() self.info("ASI is listening on tcp://%s:%s" % (Settings.get( 'Bind', 'ip-asi'), Settings.get('Bind', 'port-asi'))) # Now start the scheduler and reload tasks taskReloaded = TaskManager.instance().loadBackups() if taskReloaded is None: self.info("Reload tasks disabled") elif taskReloaded: self.info("Tasks reloaded") else: self.error("Failed to reload tasks") self.info("Schedule automatic backups...") if Settings.getInt('Backups', 'tests'): RepoAdapters.instance().scheduleBackup() self.info("Backup tests scheduled") else: self.info("Backup tests disabled") if Settings.getInt('Backups', 'adapters'): RepoTests.instance().scheduleBackup() self.info("Backup adapters scheduled") else: self.info("Backup adapters disabled") if Settings.getInt('Backups', 'libraries'): RepoLibraries.instance().scheduleBackup() self.info("Backup libraries scheduled") else: self.info("Backup libraries disabled") if Settings.getInt('Backups', 'archives'): RepoArchives.instance().scheduleBackup() self.info("Backup archives scheduled") else: self.info("Backup archives disabled") except Exception as e: self.error("Unable to start server: %s" % str(e)) self.cleanup() sys.exit(3) stoptime = time.time() self.info("%s successfully started (in %s sec.)" % (Settings.get('Server', 'name'), int(stoptime - starttime))) self.setrunning() self.run()
def getStats(self, b64=False): """ Constructs some statistics on tas server - Space disk - Lines in database by table @return: server statistics @rtype: dict """ ret = {} nbLinesTableUsers = 0 try: ret['disk-usage'] = self.diskUsage(p=Settings.getDirExec()) ret['disk-usage-logs'] = self.getSize( folder="%s/%s" % (Settings.getDirExec(), Settings.get('Paths', 'logs'))) ret['disk-usage-tmp'] = self.getSize( folder="%s/%s" % (Settings.getDirExec(), Settings.get('Paths', 'tmp'))) ret['disk-usage-testresults'] = self.getSize( folder="%s/%s" % (Settings.getDirExec(), Settings.get('Paths', 'testsresults'))) ret['disk-usage-adapters'] = self.getSize( folder="%s/%s" % (Settings.getDirExec(), Settings.get('Paths', 'adapters'))) ret['disk-usage-libraries'] = self.getSize( folder="%s/%s" % (Settings.getDirExec(), Settings.get('Paths', 'libraries'))) ret['disk-usage-backups'] = self.getSize( folder="%s/%s" % (Settings.getDirExec(), Settings.get('Paths', 'backups'))) ret['disk-usage-tests'] = self.getSize( folder="%s/%s" % (Settings.getDirExec(), Settings.get('Paths', 'tests'))) # nbLinesTableUsers = UsersManager.instance().getNbOfUsers() ret['nb-line-table-users'] = len(UsersManager.instance().cache()) # self.trace( "Nb [usr=%s]" % nbLinesTableUsers) nbTests = StatsManager.instance().getNbTests() self.trace( "Nb tests executed [sc=%s], [tg=%s], [tp=%s], [ts=%s], [tu=%s], [ta=%s], [tc=%s]" % (int(nbTests[0]['nbsc']), int(nbTests[0]['nbtg']), int(nbTests[0]['nbtp']), int(nbTests[0]['nbts']), int(nbTests[0]['nbtu']), int( nbTests[0]['nbta']), int(nbTests[0]['nbtc']))) ret['nb-line-table-scriptsstats'] = int(nbTests[0]['nbsc']) ret['nb-line-table-testplansstats'] = int(nbTests[0]['nbtp']) ret['nb-line-table-testsuitesstats'] = int(nbTests[0]['nbts']) ret['nb-line-table-testunitsstats'] = int(nbTests[0]['nbtu']) ret['nb-line-table-testabstractsstats'] = int(nbTests[0]['nbta']) ret['nb-line-table-testglobalsstats'] = int(nbTests[0]['nbtg']) ret['nb-line-table-testcasesstats'] = int(nbTests[0]['nbtc']) ret['nb-line-total'] = nbLinesTableUsers + int(nbTests[0]['nbsc']) + int(nbTests[0]['nbtc']) \ + int(nbTests[0]['nbts']) + int(nbTests[0]['nbtp']) + int(nbTests[0]['nbtu']) \ + int(nbTests[0]['nbtg']) + int(nbTests[0]['nbta']) except Exception as e: self.error("unable get statistics server: %s" % e) return ret