cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews#!/usr/bin/python
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews#
250dcb4cf5c356bb492c849edff5fe3c81f61f77Tatuya JINMEI 神明達哉# $Id: gen-data-queryperf.py,v 1.2 2008/06/13 18:17:08 jinmei Exp $
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews#
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews# Contributed by Stephane Bortzmeyer <bortzmeyer@nic.fr>
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews#
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews# "A small tool which may be useful with contrib/queryperf. This script
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews# can generate files of queries, both with random names (to test the
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews# behaviour with NXdomain) and with domains from a real zone file."
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews#
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrewsimport getopt
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrewsimport random
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrewsimport re
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrewsimport string
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrewsimport sys
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrewsmaxsize = 10
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrewstld = 'org'
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrewsnum = 4
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrewspercent_random = 0.3
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrewsgen = None
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrewszone_file = None
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrewsdomains = {}
250dcb4cf5c356bb492c849edff5fe3c81f61f77Tatuya JINMEI 神明達哉domain_ns = r'^([a-z0-9-\.]+)((\s+\d+)?(\s+IN)?|(\s+IN)(\s+\d+)?)\s+NS'
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrewsdomain_ns_re = re.compile(domain_ns, re.IGNORECASE)
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews
250dcb4cf5c356bb492c849edff5fe3c81f61f77Tatuya JINMEI 神明達哉def remove_tld(label, tld):
250dcb4cf5c356bb492c849edff5fe3c81f61f77Tatuya JINMEI 神明達哉 if label.endswith('.' + tld + '.'):
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews return label[0:-(1 + len(tld) + 1)]
250dcb4cf5c356bb492c849edff5fe3c81f61f77Tatuya JINMEI 神明達哉 else:
250dcb4cf5c356bb492c849edff5fe3c81f61f77Tatuya JINMEI 神明達哉 return label
250dcb4cf5c356bb492c849edff5fe3c81f61f77Tatuya JINMEI 神明達哉
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews# characters allowed in a label
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark AndrewsLDH = string.digits + string.ascii_lowercase + "-"
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrewsdef gen_random_label():
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews """
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews Generate a random DNS label.
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews Note that this may generate labels that start/end with '-'.
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews """
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews label = ""
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews for _ in range(gen.randint(1, maxsize)):
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews label = label + gen.choice(LDH)
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews return label
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrewsdef make_domain(label):
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews return "www." + label + "." + tld + " A"
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrewsdef usage():
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews sys.stdout.write("Usage: " + sys.argv[0] + " [-n number] " +
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews "[-p percent-random] [-t TLD]\n")
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews sys.stdout.write(" [-m MAXSIZE] [-f zone-file]\n")
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrewstry:
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews optlist, args = getopt.getopt(sys.argv[1:], "hp:f:n:t:m:",
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews ["help", "percentrandom=", "zonefile=",
250dcb4cf5c356bb492c849edff5fe3c81f61f77Tatuya JINMEI 神明達哉 "number=", "tld=",
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews "maxsize="])
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews for option, value in optlist:
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews if option == "--help" or option == "-h":
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews usage()
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews sys.exit(0)
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews elif option == "--number" or option == "-n":
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews num = int(value)
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews elif option == "--maxsize" or option == "-m":
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews maxsize = int(value)
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews elif option == "--percentrandom" or option == "-p":
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews percent_random = float(value)
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews elif option == "--tld" or option == "-t":
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews tld = str(value)
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews elif option == "--zonefile" or option == "-f":
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews zone_file = str(value)
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews else:
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews getopt.error("Unknown option " + option)
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrewsexcept getopt.error as reason:
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews sys.stderr.write(sys.argv[0] + ": " + str(reason) + "\n")
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews usage()
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews sys.exit(1)
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrewsif len(args) > 0:
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews usage()
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews sys.exit(1)
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrewsgen = random.Random()
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrewsif zone_file:
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews file = open(zone_file)
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews line = file.readline()
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews while line:
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews domain_line = domain_ns_re.match(line)
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews if domain_line:
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews print(domain_line.group(1))
250dcb4cf5c356bb492c849edff5fe3c81f61f77Tatuya JINMEI 神明達哉 domain = remove_tld(domain_line.group(1), tld)
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews domains[domain] = 1
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews line = file.readline()
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews file.close()
250dcb4cf5c356bb492c849edff5fe3c81f61f77Tatuya JINMEI 神明達哉if zone_file:
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews if not domains:
250dcb4cf5c356bb492c849edff5fe3c81f61f77Tatuya JINMEI 神明達哉 sys.stderr.write("No domains found in '%s'\n" % zone_file)
250dcb4cf5c356bb492c849edff5fe3c81f61f77Tatuya JINMEI 神明達哉 sys.exit(1)
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews domain_names = list(domains.keys())
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrewsfor i in range(num):
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews if zone_file:
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews if gen.random() < percent_random:
250dcb4cf5c356bb492c849edff5fe3c81f61f77Tatuya JINMEI 神明達哉 sys.stdout.write(make_domain(gen_random_label()))
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews else:
f6f3264d8c81cda5d489e29d2141f1a92fbe4c84Mark Andrews sys.stdout.write(make_domain(gen.choice(domain_names)))
cfa19fe5c9cf279b38e4258a54acb3fd16b9550bMark Andrews else:
250dcb4cf5c356bb492c849edff5fe3c81f61f77Tatuya JINMEI 神明達哉 sys.stdout.write(make_domain(gen_random_label()))
250dcb4cf5c356bb492c849edff5fe3c81f61f77Tatuya JINMEI 神明達哉 sys.stdout.write("\n")