diff options
Diffstat (limited to 'web/Regulatory.py')
-rw-r--r-- | web/Regulatory.py | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/web/Regulatory.py b/web/Regulatory.py new file mode 100644 index 0000000..f675921 --- /dev/null +++ b/web/Regulatory.py @@ -0,0 +1,166 @@ +# -*- 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) |