From 41e9351d7ea7fcccd07b17676abbb55a5e6c6d47 Mon Sep 17 00:00:00 2001 From: Cort Buffington Date: Fri, 9 Sep 2016 22:05:47 -0500 Subject: [PATCH 01/15] refactoring auth code --- bridge.py | 11 +------- dmrlink.py | 82 +++++++++++++++--------------------------------------- 2 files changed, 23 insertions(+), 70 deletions(-) diff --git a/bridge.py b/bridge.py index 266a718..889e5cf 100755 --- a/bridge.py +++ b/bridge.py @@ -303,10 +303,7 @@ class bridgeIPSC(IPSC): elif rule['DST_TS'] == 1: _burst_data_type = BURST_DATA_TYPE['SLOT2_VOICE'] _tmp_data = _tmp_data[:30] + _burst_data_type + _tmp_data[31:] - - # Calculate and append the authentication hash for the target network... if necessary - if NETWORK[_target]['LOCAL']['AUTH_ENABLED']: - _tmp_data = self.auth_hashed_packet(NETWORK[_target]['LOCAL']['AUTH_KEY'], _tmp_data) + # Send the packet to all peers in the target IPSC networks[_target].send_to_ipsc(_tmp_data) # @@ -395,9 +392,6 @@ class bridgeIPSC(IPSC): # Re-Write the IPSC SRC to match the target network's ID _tmp_data = _tmp_data.replace(_peerid, NETWORK[target]['LOCAL']['RADIO_ID']) - # Calculate and append the authentication hash for the target network... if necessary - if NETWORK[target]['LOCAL']['AUTH_ENABLED']: - _tmp_data = self.auth_hashed_packet(NETWORK[target]['LOCAL']['AUTH_KEY'], _tmp_data) # Send the packet to all peers in the target IPSC networks[target].send_to_ipsc(_tmp_data) @@ -411,9 +405,6 @@ class bridgeIPSC(IPSC): # Re-Write the IPSC SRC to match the target network's ID _tmp_data = _tmp_data.replace(_peerid, NETWORK[target]['LOCAL']['RADIO_ID']) - # Calculate and append the authentication hash for the target network... if necessary - if NETWORK[target]['LOCAL']['AUTH_ENABLED']: - _tmp_data = self.auth_hashed_packet(NETWORK[target]['LOCAL']['AUTH_KEY'], _tmp_data) # Send the packet to all peers in the target IPSC networks[target].send_to_ipsc(_tmp_data) diff --git a/dmrlink.py b/dmrlink.py index 7cce7ee..5f2262b 100755 --- a/dmrlink.py +++ b/dmrlink.py @@ -722,16 +722,6 @@ class IPSC(DatagramProtocol): # logger.error('(%s) IPSC Instance Could Not be Created... Exiting', self._network) sys.exit() - - # Choose which set of fucntions to use - authenticated or not - if self._local['AUTH_ENABLED']: - self.hashed_packet = self.auth_hashed_packet - self.strip_hash = self.auth_strip_hash - self.validate_auth = self.auth_validate_auth - else: - self.hashed_packet = self.unauth_hashed_packet - self.strip_hash = self.unauth_strip_hash - self.validate_auth = self.unauth_validate_auth #************************************************ @@ -776,6 +766,9 @@ class IPSC(DatagramProtocol): # Simple function to send packets - handy to have it all in one place for debugging # def send_packet(self, _packet, (_host, _port)): + if self._local['AUTH_ENABLED']: + _hash = binascii.a2b_hex((hmac_new(self._local['AUTH_KEY'],_packet,sha1)).hexdigest()[:20]) + _packet = _packet + _hash self.transport.write(_packet, (_host, _port)) # USE THE FOLLOWING ONLY UNDER DIRE CIRCUMSTANCES -- PERFORMANCE IS ADVERSLY AFFECTED! #logger.debug('(%s) TX Packet to %s on port %s: %s', self._network, _host, _port, h(_packet)) @@ -783,13 +776,16 @@ class IPSC(DatagramProtocol): # Accept a complete packet, ready to be sent, and send it to all active peers + master in an IPSC # def send_to_ipsc(self, _packet): + if self._local['AUTH_ENABLED']: + _hash = binascii.a2b_hex((hmac_new(self._local['AUTH_KEY'],_packet,sha1)).hexdigest()[:20]) + _packet = _packet + _hash # Send to the Master if self._master['STATUS']['CONNECTED']: - self.send_packet(_packet, (self._master['IP'], self._master['PORT'])) + self.transport.write(_packet, (self._master['IP'], self._master['PORT'])) # Send to each connected Peer for peer in self._peers.keys(): if self._peers[peer]['STATUS']['CONNECTED']: - self.send_packet(_packet, (self._peers[peer]['IP'], self._peers[peer]['PORT'])) + self.transport_write(_packet, (self._peers[peer]['IP'], self._peers[peer]['PORT'])) # FUNTIONS FOR IPSC MAINTENANCE ACTIVITIES WE RESPOND TO @@ -805,16 +801,13 @@ class IPSC(DatagramProtocol): self._peers[_peerid]['MODE_DECODE'] = _decoded_mode self._peers[_peerid]['FLAGS'] = _hex_flags self._peers[_peerid]['FLAGS_DECODE'] = _decoded_flags - # Generate a hashed packet from our template and send it. - peer_alive_reply_packet = self.hashed_packet(self._local['AUTH_KEY'], self.PEER_ALIVE_REPLY_PKT) - self.send_packet(peer_alive_reply_packet, (_host, _port)) + self.send_packet(self.PEER_ALIVE_REPLY_PKT, (_host, _port)) self.reset_keep_alive(_peerid) # Might as well reset our own counter, we know it's out there... logger.debug('(%s) Keep-Alive reply sent to Peer %s, %s:%s', self._network, int_id(_peerid), _host, _port) # SOMEONE WANTS TO REGISTER WITH US - WE'RE COOL WITH THAT def peer_reg_req(self, _peerid, _host, _port): - peer_reg_reply_packet = self.hashed_packet(self._local['AUTH_KEY'], self.PEER_REG_REPLY_PKT) - self.send_packet(peer_reg_reply_packet, (_host, _port)) + self.send_packet(self.PEER_REG_REPLY_PKT, (_host, _port)) logger.info('(%s) Peer Registration Request From: %s, %s:%s', self._network, int_id(_peerid), _host, _port) @@ -873,9 +866,7 @@ class IPSC(DatagramProtocol): _decoded_flags = process_flags_bytes(_hex_flags) self.MASTER_REG_REPLY_PKT = (MASTER_REG_REPLY + self._local_id + self.TS_FLAGS + hex_str_2(self._local['NUM_PEERS']) + IPSC_VER) - - master_reg_reply_packet = self.hashed_packet(self._local['AUTH_KEY'], self.MASTER_REG_REPLY_PKT) - self.send_packet(master_reg_reply_packet, (_host, _port)) + self.send_packet(self.MASTER_REG_REPLY_PKT, (_host, _port)) logger.info('(%s) Master Registration Packet Received from peer %s, %s:%s', self._network, int_id(_peerid), _host, _port) # If this entry was NOT already in our list, add it. @@ -904,10 +895,7 @@ class IPSC(DatagramProtocol): if _peerid in self._peers.keys(): self._peers[_peerid]['STATUS']['KEEP_ALIVES_RECEIVED'] += 1 self._peers[_peerid]['STATUS']['KEEP_ALIVE_RX_TIME'] = int(time()) - - master_alive_reply_packet = self.hashed_packet(self._local['AUTH_KEY'], self.MASTER_ALIVE_REPLY_PKT) - self.send_packet(master_alive_reply_packet, (_host, _port)) - + self.send_packet(self.MASTER_ALIVE_REPLY_PKT, (_host, _port)) logger.debug('(%s) Master Keep-Alive Request Received from peer %s, %s:%s', self._network, int_id(_peerid), _host, _port) else: logger.warning('(%s) Master Keep-Alive Request Received from *UNREGISTERED* peer %s, %s:%s', self._network, int_id(_peerid), _host, _port) @@ -916,9 +904,7 @@ class IPSC(DatagramProtocol): def peer_list_req(self, _peerid): if _peerid in self._peers.keys(): logger.debug('(%s) Peer List Request from peer %s', self._network, int_id(_peerid)) - peer_list_packet = self.PEER_LIST_REPLY_PKT + build_peer_list(self._peers) - peer_list_packet = self.hashed_packet(self._local['AUTH_KEY'], peer_list_packet) - self.send_to_ipsc(peer_list_packet) + self.send_to_ipsc(self.PEER_LIST_REPLY_PKT + build_peer_list(self._peers)) else: logger.warning('(%s) Peer List Request Received from *UNREGISTERED* peer %s', self._network, int_id(_peerid)) @@ -942,18 +928,18 @@ class IPSC(DatagramProtocol): # Take a packet to be SENT, calculate auth hash and return the whole thing # - def auth_hashed_packet(self, _key, _data): + def hashed_packet(self, _key, _data): _hash = binascii.a2b_hex((hmac_new(_key,_data,sha1)).hexdigest()[:20]) return _data + _hash # Remove the hash from a packet and return the payload # - def auth_strip_hash(self, _data): + def strip_hash(self, _data): return _data[:-10] # Take a RECEIVED packet, calculate the auth hash and verify authenticity # - def auth_validate_auth(self, _key, _data): + def validate_auth(self, _key, _data): _payload = self.strip_hash(_data) _hash = _data[-10:] _chk_hash = binascii.a2b_hex((hmac_new(_key,_payload,sha1)).hexdigest()[:20]) @@ -962,23 +948,6 @@ class IPSC(DatagramProtocol): return True else: return False - - # NEXT THREE FUNCITONS ARE FOR UN-AUTHENTICATED PACKETS - - # There isn't a hash to build, so just return the data - # - def unauth_hashed_packet(self, _key, _data): - return _data - - # Remove the hash from a packet and return the payload... except don't - # - def unauth_strip_hash(self, _data): - return _data - - # Everything is validated, so just return True - # - def unauth_validate_auth(self, _key, _data): - return True #************************************************ @@ -1015,9 +984,7 @@ class IPSC(DatagramProtocol): if keep_alive_delta > 120: de_register_peer(self._network, peer) - peer_list_packet = self.PEER_LIST_REPLY_PKT + build_peer_list(self._peers) - peer_list_packet = self.hashed_packet(self._local['AUTH_KEY'], peer_list_packet) - self.send_to_ipsc(peer_list_packet) + self.send_to_ipsc(self.PEER_LIST_REPLY_PKT + build_peer_list(self._peers)) logger.warning('(%s) Timeout Exceeded for Peer %s, De-registering', self._network, int_id(peer)) # Timed loop used for IPSC connection Maintenance when we are a PEER @@ -1028,15 +995,13 @@ class IPSC(DatagramProtocol): # If the master isn't connected, we have to do that before we can do anything else! # if not self._master_stat['CONNECTED']: - reg_packet = self.hashed_packet(self._local['AUTH_KEY'], self.MASTER_REG_REQ_PKT) - self.send_packet(reg_packet, self._master_sock) + self.send_packet(self.MASTER_REG_REQ_PKT, self._master_sock) logger.info('(%s) Registering with the Master: %s:%s', self._network, self._master['IP'], self._master['PORT']) # Once the master is connected, we have to send keep-alives.. and make sure we get them back elif self._master_stat['CONNECTED']: # Send keep-alive to the master - master_alive_packet = self.hashed_packet(self._local['AUTH_KEY'], self.MASTER_ALIVE_PKT) - self.send_packet(master_alive_packet, self._master_sock) + self.send_packet(self.MASTER_ALIVE_PKT, self._master_sock) logger.debug('(%s) Keep Alive Sent to the Master: %s, %s:%s', self._network, int_id(self._master['RADIO_ID']) ,self._master['IP'], self._master['PORT']) # If we had a keep-alive outstanding by the time we send another, mark it missed. @@ -1065,8 +1030,7 @@ class IPSC(DatagramProtocol): if (self._master_stat['CONNECTED'] == True) and (self._master_stat['PEER_LIST'] == False): # Ask the master for a peer-list if self._local['NUM_PEERS']: - peer_list_req_packet = self.hashed_packet(self._local['AUTH_KEY'], self.PEER_LIST_REQ_PKT) - self.send_packet(peer_list_req_packet, self._master_sock) + self.send_packet(self.PEER_LIST_REQ_PKT, self._master_sock) logger.info('(%s), No Peer List - Requesting One From the Master', self._network) else: self._master_stat['PEER_LIST'] = True @@ -1085,14 +1049,12 @@ class IPSC(DatagramProtocol): # If we haven't registered to a peer, send a registration if not self._peers[peer]['STATUS']['CONNECTED']: - peer_reg_packet = self.hashed_packet(self._local['AUTH_KEY'], self.PEER_REG_REQ_PKT) - self.send_packet(peer_reg_packet, (self._peers[peer]['IP'], self._peers[peer]['PORT'])) + self.send_packet(self.PEER_REG_REQ_PKT, (self._peers[peer]['IP'], self._peers[peer]['PORT'])) logger.info('(%s) Registering with Peer %s, %s:%s', self._network, int_id(peer), self._peers[peer]['IP'], self._peers[peer]['PORT']) # If we have registered with the peer, then send a keep-alive elif self._peers[peer]['STATUS']['CONNECTED']: - peer_alive_req_packet = self.hashed_packet(self._local['AUTH_KEY'], self.PEER_ALIVE_REQ_PKT) - self.send_packet(peer_alive_req_packet, (self._peers[peer]['IP'], self._peers[peer]['PORT'])) + self.send_packet(self.PEER_ALIVE_REQ_PKT, (self._peers[peer]['IP'], self._peers[peer]['PORT'])) logger.debug('(%s) Keep-Alive Sent to the Peer %s, %s:%s', self._network, int_id(peer), self._peers[peer]['IP'], self._peers[peer]['PORT']) # If we have a keep-alive outstanding by the time we send another, mark it missed. From d530be263c73d29419f45d2f49315a702e481255 Mon Sep 17 00:00:00 2001 From: Cort Buffington Date: Fri, 9 Sep 2016 22:13:44 -0500 Subject: [PATCH 02/15] fixed typo --- dmrlink.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dmrlink.py b/dmrlink.py index 5f2262b..168a67d 100755 --- a/dmrlink.py +++ b/dmrlink.py @@ -785,7 +785,7 @@ class IPSC(DatagramProtocol): # Send to each connected Peer for peer in self._peers.keys(): if self._peers[peer]['STATUS']['CONNECTED']: - self.transport_write(_packet, (self._peers[peer]['IP'], self._peers[peer]['PORT'])) + self.transport.write(_packet, (self._peers[peer]['IP'], self._peers[peer]['PORT'])) # FUNTIONS FOR IPSC MAINTENANCE ACTIVITIES WE RESPOND TO From d2279134f373552d685f2dda13b16415572c4cf2 Mon Sep 17 00:00:00 2001 From: Cort Buffington Date: Fri, 9 Sep 2016 22:30:10 -0500 Subject: [PATCH 03/15] Don't reset unused timers.... waste of time --- bridge.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridge.py b/bridge.py index 889e5cf..84be167 100755 --- a/bridge.py +++ b/bridge.py @@ -341,7 +341,7 @@ class bridgeIPSC(IPSC): _target = rule['DST_NET'] # TGID matches a rule source, reset its timer - if _ts == rule['SRC_TS'] and _dst_group == rule['SRC_GROUP']: + if _ts == rule['SRC_TS'] and _dst_group == rule['SRC_GROUP'] and (rule['TO_TYPE'] == 'ON' or rule['TO_TYPE'] == 'OFF')::: rule['TIMER'] = now + rule['TIMEOUT'] logger.info('(%s) Source group transmission match for rule \"%s\". Reset timeout to %s', _network, rule['NAME'], rule['TIMER']) From ad1e9a2ca215d0816a3bb69121eb6bb7a777e6af Mon Sep 17 00:00:00 2001 From: Cort Buffington Date: Fri, 9 Sep 2016 22:31:08 -0500 Subject: [PATCH 04/15] Don't reset timer that aren't used - waste of time --- bridge.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridge.py b/bridge.py index 84be167..f926b55 100755 --- a/bridge.py +++ b/bridge.py @@ -341,7 +341,7 @@ class bridgeIPSC(IPSC): _target = rule['DST_NET'] # TGID matches a rule source, reset its timer - if _ts == rule['SRC_TS'] and _dst_group == rule['SRC_GROUP'] and (rule['TO_TYPE'] == 'ON' or rule['TO_TYPE'] == 'OFF')::: + if _ts == rule['SRC_TS'] and _dst_group == rule['SRC_GROUP'] and (rule['TO_TYPE'] == 'ON' or rule['TO_TYPE'] == 'OFF'): rule['TIMER'] = now + rule['TIMEOUT'] logger.info('(%s) Source group transmission match for rule \"%s\". Reset timeout to %s', _network, rule['NAME'], rule['TIMER']) From e80fe33545d1937a50960a02b6ba0526406deed2 Mon Sep 17 00:00:00 2001 From: Cort Buffington Date: Fri, 9 Sep 2016 22:44:40 -0500 Subject: [PATCH 05/15] updating hash/send routines --- ambe_audio.py | 2 -- play_group.py | 3 +-- playback.py | 2 -- 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/ambe_audio.py b/ambe_audio.py index 7dff76f..f24d5a7 100755 --- a/ambe_audio.py +++ b/ambe_audio.py @@ -202,8 +202,6 @@ class ambeIPSC(IPSC): elif _newSlot == 2: _burst_data_type = BURST_DATA_TYPE['SLOT2_VOICE'] _frame = _frame[:30] + _burst_data_type + _frame[31:] - - _frame = self.hashed_packet(NETWORK[_network]['LOCAL']['AUTH_KEY'], _frame) if (time() - self._busy_slots[_newSlot]) >= 0.10 : # slot is not busy so it is safe to transmit # Send the packet to all peers in the target IPSC diff --git a/play_group.py b/play_group.py index 33fb86d..db6ba4c 100755 --- a/play_group.py +++ b/play_group.py @@ -118,8 +118,7 @@ class playIPSC(IPSC): elif _ts == 1: _burst_data_type = BURST_DATA_TYPE['SLOT2_VOICE'] _tmp_data = _tmp_data[:30] + _burst_data_type + _tmp_data[31:] - - _tmp_data = self.hashed_packet(NETWORK[_network]['LOCAL']['AUTH_KEY'], _tmp_data) + # Send the packet to all peers in the target IPSC self.send_to_ipsc(_tmp_data) time.sleep(0.06) diff --git a/playback.py b/playback.py index 3d075c1..6b3e000 100755 --- a/playback.py +++ b/playback.py @@ -65,7 +65,6 @@ class playbackIPSC(IPSC): _tmp_data = _tmp_data.replace(_peerid, NETWORK[_network]['LOCAL']['RADIO_ID']) if GROUP_SRC_SUB: _tmp_data = _tmp_data.replace(_src_sub, HEX_GRP_SUB) - _tmp_data = self.hashed_packet(NETWORK[_network]['LOCAL']['AUTH_KEY'], _tmp_data) # Send the packet to all peers in the target IPSC self.send_to_ipsc(_tmp_data) time.sleep(0.06) @@ -92,7 +91,6 @@ class playbackIPSC(IPSC): _tmp_data = _tmp_data.replace(_dst_sub, BOGUS_SUB) _tmp_data = _tmp_data.replace(_src_sub, _orig_dst) _tmp_data = _tmp_data.replace(BOGUS_SUB, _orig_src) - _tmp_data = self.hashed_packet(NETWORK[_network]['LOCAL']['AUTH_KEY'], _tmp_data) # Send the packet to all peers in the target IPSC self.send_to_ipsc(_tmp_data) time.sleep(0.06) From 697b492d4ec2334aa97763e156971464ca6932c6 Mon Sep 17 00:00:00 2001 From: Cort Buffington Date: Fri, 9 Sep 2016 22:51:11 -0500 Subject: [PATCH 06/15] fix authentication checks on RX packets --- dmrlink.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/dmrlink.py b/dmrlink.py index 168a67d..d920f6e 100755 --- a/dmrlink.py +++ b/dmrlink.py @@ -1098,13 +1098,14 @@ class IPSC(DatagramProtocol): _ipsc_seq = data[5:6] # AUTHENTICATE THE PACKET - if not self.validate_auth(self._local['AUTH_KEY'], data): - logger.warning('(%s) AuthError: IPSC packet failed authentication. Type %s: Peer: %s, %s:%s', self._network, h(_packettype), int_id(_peerid), host, port) - return + if self._local['AUTH_ENABLED']: + if not self.validate_auth(self._local['AUTH_KEY'], data): + logger.warning('(%s) AuthError: IPSC packet failed authentication. Type %s: Peer: %s, %s:%s', self._network, h(_packettype), int_id(_peerid), host, port) + return - # REMOVE SHA-1 AUTHENTICATION HASH: WE NO LONGER NEED IT - else: - data = self.strip_hash(data) + # REMOVE SHA-1 AUTHENTICATION HASH: WE NO LONGER NEED IT + else: + data = self.strip_hash(data) # PACKETS THAT WE RECEIVE FROM ANY VALID PEER OR VALID MASTER if _packettype in ANY_PEER_REQUIRED: From 3209fce7828092c0a862080f683d205d68d7acfd Mon Sep 17 00:00:00 2001 From: Cort Buffington Date: Sat, 10 Sep 2016 10:41:42 -0500 Subject: [PATCH 07/15] remove duplicate voice start header log messages --- bridge.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/bridge.py b/bridge.py index f926b55..a206d21 100755 --- a/bridge.py +++ b/bridge.py @@ -175,6 +175,8 @@ class bridgeIPSC(IPSC): 'TS2': {'RX_GROUP':'\x00', 'TX_GROUP':'\x00', 'RX_TIME':0, 'TX_TIME':0, 'RX_SRC_SUB':'\x00', 'TX_SRC_SUB':'\x00'} } + last_seq_id = '' + # Setup the backup/polite bridging maintenance loop (based on keep-alive timer) if BRIDGES: @@ -219,6 +221,7 @@ class bridgeIPSC(IPSC): # Process the packet logger.debug('(%s) Group Voice Packet Received From: %s, IPSC Peer %s, Destination %s', _network, int_id(_src_sub), int_id(_peerid), int_id(_dst_group)) _burst_data_type = _data[30] # Determine the type of voice packet this is (see top of file for possible types) + _seq_id = _data[5] if _ts == 0: _TS = 'TS1' elif _ts == 1: @@ -330,7 +333,9 @@ class bridgeIPSC(IPSC): # Action happens on key up if _burst_data_type == BURST_DATA_TYPE['VOICE_HEAD']: - logger.info('(%s) GROUP VOICE START: PEER: %s, SUB: %s, TS: %s, TGID: %s', _network, int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group)) + if last_seq_id != seq_id: + last_seq_id = seq_id: + logger.info('(%s) GROUP VOICE START: PEER: %s, SUB: %s, TS: %s, TGID: %s', _network, int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group)) # Action happens on un-key if _burst_data_type == BURST_DATA_TYPE['VOICE_TERM']: From 15362a823bdfc82fecbd35e0afec23e334867ee1 Mon Sep 17 00:00:00 2001 From: Cort Buffington Date: Sat, 10 Sep 2016 10:43:40 -0500 Subject: [PATCH 08/15] fix stupid typo --- bridge.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridge.py b/bridge.py index a206d21..8b91585 100755 --- a/bridge.py +++ b/bridge.py @@ -334,7 +334,7 @@ class bridgeIPSC(IPSC): # Action happens on key up if _burst_data_type == BURST_DATA_TYPE['VOICE_HEAD']: if last_seq_id != seq_id: - last_seq_id = seq_id: + last_seq_id = seq_id logger.info('(%s) GROUP VOICE START: PEER: %s, SUB: %s, TS: %s, TGID: %s', _network, int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group)) # Action happens on un-key From 2fed2912a868805ffe87ee47975af79ba3511c3a Mon Sep 17 00:00:00 2001 From: Cort Buffington Date: Sat, 10 Sep 2016 10:51:04 -0500 Subject: [PATCH 09/15] fix more stupid typos --- bridge.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bridge.py b/bridge.py index 8b91585..b272bee 100755 --- a/bridge.py +++ b/bridge.py @@ -175,7 +175,7 @@ class bridgeIPSC(IPSC): 'TS2': {'RX_GROUP':'\x00', 'TX_GROUP':'\x00', 'RX_TIME':0, 'TX_TIME':0, 'RX_SRC_SUB':'\x00', 'TX_SRC_SUB':'\x00'} } - last_seq_id = '' + self.last_seq_id = '\x00' # Setup the backup/polite bridging maintenance loop (based on keep-alive timer) @@ -333,8 +333,8 @@ class bridgeIPSC(IPSC): # Action happens on key up if _burst_data_type == BURST_DATA_TYPE['VOICE_HEAD']: - if last_seq_id != seq_id: - last_seq_id = seq_id + if last_seq_id != self.seq_id: + last_seq_id = self.seq_id logger.info('(%s) GROUP VOICE START: PEER: %s, SUB: %s, TS: %s, TGID: %s', _network, int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group)) # Action happens on un-key From 213756a161e9affa78b750dd53b3c857be090b46 Mon Sep 17 00:00:00 2001 From: Cort Buffington Date: Sat, 10 Sep 2016 10:52:29 -0500 Subject: [PATCH 10/15] how many stupid typos? I should slow down. --- bridge.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bridge.py b/bridge.py index b272bee..59c9972 100755 --- a/bridge.py +++ b/bridge.py @@ -333,8 +333,8 @@ class bridgeIPSC(IPSC): # Action happens on key up if _burst_data_type == BURST_DATA_TYPE['VOICE_HEAD']: - if last_seq_id != self.seq_id: - last_seq_id = self.seq_id + if self.last_seq_id != seq_id: + self.last_seq_id = seq_id logger.info('(%s) GROUP VOICE START: PEER: %s, SUB: %s, TS: %s, TGID: %s', _network, int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group)) # Action happens on un-key From c26e5bb4890616b777fbeea7a1c57b97af6c48bd Mon Sep 17 00:00:00 2001 From: Cort Buffington Date: Sat, 10 Sep 2016 16:26:44 -0500 Subject: [PATCH 11/15] Maybe this time. --- bridge.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bridge.py b/bridge.py index 59c9972..fd7eac7 100755 --- a/bridge.py +++ b/bridge.py @@ -333,8 +333,8 @@ class bridgeIPSC(IPSC): # Action happens on key up if _burst_data_type == BURST_DATA_TYPE['VOICE_HEAD']: - if self.last_seq_id != seq_id: - self.last_seq_id = seq_id + if self.last_seq_id != _seq_id: + self.last_seq_id = _seq_id logger.info('(%s) GROUP VOICE START: PEER: %s, SUB: %s, TS: %s, TGID: %s', _network, int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group)) # Action happens on un-key From c33ba91f4f4c78ae69774a9d424aabbb84d2da3a Mon Sep 17 00:00:00 2001 From: Cort Buffington Date: Sat, 10 Sep 2016 16:32:14 -0500 Subject: [PATCH 12/15] add call duration timer --- bridge.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/bridge.py b/bridge.py index fd7eac7..ad482b1 100755 --- a/bridge.py +++ b/bridge.py @@ -335,11 +335,16 @@ class bridgeIPSC(IPSC): if _burst_data_type == BURST_DATA_TYPE['VOICE_HEAD']: if self.last_seq_id != _seq_id: self.last_seq_id = _seq_id + call_start = time() logger.info('(%s) GROUP VOICE START: PEER: %s, SUB: %s, TS: %s, TGID: %s', _network, int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group)) # Action happens on un-key if _burst_data_type == BURST_DATA_TYPE['VOICE_TERM']: - logger.info('(%s) GROUP VOICE END: PEER: %s, SUB: %s, TS: %s, TGID: %s', _network, int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group)) + if self.last_seq_id == _seq_id: + call_duration = time() - call_start + logger.info('(%s) GROUP VOICE END: PEER: %s, SUB: %s, TS: %s, TGID: %s Duration: %ss', _network, int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group), call_duration) + else: + logger.warning('(%s) GROUP VOICE END WITHOUT MATCHING START: PEER: %s, SUB: %s, TS: %s, TGID: %s', _network, int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group)) # Iterate the rules dictionary for rule in RULES[_network]['GROUP_VOICE']: From 74eb8edb5f0fb42128df37e6faa125d2356dbfaf Mon Sep 17 00:00:00 2001 From: Cort Buffington Date: Sat, 10 Sep 2016 16:34:50 -0500 Subject: [PATCH 13/15] add call timer --- bridge.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/bridge.py b/bridge.py index ad482b1..687aa59 100755 --- a/bridge.py +++ b/bridge.py @@ -176,6 +176,7 @@ class bridgeIPSC(IPSC): } self.last_seq_id = '\x00' + self.call_start = 0 # Setup the backup/polite bridging maintenance loop (based on keep-alive timer) @@ -335,16 +336,16 @@ class bridgeIPSC(IPSC): if _burst_data_type == BURST_DATA_TYPE['VOICE_HEAD']: if self.last_seq_id != _seq_id: self.last_seq_id = _seq_id - call_start = time() + self.call_start = time() logger.info('(%s) GROUP VOICE START: PEER: %s, SUB: %s, TS: %s, TGID: %s', _network, int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group)) # Action happens on un-key if _burst_data_type == BURST_DATA_TYPE['VOICE_TERM']: if self.last_seq_id == _seq_id: - call_duration = time() - call_start - logger.info('(%s) GROUP VOICE END: PEER: %s, SUB: %s, TS: %s, TGID: %s Duration: %ss', _network, int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group), call_duration) + self.call_duration = time() - self.call_start + logger.info('(%s) GROUP VOICE END: PEER: %s, SUB: %s, TS: %s, TGID: %s Duration: %ss', _network, int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group), self.call_duration) else: - logger.warning('(%s) GROUP VOICE END WITHOUT MATCHING START: PEER: %s, SUB: %s, TS: %s, TGID: %s', _network, int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group)) + logger.warning('(%s) GROUP VOICE END WITHOUT MATCHING START: PEER: %s, SUB: %s, TS: %s, TGID: %s', _network, int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group),) # Iterate the rules dictionary for rule in RULES[_network]['GROUP_VOICE']: From da0eb0ad373dd2a744e767ee78520afe34955f36 Mon Sep 17 00:00:00 2001 From: Cort Buffington Date: Sat, 10 Sep 2016 16:37:07 -0500 Subject: [PATCH 14/15] formatting --- bridge.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridge.py b/bridge.py index 687aa59..15f8abb 100755 --- a/bridge.py +++ b/bridge.py @@ -343,7 +343,7 @@ class bridgeIPSC(IPSC): if _burst_data_type == BURST_DATA_TYPE['VOICE_TERM']: if self.last_seq_id == _seq_id: self.call_duration = time() - self.call_start - logger.info('(%s) GROUP VOICE END: PEER: %s, SUB: %s, TS: %s, TGID: %s Duration: %ss', _network, int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group), self.call_duration) + logger.info('(%s) GROUP VOICE END: PEER: %s, SUB: %s, TS: %s, TGID: %s Duration: %.2fs', _network, int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group), self.call_duration) else: logger.warning('(%s) GROUP VOICE END WITHOUT MATCHING START: PEER: %s, SUB: %s, TS: %s, TGID: %s', _network, int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group),) From 0a5c53afd2c8d509df7f030e4a62e85853df86fc Mon Sep 17 00:00:00 2001 From: Cort Buffington Date: Sat, 10 Sep 2016 16:57:48 -0500 Subject: [PATCH 15/15] call logging additions --- bridge.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bridge.py b/bridge.py index 15f8abb..5fa0d75 100755 --- a/bridge.py +++ b/bridge.py @@ -337,15 +337,15 @@ class bridgeIPSC(IPSC): if self.last_seq_id != _seq_id: self.last_seq_id = _seq_id self.call_start = time() - logger.info('(%s) GROUP VOICE START: PEER: %s, SUB: %s, TS: %s, TGID: %s', _network, int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group)) + logger.info('(%s) GROUP VOICE START: CallID: %s PEER: %s, SUB: %s, TS: %s, TGID: %s', _network, int_id(_seq_id), int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group)) # Action happens on un-key if _burst_data_type == BURST_DATA_TYPE['VOICE_TERM']: if self.last_seq_id == _seq_id: self.call_duration = time() - self.call_start - logger.info('(%s) GROUP VOICE END: PEER: %s, SUB: %s, TS: %s, TGID: %s Duration: %.2fs', _network, int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group), self.call_duration) + logger.info('(%s) GROUP VOICE END: CallID: %s PEER: %s, SUB: %s, TS: %s, TGID: %s Duration: %.2fs', _network, int_id(_seq_id), int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group), self.call_duration) else: - logger.warning('(%s) GROUP VOICE END WITHOUT MATCHING START: PEER: %s, SUB: %s, TS: %s, TGID: %s', _network, int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group),) + logger.warning('(%s) GROUP VOICE END WITHOUT MATCHING START: CallID: %s PEER: %s, SUB: %s, TS: %s, TGID: %s', _network, int_id(_seq_id), int_id(_peerid), int_id(_src_sub), _ts+1, int_id(_dst_group),) # Iterate the rules dictionary for rule in RULES[_network]['GROUP_VOICE']: