167 lines
4.7 KiB
Python
167 lines
4.7 KiB
Python
|
# -*- coding: iso-8859-1 -*-
|
||
|
"""
|
||
|
Regulatory Database
|
||
|
|
||
|
@copyright: 2008 Johannes Berg
|
||
|
@license: ISC, see LICENSE for details.
|
||
|
"""
|
||
|
|
||
|
import codecs, math
|
||
|
from dbparse import DBParser, flag_definitions
|
||
|
|
||
|
Dependencies = ["time"]
|
||
|
|
||
|
def _country(macro, countries, code):
|
||
|
result = []
|
||
|
|
||
|
f = macro.formatter
|
||
|
|
||
|
result.extend([
|
||
|
f.heading(1, 1),
|
||
|
f.text('Regulatory definition for %s' % _get_iso_code(code)),
|
||
|
f.heading(0, 1),
|
||
|
])
|
||
|
|
||
|
try:
|
||
|
country = countries[code]
|
||
|
except:
|
||
|
result.append(f.text('No information available'))
|
||
|
return ''.join(result)
|
||
|
|
||
|
|
||
|
if country.comments:
|
||
|
result.extend([
|
||
|
f.preformatted(1),
|
||
|
f.text('\n'.join(country.comments)),
|
||
|
f.preformatted(0),
|
||
|
])
|
||
|
|
||
|
result.append(f.table(1))
|
||
|
result.extend([
|
||
|
f.table_row(1),
|
||
|
f.table_cell(1), f.strong(1),
|
||
|
f.text('Band [MHz]'),
|
||
|
f.strong(0), f.table_cell(0),
|
||
|
f.table_cell(1), f.strong(1),
|
||
|
f.text('Max BW [MHz]'),
|
||
|
f.strong(0), f.table_cell(0),
|
||
|
f.table_cell(1), f.strong(1),
|
||
|
f.text('Flags'),
|
||
|
f.strong(0), f.table_cell(0),
|
||
|
f.table_cell(1), f.strong(1),
|
||
|
f.text('Max antenna gain [dBi]'),
|
||
|
f.strong(0), f.table_cell(0),
|
||
|
f.table_cell(1), f.strong(1),
|
||
|
f.text('Max EIRP [dBm'),
|
||
|
f.hardspace,
|
||
|
f.text('(mW)]'),
|
||
|
f.strong(0), f.table_cell(0),
|
||
|
f.table_row(0),
|
||
|
])
|
||
|
|
||
|
for perm in country.permissions:
|
||
|
def str_or_na(val, dBm=False):
|
||
|
if val and not dBm:
|
||
|
return '%.2f' % val
|
||
|
elif val:
|
||
|
return '%.2f (%.2f)' % (val, math.pow(10, val/10.0))
|
||
|
return 'N/A'
|
||
|
result.extend([
|
||
|
f.table_row(1),
|
||
|
f.table_cell(1),
|
||
|
f.text('%.3f - %.3f' % (perm.freqband.start, perm.freqband.end)),
|
||
|
f.table_cell(0),
|
||
|
f.table_cell(1),
|
||
|
f.text('%.3f' % (perm.freqband.maxbw,)),
|
||
|
f.table_cell(0),
|
||
|
f.table_cell(1),
|
||
|
f.text(', '.join(perm.textflags)),
|
||
|
f.table_cell(0),
|
||
|
f.table_cell(1),
|
||
|
f.text(str_or_na(perm.power.max_ant_gain)),
|
||
|
f.table_cell(0),
|
||
|
f.table_cell(1),
|
||
|
f.text(str_or_na(perm.power.max_eirp, dBm=True)),
|
||
|
f.table_cell(0),
|
||
|
f.table_row(0),
|
||
|
])
|
||
|
|
||
|
result.append(f.table(0))
|
||
|
|
||
|
result.append(f.linebreak(0))
|
||
|
result.append(f.linebreak(0))
|
||
|
result.append(macro.request.page.link_to(macro.request, 'return to country list'))
|
||
|
return ''.join(result)
|
||
|
|
||
|
_iso_list = {}
|
||
|
|
||
|
def _get_iso_code(code):
|
||
|
if not _iso_list:
|
||
|
for line in codecs.open('/usr/share/iso-codes/iso_3166.tab', encoding='utf-8'):
|
||
|
line = line.strip()
|
||
|
c, name = line.split('\t')
|
||
|
_iso_list[c] = name
|
||
|
return _iso_list.get(code, 'Unknown (%s)' % code)
|
||
|
|
||
|
def macro_Regulatory(macro):
|
||
|
_ = macro.request.getText
|
||
|
request = macro.request
|
||
|
f = macro.formatter
|
||
|
|
||
|
country = request.form.get('alpha2', [None])[0]
|
||
|
|
||
|
dbpath = '/tmp/db.txt'
|
||
|
if hasattr(request.cfg, 'regdb_path'):
|
||
|
dbpath = request.cfg.regdb_path
|
||
|
|
||
|
result = []
|
||
|
|
||
|
if request.form.get('raw', [None])[0]:
|
||
|
result.append(f.code_area(1, 'db-raw', show=1, start=1, step=1))
|
||
|
for line in open(dbpath):
|
||
|
result.extend([
|
||
|
f.code_line(1),
|
||
|
f.text(line.rstrip()),
|
||
|
f.code_line(0),
|
||
|
])
|
||
|
result.append(f.code_area(0, 'db-raw'))
|
||
|
result.append(macro.request.page.link_to(macro.request, 'return to country list'))
|
||
|
return ''.join(result)
|
||
|
|
||
|
warnings = []
|
||
|
countries = DBParser(warn=lambda x: warnings.append(x)).parse(open(dbpath))
|
||
|
|
||
|
if country:
|
||
|
return _country(macro, countries, country)
|
||
|
|
||
|
countries = countries.keys()
|
||
|
countries = [(_get_iso_code(code), code) for code in countries]
|
||
|
countries.sort()
|
||
|
|
||
|
result.extend([
|
||
|
f.heading(1, 1),
|
||
|
f.text('Countries'),
|
||
|
f.heading(0, 1),
|
||
|
])
|
||
|
|
||
|
result.append(f.bullet_list(1))
|
||
|
for name, code in countries:
|
||
|
result.extend([
|
||
|
f.listitem(1),
|
||
|
request.page.link_to(request, name, querystr={'alpha2': code}),
|
||
|
f.listitem(0),
|
||
|
])
|
||
|
result.append(f.bullet_list(0))
|
||
|
|
||
|
if warnings:
|
||
|
result.append(f.heading(1, 2))
|
||
|
result.append(f.text("Warnings"))
|
||
|
result.append(f.heading(0, 2))
|
||
|
result.append(f.preformatted(1))
|
||
|
result.extend(warnings)
|
||
|
result.append(f.preformatted(0))
|
||
|
|
||
|
result.append(request.page.link_to(request, 'view raw database', querystr={'raw': 1}))
|
||
|
|
||
|
return ''.join(result)
|