3 from cStringIO import StringIO
6 from dbparse import DBParser, create_rules, create_collections
11 def be32(output, val):
12 output.write(struct.pack('>I', val))
15 def __init__(self, output):
17 self._pos = output.tell()
18 be32(output, 0xFFFFFFFF)
20 def set(self, val=None):
22 val = self._output.tell()
24 pos = self._output.tell()
25 self._output.seek(self._pos)
26 be32(self._output, val)
27 self._output.seek(pos)
33 bands, power, countries = p.parse(file('db.txt'))
34 rules = create_rules(countries)
35 collections = create_collections(countries)
39 # struct regdb_file_header
42 reg_country_ptr = PTR(output)
43 # add number of countries
44 be32(output, len(countries))
48 for power_rule_id, pr in power.iteritems():
50 pr = [int(v * 100) for v in pr[1:]]
51 power_rules[power_rule_id] = output.tell()
52 # struct regdb_file_power_rule
53 output.write(struct.pack('>cxxxIIIII', str(environ), *pr))
56 for freq_range_id, fr in bands.iteritems():
57 freq_ranges[freq_range_id] = output.tell()
59 fr = [int(f * 1000) for f in fr[:3]]
60 # struct regdb_file_freq_range
61 output.write(struct.pack('>IIIII', fr[0], fr[1], fr[2], fl, 0))
65 for reg_rule in rules:
66 freq_range_id, power_rule_id = reg_rule
67 reg_rules[reg_rule] = output.tell()
68 # struct regdb_file_reg_rule
69 output.write(struct.pack('>II', freq_ranges[freq_range_id], power_rules[power_rule_id]))
72 reg_rules_collections = {}
74 for coll in collections:
75 reg_rules_collections[coll] = output.tell()
76 # struct regdb_file_reg_rules_collection
77 be32(output, len(coll))
79 be32(output, reg_rules[regrule])
81 # update country pointer now!
84 countrynames = countries.keys()
86 for alpha2 in countrynames:
87 coll = countries[alpha2]
88 # struct regdb_file_reg_country
89 output.write(struct.pack('>ccxxI', str(alpha2[0]), str(alpha2[1]), reg_rules_collections[coll]))
91 # Load RSA only now so people can use this script
92 # without having those libraries installed to verify
94 from M2Crypto import RSA
96 # determine signature length
97 key = RSA.load_key('key.priv.pem')
99 hash.update(output.getvalue())
100 sig = key.sign(hash.digest())
105 hash.update(output.getvalue())
106 sig = key.sign(hash.digest())
110 outfile = open('regulatory.bin', 'w')
111 outfile.write(output.getvalue())