From 19c73920d9477198563bf77acfab5d0b30e3b502 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 16:13:57 +0100 Subject: [PATCH 01/80] Send source server and repeater information via netstring interface --- bridge_master.py | 68 ++++++++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 28 deletions(-) diff --git a/bridge_master.py b/bridge_master.py index 1f6a876..d170f2a 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -448,7 +448,9 @@ def stream_trimmer_loop(): logger.info('(%s) *TIME OUT* RX STREAM ID: %s SUB: %s TGID %s, TS %s, Duration: %.2f', \ system, int_id(_slot['RX_STREAM_ID']), int_id(_slot['RX_RFS']), int_id(_slot['RX_TGID']), slot, _slot['RX_TIME'] - _slot['RX_START']) if CONFIG['REPORTS']['REPORT']: - systems[system]._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f}'.format(system, int_id(_slot['RX_STREAM_ID']), int_id(_slot['RX_PEER']), int_id(_slot['RX_RFS']), slot, int_id(_slot['RX_TGID']), _slot['RX_TIME'] - _slot['RX_START']).encode(encoding='utf-8', errors='ignore')) + systems[system]._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f},{},{}'.format(system, int_id(_slot['RX_STREAM_ID']), int_id(_slot['RX_PEER']), int_id(_slot['RX_RFS']), slot, int_id(_slot['RX_TGID']), _slot['RX_TIME'] - _slot['RX_START'],int_id(_slot['source_server']),int_id(_slot['source_rptr'])).encode(encoding='utf-8', errors='ignore')) + + #Null stream_id - for loop control if _slot['RX_TIME'] < _now - 60: _slot['RX_STREAM_ID'] = b'\x00' @@ -459,7 +461,7 @@ def stream_trimmer_loop(): logger.debug('(%s) *TIME OUT* TX STREAM ID: %s SUB: %s TGID %s, TS %s, Duration: %.2f', \ system, int_id(_slot['TX_STREAM_ID']), int_id(_slot['TX_RFS']), int_id(_slot['TX_TGID']), slot, _slot['TX_TIME'] - _slot['TX_START']) if CONFIG['REPORTS']['REPORT']: - systems[system]._report.send_bridgeEvent('GROUP VOICE,END,TX,{},{},{},{},{},{},{:.2f}'.format(system, int_id(_slot['TX_STREAM_ID']), int_id(_slot['TX_PEER']), int_id(_slot['TX_RFS']), slot, int_id(_slot['TX_TGID']), _slot['TX_TIME'] - _slot['TX_START']).encode(encoding='utf-8', errors='ignore')) + self._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), call_duration,int_id(_slot['source_server']),int_id(_slot['source_rptr'])).encode(encoding='utf-8', errors='ignore')) # OBP systems # We can't delete items from a dicationry that's being iterated, so we have to make a temporarly list of entrys to remove later @@ -498,7 +500,8 @@ def stream_trimmer_loop(): system, int_id(stream_id), get_alias(int_id(_stream['RFS']), subscriber_ids), get_alias(int_id(_stream['RX_PEER']), peer_ids), get_alias(int_id(_stream['TGID']), talkgroup_ids), _stream['LAST'] - _stream['START']) if CONFIG['REPORTS']['REPORT']: - systems[system]._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f}'.format(system, int_id(stream_id), int_id(_stream['RX_PEER']), int_id(_stream['RFS']), 1, int_id(_stream['TGID']), _stream['LAST'] - _stream['START']).encode(encoding='utf-8', errors='ignore')) + systems[system]._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f},{},{}'.format(system, int_id(stream_id), int_id(_stream['RX_PEER']), int_id(_stream['RFS']), 1, int_id(_stream['TGID']), _stream['LAST'] - _stream['START'], int_id(_stream['source_server'],int_id(_stream['source_rptr']))).encode(encoding='utf-8', errors='ignore')) + systems[system].STATUS[stream_id]['_to'] = True continue except Exception as e: @@ -1333,7 +1336,7 @@ class routerOBP(OPENBRIDGE): logger.debug('(%s) Conference Bridge: %s, Call Bridged to OBP System: %s TS: %s, TGID: %s', self._system, _bridge, _target['SYSTEM'], _target['TS'], int_id(_target['TGID'])) if CONFIG['REPORTS']['REPORT']: - systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,START,TX,{},{},{},{},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID'])).encode(encoding='utf-8', errors='ignore')) + systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,START,TX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) # Record the time of this packet so we can later identify a stale stream _target_status[_stream_id]['LAST'] = pkt_time @@ -1410,7 +1413,7 @@ class routerOBP(OPENBRIDGE): logger.debug('(%s) Generating TX FULL and EMB LCs for HomeBrew destination: System: %s, TS: %s, TGID: %s', self._system, _target['SYSTEM'], _target['TS'], int_id(_target['TGID'])) logger.debug('(%s) Conference Bridge: %s, Call Bridged to HBP System: %s TS: %s, TGID: %s', self._system, _bridge, _target['SYSTEM'], _target['TS'], int_id(_target['TGID'])) if CONFIG['REPORTS']['REPORT']: - systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,START,TX,{},{},{},{},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID'])).encode(encoding='utf-8', errors='ignore')) + systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,START,TX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) # Set other values for the contention handler to test next time there is a frame to forward _target_status[_target['TS']]['TX_TIME'] = pkt_time @@ -1438,7 +1441,7 @@ class routerOBP(OPENBRIDGE): dmrbits = _target_status[_target['TS']]['TX_T_LC'][0:98] + dmrbits[98:166] + _target_status[_target['TS']]['TX_T_LC'][98:197] if CONFIG['REPORTS']['REPORT']: call_duration = pkt_time - _target_status[_target['TS']]['TX_START'] - systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,END,TX,{},{},{},{},{},{},{:.2f}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']), call_duration).encode(encoding='utf-8', errors='ignore')) + systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,END,TX,{},{},{},{},{},{},{:.2f},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']), call_duration,int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) # Create a Burst B-E packet (Embedded LC) elif _dtype_vseq in [1,2,3,4]: dmrbits = dmrbits[0:116] + _target_status[_target['TS']]['TX_EMB_LC'][_dtype_vseq] + dmrbits[148:264] @@ -1460,7 +1463,7 @@ class routerOBP(OPENBRIDGE): systems[_d_system].send_system(_tmp_data) logger.debug('(%s) UNIT Data Bridged to HBP on slot 1: %s DST_ID: %s',self._system,_d_system,_int_dst_id) if CONFIG['REPORTS']['REPORT']: - systems[_d_system]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{},{},{},{},{},{}'.format(_d_system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), 1, _int_dst_id).encode(encoding='utf-8', errors='ignore')) + systems[_d_system]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) def sendDataToOBP(self,_target,_data,dmrpkt,pkt_time,_stream_id,_dst_id,_peer_id,_rf_src,_bits,_slot,_hops = b'',_source_server = b'\x00\x00\x00\x00', _ber = b'\x00', _rssi = b'\x00', _source_rptr = b'\x00\x00\x00\x00'): @@ -1499,8 +1502,7 @@ class routerOBP(OPENBRIDGE): systems[_target].send_system(_tmp_data,_hops,_ber,_rssi, _source_server, _source_rptr) logger.debug('(%s) UNIT Data Bridged to OBP System: %s DST_ID: %s', self._system, _target,_int_dst_id) if CONFIG['REPORTS']['REPORT']: - systems[_target]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{},{},{},{},{},{}'.format(_target, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), 1, _int_dst_id).encode(encoding='utf-8', errors='ignore')) - + systems[_target]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) def dmrd_received(self, _peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data,_hash, _hops = b'', _source_server = b'\x00\x00\x00\x00', _ber = b'\x00', _rssi = b'\x00', _source_rptr = b'\x00\x00\x00\x00'): @@ -1540,7 +1542,9 @@ class routerOBP(OPENBRIDGE): 'lastData': False, 'RX_PEER': _peer_id, 'packets': 0, - 'crcs': set() + 'crcs': set(), + '_source_server' : _source_server, + '_source_rptr' : _source_rptr } @@ -1589,22 +1593,22 @@ class routerOBP(OPENBRIDGE): logger.info('(%s) *UNIT CSBK* STREAM ID: %s, RPTR: %s SUB: %s (%s) PEER: %s (%s) DST_ID %s (%s), TS %s, SRC: %s', \ self._system, int_id(_stream_id), self.get_rptr(_source_rptr), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot, int_id(_source_server)) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('UNIT CSBK,DATA,RX,{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id)).encode(encoding='utf-8', errors='ignore')) + self._report.send_bridgeEvent('UNIT CSBK,DATA,RX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) elif _dtype_vseq == 6: logger.info('(%s) *UNIT DATA HEADER* STREAM ID: %s, RPTR: %s SUB: %s (%s) PEER: %s (%s) DST_ID %s (%s), TS %s, SRC: %s', \ self._system, int_id(_stream_id),self.get_rptr(_source_rptr), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot,int_id(_source_server)) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('UNIT DATA HEADER,DATA,RX,{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id)).encode(encoding='utf-8', errors='ignore')) + self._report.send_bridgeEvent('UNIT DATA HEADER,DATA,RX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) elif _dtype_vseq == 7: logger.info('(%s) *UNIT VCSBK 1/2 DATA BLOCK * STREAM ID: %s, RPTR: %s SUB: %s (%s) PEER: %s (%s) TGID %s (%s), TS %s, SRC: %s', \ self._system, int_id(_stream_id), self.get_rptr(_source_rptr), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot, int_id(_source_server)) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('UNIT VCSBK 1/2 DATA BLOCK,DATA,RX,{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id)).encode(encoding='utf-8', errors='ignore')) + self._report.send_bridgeEvent('UNIT VCSBK 1/2 DATA BLOCK,DATA,RX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) elif _dtype_vseq == 8: logger.info('(%s) *UNIT VCSBK 3/4 DATA BLOCK * STREAM ID: %s, RPTR: %s, SUB: %s (%s) PEER: %s (%s) TGID %s (%s), TS %s, SRC: %s', \ self._system, int_id(_stream_id), self.get_rptr(_source_rptr), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot,int_id(_source_server)) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('UNIT VCSBK 3/4 DATA BLOCK,DATA,RX,{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id)).encode(encoding='utf-8', errors='ignore')) + self._report.send_bridgeEvent('UNIT VCSBK 3/4 DATA BLOCK,DATA,RX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) else: logger.info('(%s) *UNKNOWN DATA TYPE* STREAM ID: %s, RPTR: %s, SUB: %s (%s) PEER: %s (%s) TGID %s (%s), TS %s, SRC: %s', \ self._system, int_id(_stream_id), self.get_rptr(_source_rptr), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot,int_id(_source_server)) @@ -1707,7 +1711,8 @@ class routerOBP(OPENBRIDGE): logger.info('(%s) *CALL START* STREAM ID: %s, SUB: %s (%s), RPTR: %s (%s), PEER: %s (%s) TGID %s (%s), TS %s, SRC: %s, HOPS %s', self._system, int_id(_stream_id),get_alias(_rf_src, subscriber_ids),int_id(_rf_src),self.get_rptr(_source_rptr), int_id(_source_rptr), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot,int_id(_source_server),_inthops) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('GROUP VOICE,START,RX,{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id)).encode(encoding='utf-8', errors='ignore')) + self._report.send_bridgeEvent('GROUP VOICE,START,RX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + else: @@ -1842,8 +1847,9 @@ class routerOBP(OPENBRIDGE): logger.info('(%s) *CALL END* STREAM ID: %s SUB: %s (%s) PEER: %s (%s) TGID %s (%s), TS %s, Duration: %.2f, Packet rate: %.2f/s, Loss: %.2f%%', \ self._system, int_id(_stream_id), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot, call_duration, packet_rate,loss) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), call_duration).encode(encoding='utf-8', errors='ignore')) - self.STATUS[_stream_id]['_fin'] = True + self._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), call_duration,int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + + self.STATUS[_stream_id]['_fin'] = True self.STATUS[_stream_id]['lastSeq'] = False @@ -1915,7 +1921,9 @@ class routerHBP(HBSYSTEM): 'lastData': False, 'packets': 0, 'crcs': set(), - '_allStarMode': False + '_allStarMode': False, + 'source_server' : False, + 'source_rptr' : False } } @@ -1996,7 +2004,7 @@ class routerHBP(HBSYSTEM): dmrbits = _target_status[_stream_id]['T_LC'][0:98] + dmrbits[98:166] + _target_status[_stream_id]['T_LC'][98:197] if CONFIG['REPORTS']['REPORT']: call_duration = pkt_time - _target_status[_stream_id]['START'] - systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,END,TX,{},{},{},{},{},{},{:.2f}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']), call_duration).encode(encoding='utf-8', errors='ignore')) + systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,END,TX,{},{},{},{},{},{},{:.2f},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']), call_duration,int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) # Create a Burst B-E packet (Embedded LC) elif _dtype_vseq in [1,2,3,4]: dmrbits = dmrbits[0:116] + _target_status[_stream_id]['EMB_LC'][_dtype_vseq] + dmrbits[148:264] @@ -2046,7 +2054,7 @@ class routerHBP(HBSYSTEM): logger.debug('(%s) Generating TX FULL and EMB LCs for HomeBrew destination: System: %s, TS: %s, TGID: %s', self._system, _target['SYSTEM'], _target['TS'], int_id(_target['TGID'])) logger.debug('(%s) Conference Bridge: %s, Call Bridged to HBP System: %s TS: %s, TGID: %s', self._system, _bridge, _target['SYSTEM'], _target['TS'], int_id(_target['TGID'])) if CONFIG['REPORTS']['REPORT']: - systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,START,TX,{},{},{},{},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID'])).encode(encoding='utf-8', errors='ignore')) + systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,START,TX,{},{},{},{},{},{},{:.2f},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']), call_duration,int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) # Set other values for the contention handler to test next time there is a frame to forward _target_status[_target['TS']]['TX_TIME'] = pkt_time @@ -2074,7 +2082,7 @@ class routerHBP(HBSYSTEM): dmrbits = _target_status[_target['TS']]['TX_T_LC'][0:98] + dmrbits[98:166] + _target_status[_target['TS']]['TX_T_LC'][98:197] if CONFIG['REPORTS']['REPORT']: call_duration = pkt_time - _target_status[_target['TS']]['TX_START'] - systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,END,TX,{},{},{},{},{},{},{:.2f}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']), call_duration).encode(encoding='utf-8', errors='ignore')) + systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,END,TX,{},{},{},{},{},{},{:.2f},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']), call_duration,int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) # Create a Burst B-E packet (Embedded LC) elif _dtype_vseq in [1,2,3,4]: dmrbits = dmrbits[0:116] + _target_status[_target['TS']]['TX_EMB_LC'][_dtype_vseq] + dmrbits[148:264] @@ -2098,7 +2106,7 @@ class routerHBP(HBSYSTEM): systems[_d_system].send_system(_tmp_data,None) logger.debug('(%s) UNIT Data Bridged to HBP on slot 1: %s DST_ID: %s',self._system,_d_system,_int_dst_id) if CONFIG['REPORTS']['REPORT']: - systems[_d_system]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{},{},{},{},{},{}'.format(_d_system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), 1, _int_dst_id).encode(encoding='utf-8', errors='ignore')) + systems[_d_system]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{},{},{},{},{},{},{:.2f},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']), call_duration,int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) def sendDataToOBP(self,_target,_data,dmrpkt,pkt_time,_stream_id,_dst_id,_peer_id,_rf_src,_bits,_slot,_hops = b'',_ber = b'\x00', _rssi = b'\x00',_source_server = b'\x00\x00\x00\x00', _source_rptr = b'\x00\x00\x00\x00'): # _sysIgnore = sysIgnore @@ -2138,7 +2146,7 @@ class routerHBP(HBSYSTEM): systems[_target].send_system(_tmp_data,b'',_ber,_rssi,_source_server,_source_rptr) logger.debug('(%s) UNIT Data Bridged to OBP System: %s DST_ID: %s', self._system, _target,_int_dst_id) if CONFIG['REPORTS']['REPORT']: - systems[system]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{},{},{},{},{},{}'.format(_target, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), 1, _int_dst_id).encode(encoding='utf-8', errors='ignore')) + systems[system]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{},{},{},{},{},{},{:.2f},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']), call_duration,int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) def dmrd_received(self, _peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data): @@ -2151,8 +2159,10 @@ class routerHBP(HBSYSTEM): _bits = _data[15] _source_server = self._CONFIG['GLOBAL']['SERVER_ID'] + self.STATUS[_slot]['source_server'] = _source_server _source_rptr = _peer_id + self.STATUS[_slot]['source_rptr'] = _source_rptr #_pkt_crc = Crc32.calc(_data[4:53]) #_pkt_crc = hash(_data).digest() @@ -2521,12 +2531,13 @@ class routerHBP(HBSYSTEM): logger.info('(%s) *CALL START* STREAM ID: %s SUB: %s (%s) PEER: %s (%s) TGID %s (%s), TS %s', \ self._system, int_id(_stream_id), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('GROUP VOICE,START,RX,{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id)).encode(encoding='utf-8', errors='ignore')) + self._report.send_bridgeEvent('GROUP VOICE,START,RX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + else: logger.info('(%s) *VCSBK* STREAM ID: %s SUB: %s (%s) PEER: %s (%s) TGID %s (%s), TS %s _dtype_vseq: %s', self._system, int_id(_stream_id), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot, _dtype_vseq) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('OTHER DATA,DATA,RX,{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id)).encode(encoding='utf-8', errors='ignore')) + self._report.send_bridgeEvent('OTHER DATA,DATA,RX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) # If we can, use the LC from the voice header as to keep all options intact if _frame_type == HBPF_DATA_SYNC and _dtype_vseq == HBPF_SLT_VHEAD: @@ -2550,12 +2561,12 @@ class routerHBP(HBSYSTEM): logger.info('(%s) *VCSBK 1/2 DATA BLOCK * STREAM ID: %s SUB: %s (%s) PEER: %s (%s) TGID %s (%s), TS %s', \ self._system, int_id(_stream_id), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('VCSBK 1/2 DATA BLOCK,DATA,RX,{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id)).encode(encoding='utf-8', errors='ignore')) + self._report.send_bridgeEvent('VCSBK 1/2 DATA BLOCK,DATA,RX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) elif _dtype_vseq == 8: logger.info('(%s) *VCSBK 3/4 DATA BLOCK * STREAM ID: %s SUB: %s (%s) PEER: %s (%s) TGID %s (%s), TS %s', \ self._system, int_id(_stream_id), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('VCSBK 3/4 DATA BLOCK,DATA,RX,{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id)).encode(encoding='utf-8', errors='ignore')) + self._report.send_bridgeEvent('VCSBK 3/4 DATA BLOCK,DATA,RX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) #Packet rate limit #Rate drop @@ -2654,7 +2665,8 @@ class routerHBP(HBSYSTEM): logger.info('(%s) *CALL END* STREAM ID: %s SUB: %s (%s) PEER: %s (%s) TGID %s (%s), TS %s, Duration: %.2f, Packet rate: %.2f/s, LOSS: %.2f%%', \ self._system, int_id(_stream_id), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot, call_duration, packet_rate, loss) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), call_duration).encode(encoding='utf-8', errors='ignore')) + self._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']), call_duration,int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + #Reset back to False self.STATUS[_slot]['lastSeq'] = False From 3a826dd554bc633d4439a3ff28ccc6f53e93fef4 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 16:30:34 +0100 Subject: [PATCH 02/80] Fix some missing stream stuff --- bridge_master.py | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/bridge_master.py b/bridge_master.py index d170f2a..e9d9df9 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -1321,6 +1321,8 @@ class routerOBP(OPENBRIDGE): 'RFS': _rf_src, 'TGID': _dst_id, 'RX_PEER': _peer_id, + '_source_server' : _source_server, + '_source_rptr' : _source_rptr } # Generate LCs (full and EMB) for the TX stream @@ -1484,7 +1486,9 @@ class routerOBP(OPENBRIDGE): 'RFS': _rf_src, 'TGID': _dst_id, 'RX_PEER': _peer_id, - 'packets': 0 + 'packets': 0, + '_source_server' : _source_server, + '_source_rptr' : _source_rptr } # Record the time of this packet so we can later identify a stale stream @@ -1691,7 +1695,9 @@ class routerOBP(OPENBRIDGE): 'RX_PEER': _peer_id, 'packets': 0, 'loss': 0, - 'crcs': set() + 'crcs': set(), + '_source_server' : _source_server, + '_source_rptr' : _source_rptr } @@ -1971,7 +1977,9 @@ class routerHBP(HBSYSTEM): 'CONTENTION':False, 'RFS': _rf_src, 'TGID': _dst_id, - 'RX_PEER': _peer_id + 'RX_PEER': _peer_id, + '_source_server' : _source_server, + '_source_rptr' : _source_rptr } # Generate LCs (full and EMB) for the TX stream dst_lc = b''.join([self.STATUS[_slot]['RX_LC'][0:3], _target['TGID'], _rf_src]) @@ -2046,6 +2054,8 @@ class routerHBP(HBSYSTEM): _target_status[_target['TS']]['TX_STREAM_ID'] = _stream_id _target_status[_target['TS']]['TX_RFS'] = _rf_src _target_status[_target['TS']]['TX_PEER'] = _peer_id + _target_staus[_target]['TS']['_source_server'] : _source_server + _target_staus[_target]['TS']['_source_rptr'] : _source_rptr # Generate LCs (full and EMB) for the TX stream dst_lc = self.STATUS[_slot]['RX_LC'][0:3] + _target['TGID'] + _rf_src _target_status[_target['TS']]['TX_H_LC'] = bptc.encode_header_lc(dst_lc) @@ -2128,7 +2138,9 @@ class routerHBP(HBSYSTEM): 'CONTENTION':False, 'RFS': _rf_src, 'TGID': _dst_id, - 'RX_PEER': _peer_id + 'RX_PEER': _peer_id, + '_source_server' : _source_server, + '_source_rptr' : _source_rptr } # Record the time of this packet so we can later identify a stale stream @@ -2512,6 +2524,8 @@ class routerHBP(HBSYSTEM): self.STATUS[_slot]['packets'] = 0 self.STATUS[_slot]['loss'] = 0 self.STATUS[_slot]['crcs'] = set() + self.STATUS[_slot]['_source_server'] = _source_server + self.STATUS[_slot]['_source_rptr'] = _source_rptr if (self.STATUS[_slot]['RX_TYPE'] != HBPF_SLT_VTERM) and (pkt_time < (self.STATUS[_slot]['RX_TIME'] + STREAM_TO)) and (_rf_src != self.STATUS[_slot]['RX_RFS']): logger.warning('(%s) Packet received with STREAM ID: %s SUB: %s PEER: %s TGID %s, SLOT %s collided with existing call', self._system, int_id(_stream_id), int_id(_rf_src), int_id(_peer_id), int_id(_dst_id), _slot) From e3e59b372b64c3945ae9af7e5d15394e0202a379 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 16:32:41 +0100 Subject: [PATCH 03/80] Rouge underscores --- bridge_master.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bridge_master.py b/bridge_master.py index e9d9df9..3754f82 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -1321,8 +1321,8 @@ class routerOBP(OPENBRIDGE): 'RFS': _rf_src, 'TGID': _dst_id, 'RX_PEER': _peer_id, - '_source_server' : _source_server, - '_source_rptr' : _source_rptr + 'source_server' : _source_server, + 'source_rptr' : _source_rptr } # Generate LCs (full and EMB) for the TX stream From ed12751a45b4f2224c1812da511f2258d3b2efe7 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 16:34:11 +0100 Subject: [PATCH 04/80] missing ) --- bridge_master.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridge_master.py b/bridge_master.py index 3754f82..425b9cd 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -500,7 +500,7 @@ def stream_trimmer_loop(): system, int_id(stream_id), get_alias(int_id(_stream['RFS']), subscriber_ids), get_alias(int_id(_stream['RX_PEER']), peer_ids), get_alias(int_id(_stream['TGID']), talkgroup_ids), _stream['LAST'] - _stream['START']) if CONFIG['REPORTS']['REPORT']: - systems[system]._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f},{},{}'.format(system, int_id(stream_id), int_id(_stream['RX_PEER']), int_id(_stream['RFS']), 1, int_id(_stream['TGID']), _stream['LAST'] - _stream['START'], int_id(_stream['source_server'],int_id(_stream['source_rptr']))).encode(encoding='utf-8', errors='ignore')) + systems[system]._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f},{},{}'.format(system, int_id(stream_id), int_id(_stream['RX_PEER']), int_id(_stream['RFS']), 1, int_id(_stream['TGID']), _stream['LAST'] - _stream['START'], int_id(_stream['source_server']),int_id(_stream['source_rptr']))).encode(encoding='utf-8', errors='ignore')) systems[system].STATUS[stream_id]['_to'] = True continue From 394f374e75e1364727dfb43b8aaf573790a48719 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 16:35:29 +0100 Subject: [PATCH 05/80] unmatched --- bridge_master.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridge_master.py b/bridge_master.py index 425b9cd..7a5673b 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -500,7 +500,7 @@ def stream_trimmer_loop(): system, int_id(stream_id), get_alias(int_id(_stream['RFS']), subscriber_ids), get_alias(int_id(_stream['RX_PEER']), peer_ids), get_alias(int_id(_stream['TGID']), talkgroup_ids), _stream['LAST'] - _stream['START']) if CONFIG['REPORTS']['REPORT']: - systems[system]._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f},{},{}'.format(system, int_id(stream_id), int_id(_stream['RX_PEER']), int_id(_stream['RFS']), 1, int_id(_stream['TGID']), _stream['LAST'] - _stream['START'], int_id(_stream['source_server']),int_id(_stream['source_rptr']))).encode(encoding='utf-8', errors='ignore')) + systems[system]._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f},{},{}'.format(system, int_id(stream_id), int_id(_stream['RX_PEER']), int_id(_stream['RFS']), 1, int_id(_stream['TGID']), _stream['LAST'] - _stream['START'], int_id(_stream['source_server']),int_id(_stream['source_rptr']))).encode(encoding='utf-8', errors='ignore') systems[system].STATUS[stream_id]['_to'] = True continue From 3552dfe3153e8e2695871d3fcabf74a43e71ff59 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 16:37:15 +0100 Subject: [PATCH 06/80] bracketry --- bridge_master.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridge_master.py b/bridge_master.py index 7a5673b..b44962e 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -500,7 +500,7 @@ def stream_trimmer_loop(): system, int_id(stream_id), get_alias(int_id(_stream['RFS']), subscriber_ids), get_alias(int_id(_stream['RX_PEER']), peer_ids), get_alias(int_id(_stream['TGID']), talkgroup_ids), _stream['LAST'] - _stream['START']) if CONFIG['REPORTS']['REPORT']: - systems[system]._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f},{},{}'.format(system, int_id(stream_id), int_id(_stream['RX_PEER']), int_id(_stream['RFS']), 1, int_id(_stream['TGID']), _stream['LAST'] - _stream['START'], int_id(_stream['source_server']),int_id(_stream['source_rptr']))).encode(encoding='utf-8', errors='ignore') + systems[system]._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f},{},{}'.format(system, int_id(stream_id), int_id(_stream['RX_PEER']), int_id(_stream['RFS']), 1, int_id(_stream['TGID']), _stream['LAST'] - _stream['START'], int_id(_stream['source_server']),int_id(_stream['source_rptr'])).encode(encoding='utf-8', errors='ignore')) systems[system].STATUS[stream_id]['_to'] = True continue From c8799001502c9efb89d1d8b452f34af0b4788c40 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 16:38:42 +0100 Subject: [PATCH 07/80] T --- bridge_master.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridge_master.py b/bridge_master.py index b44962e..ef5114e 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -2054,7 +2054,7 @@ class routerHBP(HBSYSTEM): _target_status[_target['TS']]['TX_STREAM_ID'] = _stream_id _target_status[_target['TS']]['TX_RFS'] = _rf_src _target_status[_target['TS']]['TX_PEER'] = _peer_id - _target_staus[_target]['TS']['_source_server'] : _source_server + _target_status[_target]['TS']['_source_server'] : _source_server _target_staus[_target]['TS']['_source_rptr'] : _source_rptr # Generate LCs (full and EMB) for the TX stream dst_lc = self.STATUS[_slot]['RX_LC'][0:3] + _target['TGID'] + _rf_src From d6d0b573e574d15562667592cb198703cdb31beb Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 16:39:55 +0100 Subject: [PATCH 08/80] dict --- bridge_master.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bridge_master.py b/bridge_master.py index ef5114e..3745543 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -2054,8 +2054,8 @@ class routerHBP(HBSYSTEM): _target_status[_target['TS']]['TX_STREAM_ID'] = _stream_id _target_status[_target['TS']]['TX_RFS'] = _rf_src _target_status[_target['TS']]['TX_PEER'] = _peer_id - _target_status[_target]['TS']['_source_server'] : _source_server - _target_staus[_target]['TS']['_source_rptr'] : _source_rptr + _target_status[_target]['TS']['_source_server'] = _source_server + _target_staus[_target]['TS']['_source_rptr'] = _source_rptr # Generate LCs (full and EMB) for the TX stream dst_lc = self.STATUS[_slot]['RX_LC'][0:3] + _target['TGID'] + _rf_src _target_status[_target['TS']]['TX_H_LC'] = bptc.encode_header_lc(dst_lc) From ec7bcd66fd707330e50e8aa0d84966caf2f7aed0 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 16:42:17 +0100 Subject: [PATCH 09/80] s --- bridge_master.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bridge_master.py b/bridge_master.py index 3745543..41ecc7b 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -2054,8 +2054,8 @@ class routerHBP(HBSYSTEM): _target_status[_target['TS']]['TX_STREAM_ID'] = _stream_id _target_status[_target['TS']]['TX_RFS'] = _rf_src _target_status[_target['TS']]['TX_PEER'] = _peer_id - _target_status[_target]['TS']['_source_server'] = _source_server - _target_staus[_target]['TS']['_source_rptr'] = _source_rptr + _target_status[_target]['TS']['source_server'] = _source_server + _target_status[_target]['TS']['source_rptr'] = _source_rptr # Generate LCs (full and EMB) for the TX stream dst_lc = self.STATUS[_slot]['RX_LC'][0:3] + _target['TGID'] + _rf_src _target_status[_target['TS']]['TX_H_LC'] = bptc.encode_header_lc(dst_lc) From 2c335f375ea11f820113a0d8a650e85ba579a1fc Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 16:45:04 +0100 Subject: [PATCH 10/80] dfkjdk --- bridge_master.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bridge_master.py b/bridge_master.py index 41ecc7b..1d9b114 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -2054,8 +2054,8 @@ class routerHBP(HBSYSTEM): _target_status[_target['TS']]['TX_STREAM_ID'] = _stream_id _target_status[_target['TS']]['TX_RFS'] = _rf_src _target_status[_target['TS']]['TX_PEER'] = _peer_id - _target_status[_target]['TS']['source_server'] = _source_server - _target_status[_target]['TS']['source_rptr'] = _source_rptr + _target_status[_target]['TS']]['source_server'] = _source_server + _target_status[_target]['TS']]['source_rptr'] = _source_rptr # Generate LCs (full and EMB) for the TX stream dst_lc = self.STATUS[_slot]['RX_LC'][0:3] + _target['TGID'] + _rf_src _target_status[_target['TS']]['TX_H_LC'] = bptc.encode_header_lc(dst_lc) From 07ea81647296e3b0ea8297cafcb42082f47af7e5 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 16:46:53 +0100 Subject: [PATCH 11/80] dvlkjdk --- bridge_master.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bridge_master.py b/bridge_master.py index 1d9b114..7a6c125 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -2054,8 +2054,8 @@ class routerHBP(HBSYSTEM): _target_status[_target['TS']]['TX_STREAM_ID'] = _stream_id _target_status[_target['TS']]['TX_RFS'] = _rf_src _target_status[_target['TS']]['TX_PEER'] = _peer_id - _target_status[_target]['TS']]['source_server'] = _source_server - _target_status[_target]['TS']]['source_rptr'] = _source_rptr + _target_status[_target['TS']]['source_server'] = _source_server + _target_status[_target['TS']]['source_rptr'] = _source_rptr # Generate LCs (full and EMB) for the TX stream dst_lc = self.STATUS[_slot]['RX_LC'][0:3] + _target['TGID'] + _rf_src _target_status[_target['TS']]['TX_H_LC'] = bptc.encode_header_lc(dst_lc) From 7656ebec9a7b22de795359539a49581b78c35ee4 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 16:48:23 +0100 Subject: [PATCH 12/80] dura --- bridge_master.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridge_master.py b/bridge_master.py index 7a6c125..3b05351 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -2064,7 +2064,7 @@ class routerHBP(HBSYSTEM): logger.debug('(%s) Generating TX FULL and EMB LCs for HomeBrew destination: System: %s, TS: %s, TGID: %s', self._system, _target['SYSTEM'], _target['TS'], int_id(_target['TGID'])) logger.debug('(%s) Conference Bridge: %s, Call Bridged to HBP System: %s TS: %s, TGID: %s', self._system, _bridge, _target['SYSTEM'], _target['TS'], int_id(_target['TGID'])) if CONFIG['REPORTS']['REPORT']: - systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,START,TX,{},{},{},{},{},{},{:.2f},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']), call_duration,int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,START,TX,{},{},{},{},{},{:.2f},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']),,int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) # Set other values for the contention handler to test next time there is a frame to forward _target_status[_target['TS']]['TX_TIME'] = pkt_time From 73c326aaa03e37d4f3abff01c3f41922f7ed3800 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 16:49:22 +0100 Subject: [PATCH 13/80] dflkdl --- bridge_master.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridge_master.py b/bridge_master.py index 3b05351..4243d8c 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -2064,7 +2064,7 @@ class routerHBP(HBSYSTEM): logger.debug('(%s) Generating TX FULL and EMB LCs for HomeBrew destination: System: %s, TS: %s, TGID: %s', self._system, _target['SYSTEM'], _target['TS'], int_id(_target['TGID'])) logger.debug('(%s) Conference Bridge: %s, Call Bridged to HBP System: %s TS: %s, TGID: %s', self._system, _bridge, _target['SYSTEM'], _target['TS'], int_id(_target['TGID'])) if CONFIG['REPORTS']['REPORT']: - systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,START,TX,{},{},{},{},{},{:.2f},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']),,int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,START,TX,{},{},{},{},{},{:.2f},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']),int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) # Set other values for the contention handler to test next time there is a frame to forward _target_status[_target['TS']]['TX_TIME'] = pkt_time From 667d8c07da50d497d4046963e743da25d9d84c1d Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 16:54:05 +0100 Subject: [PATCH 14/80] dckjdsfk --- bridge_master.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bridge_master.py b/bridge_master.py index 4243d8c..c6c8a08 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -2679,7 +2679,8 @@ class routerHBP(HBSYSTEM): logger.info('(%s) *CALL END* STREAM ID: %s SUB: %s (%s) PEER: %s (%s) TGID %s (%s), TS %s, Duration: %.2f, Packet rate: %.2f/s, LOSS: %.2f%%', \ self._system, int_id(_stream_id), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot, call_duration, packet_rate, loss) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']), call_duration,int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + self._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), call_duration,int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + #Reset back to False From e111a3e1e735949aee6157b32fbf745c82a0d37e Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 17:00:06 +0100 Subject: [PATCH 15/80] more consistency --- bridge_master.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/bridge_master.py b/bridge_master.py index c6c8a08..c8bc149 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -550,7 +550,9 @@ def sendVoicePacket(self,pkt,_source_id,_dest_id,_slot): 'CONTENTION':False, 'RFS': _source_id, 'TGID': _dest_id, - 'LAST': _pkt_time + 'LAST': _pkt_time, + 'source_server': False, + 'source_rptr': False } _slot['TX_TGID'] = _dest_id else: @@ -1547,8 +1549,8 @@ class routerOBP(OPENBRIDGE): 'RX_PEER': _peer_id, 'packets': 0, 'crcs': set(), - '_source_server' : _source_server, - '_source_rptr' : _source_rptr + 'source_server' : _source_server, + 'source_rptr' : _source_rptr } @@ -1696,8 +1698,8 @@ class routerOBP(OPENBRIDGE): 'packets': 0, 'loss': 0, 'crcs': set(), - '_source_server' : _source_server, - '_source_rptr' : _source_rptr + 'source_server' : _source_server, + 'source_rptr' : _source_rptr } @@ -1978,8 +1980,8 @@ class routerHBP(HBSYSTEM): 'RFS': _rf_src, 'TGID': _dst_id, 'RX_PEER': _peer_id, - '_source_server' : _source_server, - '_source_rptr' : _source_rptr + 'source_server' : _source_server, + 'source_rptr' : _source_rptr } # Generate LCs (full and EMB) for the TX stream dst_lc = b''.join([self.STATUS[_slot]['RX_LC'][0:3], _target['TGID'], _rf_src]) @@ -2139,8 +2141,8 @@ class routerHBP(HBSYSTEM): 'RFS': _rf_src, 'TGID': _dst_id, 'RX_PEER': _peer_id, - '_source_server' : _source_server, - '_source_rptr' : _source_rptr + 'source_server' : _source_server, + 'source_rptr' : _source_rptr } # Record the time of this packet so we can later identify a stale stream From 993a644208787cace392aeff6f32a884fe018e5e Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 17:05:49 +0100 Subject: [PATCH 16/80] flkjfl --- bridge_master.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bridge_master.py b/bridge_master.py index c8bc149..8afc970 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -461,7 +461,8 @@ def stream_trimmer_loop(): logger.debug('(%s) *TIME OUT* TX STREAM ID: %s SUB: %s TGID %s, TS %s, Duration: %.2f', \ system, int_id(_slot['TX_STREAM_ID']), int_id(_slot['TX_RFS']), int_id(_slot['TX_TGID']), slot, _slot['TX_TIME'] - _slot['TX_START']) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), call_duration,int_id(_slot['source_server']),int_id(_slot['source_rptr'])).encode(encoding='utf-8', errors='ignore')) + systems[system]._report.send_bridgeEvent('GROUP VOICE,END,TX,{},{},{},{},{},{},{:.2f},{},{}'.format(system, int_id(_slot['TX_STREAM_ID']), int_id(_slot['TX_PEER']), int_id(_slot['TX_RFS']), slot, int_id(_slot['TX_TGID']), _slot['TX_TIME'] - _slot['TX_START'],int_id(_slot['source_serv er']),int_id(_slot['source_rptr'])).encode(encoding='utf-8', errors='ignore')) + # OBP systems # We can't delete items from a dicationry that's being iterated, so we have to make a temporarly list of entrys to remove later From e499a1e8d90bbe50810ea9b6ffd8725437fbf9bc Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 17:21:21 +0100 Subject: [PATCH 17/80] dur --- bridge_master.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridge_master.py b/bridge_master.py index 8afc970..e7e7234 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -2161,7 +2161,7 @@ class routerHBP(HBSYSTEM): systems[_target].send_system(_tmp_data,b'',_ber,_rssi,_source_server,_source_rptr) logger.debug('(%s) UNIT Data Bridged to OBP System: %s DST_ID: %s', self._system, _target,_int_dst_id) if CONFIG['REPORTS']['REPORT']: - systems[system]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{},{},{},{},{},{},{:.2f},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']), call_duration,int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + systems[system]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{},{},{},{},{},{},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']),int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) def dmrd_received(self, _peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data): From 9d1a86ad323b652b4c1353be7f7a3b3fe174a669 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 17:29:16 +0100 Subject: [PATCH 18/80] dkfjdk --- bridge_master.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridge_master.py b/bridge_master.py index e7e7234..45274c3 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -2161,7 +2161,7 @@ class routerHBP(HBSYSTEM): systems[_target].send_system(_tmp_data,b'',_ber,_rssi,_source_server,_source_rptr) logger.debug('(%s) UNIT Data Bridged to OBP System: %s DST_ID: %s', self._system, _target,_int_dst_id) if CONFIG['REPORTS']['REPORT']: - systems[system]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{},{},{},{},{},{},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']),int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + systems[system]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{},{},{},{},{},{},{},{}'.format(_target, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), 1, _int_dst_id, int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) def dmrd_received(self, _peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data): From ee4aaa6881ce373007c5cfd4f75e1bba3fcda6e5 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 17:32:41 +0100 Subject: [PATCH 19/80] dskll --- bridge_master.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bridge_master.py b/bridge_master.py index 45274c3..f131602 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -2119,7 +2119,8 @@ class routerHBP(HBSYSTEM): systems[_d_system].send_system(_tmp_data,None) logger.debug('(%s) UNIT Data Bridged to HBP on slot 1: %s DST_ID: %s',self._system,_d_system,_int_dst_id) if CONFIG['REPORTS']['REPORT']: - systems[_d_system]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{},{},{},{},{},{},{:.2f},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']), call_duration,int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + systems[_d_system]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{},{},{},{},{},{},{},{}'.format(_d_system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src),1, _int_dst_id,int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + def sendDataToOBP(self,_target,_data,dmrpkt,pkt_time,_stream_id,_dst_id,_peer_id,_rf_src,_bits,_slot,_hops = b'',_ber = b'\x00', _rssi = b'\x00',_source_server = b'\x00\x00\x00\x00', _source_rptr = b'\x00\x00\x00\x00'): # _sysIgnore = sysIgnore From ba66e2ac47f3e1fd7d646fdd673aee3f39114520 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 17:37:09 +0100 Subject: [PATCH 20/80] dlklk --- bridge_master.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bridge_master.py b/bridge_master.py index f131602..e99e7e4 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -552,8 +552,8 @@ def sendVoicePacket(self,pkt,_source_id,_dest_id,_slot): 'RFS': _source_id, 'TGID': _dest_id, 'LAST': _pkt_time, - 'source_server': False, - 'source_rptr': False + 'source_server': self._CONFIG['GLOBAL']['SERVER_ID'] + 'source_rptr': int_id(5000) } _slot['TX_TGID'] = _dest_id else: @@ -2113,6 +2113,8 @@ class routerHBP(HBSYSTEM): def sendDataToHBP(self,_d_system,_d_slot,_dst_id,_tmp_bits,_data,dmrpkt,_rf_src,_stream_id,_peer_id): #Assemble transmit HBP packet header + _source_server = self._CONFIG['GLOBAL']['SERVER_ID'] + _source_rptr = _peer_id _int_dst_id = int_id(_dst_id) _tmp_data = b''.join([_data[:15], _tmp_bits.to_bytes(1, 'big'), _data[16:20]]) _tmp_data = b''.join([_tmp_data, dmrpkt]) From 46483a8a3a54922cd6e6864ddeec317283327385 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 17:38:13 +0100 Subject: [PATCH 21/80] dfkjk --- bridge_master.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridge_master.py b/bridge_master.py index e99e7e4..e0cc8e0 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -552,7 +552,7 @@ def sendVoicePacket(self,pkt,_source_id,_dest_id,_slot): 'RFS': _source_id, 'TGID': _dest_id, 'LAST': _pkt_time, - 'source_server': self._CONFIG['GLOBAL']['SERVER_ID'] + 'source_server': self._CONFIG['GLOBAL']['SERVER_ID'], 'source_rptr': int_id(5000) } _slot['TX_TGID'] = _dest_id From 8059ec0889e8eabe246d9d179a856eb72e8e3ffe Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 17:56:39 +0100 Subject: [PATCH 22/80] force build --- a | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 a diff --git a/a b/a new file mode 100644 index 0000000..e69de29 From d1d0b6a8f1e5c086961f3665a93ae7955bb9d8c4 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 18:10:37 +0100 Subject: [PATCH 23/80] boom --- a | 1 + 1 file changed, 1 insertion(+) diff --git a/a b/a index e69de29..7ee581f 100644 --- a/a +++ b/a @@ -0,0 +1 @@ +kdlskdlsk From 3bf86a8577d98194744bdafa488afa3037fd4128 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 18:12:55 +0100 Subject: [PATCH 24/80] d --- .gitlab-ci.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b9c1a77..d730c82 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -31,6 +31,21 @@ build-dev: # This job runs in the build stage, which runs first. only: - master +build-extrastats: # This job runs in the build stage, which runs first. + stage: build + tags: + - buildx + script: + - echo "Compiling the code..." + - cd docker-configs + - docker buildx build --no-cache -f Dockerfile-proxy -t hacknix/freedmr:development-latest -t gitlab.hacknix.net:5050/hacknix/freedmr-extrastats:development-latest --platform linux/arm/v7,linux/amd64,linux/i386,linux/arm64 --push . + + + + - echo "Compile complete." + only: + - extrastats + build-release: # This job runs in the build stage, which runs first. stage: build tags: From b14fa1fb615599e270ce784e0d5301ca8a5486d4 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 18:14:59 +0100 Subject: [PATCH 25/80] d --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d730c82..6528581 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -38,7 +38,7 @@ build-extrastats: # This job runs in the build stage, which runs first. script: - echo "Compiling the code..." - cd docker-configs - - docker buildx build --no-cache -f Dockerfile-proxy -t hacknix/freedmr:development-latest -t gitlab.hacknix.net:5050/hacknix/freedmr-extrastats:development-latest --platform linux/arm/v7,linux/amd64,linux/i386,linux/arm64 --push . + - docker buildx build --no-cache -f Dockerfile-proxy -t hacknix/freedmr-extrastats:development-latest -t gitlab.hacknix.net:5050/hacknix/freedmr-extrastats:development-latest --platform linux/arm64 --push . From b072f89bdb919c6e52979ee263177f6cc9d23e15 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 18:18:51 +0100 Subject: [PATCH 26/80] Update SQL loader --- report_sql.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/report_sql.py b/report_sql.py index 92ccf99..f3cd950 100644 --- a/report_sql.py +++ b/report_sql.py @@ -68,10 +68,12 @@ class reportClient(NetstringReceiver): 'subid' : datalist[6], 'slot' : datalist[7], 'dstid' : datalist[8], - 'duration' : 0 + 'duration' : 0, + 'source_server': 0, + 'source_rptr': 0 } - if len(datalist) > 9: + if len(datalist) > 11: event['duration'] = datalist[9] @@ -86,10 +88,10 @@ class reportClient(NetstringReceiver): except mysql.connector.Error as err: print('(MYSQL) error on reconnect: {}'.format(err)) - print("{} {} {} {} {} {} {} {} {}".format(event['type'],event['event'], event['trx'],event['system'],event['streamid'],event['peerid'],event['subid'],event['slot'],event['dstid'],event['duration'])) + print("{} {} {} {} {} {} {} {} {} {} {}".format(event['type'],event['event'], event['trx'],event['system'],event['streamid'],event['peerid'],event['subid'],event['slot'],event['dstid'],event['duration'], event['source_server'],event['source_rptr'])) _cursor = self.db.cursor() try: - _cursor.execute("insert into feed values (NULL,'{}','{}','{}','{}','{}','{}','{}','{}','{}','{}')".format(event['type'],event['event'], event['trx'],event['system'],event['streamid'],event['peerid'],event['subid'],event['slot'],event['dstid'],event['duration'])) + _cursor.execute("insert into feed values (NULL,'{}','{}','{}','{}','{}','{}','{}','{}','{}','{},{},{}')".format(event['type'],event['event'], event['trx'],event['system'],event['streamid'],event['peerid'],event['subid'],event['slot'],event['dstid'],event['duration'],event['source_server'],event['source_rptr'])) self.db.commit() except mysql.connector.Error as err: _cursor.close() From 62bc2708ebe441c8b930cd0dae12a5ffd6f37b98 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 18:26:19 +0100 Subject: [PATCH 27/80] ex --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6528581..20ef2be 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -38,7 +38,7 @@ build-extrastats: # This job runs in the build stage, which runs first. script: - echo "Compiling the code..." - cd docker-configs - - docker buildx build --no-cache -f Dockerfile-proxy -t hacknix/freedmr-extrastats:development-latest -t gitlab.hacknix.net:5050/hacknix/freedmr-extrastats:development-latest --platform linux/arm64 --push . + - docker buildx build --no-cache -f Dockerfile-proxy -t hacknix/freedmr:extrastats-development-latest -t gitlab.hacknix.net:5050/hacknix/freedmr:extrastats-development-latest --platform linux/arm64 --push . From 9a1b9f42bf7bffa89080daa7b534d269b4919141 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 20:06:22 +0100 Subject: [PATCH 28/80] Fix column count --- report_sql.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/report_sql.py b/report_sql.py index f3cd950..48fe42d 100644 --- a/report_sql.py +++ b/report_sql.py @@ -91,7 +91,7 @@ class reportClient(NetstringReceiver): print("{} {} {} {} {} {} {} {} {} {} {}".format(event['type'],event['event'], event['trx'],event['system'],event['streamid'],event['peerid'],event['subid'],event['slot'],event['dstid'],event['duration'], event['source_server'],event['source_rptr'])) _cursor = self.db.cursor() try: - _cursor.execute("insert into feed values (NULL,'{}','{}','{}','{}','{}','{}','{}','{}','{}','{},{},{}')".format(event['type'],event['event'], event['trx'],event['system'],event['streamid'],event['peerid'],event['subid'],event['slot'],event['dstid'],event['duration'],event['source_server'],event['source_rptr'])) + _cursor.execute("insert into feed values (NULL,'{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{},{}')".format(event['type'],event['event'], event['trx'],event['system'],event['streamid'],event['peerid'],event['subid'],event['slot'],event['dstid'],event['duration'],event['source_server'],event['source_rptr'])) self.db.commit() except mysql.connector.Error as err: _cursor.close() From 7a06282cad8cc0f0d0ca7d8446f3d00e66b37e5e Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 20:08:01 +0100 Subject: [PATCH 29/80] shitsu --- report_sql.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/report_sql.py b/report_sql.py index 48fe42d..e41ea40 100644 --- a/report_sql.py +++ b/report_sql.py @@ -88,10 +88,10 @@ class reportClient(NetstringReceiver): except mysql.connector.Error as err: print('(MYSQL) error on reconnect: {}'.format(err)) - print("{} {} {} {} {} {} {} {} {} {} {}".format(event['type'],event['event'], event['trx'],event['system'],event['streamid'],event['peerid'],event['subid'],event['slot'],event['dstid'],event['duration'], event['source_server'],event['source_rptr'])) + print("{} {} {} {} {} {} {} {} {} {} {} {}".format(event['type'],event['event'], event['trx'],event['system'],event['streamid'],event['peerid'],event['subid'],event['slot'],event['dstid'],event['duration'], event['source_server'],event['source_rptr'])) _cursor = self.db.cursor() try: - _cursor.execute("insert into feed values (NULL,'{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{},{}')".format(event['type'],event['event'], event['trx'],event['system'],event['streamid'],event['peerid'],event['subid'],event['slot'],event['dstid'],event['duration'],event['source_server'],event['source_rptr'])) + _cursor.execute("insert into feed values (NULL,'{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}')".format(event['type'],event['event'], event['trx'],event['system'],event['streamid'],event['peerid'],event['subid'],event['slot'],event['dstid'],event['duration'],event['source_server'],event['source_rptr'])) self.db.commit() except mysql.connector.Error as err: _cursor.close() From 41a71f5bd8fb1fb8ebb99de8992f352193b9e58b Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 20:09:55 +0100 Subject: [PATCH 30/80] dfr --- report_sql.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/report_sql.py b/report_sql.py index e41ea40..4c055a5 100644 --- a/report_sql.py +++ b/report_sql.py @@ -88,10 +88,10 @@ class reportClient(NetstringReceiver): except mysql.connector.Error as err: print('(MYSQL) error on reconnect: {}'.format(err)) - print("{} {} {} {} {} {} {} {} {} {} {} {}".format(event['type'],event['event'], event['trx'],event['system'],event['streamid'],event['peerid'],event['subid'],event['slot'],event['dstid'],event['duration'], event['source_server'],event['source_rptr'])) + print("{} {} {} {} {} {} {} {} {} {} {} {} {}".format(event['type'],event['event'], event['trx'],event['system'],event['streamid'],event['peerid'],event['subid'],event['slot'],event['dstid'],event['duration'], event['source_server'],event['source_rptr'])) _cursor = self.db.cursor() try: - _cursor.execute("insert into feed values (NULL,'{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}')".format(event['type'],event['event'], event['trx'],event['system'],event['streamid'],event['peerid'],event['subid'],event['slot'],event['dstid'],event['duration'],event['source_server'],event['source_rptr'])) + _cursor.execute("insert into feed values (NULL,'{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}')".format(event['type'],event['event'], event['trx'],event['system'],event['streamid'],event['peerid'],event['subid'],event['slot'],event['dstid'],event['duration'],event['source_server'],event['source_rptr'])) self.db.commit() except mysql.connector.Error as err: _cursor.close() From 418cfdee7c89ea4dd99b10cad5f8df9bf857ec6c Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 22:24:28 +0100 Subject: [PATCH 31/80] xklkf --- a | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/a b/a index 7ee581f..0552f10 100644 --- a/a +++ b/a @@ -1 +1 @@ -kdlskdlsk +kdlskdlssdklkdk From 938944c6181b137c9585b215eab73903a99c778c Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 22:53:37 +0100 Subject: [PATCH 32/80] boom --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 20ef2be..eb4dbb3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -38,7 +38,7 @@ build-extrastats: # This job runs in the build stage, which runs first. script: - echo "Compiling the code..." - cd docker-configs - - docker buildx build --no-cache -f Dockerfile-proxy -t hacknix/freedmr:extrastats-development-latest -t gitlab.hacknix.net:5050/hacknix/freedmr:extrastats-development-latest --platform linux/arm64 --push . + - docker buildx build --no-cache -f Dockerfile-proxy -t hacknix/freedmr:extrastats-development-latest -t gitlab.hacknix.net:5050/hacknix/freedmr:extrastats-development-latest --platform linux/amd64 --push . From 5195869c46bc1e98f047393b163f296606d31459 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 23:29:56 +0100 Subject: [PATCH 33/80] XCheck out the right branch ! --- docker-configs/Dockerfile-proxy | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-configs/Dockerfile-proxy b/docker-configs/Dockerfile-proxy index 898029a..30ecca2 100644 --- a/docker-configs/Dockerfile-proxy +++ b/docker-configs/Dockerfile-proxy @@ -25,6 +25,7 @@ RUN adduser -D -u 54000 radio && \ cd /opt && \ git clone https://gitlab.hacknix.net/hacknix/FreeDMR.git freedmr && \ cd /opt/freedmr && \ + git checkout extrastats && \ pip install --no-cache-dir -r requirements.txt && \ apk del git gcc musl-dev && \ chown -R radio: /opt/freedmr From f6a0b57a071a57a0853899e1191e18fad690b1d0 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 23:43:51 +0100 Subject: [PATCH 34/80] reporty --- report_sql.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/report_sql.py b/report_sql.py index 4c055a5..6fe3435 100644 --- a/report_sql.py +++ b/report_sql.py @@ -69,8 +69,8 @@ class reportClient(NetstringReceiver): 'slot' : datalist[7], 'dstid' : datalist[8], 'duration' : 0, - 'source_server': 0, - 'source_rptr': 0 + 'source_server': datalist[-2], + 'source_rptr': datalist[-1] } if len(datalist) > 11: @@ -88,7 +88,7 @@ class reportClient(NetstringReceiver): except mysql.connector.Error as err: print('(MYSQL) error on reconnect: {}'.format(err)) - print("{} {} {} {} {} {} {} {} {} {} {} {} {}".format(event['type'],event['event'], event['trx'],event['system'],event['streamid'],event['peerid'],event['subid'],event['slot'],event['dstid'],event['duration'], event['source_server'],event['source_rptr'])) + print("{} {} {} {} {} {} {} {} {} {} {} {}".format(event['type'],event['event'], event['trx'],event['system'],event['streamid'],event['peerid'],event['subid'],event['slot'],event['dstid'],event['duration'], event['source_server'],event['source_rptr'])) _cursor = self.db.cursor() try: _cursor.execute("insert into feed values (NULL,'{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}')".format(event['type'],event['event'], event['trx'],event['system'],event['streamid'],event['peerid'],event['subid'],event['slot'],event['dstid'],event['duration'],event['source_server'],event['source_rptr'])) From 57b41251825f28f6e96a890ae62897437d86b362 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 May 2022 23:44:04 +0100 Subject: [PATCH 35/80] remove a --- a | 1 - 1 file changed, 1 deletion(-) delete mode 100644 a diff --git a/a b/a deleted file mode 100644 index 0552f10..0000000 --- a/a +++ /dev/null @@ -1 +0,0 @@ -kdlskdlssdklkdk From ded78fc6375e826fa861e606c60bf3b9d858975f Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 1 Sep 2022 18:25:16 +0100 Subject: [PATCH 36/80] Revert "don't allow setting a static on TS2 if it's already set on TS1" This reverts commit 4404fc797a432c29ae08640706039692cf4dc09d. --- bridge_master.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bridge_master.py b/bridge_master.py index 976a293..c7a3d6b 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -935,8 +935,8 @@ def options_config(): if CONFIG['SYSTEMS'][_system]['TS2_STATIC']: ts2 = CONFIG['SYSTEMS'][_system]['TS2_STATIC'].split(',') for tg in ts2: - if not tg or int(tg) == 0 or int(tg) >= 16777215 or tg == _options['DEFAULT_REFLECTOR'] or (tg and ts1 and tg in ts1): - logger.debug('(OPTIONS) %s not setting TS2 Static %s. Bad TG or conflict with DIAL or TS1',_system,tg) + if not tg or int(tg) == 0 or int(tg) >= 16777215 or tg == _options['DEFAULT_REFLECTOR']: + logger.debug('(OPTIONS) %s not setting TS2 Static %s. Bad TG or conflict DIAL',_system,tg) continue tg = int(tg) reset_static_tg(tg,2,_tmout,_system) From c9e94903595a25750308084d6b8961c7f570edda Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 1 Sep 2022 18:25:56 +0100 Subject: [PATCH 37/80] Revert "_" This reverts commit e836254c0db24110832c93cf06e846042322835f. --- bridge_master.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bridge_master.py b/bridge_master.py index c7a3d6b..dafa3de 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -923,7 +923,7 @@ def options_config(): if _options['TS1_STATIC']: ts1 = _options['TS1_STATIC'].split(',') for tg in ts1: - if not tg or int(tg) == 0 or int(tg) >= 16777215 or tg == _options['DEFAULT_REFLECTOR']: + if not tg or int(tg) == 0 or int(tg) >= 16777215 or tg == _options['_DEFAULT_REFLECTOR']: logger.debug('(OPTIONS) %s not setting TS1 Static %s. Bad TG or conflict with DIAL',_system,tg) continue tg = int(tg) @@ -935,7 +935,7 @@ def options_config(): if CONFIG['SYSTEMS'][_system]['TS2_STATIC']: ts2 = CONFIG['SYSTEMS'][_system]['TS2_STATIC'].split(',') for tg in ts2: - if not tg or int(tg) == 0 or int(tg) >= 16777215 or tg == _options['DEFAULT_REFLECTOR']: + if not tg or int(tg) == 0 or int(tg) >= 16777215 or tg == _options['_DEFAULT_REFLECTOR']: logger.debug('(OPTIONS) %s not setting TS2 Static %s. Bad TG or conflict DIAL',_system,tg) continue tg = int(tg) From 96d77ca68d5489b7d88236482f957c9db4bb6f2a Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 1 Sep 2022 18:25:59 +0100 Subject: [PATCH 38/80] Revert "Don't add an options static if it's default for DIAL" This reverts commit 43a04755def0ac29cea88e6d23bc3a5bbc582010. --- bridge_master.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/bridge_master.py b/bridge_master.py index dafa3de..eb8899a 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -923,8 +923,7 @@ def options_config(): if _options['TS1_STATIC']: ts1 = _options['TS1_STATIC'].split(',') for tg in ts1: - if not tg or int(tg) == 0 or int(tg) >= 16777215 or tg == _options['_DEFAULT_REFLECTOR']: - logger.debug('(OPTIONS) %s not setting TS1 Static %s. Bad TG or conflict with DIAL',_system,tg) + if not tg: continue tg = int(tg) make_static_tg(tg,1,_tmout,_system) @@ -935,8 +934,7 @@ def options_config(): if CONFIG['SYSTEMS'][_system]['TS2_STATIC']: ts2 = CONFIG['SYSTEMS'][_system]['TS2_STATIC'].split(',') for tg in ts2: - if not tg or int(tg) == 0 or int(tg) >= 16777215 or tg == _options['_DEFAULT_REFLECTOR']: - logger.debug('(OPTIONS) %s not setting TS2 Static %s. Bad TG or conflict DIAL',_system,tg) + if not tg or int(tg) == 0 or int(tg) >= 16777215: continue tg = int(tg) reset_static_tg(tg,2,_tmout,_system) From 267a7f41f625d163360cf5c5ec135e1ee4cf840a Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 4 Sep 2022 00:49:14 +0100 Subject: [PATCH 39/80] Stop wrong server ID message from spamming the logs --- hblink.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/hblink.py b/hblink.py index 2c0dd21..c57526d 100755 --- a/hblink.py +++ b/hblink.py @@ -287,7 +287,9 @@ class OPENBRIDGE(DatagramProtocol): if compare_digest(_hash, _ckhs) and (_sockaddr == self._config['TARGET_SOCK'] or self._config['RELAX_CHECKS']): _peer_id = _data[11:15] if self._config['NETWORK_ID'] != _peer_id: - logger.error('(%s) OpenBridge packet discarded because NETWORK_ID: %s Does not match sent Peer ID: %s', self._system, int_id(self._config['NETWORK_ID']), int_id(_peer_id)) + f _stream_id not in self._laststrid: + logger.error('(%s) OpenBridge packet discarded because NETWORK_ID: %s Does not match sent Peer ID: %s', self._system, int_id(self._config['NETWORK_ID']), int_id(_peer_id)) + self._laststrid.append(_stream_id) return #This is a v1 packet, so all the extended stuff we can set to default From 2f322c7fe76040224c0bd95e11686c13348b2f81 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 4 Sep 2022 01:18:47 +0100 Subject: [PATCH 40/80] typoy --- hblink.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hblink.py b/hblink.py index c57526d..dfa41a4 100755 --- a/hblink.py +++ b/hblink.py @@ -287,7 +287,7 @@ class OPENBRIDGE(DatagramProtocol): if compare_digest(_hash, _ckhs) and (_sockaddr == self._config['TARGET_SOCK'] or self._config['RELAX_CHECKS']): _peer_id = _data[11:15] if self._config['NETWORK_ID'] != _peer_id: - f _stream_id not in self._laststrid: + if _stream_id not in self._laststrid: logger.error('(%s) OpenBridge packet discarded because NETWORK_ID: %s Does not match sent Peer ID: %s', self._system, int_id(self._config['NETWORK_ID']), int_id(_peer_id)) self._laststrid.append(_stream_id) return From f2494aec619d098adf80300b94cbbed569aa26cb Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 4 Sep 2022 01:35:31 +0100 Subject: [PATCH 41/80] For all proto --- hblink.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/hblink.py b/hblink.py index dfa41a4..9fb887a 100755 --- a/hblink.py +++ b/hblink.py @@ -418,7 +418,9 @@ class OPENBRIDGE(DatagramProtocol): if compare_digest(_hash, _ckhs) and (_sockaddr == self._config['TARGET_SOCK'] or self._config['RELAX_CHECKS']): _peer_id = _data[11:15] if self._config['NETWORK_ID'] != _peer_id: - logger.error('(%s) OpenBridge packet discarded because NETWORK_ID: %s Does not match sent Peer ID: %s', self._system, int_id(self._config['NETWORK_ID']), int_id(_peer_id)) + if _stream_id not in self._laststrid: + logger.error('(%s) OpenBridge packet discarded because NETWORK_ID: %s Does not match sent Peer ID: %s', self._system, int_id(self._config['NETWORK_ID']), int_id(_peer_id)) + self._laststrid.append(_stream_id) return _seq = _data[4] _rf_src = _data[5:8] @@ -550,7 +552,9 @@ class OPENBRIDGE(DatagramProtocol): if compare_digest(_hash, _ckhs) and (_sockaddr == self._config['TARGET_SOCK'] or self._config['RELAX_CHECKS']): _peer_id = _data[11:15] if self._config['NETWORK_ID'] != _peer_id: - logger.error('(%s) OpenBridge packet discarded because NETWORK_ID: %s Does not match sent Peer ID: %s', self._system, int_id(self._config['NETWORK_ID']), int_id(_peer_id)) + if _stream_id not in self._laststrid: + logger.error('(%s) OpenBridge packet discarded because NETWORK_ID: %s Does not match sent Peer ID: %s', self._system, int_id(self._config['NETWORK_ID']), int_id(_peer_id)) + self._laststrid.append(_stream_id) return _seq = _data[4] _rf_src = _data[5:8] From 1e26e46e4bda788ae463720cd5495db6062b3c56 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 4 Sep 2022 01:52:46 +0100 Subject: [PATCH 42/80] Move stream ID further up --- hblink.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hblink.py b/hblink.py index 9fb887a..de5b253 100755 --- a/hblink.py +++ b/hblink.py @@ -414,6 +414,8 @@ class OPENBRIDGE(DatagramProtocol): _h.update(_packet[:69]) _ckhs = _h.digest() + + _stream_id = _data[16:20] if compare_digest(_hash, _ckhs) and (_sockaddr == self._config['TARGET_SOCK'] or self._config['RELAX_CHECKS']): _peer_id = _data[11:15] @@ -437,7 +439,6 @@ class OPENBRIDGE(DatagramProtocol): _call_type = 'group' _frame_type = (_bits & 0x30) >> 4 _dtype_vseq = (_bits & 0xF) # data, 1=voice header, 2=voice terminator; voice, 0=burst A ... 5=burst F - _stream_id = _data[16:20] #logger.debug('(%s) DMRD - Seqence: %s, RF Source: %s, Destination ID: %s', self._system, int_id(_seq), int_id(_rf_src), int_id(_dst_id)) #Don't do anything if we are STUNned From 319d43f4470f8b26208b5e5470eebba5e98c348a Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 4 Sep 2022 12:09:37 +0100 Subject: [PATCH 43/80] amd64 not arm64 --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6ef8f26..d8046ba 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -38,7 +38,7 @@ build-extrastats: # This job runs in the build stage, which runs first. script: - echo "Compiling the code..." - cd docker-configs - - docker buildx build --no-cache -f Dockerfile-proxy -t hacknix/freedmr:extrastats-development-latest -t gitlab.hacknix.net:5050/hacknix/freedmr:extrastats-development-latest --platform linux/arm64 --push . + - docker buildx build --no-cache -f Dockerfile-proxy -t hacknix/freedmr:extrastats-development-latest -t gitlab.hacknix.net:5050/hacknix/freedmr:extrastats-development-latest --platform linux/amd64 --push . From 20cae952863cb40bd9d310c8c4a50cddeb95e0ac Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 10 Sep 2022 20:56:57 +0100 Subject: [PATCH 44/80] fix bug in setting different port from environment variable --- hotspot_proxy_v2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hotspot_proxy_v2.py b/hotspot_proxy_v2.py index d1e1efb..35bb2ee 100644 --- a/hotspot_proxy_v2.py +++ b/hotspot_proxy_v2.py @@ -312,7 +312,7 @@ if __name__ == '__main__': if 'FDPROXY_CLIENTINFO' in os.environ: ClientInfo = bool(os.environ['FDPROXY_CLIENTINFO']) if 'FDPROXY_LISTENPORT' in os.environ: - ListenPort = os.environ['FDPROXY_LISTENPORT'] + ListenPort = int(os.environ['FDPROXY_LISTENPORT']) for port in range(DestportStart,DestPortEnd+1,1): CONNTRACK[port] = False From 081101267645d221da1cc2b288db7e36ad3bbef9 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 10 Sep 2022 20:58:49 +0100 Subject: [PATCH 45/80] fix bug in port from enviornment variable --- hotspot_proxy_v2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hotspot_proxy_v2.py b/hotspot_proxy_v2.py index d1e1efb..35bb2ee 100644 --- a/hotspot_proxy_v2.py +++ b/hotspot_proxy_v2.py @@ -312,7 +312,7 @@ if __name__ == '__main__': if 'FDPROXY_CLIENTINFO' in os.environ: ClientInfo = bool(os.environ['FDPROXY_CLIENTINFO']) if 'FDPROXY_LISTENPORT' in os.environ: - ListenPort = os.environ['FDPROXY_LISTENPORT'] + ListenPort = int(os.environ['FDPROXY_LISTENPORT']) for port in range(DestportStart,DestPortEnd+1,1): CONNTRACK[port] = False From 048e87d7d4afd709b38c94f29b77a85ef24d3b1e Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 11 Sep 2022 00:17:50 +0100 Subject: [PATCH 46/80] Update Docker and one-shot install --- docker-configs/docker-compose.yml | 5 +-- docker-configs/docker-compose_install.sh | 57 +++++++++++++++++------- 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/docker-configs/docker-compose.yml b/docker-configs/docker-compose.yml index c4c3738..6da1a22 100644 --- a/docker-configs/docker-compose.yml +++ b/docker-configs/docker-compose.yml @@ -24,7 +24,6 @@ services: mem_reservation: 600m volumes: - '/etc/freedmr/freedmr.cfg:/opt/freedmr/freedmr.cfg' - - '/var/log/freedmr/:/opt/freedmr/log/' - '/etc/freedmr/rules.py:/opt/freedmr/rules.py' #Write JSON files outside of container - '/etc/freedmr/json/:/opt/freedmr/json/' @@ -32,8 +31,8 @@ services: ports: - '62031:62031/udp' #Change the below to inlude ports used for your OBP(s) - - '62041:62041/udp' - image: 'hacknix/freedmr:latest' + #- '62041:62041/udp' + image: 'gitlab.hacknix.net:5050/hacknix/freedmr:development-latest' restart: "unless-stopped" networks: app_net: diff --git a/docker-configs/docker-compose_install.sh b/docker-configs/docker-compose_install.sh index f1a2bc1..a434306 100644 --- a/docker-configs/docker-compose_install.sh +++ b/docker-configs/docker-compose_install.sh @@ -21,9 +21,29 @@ echo FreeDMR Docker installer... echo Installing required packages... -apt-get -y install docker.io && +#apt-get -y install docker.io && +#apt-get -y install docker-compose && +#apt-get -y install conntrack && + +echo Install Docker Community Edition... +apt-get remove docker docker-engine docker.io && +apt-get -y update && +apt-get install \ + apt-transport-https \ + ca-certificates \ + curl \ + gnupg2 \ + software-properties-common && +curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - && +add-apt-repository \ + "deb [arch=amd64] https://download.docker.com/linux/debian \ + $(lsb_release -cs) \ + stable" && +apt-get -y update && +apt-get -y install docker-ce && + +echo Install Docker Compose... apt-get -y install docker-compose && -apt-get -y install conntrack && echo Set userland-proxy to false... echo '{ "userland-proxy": false}' > /etc/docker/daemon.json && @@ -54,6 +74,8 @@ GEN_STAT_BRIDGES: True ALLOW_NULL_PASSPHRASE: True ANNOUNCEMENT_LANGUAGES: SERVER_ID: 0 +DATA_GATEWAY: False +VALIDATE_SERVER_IDS: True [REPORTS] @@ -63,8 +85,8 @@ REPORT_PORT: 4321 REPORT_CLIENTS: * [LOGGER] -LOG_FILE: log/freedmr.log -LOG_HANDLERS: file-timed +LOG_FILE: /dev/null +LOG_HANDLERS: console-timed LOG_LEVEL: INFO LOG_NAME: FreeDMR @@ -75,20 +97,24 @@ PEER_FILE: peer_ids.json SUBSCRIBER_FILE: subscriber_ids.json TGID_FILE: talkgroup_ids.json PEER_URL: https://www.radioid.net/static/rptrs.json -SUBSCRIBER_URL: http://downloads.freedmr.uk/downloads/local_subscriber_ids.json -TGID_URL: TGID_URL: https://freedmr.cymru/talkgroups/talkgroup_ids_json.php +SUBSCRIBER_URL: https://www.radioid.net/static/users.json +TGID_URL: http://downloads.freedmr.uk/downloads/talkgroup_ids.json +LOCAL_SUBSCRIBER_FILE: local_subscriber_ids.json STALE_DAYS: 1 -LOCAL_SUBSCRIBER_FILE: local_subcriber_ids.json SUB_MAP_FILE: sub_map.pkl +SERVER_ID_URL: http://downloads.freedmr.uk/downloads/FreeDMR_Hosts.csv +SERVER_ID_FILE: server_ids.tsv +TOPO_FILE: topography.json -[MYSQL] -USE_MYSQL: False -USER: hblink -PASS: mypassword -DB: hblink -SERVER: 127.0.0.1 -PORT: 3306 -TABLE: repeaters + +#Control server shared allstar instance via dial / AMI +[ALLSTAR] +ENABLED: True +USER:admin +PASS: password +SERVER: asl.example.com +PORT: 5038 +NODE: 11111 [OBP-TEST] MODE: OPENBRIDGE @@ -132,6 +158,7 @@ ANNOUNCEMENT_LANGUAGE: en_GB GENERATOR: 100 ALLOW_UNREG_ID: False PROXY_CONTROL: True +OVERRIDE_IDENT_TG: [ECHO] MODE: PEER From 3c8000e79a2eb7c52ed93884fe03f809c15f8037 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 11 Sep 2022 00:29:46 +0100 Subject: [PATCH 47/80] cly --- docker-configs/docker-compose_install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-configs/docker-compose_install.sh b/docker-configs/docker-compose_install.sh index a434306..010a376 100644 --- a/docker-configs/docker-compose_install.sh +++ b/docker-configs/docker-compose_install.sh @@ -26,7 +26,7 @@ echo Installing required packages... #apt-get -y install conntrack && echo Install Docker Community Edition... -apt-get remove docker docker-engine docker.io && +#apt-get remove docker docker-engine docker.io && apt-get -y update && apt-get install \ apt-transport-https \ From 8614390f23855bb1e808994e2cf89b7999b4be74 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 11 Sep 2022 00:39:36 +0100 Subject: [PATCH 48/80] jfksjy# with '#' will be ignored, and an empty message aborts the commit. --- docker-configs/docker-compose_install.sh | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/docker-configs/docker-compose_install.sh b/docker-configs/docker-compose_install.sh index 010a376..996ff09 100644 --- a/docker-configs/docker-compose_install.sh +++ b/docker-configs/docker-compose_install.sh @@ -28,12 +28,7 @@ echo Installing required packages... echo Install Docker Community Edition... #apt-get remove docker docker-engine docker.io && apt-get -y update && -apt-get install \ - apt-transport-https \ - ca-certificates \ - curl \ - gnupg2 \ - software-properties-common && +apt-get -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common && curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - && add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/debian \ From 31484385911e7197817d3cc8082b601dd1973d08 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 11 Sep 2022 01:04:06 +0100 Subject: [PATCH 49/80] jkjy --- docker-configs/docker-compose_install.sh | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/docker-configs/docker-compose_install.sh b/docker-configs/docker-compose_install.sh index 996ff09..bdc7c61 100644 --- a/docker-configs/docker-compose_install.sh +++ b/docker-configs/docker-compose_install.sh @@ -21,12 +21,8 @@ echo FreeDMR Docker installer... echo Installing required packages... -#apt-get -y install docker.io && -#apt-get -y install docker-compose && -#apt-get -y install conntrack && - echo Install Docker Community Edition... -#apt-get remove docker docker-engine docker.io && +apt-get remove docker docker-engine docker.io && apt-get -y update && apt-get -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common && curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - && @@ -217,6 +213,18 @@ mv /var/log/FreeDMRmonitor/lastheard.log /var/log/FreeDMRmonitor/lastheard.log.s EOF chmod 755 /etc/cron.daily/lastheard +echo Tune network stack... +cat < /etc/sysctl.conf +net.core.rmem_default=134217728 +net.core.rmem_max=134217728 +net.core.wmem_max=134217728 +net.core.rmem_default=134217728 +net.core.netdev_max_backlog=250000 +net.netfilter.nf_conntrack_udp_timeout=15 +net.netfilter.nf_conntrack_udp_timeout_stream=35 +EOF + +/usr/bin/sysctl -p && echo Run FreeDMR container... docker-compose up -d From 1450e9a287a4772cc167c4d572083e4a4fb101c3 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 11 Sep 2022 01:06:59 +0100 Subject: [PATCH 50/80] gerbil! --- docker-configs/docker-compose_install.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-configs/docker-compose_install.sh b/docker-configs/docker-compose_install.sh index bdc7c61..2885fb8 100644 --- a/docker-configs/docker-compose_install.sh +++ b/docker-configs/docker-compose_install.sh @@ -22,7 +22,7 @@ echo FreeDMR Docker installer... echo Installing required packages... echo Install Docker Community Edition... -apt-get remove docker docker-engine docker.io && +apt-get -y remove docker docker-engine docker.io && apt-get -y update && apt-get -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common && curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - && @@ -204,7 +204,7 @@ echo Get docker-compose.yml... cd /etc/freedmr && curl https://gitlab.hacknix.net/hacknix/FreeDMR/-/raw/master/docker-configs/docker-compose.yml -o docker-compose.yml && echo Install crontab... -cat << EOF > /etc/cron.daily/lastheard +cat << EOF > /etc/cron.daily/lastheard && #!/bin/bash mv /var/log/FreeDMRmonitor/lastheard.log /var/log/FreeDMRmonitor/lastheard.log.save /usr/bin/tail -150 /var/log/FreeDMRmonitor/lastheard.log.save > /var/log/FreeDMRmonitor/lastheard.log @@ -214,7 +214,7 @@ EOF chmod 755 /etc/cron.daily/lastheard echo Tune network stack... -cat < /etc/sysctl.conf +cat << EOF > /etc/sysctl.conf && net.core.rmem_default=134217728 net.core.rmem_max=134217728 net.core.wmem_max=134217728 From 19c800ba8d7e96bcd2ed8345e5f15be37e205397 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 11 Sep 2022 01:12:54 +0100 Subject: [PATCH 51/80] AMI off by default --- docker-configs/docker-compose_install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-configs/docker-compose_install.sh b/docker-configs/docker-compose_install.sh index 2885fb8..23babc9 100644 --- a/docker-configs/docker-compose_install.sh +++ b/docker-configs/docker-compose_install.sh @@ -100,7 +100,7 @@ TOPO_FILE: topography.json #Control server shared allstar instance via dial / AMI [ALLSTAR] -ENABLED: True +ENABLED: false USER:admin PASS: password SERVER: asl.example.com From a41925b2a476c0aa0fbb55e691e746cc2bf54fd9 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 17 Sep 2022 01:05:22 +0100 Subject: [PATCH 52/80] Use OA4 dash in Docker --- docker-configs/docker-compose.yml | 34 +++++++++------------- docker-configs/docker-compose_install.sh | 36 +++++++++--------------- 2 files changed, 27 insertions(+), 43 deletions(-) diff --git a/docker-configs/docker-compose.yml b/docker-configs/docker-compose.yml index 6da1a22..127266b 100644 --- a/docker-configs/docker-compose.yml +++ b/docker-configs/docker-compose.yml @@ -51,45 +51,37 @@ services: #- FDPROXY_LISTENPORT=62031 read_only: "true" - freedmrmon: - container_name: freedmrmon + freedmrmonitor2: + container_name: freedmrmonitor2 cpu_shares: 512 depends_on: - freedmr - volumes: - #This should be kept to a manageable size from - #cron or logrotate outisde of the container. - - '/var/log/FreeDMRmonitor/:/opt/FreeDMRmonitor/log/' - #Write JSON files outside of container - - '/etc/freedmr/json/:/opt/FreeDMRmonitor/json/' - - #Override config file - # - '/etc/freedmr/config.py:/opt/FreeDMRmonitor/config.py' ports: - '9000:9000/tcp' - image: 'hacknix/freedmrmonitor:latest' + image: 'gitlab.hacknix.net:5050/freedmr/freedmrmonitor2/freedmrmonitor2:monitor-development-latest' restart: "unless-stopped" networks: app_net: ipv4_address: 172.16.238.20 - + read_only: "true" + logging: + driver: json-file + + freedmrmonpache: container_name: freedmrmonapache cpu_shares: 512 depends_on: - - freedmrmon - #Use to override html files - #And images - #volumes: - # - '/var/www/html/:/var/www/html/' - # - '/var/www/html/images/:/var/www/html/images/' + - freedmrmonitor2 ports: - - '80:80/tcp' - image: hacknix/freedmrmonitor-apache:latest + - '8080:80/tcp' + image: 'gitlab.hacknix.net:5050/freedmr/freedmrmonitor2/freedmrmonitor2:apache-development-latest' restart: "unless-stopped" networks: app_net: ipv4_address: 172.16.238.30 + logging: + driver: json-file networks: app_net: diff --git a/docker-configs/docker-compose_install.sh b/docker-configs/docker-compose_install.sh index 23babc9..9f95aea 100644 --- a/docker-configs/docker-compose_install.sh +++ b/docker-configs/docker-compose_install.sh @@ -37,7 +37,15 @@ echo Install Docker Compose... apt-get -y install docker-compose && echo Set userland-proxy to false... -echo '{ "userland-proxy": false}' > /etc/docker/daemon.json && +cat < /etc/docker/daemon.json && +{ "userland-proxy": false + "log-driver": "json-file", + "log-opts": { + "max-size": "10m", + "max-file": "3" + } +} +EOF echo Restart docker... systemctl restart docker && @@ -87,13 +95,13 @@ PATH: ./json/ PEER_FILE: peer_ids.json SUBSCRIBER_FILE: subscriber_ids.json TGID_FILE: talkgroup_ids.json -PEER_URL: https://www.radioid.net/static/rptrs.json -SUBSCRIBER_URL: https://www.radioid.net/static/users.json -TGID_URL: http://downloads.freedmr.uk/downloads/talkgroup_ids.json +PEER_URL: http://freedmr-lh.gb7fr.org.uk/json/peer_ids.json +SUBSCRIBER_URL: http://freedmr-lh.gb7fr.org.uk/json/subscriber_ids.json +TGID_URL: http://freedmr-lh.gb7fr.org.uk/talkgroup_ids.json LOCAL_SUBSCRIBER_FILE: local_subscriber_ids.json STALE_DAYS: 1 SUB_MAP_FILE: sub_map.pkl -SERVER_ID_URL: http://downloads.freedmr.uk/downloads/FreeDMR_Hosts.csv +SERVER_ID_URL: http://freedmr-lh.gb7fr.org.uk/json/server_ids.tsv SERVER_ID_FILE: server_ids.tsv TOPO_FILE: topography.json @@ -191,26 +199,10 @@ echo "BRIDGES = {'9990': [{'SYSTEM': 'ECHO', 'TS': 2, 'TGID': 9990, 'ACTIVE': Tr echo Set perms on config directory... chown -R 54000 /etc/freedmr && -echo Setup logging... -mkdir -p /var/log/freedmr && -touch /var/log/freedmr/freedmr.log && -chown -R 54000 /var/log/freedmr && -mkdir -p /var/log/FreeDMRmonitor && -touch /var/log/FreeDMRmonitor/lastheard.log && -touch /var/log/FreeDMRmonitor/hbmon.log && -chown -R 54001 /var/log/FreeDMRmonitor && - echo Get docker-compose.yml... cd /etc/freedmr && curl https://gitlab.hacknix.net/hacknix/FreeDMR/-/raw/master/docker-configs/docker-compose.yml -o docker-compose.yml && -echo Install crontab... -cat << EOF > /etc/cron.daily/lastheard && -#!/bin/bash -mv /var/log/FreeDMRmonitor/lastheard.log /var/log/FreeDMRmonitor/lastheard.log.save -/usr/bin/tail -150 /var/log/FreeDMRmonitor/lastheard.log.save > /var/log/FreeDMRmonitor/lastheard.log -mv /var/log/FreeDMRmonitor/lastheard.log /var/log/FreeDMRmonitor/lastheard.log.save -/usr/bin/tail -150 /var/log/FreeDMRmonitor/lastheard.log.save > /var/log/FreeDMRmonitor/lastheard.log -EOF + chmod 755 /etc/cron.daily/lastheard echo Tune network stack... From b1f9a2ff5829702128868da634a5d4c5ad50ba7e Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 19 Sep 2022 00:27:49 +0100 Subject: [PATCH 53/80] Fix typo in docker-compose.yml --- docker-configs/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-configs/docker-compose.yml b/docker-configs/docker-compose.yml index 127266b..0384524 100644 --- a/docker-configs/docker-compose.yml +++ b/docker-configs/docker-compose.yml @@ -51,7 +51,7 @@ services: #- FDPROXY_LISTENPORT=62031 read_only: "true" - freedmrmonitor2: + freedmrmonitor2: container_name: freedmrmonitor2 cpu_shares: 512 depends_on: From 937080feef1af909ffb127e886aa48e639d89499 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 19 Sep 2022 00:55:03 +0100 Subject: [PATCH 54/80] dock --- docker-configs/docker-compose_install.sh | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docker-configs/docker-compose_install.sh b/docker-configs/docker-compose_install.sh index 9f95aea..2630777 100644 --- a/docker-configs/docker-compose_install.sh +++ b/docker-configs/docker-compose_install.sh @@ -38,12 +38,14 @@ apt-get -y install docker-compose && echo Set userland-proxy to false... cat < /etc/docker/daemon.json && -{ "userland-proxy": false - "log-driver": "json-file", - "log-opts": { +{ + "userland-proxy": false, + "experimental": true, + "log-driver": "json-file", + "log-opts": { "max-size": "10m", "max-file": "3" - } + } } EOF @@ -216,7 +218,7 @@ net.netfilter.nf_conntrack_udp_timeout=15 net.netfilter.nf_conntrack_udp_timeout_stream=35 EOF -/usr/bin/sysctl -p && +/usr/sbin/sysctl -p && echo Run FreeDMR container... docker-compose up -d From a371ca4db07ff0d1e6a528e34caab229935b7a2b Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 19 Sep 2022 12:51:18 +0100 Subject: [PATCH 55/80] Get ready for merge to master --- .gitlab-ci.yml | 15 --------------- docker-configs/Dockerfile-proxy | 1 - 2 files changed, 16 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d8046ba..75e7820 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -31,21 +31,6 @@ build-dev: # This job runs in the build stage, which runs first. only: - master -build-extrastats: # This job runs in the build stage, which runs first. - stage: build - tags: - - buildx - script: - - echo "Compiling the code..." - - cd docker-configs - - docker buildx build --no-cache -f Dockerfile-proxy -t hacknix/freedmr:extrastats-development-latest -t gitlab.hacknix.net:5050/hacknix/freedmr:extrastats-development-latest --platform linux/amd64 --push . - - - - - echo "Compile complete." - only: - - extrastats - build-testing: # This job runs in the build stage, which runs first. stage: build tags: diff --git a/docker-configs/Dockerfile-proxy b/docker-configs/Dockerfile-proxy index 30ecca2..898029a 100644 --- a/docker-configs/Dockerfile-proxy +++ b/docker-configs/Dockerfile-proxy @@ -25,7 +25,6 @@ RUN adduser -D -u 54000 radio && \ cd /opt && \ git clone https://gitlab.hacknix.net/hacknix/FreeDMR.git freedmr && \ cd /opt/freedmr && \ - git checkout extrastats && \ pip install --no-cache-dir -r requirements.txt && \ apk del git gcc musl-dev && \ chown -R radio: /opt/freedmr From 630e2a00a129327d0845a6582cf5986a2cc3f204 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 19 Sep 2022 12:55:14 +0100 Subject: [PATCH 56/80] taggy --- docker-configs/docker-compose.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docker-configs/docker-compose.yml b/docker-configs/docker-compose.yml index 0384524..90a690c 100644 --- a/docker-configs/docker-compose.yml +++ b/docker-configs/docker-compose.yml @@ -32,7 +32,7 @@ services: - '62031:62031/udp' #Change the below to inlude ports used for your OBP(s) #- '62041:62041/udp' - image: 'gitlab.hacknix.net:5050/hacknix/freedmr:development-latest' + image: 'gitlab.hacknix.net:5050/hacknix/freedmr:latest' restart: "unless-stopped" networks: app_net: @@ -58,7 +58,7 @@ services: - freedmr ports: - '9000:9000/tcp' - image: 'gitlab.hacknix.net:5050/freedmr/freedmrmonitor2/freedmrmonitor2:monitor-development-latest' + image: 'gitlab.hacknix.net:5050/freedmr/freedmrmonitor2/freedmrmonitor2:monitor-latest' restart: "unless-stopped" networks: app_net: @@ -74,8 +74,8 @@ services: depends_on: - freedmrmonitor2 ports: - - '8080:80/tcp' - image: 'gitlab.hacknix.net:5050/freedmr/freedmrmonitor2/freedmrmonitor2:apache-development-latest' + - '80:80/tcp' + image: 'gitlab.hacknix.net:5050/freedmr/freedmrmonitor2/freedmrmonitor2:apache-latest' restart: "unless-stopped" networks: app_net: From 660ca30fa6f06425a424043efd6692251c3cfb5d Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 19 Sep 2022 13:07:48 +0100 Subject: [PATCH 57/80] bytes3 not int --- bridge_master.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridge_master.py b/bridge_master.py index d70e358..3f4dd19 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -546,7 +546,7 @@ def sendVoicePacket(self,pkt,_source_id,_dest_id,_slot): 'TGID': _dest_id, 'LAST': _pkt_time, 'source_server': self._CONFIG['GLOBAL']['SERVER_ID'], - 'source_rptr': int_id(5000) + 'source_rptr': bytes_3(5000) } _slot['TX_TGID'] = _dest_id else: From 12e07c875ceddc264f58319da0202b4d2abe75ec Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 19 Sep 2022 13:11:47 +0100 Subject: [PATCH 58/80] _d_slot --- bridge_master.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridge_master.py b/bridge_master.py index 3f4dd19..348f8a4 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -1168,7 +1168,7 @@ class routerOBP(OPENBRIDGE): systems[_d_system].send_system(_tmp_data) logger.debug('(%s) UNIT Data Bridged to HBP on slot 1: %s DST_ID: %s',self._system,_d_system,_int_dst_id) if CONFIG['REPORTS']['REPORT']: - systems[_d_system]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + systems[_d_system]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _d_slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) def sendDataToOBP(self,_target,_data,dmrpkt,pkt_time,_stream_id,_dst_id,_peer_id,_rf_src,_bits,_slot,_hops = b'',_source_server = b'\x00\x00\x00\x00', _ber = b'\x00', _rssi = b'\x00', _source_rptr = b'\x00\x00\x00\x00'): From 344c324fc4031cc6d980e03b3d3cd497311d397c Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 19 Sep 2022 13:47:55 +0100 Subject: [PATCH 59/80] Fix source server --- bridge_master.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridge_master.py b/bridge_master.py index 348f8a4..7a73952 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -1160,7 +1160,7 @@ class routerOBP(OPENBRIDGE): #Ignore this system and TS pair if it's called again on this packet return(_sysIgnore) - def sendDataToHBP(self,_d_system,_d_slot,_dst_id,_tmp_bits,_data,dmrpkt,_rf_src,_stream_id,_peer_id): + def sendDataToHBP(self,_d_system,_d_slot,_dst_id,_tmp_bits,_data,dmrpkt,_rf_src,_stream_id,_peer_id,_source_server = b'\x00\x00\x00\x00',_source_rptr = b'\x00\x00\x00\x00'): _int_dst_id = int_id(_dst_id) #Assemble transmit HBP packet header _tmp_data = b''.join([_data[:15], _tmp_bits.to_bytes(1, 'big'), _data[16:20]]) From 59f9b2d165da99463060e7aad252e1392fd79fe8 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 19 Sep 2022 13:56:31 +0100 Subject: [PATCH 60/80] Revert "Fix source server" This reverts commit 344c324fc4031cc6d980e03b3d3cd497311d397c. --- bridge_master.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridge_master.py b/bridge_master.py index 7a73952..348f8a4 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -1160,7 +1160,7 @@ class routerOBP(OPENBRIDGE): #Ignore this system and TS pair if it's called again on this packet return(_sysIgnore) - def sendDataToHBP(self,_d_system,_d_slot,_dst_id,_tmp_bits,_data,dmrpkt,_rf_src,_stream_id,_peer_id,_source_server = b'\x00\x00\x00\x00',_source_rptr = b'\x00\x00\x00\x00'): + def sendDataToHBP(self,_d_system,_d_slot,_dst_id,_tmp_bits,_data,dmrpkt,_rf_src,_stream_id,_peer_id): _int_dst_id = int_id(_dst_id) #Assemble transmit HBP packet header _tmp_data = b''.join([_data[:15], _tmp_bits.to_bytes(1, 'big'), _data[16:20]]) From 21eea82d80c4729db2a18937f6847e8d819ec6ec Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 19 Sep 2022 13:56:34 +0100 Subject: [PATCH 61/80] Revert "_d_slot" This reverts commit 12e07c875ceddc264f58319da0202b4d2abe75ec. --- bridge_master.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridge_master.py b/bridge_master.py index 348f8a4..3f4dd19 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -1168,7 +1168,7 @@ class routerOBP(OPENBRIDGE): systems[_d_system].send_system(_tmp_data) logger.debug('(%s) UNIT Data Bridged to HBP on slot 1: %s DST_ID: %s',self._system,_d_system,_int_dst_id) if CONFIG['REPORTS']['REPORT']: - systems[_d_system]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _d_slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + systems[_d_system]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) def sendDataToOBP(self,_target,_data,dmrpkt,pkt_time,_stream_id,_dst_id,_peer_id,_rf_src,_bits,_slot,_hops = b'',_source_server = b'\x00\x00\x00\x00', _ber = b'\x00', _rssi = b'\x00', _source_rptr = b'\x00\x00\x00\x00'): From a9537adc5cad9b2d39226378b6631f4538048bf4 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 19 Sep 2022 13:56:35 +0100 Subject: [PATCH 62/80] Revert "bytes3 not int" This reverts commit 660ca30fa6f06425a424043efd6692251c3cfb5d. --- bridge_master.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridge_master.py b/bridge_master.py index 3f4dd19..d70e358 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -546,7 +546,7 @@ def sendVoicePacket(self,pkt,_source_id,_dest_id,_slot): 'TGID': _dest_id, 'LAST': _pkt_time, 'source_server': self._CONFIG['GLOBAL']['SERVER_ID'], - 'source_rptr': bytes_3(5000) + 'source_rptr': int_id(5000) } _slot['TX_TGID'] = _dest_id else: From b770538521f450f17a6008fb9e07eece80edd774 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 19 Sep 2022 13:56:37 +0100 Subject: [PATCH 63/80] Revert "taggy" This reverts commit 630e2a00a129327d0845a6582cf5986a2cc3f204. --- docker-configs/docker-compose.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docker-configs/docker-compose.yml b/docker-configs/docker-compose.yml index 90a690c..0384524 100644 --- a/docker-configs/docker-compose.yml +++ b/docker-configs/docker-compose.yml @@ -32,7 +32,7 @@ services: - '62031:62031/udp' #Change the below to inlude ports used for your OBP(s) #- '62041:62041/udp' - image: 'gitlab.hacknix.net:5050/hacknix/freedmr:latest' + image: 'gitlab.hacknix.net:5050/hacknix/freedmr:development-latest' restart: "unless-stopped" networks: app_net: @@ -58,7 +58,7 @@ services: - freedmr ports: - '9000:9000/tcp' - image: 'gitlab.hacknix.net:5050/freedmr/freedmrmonitor2/freedmrmonitor2:monitor-latest' + image: 'gitlab.hacknix.net:5050/freedmr/freedmrmonitor2/freedmrmonitor2:monitor-development-latest' restart: "unless-stopped" networks: app_net: @@ -74,8 +74,8 @@ services: depends_on: - freedmrmonitor2 ports: - - '80:80/tcp' - image: 'gitlab.hacknix.net:5050/freedmr/freedmrmonitor2/freedmrmonitor2:apache-latest' + - '8080:80/tcp' + image: 'gitlab.hacknix.net:5050/freedmr/freedmrmonitor2/freedmrmonitor2:apache-development-latest' restart: "unless-stopped" networks: app_net: From 816cf152724cd37b29fc610bc98fdc6a21aa5d10 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 19 Sep 2022 13:56:39 +0100 Subject: [PATCH 64/80] Revert "Get ready for merge to master" This reverts commit a371ca4db07ff0d1e6a528e34caab229935b7a2b. --- .gitlab-ci.yml | 15 +++++++++++++++ docker-configs/Dockerfile-proxy | 1 + 2 files changed, 16 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 75e7820..d8046ba 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -31,6 +31,21 @@ build-dev: # This job runs in the build stage, which runs first. only: - master +build-extrastats: # This job runs in the build stage, which runs first. + stage: build + tags: + - buildx + script: + - echo "Compiling the code..." + - cd docker-configs + - docker buildx build --no-cache -f Dockerfile-proxy -t hacknix/freedmr:extrastats-development-latest -t gitlab.hacknix.net:5050/hacknix/freedmr:extrastats-development-latest --platform linux/amd64 --push . + + + + - echo "Compile complete." + only: + - extrastats + build-testing: # This job runs in the build stage, which runs first. stage: build tags: diff --git a/docker-configs/Dockerfile-proxy b/docker-configs/Dockerfile-proxy index 898029a..30ecca2 100644 --- a/docker-configs/Dockerfile-proxy +++ b/docker-configs/Dockerfile-proxy @@ -25,6 +25,7 @@ RUN adduser -D -u 54000 radio && \ cd /opt && \ git clone https://gitlab.hacknix.net/hacknix/FreeDMR.git freedmr && \ cd /opt/freedmr && \ + git checkout extrastats && \ pip install --no-cache-dir -r requirements.txt && \ apk del git gcc musl-dev && \ chown -R radio: /opt/freedmr From e909856fd01968694773c6dfcee01af565636a46 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 19 Sep 2022 13:57:13 +0100 Subject: [PATCH 65/80] Revert "Merge branch 'master' into extrastats" This reverts commit 3fc81a8ada1d8974c5f1bd80067ff5162923d11c, reversing changes made to 20cae952863cb40bd9d310c8c4a50cddeb95e0ac. --- docker-configs/docker-compose.yml | 39 ++++++---- docker-configs/docker-compose_install.sh | 92 +++++++++--------------- 2 files changed, 58 insertions(+), 73 deletions(-) diff --git a/docker-configs/docker-compose.yml b/docker-configs/docker-compose.yml index 0384524..c4c3738 100644 --- a/docker-configs/docker-compose.yml +++ b/docker-configs/docker-compose.yml @@ -24,6 +24,7 @@ services: mem_reservation: 600m volumes: - '/etc/freedmr/freedmr.cfg:/opt/freedmr/freedmr.cfg' + - '/var/log/freedmr/:/opt/freedmr/log/' - '/etc/freedmr/rules.py:/opt/freedmr/rules.py' #Write JSON files outside of container - '/etc/freedmr/json/:/opt/freedmr/json/' @@ -31,8 +32,8 @@ services: ports: - '62031:62031/udp' #Change the below to inlude ports used for your OBP(s) - #- '62041:62041/udp' - image: 'gitlab.hacknix.net:5050/hacknix/freedmr:development-latest' + - '62041:62041/udp' + image: 'hacknix/freedmr:latest' restart: "unless-stopped" networks: app_net: @@ -51,37 +52,45 @@ services: #- FDPROXY_LISTENPORT=62031 read_only: "true" - freedmrmonitor2: - container_name: freedmrmonitor2 + freedmrmon: + container_name: freedmrmon cpu_shares: 512 depends_on: - freedmr + volumes: + #This should be kept to a manageable size from + #cron or logrotate outisde of the container. + - '/var/log/FreeDMRmonitor/:/opt/FreeDMRmonitor/log/' + #Write JSON files outside of container + - '/etc/freedmr/json/:/opt/FreeDMRmonitor/json/' + + #Override config file + # - '/etc/freedmr/config.py:/opt/FreeDMRmonitor/config.py' ports: - '9000:9000/tcp' - image: 'gitlab.hacknix.net:5050/freedmr/freedmrmonitor2/freedmrmonitor2:monitor-development-latest' + image: 'hacknix/freedmrmonitor:latest' restart: "unless-stopped" networks: app_net: ipv4_address: 172.16.238.20 - read_only: "true" - logging: - driver: json-file - - + freedmrmonpache: container_name: freedmrmonapache cpu_shares: 512 depends_on: - - freedmrmonitor2 + - freedmrmon + #Use to override html files + #And images + #volumes: + # - '/var/www/html/:/var/www/html/' + # - '/var/www/html/images/:/var/www/html/images/' ports: - - '8080:80/tcp' - image: 'gitlab.hacknix.net:5050/freedmr/freedmrmonitor2/freedmrmonitor2:apache-development-latest' + - '80:80/tcp' + image: hacknix/freedmrmonitor-apache:latest restart: "unless-stopped" networks: app_net: ipv4_address: 172.16.238.30 - logging: - driver: json-file networks: app_net: diff --git a/docker-configs/docker-compose_install.sh b/docker-configs/docker-compose_install.sh index 2630777..f1a2bc1 100644 --- a/docker-configs/docker-compose_install.sh +++ b/docker-configs/docker-compose_install.sh @@ -21,33 +21,12 @@ echo FreeDMR Docker installer... echo Installing required packages... -echo Install Docker Community Edition... -apt-get -y remove docker docker-engine docker.io && -apt-get -y update && -apt-get -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common && -curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - && -add-apt-repository \ - "deb [arch=amd64] https://download.docker.com/linux/debian \ - $(lsb_release -cs) \ - stable" && -apt-get -y update && -apt-get -y install docker-ce && - -echo Install Docker Compose... +apt-get -y install docker.io && apt-get -y install docker-compose && +apt-get -y install conntrack && echo Set userland-proxy to false... -cat < /etc/docker/daemon.json && -{ - "userland-proxy": false, - "experimental": true, - "log-driver": "json-file", - "log-opts": { - "max-size": "10m", - "max-file": "3" - } -} -EOF +echo '{ "userland-proxy": false}' > /etc/docker/daemon.json && echo Restart docker... systemctl restart docker && @@ -75,8 +54,6 @@ GEN_STAT_BRIDGES: True ALLOW_NULL_PASSPHRASE: True ANNOUNCEMENT_LANGUAGES: SERVER_ID: 0 -DATA_GATEWAY: False -VALIDATE_SERVER_IDS: True [REPORTS] @@ -86,8 +63,8 @@ REPORT_PORT: 4321 REPORT_CLIENTS: * [LOGGER] -LOG_FILE: /dev/null -LOG_HANDLERS: console-timed +LOG_FILE: log/freedmr.log +LOG_HANDLERS: file-timed LOG_LEVEL: INFO LOG_NAME: FreeDMR @@ -97,25 +74,21 @@ PATH: ./json/ PEER_FILE: peer_ids.json SUBSCRIBER_FILE: subscriber_ids.json TGID_FILE: talkgroup_ids.json -PEER_URL: http://freedmr-lh.gb7fr.org.uk/json/peer_ids.json -SUBSCRIBER_URL: http://freedmr-lh.gb7fr.org.uk/json/subscriber_ids.json -TGID_URL: http://freedmr-lh.gb7fr.org.uk/talkgroup_ids.json -LOCAL_SUBSCRIBER_FILE: local_subscriber_ids.json +PEER_URL: https://www.radioid.net/static/rptrs.json +SUBSCRIBER_URL: http://downloads.freedmr.uk/downloads/local_subscriber_ids.json +TGID_URL: TGID_URL: https://freedmr.cymru/talkgroups/talkgroup_ids_json.php STALE_DAYS: 1 +LOCAL_SUBSCRIBER_FILE: local_subcriber_ids.json SUB_MAP_FILE: sub_map.pkl -SERVER_ID_URL: http://freedmr-lh.gb7fr.org.uk/json/server_ids.tsv -SERVER_ID_FILE: server_ids.tsv -TOPO_FILE: topography.json - -#Control server shared allstar instance via dial / AMI -[ALLSTAR] -ENABLED: false -USER:admin -PASS: password -SERVER: asl.example.com -PORT: 5038 -NODE: 11111 +[MYSQL] +USE_MYSQL: False +USER: hblink +PASS: mypassword +DB: hblink +SERVER: 127.0.0.1 +PORT: 3306 +TABLE: repeaters [OBP-TEST] MODE: OPENBRIDGE @@ -159,7 +132,6 @@ ANNOUNCEMENT_LANGUAGE: en_GB GENERATOR: 100 ALLOW_UNREG_ID: False PROXY_CONTROL: True -OVERRIDE_IDENT_TG: [ECHO] MODE: PEER @@ -201,24 +173,28 @@ echo "BRIDGES = {'9990': [{'SYSTEM': 'ECHO', 'TS': 2, 'TGID': 9990, 'ACTIVE': Tr echo Set perms on config directory... chown -R 54000 /etc/freedmr && +echo Setup logging... +mkdir -p /var/log/freedmr && +touch /var/log/freedmr/freedmr.log && +chown -R 54000 /var/log/freedmr && +mkdir -p /var/log/FreeDMRmonitor && +touch /var/log/FreeDMRmonitor/lastheard.log && +touch /var/log/FreeDMRmonitor/hbmon.log && +chown -R 54001 /var/log/FreeDMRmonitor && + echo Get docker-compose.yml... cd /etc/freedmr && curl https://gitlab.hacknix.net/hacknix/FreeDMR/-/raw/master/docker-configs/docker-compose.yml -o docker-compose.yml && - -chmod 755 /etc/cron.daily/lastheard - -echo Tune network stack... -cat << EOF > /etc/sysctl.conf && -net.core.rmem_default=134217728 -net.core.rmem_max=134217728 -net.core.wmem_max=134217728 -net.core.rmem_default=134217728 -net.core.netdev_max_backlog=250000 -net.netfilter.nf_conntrack_udp_timeout=15 -net.netfilter.nf_conntrack_udp_timeout_stream=35 +echo Install crontab... +cat << EOF > /etc/cron.daily/lastheard +#!/bin/bash +mv /var/log/FreeDMRmonitor/lastheard.log /var/log/FreeDMRmonitor/lastheard.log.save +/usr/bin/tail -150 /var/log/FreeDMRmonitor/lastheard.log.save > /var/log/FreeDMRmonitor/lastheard.log +mv /var/log/FreeDMRmonitor/lastheard.log /var/log/FreeDMRmonitor/lastheard.log.save +/usr/bin/tail -150 /var/log/FreeDMRmonitor/lastheard.log.save > /var/log/FreeDMRmonitor/lastheard.log EOF +chmod 755 /etc/cron.daily/lastheard -/usr/sbin/sysctl -p && echo Run FreeDMR container... docker-compose up -d From 70069591f1897ff3243760c111acf96b347f89d7 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 19 Sep 2022 14:10:57 +0100 Subject: [PATCH 66/80] Revert "Merge branch 'master' into extrastats" This reverts commit 3fc81a8ada1d8974c5f1bd80067ff5162923d11c, reversing changes made to 937080feef1af909ffb127e886aa48e639d89499. --- .gitlab-ci.yml | 2 +- bridge_master.py | 99 +++++++++++---------------------- docker-configs/Dockerfile-proxy | 1 - report_sql.py | 10 ++-- 4 files changed, 38 insertions(+), 74 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d8046ba..6ef8f26 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -38,7 +38,7 @@ build-extrastats: # This job runs in the build stage, which runs first. script: - echo "Compiling the code..." - cd docker-configs - - docker buildx build --no-cache -f Dockerfile-proxy -t hacknix/freedmr:extrastats-development-latest -t gitlab.hacknix.net:5050/hacknix/freedmr:extrastats-development-latest --platform linux/amd64 --push . + - docker buildx build --no-cache -f Dockerfile-proxy -t hacknix/freedmr:extrastats-development-latest -t gitlab.hacknix.net:5050/hacknix/freedmr:extrastats-development-latest --platform linux/arm64 --push . diff --git a/bridge_master.py b/bridge_master.py index d70e358..eb8899a 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -441,9 +441,7 @@ def stream_trimmer_loop(): logger.info('(%s) *TIME OUT* RX STREAM ID: %s SUB: %s TGID %s, TS %s, Duration: %.2f', \ system, int_id(_slot['RX_STREAM_ID']), int_id(_slot['RX_RFS']), int_id(_slot['RX_TGID']), slot, _slot['RX_TIME'] - _slot['RX_START']) if CONFIG['REPORTS']['REPORT']: - systems[system]._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f},{},{}'.format(system, int_id(_slot['RX_STREAM_ID']), int_id(_slot['RX_PEER']), int_id(_slot['RX_RFS']), slot, int_id(_slot['RX_TGID']), _slot['RX_TIME'] - _slot['RX_START'],int_id(_slot['source_server']),int_id(_slot['source_rptr'])).encode(encoding='utf-8', errors='ignore')) - - + systems[system]._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f}'.format(system, int_id(_slot['RX_STREAM_ID']), int_id(_slot['RX_PEER']), int_id(_slot['RX_RFS']), slot, int_id(_slot['RX_TGID']), _slot['RX_TIME'] - _slot['RX_START']).encode(encoding='utf-8', errors='ignore')) #Null stream_id - for loop control if _slot['RX_TIME'] < _now - 60: _slot['RX_STREAM_ID'] = b'\x00' @@ -454,8 +452,7 @@ def stream_trimmer_loop(): logger.debug('(%s) *TIME OUT* TX STREAM ID: %s SUB: %s TGID %s, TS %s, Duration: %.2f', \ system, int_id(_slot['TX_STREAM_ID']), int_id(_slot['TX_RFS']), int_id(_slot['TX_TGID']), slot, _slot['TX_TIME'] - _slot['TX_START']) if CONFIG['REPORTS']['REPORT']: - systems[system]._report.send_bridgeEvent('GROUP VOICE,END,TX,{},{},{},{},{},{},{:.2f},{},{}'.format(system, int_id(_slot['TX_STREAM_ID']), int_id(_slot['TX_PEER']), int_id(_slot['TX_RFS']), slot, int_id(_slot['TX_TGID']), _slot['TX_TIME'] - _slot['TX_START'],int_id(_slot['source_serv er']),int_id(_slot['source_rptr'])).encode(encoding='utf-8', errors='ignore')) - + systems[system]._report.send_bridgeEvent('GROUP VOICE,END,TX,{},{},{},{},{},{},{:.2f}'.format(system, int_id(_slot['TX_STREAM_ID']), int_id(_slot['TX_PEER']), int_id(_slot['TX_RFS']), slot, int_id(_slot['TX_TGID']), _slot['TX_TIME'] - _slot['TX_START']).encode(encoding='utf-8', errors='ignore')) # OBP systems # We can't delete items from a dicationry that's being iterated, so we have to make a temporarly list of entrys to remove later @@ -494,8 +491,7 @@ def stream_trimmer_loop(): system, int_id(stream_id), get_alias(int_id(_stream['RFS']), subscriber_ids), get_alias(int_id(_stream['RX_PEER']), peer_ids), get_alias(int_id(_stream['TGID']), talkgroup_ids), _stream['LAST'] - _stream['START']) if CONFIG['REPORTS']['REPORT']: - systems[system]._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f},{},{}'.format(system, int_id(stream_id), int_id(_stream['RX_PEER']), int_id(_stream['RFS']), 1, int_id(_stream['TGID']), _stream['LAST'] - _stream['START'], int_id(_stream['source_server']),int_id(_stream['source_rptr'])).encode(encoding='utf-8', errors='ignore')) - + systems[system]._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f}'.format(system, int_id(stream_id), int_id(_stream['RX_PEER']), int_id(_stream['RFS']), 1, int_id(_stream['TGID']), _stream['LAST'] - _stream['START']).encode(encoding='utf-8', errors='ignore')) systems[system].STATUS[stream_id]['_to'] = True continue except Exception as e: @@ -544,9 +540,7 @@ def sendVoicePacket(self,pkt,_source_id,_dest_id,_slot): 'CONTENTION':False, 'RFS': _source_id, 'TGID': _dest_id, - 'LAST': _pkt_time, - 'source_server': self._CONFIG['GLOBAL']['SERVER_ID'], - 'source_rptr': int_id(5000) + 'LAST': _pkt_time } _slot['TX_TGID'] = _dest_id else: @@ -1024,8 +1018,6 @@ class routerOBP(OPENBRIDGE): 'RFS': _rf_src, 'TGID': _dst_id, 'RX_PEER': _peer_id, - 'source_server' : _source_server, - 'source_rptr' : _source_rptr } # Generate LCs (full and EMB) for the TX stream @@ -1041,7 +1033,7 @@ class routerOBP(OPENBRIDGE): logger.debug('(%s) Conference Bridge: %s, Call Bridged to OBP System: %s TS: %s, TGID: %s', self._system, _bridge, _target['SYSTEM'], _target['TS'], int_id(_target['TGID'])) if CONFIG['REPORTS']['REPORT']: - systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,START,TX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,START,TX,{},{},{},{},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID'])).encode(encoding='utf-8', errors='ignore')) # Record the time of this packet so we can later identify a stale stream _target_status[_stream_id]['LAST'] = pkt_time @@ -1118,7 +1110,7 @@ class routerOBP(OPENBRIDGE): logger.debug('(%s) Generating TX FULL and EMB LCs for HomeBrew destination: System: %s, TS: %s, TGID: %s', self._system, _target['SYSTEM'], _target['TS'], int_id(_target['TGID'])) logger.debug('(%s) Conference Bridge: %s, Call Bridged to HBP System: %s TS: %s, TGID: %s', self._system, _bridge, _target['SYSTEM'], _target['TS'], int_id(_target['TGID'])) if CONFIG['REPORTS']['REPORT']: - systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,START,TX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,START,TX,{},{},{},{},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID'])).encode(encoding='utf-8', errors='ignore')) # Set other values for the contention handler to test next time there is a frame to forward _target_status[_target['TS']]['TX_TIME'] = pkt_time @@ -1146,7 +1138,7 @@ class routerOBP(OPENBRIDGE): dmrbits = _target_status[_target['TS']]['TX_T_LC'][0:98] + dmrbits[98:166] + _target_status[_target['TS']]['TX_T_LC'][98:197] if CONFIG['REPORTS']['REPORT']: call_duration = pkt_time - _target_status[_target['TS']]['TX_START'] - systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,END,TX,{},{},{},{},{},{},{:.2f},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']), call_duration,int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,END,TX,{},{},{},{},{},{},{:.2f}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']), call_duration).encode(encoding='utf-8', errors='ignore')) # Create a Burst B-E packet (Embedded LC) elif _dtype_vseq in [1,2,3,4]: dmrbits = dmrbits[0:116] + _target_status[_target['TS']]['TX_EMB_LC'][_dtype_vseq] + dmrbits[148:264] @@ -1168,7 +1160,7 @@ class routerOBP(OPENBRIDGE): systems[_d_system].send_system(_tmp_data) logger.debug('(%s) UNIT Data Bridged to HBP on slot 1: %s DST_ID: %s',self._system,_d_system,_int_dst_id) if CONFIG['REPORTS']['REPORT']: - systems[_d_system]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + systems[_d_system]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{},{},{},{},{},{}'.format(_d_system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), 1, _int_dst_id).encode(encoding='utf-8', errors='ignore')) def sendDataToOBP(self,_target,_data,dmrpkt,pkt_time,_stream_id,_dst_id,_peer_id,_rf_src,_bits,_slot,_hops = b'',_source_server = b'\x00\x00\x00\x00', _ber = b'\x00', _rssi = b'\x00', _source_rptr = b'\x00\x00\x00\x00'): @@ -1189,9 +1181,7 @@ class routerOBP(OPENBRIDGE): 'RFS': _rf_src, 'TGID': _dst_id, 'RX_PEER': _peer_id, - 'packets': 0, - '_source_server' : _source_server, - '_source_rptr' : _source_rptr + 'packets': 0 } # Record the time of this packet so we can later identify a stale stream @@ -1209,7 +1199,8 @@ class routerOBP(OPENBRIDGE): systems[_target].send_system(_tmp_data,_hops,_ber,_rssi, _source_server, _source_rptr) logger.debug('(%s) UNIT Data Bridged to OBP System: %s DST_ID: %s', self._system, _target,_int_dst_id) if CONFIG['REPORTS']['REPORT']: - systems[_target]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + systems[_target]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{},{},{},{},{},{}'.format(_target, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), 1, _int_dst_id).encode(encoding='utf-8', errors='ignore')) + def dmrd_received(self, _peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data,_hash, _hops = b'', _source_server = b'\x00\x00\x00\x00', _ber = b'\x00', _rssi = b'\x00', _source_rptr = b'\x00\x00\x00\x00'): @@ -1249,9 +1240,7 @@ class routerOBP(OPENBRIDGE): 'lastData': False, 'RX_PEER': _peer_id, 'packets': 0, - 'crcs': set(), - 'source_server' : _source_server, - 'source_rptr' : _source_rptr + 'crcs': set() } @@ -1300,22 +1289,22 @@ class routerOBP(OPENBRIDGE): logger.info('(%s) *UNIT CSBK* STREAM ID: %s, RPTR: %s SUB: %s (%s) PEER: %s (%s) DST_ID %s (%s), TS %s, SRC: %s, RPTR: %s', \ self._system, int_id(_stream_id), self.get_rptr(_source_rptr), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot, int_id(_source_server),int_id(_source_rptr)) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('UNIT CSBK,DATA,RX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + self._report.send_bridgeEvent('UNIT CSBK,DATA,RX,{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id)).encode(encoding='utf-8', errors='ignore')) elif _dtype_vseq == 6: logger.info('(%s) *UNIT DATA HEADER* STREAM ID: %s, RPTR: %s SUB: %s (%s) PEER: %s (%s) DST_ID %s (%s), TS %s, SRC: %s, RPTR: %s', \ self._system, int_id(_stream_id),self.get_rptr(_source_rptr), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot,int_id(_source_server),int_id(_source_rptr)) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('UNIT DATA HEADER,DATA,RX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + self._report.send_bridgeEvent('UNIT DATA HEADER,DATA,RX,{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id)).encode(encoding='utf-8', errors='ignore')) elif _dtype_vseq == 7: logger.info('(%s) *UNIT VCSBK 1/2 DATA BLOCK * STREAM ID: %s, RPTR: %s SUB: %s (%s) PEER: %s (%s) TGID %s (%s), TS %s, SRC: %s, RPTR: %s', \ self._system, int_id(_stream_id), self.get_rptr(_source_rptr), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot, int_id(_source_server),int_id(_source_rptr)) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('UNIT VCSBK 1/2 DATA BLOCK,DATA,RX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + self._report.send_bridgeEvent('UNIT VCSBK 1/2 DATA BLOCK,DATA,RX,{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id)).encode(encoding='utf-8', errors='ignore')) elif _dtype_vseq == 8: logger.info('(%s) *UNIT VCSBK 3/4 DATA BLOCK * STREAM ID: %s, RPTR: %s, SUB: %s (%s) PEER: %s (%s) TGID %s (%s), TS %s, SRC: %s, RPTR: %s', \ self._system, int_id(_stream_id), self.get_rptr(_source_rptr), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot,int_id(_source_server),int_id(_source_rptr)) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('UNIT VCSBK 3/4 DATA BLOCK,DATA,RX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + self._report.send_bridgeEvent('UNIT VCSBK 3/4 DATA BLOCK,DATA,RX,{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id)).encode(encoding='utf-8', errors='ignore')) else: logger.info('(%s) *UNKNOWN DATA TYPE* STREAM ID: %s, RPTR: %s, SUB: %s (%s) PEER: %s (%s) TGID %s (%s), TS %s, SRC: %s, RPTR: %s', \ self._system, int_id(_stream_id), self.get_rptr(_source_rptr), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot,int_id(_source_server),int_id(_source_rptr)) @@ -1398,9 +1387,7 @@ class routerOBP(OPENBRIDGE): 'RX_PEER': _peer_id, 'packets': 0, 'loss': 0, - 'crcs': set(), - 'source_server' : _source_server, - 'source_rptr' : _source_rptr + 'crcs': set() } @@ -1420,8 +1407,7 @@ class routerOBP(OPENBRIDGE): logger.info('(%s) *CALL START* STREAM ID: %s, SUB: %s (%s), RPTR: %s (%s), PEER: %s (%s) TGID %s (%s), TS %s, SRC: %s, HOPS %s', self._system, int_id(_stream_id),get_alias(_rf_src, subscriber_ids),int_id(_rf_src),self.get_rptr(_source_rptr), int_id(_source_rptr), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot,int_id(_source_server),_inthops) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('GROUP VOICE,START,RX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) - + self._report.send_bridgeEvent('GROUP VOICE,START,RX,{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id)).encode(encoding='utf-8', errors='ignore')) else: @@ -1556,9 +1542,8 @@ class routerOBP(OPENBRIDGE): logger.info('(%s) *CALL END* STREAM ID: %s SUB: %s (%s) PEER: %s (%s) TGID %s (%s), TS %s, Duration: %.2f, Packet rate: %.2f/s, Loss: %.2f%%', \ self._system, int_id(_stream_id), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot, call_duration, packet_rate,loss) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), call_duration,int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) - - self.STATUS[_stream_id]['_fin'] = True + self._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), call_duration).encode(encoding='utf-8', errors='ignore')) + self.STATUS[_stream_id]['_fin'] = True self.STATUS[_stream_id]['lastSeq'] = False @@ -1630,9 +1615,7 @@ class routerHBP(HBSYSTEM): 'lastData': False, 'packets': 0, 'crcs': set(), - '_allStarMode': False, - 'source_server' : False, - 'source_rptr' : False + '_allStarMode': False } } @@ -1680,9 +1663,7 @@ class routerHBP(HBSYSTEM): 'CONTENTION':False, 'RFS': _rf_src, 'TGID': _dst_id, - 'RX_PEER': _peer_id, - 'source_server' : _source_server, - 'source_rptr' : _source_rptr + 'RX_PEER': _peer_id } # Generate LCs (full and EMB) for the TX stream dst_lc = b''.join([self.STATUS[_slot]['RX_LC'][0:3], _target['TGID'], _rf_src]) @@ -1715,7 +1696,7 @@ class routerHBP(HBSYSTEM): dmrbits = _target_status[_stream_id]['T_LC'][0:98] + dmrbits[98:166] + _target_status[_stream_id]['T_LC'][98:197] if CONFIG['REPORTS']['REPORT']: call_duration = pkt_time - _target_status[_stream_id]['START'] - systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,END,TX,{},{},{},{},{},{},{:.2f},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']), call_duration,int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,END,TX,{},{},{},{},{},{},{:.2f}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']), call_duration).encode(encoding='utf-8', errors='ignore')) # Create a Burst B-E packet (Embedded LC) elif _dtype_vseq in [1,2,3,4]: dmrbits = dmrbits[0:116] + _target_status[_stream_id]['EMB_LC'][_dtype_vseq] + dmrbits[148:264] @@ -1757,8 +1738,6 @@ class routerHBP(HBSYSTEM): _target_status[_target['TS']]['TX_STREAM_ID'] = _stream_id _target_status[_target['TS']]['TX_RFS'] = _rf_src _target_status[_target['TS']]['TX_PEER'] = _peer_id - _target_status[_target['TS']]['source_server'] = _source_server - _target_status[_target['TS']]['source_rptr'] = _source_rptr # Generate LCs (full and EMB) for the TX stream dst_lc = b''.join([self.STATUS[_slot]['RX_LC'][0:3],_target['TGID'],_rf_src]) _target_status[_target['TS']]['TX_H_LC'] = bptc.encode_header_lc(dst_lc) @@ -1767,7 +1746,7 @@ class routerHBP(HBSYSTEM): logger.debug('(%s) Generating TX FULL and EMB LCs for HomeBrew destination: System: %s, TS: %s, TGID: %s', self._system, _target['SYSTEM'], _target['TS'], int_id(_target['TGID'])) logger.debug('(%s) Conference Bridge: %s, Call Bridged to HBP System: %s TS: %s, TGID: %s', self._system, _bridge, _target['SYSTEM'], _target['TS'], int_id(_target['TGID'])) if CONFIG['REPORTS']['REPORT']: - systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,START,TX,{},{},{},{},{},{:.2f},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']),int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,START,TX,{},{},{},{},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID'])).encode(encoding='utf-8', errors='ignore')) # Set other values for the contention handler to test next time there is a frame to forward _target_status[_target['TS']]['TX_TIME'] = pkt_time @@ -1795,7 +1774,7 @@ class routerHBP(HBSYSTEM): dmrbits = _target_status[_target['TS']]['TX_T_LC'][0:98] + dmrbits[98:166] + _target_status[_target['TS']]['TX_T_LC'][98:197] if CONFIG['REPORTS']['REPORT']: call_duration = pkt_time - _target_status[_target['TS']]['TX_START'] - systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,END,TX,{},{},{},{},{},{},{:.2f},{},{}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']), call_duration,int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + systems[_target['SYSTEM']]._report.send_bridgeEvent('GROUP VOICE,END,TX,{},{},{},{},{},{},{:.2f}'.format(_target['SYSTEM'], int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _target['TS'], int_id(_target['TGID']), call_duration).encode(encoding='utf-8', errors='ignore')) # Create a Burst B-E packet (Embedded LC) elif _dtype_vseq in [1,2,3,4]: dmrbits = dmrbits[0:116] + _target_status[_target['TS']]['TX_EMB_LC'][_dtype_vseq] + dmrbits[148:264] @@ -1813,16 +1792,13 @@ class routerHBP(HBSYSTEM): def sendDataToHBP(self,_d_system,_d_slot,_dst_id,_tmp_bits,_data,dmrpkt,_rf_src,_stream_id,_peer_id): #Assemble transmit HBP packet header - _source_server = self._CONFIG['GLOBAL']['SERVER_ID'] - _source_rptr = _peer_id _int_dst_id = int_id(_dst_id) _tmp_data = b''.join([_data[:15], _tmp_bits.to_bytes(1, 'big'), _data[16:20]]) _tmp_data = b''.join([_tmp_data, dmrpkt]) systems[_d_system].send_system(_tmp_data,None) logger.debug('(%s) UNIT Data Bridged to HBP on slot 1: %s DST_ID: %s',self._system,_d_system,_int_dst_id) if CONFIG['REPORTS']['REPORT']: - systems[_d_system]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{},{},{},{},{},{},{},{}'.format(_d_system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src),1, _int_dst_id,int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) - + systems[_d_system]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{},{},{},{},{},{}'.format(_d_system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), 1, _int_dst_id).encode(encoding='utf-8', errors='ignore')) def sendDataToOBP(self,_target,_data,dmrpkt,pkt_time,_stream_id,_dst_id,_peer_id,_rf_src,_bits,_slot,_hops = b'',_ber = b'\x00', _rssi = b'\x00',_source_server = b'\x00\x00\x00\x00', _source_rptr = b'\x00\x00\x00\x00'): # _sysIgnore = sysIgnore @@ -1846,9 +1822,7 @@ class routerHBP(HBSYSTEM): 'CONTENTION':False, 'RFS': _rf_src, 'TGID': _dst_id, - 'RX_PEER': _peer_id, - 'source_server' : _source_server, - 'source_rptr' : _source_rptr + 'RX_PEER': _peer_id } # Record the time of this packet so we can later identify a stale stream @@ -1866,7 +1840,7 @@ class routerHBP(HBSYSTEM): systems[_target].send_system(_tmp_data,b'',_ber,_rssi,_source_server,_source_rptr) logger.debug('(%s) UNIT Data Bridged to OBP System: %s DST_ID: %s', self._system, _target,_int_dst_id) if CONFIG['REPORTS']['REPORT']: - systems[system]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{},{},{},{},{},{},{},{}'.format(_target, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), 1, _int_dst_id, int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + systems[system]._report.send_bridgeEvent('UNIT DATA,DATA,TX,{},{},{},{},{},{}'.format(_target, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), 1, _int_dst_id).encode(encoding='utf-8', errors='ignore')) def dmrd_received(self, _peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data): @@ -1879,10 +1853,8 @@ class routerHBP(HBSYSTEM): _bits = _data[15] _source_server = self._CONFIG['GLOBAL']['SERVER_ID'] - self.STATUS[_slot]['source_server'] = _source_server _source_rptr = _peer_id - self.STATUS[_slot]['source_rptr'] = _source_rptr #_pkt_crc = Crc32.calc(_data[4:53]) #_pkt_crc = hash(_data).digest() @@ -2232,8 +2204,6 @@ class routerHBP(HBSYSTEM): self.STATUS[_slot]['packets'] = 0 self.STATUS[_slot]['loss'] = 0 self.STATUS[_slot]['crcs'] = set() - self.STATUS[_slot]['_source_server'] = _source_server - self.STATUS[_slot]['_source_rptr'] = _source_rptr if (self.STATUS[_slot]['RX_TYPE'] != HBPF_SLT_VTERM) and (pkt_time < (self.STATUS[_slot]['RX_TIME'] + STREAM_TO)) and (_rf_src != self.STATUS[_slot]['RX_RFS']): logger.warning('(%s) Packet received with STREAM ID: %s SUB: %s PEER: %s TGID %s, SLOT %s collided with existing call', self._system, int_id(_stream_id), int_id(_rf_src), int_id(_peer_id), int_id(_dst_id), _slot) @@ -2253,13 +2223,12 @@ class routerHBP(HBSYSTEM): logger.info('(%s) *CALL START* STREAM ID: %s SUB: %s (%s) PEER: %s (%s) TGID %s (%s), TS %s', \ self._system, int_id(_stream_id), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('GROUP VOICE,START,RX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) - + self._report.send_bridgeEvent('GROUP VOICE,START,RX,{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id)).encode(encoding='utf-8', errors='ignore')) else: logger.info('(%s) *VCSBK* STREAM ID: %s SUB: %s (%s) PEER: %s (%s) TGID %s (%s), TS %s _dtype_vseq: %s', self._system, int_id(_stream_id), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot, _dtype_vseq) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('OTHER DATA,DATA,RX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + self._report.send_bridgeEvent('OTHER DATA,DATA,RX,{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id)).encode(encoding='utf-8', errors='ignore')) # If we can, use the LC from the voice header as to keep all options intact if _frame_type == HBPF_DATA_SYNC and _dtype_vseq == HBPF_SLT_VHEAD: @@ -2283,12 +2252,12 @@ class routerHBP(HBSYSTEM): logger.info('(%s) *VCSBK 1/2 DATA BLOCK * STREAM ID: %s SUB: %s (%s) PEER: %s (%s) TGID %s (%s), TS %s', \ self._system, int_id(_stream_id), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('VCSBK 1/2 DATA BLOCK,DATA,RX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + self._report.send_bridgeEvent('VCSBK 1/2 DATA BLOCK,DATA,RX,{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id)).encode(encoding='utf-8', errors='ignore')) elif _dtype_vseq == 8: logger.info('(%s) *VCSBK 3/4 DATA BLOCK * STREAM ID: %s SUB: %s (%s) PEER: %s (%s) TGID %s (%s), TS %s', \ self._system, int_id(_stream_id), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('VCSBK 3/4 DATA BLOCK,DATA,RX,{},{},{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), int_id(_source_server), int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) + self._report.send_bridgeEvent('VCSBK 3/4 DATA BLOCK,DATA,RX,{},{},{},{},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id)).encode(encoding='utf-8', errors='ignore')) #Packet rate limit #Rate drop @@ -2387,9 +2356,7 @@ class routerHBP(HBSYSTEM): logger.info('(%s) *CALL END* STREAM ID: %s SUB: %s (%s) PEER: %s (%s) TGID %s (%s), TS %s, Duration: %.2f, Packet rate: %.2f/s, LOSS: %.2f%%', \ self._system, int_id(_stream_id), get_alias(_rf_src, subscriber_ids), int_id(_rf_src), get_alias(_peer_id, peer_ids), int_id(_peer_id), get_alias(_dst_id, talkgroup_ids), int_id(_dst_id), _slot, call_duration, packet_rate, loss) if CONFIG['REPORTS']['REPORT']: - self._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f},{},{}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), call_duration,int_id(_source_server),int_id(_source_rptr)).encode(encoding='utf-8', errors='ignore')) - - + self._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f}'.format(self._system, int_id(_stream_id), int_id(_peer_id), int_id(_rf_src), _slot, int_id(_dst_id), call_duration).encode(encoding='utf-8', errors='ignore')) #Reset back to False self.STATUS[_slot]['lastSeq'] = False diff --git a/docker-configs/Dockerfile-proxy b/docker-configs/Dockerfile-proxy index 30ecca2..898029a 100644 --- a/docker-configs/Dockerfile-proxy +++ b/docker-configs/Dockerfile-proxy @@ -25,7 +25,6 @@ RUN adduser -D -u 54000 radio && \ cd /opt && \ git clone https://gitlab.hacknix.net/hacknix/FreeDMR.git freedmr && \ cd /opt/freedmr && \ - git checkout extrastats && \ pip install --no-cache-dir -r requirements.txt && \ apk del git gcc musl-dev && \ chown -R radio: /opt/freedmr diff --git a/report_sql.py b/report_sql.py index 6fe3435..92ccf99 100644 --- a/report_sql.py +++ b/report_sql.py @@ -68,12 +68,10 @@ class reportClient(NetstringReceiver): 'subid' : datalist[6], 'slot' : datalist[7], 'dstid' : datalist[8], - 'duration' : 0, - 'source_server': datalist[-2], - 'source_rptr': datalist[-1] + 'duration' : 0 } - if len(datalist) > 11: + if len(datalist) > 9: event['duration'] = datalist[9] @@ -88,10 +86,10 @@ class reportClient(NetstringReceiver): except mysql.connector.Error as err: print('(MYSQL) error on reconnect: {}'.format(err)) - print("{} {} {} {} {} {} {} {} {} {} {} {}".format(event['type'],event['event'], event['trx'],event['system'],event['streamid'],event['peerid'],event['subid'],event['slot'],event['dstid'],event['duration'], event['source_server'],event['source_rptr'])) + print("{} {} {} {} {} {} {} {} {}".format(event['type'],event['event'], event['trx'],event['system'],event['streamid'],event['peerid'],event['subid'],event['slot'],event['dstid'],event['duration'])) _cursor = self.db.cursor() try: - _cursor.execute("insert into feed values (NULL,'{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}')".format(event['type'],event['event'], event['trx'],event['system'],event['streamid'],event['peerid'],event['subid'],event['slot'],event['dstid'],event['duration'],event['source_server'],event['source_rptr'])) + _cursor.execute("insert into feed values (NULL,'{}','{}','{}','{}','{}','{}','{}','{}','{}','{}')".format(event['type'],event['event'], event['trx'],event['system'],event['streamid'],event['peerid'],event['subid'],event['slot'],event['dstid'],event['duration'])) self.db.commit() except mysql.connector.Error as err: _cursor.close() From 7bf2a91668f690dcbbe037400e2cb980b00d5e56 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 19 Sep 2022 14:26:47 +0100 Subject: [PATCH 67/80] ex --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6ef8f26..a8c427d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -44,7 +44,7 @@ build-extrastats: # This job runs in the build stage, which runs first. - echo "Compile complete." only: - - extrastats + - extrastats2 build-testing: # This job runs in the build stage, which runs first. stage: build From 20c91fb0f824428f165dd806b057704b27f43bd8 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 21 Sep 2022 18:34:24 +0100 Subject: [PATCH 68/80] Update for new docker dash --- docker-configs/docker-compose.yml | 38 ++++++++++++------------------- 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/docker-configs/docker-compose.yml b/docker-configs/docker-compose.yml index c4c3738..3779114 100644 --- a/docker-configs/docker-compose.yml +++ b/docker-configs/docker-compose.yml @@ -52,45 +52,35 @@ services: #- FDPROXY_LISTENPORT=62031 read_only: "true" - freedmrmon: - container_name: freedmrmon + freedmrmonitor2: + container_name: freedmrmonitor2 cpu_shares: 512 depends_on: - freedmr - volumes: - #This should be kept to a manageable size from - #cron or logrotate outisde of the container. - - '/var/log/FreeDMRmonitor/:/opt/FreeDMRmonitor/log/' - #Write JSON files outside of container - - '/etc/freedmr/json/:/opt/FreeDMRmonitor/json/' - - #Override config file - # - '/etc/freedmr/config.py:/opt/FreeDMRmonitor/config.py' - ports: - - '9000:9000/tcp' - image: 'hacknix/freedmrmonitor:latest' + image: 'gitlab.hacknix.net:5050/freedmr/freedmrmonitor2/freedmrmonitor2:monitor-latest' restart: "unless-stopped" networks: app_net: ipv4_address: 172.16.238.20 - - freedmrmonpache: + read_only: "true" + logging: + driver: json-file + + + freedmrmonapache: container_name: freedmrmonapache cpu_shares: 512 depends_on: - - freedmrmon - #Use to override html files - #And images - #volumes: - # - '/var/www/html/:/var/www/html/' - # - '/var/www/html/images/:/var/www/html/images/' + - freedmrmonitor2 ports: - - '80:80/tcp' - image: hacknix/freedmrmonitor-apache:latest + - '8080:80/tcp' + image: 'gitlab.hacknix.net:5050/freedmr/freedmrmonitor2/freedmrmonitor2:apache-latest' restart: "unless-stopped" networks: app_net: ipv4_address: 172.16.238.30 + logging: + driver: json-file networks: app_net: From 9bf4076fa1d8e97868ff149e1cd3c955f343e1ba Mon Sep 17 00:00:00 2001 From: Jon Lee Date: Fri, 23 Sep 2022 09:37:54 +0000 Subject: [PATCH 69/80] Update docker-compose.yml --- docker-configs/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-configs/docker-compose.yml b/docker-configs/docker-compose.yml index 3779114..23aefa3 100644 --- a/docker-configs/docker-compose.yml +++ b/docker-configs/docker-compose.yml @@ -52,7 +52,7 @@ services: #- FDPROXY_LISTENPORT=62031 read_only: "true" - freedmrmonitor2: + freedmrmonitor2: container_name: freedmrmonitor2 cpu_shares: 512 depends_on: From 56a530b675aa6f472fbd865e5d563627a97377a2 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 23 Sep 2022 16:12:45 +0100 Subject: [PATCH 70/80] fix installer --- docker-configs/docker-compose_install.sh | 92 +++++++++++++++--------- 1 file changed, 58 insertions(+), 34 deletions(-) diff --git a/docker-configs/docker-compose_install.sh b/docker-configs/docker-compose_install.sh index f1a2bc1..2630777 100644 --- a/docker-configs/docker-compose_install.sh +++ b/docker-configs/docker-compose_install.sh @@ -21,12 +21,33 @@ echo FreeDMR Docker installer... echo Installing required packages... -apt-get -y install docker.io && +echo Install Docker Community Edition... +apt-get -y remove docker docker-engine docker.io && +apt-get -y update && +apt-get -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common && +curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - && +add-apt-repository \ + "deb [arch=amd64] https://download.docker.com/linux/debian \ + $(lsb_release -cs) \ + stable" && +apt-get -y update && +apt-get -y install docker-ce && + +echo Install Docker Compose... apt-get -y install docker-compose && -apt-get -y install conntrack && echo Set userland-proxy to false... -echo '{ "userland-proxy": false}' > /etc/docker/daemon.json && +cat < /etc/docker/daemon.json && +{ + "userland-proxy": false, + "experimental": true, + "log-driver": "json-file", + "log-opts": { + "max-size": "10m", + "max-file": "3" + } +} +EOF echo Restart docker... systemctl restart docker && @@ -54,6 +75,8 @@ GEN_STAT_BRIDGES: True ALLOW_NULL_PASSPHRASE: True ANNOUNCEMENT_LANGUAGES: SERVER_ID: 0 +DATA_GATEWAY: False +VALIDATE_SERVER_IDS: True [REPORTS] @@ -63,8 +86,8 @@ REPORT_PORT: 4321 REPORT_CLIENTS: * [LOGGER] -LOG_FILE: log/freedmr.log -LOG_HANDLERS: file-timed +LOG_FILE: /dev/null +LOG_HANDLERS: console-timed LOG_LEVEL: INFO LOG_NAME: FreeDMR @@ -74,21 +97,25 @@ PATH: ./json/ PEER_FILE: peer_ids.json SUBSCRIBER_FILE: subscriber_ids.json TGID_FILE: talkgroup_ids.json -PEER_URL: https://www.radioid.net/static/rptrs.json -SUBSCRIBER_URL: http://downloads.freedmr.uk/downloads/local_subscriber_ids.json -TGID_URL: TGID_URL: https://freedmr.cymru/talkgroups/talkgroup_ids_json.php +PEER_URL: http://freedmr-lh.gb7fr.org.uk/json/peer_ids.json +SUBSCRIBER_URL: http://freedmr-lh.gb7fr.org.uk/json/subscriber_ids.json +TGID_URL: http://freedmr-lh.gb7fr.org.uk/talkgroup_ids.json +LOCAL_SUBSCRIBER_FILE: local_subscriber_ids.json STALE_DAYS: 1 -LOCAL_SUBSCRIBER_FILE: local_subcriber_ids.json SUB_MAP_FILE: sub_map.pkl +SERVER_ID_URL: http://freedmr-lh.gb7fr.org.uk/json/server_ids.tsv +SERVER_ID_FILE: server_ids.tsv +TOPO_FILE: topography.json + -[MYSQL] -USE_MYSQL: False -USER: hblink -PASS: mypassword -DB: hblink -SERVER: 127.0.0.1 -PORT: 3306 -TABLE: repeaters +#Control server shared allstar instance via dial / AMI +[ALLSTAR] +ENABLED: false +USER:admin +PASS: password +SERVER: asl.example.com +PORT: 5038 +NODE: 11111 [OBP-TEST] MODE: OPENBRIDGE @@ -132,6 +159,7 @@ ANNOUNCEMENT_LANGUAGE: en_GB GENERATOR: 100 ALLOW_UNREG_ID: False PROXY_CONTROL: True +OVERRIDE_IDENT_TG: [ECHO] MODE: PEER @@ -173,28 +201,24 @@ echo "BRIDGES = {'9990': [{'SYSTEM': 'ECHO', 'TS': 2, 'TGID': 9990, 'ACTIVE': Tr echo Set perms on config directory... chown -R 54000 /etc/freedmr && -echo Setup logging... -mkdir -p /var/log/freedmr && -touch /var/log/freedmr/freedmr.log && -chown -R 54000 /var/log/freedmr && -mkdir -p /var/log/FreeDMRmonitor && -touch /var/log/FreeDMRmonitor/lastheard.log && -touch /var/log/FreeDMRmonitor/hbmon.log && -chown -R 54001 /var/log/FreeDMRmonitor && - echo Get docker-compose.yml... cd /etc/freedmr && curl https://gitlab.hacknix.net/hacknix/FreeDMR/-/raw/master/docker-configs/docker-compose.yml -o docker-compose.yml && -echo Install crontab... -cat << EOF > /etc/cron.daily/lastheard -#!/bin/bash -mv /var/log/FreeDMRmonitor/lastheard.log /var/log/FreeDMRmonitor/lastheard.log.save -/usr/bin/tail -150 /var/log/FreeDMRmonitor/lastheard.log.save > /var/log/FreeDMRmonitor/lastheard.log -mv /var/log/FreeDMRmonitor/lastheard.log /var/log/FreeDMRmonitor/lastheard.log.save -/usr/bin/tail -150 /var/log/FreeDMRmonitor/lastheard.log.save > /var/log/FreeDMRmonitor/lastheard.log -EOF + chmod 755 /etc/cron.daily/lastheard +echo Tune network stack... +cat << EOF > /etc/sysctl.conf && +net.core.rmem_default=134217728 +net.core.rmem_max=134217728 +net.core.wmem_max=134217728 +net.core.rmem_default=134217728 +net.core.netdev_max_backlog=250000 +net.netfilter.nf_conntrack_udp_timeout=15 +net.netfilter.nf_conntrack_udp_timeout_stream=35 +EOF + +/usr/sbin/sysctl -p && echo Run FreeDMR container... docker-compose up -d From 48a078ea435bf1c657d05f691853d6e770f45202 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 23 Sep 2022 17:56:01 +0100 Subject: [PATCH 71/80] get arch for docker install --- docker-configs/docker-compose_install.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docker-configs/docker-compose_install.sh b/docker-configs/docker-compose_install.sh index 2630777..22d01f0 100644 --- a/docker-configs/docker-compose_install.sh +++ b/docker-configs/docker-compose_install.sh @@ -27,7 +27,7 @@ apt-get -y update && apt-get -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common && curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - && add-apt-repository \ - "deb [arch=amd64] https://download.docker.com/linux/debian \ + "deb [arch=`/usr/bin/arch`] https://download.docker.com/linux/debian \ $(lsb_release -cs) \ stable" && apt-get -y update && @@ -54,7 +54,9 @@ systemctl restart docker && echo Make config directory... mkdir /etc/freedmr && -chmod 755 /etc/freedmr && +mkdir -p /etc/freedmr/acme.sh && +mkdir -p /etc/freedmr/certs && +chmod -R 755 /etc/freedmr && echo make json directory... mkdir -p /etc/freedmr/json && From a31a79b3ec1d6c21cc4fec32e6cf134751273aad Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 23 Sep 2022 18:02:57 +0100 Subject: [PATCH 72/80] New TLS stuff in default docker-compose.yml --- docker-configs/docker-compose.yml | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/docker-configs/docker-compose.yml b/docker-configs/docker-compose.yml index 23aefa3..6454a89 100644 --- a/docker-configs/docker-compose.yml +++ b/docker-configs/docker-compose.yml @@ -67,15 +67,36 @@ services: driver: json-file - freedmrmonapache: + freedmrmonpache: container_name: freedmrmonapache cpu_shares: 512 depends_on: - freedmrmonitor2 + #where to store TLS certificates + #and acme.sh files + volumes: + - '/etc/freedmr/certs/:/opt/apachecerts/' + - '/etc/freedmr/acme.sh:/root/.acme.sh/' ports: - - '8080:80/tcp' + - '80:80/tcp' + - '443:443/tcp' image: 'gitlab.hacknix.net:5050/freedmr/freedmrmonitor2/freedmrmonitor2:apache-latest' restart: "unless-stopped" + environment: + #Set to 1 to enable TLS support + #you'll need to actually generate the certtificates too + #using these commands when the container is running: + + #docker exec -it freedmrmonapache gencert.sh + #docker-compose restart freedmrmonapache + + #This only needs to be done once - unless the files in the volumes above are deleted. + + #The container will handle renewing the certificates every 60 days. + + #Note -the gencert.sh script only works when the webserver is available on the default port 80 + #If it's on non-standard ports, you'll need to request the certificates manually. + - 'USE_TLS=1' networks: app_net: ipv4_address: 172.16.238.30 From 498789a79e78e632582f3c80cb0225153b12bd49 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 24 Sep 2022 12:12:26 +0100 Subject: [PATCH 73/80] Path to docker image --- docker-configs/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-configs/docker-compose.yml b/docker-configs/docker-compose.yml index 6454a89..a16282f 100644 --- a/docker-configs/docker-compose.yml +++ b/docker-configs/docker-compose.yml @@ -33,7 +33,7 @@ services: - '62031:62031/udp' #Change the below to inlude ports used for your OBP(s) - '62041:62041/udp' - image: 'hacknix/freedmr:latest' + image: 'gitlab.hacknix.net:5050/hacknix/freedmr:latest' restart: "unless-stopped" networks: app_net: From 88496a5e059832fcfe733d6bf11c0f23b2da6b6f Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 24 Sep 2022 13:15:08 +0100 Subject: [PATCH 74/80] Architecture discovery in installer --- docker-configs/docker-compose_install.sh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/docker-configs/docker-compose_install.sh b/docker-configs/docker-compose_install.sh index 22d01f0..938a9bd 100644 --- a/docker-configs/docker-compose_install.sh +++ b/docker-configs/docker-compose_install.sh @@ -26,8 +26,14 @@ apt-get -y remove docker docker-engine docker.io && apt-get -y update && apt-get -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common && curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - && +ARCH=`/usr/bin/arch` +echo "System architecture is $ARCH" +if [ "$ARCH" == "x86_64" ] +then + ARCH="amd64" +fi add-apt-repository \ - "deb [arch=`/usr/bin/arch`] https://download.docker.com/linux/debian \ + "deb [arch=$ARCH] https://download.docker.com/linux/debian \ $(lsb_release -cs) \ stable" && apt-get -y update && @@ -225,5 +231,5 @@ EOF echo Run FreeDMR container... docker-compose up -d - +echo Read notes in /etc/freedmr/docker-compose.yml to understand how to implement extra functionality. echo FreeDMR setup complete! From 2562e75eb9255b1c1f77538bd71de1640f799b77 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 25 Sep 2022 12:30:35 +0100 Subject: [PATCH 75/80] Fix tg url installer. Initial recreation of ipsc_proxy --- docker-configs/docker-compose_install.sh | 2 +- ipsc_proxy.py | 267 +++++++++++++++++++++++ 2 files changed, 268 insertions(+), 1 deletion(-) create mode 100644 ipsc_proxy.py diff --git a/docker-configs/docker-compose_install.sh b/docker-configs/docker-compose_install.sh index 938a9bd..70e76b6 100644 --- a/docker-configs/docker-compose_install.sh +++ b/docker-configs/docker-compose_install.sh @@ -107,7 +107,7 @@ SUBSCRIBER_FILE: subscriber_ids.json TGID_FILE: talkgroup_ids.json PEER_URL: http://freedmr-lh.gb7fr.org.uk/json/peer_ids.json SUBSCRIBER_URL: http://freedmr-lh.gb7fr.org.uk/json/subscriber_ids.json -TGID_URL: http://freedmr-lh.gb7fr.org.uk/talkgroup_ids.json +TGID_URL: http://freedmr-lh.gb7fr.org.uk/json/talkgroup_ids.json LOCAL_SUBSCRIBER_FILE: local_subscriber_ids.json STALE_DAYS: 1 SUB_MAP_FILE: sub_map.pkl diff --git a/ipsc_proxy.py b/ipsc_proxy.py new file mode 100644 index 0000000..82c7bfb --- /dev/null +++ b/ipsc_proxy.py @@ -0,0 +1,267 @@ +############################################################################### +# Copyright (C) 2020 Simon Adlem, G7RZU +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +############################################################################### + +from twisted.internet.protocol import DatagramProtocol +from twisted.internet import reactor, task +from time import time +from dmr_utils3.utils import int_id +import random +import ipaddress +import os +from setproctitle import setproctitle +from datetime import datetime + +# Does anybody read this stuff? There's a PEP somewhere that says I should do this. +__author__ = 'Simon Adlem - G7RZU' +__copyright__ = 'Copyright (c) Simon Adlem, G7RZU 2022' +__credits__ = 'Jon Lee, G4TSN; Norman Williams, M6NBP' +__license__ = 'GNU GPLv3' +__maintainer__ = 'Simon Adlem G7RZU' +__email__ = 'simon@gb7fr.org.uk' + +def IsIPv4Address(ip): + try: + ipaddress.IPv4Address(ip) + return True + except ValueError as errorCode: + pass + return False + +def IsIPv6Address(ip): + try: + ipaddress.IPv6Address(ip) + return True + except ValueError as errorCode: + pass + +class Proxy(DatagramProtocol): + + def __init__(self,Master,ListenPort,connTrack,peerTrack,blackList,IPBlackList,Timeout,Debug,ClientInfo,DestportStart,DestPortEnd): + self.master = Master + self.connTrack = connTrack + self.peerTrack = peerTrack + self.timeout = Timeout + self.debug = Debug + self.clientinfo = ClientInfo + self.blackList = blackList + self.IPBlackList = IPBlackList + self.destPortStart = DestportStart + self.destPortEnd = DestPortEnd + self.numPorts = DestPortEnd - DestportStart + + + def reaper(self,_peer_id): + if self.debug: + print("dead",_peer_id) + if self.clientinfo and _peer_id != b'\xff\xff\xff\xff': + print(f"{datetime.now().replace(microsecond=0)} Client: ID:{str(int_id(_peer_id)).rjust(9)} IP:{self.peerTrack[_peer_id]['shost'].rjust(15)} Port:{self.peerTrack[_peer_id]['sport']} Removed.") + self.connTrack[self.peerTrack[_peer_id]['dport']] = False + del self.peerTrack[_peer_id] + + def datagramReceived(self, data, addr): + + _peer_id = False + + host,port = addr + + nowtime = time() + + Debug = self.debug + + if host in self.IPBlackList: + return + + #If the packet comes from the master + if host == self.master: + + #fill this in + _peer_id = data[0:0] + + if self.debug: + print(data) + if _peer_id in self.peerTrack: + self.transport.write(data,(self.peerTrack[_peer_id]['shost'],self.peerTrack[_peer_id]['sport'])) + # Remove the client after send a MSTN or MSTC packet + if _command in (MSTN,MSTC): + # Give time to the client for a reply to prevent port reassignment + self.peerTrack[_peer_id]['timer'].reset(15) + + return + + + else: + #fill this in + _peer_id = data[0:0] + + if _peer_id in self.peerTrack: + _dport = self.peerTrack[_peer_id]['dport'] + self.peerTrack[_peer_id]['sport'] = port + self.peerTrack[_peer_id]['shost'] = host + self.transport.write(data, (self.master,_dport)) + self.peerTrack[_peer_id]['timer'].reset(self.timeout) + if self.debug: + print(data) + return + + else: + if int_id(_peer_id) in self.blackList: + return + # Make a list with the available ports + _ports_avail = [port for port in self.connTrack if not self.connTrack[port]] + if _ports_avail: + _dport = random.choice(_ports_avail) + else: + return + self.connTrack[_dport] = _peer_id + self.peerTrack[_peer_id] = {} + self.peerTrack[_peer_id]['dport'] = _dport + self.peerTrack[_peer_id]['sport'] = port + self.peerTrack[_peer_id]['shost'] = host + self.peerTrack[_peer_id]['timer'] = reactor.callLater(self.timeout,self.reaper,_peer_id) + self.transport.write(data, (self.master,_dport)) + + if self.clientinfo: + print(f'{datetime.now().replace(microsecond=0)} New client: ID:{str(int_id(_peer_id)).rjust(9)} IP:{host.rjust(15)} Port:{port}, assigned to port:{_dport}.') + if self.debug: + print(data) + return + + +if __name__ == '__main__': + + import signal + import configparser + import argparse + import sys + import json + + #Set process title early + setproctitle(__file__) + + # Change the current directory to the location of the application + os.chdir(os.path.dirname(os.path.realpath(sys.argv[0]))) + + # CLI argument parser - handles picking up the config file from the command line, and sending a "help" message + parser = argparse.ArgumentParser() + parser.add_argument('-c', '--config', action='store', dest='CONFIG_FILE', help='/full/path/to/config.file (usually freedmr.cfg)') + cli_args = parser.parse_args() + + + # Ensure we have a path for the config file, if one wasn't specified, then use the execution directory + if not cli_args.CONFIG_FILE: + cli_args.CONFIG_FILE = os.path.dirname(os.path.abspath(__file__))+'/freedmr.cfg' + + _config_file = cli_args.CONFIG_FILE + + config = configparser.ConfigParser() + + if not config.read(_config_file): + print('Configuration file \''+_config_file+'\' is not a valid configuration file!') + + try: + + Master = config.get('PROXY','Master') + ListenPort = config.getint('PROXY','ListenPort') + ListenIP = config.get('PROXY','ListenIP') + DestportStart = config.getint('PROXY','DestportStart') + DestPortEnd = config.getint('PROXY','DestPortEnd') + Timeout = config.getint('PROXY','Timeout') + Stats = config.getboolean('PROXY','Stats') + Debug = config.getboolean('PROXY','Debug') + ClientInfo = config.getboolean('PROXY','ClientInfo') + BlackList = json.loads(config.get('PROXY','BlackList')) + IPBlackList = json.loads(config.get('PROXY','IPBlackList')) + + except configparser.Error as err: + print('Error processing configuration file -- {}'.format(err)) + + print('Using default config') +#*** CONFIG HERE *** + + Master = "127.0.0.1" + ListenPort = 62031 + #'' = all IPv4, '::' = all IPv4 and IPv6 (Dual Stack) + ListenIP = '' + DestportStart = 50000 + DestPortEnd = 50002 + Timeout = 30 + Stats = False + Debug = False + ClientInfo = False + BlackList = [1234567] + #e.g. {10.0.0.1: 0, 10.0.0.2: 0} + IPBlackList = {} + +#******************* + + CONNTRACK = {} + PEERTRACK = {} + + # Set up the signal handler + def sig_handler(_signal, _frame): + print('(GLOBAL) SHUTDOWN: PROXY IS TERMINATING WITH SIGNAL {}'.format(str(_signal))) + reactor.stop() + + # Set signal handers so that we can gracefully exit if need be + for sig in [signal.SIGINT, signal.SIGTERM]: + signal.signal(sig, sig_handler) + + #Override static config from Environment + if 'FDPROXY_STATS' in os.environ: + Stats = bool(os.environ['FDPROXY_STATS']) + #if 'FDPROXY_DEBUG' in os.environ: + # Debug = bool(os.environ['FDPROXY_DEBUG']) + if 'FDPROXY_CLIENTINFO' in os.environ: + ClientInfo = bool(os.environ['FDPROXY_CLIENTINFO']) + if 'FDPROXY_LISTENPORT' in os.environ: + ListenPort = int(os.environ['FDPROXY_LISTENPORT']) + + for port in range(DestportStart,DestPortEnd+1,1): + CONNTRACK[port] = False + + #If we are listening IPv6 and Master is an IPv4 IPv4Address + #IPv6ify the address. + if ListenIP == '::' and IsIPv4Address(Master): + Master = '::ffff:' + Master + + reactor.listenUDP(ListenPort,Proxy(Master,ListenPort,CONNTRACK,PEERTRACK,BlackList,IPBlackList,Timeout,Debug,ClientInfo,DestportStart,DestPortEnd),interface=ListenIP) + + def loopingErrHandle(failure): + print('(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) + + reactor.run() + From 6312699d073a3b75702e4d0fbba9096f4d0c43fd Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 25 Sep 2022 14:25:37 +0100 Subject: [PATCH 76/80] IPSC proxy basically working with one client --- ipsc_proxy.py | 69 ++++++++++++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 36 deletions(-) diff --git a/ipsc_proxy.py b/ipsc_proxy.py index 82c7bfb..7f40a0e 100644 --- a/ipsc_proxy.py +++ b/ipsc_proxy.py @@ -25,6 +25,7 @@ import ipaddress import os from setproctitle import setproctitle from datetime import datetime +#from ipsc_const import * # Does anybody read this stuff? There's a PEP somewhere that says I should do this. __author__ = 'Simon Adlem - G7RZU' @@ -68,7 +69,7 @@ class Proxy(DatagramProtocol): def reaper(self,_peer_id): if self.debug: print("dead",_peer_id) - if self.clientinfo and _peer_id != b'\xff\xff\xff\xff': + if self.clientinfo: print(f"{datetime.now().replace(microsecond=0)} Client: ID:{str(int_id(_peer_id)).rjust(9)} IP:{self.peerTrack[_peer_id]['shost'].rjust(15)} Port:{self.peerTrack[_peer_id]['sport']} Removed.") self.connTrack[self.peerTrack[_peer_id]['dport']] = False del self.peerTrack[_peer_id] @@ -89,24 +90,20 @@ class Proxy(DatagramProtocol): #If the packet comes from the master if host == self.master: - #fill this in - _peer_id = data[0:0] + _command = data[0:1] + _peer_id = data[1:5] if self.debug: print(data) if _peer_id in self.peerTrack: self.transport.write(data,(self.peerTrack[_peer_id]['shost'],self.peerTrack[_peer_id]['sport'])) - # Remove the client after send a MSTN or MSTC packet - if _command in (MSTN,MSTC): - # Give time to the client for a reply to prevent port reassignment - self.peerTrack[_peer_id]['timer'].reset(15) - + return else: - #fill this in - _peer_id = data[0:0] + _command = data[0:1] + _peer_id = data[1:5] if _peer_id in self.peerTrack: _dport = self.peerTrack[_peer_id]['dport'] @@ -175,17 +172,17 @@ if __name__ == '__main__': try: - Master = config.get('PROXY','Master') - ListenPort = config.getint('PROXY','ListenPort') - ListenIP = config.get('PROXY','ListenIP') - DestportStart = config.getint('PROXY','DestportStart') - DestPortEnd = config.getint('PROXY','DestPortEnd') - Timeout = config.getint('PROXY','Timeout') - Stats = config.getboolean('PROXY','Stats') - Debug = config.getboolean('PROXY','Debug') - ClientInfo = config.getboolean('PROXY','ClientInfo') - BlackList = json.loads(config.get('PROXY','BlackList')) - IPBlackList = json.loads(config.get('PROXY','IPBlackList')) + Master = config.get('IPSC_PROXY','Master') + ListenPort = config.getint('IPSC_PROXY','ListenPort') + ListenIP = config.get('IPSC_PROXY','ListenIP') + DestportStart = config.getint('IPSC_PROXY','DestportStart') + DestPortEnd = config.getint('IPSC_PROXY','DestPortEnd') + Timeout = config.getint('IPSC_PROXY','Timeout') + Stats = config.getboolean('IPSC_PROXY','Stats') + Debug = config.getboolean('IPSC_PROXY','Debug') + ClientInfo = config.getboolean('IPSC_PROXY','ClientInfo') + BlackList = json.loads(config.get('IPSC_PROXY','BlackList')) + IPBlackList = json.loads(config.get('IPSC_PROXY','IPBlackList')) except configparser.Error as err: print('Error processing configuration file -- {}'.format(err)) @@ -194,15 +191,15 @@ if __name__ == '__main__': #*** CONFIG HERE *** Master = "127.0.0.1" - ListenPort = 62031 + ListenPort = 55005 #'' = all IPv4, '::' = all IPv4 and IPv6 (Dual Stack) ListenIP = '' - DestportStart = 50000 - DestPortEnd = 50002 + DestportStart = 59000 + DestPortEnd = 59001 Timeout = 30 - Stats = False - Debug = False - ClientInfo = False + Stats = True + Debug = True + ClientInfo = True BlackList = [1234567] #e.g. {10.0.0.1: 0, 10.0.0.2: 0} IPBlackList = {} @@ -214,7 +211,7 @@ if __name__ == '__main__': # Set up the signal handler def sig_handler(_signal, _frame): - print('(GLOBAL) SHUTDOWN: PROXY IS TERMINATING WITH SIGNAL {}'.format(str(_signal))) + print('(GLOBAL) SHUTDOWN: IPSC_PROXY IS TERMINATING WITH SIGNAL {}'.format(str(_signal))) reactor.stop() # Set signal handers so that we can gracefully exit if need be @@ -222,14 +219,14 @@ if __name__ == '__main__': signal.signal(sig, sig_handler) #Override static config from Environment - if 'FDPROXY_STATS' in os.environ: - Stats = bool(os.environ['FDPROXY_STATS']) - #if 'FDPROXY_DEBUG' in os.environ: - # Debug = bool(os.environ['FDPROXY_DEBUG']) - if 'FDPROXY_CLIENTINFO' in os.environ: - ClientInfo = bool(os.environ['FDPROXY_CLIENTINFO']) - if 'FDPROXY_LISTENPORT' in os.environ: - ListenPort = int(os.environ['FDPROXY_LISTENPORT']) + if 'FDIPSC_PROXY_STATS' in os.environ: + Stats = bool(os.environ['FDIPSC_PROXY_STATS']) + #if 'FDIPSC_PROXY_DEBUG' in os.environ: + # Debug = bool(os.environ['FDIPSC_PROXY_DEBUG']) + if 'FDIPSC_PROXY_CLIENTINFO' in os.environ: + ClientInfo = bool(os.environ['FDIPSC_PROXY_CLIENTINFO']) + if 'FDIPSC_PROXY_LISTENPORT' in os.environ: + ListenPort = int(os.environ['FDIPSC_PROXY_LISTENPORT']) for port in range(DestportStart,DestPortEnd+1,1): CONNTRACK[port] = False From bff5f8a186092a27df9ee86555281f0674e71577 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 25 Sep 2022 15:24:35 +0100 Subject: [PATCH 77/80] remove ipsc_proxy - it has it's own repo --- ipsc_proxy.py | 264 -------------------------------------------------- 1 file changed, 264 deletions(-) delete mode 100644 ipsc_proxy.py diff --git a/ipsc_proxy.py b/ipsc_proxy.py deleted file mode 100644 index 7f40a0e..0000000 --- a/ipsc_proxy.py +++ /dev/null @@ -1,264 +0,0 @@ -############################################################################### -# Copyright (C) 2020 Simon Adlem, G7RZU -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -############################################################################### - -from twisted.internet.protocol import DatagramProtocol -from twisted.internet import reactor, task -from time import time -from dmr_utils3.utils import int_id -import random -import ipaddress -import os -from setproctitle import setproctitle -from datetime import datetime -#from ipsc_const import * - -# Does anybody read this stuff? There's a PEP somewhere that says I should do this. -__author__ = 'Simon Adlem - G7RZU' -__copyright__ = 'Copyright (c) Simon Adlem, G7RZU 2022' -__credits__ = 'Jon Lee, G4TSN; Norman Williams, M6NBP' -__license__ = 'GNU GPLv3' -__maintainer__ = 'Simon Adlem G7RZU' -__email__ = 'simon@gb7fr.org.uk' - -def IsIPv4Address(ip): - try: - ipaddress.IPv4Address(ip) - return True - except ValueError as errorCode: - pass - return False - -def IsIPv6Address(ip): - try: - ipaddress.IPv6Address(ip) - return True - except ValueError as errorCode: - pass - -class Proxy(DatagramProtocol): - - def __init__(self,Master,ListenPort,connTrack,peerTrack,blackList,IPBlackList,Timeout,Debug,ClientInfo,DestportStart,DestPortEnd): - self.master = Master - self.connTrack = connTrack - self.peerTrack = peerTrack - self.timeout = Timeout - self.debug = Debug - self.clientinfo = ClientInfo - self.blackList = blackList - self.IPBlackList = IPBlackList - self.destPortStart = DestportStart - self.destPortEnd = DestPortEnd - self.numPorts = DestPortEnd - DestportStart - - - def reaper(self,_peer_id): - if self.debug: - print("dead",_peer_id) - if self.clientinfo: - print(f"{datetime.now().replace(microsecond=0)} Client: ID:{str(int_id(_peer_id)).rjust(9)} IP:{self.peerTrack[_peer_id]['shost'].rjust(15)} Port:{self.peerTrack[_peer_id]['sport']} Removed.") - self.connTrack[self.peerTrack[_peer_id]['dport']] = False - del self.peerTrack[_peer_id] - - def datagramReceived(self, data, addr): - - _peer_id = False - - host,port = addr - - nowtime = time() - - Debug = self.debug - - if host in self.IPBlackList: - return - - #If the packet comes from the master - if host == self.master: - - _command = data[0:1] - _peer_id = data[1:5] - - if self.debug: - print(data) - if _peer_id in self.peerTrack: - self.transport.write(data,(self.peerTrack[_peer_id]['shost'],self.peerTrack[_peer_id]['sport'])) - - return - - - else: - _command = data[0:1] - _peer_id = data[1:5] - - if _peer_id in self.peerTrack: - _dport = self.peerTrack[_peer_id]['dport'] - self.peerTrack[_peer_id]['sport'] = port - self.peerTrack[_peer_id]['shost'] = host - self.transport.write(data, (self.master,_dport)) - self.peerTrack[_peer_id]['timer'].reset(self.timeout) - if self.debug: - print(data) - return - - else: - if int_id(_peer_id) in self.blackList: - return - # Make a list with the available ports - _ports_avail = [port for port in self.connTrack if not self.connTrack[port]] - if _ports_avail: - _dport = random.choice(_ports_avail) - else: - return - self.connTrack[_dport] = _peer_id - self.peerTrack[_peer_id] = {} - self.peerTrack[_peer_id]['dport'] = _dport - self.peerTrack[_peer_id]['sport'] = port - self.peerTrack[_peer_id]['shost'] = host - self.peerTrack[_peer_id]['timer'] = reactor.callLater(self.timeout,self.reaper,_peer_id) - self.transport.write(data, (self.master,_dport)) - - if self.clientinfo: - print(f'{datetime.now().replace(microsecond=0)} New client: ID:{str(int_id(_peer_id)).rjust(9)} IP:{host.rjust(15)} Port:{port}, assigned to port:{_dport}.') - if self.debug: - print(data) - return - - -if __name__ == '__main__': - - import signal - import configparser - import argparse - import sys - import json - - #Set process title early - setproctitle(__file__) - - # Change the current directory to the location of the application - os.chdir(os.path.dirname(os.path.realpath(sys.argv[0]))) - - # CLI argument parser - handles picking up the config file from the command line, and sending a "help" message - parser = argparse.ArgumentParser() - parser.add_argument('-c', '--config', action='store', dest='CONFIG_FILE', help='/full/path/to/config.file (usually freedmr.cfg)') - cli_args = parser.parse_args() - - - # Ensure we have a path for the config file, if one wasn't specified, then use the execution directory - if not cli_args.CONFIG_FILE: - cli_args.CONFIG_FILE = os.path.dirname(os.path.abspath(__file__))+'/freedmr.cfg' - - _config_file = cli_args.CONFIG_FILE - - config = configparser.ConfigParser() - - if not config.read(_config_file): - print('Configuration file \''+_config_file+'\' is not a valid configuration file!') - - try: - - Master = config.get('IPSC_PROXY','Master') - ListenPort = config.getint('IPSC_PROXY','ListenPort') - ListenIP = config.get('IPSC_PROXY','ListenIP') - DestportStart = config.getint('IPSC_PROXY','DestportStart') - DestPortEnd = config.getint('IPSC_PROXY','DestPortEnd') - Timeout = config.getint('IPSC_PROXY','Timeout') - Stats = config.getboolean('IPSC_PROXY','Stats') - Debug = config.getboolean('IPSC_PROXY','Debug') - ClientInfo = config.getboolean('IPSC_PROXY','ClientInfo') - BlackList = json.loads(config.get('IPSC_PROXY','BlackList')) - IPBlackList = json.loads(config.get('IPSC_PROXY','IPBlackList')) - - except configparser.Error as err: - print('Error processing configuration file -- {}'.format(err)) - - print('Using default config') -#*** CONFIG HERE *** - - Master = "127.0.0.1" - ListenPort = 55005 - #'' = all IPv4, '::' = all IPv4 and IPv6 (Dual Stack) - ListenIP = '' - DestportStart = 59000 - DestPortEnd = 59001 - Timeout = 30 - Stats = True - Debug = True - ClientInfo = True - BlackList = [1234567] - #e.g. {10.0.0.1: 0, 10.0.0.2: 0} - IPBlackList = {} - -#******************* - - CONNTRACK = {} - PEERTRACK = {} - - # Set up the signal handler - def sig_handler(_signal, _frame): - print('(GLOBAL) SHUTDOWN: IPSC_PROXY IS TERMINATING WITH SIGNAL {}'.format(str(_signal))) - reactor.stop() - - # Set signal handers so that we can gracefully exit if need be - for sig in [signal.SIGINT, signal.SIGTERM]: - signal.signal(sig, sig_handler) - - #Override static config from Environment - if 'FDIPSC_PROXY_STATS' in os.environ: - Stats = bool(os.environ['FDIPSC_PROXY_STATS']) - #if 'FDIPSC_PROXY_DEBUG' in os.environ: - # Debug = bool(os.environ['FDIPSC_PROXY_DEBUG']) - if 'FDIPSC_PROXY_CLIENTINFO' in os.environ: - ClientInfo = bool(os.environ['FDIPSC_PROXY_CLIENTINFO']) - if 'FDIPSC_PROXY_LISTENPORT' in os.environ: - ListenPort = int(os.environ['FDIPSC_PROXY_LISTENPORT']) - - for port in range(DestportStart,DestPortEnd+1,1): - CONNTRACK[port] = False - - #If we are listening IPv6 and Master is an IPv4 IPv4Address - #IPv6ify the address. - if ListenIP == '::' and IsIPv4Address(Master): - Master = '::ffff:' + Master - - reactor.listenUDP(ListenPort,Proxy(Master,ListenPort,CONNTRACK,PEERTRACK,BlackList,IPBlackList,Timeout,Debug,ClientInfo,DestportStart,DestPortEnd),interface=ListenIP) - - def loopingErrHandle(failure): - print('(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) - - reactor.run() - From b5eb9edea0e09ceb72892795ddf8b7771c269575 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 26 Oct 2022 01:34:59 +0100 Subject: [PATCH 78/80] Reduce stat timer --- bridge_master.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bridge_master.py b/bridge_master.py index eb8899a..717f3a3 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -2740,10 +2740,10 @@ if __name__ == '__main__': options = options_task.start(26) options.addErrback(loopingErrHandle) - #STAT trimmer - once every hour (roughly - shifted so all timed tasks don't run at once + #STAT trimmer - once every 10 mins (roughly - shifted so all timed tasks don't run at once if CONFIG['GLOBAL']['GEN_STAT_BRIDGES']: stat_trimmer_task = task.LoopingCall(statTrimmer) - stat_trimmer = stat_trimmer_task.start(3700)#3600 + stat_trimmer = stat_trimmer_task.start(523)#3600 stat_trimmer.addErrback(loopingErrHandle) #KA Reporting From 4398440c67ce1cb28bb875fa1ffe66fd592dad7e Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 31 Oct 2022 11:49:20 +0000 Subject: [PATCH 79/80] Move maint loop logging to TRACE level --- hblink.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hblink.py b/hblink.py index de5b253..f75c0fb 100755 --- a/hblink.py +++ b/hblink.py @@ -768,7 +768,7 @@ class HBSYSTEM(DatagramProtocol): # Aliased in __init__ to maintenance_loop if system is a master def master_maintenance_loop(self): - logger.debug('(%s) Master maintenance loop started', self._system) + logger.trace('(%s) Master maintenance loop started', self._system) remove_list = deque() for peer in self._peers: _this_peer = self._peers[peer] From 9ff99abc28d0384ea1ecd1fc0c560bea83907c22 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 31 Oct 2022 11:57:29 +0000 Subject: [PATCH 80/80] Move debugging of bridges to DEBUG from TRACE --- bridge_master.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bridge_master.py b/bridge_master.py index 717f3a3..ead1ef4 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -331,7 +331,7 @@ def rule_timer_loop(): _bridge_used = True logger.info('(ROUTER) Conference Bridge ACTIVE (ON timer running): System: %s Bridge: %s, TS: %s, TGID: %s, Timeout in: %.2fs,', _system['SYSTEM'], _bridge, _system['TS'], int_id(_system['TGID']), timeout_in) elif _system['ACTIVE'] == False: - logger.trace('(ROUTER) Conference Bridge INACTIVE (no change): System: %s Bridge: %s, TS: %s, TGID: %s', _system['SYSTEM'], _bridge, _system['TS'], int_id(_system['TGID'])) + logger.debug('(ROUTER) Conference Bridge INACTIVE (no change): System: %s Bridge: %s, TS: %s, TGID: %s', _system['SYSTEM'], _bridge, _system['TS'], int_id(_system['TGID'])) elif _system['TO_TYPE'] == 'OFF': if _system['ACTIVE'] == False: if _system['TIMER'] < _now: @@ -344,13 +344,13 @@ def rule_timer_loop(): logger.info('(ROUTER) Conference Bridge INACTIVE (OFF timer running): System: %s Bridge: %s, TS: %s, TGID: %s, Timeout in: %.2fs,', _system['SYSTEM'], _bridge, _system['TS'], int_id(_system['TGID']), timeout_in) elif _system['ACTIVE'] == True: _bridge_used = True - logger.trace('(ROUTER) Conference Bridge ACTIVE (no change): System: %s Bridge: %s, TS: %s, TGID: %s', _system['SYSTEM'], _bridge, _system['TS'], int_id(_system['TGID'])) + logger.debug('(ROUTER) Conference Bridge ACTIVE (no change): System: %s Bridge: %s, TS: %s, TGID: %s', _system['SYSTEM'], _bridge, _system['TS'], int_id(_system['TGID'])) else: if _system['SYSTEM'][0:3] != 'OBP': _bridge_used = True elif _system['SYSTEM'][0:3] == 'OBP' and _system['TO_TYPE'] == 'STAT': _bridge_used = True - logger.trace('(ROUTER) Conference Bridge NO ACTION: System: %s, Bridge: %s, TS: %s, TGID: %s', _system['SYSTEM'], _bridge, _system['TS'], int_id(_system['TGID'])) + logger.debug('(ROUTER) Conference Bridge NO ACTION: System: %s, Bridge: %s, TS: %s, TGID: %s', _system['SYSTEM'], _bridge, _system['TS'], int_id(_system['TGID'])) if _bridge_used == False: _remove_bridges.append(_bridge)