diff --git a/templates/hblink_table.html b/templates/hblink_table.html index 27d80be..633eaa0 100755 --- a/templates/hblink_table.html +++ b/templates/hblink_table.html @@ -27,25 +27,25 @@ {% for _master in _table['MASTERS'] %} - {{ _master}} + {{_master}}
{{_table['MASTERS'][_master]['REPEAT']}}
{% for _client, _cdata in _table['MASTERS'][_master]['PEERS'].iteritems() %} {{ _client }}, {{ _cdata['CALLSIGN'] }}, {{ _cdata['LOCATION'] }}
{{ _cdata['IP'] }}:{{ _cdata['PORT'] }} / {{ _cdata['PINGS_RECEIVED'] }}
- TX: {{ _cdata['RX_FREQ'] }}
RX: {{ _cdata['TX_FREQ'] }} + {{ _cdata['RX_FREQ'] }}
{{ _cdata['TX_FREQ'] }} {{ _cdata['COLORCODE'] }}
{{ _cdata['SLOTS'] }} - TS1 - {{ _cdata[1]['TYPE'] }} - {{ _cdata[1]['SUB'] }} - {{ _cdata[1]['SRC'] }} - {{ _cdata[1]['DEST'] }} + TS1 + {{ _cdata[1]['TYPE'] }} + {{ _cdata[1]['SUB'] }} + {{ 'SELF' if _cdata[1]['SRC'] == _client else _cdata[1]['SRC'] }} + {{ _cdata[1]['DEST'] }} - TS2 - {{ _cdata[2]['TYPE'] }} - {{ _cdata[2]['SUB'] }} - {{ _cdata[2]['SRC'] }} - {{ _cdata[2]['DEST'] }} + TS2 + {{ _cdata[2]['TYPE'] }} + {{ _cdata[2]['SUB'] }} + {{ _cdata[2]['SRC'] }} + {{ _cdata[2]['DEST'] }} diff --git a/web_tables.py b/web_tables.py index 9786906..5fb28e3 100755 --- a/web_tables.py +++ b/web_tables.py @@ -47,7 +47,7 @@ from collections import deque from jinja2 import Environment, PackageLoader, select_autoescape # Utilities from K0USY Group sister project -from dmr_utils.utils import int_id, get_alias, try_download, mk_full_id_dict +from dmr_utils.utils import int_id, get_alias, try_download, mk_full_id_dict, hex_str_4 # Configuration variables and IPSC constants from config import * @@ -117,51 +117,74 @@ def alias_call(_id, _dict): else: return str(alias) +def add_hb_peer(_peer_conf, _ctable_loc, _peer): + _ctable_loc[int_id(_peer)] = {} + _ctable_peer = _ctable_loc[int_id(_peer)] + + # if the Frequency is 000.xxx assume it's not an RF peer, otherwise format the text fields + if _peer_conf['TX_FREQ'][:3] == '000' or _peer_conf['RX_FREQ'][:3] == '000': + _ctable_peer['TX_FREQ'] = 'N/A' + _ctable_peer['RX_FREQ'] = '' + else: + _ctable_peer['TX_FREQ'] = 'TX: ' + _peer_conf['TX_FREQ'][:3] + '.' + _peer_conf['TX_FREQ'][3:7] + _ctable_peer['RX_FREQ'] = 'RX: ' + _peer_conf['RX_FREQ'][:3] + '.' + _peer_conf['RX_FREQ'][3:7] + + # timeslots are kinda complicated too. 0 = none, 1 or 2 mean that one slot, 3 is both, and anythign else it considered DMO + if (_peer_conf['SLOTS'] == '0'): + _ctable_peer['SLOTS'] = 'NONE' + if (_peer_conf['SLOTS'] <= '2'): + _ctable_peer['SLOTS'] = _peer_conf['SLOTS'] + elif (_peer_conf['SLOTS'] == '3'): + _ctable_peer['SLOTS'] = 'BOTH' + else: + _ctable_peer['SLOTS'] = 'DMO' + + # Simple translation items + _ctable_peer['COLORCODE'] = _peer_conf['COLORCODE'] + _ctable_peer['CALLSIGN'] = _peer_conf['CALLSIGN'] + _ctable_peer['LOCATION'] = _peer_conf['LOCATION'] + _ctable_peer['CONNECTION'] = _peer_conf['CONNECTION'] + _ctable_peer['IP'] = _peer_conf['IP'] + _ctable_peer['PINGS_RECEIVED'] = _peer_conf['PINGS_RECEIVED'] + _ctable_peer['LAST_PING'] = _peer_conf['LAST_PING'] + _ctable_peer['PORT'] = _peer_conf['PORT'] + + # SLOT 1&2 - for real-time montior: make the structure for later use + for ts in range(1,3): + _ctable_peer[ts]= {} + _ctable_peer[ts]['COLOR'] = '' + _ctable_peer[ts]['TS'] = '' + _ctable_peer[ts]['TYPE'] = '' + _ctable_peer[ts]['SUB'] = '' + _ctable_peer[ts]['SRC'] = '' + _ctable_peer[ts]['DEST'] = '' + + # Build the HBlink connections table def build_hblink_table(_config, _stats_table): for _hbp, _hbp_data in _config.iteritems(): if _hbp_data['ENABLED'] == True: + + # Process Master Systems if _hbp_data['MODE'] == 'MASTER': _stats_table['MASTERS'][_hbp] = {} - _stats_table['MASTERS'][_hbp]['REPEAT'] = _hbp_data['REPEAT'] + if _hbp_data['REPEAT']: + _stats_table['MASTERS'][_hbp]['REPEAT'] = "repeat" + else: + _stats_table['MASTERS'][_hbp]['REPEAT'] = "isolate" _stats_table['MASTERS'][_hbp]['PEERS'] = {} - for _client in _hbp_data['PEERS']: - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)] = {} - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)]['CALLSIGN'] = _hbp_data['PEERS'][_client]['CALLSIGN'] - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)]['TX_FREQ'] = _hbp_data['PEERS'][_client]['TX_FREQ'][:3] + '.' + _hbp_data['PEERS'][_client]['TX_FREQ'][3:7] - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)]['RX_FREQ'] = _hbp_data['PEERS'][_client]['RX_FREQ'][:3] + '.' + _hbp_data['PEERS'][_client]['RX_FREQ'][3:7] - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)]['COLORCODE'] = _hbp_data['PEERS'][_client]['COLORCODE'] - _slots = _hbp_data['PEERS'][_client]['SLOTS'] - if (_slots <= '2'): - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)]['SLOTS'] = _slots - elif (_slots == '3'): - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)]['SLOTS'] = 'BOTH' - else: - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)]['SLOTS'] = 'DMO' - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)]['LOCATION'] = _hbp_data['PEERS'][_client]['LOCATION'] - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)]['CONNECTION'] = _hbp_data['PEERS'][_client]['CONNECTION'] - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)]['IP'] = _hbp_data['PEERS'][_client]['IP'] - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)]['PINGS_RECEIVED'] = _hbp_data['PEERS'][_client]['PINGS_RECEIVED'] - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)]['LAST_PING'] = _hbp_data['PEERS'][_client]['LAST_PING'] - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)]['PORT'] = _hbp_data['PEERS'][_client]['PORT'] - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)][1]= {} - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)][1]['TS'] = '' - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)][1]['TYPE'] = '' - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)][1]['SUB'] = '' - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)][1]['SRC'] = '' - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)][1]['DEST'] = '' - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)][2] = {} - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)][2]['TS'] = '' - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)][2]['SUB'] = '' - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)][2]['TYPE'] = '' - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)][2]['SRC'] = '' - _stats_table['MASTERS'][_hbp]['PEERS'][int_id(_client)][2]['DEST'] = '' + for _peer in _hbp_data['PEERS']: + add_hb_peer(_hbp_data['PEERS'][_peer], _stats_table['MASTERS'][_hbp]['PEERS'], _peer) + + # Proccess Peer Systems elif _hbp_data['MODE'] == 'PEER': _stats_table['PEERS'][_hbp] = {} _stats_table['PEERS'][_hbp]['CALLSIGN'] = _hbp_data['CALLSIGN'] _stats_table['PEERS'][_hbp]['RADIO_ID'] = int_id(_hbp_data['RADIO_ID']) _stats_table['PEERS'][_hbp]['MASTER_IP'] = _hbp_data['MASTER_IP'] _stats_table['PEERS'][_hbp]['STATS'] = _hbp_data['STATS'] + + # Process OpenBridge systems elif _hbp_data['MODE'] == 'OPENBRIDGE': _stats_table['OPENBRIDGES'][_hbp] = {} _stats_table['OPENBRIDGES'][_hbp]['NETWORK_ID'] = int_id(_hbp_data['NETWORK_ID']) @@ -170,43 +193,30 @@ def build_hblink_table(_config, _stats_table): return(_stats_table) def update_hblink_table(_config, _stats_table): - pass - ''' - for _hbp, _hbp_data in _config.iteritems(): - _stats_peers = _stats_table['MASTERS'][_hbp]['PEERS'] + logger.info('running update table') + # Is there a system in HBlink's config monitor doesn't know about? + for _hbp in _config: + add_list = [] + if _config[_hbp]['MODE'] == 'MASTER': + for _peer in _config[_hbp]['PEERS']: + if int_id(_peer) not in _stats_table['MASTERS'][_hbp]['PEERS']: + logger.info('config peer not in CTABLE and needs added %s', int_id(_peer)) + add_hb_peer(_config[_hbp]['PEERS'][_peer], _stats_table['MASTERS'][_hbp]['PEERS'], _peer) + + + # Is there a system in monitor that's been removed from HBlink's config? + for _hbp in _stats_table['MASTERS']: + remove_list = [] + if _config[_hbp]['MODE'] == 'MASTER': + for _peer in _stats_table['MASTERS'][_hbp]['PEERS']: + if hex_str_4(_peer) not in _config[_hbp]['PEERS']: + remove_list.append(_peer) + for _peer in remove_list: + logger.info('stat peer not in CONFIG and needs deleted %s', _peer) + del (_stats_table['MASTERS'][_hbp]['PEERS'][_peer]) + + build_stats() - # if this peer is the master - if _stats_table[_ipsc]['MASTER'] == False: - _peer = _config[_ipsc]['MASTER']['RADIO_ID'] - _config_peer_data = _config[_ipsc]['MASTER'] - - _stats_peers[_peer]['RADIO_ID'] = int_id(_peer) - update_peer(_stats_peers, _peer, _config_peer_data) - - # for all of the peers that are not the master... update or add - for _peer, _config_peer_data in _config[_ipsc]['PEERS'].iteritems(): - if _peer != _config[_ipsc]['LOCAL']['RADIO_ID']: - _stats_peers = _stats_table[_ipsc]['PEERS'] - - # update the peer if we already have it - if _peer in _stats_table[_ipsc]['PEERS']: - update_peer(_stats_peers, _peer, _config_peer_data) - - # addit if we don't have it - if _peer not in _stats_table[_ipsc]['PEERS']: - add_peer(_stats_peers, _peer, _config_peer_data, 'peer') - - # for peers that need to be removed, never the master. This is complicated - peers_to_delete = [] - - # find any peers missing in the config update - 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']: - peers_to_delete.append(_peer) - - # delte anything identified from the right part of the stats table - delete_peers(peers_to_delete, _stats_table[_ipsc]['PEERS']) - ''' # # CONFBRIDGE TABLE FUNCTIONS # @@ -281,20 +291,25 @@ def table_update(p): destination = int(p[7]) if system in CTABLE['MASTERS']: - if action == 'START': - CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['TS'] = True - CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['TYPE'] = callType - CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['SUB'] = sourceSub - CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['SRC'] = sourcePeer - CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['DEST'] = destination - if action == 'END': - CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['TS'] = False - CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['TYPE'] = '' - CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['SUB'] = '' - CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['SRC'] = '' - CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['DEST'] = '' + if sourcePeer in CTABLE['MASTERS'][system]['PEERS']: + if action == 'START': + CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['TS'] = True + CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['COLOR'] = '00ff00' + CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['TYPE'] = callType + CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['SUB'] = sourceSub + CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['SRC'] = sourcePeer + CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['DEST'] = destination + if action == 'END': + CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['TS'] = False + CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['COLOR'] = 'ffffff' + CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['TYPE'] = '' + CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['SUB'] = '' + CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['SRC'] = '' + CTABLE['MASTERS'][system]['PEERS'][sourcePeer][timeSlot]['DEST'] = '' - build_stats() + build_stats() + else: + logger.warning('tried to update a tranmission for a peer not yet listed') # # PROCESS IN COMING MESSAGES AND TAKE THE CORRECT ACTION DEPENING ON THE OPCODE # @@ -307,7 +322,7 @@ def process_message(_message): logging.debug('got CONFIG_SND opcode') CONFIG = load_dictionary(_message) CONFIG_RX = strftime('%Y-%m-%d %H:%M:%S', localtime(time())) - if False: #CTABLE: + if CTABLE['MASTERS']: update_hblink_table(CONFIG, CTABLE) else: build_hblink_table(CONFIG, CTABLE) @@ -459,7 +474,15 @@ class web_server(Resource): 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' + ) + console = logging.StreamHandler() + console.setLevel(logging.INFO) + logging.getLogger('').addHandler(console) + logger = logging.getLogger(__name__) logging.info('web_tables.py starting up')