Ejemplo n.º 1
0
    def _start(self):
        fmt = log.UtcFormatter('%(asctime)s %(name)s n %(message)s')

        if self._opts.foreground:
            # send logger output to console
            ch = logging.StreamHandler(sys.stderr)
            ch.setFormatter(fmt)
            ch.setLevel(logging.DEBUG)
            self._logger.addHandler(ch)

        self._logPath = '/dev/null'
        self._logFile = None
        if self._logFname is not None:
            logPathTemplate = os.path.join(self._logDir, self._logFname)
            try:
                self._logPath, self._logFile = (log.openLogFromTemplate(
                    'pyraptord', logPathTemplate, {}))
            except Exception as e:  # pylint: disable=W0702
                import traceback
                traceback.print_exc()
                self._logger.error('could not open log file %s!',
                                   logPathTemplate)

        if self._logFile is not None:
            # send logger output to file
            lh = logging.StreamHandler(self._logFile)
            lh.setFormatter(fmt)
            lh.setLevel(logging.DEBUG)
            self._logger.addHandler(lh)

        self._logger.debug('installing signal handlers')
        for sig in self._getSignalsToHandle():
            signal.signal(sig, self._handleSignal)
        gevent.spawn(self._disableGeventDefaultSigintHandler)

        # load ports config
        self._ports = loadConfig(self._config.PORTS)
        self._port = self._ports[self._name].rpc

        if not self._opts.foreground:
            self._logger.debug('daemonizing')
            daemonize.daemonize('pyraptord',
                                self._logFile,
                                detachTty=not self._opts.noFork)

        # start startup services
        if 'startup' in self._config.GROUPS:
            startupGroup = self._config.GROUPS.startup
            self._logger.debug('startup group: %s', startupGroup)
            for svcName in startupGroup:
                self.startService(svcName)
        else:
            self._logger.debug('no group named "startup"')
        self._jobs.append(gevent.spawn(self._cleanupChildren))
Ejemplo n.º 2
0
    def _start(self):
        fmt = log.UtcFormatter('%(asctime)s %(name)s n %(message)s')

        if self._opts.foreground:
            # send logger output to console
            ch = logging.StreamHandler(sys.stderr)
            ch.setFormatter(fmt)
            ch.setLevel(logging.DEBUG)
            self._logger.addHandler(ch)

        self._logPath = '/dev/null'
        self._logFile = None
        if self._logFname is not None:
            logPathTemplate = os.path.join(self._logDir, self._logFname)
            try:
                self._logPath, self._logFile = (log.openLogFromTemplate
                                                ('pyraptord',
                                                 logPathTemplate,
                                                 {}))
            except Exception as e:  # pylint: disable=W0702
                import traceback
                traceback.print_exc()
                self._logger.error('could not open log file %s!', logPathTemplate)

        if self._logFile is not None:
            # send logger output to file
            lh = logging.StreamHandler(self._logFile)
            lh.setFormatter(fmt)
            lh.setLevel(logging.DEBUG)
            self._logger.addHandler(lh)

        self._logger.debug('installing signal handlers')
        for sig in self._getSignalsToHandle():
            signal.signal(sig, self._handleSignal)
        gevent.spawn(self._disableGeventDefaultSigintHandler)

        # load ports config
        self._ports = loadConfig(self._config.PORTS)
        self._port = self._ports[self._name].rpc

        if not self._opts.foreground:
            self._logger.debug('daemonizing')
            daemonize.daemonize('pyraptord', self._logFile,
                                detachTty=not self._opts.noFork)

        # start startup services
        if 'startup' in self._config.GROUPS:
            startupGroup = self._config.GROUPS.startup
            self._logger.debug('startup group: %s', startupGroup)
            for svcName in startupGroup:
                self.startService(svcName)
        else:
            self._logger.debug('no group named "startup"')
        self._jobs.append(gevent.spawn(self._cleanupChildren))
Ejemplo n.º 3
0
    def start(self):
        if not self.isStartable():
            raise prexceptions.ServiceAlreadyActive(self._name)

        cmdArgs = shlex.split(self.getCommand().encode('utf8'))

        self._logger = logging.getLogger('service.%s' % self._name)
        self._logger.setLevel(logging.DEBUG)
        self._logger.propagate = False

        #self._logBuffer = log.LineBuffer()
        # FIX: add handler for line buffer

        logName = self.getLogNameTemplate()
        self._log = None
        if logName is not None:
            logPath = os.path.join(self._parent._logDir,
                                   logName)
            try:
                _fname, self._log = (log.openLogFromTemplate
                                     (self._name,
                                      logPath,
                                      self._env))
            except:  # pylint: disable=W0702
#                 traceback.print_exc()
                self._parent._logger.warning('could not open log file for service %s at path %s',
                                             self._name, logPath)

        if self._log is not None:
            #sh = logging.StreamHandler(self._log)
            fmt = log.UtcFormatter('%(asctime)s %(name)s %(message)s')
            self._streamHandler = log.AutoFlushStreamHandler(self._log)
            self._streamHandler.setLevel(logging.DEBUG)
            self._streamHandler.setFormatter(fmt)
            self._logger.addHandler(self._streamHandler)

            #self._publishHandler = log.PublishHandler(self._parent._qrouter)
            #self._publishHandler.setLevel(logging.DEBUG)
            #self._publishHandler.setFormatter(fmt)
            #self._logger.addHandler(self._publishHandler)

        stdinPath = self.getStdin()
        if stdinPath is None:
            childStdinReadFd = subprocess.PIPE
            popenStdin = childStdinReadFd
        else:
            popenStdin = None

        stdoutPath = self.getStdout()
        if stdoutPath is None:
            childStdoutReadFd, childStdoutWriteFd = trackerG.openpty(self._name)
            popenStdout = childStdoutWriteFd
        else:
            popenStdout = None
        childStderrReadFd, childStderrWriteFd = trackerG.openpty(self._name)
        trackerG.debug()

        self._eventLogger = self._logger.getChild('evt n')
        self._eventLogger.setLevel(logging.DEBUG)

        childEnv = os.environ.copy()
        for k, v in self.getEnvVariables().iteritems():
            if v is None:
                if k in childEnv:
                    del childEnv[k]
            else:
                childEnv[k] = v

        self._eventLogger.info('starting')
        escapedArgs = ' '.join(['"%s"' % arg
                                for arg in cmdArgs])
        self._eventLogger.info('command: %s', escapedArgs)

        if self.getStdin() or self.getStdout():
            popenClass = PopenNoErrPipe
        else:
            popenClass = subprocess.Popen

        startupError = None
        try:
            self._proc = popenClass(cmdArgs,
                                    stdin=popenStdin,
                                    stdout=popenStdout,
                                    stderr=childStderrWriteFd,
                                    env=childEnv,
                                    close_fds=True,
                                    cwd=self.getWorkingDir(),
                                    preexec_fn=self.openExternalStreams)
        except OSError, oe:
            if oe.errno == errno.ENOENT:
                startupError = ('is executable "%s" in PATH? Popen call returned no such file or directory'
                                % cmdArgs[0])
            else:
                startupError = oe