summaryrefslogtreecommitdiffstats
path: root/web
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 03:24:08 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 03:24:08 +0000
commit95bfafa9ff6abf9a19f7a85b429d502036be60cf (patch)
treef49bad15e2d2d770e1200eae1318c29b3de9ef9f /web
parentInitial commit. (diff)
downloadwireless-regdb-95bfafa9ff6abf9a19f7a85b429d502036be60cf.tar.xz
wireless-regdb-95bfafa9ff6abf9a19f7a85b429d502036be60cf.zip
Adding upstream version 2022.06.06.upstream/2022.06.06
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'web')
-rw-r--r--web/Regulatory.py166
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)