3 from pysqlite2 import dbapi2 as db
4 from cStringIO import StringIO
6 from M2Crypto import RSA
12 def be32(output, val):
13 output.write(struct.pack('>I', val))
16 def __init__(self, output):
18 self._pos = output.tell()
19 be32(output, 0xFFFFFFFF)
21 def set(self, val=None):
23 val = self._output.tell()
25 pos = self._output.tell()
26 self._output.seek(self._pos)
27 be32(self._output, val)
28 self._output.seek(pos)
33 regdb = db.connect('regulatory.sqlite')
34 cursor = regdb.cursor()
38 # struct regdb_file_header
41 reg_country_ptr = PTR(output)
42 # add number of countries
43 cursor.execute('SELECT COUNT(*) FROM reg_country;')
44 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 key = RSA.load_key('key.priv.pem')
116 hash.update(output.getvalue())
117 sig = key.sign(hash.digest())
118 assert len(sig) == 128
121 outfile = open('regulatory.bin', 'w')
122 outfile.write(output.getvalue())