Exemplo n.º 1
0
    def delete(self):
        """ un-enroll agent """
        LOG.info('unenroll agent')
        try:
            with self.lock:
                appGlobal = config['pylons.app_globals']
                if hasattr(appGlobal, 'hwPath'):
                    setattr(appGlobal, 'hwPath', None)
                manifestutil.updateServiceMetaFile('agent', {'hwPath': None})
                appGlobal.enrolled = False
                appGlobal.agentMonitor.reloadMonitors()

                return doneResult(request, response, controller=self)

            return errorResult(
                request,
                response,
                error=Errors.THREAD_ALREADY_ADDED,
                errorMsg="Cann't acquire lock for un-enrollment",
                controller=self)

        except Exception as excep:
            return errorResult(
                request,
                response,
                error=Errors.UNKNOWN_ERROR,
                errorMsg='Unknown error for un-enroll - %s - %s' %
                (str(excep), traceback.format_exc(2)),
                controller=self)
Exemplo n.º 2
0
    def post(self):
        """ enroll agent """
        try:
            body = json.loads(request.body)
            if 'hardwarePath' not in body:
                LOG.error('failed when enrolling: hardwarePath is not provided')
                return errorResult(request, response, error = Errors.UNKNOWN_ERROR, errorMsg='hardwarePath is not specified', controller = self)

            with self.lock:
                LOG.info('enroll agent with hardwarePath %s' % (body['hardwarePath']))
                
                hardwarePath = body['hardwarePath']
                manifestutil.updateServiceMetaFile('agent', {'hwPath': hardwarePath,})

                appGlobal = config['pylons.app_globals']
                appGlobal.hwPath = hardwarePath
                appGlobal.enrolled = True
                
                appGlobal.agentMonitor.reloadMonitors()

                return doneResult(request, response, controller = self)

            return errorResult(request, response,
                               error = Errors.THREAD_ALREADY_ADDED,
                               errorMsg = "Cann't acquire lock for enrollment",
                               controller = self )

        except Exception as excep:
            return errorResult(request, response, error = Errors.UNKNOWN_ERROR,
                               errorMsg = 'Unknown error for enroll - %s - %s' %
                               (str(excep), traceback.format_exc(2)),
                               controller = self)
Exemplo n.º 3
0
 def testUpdateServiceMetaFileLocal(self):
     keys = ['hwPath', 'serverAddress']
     values = manifestutil.readJsonServiceMeta('foo', keys)
     assert values.get('hwPath') == values.get('serverAddress') == None
     createManifest(self, manifest = 'bar', service = 'foo')
     manifestutil.updateServiceMetaFile('foo', {'hwPath':'/env/pool/instance', 'serverAddress':'state.vip'})
     assert os.path.exists(manifestutil.serviceMetadataPath('foo'))
     values = manifestutil.readJsonServiceMeta('foo', keys)
     assert values.get('hwPath') == '/env/pool/instance'
     assert values.get('serverAddress') == 'state.vip'
     manifestutil.updateServiceMetaFile('foo', {'hwPath':None})
     values = manifestutil.readJsonServiceMeta('foo', keys)
     assert values.get('hwPath') is None
     assert values.get('serverAddress') == 'state.vip'
Exemplo n.º 4
0
    def updateMetadata(self, service):
        """ create or update .metadata file for a service """
        # now connect to state server to store metadata for the service in .metadata
        metadata = None
        if request.body:
            # two flavor of updatemetadata call, one with body, one without
            body = json.loads(request.body)
            if 'metadata' in body:
                metadata = body['metadata']

        try:
            result = {}
            
            appGlobal = pylons.config['pylons.app_globals']

            if metadata is not None and 'monitoring.metric.tags' in metadata:
                appGlobal.agentMonitor.reloadMonitors()
            
            result = manifestutil.updateServiceMetaFile(service, metadata)
            
            return doneResult(request, response, result = result, controller = self)

        except Exception as excep:
            return errorResult(request, response, error = Errors.UNKNOWN_ERROR,
                               errorMsg = 'Unknown error when update service metadata (%s) %s - %s' %
                               (service, str(excep), traceback.format_exc(2)),
                               controller = self)
