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/py2/twisted/runner/inetdtap.py | |
parent | 523f645a83a0ec97a0332dbc3863bb354c92a328 (diff) | |
download | ydb-b8cf9e88f4c5c64d9406af533d8948deb050d695.tar.gz |
add kikimr_configure
Diffstat (limited to 'contrib/python/Twisted/py2/twisted/runner/inetdtap.py')
-rw-r--r-- | contrib/python/Twisted/py2/twisted/runner/inetdtap.py | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/contrib/python/Twisted/py2/twisted/runner/inetdtap.py b/contrib/python/Twisted/py2/twisted/runner/inetdtap.py new file mode 100644 index 0000000000..b959942c51 --- /dev/null +++ b/contrib/python/Twisted/py2/twisted/runner/inetdtap.py @@ -0,0 +1,109 @@ +# -*- test-case-name: twisted.runner.test.test_inetdtap -*- +# Copyright (c) Twisted Matrix Laboratories. +# See LICENSE for details. + +""" +Twisted inetd TAP support + +The purpose of inetdtap is to provide an inetd-like server, to allow Twisted to +invoke other programs to handle incoming sockets. +This is a useful thing as a "networking swiss army knife" tool, like netcat. +""" + +import pwd, grp, socket + +from twisted.runner import inetd, inetdconf +from twisted.python import log, usage +from twisted.internet.protocol import ServerFactory +from twisted.application import internet, service as appservice + +# Protocol map +protocolDict = {'tcp': socket.IPPROTO_TCP, 'udp': socket.IPPROTO_UDP} + + +class Options(usage.Options): + """ + To use it, create a file named `sample-inetd.conf` with: + + 8123 stream tcp wait some_user /bin/cat - + + You can then run it as in the following example and port 8123 became an + echo server. + + twistd -n inetd -f sample-inetd.conf + """ + + optParameters = [ + ['rpc', 'r', '/etc/rpc', 'DEPRECATED. RPC procedure table file'], + ['file', 'f', '/etc/inetd.conf', 'Service configuration file'] + ] + + optFlags = [['nointernal', 'i', "Don't run internal services"]] + + compData = usage.Completions( + optActions={"file": usage.CompleteFiles('*.conf')} + ) + + + +def makeService(config): + s = appservice.MultiService() + conf = inetdconf.InetdConf() + with open(config['file']) as f: + conf.parseFile(f) + + for service in conf.services: + protocol = service.protocol + + if service.protocol.startswith('rpc/'): + log.msg('Skipping rpc service due to lack of rpc support') + continue + + if (protocol, service.socketType) not in [('tcp', 'stream'), + ('udp', 'dgram')]: + log.msg('Skipping unsupported type/protocol: %s/%s' + % (service.socketType, service.protocol)) + continue + + # Convert the username into a uid (if necessary) + try: + service.user = int(service.user) + except ValueError: + try: + service.user = pwd.getpwnam(service.user)[2] + except KeyError: + log.msg('Unknown user: ' + service.user) + continue + + # Convert the group name into a gid (if necessary) + if service.group is None: + # If no group was specified, use the user's primary group + service.group = pwd.getpwuid(service.user)[3] + else: + try: + service.group = int(service.group) + except ValueError: + try: + service.group = grp.getgrnam(service.group)[2] + except KeyError: + log.msg('Unknown group: ' + service.group) + continue + + if service.program == 'internal': + if config['nointernal']: + continue + + # Internal services can use a standard ServerFactory + if service.name not in inetd.internalProtocols: + log.msg('Unknown internal service: ' + service.name) + continue + factory = ServerFactory() + factory.protocol = inetd.internalProtocols[service.name] + else: + factory = inetd.InetdFactory(service) + + if protocol == 'tcp': + internet.TCPServer(service.port, factory).setServiceParent(s) + elif protocol == 'udp': + raise RuntimeError("not supporting UDP") + return s |