3 from pysqlite2 import dbapi2 as db
4 from cStringIO import StringIO
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)
32 regdb = db.connect('regulatory.sqlite')
33 cursor = regdb.cursor()
37 # struct regdb_file_header
40 reg_country_ptr = PTR(output)
41 # add number of countries
42 cursor.execute('SELECT COUNT(*) FROM reg_country;')
43 be32(output, cursor.fetchone()[0])
47 # just to make sure db scheme isn't bad
48 cursor.execute('''SELECT power_rule_id,
54 max_eirp_ptp_mbm FROM power_rule;''')
57 power_rules[power_rule_id] = output.tell()
58 # struct regdb_file_power_rule
59 output.write(struct.pack('>cxxxIIIII', str(pr[1]), *pr[2:]))
62 # just to make sure db scheme isn't bad
63 cursor.execute('''SELECT freq_range_id,
68 misc_restrictions FROM freq_range;''')
71 freq_ranges[freq_range_id] = output.tell()
72 # struct regdb_file_freq_range
73 output.write(struct.pack('>IIIII', *fr[1:]))
77 # just to make sure db scheme isn't bad
78 cursor.execute('SELECT reg_rule_id, freq_range_id, power_rule_id FROM reg_rule;')
79 for reg_rule in cursor:
80 reg_rule_id, freq_range_id, power_rule_id = reg_rule
81 reg_rules[reg_rule_id] = output.tell()
82 # struct regdb_file_reg_rule
83 output.write(struct.pack('>II', freq_ranges[freq_range_id], power_rules[power_rule_id]))
87 # just to make sure db scheme isn't bad
88 cursor.execute('SELECT entry_id, reg_collection_id, reg_rule_id FROM reg_rules_collection;')
90 entry_id, reg_collection_id, reg_rule_id = coll
91 l = collection_data.get(reg_collection_id, [])
93 collection_data[reg_collection_id] = l
95 reg_rules_collections = {}
97 for rc, l in collection_data.iteritems():
98 reg_rules_collections[rc] = output.tell()
99 # struct regdb_file_reg_rules_collection
102 be32(output, reg_rules[regrule])
104 # update country pointer now!
105 reg_country_ptr.set()
107 # just to make sure db scheme isn't bad
108 cursor.execute('SELECT reg_country_id, alpha2, reg_collection_id FROM reg_country;')
109 for country in cursor:
110 reg_country_id, alpha2, reg_collection_id = country
111 # struct regdb_file_reg_country
112 output.write(struct.pack('>ccxxI', str(alpha2[0]), str(alpha2[1]), reg_rules_collections[reg_collection_id]))
114 # Load RSA only now so people can use this script
115 # without having those libraries installed to verify
117 from M2Crypto import RSA
119 # determine signature length
120 key = RSA.load_key('key.priv.pem')
122 hash.update(output.getvalue())
123 sig = key.sign(hash.digest())
128 hash.update(output.getvalue())
129 sig = key.sign(hash.digest())
133 outfile = open('regulatory.bin', 'w')
134 outfile.write(output.getvalue())