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])
48 # just to make sure db scheme isn't bad
49 cursor.execute('''SELECT power_rule_id,
55 max_eirp_ptp_mbm FROM power_rule;''')
58 power_rules[power_rule_id] = output.tell()
59 # struct regdb_file_power_rule
60 output.write(struct.pack('>cxxxIIIII', str(pr[1]), *pr[2:]))
63 # just to make sure db scheme isn't bad
64 cursor.execute('''SELECT freq_range_id,
69 misc_restrictions FROM freq_range;''')
72 freq_ranges[freq_range_id] = output.tell()
73 # struct regdb_file_freq_range
74 output.write(struct.pack('>IIIII', *fr[1:]))
78 # just to make sure db scheme isn't bad
79 cursor.execute('SELECT reg_rule_id, freq_range_id, power_rule_id FROM reg_rule;')
80 for reg_rule in cursor:
81 reg_rule_id, freq_range_id, power_rule_id = reg_rule
82 reg_rules[reg_rule_id] = output.tell()
83 # struct regdb_file_reg_rule
84 output.write(struct.pack('>II', freq_ranges[freq_range_id], power_rules[power_rule_id]))
88 # just to make sure db scheme isn't bad
89 cursor.execute('SELECT entry_id, reg_collection_id, reg_rule_id FROM reg_rules_collection;')
91 entry_id, reg_collection_id, reg_rule_id = coll
92 l = collection_data.get(reg_collection_id, [])
94 collection_data[reg_collection_id] = l
96 reg_rules_collections = {}
98 for rc, l in collection_data.iteritems():
99 reg_rules_collections[rc] = output.tell()
100 # struct regdb_file_reg_rules_collection
103 be32(output, reg_rules[regrule])
105 # update country pointer now!
106 reg_country_ptr.set()
108 # just to make sure db scheme isn't bad
109 cursor.execute('SELECT reg_country_id, alpha2, reg_collection_id FROM reg_country;')
110 for country in cursor:
111 reg_country_id, alpha2, reg_collection_id = country
112 # struct regdb_file_reg_country
113 output.write(struct.pack('>ccxxI', str(alpha2[0]), str(alpha2[1]), reg_rules_collections[reg_collection_id]))
115 # determine signature length
116 key = RSA.load_key('key.priv.pem')
118 hash.update(output.getvalue())
119 sig = key.sign(hash.digest())
124 hash.update(output.getvalue())
125 sig = key.sign(hash.digest())
129 outfile = open('regulatory.bin', 'w')
130 outfile.write(output.getvalue())