aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/Twisted/py3/twisted/conch/manhole_tap.py
diff options
context:
space:
mode:
authorshmel1k <shmel1k@ydb.tech>2023-11-26 18:16:14 +0300
committershmel1k <shmel1k@ydb.tech>2023-11-26 18:43:30 +0300
commitb8cf9e88f4c5c64d9406af533d8948deb050d695 (patch)
tree218eb61fb3c3b96ec08b4d8cdfef383104a87d63 /contrib/python/Twisted/py3/twisted/conch/manhole_tap.py
parent523f645a83a0ec97a0332dbc3863bb354c92a328 (diff)
downloadydb-b8cf9e88f4c5c64d9406af533d8948deb050d695.tar.gz
add kikimr_configure
Diffstat (limited to 'contrib/python/Twisted/py3/twisted/conch/manhole_tap.py')
-rw-r--r--contrib/python/Twisted/py3/twisted/conch/manhole_tap.py180
1 files changed, 180 insertions, 0 deletions
diff --git a/contrib/python/Twisted/py3/twisted/conch/manhole_tap.py b/contrib/python/Twisted/py3/twisted/conch/manhole_tap.py
new file mode 100644
index 0000000000..24c79a5e7f
--- /dev/null
+++ b/contrib/python/Twisted/py3/twisted/conch/manhole_tap.py
@@ -0,0 +1,180 @@
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+"""
+TAP plugin for creating telnet- and ssh-accessible manhole servers.
+
+@author: Jp Calderone
+"""
+
+from zope.interface import implementer
+
+from twisted.application import service, strports
+from twisted.conch import manhole, manhole_ssh, telnet
+from twisted.conch.insults import insults
+from twisted.conch.ssh import keys
+from twisted.cred import checkers, portal
+from twisted.internet import protocol
+from twisted.python import filepath, usage
+
+
+class makeTelnetProtocol:
+ def __init__(self, portal):
+ self.portal = portal
+
+ def __call__(self):
+ auth = telnet.AuthenticatingTelnetProtocol
+ args = (self.portal,)
+ return telnet.TelnetTransport(auth, *args)
+
+
+class chainedProtocolFactory:
+ def __init__(self, namespace):
+ self.namespace = namespace
+
+ def __call__(self):
+ return insults.ServerProtocol(manhole.ColoredManhole, self.namespace)
+
+
+@implementer(portal.IRealm)
+class _StupidRealm:
+ def __init__(self, proto, *a, **kw):
+ self.protocolFactory = proto
+ self.protocolArgs = a
+ self.protocolKwArgs = kw
+
+ def requestAvatar(self, avatarId, *interfaces):
+ if telnet.ITelnetProtocol in interfaces:
+ return (
+ telnet.ITelnetProtocol,
+ self.protocolFactory(*self.protocolArgs, **self.protocolKwArgs),
+ lambda: None,
+ )
+ raise NotImplementedError()
+
+
+class Options(usage.Options):
+ optParameters = [
+ [
+ "telnetPort",
+ "t",
+ None,
+ (
+ "strports description of the address on which to listen for telnet "
+ "connections"
+ ),
+ ],
+ [
+ "sshPort",
+ "s",
+ None,
+ (
+ "strports description of the address on which to listen for ssh "
+ "connections"
+ ),
+ ],
+ [
+ "passwd",
+ "p",
+ "/etc/passwd",
+ "name of a passwd(5)-format username/password file",
+ ],
+ [
+ "sshKeyDir",
+ None,
+ "<USER DATA DIR>",
+ "Directory where the autogenerated SSH key is kept.",
+ ],
+ ["sshKeyName", None, "server.key", "Filename of the autogenerated SSH key."],
+ ["sshKeySize", None, 4096, "Size of the automatically generated SSH key."],
+ ]
+
+ def __init__(self):
+ usage.Options.__init__(self)
+ self["namespace"] = None
+
+ def postOptions(self):
+ if self["telnetPort"] is None and self["sshPort"] is None:
+ raise usage.UsageError(
+ "At least one of --telnetPort and --sshPort must be specified"
+ )
+
+
+def makeService(options):
+ """
+ Create a manhole server service.
+
+ @type options: L{dict}
+ @param options: A mapping describing the configuration of
+ the desired service. Recognized key/value pairs are::
+
+ "telnetPort": strports description of the address on which
+ to listen for telnet connections. If None,
+ no telnet service will be started.
+
+ "sshPort": strports description of the address on which to
+ listen for ssh connections. If None, no ssh
+ service will be started.
+
+ "namespace": dictionary containing desired initial locals
+ for manhole connections. If None, an empty
+ dictionary will be used.
+
+ "passwd": Name of a passwd(5)-format username/password file.
+
+ "sshKeyDir": The folder that the SSH server key will be kept in.
+
+ "sshKeyName": The filename of the key.
+
+ "sshKeySize": The size of the key, in bits. Default is 4096.
+
+ @rtype: L{twisted.application.service.IService}
+ @return: A manhole service.
+ """
+ svc = service.MultiService()
+
+ namespace = options["namespace"]
+ if namespace is None:
+ namespace = {}
+
+ checker = checkers.FilePasswordDB(options["passwd"])
+
+ if options["telnetPort"]:
+ telnetRealm = _StupidRealm(
+ telnet.TelnetBootstrapProtocol,
+ insults.ServerProtocol,
+ manhole.ColoredManhole,
+ namespace,
+ )
+
+ telnetPortal = portal.Portal(telnetRealm, [checker])
+
+ telnetFactory = protocol.ServerFactory()
+ telnetFactory.protocol = makeTelnetProtocol(telnetPortal)
+ telnetService = strports.service(options["telnetPort"], telnetFactory)
+ telnetService.setServiceParent(svc)
+
+ if options["sshPort"]:
+ sshRealm = manhole_ssh.TerminalRealm()
+ sshRealm.chainedProtocolFactory = chainedProtocolFactory(namespace)
+
+ sshPortal = portal.Portal(sshRealm, [checker])
+ sshFactory = manhole_ssh.ConchFactory(sshPortal)
+
+ if options["sshKeyDir"] != "<USER DATA DIR>":
+ keyDir = options["sshKeyDir"]
+ else:
+ from twisted.python._appdirs import getDataDirectory
+
+ keyDir = getDataDirectory()
+
+ keyLocation = filepath.FilePath(keyDir).child(options["sshKeyName"])
+
+ sshKey = keys._getPersistentRSAKey(keyLocation, int(options["sshKeySize"]))
+ sshFactory.publicKeys[b"ssh-rsa"] = sshKey
+ sshFactory.privateKeys[b"ssh-rsa"] = sshKey
+
+ sshService = strports.service(options["sshPort"], sshFactory)
+ sshService.setServiceParent(svc)
+
+ return svc