diff options
author | shmel1k <shmel1k@ydb.tech> | 2023-11-26 18:16:14 +0300 |
---|---|---|
committer | shmel1k <shmel1k@ydb.tech> | 2023-11-26 18:43:30 +0300 |
commit | b8cf9e88f4c5c64d9406af533d8948deb050d695 (patch) | |
tree | 218eb61fb3c3b96ec08b4d8cdfef383104a87d63 /contrib/python/Twisted/py3/twisted/words/tap.py | |
parent | 523f645a83a0ec97a0332dbc3863bb354c92a328 (diff) | |
download | ydb-b8cf9e88f4c5c64d9406af533d8948deb050d695.tar.gz |
add kikimr_configure
Diffstat (limited to 'contrib/python/Twisted/py3/twisted/words/tap.py')
-rw-r--r-- | contrib/python/Twisted/py3/twisted/words/tap.py | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/contrib/python/Twisted/py3/twisted/words/tap.py b/contrib/python/Twisted/py3/twisted/words/tap.py new file mode 100644 index 0000000000..d83db71b76 --- /dev/null +++ b/contrib/python/Twisted/py3/twisted/words/tap.py @@ -0,0 +1,89 @@ +# -*- test-case-name: twisted.words.test.test_tap -*- +# Copyright (c) Twisted Matrix Laboratories. +# See LICENSE for details. +""" +Shiny new words service maker +""" + +import socket +import sys +from typing import List, Optional, Sequence + +from twisted import plugin +from twisted.application import strports +from twisted.application.service import MultiService +from twisted.cred import checkers, credentials, portal, strcred +from twisted.python import usage +from twisted.words import iwords, service + + +class Options(usage.Options, strcred.AuthOptionMixin): + supportedInterfaces = [credentials.IUsernamePassword] + optParameters: List[Sequence[Optional[str]]] = [ + ( + "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 |