From 46856860536964ef33c4b609fb847767fcec3e1c Mon Sep 17 00:00:00 2001 From: KF7EEL Date: Wed, 9 Jun 2021 13:03:00 -0700 Subject: [PATCH] config and peer managment, masters WIP --- bridge.py | 108 +- hblink.py | 6 +- user_managment/app.py | 1404 ++++++++++++++++- .../templates/flask_user_layout.html | 17 +- 4 files changed, 1523 insertions(+), 12 deletions(-) diff --git a/bridge.py b/bridge.py index 7ea2bf1..2f22293 100755 --- a/bridge.py +++ b/bridge.py @@ -48,6 +48,7 @@ from dmr_utils3 import decode, bptc, const import config import log from const import * +from hashlib import sha256 # Stuff for socket reporting import pickle @@ -55,8 +56,8 @@ import pickle # The module needs logging, but handlers, etc. are controlled by the parent import logging logger = logging.getLogger(__name__) - - +import os, ast +import json, requests # Does anybody read this stuff? There's a PEP somewhere that says I should do this. __author__ = 'Cortney T. Buffington, N0MJS' __copyright__ = 'Copyright (c) 2016-2019 Cortney T. Buffington, N0MJS and the K0USY Group' @@ -65,6 +66,86 @@ __license__ = 'GNU GPLv3' __maintainer__ = 'Cort Buffington, N0MJS' __email__ = 'n0mjs@me.com' +##import os, ast +def download_config(L_CONFIG_FILE, cli_file): + user_man_url = L_CONFIG_FILE['USER_MANAGER']['URL'] + shared_secret = str(sha256(L_CONFIG_FILE['USER_MANAGER']['SHARED_SECRET'].encode()).hexdigest()) + config_check = { + 'get_config':L_CONFIG_FILE['USER_MANAGER']['THIS_SERVER_NAME'], + 'secret':shared_secret + } + json_object = json.dumps(config_check, indent = 4) + + try: + req = requests.post(user_man_url, data=json_object, headers={'Content-Type': 'application/json'}) + resp = json.loads(req.text) + print(resp) + +## print(type(resp)) +## conf = config.build_config(resp['config']) +## print(conf) +## with open('/tmp/conf_telp.cfg', 'w') as f: +## f.write(str(resp['config'])) +## print(resp) + iterate_config = resp['peers'].copy() + + corrected_config = resp['config'].copy() + corrected_config['SYSTEMS'] = {} + corrected_config['LOGGER'] = {} + corrected_config['SYSTEMS'].update(iterate_config) + corrected_config['LOGGER'].update(L_CONFIG_FILE['LOGGER']) + corrected_config['USER_MANAGER'].update(L_CONFIG_FILE['USER_MANAGER']) + print(iterate_config) + +## corrected_config = CONFIG_FILE.copy() + + +## print(corrected_config) +## print() +## print(iterate_config['config']['SYSTEMS']) +## print(resp['config']) +## print((iterate_config['test'])) +## print(corrected_config) + + corrected_config['GLOBAL']['TG1_ACL'] = config.acl_build(corrected_config['GLOBAL']['TG1_ACL'], 16776415) + corrected_config['GLOBAL']['TG2_ACL'] = config.acl_build(corrected_config['GLOBAL']['TG2_ACL'], 16776415) + corrected_config['GLOBAL']['REG_ACL'] = config.acl_build(corrected_config['GLOBAL']['REG_ACL'], 16776415) + corrected_config['GLOBAL']['SUB_ACL'] = config.acl_build(corrected_config['GLOBAL']['SUB_ACL'], 16776415) +## corrected_config['SYSTEMS'] = {} + for i in iterate_config: + print(i) +## corrected_config['SYSTEMS'][i] = {} + if iterate_config[i]['MODE'] == 'MASTER' or iterate_config[i]['MODE'] == 'PROXY': + corrected_config['SYSTEMS'][i]['TG1_ACL'] = config.acl_build(iterate_config[i]['TG1_ACL'], 16776415) + corrected_config['SYSTEMS'][i]['TG2_ACL'] = config.acl_build(iterate_config[i]['TG2_ACL'], 16776415) + else: + corrected_config['SYSTEMS'][i]['RADIO_ID'] = int(iterate_config[i]['RADIO_ID']).to_bytes(4, 'big') + corrected_config['SYSTEMS'][i]['TG1_ACL'] = config.acl_build(iterate_config[i]['TG1_ACL'], 16776415) + corrected_config['SYSTEMS'][i]['TG2_ACL'] = config.acl_build(iterate_config[i]['TG2_ACL'], 16776415) + corrected_config['SYSTEMS'][i]['USE_ACL'] = iterate_config[i]['USE_ACL'] + corrected_config['SYSTEMS'][i]['SUB_ACL'] = config.acl_build(iterate_config[i]['SUB_ACL'], 16776415) + corrected_config['SYSTEMS'][i]['MASTER_SOCKADDR'] = tuple(iterate_config[i]['MASTER_SOCKADDR']) + corrected_config['SYSTEMS'][i]['SOCK_ADDR'] = tuple(iterate_config[i]['SOCK_ADDR']) + corrected_config['SYSTEMS'][i].update({'STATS':{ + 'CONNECTION': 'NO', # NO, RTPL_SENT, AUTHENTICATED, CONFIG-SENT, YES + 'CONNECTED': None, + 'PINGS_SENT': 0, + 'PINGS_ACKD': 0, + 'NUM_OUTSTANDING': 0, + 'PING_OUTSTANDING': False, + 'LAST_PING_TX_TIME': 0, + 'LAST_PING_ACK_TIME': 0, + }}) + print(corrected_config) +## config.process_acls(corrected_config) +## print(corrected_config) + print('-------') + return corrected_config + # For exception, write blank dict + except requests.ConnectionError: + logger.error('Config server unreachable, defaulting to local config') + return config.build_config(cli_file) + # Module gobal varaibles # Dictionary for dynamically mapping unit (subscriber) to a system. @@ -1096,7 +1177,27 @@ if __name__ == '__main__': cli_args.CONFIG_FILE = os.path.dirname(os.path.abspath(__file__))+'/hblink.cfg' # Call the external routine to build the configuration dictionary - CONFIG = config.build_config(cli_args.CONFIG_FILE) + LOCAL_CONFIG = config.build_config(cli_args.CONFIG_FILE) + #print(LOCAL_CONFIG) + #print(download_config(LOCAL_CONFIG)) + #if LOCAL_CONFIG['USER_MANAGER']['REMOTE_CONFIG_ENABLED']: + #print(download_config(LOCAL_CONFIG)['config']) +## CONFIG = config.build_config(download_config(LOCAL_CONFIG)) + #CONFIG = download_config(LOCAL_CONFIG) + #if not LOCAL_CONFIG['USER_MANAGER']['REMOTE_CONFIG_ENABLED']: +## print(download_config(LOCAL_CONFIG)['config']) +## CONFIG = config.build_config(cli_args.CONFIG_FILE) + #print((CONFIG)) + + +## config.process_acls(LOCAL_CONFIG) + if LOCAL_CONFIG['USER_MANAGER']['REMOTE_CONFIG_ENABLED']: + CONFIG = download_config(LOCAL_CONFIG, cli_args.CONFIG_FILE) + else: + CONFIG = config.build_config(cli_args.CONFIG_FILE) + + +## print(CONFIG) # Ensure we have a path for the rules file, if one wasn't specified, then use the default (top of file) if not cli_args.RULES_FILE: @@ -1170,6 +1271,7 @@ if __name__ == '__main__': stream_trimmer = stream_trimmer_task.start(5) stream_trimmer.addErrback(loopingErrHandle) + # Download burn list with open(CONFIG['USER_MANAGER']['BURN_FILE'], 'w') as f: f.write(str(download_burnlist(CONFIG))) diff --git a/hblink.py b/hblink.py index 23101ea..d87589a 100755 --- a/hblink.py +++ b/hblink.py @@ -109,7 +109,7 @@ def acl_check(_id, _acl): def download_burnlist(_CONFIG): user_man_url = _CONFIG['USER_MANAGER']['URL'] - shared_secret = _CONFIG['USER_MANAGER']['SHARED_SECRET'] + shared_secret = str(sha256(_CONFIG['USER_MANAGER']['SHARED_SECRET'].encode()).hexdigest()) burn_check = { 'burn_list':True, 'secret':shared_secret @@ -257,7 +257,7 @@ class HBSYSTEM(DatagramProtocol): def check_user_man(self, _id, server_name, peer_ip): #Change this to a config value user_man_url = self._CONFIG['USER_MANAGER']['URL'] - shared_secret = self._CONFIG['USER_MANAGER']['SHARED_SECRET'] + shared_secret = str(sha256(self._CONFIG['USER_MANAGER']['SHARED_SECRET'].encode()).hexdigest()) #print(int(str(int_id(_id))[:7])) auth_check = { 'secret':shared_secret, @@ -276,7 +276,7 @@ class HBSYSTEM(DatagramProtocol): def send_login_conf(self, _id, server_name, peer_ip, old_auth): #Change this to a config value user_man_url = self._CONFIG['USER_MANAGER']['URL'] - shared_secret = self._CONFIG['USER_MANAGER']['SHARED_SECRET'] + shared_secret = str(sha256(self._CONFIG['USER_MANAGER']['SHARED_SECRET'].encode()).hexdigest()) #print(int(str(int_id(_id))[:7])) auth_conf = { 'secret':shared_secret, diff --git a/user_managment/app.py b/user_managment/app.py index 3a09e98..ca5e883 100644 --- a/user_managment/app.py +++ b/user_managment/app.py @@ -17,15 +17,18 @@ from flask_babelex import Babel import libscrc import random from flask_mail import Message, Mail +from socket import gethostbyname + try: from gen_script_template import gen_script except: pass -script_links = {} -mmdvm_logins = [] +import os, ast +##import hb_config +Sscript_links = {} ##def gen_passphrase(dmr_id): ## _new_peer_id = bytes_4(int(str(dmr_id)[:7])) ## b_list = create_app().get_burnlist() @@ -177,6 +180,153 @@ def create_app(): login_auth_method = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') portal_username = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') login_type = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + class mmdvmPeer(db.Model): + __tablename__ = 'MMDVM_peers' + id = db.Column(db.Integer(), primary_key=True) + name = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + enabled = db.Column(db.Boolean(), nullable=False, server_default='1') + loose = db.Column(db.Boolean(), nullable=False, server_default='1') + ip = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='127.0.0.1') + port = db.Column(db.Integer(), primary_key=False) + master_ip = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + master_port = db.Column(db.Integer(), primary_key=False) + passphrase = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + callsign = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + radio_id = db.Column(db.Integer(), primary_key=False) + rx_freq = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + tx_freq = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + tx_power = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + color_code = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + latitude = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + longitude = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + height = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + location = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + description = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + slots = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + url = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + software_id = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + package_id = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + group_hangtime = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + options = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + use_acl = db.Column(db.Boolean(), nullable=False, server_default='0') + sub_acl = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + tg1_acl = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + tg2_acl = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + server = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + class xlxPeer(db.Model): + __tablename__ = 'XLX_peers' + id = db.Column(db.Integer(), primary_key=True) + name = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + enabled = db.Column(db.Boolean(), nullable=False, server_default='1') + loose = db.Column(db.Boolean(), nullable=False, server_default='1') + ip = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='127.0.0.1') + port = db.Column(db.Integer(), primary_key=False) + master_ip = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + master_port = db.Column(db.Integer(), primary_key=False) + passphrase = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + callsign = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + radio_id = db.Column(db.Integer(), primary_key=False) + rx_freq = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + tx_freq = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + tx_power = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + color_code = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + latitude = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + longitude = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + height = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + location = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + description = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + slots = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + url = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + software_id = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + package_id = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + group_hangtime = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + xlxmodule = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + options = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + use_acl = db.Column(db.Boolean(), nullable=False, server_default='0') + sub_acl = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + tg1_acl = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + tg2_acl = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + server = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + class ServerList(db.Model): + __tablename__ = 'server_list' + name = db.Column(db.String(100, collation='NOCASE'), unique=True, primary_key=True) + secret = db.Column(db.String(255), nullable=False, server_default='') + public_list = db.Column(db.Boolean(), nullable=False, server_default='1') + id = db.Column(db.Integer(), primary_key=False) + ip = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + port = db.Column(db.Integer(), primary_key=False) + global_path = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='./') + global_ping_time = db.Column(db.Integer(), primary_key=False) + global_max_missed = db.Column(db.Integer(), primary_key=False) + global_use_acl = db.Column(db.Boolean(), nullable=False, server_default='1') + global_reg_acl = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='PERMIT:ALL') + global_sub_acl = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='DENY:1') + global_tg1_acl = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='PERMIT:ALL') + global_tg2_acl = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='PERMIT:ALL') + ai_try_download = db.Column(db.Boolean(), nullable=False, server_default='1') + ai_path = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='./') + ai_peer_file = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='peer_ids.json') + ai_subscriber_file = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='subscriber_ids.json') + ai_tgid_file = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='talkgroup_ids.json') + ai_peer_url = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='https://www.radioid.net/static/rptrs.json') + ai_subs_url = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='https://www.radioid.net/static/users.json') + ai_stale = db.Column(db.Integer(), primary_key=False, server_default='7') + # Pull from config file for now +## um_append_int = db.Column(db.Integer(), primary_key=False, server_default='2') + um_shorten_passphrase = db.Column(db.Boolean(), nullable=False, server_default='0') + um_burn_file = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='./burned_ids.txt') + # Pull from config file for now +## um_burn_int = db.Column(db.Integer(), primary_key=False, server_default='6') + report_enable = db.Column(db.Boolean(), nullable=False, server_default='1') + report_interval = db.Column(db.Integer(), primary_key=False, server_default='60') + report_port = db.Column(db.Integer(), primary_key=False, server_default='4321') + report_clients =db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='127.0.0.1') + class MasterList(db.Model): + __tablename__ = 'master_list' + id = db.Column(db.Integer(), primary_key=True) + name = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + static_positions = db.Column(db.Boolean(), nullable=False, server_default='0') + repeat = db.Column(db.Boolean(), nullable=False, server_default='1') + max_peers = db.Column(db.Integer(), primary_key=False, server_default='10') + ip = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + port = db.Column(db.Integer(), primary_key=False) + enable_um = db.Column(db.Boolean(), nullable=False, server_default='1') + passphrase = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + group_hang_time = db.Column(db.Integer(), primary_key=False, server_default='5') + use_acl = db.Column(db.Boolean(), nullable=False, server_default='1') + reg_acl = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + sub_acl = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + tg1_acl = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + tg2_acl = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + + class BridgeRules(db.Model): + __tablename__ = 'bridge_rules' + id = db.Column(db.Integer(), primary_key=True) + bridge_name = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + system_name = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + ts = db.Column(db.Integer(), primary_key=False) + tg = db.Column(db.Integer(), primary_key=False) + active = db.Column(db.Boolean(), nullable=False, server_default='1') + timeout = db.Column(db.Integer(), primary_key=False) + to_type = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + on = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + off = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + reset = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + server_list = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + + class ExcludeUnit(db.Model): + __tablename__ = 'exclude_unit' + id = db.Column(db.Integer(), primary_key=True) + system_name = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + server = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + class ServerMisc(db.Model): + __tablename__ = 'server_misc' + id = db.Column(db.Integer(), primary_key=True) + server = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='') + unit_time = db.Column(db.Integer(), primary_key=False) + + + @@ -1375,8 +1525,88 @@ def create_app(): #### db.session.commit() ## a = AuthLog.query.all() ## print(a) -## authlog_flush() +## authlog_flush() + peer_delete('mmdvm', 1) return render_template('flask_user_layout.html', markup_content = Markup(content)) + + def get_peer_configs(_server_name): + mmdvm_pl = mmdvmPeer.query.filter_by(server=_server_name).all() + xlx_pl = xlxPeer.query.filter_by(server=_server_name).all() + print(mmdvm_pl) + peer_config_list = {} + for i in mmdvm_pl: + print(i) +## print(i.master_ip) + peer_config_list.update({i.name: { + 'MODE': 'PEER', + 'ENABLED': i.enabled, + 'LOOSE': i.loose, + 'SOCK_ADDR': (gethostbyname(i.ip), i.port), + 'IP': i.ip, + 'PORT': i.port, + 'MASTER_SOCKADDR': (gethostbyname(i.master_ip), i.master_port), + 'MASTER_IP': i.master_ip, + 'MASTER_PORT': i.master_port, + 'PASSPHRASE': bytes((i.passphrase), 'utf-8'), + 'CALLSIGN': bytes((i.callsign).ljust(8)[:8], 'utf-8'), + 'RADIO_ID': int(i.radio_id), #int(i.radio_id).to_bytes(4, 'big'), + 'RX_FREQ': bytes((i.rx_freq).ljust(9)[:9], 'utf-8'), + 'TX_FREQ': bytes((i.tx_freq).ljust(9)[:9], 'utf-8'), + 'TX_POWER': bytes((i.tx_power).rjust(2,'0'), 'utf-8'), + 'COLORCODE': bytes((i.color_code).rjust(2,'0'), 'utf-8'), + 'LATITUDE': bytes((i.latitude).ljust(8)[:8], 'utf-8'), + 'LONGITUDE': bytes((i.longitude).ljust(9)[:9], 'utf-8'), + 'HEIGHT': bytes((i.height).rjust(3,'0'), 'utf-8'), + 'LOCATION': bytes((i.location).ljust(20)[:20], 'utf-8'), + 'DESCRIPTION': bytes((i.description).ljust(19)[:19], 'utf-8'), + 'SLOTS': bytes((i.slots), 'utf-8'), + 'URL': bytes((i.url).ljust(124)[:124], 'utf-8'), + 'SOFTWARE_ID': bytes((i.software_id).ljust(40)[:40], 'utf-8'), + 'PACKAGE_ID': bytes((i.package_id).ljust(40)[:40], 'utf-8'), + 'GROUP_HANGTIME': i.group_hangtime, + 'OPTIONS': b''.join([b'Type=HBlink;', bytes(i.options, 'utf-8')]), + 'USE_ACL': i.use_acl, + 'SUB_ACL': i.sub_acl, + 'TG1_ACL': i.tg1_acl, + 'TG2_ACL': i.tg2_acl + }}) + for i in xlx_pl: + peer_config_list.update({i: { + 'MODE': 'XLX', + 'ENABLED': i.enabled, + 'LOOSE': i.loose, + 'SOCK_ADDR': (gethostbyname(i.ip), i.port), + 'IP': i.ip, + 'PORT': i.port, + 'MASTER_SOCKADDR': (gethostbyname(i.master_ip), i.master_port), + 'MASTER_IP': i.master_ip, + 'MASTER_PORT': i.master_port, + 'PASSPHRASE': bytes((i.passphrase), 'utf-8'), + 'CALLSIGN': bytes((i.callsign).ljust(8)[:8], 'utf-8'), + 'RADIO_ID': int(i.radio_id), + 'RX_FREQ': bytes((i.rx_freq).ljust(9)[:9], 'utf-8'), + 'TX_FREQ': bytes((i.tx_freq).ljust(9)[:9], 'utf-8'), + 'TX_POWER': bytes((i.tx_power).rjust(2,'0'), 'utf-8'), + 'COLORCODE': bytes((i.color_code).rjust(2,'0'), 'utf-8'), + 'LATITUDE': bytes((i.latitude).ljust(8)[:8], 'utf-8'), + 'LONGITUDE': bytes((i.longitude).ljust(9)[:9], 'utf-8'), + 'HEIGHT': bytes((i.height).rjust(3,'0'), 'utf-8'), + 'LOCATION': bytes((i.location).ljust(20)[:20], 'utf-8'), + 'DESCRIPTION': bytes((i.description).ljust(19)[:19], 'utf-8'), + 'SLOTS': bytes((i.slots), 'utf-8'), + 'URL': bytes((i.url).ljust(124)[:124], 'utf-8'), + 'SOFTWARE_ID': bytes((i.software_id).ljust(40)[:40], 'utf-8'), + 'PACKAGE_ID': bytes((i.package_id).ljust(40)[:40], 'utf-8'), + 'GROUP_HANGTIME': i.group_hangtime, + 'XLXMODULE': i.xlxmodule, + 'OPTIONS': b''.join([b'Type=HBlink;', bytes(i.options, 'utf-8')]), + 'USE_ACL': i.use_acl, + 'SUB_ACL': i.sub_acl, + 'TG1_ACL': i.tg1_acl, + 'TG2_ACL': i.tg2_acl + }}) + print((peer_config_list)) + return peer_config_list def get_burnlist(): b = BurnList.query.all() @@ -1442,6 +1672,1156 @@ def create_app(): for i in flush_e: db.session.delete(i) db.session.commit() +## def peer_delete(_mode, _id): +## if _mode == 'xlx': +## p = xlxPeer.query.filter_by(id=_id).first() +## if _mode == 'mmdvm': +## p = mmdvmPeer.query.filter_by(id=_id).first() +## db.session.delete(p) +## db.session.commit() + + def server_delete(_name): + s = ServerList.query.filter_by(name=_name).first() + db.session.delete(s) + db.session.commit() + def peer_delete(_mode, _server, _name): + print(_server) + print(_name) + if _mode == 'mmdvm': + p = mmdvmPeer.query.filter_by(server=_server).filter_by(name=_name).first() + if _mode == 'xlx': + p = xlxPeer.query.filter_by(server=_server).filter_by(name=_name).first() + db.session.delete(p) + db.session.commit() + + def shared_secrets(): + s = ServerList.query.all() #filter_by(name=_name).first() + r_list = [] + for i in s: + r_list.append(str(i.secret)) + return r_list + + def server_get(_name): +## print(_name) + #s = ServerList.query.filter_by(name=_name).first() + # print(s.name) + i = ServerList.query.filter_by(name=_name).first() +## print(i.name) + s_config = {} + s_config['GLOBAL'] = {} + s_config['REPORTS'] = {} + s_config['ALIASES'] = {} + s_config['USER_MANAGER'] = {} + + s_config['GLOBAL'].update({ + 'PATH': i.global_path, + 'PING_TIME': i.global_ping_time, + 'MAX_MISSED': i.global_max_missed, + 'USE_ACL': i.global_use_acl, + 'REG_ACL': i.global_reg_acl, + 'SUB_ACL': i.global_sub_acl, + 'TG1_ACL': i.global_tg1_acl, + 'TG2_ACL': i.global_tg2_acl + }) + + s_config['REPORTS'].update({ + 'REPORT': i.report_enable, + 'REPORT_INTERVAL': i.report_interval, + 'REPORT_PORT': i.report_port, + 'REPORT_CLIENTS': i.report_clients.split(',') + }) + s_config['ALIASES'].update({ + 'TRY_DOWNLOAD':i.ai_try_download, + 'PATH': i.ai_path, + 'PEER_FILE': i.ai_peer_file, + 'SUBSCRIBER_FILE': i.ai_subscriber_file, + 'TGID_FILE': i.ai_tgid_file, + 'PEER_URL': i.ai_peer_url, + 'SUBSCRIBER_URL': i.ai_subs_url, + 'STALE_TIME': i.ai_stale * 86400, + }) + s_config['USER_MANAGER'].update({ + 'APPEND_INT': append_int, + 'SHORTEN_PASSPHRASE': i.um_shorten_passphrase, + 'BURN_FILE': i.um_burn_file, + 'BURN_INT': burn_int, + + + }) + print(s_config['REPORTS']) + return s_config + + def server_edit(_name, _secret, _ip, _public_list, _port, _global_path, _global_ping_time, _global_max_missed, _global_use_acl, _global_reg_acl, _global_sub_acl, _global_tg1_acl, _global_tg2_acl, _ai_subscriber_file, _ai_try_download, _ai_path, _ai_peer_file, _ai_tgid_file, _ai_peer_url, _ai_subs_url, _ai_stale, _um_shorten_passphrase, _um_burn_file, _report_enable, _report_interval, _report_port, _report_clients): + s = ServerList.query.filter_by(name=_name).first() + if _secret == '': + s.secret = s.secret + else: + s.secret = hashlib.sha256(_secret.encode()).hexdigest() + s.public_list = _public_list + s.ip = _ip + s.port = _port + s.global_path =_global_path + s.global_ping_time = _global_ping_time + s.global_max_missed = _global_max_missed + s.global_use_acl = _global_use_acl + s.global_reg_acl = _global_reg_acl + s.global_sub_acl = _global_sub_acl + s.global_tg1_acl = _global_tg1_acl + s.global_tg2_acl = _global_tg2_acl + s.ai_try_download = _ai_try_download + s.ai_path = _ai_path + s.ai_peer_file = _ai_peer_file + s.ai_subscriber_file = _ai_subscriber_file + s.ai_tgid_file = _ai_tgid_file + s.ai_peer_url = _ai_peer_url + s.ai_subs_url = _ai_subs_url + s.ai_stale = _ai_stale + # Pull from config file for now +## um_append_int = db.Column(db.Integer(), primary_key=False, server_default='2') + s.um_shorten_passphrase = _um_shorten_passphrase + s.um_burn_file = _um_burn_file + # Pull from config file for now +## um_burn_int = db.Column(db.Integer(), primary_key=False, server_default='6') + s.report_enable = _report_enable + s.report_interval = _report_interval + s.report_port = _report_port + s.report_clients = _report_clients + db.session.commit() + + + + + def server_add(_name, _secret, _ip, _public_list, _port, _global_path, _global_ping_time, _global_max_missed, _global_use_acl, _global_reg_acl, _global_sub_acl, _global_tg1_acl, _global_tg2_acl, _ai_subscriber_file, _ai_try_download, _ai_path, _ai_peer_file, _ai_tgid_file, _ai_peer_url, _ai_subs_url, _ai_stale, _um_shorten_passphrase, _um_burn_file, _report_enable, _report_interval, _report_port, _report_clients): + add_server = ServerList( + name = _name, + secret = hashlib.sha256(_secret.encode()).hexdigest(), + public_list = _public_list, + ip = _ip, + port = _port, + global_path =_global_path, + global_ping_time = _global_ping_time, + global_max_missed = _global_max_missed, + global_use_acl = _global_use_acl, + global_reg_acl = _global_reg_acl, + global_sub_acl = _global_sub_acl, + global_tg1_acl = _global_tg1_acl, + global_tg2_acl = _global_tg2_acl, + ai_try_download = _ai_try_download, + ai_path = _ai_path, + ai_peer_file = _ai_peer_file, + ai_subscriber_file = _ai_subscriber_file, + ai_tgid_file = _ai_tgid_file, + ai_peer_url = _ai_peer_url, + ai_subs_url = _ai_subs_url, + ai_stale = _ai_stale, + # Pull from config file for now +## um_append_int = db.Column(db.Integer(), primary_key=False, server_default='2') + um_shorten_passphrase = _um_shorten_passphrase, + um_burn_file = _um_burn_file, + # Pull from config file for now +## um_burn_int = db.Column(db.Integer(), primary_key=False, server_default='6') + report_enable = _report_enable, + report_interval = _report_interval, + report_port = _report_port, + report_clients = _report_clients + ) + db.session.add(add_server) + db.session.commit() + def peer_add(_mode, _name, _enabled, _loose, _ip, _port, _master_ip, _master_port, _passphrase, _callsign, _radio_id, _rx, _tx, _tx_power, _cc, _lat, _lon, _height, _loc, _desc, _slots, _url, _grp_hang, _xlx_mod, _opt, _use_acl, _sub_acl, _1_acl, _2_acl, _svr): + if _mode == 'xlx': + xlx_peer_add = xlxPeer( + name = _name, + enabled = _enabled, + loose = _loose, + ip = _ip, + port = _port, + master_ip = _master_ip, + master_port = _master_port, + passphrase = _passphrase, + callsign = _callsign, + radio_id = _radio_id, + rx_freq = _rx, + tx_freq = _tx, + tx_power = _tx_power, + color_code = _cc, + latitude = _lat, + longitude = _lon, + height = _height, + location = _loc, + description = _desc, + slots = _slots, + xlxmodule = _xlx_mod, + url = _url, + software_id = 'HBNet', + package_id = 'v1', + group_hangtime = _grp_hang, + use_acl = _use_acl, + sub_acl = _sub_acl, + tg1_acl = _1_acl, + tg2_acl = _2_acl, + server = _svr + ) + db.session.add(xlx_peer_add) + db.session.commit() + if _mode == 'mmdvm': + mmdvm_peer_add = mmdvmPeer( + name = _name, + enabled = _enabled, + loose = _loose, + ip = _ip, + port = _port, + master_ip = _master_ip, + master_port = _master_port, + passphrase = _passphrase, + callsign = _callsign, + radio_id = _radio_id, + rx_freq = _rx, + tx_freq = _tx, + tx_power = _tx_power, + color_code = _cc, + latitude = _lat, + longitude = _lon, + height = _height, + location = _loc, + description = _desc, + slots = _slots, + url = _url, + software_id = 'HBNet', + package_id = 'v1', + group_hangtime = _grp_hang, + use_acl = _use_acl, + sub_acl = _sub_acl, + tg1_acl = _1_acl, + tg2_acl = _2_acl, + server = _svr + ) + db.session.add(mmdvm_peer_add) + db.session.commit() + def peer_edit(_mode, _server, _name, _enabled, _loose, _ip, _port, _master_ip, _master_port, _passphrase, _callsign, _radio_id, _rx, _tx, _tx_power, _cc, _lat, _lon, _height, _loc, _desc, _slots, _url, _grp_hang, _xlx_mod, _opt, _use_acl, _sub_acl, _1_acl, _2_acl): +## print(_mode) + if _mode == 'mmdvm': + print(_server) + print(_name) +## print(_name) +## s = mmdvmPeer.query.filter_by(server=_server).filter_by(name=_name).first() + p = mmdvmPeer.query.filter_by(server=_server).filter_by(name=_name).first() +## print(p) + p.enabled = _enabled + p.loose = _loose + p.ip = _ip + p.port = _port + p.master_ip = _master_ip + p.master_port = _master_port + p.passphrase = _passphrase + p.callsign = _callsign + p.radio_id = _radio_id + p.rx_freq = _rx + p.tx_freq = _tx + p.tx_power = _tx_power + p.color_code = _cc + p.latitude = _lat + p.longitude = _lon + p.height = _height + p.location = _loc + p.description = _desc + p.slots = _slots + p.url = _url + p.software_id = 'HBNet' + p.package_id = 'v1' + p.group_hangtime = _grp_hang + p.use_acl = _use_acl + p.sub_acl = _sub_acl + p.tg1_acl = _1_acl + p.tg2_acl = _2_acl + db.session.commit() + + + + +# Test server configs + + @app.route('/edit_server', methods=['POST', 'GET']) + @login_required + @roles_required('Admin') + def edit_server_db(): + # Edit server + if request.args.get('save_mode'):# == 'new' and request.form.get('server_name'): + _port = int(request.form.get('server_port')) + _global_ping_time = int(request.form.get('ping_time')) + _global_max_missed = int(request.form.get('max_missed')) + _ai_stale = int(request.form.get('stale_days')) + _report_interval = int(request.form.get('report_interval')) + _report_port = int(request.form.get('report_port')) + if request.form.get('use_acl') == 'True': + _global_use_acl = True + if request.form.get('aliases_enabled') == 'True': + _ai_try_download = True + if request.form.get('um_shorten_passphrase') == 'True': + _um_shorten_passphrase = True + if request.form.get('report') == 'True': + _report_enabled = True + if request.form.get('public_list') == 'True': + public_list = True + else: + _global_use_acl = False + _ai_try_download = False + _um_shorten_passphrase = False + _report_enabled = False + public_list = False + + if request.args.get('save_mode') == 'new': + server_add(request.form.get('server_name'), request.form.get('server_secret'), request.form.get('server_ip'), public_list, _port, request.form.get('global_path'), _global_ping_time, _global_max_missed, _global_use_acl, request.form.get('reg_acl'), request.form.get('sub_acl'), request.form.get('global_ts1_acl'), request.form.get('global_ts2_acl'), request.form.get('sub_file'), _ai_try_download, request.form.get('aliases_path'), request.form.get('peer_file'), request.form.get('tgid_file'), request.form.get('peer_url'), request.form.get('sub_url'), _ai_stale, _um_shorten_passphrase, request.form.get('um_burn_file'), _report_enabled, _report_interval, _report_port, request.form.get('report_clients')) + content = 'attempt save' + if request.args.get('save_mode') == 'edit': + server_edit(request.form.get('server_name'), request.form.get('server_secret'), request.form.get('server_ip'), public_list, _port, request.form.get('global_path'), _global_ping_time, _global_max_missed, _global_use_acl, request.form.get('reg_acl'), request.form.get('sub_acl'), request.form.get('global_ts1_acl'), request.form.get('global_ts2_acl'), request.form.get('sub_file'), _ai_try_download, request.form.get('aliases_path'), request.form.get('peer_file'), request.form.get('tgid_file'), request.form.get('peer_url'), request.form.get('sub_url'), _ai_stale, _um_shorten_passphrase, request.form.get('um_burn_file'), _report_enabled, _report_interval, _report_port, request.form.get('report_clients')) + content = 'attempt edit save' + elif request.args.get('delete_server'): + server_delete(request.args.get('delete_server')) + content = 'deleted server' + content = 'deleted ' + request.args.get('delete_server') + elif request.args.get('edit_server'): + s = ServerList.query.filter_by(name=request.args.get('edit_server')).first() + + content = ''' +

 