Exemplo n.º 5
0
 def testUpdateServiceMetaFileLocal(self):
     keys = ['hwPath', 'serverAddress']
     values = manifestutil.readJsonServiceMeta('foo', keys)
     assert values.get('hwPath') == values.get('serverAddress') == None
     createManifest(self, manifest='bar', service='foo')
     manifestutil.updateServiceMetaFile('foo', {
         'hwPath': '/env/pool/instance',
         'serverAddress': 'state.vip'
     })
     assert os.path.exists(manifestutil.serviceMetadataPath('foo'))
     values = manifestutil.readJsonServiceMeta('foo', keys)
     assert values.get('hwPath') == '/env/pool/instance'
     assert values.get('serverAddress') == 'state.vip'
     manifestutil.updateServiceMetaFile('foo', {'hwPath': None})
     values = manifestutil.readJsonServiceMeta('foo', keys)
     assert values.get('hwPath') is None
     assert values.get('serverAddress') == 'state.vip'
Exemplo n.º 6
0
    def post(self):
        """ enroll agent """
        try:
            body = json.loads(request.body)
            if 'hardwarePath' not in body:
                LOG.error(
                    'failed when enrolling: hardwarePath is not provided')
                return errorResult(request,
                                   response,
                                   error=Errors.UNKNOWN_ERROR,
                                   errorMsg='hardwarePath is not specified',
                                   controller=self)

            with self.lock:
                LOG.info('enroll agent with hardwarePath %s' %
                         (body['hardwarePath']))

                hardwarePath = body['hardwarePath']
                manifestutil.updateServiceMetaFile('agent', {
                    'hwPath': hardwarePath,
                })

                appGlobal = config['pylons.app_globals']
                appGlobal.hwPath = hardwarePath
                appGlobal.enrolled = True

                appGlobal.agentMonitor.reloadMonitors()

                return doneResult(request, response, controller=self)

            return errorResult(request,
                               response,
                               error=Errors.THREAD_ALREADY_ADDED,
                               errorMsg="Cann't acquire lock for enrollment",
                               controller=self)

        except Exception as excep:
            return errorResult(request,
                               response,
                               error=Errors.UNKNOWN_ERROR,
                               errorMsg='Unknown error for enroll - %s - %s' %
                               (str(excep), traceback.format_exc(2)),
                               controller=self)
Exemplo n.º 7
0
    def delete(self):
        """ un-enroll agent """
        LOG.info('unenroll agent')
        try:
            with self.lock:
                appGlobal = config['pylons.app_globals']
                if hasattr(appGlobal, 'hwPath'):
                    setattr(appGlobal, 'hwPath', None)
                manifestutil.updateServiceMetaFile('agent', {'hwPath':None})
                appGlobal.enrolled = False
                appGlobal.agentMonitor.reloadMonitors()
                    
                return doneResult(request, response, controller = self)

            return errorResult(request, response,
                   error = Errors.THREAD_ALREADY_ADDED,
                   errorMsg = "Cann't acquire lock for un-enrollment",
                   controller = self )

        except Exception as excep:
            return errorResult(request, response, error = Errors.UNKNOWN_ERROR,
                               errorMsg = 'Unknown error for un-enroll - %s - %s' %
                               (str(excep), traceback.format_exc(2)),
                               controller = self)
Exemplo n.º 8
0
 def cleanConfig(self):
     """ clean all configs """
     LOG.info('clean agent config overrides')
     result = {}
     try:
         result = manifestutil.updateServiceMetaFile('agent', {'configs': None})
         return doneResult(request, response, result = result, controller = self)
         
     except Exception as excep:
         return errorResult(request, response, error = Errors.UNKNOWN_ERROR,
                            errorMsg = 'Unknown error when clean agent configs %s - %s' %
                            (str(excep), traceback.format_exc(2)), controller = self)
     finally:
         # reload config overrides
         configutil.loadConfigOverrides()
