diff --git a/agent/README.txt b/agent/README.txt index 63c66cd..d1298de 100644 --- a/agent/README.txt +++ b/agent/README.txt @@ -106,7 +106,7 @@ the path to the configuration file. >>> configFile.close() >>> master.config - controller.name = 'base.sample' + controller.names = ['base.sample'] logger.name = 'default' logger.standard = 30 scheduler.name = 'sample' @@ -197,7 +197,7 @@ the core package so that now everything is running under the control of the twisted reactor. >>> config = ''' - ... controller(name='core.sample') + ... controller(names=['core.sample']) ... scheduler(name='core') ... logger(name='default', standard=30) ... ''' diff --git a/agent/agent.cfg b/agent/agent.cfg new file mode 100644 index 0000000..e7ffe7e --- /dev/null +++ b/agent/agent.cfg @@ -0,0 +1,10 @@ +# +# Standard configuration for agent application +# +# $Id$ +# + +controller(names=['cmdline', 'telnet']) +controller.telnet.port = 5001 +scheduler(name='core') +logger(name='default', standard=30) diff --git a/agent/app.py b/agent/app.py index be4c253..4344df3 100755 --- a/agent/app.py +++ b/agent/app.py @@ -23,21 +23,32 @@ Agent application. $Id$ """ +import os from twisted.internet import reactor + from cybertools.agent.base.agent import Master -config = ''' -controller(name='telnet') -scheduler(name='core') -logger(name='default', standard=30) -''' -master = Master(config) -master.setup() +def getConfig(): + agentHome = os.path.abspath(os.path.dirname(__file__)) + configName = 'agent.cfg' + configFile = open(os.path.join(agentHome, configName)) + config = configFile.read() + configFile.close() + return config -print 'Starting agent application...' -print 'Using controller %s.' % master.config.controller.name -reactor.run() +def start(): + master = Master(getConfig()) + master.setup() -print 'Agent application has been stopped.' + print 'Starting agent application...' + print 'Using controllers %s.' % ', '.join(master.config.controller.names) + + reactor.run() + + print 'Agent application has been stopped.' + + +if __name__ == '__main__': + start() diff --git a/agent/base/agent.py b/agent/base/agent.py index 8b49d36..82c4837 100644 --- a/agent/base/agent.py +++ b/agent/base/agent.py @@ -61,16 +61,19 @@ class Master(Agent): name = 'master' scheduler = None - def __init__(self, configuration=None): - config = self.config = Configurator() + def __init__(self, configuration): + if isinstance(configuration, Configurator): + config = configuration + else: # configuration is path to config file + config = self.config = Configurator() + config.load(configuration) self.master = self self.controllers = [] self.children = {} - if configuration is not None: - config.load(configuration) - self.logger = loggers(self, name=config.logger.name) - self.controllers.append(controllers(self, name=config.controller.name)) - self.scheduler = schedulers(self, name=config.scheduler.name) + self.logger = loggers(self, name=config.logger.name) + for n in config.controller.names: + self.controllers.append(controllers(self, n)) + self.scheduler = schedulers(self, name=config.scheduler.name) def setup(self): for cont in self.controllers: diff --git a/agent/base/sample.cfg b/agent/base/sample.cfg index e74d3ef..21c6689 100644 --- a/agent/base/sample.cfg +++ b/agent/base/sample.cfg @@ -4,6 +4,6 @@ # $Id$ # -controller(name='base.sample') +controller(names=['base.sample']) scheduler(name='sample') logger(name='default', standard=30) diff --git a/agent/control/cmdline.py b/agent/control/cmdline.py index 3e0c520..e139b57 100644 --- a/agent/control/cmdline.py +++ b/agent/control/cmdline.py @@ -35,7 +35,9 @@ class CmdlineController(SampleController): def setup(self): super(CmdlineController, self).setup() - stdio.StandardIO(CmdlineProtocol()) + prot = CmdlineProtocol() + prot.controller = self + stdio.StandardIO(prot) controllers.register(CmdlineController, Master, name='cmdline') @@ -46,7 +48,8 @@ class TelnetController(CmdlineController): def setup(self): super(CmdlineController, self).setup() - reactor.listenTCP(5001, TelnetServerFactory()) + port = self.agent.config.controller.telnet.port + reactor.listenTCP(port, TelnetServerFactory(self)) controllers.register(TelnetController, Master, name='telnet') @@ -54,6 +57,7 @@ controllers.register(TelnetController, Master, name='telnet') class CmdlineProtocol(basic.LineReceiver): delimiter = '\n' + controller = None def connectionMade(self): self.sendLine("Agent console. Type 'help' for help.") @@ -97,4 +101,11 @@ class TelnetProtocol(CmdlineProtocol): class TelnetServerFactory(protocol.ServerFactory): - protocol = TelnetProtocol + def __init__(self, controller): + self.controller = controller + + def protocol(self, *args, **kw): + prot = TelnetProtocol(*args, **kw) + prot.controller = self.controller + return prot + diff --git a/agent/crawl/README.txt b/agent/crawl/README.txt index 6b194bd..04641e2 100644 --- a/agent/crawl/README.txt +++ b/agent/crawl/README.txt @@ -7,7 +7,7 @@ Agents for Job Execution and Communication Tasks >>> from cybertools.agent.base.agent import Master >>> config = ''' - ... controller(name='core.sample') + ... controller(names=['core.sample']) ... scheduler(name='core') ... logger(name='default', standard=30) ... '''