This commit is contained in:
n0mjs710 2018-12-01 11:31:35 -06:00
parent 3d7b372b13
commit 2ae84b8fe8

View File

@ -106,7 +106,7 @@ def alias_short(_id, _dict):
return ', '.join(alias) return ', '.join(alias)
else: else:
return str(alias) return str(alias)
def alias_call(_id, _dict): def alias_call(_id, _dict):
alias = get_alias(_id, _dict, 'CALLSIGN') alias = get_alias(_id, _dict, 'CALLSIGN')
if type(alias) == list: if type(alias) == list:
@ -119,7 +119,7 @@ def alias_call(_id, _dict):
# Build the HBlink connections table # Build the HBlink connections table
def build_hblink_table(_config, _stats_table): def build_hblink_table(_config, _stats_table):
for _hbp, _hbp_data in _config.iteritems(): for _hbp, _hbp_data in _config.iteritems():
if _hbp_data['ENABLED'] == True: if _hbp_data['ENABLED'] == True:
if _hbp_data['MODE'] == 'MASTER': if _hbp_data['MODE'] == 'MASTER':
_stats_table['MASTERS'][_hbp] = {} _stats_table['MASTERS'][_hbp] = {}
@ -168,20 +168,18 @@ def build_hblink_table(_config, _stats_table):
_stats_table['OPENBRIDGES'][_hbp]['TARGET_IP'] = _hbp_data['TARGET_IP'] _stats_table['OPENBRIDGES'][_hbp]['TARGET_IP'] = _hbp_data['TARGET_IP']
_stats_table['OPENBRIDGES'][_hbp]['TARGET_PORT'] = _hbp_data['TARGET_PORT'] _stats_table['OPENBRIDGES'][_hbp]['TARGET_PORT'] = _hbp_data['TARGET_PORT']
return(_stats_table) return(_stats_table)
def update_hblink_table(_config, _stats_table): def update_hblink_table(_config, _stats_table):
pass
pprint(_config) '''
print
pprint(_stats_table)
for _hbp, _hbp_data in _config.iteritems(): for _hbp, _hbp_data in _config.iteritems():
_stats_peers = _stats_table['MASTERS'][_hbp]['PEERS'] _stats_peers = _stats_table['MASTERS'][_hbp]['PEERS']
# if this peer is the master # if this peer is the master
if _stats_table[_ipsc]['MASTER'] == False: if _stats_table[_ipsc]['MASTER'] == False:
_peer = _config[_ipsc]['MASTER']['RADIO_ID'] _peer = _config[_ipsc]['MASTER']['RADIO_ID']
_config_peer_data = _config[_ipsc]['MASTER'] _config_peer_data = _config[_ipsc]['MASTER']
_stats_peers[_peer]['RADIO_ID'] = int_id(_peer) _stats_peers[_peer]['RADIO_ID'] = int_id(_peer)
update_peer(_stats_peers, _peer, _config_peer_data) update_peer(_stats_peers, _peer, _config_peer_data)
@ -189,26 +187,26 @@ def update_hblink_table(_config, _stats_table):
for _peer, _config_peer_data in _config[_ipsc]['PEERS'].iteritems(): for _peer, _config_peer_data in _config[_ipsc]['PEERS'].iteritems():
if _peer != _config[_ipsc]['LOCAL']['RADIO_ID']: if _peer != _config[_ipsc]['LOCAL']['RADIO_ID']:
_stats_peers = _stats_table[_ipsc]['PEERS'] _stats_peers = _stats_table[_ipsc]['PEERS']
# update the peer if we already have it # update the peer if we already have it
if _peer in _stats_table[_ipsc]['PEERS']: if _peer in _stats_table[_ipsc]['PEERS']:
update_peer(_stats_peers, _peer, _config_peer_data) update_peer(_stats_peers, _peer, _config_peer_data)
# addit if we don't have it # addit if we don't have it
if _peer not in _stats_table[_ipsc]['PEERS']: if _peer not in _stats_table[_ipsc]['PEERS']:
add_peer(_stats_peers, _peer, _config_peer_data, 'peer') add_peer(_stats_peers, _peer, _config_peer_data, 'peer')
# for peers that need to be removed, never the master. This is complicated # for peers that need to be removed, never the master. This is complicated
peers_to_delete = [] peers_to_delete = []
# find any peers missing in the config update # find any peers missing in the config update
for _peer, _stats_peer_data in _stats_table[_ipsc]['PEERS'].iteritems(): for _peer, _stats_peer_data in _stats_table[_ipsc]['PEERS'].iteritems():
if _peer not in _config[_ipsc]['PEERS'] and _peer != _config[_ipsc]['MASTER']['RADIO_ID']: if _peer not in _config[_ipsc]['PEERS'] and _peer != _config[_ipsc]['MASTER']['RADIO_ID']:
peers_to_delete.append(_peer) peers_to_delete.append(_peer)
# delte anything identified from the right part of the stats table # delte anything identified from the right part of the stats table
delete_peers(peers_to_delete, _stats_table[_ipsc]['PEERS']) delete_peers(peers_to_delete, _stats_table[_ipsc]['PEERS'])
'''
# #
# CONFBRIDGE TABLE FUNCTIONS # CONFBRIDGE TABLE FUNCTIONS
# #
@ -216,7 +214,7 @@ def build_bridge_table(_bridges):
_stats_table = {} _stats_table = {}
_now = time() _now = time()
_cnow = strftime('%Y-%m-%d %H:%M:%S', localtime(_now)) _cnow = strftime('%Y-%m-%d %H:%M:%S', localtime(_now))
for _bridge, _bridge_data in _bridges.iteritems(): for _bridge, _bridge_data in _bridges.iteritems():
_stats_table[_bridge] = {} _stats_table[_bridge] = {}
@ -224,7 +222,7 @@ def build_bridge_table(_bridges):
_stats_table[_bridge][system['SYSTEM']] = {} _stats_table[_bridge][system['SYSTEM']] = {}
_stats_table[_bridge][system['SYSTEM']]['TS'] = system['TS'] _stats_table[_bridge][system['SYSTEM']]['TS'] = system['TS']
_stats_table[_bridge][system['SYSTEM']]['TGID'] = int_id(system['TGID']) _stats_table[_bridge][system['SYSTEM']]['TGID'] = int_id(system['TGID'])
if system['TO_TYPE'] == 'ON' or system['TO_TYPE'] == 'OFF': if system['TO_TYPE'] == 'ON' or system['TO_TYPE'] == 'OFF':
if system['TIMER'] - _now > 0: if system['TIMER'] - _now > 0:
_stats_table[_bridge][system['SYSTEM']]['EXP_TIME'] = int(system['TIMER'] - _now) _stats_table[_bridge][system['SYSTEM']]['EXP_TIME'] = int(system['TIMER'] - _now)
@ -237,22 +235,22 @@ def build_bridge_table(_bridges):
else: else:
_stats_table[_bridge][system['SYSTEM']]['EXP_TIME'] = 'N/A' _stats_table[_bridge][system['SYSTEM']]['EXP_TIME'] = 'N/A'
_stats_table[_bridge][system['SYSTEM']]['TO_ACTION'] = 'None' _stats_table[_bridge][system['SYSTEM']]['TO_ACTION'] = 'None'
if system['ACTIVE'] == True: if system['ACTIVE'] == True:
_stats_table[_bridge][system['SYSTEM']]['ACTIVE'] = 'Connected' _stats_table[_bridge][system['SYSTEM']]['ACTIVE'] = 'Connected'
_stats_table[_bridge][system['SYSTEM']]['COLOR'] = GREEN _stats_table[_bridge][system['SYSTEM']]['COLOR'] = GREEN
elif system['ACTIVE'] == False: elif system['ACTIVE'] == False:
_stats_table[_bridge][system['SYSTEM']]['ACTIVE'] = 'Disconnected' _stats_table[_bridge][system['SYSTEM']]['ACTIVE'] = 'Disconnected'
_stats_table[_bridge][system['SYSTEM']]['COLOR'] = RED _stats_table[_bridge][system['SYSTEM']]['COLOR'] = RED
for i in range(len(system['ON'])): for i in range(len(system['ON'])):
system['ON'][i] = str(int_id(system['ON'][i])) system['ON'][i] = str(int_id(system['ON'][i]))
_stats_table[_bridge][system['SYSTEM']]['TRIG_ON'] = ', '.join(system['ON']) _stats_table[_bridge][system['SYSTEM']]['TRIG_ON'] = ', '.join(system['ON'])
for i in range(len(system['OFF'])): for i in range(len(system['OFF'])):
system['OFF'][i] = str(int_id(system['OFF'][i])) system['OFF'][i] = str(int_id(system['OFF'][i]))
_stats_table[_bridge][system['SYSTEM']]['TRIG_OFF'] = ', '.join(system['OFF']) _stats_table[_bridge][system['SYSTEM']]['TRIG_OFF'] = ', '.join(system['OFF'])
return _stats_table return _stats_table
@ -294,7 +292,7 @@ def table_update(p):
CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['TYPE'] = '' CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['TYPE'] = ''
CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['SUB'] = '' CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['SUB'] = ''
CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['SRC'] = '' CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['SRC'] = ''
CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['DEST'] = '' CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['DEST'] = ''
build_stats() build_stats()
# #
@ -304,25 +302,25 @@ def process_message(_message):
global CTABLE, CONFIG, BRIDGES, CONFIG_RX, BRIDGES_RX global CTABLE, CONFIG, BRIDGES, CONFIG_RX, BRIDGES_RX
opcode = _message[:1] opcode = _message[:1]
_now = strftime('%Y-%m-%d %H:%M:%S %Z', localtime(time())) _now = strftime('%Y-%m-%d %H:%M:%S %Z', localtime(time()))
if opcode == OPCODE['CONFIG_SND']: if opcode == OPCODE['CONFIG_SND']:
logging.debug('got CONFIG_SND opcode') logging.debug('got CONFIG_SND opcode')
CONFIG = load_dictionary(_message) CONFIG = load_dictionary(_message)
CONFIG_RX = strftime('%Y-%m-%d %H:%M:%S', localtime(time())) CONFIG_RX = strftime('%Y-%m-%d %H:%M:%S', localtime(time()))
if CTABLE: if False: #CTABLE:
update_hblink_table(CONFIG, CTABLE) update_hblink_table(CONFIG, CTABLE)
else: else:
build_hblink_table(CONFIG, CTABLE) build_hblink_table(CONFIG, CTABLE)
elif opcode == OPCODE['BRIDGE_SND']: elif opcode == OPCODE['BRIDGE_SND']:
logging.debug('got BRIDGE_SND opcode') logging.debug('got BRIDGE_SND opcode')
BRIDGES = load_dictionary(_message) BRIDGES = load_dictionary(_message)
BRIDGES_RX = strftime('%Y-%m-%d %H:%M:%S', localtime(time())) BRIDGES_RX = strftime('%Y-%m-%d %H:%M:%S', localtime(time()))
BTABLE['BRIDGES'] = build_bridge_table(BRIDGES) BTABLE['BRIDGES'] = build_bridge_table(BRIDGES)
elif opcode == OPCODE['LINK_EVENT']: elif opcode == OPCODE['LINK_EVENT']:
logging.info('LINK_EVENT Received: {}'.format(repr(_message[1:]))) logging.info('LINK_EVENT Received: {}'.format(repr(_message[1:])))
elif opcode == OPCODE['BRDG_EVENT']: elif opcode == OPCODE['BRDG_EVENT']:
logging.info('BRIDGE EVENT: {}'.format(repr(_message[1:]))) logging.info('BRIDGE EVENT: {}'.format(repr(_message[1:])))
p = _message[1:].split(",") p = _message[1:].split(",")
@ -338,7 +336,7 @@ def process_message(_message):
log_message = '{}: UNKNOWN GROUP VOICE LOG MESSAGE'.format(_now) log_message = '{}: UNKNOWN GROUP VOICE LOG MESSAGE'.format(_now)
else: else:
log_message = '{}: UNKNOWN LOG MESSAGE'.format(_now) log_message = '{}: UNKNOWN LOG MESSAGE'.format(_now)
dashboard_server.broadcast('l' + log_message) dashboard_server.broadcast('l' + log_message)
LOGBUF.append(log_message) LOGBUF.append(log_message)
else: else:
@ -362,7 +360,7 @@ class report(NetstringReceiver):
def connectionLost(self, reason): def connectionLost(self, reason):
pass pass
def stringReceived(self, data): def stringReceived(self, data):
process_message(data) process_message(data)
@ -370,7 +368,7 @@ class report(NetstringReceiver):
class reportClientFactory(ReconnectingClientFactory): class reportClientFactory(ReconnectingClientFactory):
def __init__(self): def __init__(self):
logging.info('reportClient object for connecting to HBlink.py created at: %s', self) logging.info('reportClient object for connecting to HBlink.py created at: %s', self)
def startedConnecting(self, connector): def startedConnecting(self, connector):
logging.info('Initiating Connection to Server.') logging.info('Initiating Connection to Server.')
if 'dashboard_server' in locals() or 'dashboard_server' in globals(): if 'dashboard_server' in locals() or 'dashboard_server' in globals():
@ -396,7 +394,7 @@ class reportClientFactory(ReconnectingClientFactory):
# WEBSOCKET COMMUNICATION WITH THE DASHBOARD CLIENT # WEBSOCKET COMMUNICATION WITH THE DASHBOARD CLIENT
# #
class dashboard(WebSocketServerProtocol): class dashboard(WebSocketServerProtocol):
def onConnect(self, request): def onConnect(self, request):
logging.info('Client connecting: %s', request.peer) logging.info('Client connecting: %s', request.peer)
@ -444,7 +442,7 @@ class dashboardFactory(WebSocketServerFactory):
for c in self.clients: for c in self.clients:
c.sendMessage(msg.encode('utf8')) c.sendMessage(msg.encode('utf8'))
logging.debug('message sent to %s', c.peer) logging.debug('message sent to %s', c.peer)
# #
# STATIC WEBSERVER # STATIC WEBSERVER
# #
@ -464,37 +462,37 @@ if __name__ == '__main__':
logging.basicConfig(level=logging.INFO,filename = (LOG_PATH + LOG_NAME), filemode='a') logging.basicConfig(level=logging.INFO,filename = (LOG_PATH + LOG_NAME), filemode='a')
logging.info('web_tables.py starting up') logging.info('web_tables.py starting up')
# Download alias files # Download alias files
result = try_download(PATH, 'peer_ids.csv', PEER_URL, (FILE_RELOAD * 86400)) result = try_download(PATH, 'peer_ids.csv', PEER_URL, (FILE_RELOAD * 86400))
logging.info(result) logging.info(result)
result = try_download(PATH, 'subscriber_ids.csv', SUBSCRIBER_URL, (FILE_RELOAD * 86400)) result = try_download(PATH, 'subscriber_ids.csv', SUBSCRIBER_URL, (FILE_RELOAD * 86400))
logging.info(result) logging.info(result)
# Make Alias Dictionaries # Make Alias Dictionaries
peer_ids = mk_full_id_dict(PATH, PEER_FILE, 'peer') peer_ids = mk_full_id_dict(PATH, PEER_FILE, 'peer')
if peer_ids: if peer_ids:
logging.info('ID ALIAS MAPPER: peer_ids dictionary is available') logging.info('ID ALIAS MAPPER: peer_ids dictionary is available')
subscriber_ids = mk_full_id_dict(PATH, SUBSCRIBER_FILE, 'subscriber') subscriber_ids = mk_full_id_dict(PATH, SUBSCRIBER_FILE, 'subscriber')
if subscriber_ids: if subscriber_ids:
logging.info('ID ALIAS MAPPER: subscriber_ids dictionary is available') logging.info('ID ALIAS MAPPER: subscriber_ids dictionary is available')
talkgroup_ids = mk_full_id_dict(PATH, TGID_FILE, 'tgid') talkgroup_ids = mk_full_id_dict(PATH, TGID_FILE, 'tgid')
if talkgroup_ids: if talkgroup_ids:
logging.info('ID ALIAS MAPPER: talkgroup_ids dictionary is available') logging.info('ID ALIAS MAPPER: talkgroup_ids dictionary is available')
local_subscriber_ids = mk_full_id_dict(PATH, LOCAL_SUB_FILE, 'subscriber') local_subscriber_ids = mk_full_id_dict(PATH, LOCAL_SUB_FILE, 'subscriber')
if local_subscriber_ids: if local_subscriber_ids:
logging.info('ID ALIAS MAPPER: local_subscriber_ids added to subscriber_ids dictionary') logging.info('ID ALIAS MAPPER: local_subscriber_ids added to subscriber_ids dictionary')
subscriber_ids.update(local_subscriber_ids) subscriber_ids.update(local_subscriber_ids)
local_peer_ids = mk_full_id_dict(PATH, LOCAL_PEER_FILE, 'peer') local_peer_ids = mk_full_id_dict(PATH, LOCAL_PEER_FILE, 'peer')
if local_peer_ids: if local_peer_ids:
logging.info('ID ALIAS MAPPER: local_peer_ids added peer_ids dictionary') logging.info('ID ALIAS MAPPER: local_peer_ids added peer_ids dictionary')
peer_ids.update(local_peer_ids) peer_ids.update(local_peer_ids)
# Jinja2 Stuff # Jinja2 Stuff
env = Environment( env = Environment(
loader=PackageLoader('web_tables', 'templates'), loader=PackageLoader('web_tables', 'templates'),
@ -503,18 +501,18 @@ if __name__ == '__main__':
dtemplate = env.get_template('hblink_table.html') dtemplate = env.get_template('hblink_table.html')
btemplate = env.get_template('bridge_table.html') btemplate = env.get_template('bridge_table.html')
# Create Static Website index file # Create Static Website index file
index_html = get_template(PATH + 'index_template.html') index_html = get_template(PATH + 'index_template.html')
index_html = index_html.replace('<<<system_name>>>', REPORT_NAME) index_html = index_html.replace('<<<system_name>>>', REPORT_NAME)
# Start update loop # Start update loop
update_stats = task.LoopingCall(build_stats) update_stats = task.LoopingCall(build_stats)
update_stats.start(FREQUENCY) update_stats.start(FREQUENCY)
# Connect to HBlink # Connect to HBlink
reactor.connectTCP(HBLINK_IP, HBLINK_PORT, reportClientFactory()) reactor.connectTCP(HBLINK_IP, HBLINK_PORT, reportClientFactory())
# Create websocket server to push content to clients # Create websocket server to push content to clients
dashboard_server = dashboardFactory('ws://*:9000') dashboard_server = dashboardFactory('ws://*:9000')
dashboard_server.protocol = dashboard dashboard_server.protocol = dashboard