Exemplo n.º 9
0
 def pokeConfig(self):
     """ config poke """
     LOG.info('config poke agent with body: %s', request.body)
     configs = None
     result = {}
     try:
         if request.body:
             body = json.loads(request.body)
             if 'configs' in body:
                 configs = body['configs']
                 result = manifestutil.updateServiceMetaFile('agent', {'configs': configs})
                 return doneResult(request, response, result = result, controller = self)
         
         raise AgentException(Errors.INVALID_REQUEST, 'Invalid request, expect configs in request body')
         
     except Exception as excep:
         return errorResult(request, response, error = Errors.UNKNOWN_ERROR,
                            errorMsg = 'Unknown error when update agent configs %s - %s' %
                            (str(excep), traceback.format_exc(2)), controller = self)
     finally:
         # reload config overrides
         configutil.loadConfigOverrides()
Exemplo n.º 10
0
    def updateMetadata(self, service):
        """ create or update .metadata file for a service """
        # now connect to state server to store metadata for the service in .metadata
        metadata = None
        if request.body:
            # two flavor of updatemetadata call, one with body, one without
            body = json.loads(request.body)
            if 'metadata' in body:
                metadata = body['metadata']

        try:
            result = {}

            appGlobal = pylons.config['pylons.app_globals']

            if metadata is not None and 'monitoring.metric.tags' in metadata:
                appGlobal.agentMonitor.reloadMonitors()

            if service == 'agent' and metadata is not None and 'hwPath' in metadata:
                appGlobal.hwPath = metadata['hwPath']

            result = manifestutil.updateServiceMetaFile(service, metadata)

            return doneResult(request,
                              response,
                              result=result,
                              controller=self)

        except Exception as excep:
            return errorResult(
                request,
                response,
                error=Errors.UNKNOWN_ERROR,
                errorMsg=
                'Unknown error when update service metadata (%s) %s - %s' %
                (service, str(excep), traceback.format_exc(2)),
                controller=self)
Exemplo n.º 11
0
    def startServicesOnAgentStartup():
        """
        when agent is restarted,
        0. check for agent selfupdate
        1. start all service with active manifest, this requires service startup script be idempotent
        2. load dynamic controllers and routes if any
        """
        # check for agent update
        from agent.lib.agenthealth import checkAgentVersion
        checkAgentVersion(True)

        # startup services
        from agent.lib.agent_thread.startstop_service import StartStopService
        appGlobal = config['pylons.app_globals']
        appdelay = int(
            config['appinitdelay']) if 'appinitdelay' in config else 0
        if appdelay > 0:
            time.sleep(appdelay)

        # check if this is agent restart or system restart
        if os.name != 'nt' and os.path.exists("/proc/uptime"):
            uptime, _ = [float(f) for f in open("/proc/uptime").read().split()]
        else:
            uptime = 500
        systemRestartTimeThreshold = pylons.config[
            'system_restart_time_threshold']
        actionType = StartStopService.ACTION_RESTART
        if (int(systemRestartTimeThreshold) > uptime):
            actionType = StartStopService.ACTION_REBOOT

        for service in manifestutil.getServices():

            appDataDir = manifestutil.appDataPath(service)
            if not os.path.exists(appDataDir):
                os.makedirs(appDataDir)
                import pwd
                uname = pylons.config['app_user_account']
                uid = pwd.getpwnam(uname).pw_uid
                gid = pwd.getpwnam(uname).pw_gid
                utils.rchown(appDataDir, uid, gid)

            dataDir = manifestutil.dataPath(service)
            if not os.path.exists(dataDir):
                os.makedirs(dataDir)

            if service != 'agent':
                try:
                    manifestutil.updateServiceMetaFile(
                        service, {
                            'servicePath': manifestutil.servicePath(service),
                            'serviceName': service
                        })
                except Exception as excep:
                    LOG.error(
                        'Unknown error updating local metadata service(%s) - %s - %s'
                        % (service, str(excep), traceback.format_exc(2)))

                if manifestutil.hasActiveManifest(service):
                    try:
                        LOG.info('startup for service(%s)', service)

                        startupThread = StartStopService(
                            appGlobal.threadMgr, service, actionType)
                        startupThread.start()
                        startupThread.threadMgrEvent.wait()

                    except Exception as excep:
                        LOG.error(
                            'Unknown error starting service(%s) - %s - %s' %
                            (service, str(excep), traceback.format_exc(2)))

                    try:
                        LOG.info('load controllers and routes for service(%s)',
                                 service)
                        manifestutil.processControllerInPackage(service)

                    except Exception as excep:
                        LOG.error(
                            'Unknown error loading controllers for service(%s) - %s - %s'
                            % (service, str(excep), traceback.format_exc(2)))