+ +

Delete server

+ +
+

 

+

Server

+ + + + + + + + + + + + + + + + + + + + + + + +
 Server Name: ''' + str(s.name) + '''
 Server Secret: 
 Host (IP/DNS, for listing on passphrase page): 
 Port (for listing on passphrase page): 
 Public list: 
+

Global

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Path: 
 Ping Time: 
 Max Missed: 
 Use ACLs: 
 Regular ACLs: 
 Subscriber ACSs: 
 Timeslot 1 ACLs: 
 Timeslot 2 ACLs: 
+

 

+

Reports

+ + + + + + + + + + + + + + + + + + + +
 Enable: 
 Interval: 
 Port: 
 Clients: 
+ +

 

+

Aliases

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Download: 
 Path: 
 Peer File: 
 Subscriber File: 
 Talkgroup ID File: 
 Peer URL: 
 Subscriber URL: 
 Stale time(days): 
+
+

 

+

User Manager

+ + + + + + + + + + + + +
 Use short passphrase:
 Burned IDs File: 
+

 

+

+

 

+''' + # Add new server + elif request.args.get('add'): # == 'yes': + content = ''' +
+

 

+

Server

+ + + + + + + + + + + + + + + + + + + + + + + +
 Server Name: 
 Server Secret: 
 Host (IP/DNS): 
 Port: 
 Public list: 
