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)
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()