Exemplo n.º 12
0
    def startServicesOnAgentStartup():
        """
        when agent is restarted,
        0. check for agent selfupdate
        1. start all service with active manifest, this requires service startup script be idempotent
        2. load dynamic controllers and routes if any
        """
        # check for agent update
        from agent.lib.agenthealth import checkAgentVersion

        checkAgentVersion(True)

        # startup services
        from agent.lib.agent_thread.startstop_service import StartStopService

        appGlobal = config["pylons.app_globals"]
        appdelay = int(config["appinitdelay"]) if "appinitdelay" in config else 0
        if appdelay > 0:
            time.sleep(appdelay)

        # check if this is agent restart or system restart
        if os.name != "nt" and os.path.exists("/proc/uptime"):
            uptime, _ = [float(f) for f in open("/proc/uptime").read().split()]
        else:
            uptime = 500
        systemRestartTimeThreshold = pylons.config["system_restart_time_threshold"]
        actionType = StartStopService.ACTION_RESTART
        if int(systemRestartTimeThreshold) > uptime:
            actionType = StartStopService.ACTION_REBOOT

        for service in manifestutil.getServices():

            appDataDir = manifestutil.appDataPath(service)
            if not os.path.exists(appDataDir):
                os.makedirs(appDataDir)
                import pwd

                uname = pylons.config["app_user_account"]
                uid = pwd.getpwnam(uname).pw_uid
                gid = pwd.getpwnam(uname).pw_gid
                utils.rchown(appDataDir, uid, gid)

            dataDir = manifestutil.dataPath(service)
            if not os.path.exists(dataDir):
                os.makedirs(dataDir)

            if service != "agent":
                try:
                    manifestutil.updateServiceMetaFile(
                        service, {"servicePath": manifestutil.servicePath(service), "serviceName": service}
                    )
                except Exception as excep:
                    LOG.error(
                        "Unknown error updating local metadata service(%s) - %s - %s"
                        % (service, str(excep), traceback.format_exc(2))
                    )

                if manifestutil.hasActiveManifest(service):
                    try:
                        LOG.info("startup for service(%s)", service)

                        startupThread = StartStopService(appGlobal.threadMgr, service, actionType)
                        startupThread.start()
                        startupThread.threadMgrEvent.wait()

                    except Exception as excep:
                        LOG.error(
                            "Unknown error starting service(%s) - %s - %s"
                            % (service, str(excep), traceback.format_exc(2))
                        )

                    try:
                        LOG.info("load controllers and routes for service(%s)", service)
                        manifestutil.processControllerInPackage(service)

                    except Exception as excep:
                        LOG.error(
                            "Unknown error loading controllers for service(%s) - %s - %s"
                            % (service, str(excep), traceback.format_exc(2))
                        )