+

Global

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Path: 
 Ping Time: 
 Max Missed: 
 Use ACLs: 
 Regular ACLs: 
 Subscriber ACSs: 
 Timeslot 1 ACLs: 
 Timeslot 2 ACLs: 
+

 

+

Reports

+ + + + + + + + + + + + + + + + + + + +
 Enable: 
 Interval: 
 Port: 
 Clients: 
+ +

 

+

Aliases

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Download: 
 Path: 
 Peer File: 
 Subscriber File: 
 Talkgroup ID File: 
 Peer URL: 
 Subscriber URL: 
 Stale time(days): 
+
+

 

+

User Manager

+ + + + + + + + + + + + + +
 Use short passphrase:
 Burned IDs File: 
+

 

+

+

 

+''' + else: + all_s = ServerList.query.all() + p_list = ''' +

View/Edit Servers

+ + + + + + + +
Add Server Config
+ + + + +''' + for s in all_s: + p_list = p_list + ''' + + +\n +''' + p_list = p_list + '''
Name
''' + str(s.name) + '''
''' + content = p_list + + return render_template('flask_user_layout.html', markup_content = Markup(content)) + + @app.route('/edit_peer', methods=['POST', 'GET']) + @login_required + @roles_required('Admin') + def test_peer_db(): + if request.args.get('save_mode'): + if request.form.get('enabled') == 'true': + peer_enabled = True +## if request.form.get('loose') == 'true': +## peer_loose = True + if request.form.get('use_acl') == 'true': + use_acl = True + else: +## peer_loose = False + peer_enabled = False + use_acl = False + peer_loose = True + if request.args.get('save_mode') == 'mmdvm_peer': + peer_add('mmdvm', request.form.get('name_text'), peer_enabled, peer_loose, request.form.get('ip'), request.form.get('port'), request.form.get('master_ip'), request.form.get('master_port'), request.form.get('passphrase'), request.form.get('callsign'), request.form.get('radio_id'), request.form.get('rx'), request.form.get('tx'), request.form.get('tx_power'), request.form.get('cc'), request.form.get('lat'), request.form.get('lon'), request.form.get('height'), request.form.get('location'), request.form.get('description'), request.form.get('slots'), request.form.get('url'), request.form.get('group_hangtime'), 'MMDVM', request.form.get('options'), use_acl, request.form.get('sub_acl'), request.form.get('tgid_ts1_acl'), request.form.get('tgid_ts2_acl'), request.form.get('server')) + content = 'saved mmdvm peer' + if request.args.get('save_mode') == 'xlx_peer': + peer_add('xlx', request.form.get('name_text'), peer_enabled, peer_loose, request.form.get('ip'), request.form.get('port'), request.form.get('master_ip'), request.form.get('master_port'), request.form.get('passphrase'), request.form.get('callsign'), request.form.get('radio_id'), request.form.get('rx'), request.form.get('tx'), request.form.get('tx_power'), request.form.get('cc'), request.form.get('lat'), request.form.get('lon'), request.form.get('height'), request.form.get('location'), request.form.get('description'), request.form.get('slots'), request.form.get('url'), request.form.get('group_hangtime'), request.form.get('xlxmodule'), request.form.get('options'), use_acl, request.form.get('sub_acl'), request.form.get('tgid_ts1_acl'), request.form.get('tgid_ts2_acl'), request.form.get('server')) + content = 'saved xlx peer' + elif request.args.get('add') == 'mmdvm' or request.args.get('add') == 'xlx': + s = ServerList.query.all() + if request.args.get('add') == 'mmdvm': + mode = 'MMDVM' + submit_link = 'edit_peer?save_mode=mmdvm_peer' + xlx_module = '' + if request.args.get('add') == 'xlx': + xlx_module = ''' + + XLX Module: + +''' + mode = 'XLX' + submit_link = 'edit_peer?save_mode=xlx_peer' + server_options = '' + for i in s: + server_options = server_options + '''\n''' + content = ''' +

 

