示例#1
0
    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'])
示例#2
0
    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
示例#3
0
    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
示例#4
0
    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
示例#5
0
    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()
示例#8
0
    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