1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- # -*- test-case-name: twisted.words.test.test_tap -*-
- # Copyright (c) Twisted Matrix Laboratories.
- # See LICENSE for details.
- """
- Shiny new words service maker
- """
- import sys, socket
- from twisted.application import strports
- from twisted.application.service import MultiService
- from twisted.python import usage
- from twisted import plugin
- from twisted.words import iwords, service
- from twisted.cred import checkers, credentials, portal, strcred
- class Options(usage.Options, strcred.AuthOptionMixin):
- supportedInterfaces = [credentials.IUsernamePassword]
- optParameters = [
- ('hostname', None, socket.gethostname(),
- 'Name of this server; purely an informative')]
- compData = usage.Completions(multiUse=["group"])
- interfacePlugins = {}
- plg = None
- for plg in plugin.getPlugins(iwords.IProtocolPlugin):
- assert plg.name not in interfacePlugins
- interfacePlugins[plg.name] = plg
- optParameters.append((
- plg.name + '-port',
- None, None,
- 'strports description of the port to bind for the ' + plg.name + ' server'))
- del plg
- def __init__(self, *a, **kw):
- usage.Options.__init__(self, *a, **kw)
- self['groups'] = []
- def opt_group(self, name):
- """Specify a group which should exist
- """
- self['groups'].append(name.decode(sys.stdin.encoding))
- def opt_passwd(self, filename):
- """
- Name of a passwd-style file. (This is for
- backwards-compatibility only; you should use the --auth
- command instead.)
- """
- self.addChecker(checkers.FilePasswordDB(filename))
- def makeService(config):
- credCheckers = config.get('credCheckers', [])
- wordsRealm = service.InMemoryWordsRealm(config['hostname'])
- wordsPortal = portal.Portal(wordsRealm, credCheckers)
- msvc = MultiService()
- # XXX Attribute lookup on config is kind of bad - hrm.
- for plgName in config.interfacePlugins:
- port = config.get(plgName + '-port')
- if port is not None:
- factory = config.interfacePlugins[plgName].getFactory(wordsRealm, wordsPortal)
- svc = strports.service(port, factory)
- svc.setServiceParent(msvc)
- # This is bogus. createGroup is async. makeService must be
- # allowed to return a Deferred or some crap.
- for g in config['groups']:
- wordsRealm.createGroup(g)
- return msvc
|