+

Add an ''' + mode + ''' peer

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +''' + xlx_module + ''' + + + + + + + + + + + + + + + + + +
Assign to Server: 
Connection Name: 
 Active: 
 IP: 
 Port: 
 Passphrase: 
 Master IP: 
 Master Port: 
 Callsign: 
 Radio ID: 
 Transmit Frequency: 
 Receive Frequency: 
 Transmit Power: 
 Color Code: 
 Slots: 
 Latitude: 
 Longitude: 
 Height 
 Location: 
 Description: 
 URL: 
 Group Hangtime: 
 Options: 
 Use ACLs: 
 Subscriber ACLs: 
 Talkgroup Slot 1 ACLs: 
 Talkgroup Slot 2 ACLs: 
+

 

+

+''' + +## elif request.args.get('edit_server') and request.args.get('edit_peer') and request.args.get('mode') == 'mmdvm': + elif request.args.get('delete_peer') and request.args.get('peer_server'): + print(request.args.get('peer_server')) + print(request.args.get('delete_peer')) + peer_delete(request.args.get('mode'), request.args.get('peer_server'), request.args.get('delete_peer')) + content = 'deleted peer' + elif request.args.get('edit_mmdvm') == 'save': +## print(request.form.get('enabled')) + if request.form.get('enabled') == 'True': + peer_enabled = True +## if request.form.get('loose') == 'true': +## peer_loose = True + if request.form.get('use_acl') == 'True': + use_acl = True + else: +## peer_loose = False + peer_enabled = False + use_acl = False + peer_loose = True +## print(peer_enabled) + print(request.args.get('server')) + peer_edit('mmdvm', request.args.get('server'), request.form.get('name_text'), peer_enabled, peer_loose, request.form.get('ip'), request.form.get('port'), request.form.get('master_ip'), request.form.get('master_port'), request.form.get('passphrase'), request.form.get('callsign'), request.form.get('radio_id'), request.form.get('rx'), request.form.get('tx'), request.form.get('tx_power'), request.form.get('cc'), request.form.get('lat'), request.form.get('lon'), request.form.get('height'), request.form.get('location'), request.form.get('description'), request.form.get('slots'), request.form.get('url'), request.form.get('group_hangtime'), 'MMDVM', request.form.get('options'), use_acl, request.form.get('sub_acl'), request.form.get('tgid_ts1_acl'), request.form.get('tgid_ts2_acl')) + content = 'save edit' + elif request.args.get('server') and request.args.get('peer_name') and request.args.get('mode'): # and request.args.get('edit_peer') and request.args.get('mode') == 'mmdvm': + if request.args.get('mode') == 'mmdvm': + p = mmdvmPeer.query.filter_by(server=request.args.get('server')).filter_by(name=request.args.get('peer_name')).first() + xlx_module = '' + mode = "MMDVM" + if request.args.get('mode') == 'xlx': + p = xlxPeer.query.filter_by(server=request.args.get('server')).filter_by(name=request.args.get('peer_name')).first() + xlx_module = ''' + + XLX Module: + +''' + mode = "XLX" + + content = ''' +

 

