clean code, PROXY now works
This commit is contained in:
parent
82d54848ee
commit
82213561b8
99
bridge.py
99
bridge.py
@ -58,6 +58,13 @@ import logging
|
|||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
import os, ast
|
import os, ast
|
||||||
import json, requests
|
import json, requests
|
||||||
|
|
||||||
|
# User for different functions that need to be running: APRS, Proxy, etc
|
||||||
|
import threading
|
||||||
|
|
||||||
|
# Hotspot Proxy stuff
|
||||||
|
from hotspot_proxy_v2 import Proxy
|
||||||
|
|
||||||
# Does anybody read this stuff? There's a PEP somewhere that says I should do this.
|
# Does anybody read this stuff? There's a PEP somewhere that says I should do this.
|
||||||
__author__ = 'Cortney T. Buffington, N0MJS'
|
__author__ = 'Cortney T. Buffington, N0MJS'
|
||||||
__copyright__ = 'Copyright (c) 2016-2019 Cortney T. Buffington, N0MJS and the K0USY Group'
|
__copyright__ = 'Copyright (c) 2016-2019 Cortney T. Buffington, N0MJS and the K0USY Group'
|
||||||
@ -168,6 +175,50 @@ def download_config(L_CONFIG_FILE, cli_file):
|
|||||||
logger.error('Config server unreachable, defaulting to local config')
|
logger.error('Config server unreachable, defaulting to local config')
|
||||||
return config.build_config(cli_file)
|
return config.build_config(cli_file)
|
||||||
|
|
||||||
|
|
||||||
|
# From hotspot_proxy2, FreeDMR
|
||||||
|
def hotspot_proxy(listen_port, port_start, port_stop):
|
||||||
|
Master = "127.0.0.1"
|
||||||
|
ListenPort = listen_port
|
||||||
|
DestportStart = port_start
|
||||||
|
DestPortEnd = port_stop
|
||||||
|
Timeout = 30
|
||||||
|
Stats = True
|
||||||
|
Debug = False
|
||||||
|
BlackList = [1234567]
|
||||||
|
|
||||||
|
|
||||||
|
CONNTRACK = {}
|
||||||
|
|
||||||
|
for port in range(DestportStart,DestPortEnd+1,1):
|
||||||
|
CONNTRACK[port] = False
|
||||||
|
|
||||||
|
|
||||||
|
reactor.listenUDP(ListenPort,Proxy(Master,ListenPort,CONNTRACK,BlackList,Timeout,Debug,DestportStart,DestPortEnd))
|
||||||
|
|
||||||
|
def loopingErrHandle(failure):
|
||||||
|
logger.error('(GLOBAL) STOPPING REACTOR TO AVOID MEMORY LEAK: Unhandled error innowtimed loop.\n {}'.format(failure))
|
||||||
|
reactor.stop()
|
||||||
|
|
||||||
|
def stats():
|
||||||
|
count = 0
|
||||||
|
nowtime = time()
|
||||||
|
for port in CONNTRACK:
|
||||||
|
if CONNTRACK[port]:
|
||||||
|
count = count+1
|
||||||
|
|
||||||
|
totalPorts = DestPortEnd - DestportStart
|
||||||
|
freePorts = totalPorts - count
|
||||||
|
|
||||||
|
print("{} ports out of {} in use ({} free)".format(count,totalPorts,freePorts))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if Stats == True:
|
||||||
|
stats_task = task.LoopingCall(stats)
|
||||||
|
statsa = stats_task.start(30)
|
||||||
|
statsa.addErrback(loopingErrHandle)
|
||||||
|
|
||||||
# Module gobal varaibles
|
# Module gobal varaibles
|
||||||
|
|
||||||
# Dictionary for dynamically mapping unit (subscriber) to a system.
|
# Dictionary for dynamically mapping unit (subscriber) to a system.
|
||||||
@ -1269,7 +1320,50 @@ if __name__ == '__main__':
|
|||||||
logger.info('(REPORT) TCP Socket reporting not configured')
|
logger.info('(REPORT) TCP Socket reporting not configured')
|
||||||
|
|
||||||
# HBlink instance creation
|
# HBlink instance creation
|
||||||
logger.info('(GLOBAL) HBlink \'bridge.py\' -- SYSTEM STARTING...')
|
logger.info('(GLOBAL) HBNet \'bridge.py\' -- SYSTEM STARTING...')
|
||||||
|
|
||||||
|
# Generate list of Enabled MODE: PROXY masters
|
||||||
|
proxy_master_list = []
|
||||||
|
for i in CONFIG['SYSTEMS']:
|
||||||
|
if CONFIG['SYSTEMS'][i]['ENABLED'] == True:
|
||||||
|
if CONFIG['SYSTEMS'][i]['MODE'] == 'PROXY':
|
||||||
|
proxy_master_list.append(i)
|
||||||
|
# Start proxy as a thread (if enabled in config) for each set of MASTERs
|
||||||
|
for m in proxy_master_list:
|
||||||
|
if CONFIG['SYSTEMS'][m]['EXTERNAL_PROXY_SCRIPT'] == False:
|
||||||
|
proxy_thread = threading.Thread(target=hotspot_proxy, args=(CONFIG['SYSTEMS'][m]['EXTERNAL_PORT'],CONFIG['SYSTEMS'][m]['INTERNAL_PORT_START'],CONFIG['SYSTEMS'][m]['INTERNAL_PORT_STOP'],))
|
||||||
|
proxy_thread.daemon = True
|
||||||
|
proxy_thread.start()
|
||||||
|
logger.info('Started thread for PROXY for MASTER set: ' + m)
|
||||||
|
|
||||||
|
#Build Master configs from list
|
||||||
|
for i in proxy_master_list:
|
||||||
|
n_systems = CONFIG['SYSTEMS'][i]['INTERNAL_PORT_STOP'] - CONFIG['SYSTEMS'][i]['INTERNAL_PORT_START']
|
||||||
|
n_count = 0
|
||||||
|
while n_count < n_systems:
|
||||||
|
CONFIG['SYSTEMS'].update({i + '-' + str(n_count): {
|
||||||
|
'MODE': 'MASTER',
|
||||||
|
'ENABLED': True,
|
||||||
|
'STATIC_APRS_POSITION_ENABLED': CONFIG['SYSTEMS'][i]['STATIC_APRS_POSITION_ENABLED'],
|
||||||
|
'REPEAT': CONFIG['SYSTEMS'][i]['REPEAT'],
|
||||||
|
'MAX_PEERS': 1,
|
||||||
|
'IP': '127.0.0.1',
|
||||||
|
'PORT': CONFIG['SYSTEMS'][i]['INTERNAL_PORT_START'] + n_count,
|
||||||
|
'PASSPHRASE': CONFIG['SYSTEMS'][i]['PASSPHRASE'],
|
||||||
|
'GROUP_HANGTIME': CONFIG['SYSTEMS'][i]['GROUP_HANGTIME'],
|
||||||
|
'USE_ACL': CONFIG['SYSTEMS'][i]['USE_ACL'],
|
||||||
|
'REG_ACL': CONFIG['SYSTEMS'][i]['REG_ACL'],
|
||||||
|
'SUB_ACL': CONFIG['SYSTEMS'][i]['SUB_ACL'],
|
||||||
|
'TGID_TS1_ACL': CONFIG['SYSTEMS'][i]['TG1_ACL'],
|
||||||
|
'TGID_TS2_ACL': CONFIG['SYSTEMS'][i]['TG2_ACL']
|
||||||
|
}})
|
||||||
|
CONFIG['SYSTEMS'][i + '-' + str(n_count)].update({'PEERS': {}})
|
||||||
|
systems[i + '-' + str(n_count)] = routerHBP(i + '-' + str(n_count), CONFIG, report_server)
|
||||||
|
n_count = n_count + 1
|
||||||
|
# Remove original MASTER stanza to prevent errors
|
||||||
|
CONFIG['SYSTEMS'].pop(i)
|
||||||
|
logger.info('Generated MASTER instances for proxy set: ' + i)
|
||||||
|
|
||||||
for system in CONFIG['SYSTEMS']:
|
for system in CONFIG['SYSTEMS']:
|
||||||
if CONFIG['SYSTEMS'][system]['ENABLED']:
|
if CONFIG['SYSTEMS'][system]['ENABLED']:
|
||||||
if CONFIG['SYSTEMS'][system]['MODE'] == 'OPENBRIDGE':
|
if CONFIG['SYSTEMS'][system]['MODE'] == 'OPENBRIDGE':
|
||||||
@ -1293,7 +1387,8 @@ if __name__ == '__main__':
|
|||||||
stream_trimmer = stream_trimmer_task.start(5)
|
stream_trimmer = stream_trimmer_task.start(5)
|
||||||
stream_trimmer.addErrback(loopingErrHandle)
|
stream_trimmer.addErrback(loopingErrHandle)
|
||||||
|
|
||||||
|
logger.info('Unit calls will be bridged to: ' + str(UNIT))
|
||||||
|
print(CONFIG['SYSTEMS'])
|
||||||
# Download burn list
|
# Download burn list
|
||||||
with open(CONFIG['USER_MANAGER']['BURN_FILE'], 'w') as f:
|
with open(CONFIG['USER_MANAGER']['BURN_FILE'], 'w') as f:
|
||||||
f.write(str(download_burnlist(CONFIG)))
|
f.write(str(download_burnlist(CONFIG)))
|
||||||
|
20
config.py
20
config.py
@ -296,7 +296,25 @@ def build_config(_config_file):
|
|||||||
'TG1_ACL': config.get(section, 'TGID_ACL'),
|
'TG1_ACL': config.get(section, 'TGID_ACL'),
|
||||||
'TG2_ACL': 'PERMIT:ALL'
|
'TG2_ACL': 'PERMIT:ALL'
|
||||||
}})
|
}})
|
||||||
print( CONFIG['SYSTEMS'][section])
|
elif config.get(section, 'MODE') == 'PROXY':
|
||||||
|
CONFIG['SYSTEMS'].update({section: {
|
||||||
|
'MODE': config.get(section, 'MODE'),
|
||||||
|
'ENABLED': config.getboolean(section, 'ENABLED'),
|
||||||
|
'EXTERNAL_PROXY_SCRIPT': config.getboolean(section, 'EXTERNAL_PROXY_SCRIPT'),
|
||||||
|
'STATIC_APRS_POSITION_ENABLED': config.getboolean(section, 'STATIC_APRS_POSITION_ENABLED'),
|
||||||
|
'REPEAT': config.getboolean(section, 'REPEAT'),
|
||||||
|
'PASSPHRASE': bytes(config.get(section, 'PASSPHRASE'), 'utf-8'),
|
||||||
|
'EXTERNAL_PORT': config.getint(section, 'EXTERNAL_PORT'),
|
||||||
|
'INTERNAL_PORT_START': config.getint(section, 'INTERNAL_PORT_START'),
|
||||||
|
'INTERNAL_PORT_STOP': config.getint(section, 'INTERNAL_PORT_STOP'),
|
||||||
|
'GROUP_HANGTIME': config.getint(section, 'GROUP_HANGTIME'),
|
||||||
|
'USE_ACL': config.getboolean(section, 'USE_ACL'),
|
||||||
|
'REG_ACL': config.get(section, 'REG_ACL'),
|
||||||
|
'SUB_ACL': config.get(section, 'SUB_ACL'),
|
||||||
|
'TG1_ACL': config.get(section, 'TG1_ACL'),
|
||||||
|
'TG2_ACL': config.get(section, 'TG2_ACL')
|
||||||
|
}})
|
||||||
|
CONFIG['SYSTEMS'][section].update({'PEERS': {}})
|
||||||
|
|
||||||
except configparser.Error as err:
|
except configparser.Error as err:
|
||||||
sys.exit('Error processing configuration file -- {}'.format(err))
|
sys.exit('Error processing configuration file -- {}'.format(err))
|
||||||
|
@ -327,6 +327,7 @@ def create_app():
|
|||||||
use_acl = db.Column(db.Boolean(), nullable=False, server_default='1')
|
use_acl = db.Column(db.Boolean(), nullable=False, server_default='1')
|
||||||
sub_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='')
|
||||||
tg_acl = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='')
|
tg_acl = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='')
|
||||||
|
enable_unit = db.Column(db.Boolean(), nullable=False, server_default='1')
|
||||||
server = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='')
|
server = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='')
|
||||||
notes = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='')
|
notes = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='')
|
||||||
|
|
||||||
@ -1771,6 +1772,7 @@ def create_app():
|
|||||||
# print(s.name)
|
# print(s.name)
|
||||||
i = MasterList.query.filter_by(server=_name).all()
|
i = MasterList.query.filter_by(server=_name).all()
|
||||||
o = OBP.query.filter_by(server=_name).all()
|
o = OBP.query.filter_by(server=_name).all()
|
||||||
|
p = ProxyList.query.filter_by(server=_name).all()
|
||||||
print('get masters')
|
print('get masters')
|
||||||
master_config_list = {}
|
master_config_list = {}
|
||||||
## master_config_list['SYSTEMS'] = {}
|
## master_config_list['SYSTEMS'] = {}
|
||||||
@ -1780,6 +1782,7 @@ def create_app():
|
|||||||
master_config_list.update({m.name: {
|
master_config_list.update({m.name: {
|
||||||
'MODE': 'MASTER',
|
'MODE': 'MASTER',
|
||||||
'ENABLED': m.active,
|
'ENABLED': m.active,
|
||||||
|
'USE_USER_MAN': m.enable_um,
|
||||||
'STATIC_APRS_POSITION_ENABLED': m.static_positions,
|
'STATIC_APRS_POSITION_ENABLED': m.static_positions,
|
||||||
'REPEAT': m.repeat,
|
'REPEAT': m.repeat,
|
||||||
'MAX_PEERS': m.max_peers,
|
'MAX_PEERS': m.max_peers,
|
||||||
@ -1795,16 +1798,16 @@ def create_app():
|
|||||||
}})
|
}})
|
||||||
master_config_list[m.name].update({'PEERS': {}})
|
master_config_list[m.name].update({'PEERS': {}})
|
||||||
for obp in o:
|
for obp in o:
|
||||||
print(type(obp.network_id))
|
## print(type(obp.network_id))
|
||||||
master_config_list.update({obp.name: {
|
master_config_list.update({obp.name: {
|
||||||
'MODE': 'OPENBRIDGE',
|
'MODE': 'OPENBRIDGE',
|
||||||
'ENABLED': obp.enabled,
|
'ENABLED': obp.enabled,
|
||||||
'NETWORK_ID': obp.network_id, #int(obp.network_id).to_bytes(4, 'big'),
|
'NETWORK_ID': obp.network_id, #int(obp.network_id).to_bytes(4, 'big'),
|
||||||
'IP': gethostbyname(obp.ip),
|
'IP': gethostbyname(obp.ip),
|
||||||
'PORT': obp.port,
|
'PORT': obp.port,
|
||||||
## 'PASSPHRASE': bytes(obp.passphrase.ljust(20,'\x00')[:20], 'utf-8'),
|
'PASSPHRASE': bytes(obp.passphrase.ljust(20,'\x00')[:20], 'utf-8'),
|
||||||
## 'TARGET_SOCK': (obp.target_ip, obp.target_port),
|
'TARGET_SOCK': (obp.target_ip, obp.target_port),
|
||||||
## 'TARGET_IP': gethostbyname(obp.target_ip),
|
'TARGET_IP': gethostbyname(obp.target_ip),
|
||||||
'TARGET_PORT': obp.target_port,
|
'TARGET_PORT': obp.target_port,
|
||||||
'BOTH_SLOTS': obp.both_slots,
|
'BOTH_SLOTS': obp.both_slots,
|
||||||
'USE_ACL': obp.use_acl,
|
'USE_ACL': obp.use_acl,
|
||||||
@ -1812,6 +1815,27 @@ def create_app():
|
|||||||
'TG1_ACL': obp.tg_acl,
|
'TG1_ACL': obp.tg_acl,
|
||||||
'TG2_ACL': 'PERMIT:ALL'
|
'TG2_ACL': 'PERMIT:ALL'
|
||||||
}})
|
}})
|
||||||
|
for pr in p:
|
||||||
|
master_config_list.update({pr.name: {
|
||||||
|
'MODE': 'PROXY',
|
||||||
|
'ENABLED': pr.active,
|
||||||
|
'EXTERNAL_PROXY_SCRIPT': pr.external_proxy,
|
||||||
|
'STATIC_APRS_POSITION_ENABLED': pr.static_positions,
|
||||||
|
'USE_USER_MAN': pr.enable_um,
|
||||||
|
'REPEAT': pr.repeat,
|
||||||
|
'PASSPHRASE': bytes(pr.passphrase, 'utf-8'),
|
||||||
|
'EXTERNAL_PORT': pr.external_port,
|
||||||
|
'INTERNAL_PORT_START': pr.internal_start_port,
|
||||||
|
'INTERNAL_PORT_STOP': pr.internal_stop_port,
|
||||||
|
'GROUP_HANGTIME': pr.group_hang_time,
|
||||||
|
'USE_ACL': pr.use_acl,
|
||||||
|
'REG_ACL': pr.reg_acl,
|
||||||
|
'SUB_ACL': pr.sub_acl,
|
||||||
|
'TG1_ACL': pr.tg1_acl,
|
||||||
|
'TG2_ACL': pr.tg2_acl
|
||||||
|
}})
|
||||||
|
master_config_list[pr.name].update({'PEERS': {}})
|
||||||
|
|
||||||
print(master_config_list)
|
print(master_config_list)
|
||||||
return master_config_list
|
return master_config_list
|
||||||
|
|
||||||
@ -1865,9 +1889,9 @@ def create_app():
|
|||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
def edit_master(_mode, _name, _server, _static_positions, _repeat, _active, _max_peers, _ip, _port, _enable_um, _passphrase, _group_hang_time, _use_acl, _reg_acl, _sub_acl, _tg1_acl, _tg2_acl, _enable_unit, _notes, _external_proxy, _int_start_port, _int_stop_port, _network_id, _target_ip, _target_port, _both_slots):
|
def edit_master(_mode, _name, _server, _static_positions, _repeat, _active, _max_peers, _ip, _port, _enable_um, _passphrase, _group_hang_time, _use_acl, _reg_acl, _sub_acl, _tg1_acl, _tg2_acl, _enable_unit, _notes, _external_proxy, _int_start_port, _int_stop_port, _network_id, _target_ip, _target_port, _both_slots):
|
||||||
print(_mode)
|
## print(_mode)
|
||||||
print(_server)
|
#### print(_server)
|
||||||
print(_name)
|
## print(_name)
|
||||||
if _mode == 'MASTER':
|
if _mode == 'MASTER':
|
||||||
## print(_name)
|
## print(_name)
|
||||||
m = MasterList.query.filter_by(server=_server).filter_by(name=_name).first()
|
m = MasterList.query.filter_by(server=_server).filter_by(name=_name).first()
|
||||||
@ -1891,6 +1915,8 @@ def create_app():
|
|||||||
m.notes = _notes
|
m.notes = _notes
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
if _mode == 'OBP':
|
if _mode == 'OBP':
|
||||||
|
print(_enable_unit)
|
||||||
|
## print(enable_unit)
|
||||||
o = OBP.query.filter_by(server=_server).filter_by(name=_name).first()
|
o = OBP.query.filter_by(server=_server).filter_by(name=_name).first()
|
||||||
o.enabled = _active
|
o.enabled = _active
|
||||||
o.network_id = _network_id
|
o.network_id = _network_id
|
||||||
@ -1904,11 +1930,12 @@ def create_app():
|
|||||||
o.sub_acl = _sub_acl
|
o.sub_acl = _sub_acl
|
||||||
o.tg1_acl = _tg1_acl
|
o.tg1_acl = _tg1_acl
|
||||||
o.tg2_acl = _tg2_acl
|
o.tg2_acl = _tg2_acl
|
||||||
|
o.enable_unit = _enable_unit
|
||||||
o.notes = _notes
|
o.notes = _notes
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
if _mode == 'PROXY':
|
if _mode == 'PROXY':
|
||||||
print(_int_start_port)
|
## print(_int_start_port)
|
||||||
print(_int_stop_port)
|
## print(_int_stop_port)
|
||||||
p = ProxyList.query.filter_by(server=_server).filter_by(name=_name).first()
|
p = ProxyList.query.filter_by(server=_server).filter_by(name=_name).first()
|
||||||
p.name = _name
|
p.name = _name
|
||||||
p.static_positions = _static_positions
|
p.static_positions = _static_positions
|
||||||
@ -2017,6 +2044,7 @@ def create_app():
|
|||||||
use_acl = _use_acl,
|
use_acl = _use_acl,
|
||||||
sub_acl = _sub_acl,
|
sub_acl = _sub_acl,
|
||||||
tg_acl = _tg1_acl,
|
tg_acl = _tg1_acl,
|
||||||
|
enable_unit = _enable_unit,
|
||||||
server = _server,
|
server = _server,
|
||||||
notes = _notes,
|
notes = _notes,
|
||||||
)
|
)
|
||||||
@ -2894,8 +2922,6 @@ def create_app():
|
|||||||
<p style="text-align: center;">Redirecting in 3 seconds.</p>
|
<p style="text-align: center;">Redirecting in 3 seconds.</p>
|
||||||
<meta http-equiv="refresh" content="3; URL=manage_peers" />'''
|
<meta http-equiv="refresh" content="3; URL=manage_peers" />'''
|
||||||
if request.args.get('edit_xlx') == 'save':
|
if request.args.get('edit_xlx') == 'save':
|
||||||
print(request.args.get('edit_xlx') == 'save')
|
|
||||||
print(request.args.get('server'))
|
|
||||||
peer_edit('xlx', request.args.get('server'), request.args.get('name'), 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'))
|
peer_edit('xlx', request.args.get('server'), request.args.get('name'), 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'))
|
||||||
content = '''<h3 style="text-align: center;">XLX PEER changed.</h3>
|
content = '''<h3 style="text-align: center;">XLX PEER changed.</h3>
|
||||||
<p style="text-align: center;">Redirecting in 3 seconds.</p>
|
<p style="text-align: center;">Redirecting in 3 seconds.</p>
|
||||||
@ -3164,7 +3190,7 @@ def create_app():
|
|||||||
enable_unit = False
|
enable_unit = False
|
||||||
both_slots = True
|
both_slots = True
|
||||||
if request.form.get('enabled') == 'True':
|
if request.form.get('enabled') == 'True':
|
||||||
active = True
|
enabled = True
|
||||||
if request.form.get('use_acl') == 'True':
|
if request.form.get('use_acl') == 'True':
|
||||||
use_acl = True
|
use_acl = True
|
||||||
if request.form.get('enable_unit') == 'True':
|
if request.form.get('enable_unit') == 'True':
|
||||||
@ -3246,7 +3272,6 @@ def create_app():
|
|||||||
<tr>
|
<tr>
|
||||||
<td><strong> Active:</strong></td>
|
<td><strong> Active:</strong></td>
|
||||||
<td> <select name="enabled">
|
<td> <select name="enabled">
|
||||||
<option selected="selected" value="True">Current - True</option>
|
|
||||||
<option value="True">True</option>
|
<option value="True">True</option>
|
||||||
<option value="False">False</option>
|
<option value="False">False</option>
|
||||||
</select></td>
|
</select></td>
|
||||||
@ -3751,6 +3776,7 @@ def create_app():
|
|||||||
<tr>
|
<tr>
|
||||||
<td><strong> Enable Unit Calls:</strong></td>
|
<td><strong> Enable Unit Calls:</strong></td>
|
||||||
<td> <select name="enable_unit">
|
<td> <select name="enable_unit">
|
||||||
|
<option selected="selected" value="''' + str(o.enable_unit) + '''">Current - ''' + str(o.enable_unit) + '''</option>
|
||||||
<option value="True">True</option>
|
<option value="True">True</option>
|
||||||
<option value="False">False</option>
|
<option value="False">False</option>
|
||||||
</select></td>
|
</select></td>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user