1*00b67f09SDavid van Moolenbroek#!/usr/bin/python 2*00b67f09SDavid van Moolenbroek 3*00b67f09SDavid van Moolenbroek# 4*00b67f09SDavid van Moolenbroek# Id: gen-data-queryperf.py,v 1.2 2008/06/13 18:17:08 jinmei Exp 5*00b67f09SDavid van Moolenbroek# 6*00b67f09SDavid van Moolenbroek# Contributed by Stephane Bortzmeyer <bortzmeyer@nic.fr> 7*00b67f09SDavid van Moolenbroek# 8*00b67f09SDavid van Moolenbroek# "A small tool which may be useful with contrib/queryperf. This script 9*00b67f09SDavid van Moolenbroek# can generate files of queries, both with random names (to test the 10*00b67f09SDavid van Moolenbroek# behaviour with NXdomain) and with domains from a real zone file." 11*00b67f09SDavid van Moolenbroek# 12*00b67f09SDavid van Moolenbroek 13*00b67f09SDavid van Moolenbroekimport sys 14*00b67f09SDavid van Moolenbroekimport getopt 15*00b67f09SDavid van Moolenbroekimport random 16*00b67f09SDavid van Moolenbroekimport re 17*00b67f09SDavid van Moolenbroek 18*00b67f09SDavid van Moolenbroekldh = [] 19*00b67f09SDavid van Moolenbroek# Letters 20*00b67f09SDavid van Moolenbroekfor i in range(97, 122): 21*00b67f09SDavid van Moolenbroek ldh.append(chr(i)) 22*00b67f09SDavid van Moolenbroek# Digits 23*00b67f09SDavid van Moolenbroekfor i in range(48, 57): 24*00b67f09SDavid van Moolenbroek ldh.append(chr(i)) 25*00b67f09SDavid van Moolenbroek# Hyphen 26*00b67f09SDavid van Moolenbroekldh.append('-') 27*00b67f09SDavid van Moolenbroek 28*00b67f09SDavid van Moolenbroekmaxsize=10 29*00b67f09SDavid van Moolenbroektld='org' 30*00b67f09SDavid van Moolenbroeknum=4 31*00b67f09SDavid van Moolenbroekpercent_random = 0.3 32*00b67f09SDavid van Moolenbroekgen = None 33*00b67f09SDavid van Moolenbroekzone_file = None 34*00b67f09SDavid van Moolenbroekdomains = {} 35*00b67f09SDavid van Moolenbroekdomain_ns = r'^([a-z0-9-\.]+)((\s+\d+)?(\s+IN)?|(\s+IN)(\s+\d+)?)\s+NS' 36*00b67f09SDavid van Moolenbroekdomain_ns_re = re.compile(domain_ns, re.IGNORECASE) 37*00b67f09SDavid van Moolenbroek 38*00b67f09SDavid van Moolenbroekdef remove_tld(label, tld): 39*00b67f09SDavid van Moolenbroek if label.endswith('.' + tld + '.'): 40*00b67f09SDavid van Moolenbroek return label[0:-(1+ len(tld) + 1)] 41*00b67f09SDavid van Moolenbroek else: 42*00b67f09SDavid van Moolenbroek return label 43*00b67f09SDavid van Moolenbroek 44*00b67f09SDavid van Moolenbroekdef gen_random_label(): 45*00b67f09SDavid van Moolenbroek label = "" 46*00b67f09SDavid van Moolenbroek for i in range(gen.randint(1, maxsize)): 47*00b67f09SDavid van Moolenbroek label = label + gen.choice(ldh) 48*00b67f09SDavid van Moolenbroek return label 49*00b67f09SDavid van Moolenbroek 50*00b67f09SDavid van Moolenbroekdef make_domain(label): 51*00b67f09SDavid van Moolenbroek return "www." + label + "." + tld + " A" 52*00b67f09SDavid van Moolenbroek 53*00b67f09SDavid van Moolenbroekdef usage(): 54*00b67f09SDavid van Moolenbroek sys.stdout.write("Usage: " + sys.argv[0] + " [-n number] " + \ 55*00b67f09SDavid van Moolenbroek "[-p percent-random] [-t TLD]\n") 56*00b67f09SDavid van Moolenbroek sys.stdout.write(" [-m MAXSIZE] [-f zone-file]\n") 57*00b67f09SDavid van Moolenbroek 58*00b67f09SDavid van Moolenbroektry: 59*00b67f09SDavid van Moolenbroek optlist, args = getopt.getopt(sys.argv[1:], "hp:f:n:t:m:", 60*00b67f09SDavid van Moolenbroek ["help", "percentrandom=", "zonefile=", 61*00b67f09SDavid van Moolenbroek "number=", "tld=", 62*00b67f09SDavid van Moolenbroek "maxsize="]) 63*00b67f09SDavid van Moolenbroek for option, value in optlist: 64*00b67f09SDavid van Moolenbroek if option == "--help" or option == "-h": 65*00b67f09SDavid van Moolenbroek usage() 66*00b67f09SDavid van Moolenbroek sys.exit(0) 67*00b67f09SDavid van Moolenbroek elif option == "--number" or option == "-n": 68*00b67f09SDavid van Moolenbroek num = int(value) 69*00b67f09SDavid van Moolenbroek elif option == "--maxsize" or option == "-m": 70*00b67f09SDavid van Moolenbroek maxsize = int(value) 71*00b67f09SDavid van Moolenbroek elif option == "--percentrandom" or option == "-p": 72*00b67f09SDavid van Moolenbroek percent_random = float(value) 73*00b67f09SDavid van Moolenbroek elif option == "--tld" or option == "-t": 74*00b67f09SDavid van Moolenbroek tld = str(value) 75*00b67f09SDavid van Moolenbroek elif option == "--zonefile" or option == "-f": 76*00b67f09SDavid van Moolenbroek zone_file = str(value) 77*00b67f09SDavid van Moolenbroek else: 78*00b67f09SDavid van Moolenbroek error("Unknown option " + option) 79*00b67f09SDavid van Moolenbroekexcept getopt.error, reason: 80*00b67f09SDavid van Moolenbroek sys.stderr.write(sys.argv[0] + ": " + str(reason) + "\n") 81*00b67f09SDavid van Moolenbroek usage() 82*00b67f09SDavid van Moolenbroek sys.exit(1) 83*00b67f09SDavid van Moolenbroek 84*00b67f09SDavid van Moolenbroekif len(args) <> 0: 85*00b67f09SDavid van Moolenbroek usage() 86*00b67f09SDavid van Moolenbroek sys.exit(1) 87*00b67f09SDavid van Moolenbroek 88*00b67f09SDavid van Moolenbroekgen = random.Random() 89*00b67f09SDavid van Moolenbroekif zone_file: 90*00b67f09SDavid van Moolenbroek file = open(zone_file) 91*00b67f09SDavid van Moolenbroek line = file.readline() 92*00b67f09SDavid van Moolenbroek while line: 93*00b67f09SDavid van Moolenbroek domain_line = domain_ns_re.match(line) 94*00b67f09SDavid van Moolenbroek if domain_line: 95*00b67f09SDavid van Moolenbroek print domain_line.group(1) 96*00b67f09SDavid van Moolenbroek domain = remove_tld(domain_line.group(1), tld) 97*00b67f09SDavid van Moolenbroek domains[domain] = 1 98*00b67f09SDavid van Moolenbroek line = file.readline() 99*00b67f09SDavid van Moolenbroek file.close() 100*00b67f09SDavid van Moolenbroekif zone_file: 101*00b67f09SDavid van Moolenbroek domains = domains.keys() 102*00b67f09SDavid van Moolenbroek if len(domains) == 0: 103*00b67f09SDavid van Moolenbroek sys.stderr.write("No domains found in '%s'\n" % zone_file) 104*00b67f09SDavid van Moolenbroek sys.exit(1) 105*00b67f09SDavid van Moolenbroekfor i in range(num): 106*00b67f09SDavid van Moolenbroek if zone_file: 107*00b67f09SDavid van Moolenbroek if gen.random() < percent_random: 108*00b67f09SDavid van Moolenbroek sys.stdout.write(make_domain(gen_random_label())) 109*00b67f09SDavid van Moolenbroek else: 110*00b67f09SDavid van Moolenbroek sys.stdout.write(make_domain(gen.choice(domains))) 111*00b67f09SDavid van Moolenbroek else: 112*00b67f09SDavid van Moolenbroek sys.stdout.write(make_domain(gen_random_label())) 113*00b67f09SDavid van Moolenbroek sys.stdout.write("\n") 114