diff --git a/bridge_master.py b/bridge_master.py index 237fdae..e2f3576 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -38,6 +38,7 @@ from time import time,sleep,perf_counter import importlib.util import re import copy +import json from setproctitle import setproctitle #from crccheck.crc import Crc32 @@ -409,6 +410,15 @@ def subMapWrite(): except: logger.warning('(SUBSCRIBER) Cannot write SUB_MAP to file') +def topoWrite(): + try: + _fh = open(CONFIG['ALIASES']['PATH'] + CONFIG['ALIASES']['TOPO_FILE'],'w') + json.dump(TOPO,_fh) + _fh.close() + logger.info('(TOPO) Writing topography file to disk') + except: + logger.warning('(TOPO) Cannot write topography file to disk') + #Subscriber Map trimmer loop def SubMapTrimmer(): logger.debug('(SUBSCRIBER) Subscriber Map trimmer loop started') @@ -552,9 +562,8 @@ def topoTrimmer(): if len(TOPO[_src]) == 0: _toprem.append(_src) for _remove in _toprem: - TOPO.pop(_remove) - - print(TOPO) + TOPO.pop(_remove) + topoWrite() @@ -2933,6 +2942,9 @@ if __name__ == '__main__': reactor.stop() if CONFIG['ALIASES']['SUB_MAP_FILE']: subMapWrite() + if CONFIG['ALIASES']['TOPO_FILE']: + topoWrite() + # Set signal handers so that we can gracefully exit if need be for sig in [signal.SIGINT, signal.SIGTERM]: @@ -3149,7 +3161,7 @@ if __name__ == '__main__': #topography trimmer topo_trimmer_task = task.LoopingCall(topoTrimmer) - topo_trimmer = topo_trimmer_task.start(610) + topo_trimmer = topo_trimmer_task.start(10)#610 topo_trimmer.addErrback(loopingErrHandle) diff --git a/config.py b/config.py index 15caf6d..1cb289b 100755 --- a/config.py +++ b/config.py @@ -186,7 +186,9 @@ def build_config(_config_file): 'SUB_MAP_FILE': config.get(section, 'SUB_MAP_FILE'), 'LOCAL_SUBSCRIBER_FILE': config.get(section, 'LOCAL_SUBSCRIBER_FILE'), 'SERVER_ID_URL': config.get(section, 'SERVER_ID_URL'), - 'SERVER_ID_FILE': config.get(section, 'SERVER_ID_FILE') + 'SERVER_ID_FILE': config.get(section, 'SERVER_ID_FILE'), + 'TOPO_FILE': config.get(section, 'TOPO_FILE'), + }) diff --git a/hblink.py b/hblink.py index 8611954..adac2a3 100755 --- a/hblink.py +++ b/hblink.py @@ -269,10 +269,12 @@ class OPENBRIDGE(DatagramProtocol): logger.trace('(%s) *BridgeControl* not sending BCVE, TARGET_IP currently not known',self._system) def send_my_bcto(self): + _hops = 1 + _hops = _hops.to_bytes(1,'big') for system in self._CONFIG['SYSTEMS']: if self._CONFIG['SYSTEMS'][system]['MODE'] == 'OPENBRIDGE' and self._CONFIG['SYSTEMS'][system]['VER'] > 5: if self._config['ENHANCED_OBP'] and self._config['TARGET_IP']: - _packet = b''.join([BCTO,self._CONFIG['GLOBAL']['SERVER_ID'],self._CONFIG['SYSTEMS'][system]['NETWORK_ID'],self._CONFIG['SYSTEMS'][system]['VER'].to_bytes(1,"big")]) + _packet = b''.join([BCTO,self._CONFIG['GLOBAL']['SERVER_ID'],self._CONFIG['SYSTEMS'][system]['NETWORK_ID'],self._CONFIG['SYSTEMS'][system]['VER'].to_bytes(1,"big"),_hops]) _h = blake2b(key=self._config['PASSPHRASE'], digest_size=16) _h.update(_packet) _hash = _h.digest() @@ -283,17 +285,19 @@ class OPENBRIDGE(DatagramProtocol): logger.trace('(%s) *BridgeControl* not sending BCTO, TARGET_IP currently not known. DST: %s, VER: %s ',self._system,int_id(self._CONFIG['SYSTEMS'][system]['NETWORK_ID']),self._CONFIG['SYSTEMS'][system]['VER']) - def retransmit_bcto(self,_string): + def retransmit_bcto(self,_string,_hops): + _hops += 1 + _hops = _hops.to_bytes(1,'big') for system in self._CONFIG['SYSTEMS']: if self._CONFIG['SYSTEMS'][system]['MODE'] == 'OPENBRIDGE' and self._CONFIG['SYSTEMS'][system]['VER'] > 5: if self._config['ENHANCED_OBP'] and self._config['TARGET_IP']: - _packet = b''.join([BCTO,_string]) + _packet = b''.join([BCTO,_string,_hops]) _h = blake2b(key=self._config['PASSPHRASE'], digest_size=16) _h.update(_packet) _hash = _h.digest() _packet = b''.join([_packet,_hash]) self.transport.write(_packet, (self._config['TARGET_IP'], self._config['TARGET_PORT'])) - logger.trace('(%s) *BridgeControl* retransmitted BCTO.') + logger.trace('(%s) *BridgeControl* retransmitted BCTO.',self._system) else: logger.trace('(%s) *BridgeControl* not retransmitting BCTO, TARGET_IP currently not known.',self._system) @@ -751,9 +755,14 @@ class OPENBRIDGE(DatagramProtocol): _src[4:8] _dst[8:12] _ver[12:13] + _hops[13:14] if _hash == _hash2: logger.trace('(%s) *ProtoControl* BCTO received: %s connected to %s with proto ver. %s'. self._system, int_id(_src), int_id(_dst), int.from_bytes_ver,'big') - self.retransmit_bcto(_packet[:13]) + if (int(_hops.from_bytes('big')) < 10): + retransmit_bcto(_packet[:14]) + else: + if _hops > 10: + logger.trace('(%s) *BridgeControl* not retransmitting BCTO - hop count exceeded',self._system) self.process_bcto(src,dst,ver) else: h,p = _sockaddr