+

View/Edit an ''' + mode + ''' peer

+ +

Delete peer

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +''' + xlx_module + ''' + + + + + + + + + + + + + + + + + + + + + +
Connection Name:  
 Active: 
 IP: 
 Port: 
 Passphrase: 
 Master IP: 
 Master Port: 
 Callsign: 
 Radio ID: 
 Transmit Frequency: 
 Receive Frequency: 
 Transmit Power: 
 Color Code: 
 Slots: 
 Latitude: 
 Longitude: 
 Height 
 Location: 
 Description: 
 URL: 
 Group Call Hangtime: 
 Options: 
 Use ACLs: 
 Subscriber ACLs: 
 Talkgroup Slot 1 ACLs: 
 Talkgroup Slot 2 ACLs: 
+

 

+

+ +

 

+''' + else: + all_s = ServerList.query.all() + p_list = '' + for s in all_s: + print(s.name) + p_list = p_list + ''' +

Server: ''' + str(s.name) + '''

+ + + + + +\n +''' + all_p = mmdvmPeer.query.filter_by(server=s.name).all() + all_x = xlxPeer.query.filter_by(server=s.name).all() + for p in all_p: + p_list = p_list + ''' + + + +\n +''' + for x in all_x: + p_list = p_list + ''' + + + +\n +''' + p_list = p_list + '''
NameMode
''' + str(p.name) + '''MMDVM
''' + str(x.name) + '''XLX
\n''' + content = ''' + +

