xref: /minix3/external/bsd/bind/dist/contrib/queryperf/utils/gen-data-queryperf.py (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
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