コード例 #1
0
    def __init__(self, appOptions):
        port = appOptions.port
        self.manager = procman.CProcessManager("localhost")
        self._options = options.CCastOptions()
        self._options.loadConfig(appOptions.config)
        self._options.configEnvironment()
        self.address = "tcp -p %d" % port
        self.agent = None
        self.mainLog = None

        self.serverManager = CServerManager()
        fn = os.path.join(os.path.dirname(pconfig.__file__), "castservers.txt")
        self.serverManager.addServersFromFile(fn)
        fn = os.path.join(os.path.dirname(pconfig.__file__), "cogxservers.txt")
        self.serverManager.addServersFromFile(fn)

        self._options.appOptions = appOptions
        self._initLocalProcesses(appOptions)
コード例 #2
0
class CConsoleAgent:
    def __init__(self, appOptions):
        port = appOptions.port
        self.manager = procman.CProcessManager("localhost")
        self._options = options.CCastOptions()
        self._options.loadConfig(appOptions.config)
        self._options.configEnvironment()
        self.address = "tcp -p %d" % port
        self.agent = None
        self.mainLog = None

        self.serverManager = CServerManager()
        fn = os.path.join(os.path.dirname(pconfig.__file__), "castservers.txt")
        self.serverManager.addServersFromFile(fn)
        fn = os.path.join(os.path.dirname(pconfig.__file__), "cogxservers.txt")
        self.serverManager.addServersFromFile(fn)

        self._options.appOptions = appOptions
        self._initLocalProcesses(appOptions)

    def __del__(self):
        self.manager.stopReaderThread()

    def _addProcess(self, name, dictParams=None):
        csi = self.serverManager.getServerInfo(name)
        if csi == None:
            LOGGER.error("Server '%s' is not registered." % name)
            return
        if dictParams != None:
            for (k,v) in dictParams.iteritems():
                p = csi.getProperty(k)
                if p == None:
                    LOGGER.error("Server '%s' has no property named '%s'." % (name, k))
                    continue
                p.value = v
        extenv = self._options.getExtendedEnviron(defaults=csi.getEnvVarScript())
        command = self._options.xe(csi.getCommand(extenv), environ=extenv)
        workdir = self._options.xe(csi.workdir, environ=extenv) if csi.workdir != None else None
        #print command
        #print csi.getParameters()
        proc = procman.CProcess(name=name, command=command, params=csi.getParameters(),
                workdir=workdir, allowTerminate=not csi.isServer)
        self.manager.addProcess(proc)

    def _initLocalProcesses(self, appOptions):
        self._addProcess('cast-java')
        self._addProcess('cast-cpp')
        self._addProcess('cast-python')

        p = procman.CProcess(procman.LOG4J_PROCESS, self._options.xe("${CMD_LOG4J_SERVER}"))
        p.messageProcessor = log4util.CLog4MessageProcessor()
        self.manager.addProcess(p)

        if appOptions.player_cfg != None:
            # TODO: Player configuration (file contents) could also be sent from the remote machine
            if not os.path.exists(appOptions.player_cfg):
                LOGGER.warn("Player configuration file '%s' not found." % appOptions.player_cfg)
            else:
                self._addProcess('Player', { 'CONFIG': appOptions.player_cfg })

        if appOptions.golem_cfg != None:
            self._addProcess('Golem') # NOTE: No configuration is needed any more.

        if appOptions.gazebo_world != None:
            if not os.path.exists(appOptions.gazebo_world):
                LOGGER.warn("Gazebo world file '%s' not found." % appOptions.gazebo_world)
            else:
                self._addProcess('Gazebo', { 'WORLD': appOptions.gazebo_world })

        if appOptions.abducer != None and appOptions.abducer:
            self._addProcess('Abducer')

        if appOptions.display_srv != None and appOptions.display_srv:
            self._addProcess('Display')

        if appOptions.peekabot != None and appOptions.peekabot:
            self._addProcess('Peekabot')

        if appOptions.text2speech != None and appOptions.text2speech:
            self._addProcess('Mary.tts')

        if appOptions.can_build:
            cmd = "make [TARGET]"
            proc = procman.CProcess("BUILD", cmd)
            proc.allowTerminate = True
            self.manager.addProcess(proc)

        if  appOptions.can_rsync:
            RSYNC_DAEMON.port = appOptions.rsync_port
            cmd = RSYNC_DAEMON.getDaemonCommand()
            p = procman.CProcess("RSYNC", cmd)
            self.manager.addProcess(p)

        if  appOptions.cleanup_script != None:
            self._addProcess('Cleanup', { 'SCRIPT': appOptions.cleanup_script })

    def _initMessagePump(self):
        self.mainLog = CLogDisplayer()
        for proc in self.manager.proclist:
            self.mainLog.log.addSource(proc)
        # XXX LOGGER not added if it's a CStdoutLogger - it will print it's own messages
        self.mainLog.log.addSource(LOGGER)
        self.mainLog.start()


    def _shutdown(self, agent):
        count = 10
        agent.shutdown()
        LOGGER.log("Shutdown")
        time.sleep(0.5)
        while agent.isAlive():
            count -= 1
            LOGGER.log("... waiting for shutdown (%d)" % count)
            if count <= 0: break
            time.sleep(1.0)
        if agent.isAlive():
            LOGGER.warn("ICE Server didn't shut down")
        else:
            LOGGER.log("ICE Server stopped.")

    def startLogging(self):
        self._initMessagePump()

    def startServing(self):
        if self.agent != None: self.stopServing()
        self.agent = castagentsrv.CCastSlave(self.manager, self._options, self.address)
        self.agent.start()
        time.sleep(0.2)

    def stopServing(self):
        if self.agent != None: self._shutdown(self.agent)
        self.agent = None
        self.manager.stopReaderThread()
        if self.mainLog != None:
            self.mainLog.shutdown()