| OLD | NEW |
| (Empty) |
| 1 # -*- test-case-name: twisted.words.test.test_tap -*- | |
| 2 # Copyright (c) 2001-2005 Twisted Matrix Laboratories. | |
| 3 # See LICENSE for details. | |
| 4 """ | |
| 5 Shiny new words service maker | |
| 6 """ | |
| 7 | |
| 8 import sys, socket | |
| 9 | |
| 10 from twisted.application import strports | |
| 11 from twisted.application.service import MultiService | |
| 12 from twisted.python import usage | |
| 13 from twisted import plugin | |
| 14 | |
| 15 from twisted.words import iwords, service | |
| 16 from twisted.cred import checkers, credentials, portal, strcred | |
| 17 | |
| 18 class Options(usage.Options, strcred.AuthOptionMixin): | |
| 19 supportedInterfaces = [credentials.IUsernamePassword] | |
| 20 optParameters = [ | |
| 21 ('hostname', None, socket.gethostname(), | |
| 22 'Name of this server; purely an informative')] | |
| 23 | |
| 24 interfacePlugins = {} | |
| 25 plg = None | |
| 26 for plg in plugin.getPlugins(iwords.IProtocolPlugin): | |
| 27 assert plg.name not in interfacePlugins | |
| 28 interfacePlugins[plg.name] = plg | |
| 29 optParameters.append(( | |
| 30 plg.name + '-port', | |
| 31 None, None, | |
| 32 'strports description of the port to bind for the ' + plg.name + '
server')) | |
| 33 del plg | |
| 34 | |
| 35 def __init__(self, *a, **kw): | |
| 36 usage.Options.__init__(self, *a, **kw) | |
| 37 self['groups'] = [] | |
| 38 | |
| 39 def opt_group(self, name): | |
| 40 """Specify a group which should exist | |
| 41 """ | |
| 42 self['groups'].append(name.decode(sys.stdin.encoding)) | |
| 43 | |
| 44 def opt_passwd(self, filename): | |
| 45 """ | |
| 46 Name of a passwd-style file. (This is for | |
| 47 backwards-compatibility only; you should use the --auth | |
| 48 command instead.) | |
| 49 """ | |
| 50 self.addChecker(checkers.FilePasswordDB(filename)) | |
| 51 | |
| 52 def makeService(config): | |
| 53 credCheckers = config.get('credCheckers', []) | |
| 54 wordsRealm = service.InMemoryWordsRealm(config['hostname']) | |
| 55 wordsPortal = portal.Portal(wordsRealm, credCheckers) | |
| 56 | |
| 57 msvc = MultiService() | |
| 58 | |
| 59 # XXX Attribute lookup on config is kind of bad - hrm. | |
| 60 for plgName in config.interfacePlugins: | |
| 61 port = config.get(plgName + '-port') | |
| 62 if port is not None: | |
| 63 factory = config.interfacePlugins[plgName].getFactory(wordsRealm, wo
rdsPortal) | |
| 64 svc = strports.service(port, factory) | |
| 65 svc.setServiceParent(msvc) | |
| 66 | |
| 67 # This is bogus. createGroup is async. makeService must be | |
| 68 # allowed to return a Deferred or some crap. | |
| 69 for g in config['groups']: | |
| 70 wordsRealm.createGroup(g) | |
| 71 | |
| 72 return msvc | |
| OLD | NEW |