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/inetdconf.py | |
parent | 523f645a83a0ec97a0332dbc3863bb354c92a328 (diff) | |
download | ydb-b8cf9e88f4c5c64d9406af533d8948deb050d695.tar.gz |
add kikimr_configure
Diffstat (limited to 'contrib/python/Twisted/py2/twisted/runner/inetdconf.py')
-rw-r--r-- | contrib/python/Twisted/py2/twisted/runner/inetdconf.py | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/contrib/python/Twisted/py2/twisted/runner/inetdconf.py b/contrib/python/Twisted/py2/twisted/runner/inetdconf.py new file mode 100644 index 0000000000..391f2e0573 --- /dev/null +++ b/contrib/python/Twisted/py2/twisted/runner/inetdconf.py @@ -0,0 +1,198 @@ +# -*- test-case-name: twisted.runner.test.test_inetdconf -*- +# Copyright (c) Twisted Matrix Laboratories. +# See LICENSE for details. + +""" +Parser for inetd.conf files +""" + +# Various exceptions +class InvalidConfError(Exception): + """ + Invalid configuration file + """ + + + +class InvalidInetdConfError(InvalidConfError): + """ + Invalid inetd.conf file + """ + + + +class InvalidServicesConfError(InvalidConfError): + """ + Invalid services file + """ + + + +class UnknownService(Exception): + """ + Unknown service name + """ + + + +class SimpleConfFile: + """ + Simple configuration file parser superclass. + + Filters out comments and empty lines (which includes lines that only + contain comments). + + To use this class, override parseLine or parseFields. + """ + + commentChar = '#' + defaultFilename = None + + def parseFile(self, file=None): + """ + Parse a configuration file + + If file is None and self.defaultFilename is set, it will open + defaultFilename and use it. + """ + close = False + if file is None and self.defaultFilename: + file = open(self.defaultFilename,'r') + close = True + + try: + for line in file.readlines(): + # Strip out comments + comment = line.find(self.commentChar) + if comment != -1: + line = line[:comment] + + # Strip whitespace + line = line.strip() + + # Skip empty lines (and lines which only contain comments) + if not line: + continue + + self.parseLine(line) + finally: + if close: + file.close() + + + def parseLine(self, line): + """ + Override this. + + By default, this will split the line on whitespace and call + self.parseFields (catching any errors). + """ + try: + self.parseFields(*line.split()) + except ValueError: + raise InvalidInetdConfError('Invalid line: ' + repr(line)) + + + def parseFields(self, *fields): + """ + Override this. + """ + + + +class InetdService: + """ + A simple description of an inetd service. + """ + name = None + port = None + socketType = None + protocol = None + wait = None + user = None + group = None + program = None + programArgs = None + + def __init__(self, name, port, socketType, protocol, wait, user, group, + program, programArgs): + self.name = name + self.port = port + self.socketType = socketType + self.protocol = protocol + self.wait = wait + self.user = user + self.group = group + self.program = program + self.programArgs = programArgs + + + +class InetdConf(SimpleConfFile): + """ + Configuration parser for a traditional UNIX inetd(8) + """ + + defaultFilename = '/etc/inetd.conf' + + def __init__(self, knownServices=None): + self.services = [] + + if knownServices is None: + knownServices = ServicesConf() + knownServices.parseFile() + self.knownServices = knownServices + + + def parseFields(self, serviceName, socketType, protocol, wait, user, + program, *programArgs): + """ + Parse an inetd.conf file. + + Implemented from the description in the Debian inetd.conf man page. + """ + # Extract user (and optional group) + user, group = (user.split('.') + [None])[:2] + + # Find the port for a service + port = self.knownServices.services.get((serviceName, protocol), None) + if not port and not protocol.startswith('rpc/'): + # FIXME: Should this be discarded/ignored, rather than throwing + # an exception? + try: + port = int(serviceName) + serviceName = 'unknown' + except: + raise UnknownService("Unknown service: %s (%s)" % ( + serviceName, protocol)) + + self.services.append(InetdService(serviceName, port, socketType, + protocol, wait, user, group, program, + programArgs)) + + + +class ServicesConf(SimpleConfFile): + """ + /etc/services parser + + @ivar services: dict mapping service names to (port, protocol) tuples. + """ + + defaultFilename = '/etc/services' + + def __init__(self): + self.services = {} + + + def parseFields(self, name, portAndProtocol, *aliases): + try: + port, protocol = portAndProtocol.split('/') + port = int(port) + except: + raise InvalidServicesConfError( + 'Invalid port/protocol: %s' % (repr(portAndProtocol),)) + + self.services[(name, protocol)] = port + for alias in aliases: + self.services[(alias, protocol)] = port |