aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/Twisted/py3/twisted/names/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/names/tap.py
parent523f645a83a0ec97a0332dbc3863bb354c92a328 (diff)
downloadydb-b8cf9e88f4c5c64d9406af533d8948deb050d695.tar.gz
add kikimr_configure
Diffstat (limited to 'contrib/python/Twisted/py3/twisted/names/tap.py')
-rw-r--r--contrib/python/Twisted/py3/twisted/names/tap.py149
1 files changed, 149 insertions, 0 deletions
diff --git a/contrib/python/Twisted/py3/twisted/names/tap.py b/contrib/python/Twisted/py3/twisted/names/tap.py
new file mode 100644
index 0000000000..c971c10386
--- /dev/null
+++ b/contrib/python/Twisted/py3/twisted/names/tap.py
@@ -0,0 +1,149 @@
+# -*- test-case-name: twisted.names.test.test_tap -*-
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+"""
+Domain Name Server
+"""
+
+import os
+import traceback
+
+from twisted.application import internet, service
+from twisted.names import authority, dns, secondary, server
+from twisted.python import usage
+
+
+class Options(usage.Options):
+ optParameters = [
+ ["interface", "i", "", "The interface to which to bind"],
+ ["port", "p", "53", "The port on which to listen"],
+ [
+ "resolv-conf",
+ None,
+ None,
+ "Override location of resolv.conf (implies --recursive)",
+ ],
+ ["hosts-file", None, None, "Perform lookups with a hosts file"],
+ ]
+
+ optFlags = [
+ ["cache", "c", "Enable record caching"],
+ ["recursive", "r", "Perform recursive lookups"],
+ ["verbose", "v", "Log verbosely"],
+ ]
+
+ compData = usage.Completions(
+ optActions={"interface": usage.CompleteNetInterfaces()}
+ )
+
+ zones = None
+ zonefiles = None
+
+ def __init__(self):
+ usage.Options.__init__(self)
+ self["verbose"] = 0
+ self.bindfiles = []
+ self.zonefiles = []
+ self.secondaries = []
+
+ def opt_pyzone(self, filename):
+ """Specify the filename of a Python syntax zone definition"""
+ if not os.path.exists(filename):
+ raise usage.UsageError(filename + ": No such file")
+ self.zonefiles.append(filename)
+
+ def opt_bindzone(self, filename):
+ """Specify the filename of a BIND9 syntax zone definition"""
+ if not os.path.exists(filename):
+ raise usage.UsageError(filename + ": No such file")
+ self.bindfiles.append(filename)
+
+ def opt_secondary(self, ip_domain):
+ """Act as secondary for the specified domain, performing
+ zone transfers from the specified IP (IP/domain)
+ """
+ args = ip_domain.split("/", 1)
+ if len(args) != 2:
+ raise usage.UsageError("Argument must be of the form IP[:port]/domain")
+ address = args[0].split(":")
+ if len(address) == 1:
+ address = (address[0], dns.PORT)
+ else:
+ try:
+ port = int(address[1])
+ except ValueError:
+ raise usage.UsageError(
+ f"Specify an integer port number, not {address[1]!r}"
+ )
+ address = (address[0], port)
+ self.secondaries.append((address, [args[1]]))
+
+ def opt_verbose(self):
+ """Increment verbosity level"""
+ self["verbose"] += 1
+
+ def postOptions(self):
+ if self["resolv-conf"]:
+ self["recursive"] = True
+
+ self.svcs = []
+ self.zones = []
+ for f in self.zonefiles:
+ try:
+ self.zones.append(authority.PySourceAuthority(f))
+ except Exception:
+ traceback.print_exc()
+ raise usage.UsageError("Invalid syntax in " + f)
+ for f in self.bindfiles:
+ try:
+ self.zones.append(authority.BindAuthority(f))
+ except Exception:
+ traceback.print_exc()
+ raise usage.UsageError("Invalid syntax in " + f)
+ for f in self.secondaries:
+ svc = secondary.SecondaryAuthorityService.fromServerAddressAndDomains(*f)
+ self.svcs.append(svc)
+ self.zones.append(self.svcs[-1].getAuthority())
+ try:
+ self["port"] = int(self["port"])
+ except ValueError:
+ raise usage.UsageError("Invalid port: {!r}".format(self["port"]))
+
+
+def _buildResolvers(config):
+ """
+ Build DNS resolver instances in an order which leaves recursive
+ resolving as a last resort.
+
+ @type config: L{Options} instance
+ @param config: Parsed command-line configuration
+
+ @return: Two-item tuple of a list of cache resovers and a list of client
+ resolvers
+ """
+ from twisted.names import cache, client, hosts
+
+ ca, cl = [], []
+ if config["cache"]:
+ ca.append(cache.CacheResolver(verbose=config["verbose"]))
+ if config["hosts-file"]:
+ cl.append(hosts.Resolver(file=config["hosts-file"]))
+ if config["recursive"]:
+ cl.append(client.createResolver(resolvconf=config["resolv-conf"]))
+ return ca, cl
+
+
+def makeService(config):
+ ca, cl = _buildResolvers(config)
+
+ f = server.DNSServerFactory(config.zones, ca, cl, config["verbose"])
+ p = dns.DNSDatagramProtocol(f)
+ f.noisy = 0
+ ret = service.MultiService()
+ for klass, arg in [(internet.TCPServer, f), (internet.UDPServer, p)]:
+ s = klass(config["port"], arg, interface=config["interface"])
+ s.setServiceParent(ret)
+ for svc in config.svcs:
+ svc.setServiceParent(ret)
+ return ret