View/Edit Peers

+ + + + + + + + +
Add MMDVM peerAdd XLX peer
+

 

+ +''' + p_list + + return render_template('flask_user_layout.html', markup_content = Markup(content)) + + + @app.route('/manage_masters', methods=['POST', 'GET']) + def manage_masters(): + if request.args.get('add'): + print('yay') + @app.route('/add_user', methods=['POST', 'GET']) @login_required @@ -1515,7 +2895,7 @@ def create_app(): def auth(): hblink_req = request.json print((hblink_req)) - if hblink_req['secret'] in shared_secrets: + if hblink_req['secret'] in shared_secrets(): if 'login_id' in hblink_req and 'login_confirmed' not in hblink_req: if type(hblink_req['login_id']) == int: if authorized_peer(hblink_req['login_id'])[0]: @@ -1573,10 +2953,24 @@ def create_app(): response = jsonify( logged=True ) - elif hblink_req['burn_list']: # == 'burn_list': + elif 'burn_list' in hblink_req: # ['burn_list']: # == 'burn_list': response = jsonify( burn_list=get_burnlist() ) + elif hblink_req['get_config']: # == 'burn_list': + test_parsed = ast.literal_eval(os.popen('cat ./test_parsed.txt').read()) + +## print((test_parsed)) + try: + response = jsonify( + config=server_get(hblink_req['get_config']), + peers=get_peer_configs(hblink_req['get_config']) + + ) + except: + message = jsonify(message='Config error') + response = make_response(message, 401) + else: message = jsonify(message='Authentication error') diff --git a/user_managment/templates/flask_user_layout.html b/user_managment/templates/flask_user_layout.html index cb4c0bb..1a51324 100644 --- a/user_managment/templates/flask_user_layout.html +++ b/user_managment/templates/flask_user_layout.html @@ -59,6 +59,21 @@ + +{% if call_or_get(current_user.is_authenticated) %} + {% if call_or_get(current_user.has_roles('Admin')) %} + + + + + + + + +
Manage Server ConfigsManage PeersManage Masters Configs
+ {% endif %} + {% endif %} +
{% block body %}