2014-01-03 15:01:43 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								#!/usr/bin/env python 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-02 15:31:55 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# This work is licensed under the Creative Commons Attribution-ShareAlike 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# 3.0 Unported License.To view a copy of this license, visit 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# Creative Commons, 444 Castro Street, Suite 900, Mountain View, 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# California, 94041, USA. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-01-03 15:03:41 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								#NOTE: This program uses a configuration file specified on the command line 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#      if none is specified, then dmrlink.cfg in the same directory as this 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#      file will be tried. Finally, if that does not exist, this process 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#      will terminate 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 16:15:54 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								from  __future__  import  print_function 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-12 16:23:46 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-12 11:08:06 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								import  ConfigParser 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-03 15:01:43 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								import  argparse 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-11 19:45:09 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								import  sys 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 16:15:54 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								import  binascii 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-13 17:01:50 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								import  csv 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-13 12:07:18 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								import  os 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-15 09:45:39 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								import  logging 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 22:21:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								import  time 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-17 13:18:45 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								import  signal 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-11 19:45:09 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-12-15 09:45:39 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								from  logging . config  import  dictConfig 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-12 16:23:46 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								from  hmac  import  new  as  hmac_new 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								from  binascii  import  b2a_hex  as  h 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								from  hashlib  import  sha1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								from  socket  import  inet_ntoa  as  IPAddr 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 20:58:58 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								from  socket  import  inet_aton  as  IPHexStr 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								from  twisted . internet . protocol  import  DatagramProtocol 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								from  twisted . internet  import  reactor 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								from  twisted . internet  import  task 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-01-02 11:16:23 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								__author__  =  ' Cortney T. Buffington, N0MJS ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-28 22:07:34 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								__copyright__  =  ' Copyright (c) 2013, 2014 Cortney T. Buffington, N0MJS and the K0USY Group ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-02 11:16:23 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								__credits__  =  ' Adam Fast, KC0YLK, Dave K, and he who wishes not to be named ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								__license__  =  ' Creative Commons Attribution-ShareAlike 3.0 Unported ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-17 20:01:26 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								__version__  =  ' 0.3 ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-02 11:16:23 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								__maintainer__  =  ' Cort Buffington, N0MJS ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								__email__  =  ' n0mjs@me.com ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								__status__  =  ' Production ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-01-03 15:01:43 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								parser  =  argparse . ArgumentParser ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								parser . add_argument ( ' -c ' ,  ' --config ' ,  action = ' store ' ,  dest = ' CFG_FILE ' ,  help = ' /full/path/to/config.file (usually dmrlink.cfg) ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								cli_args  =  parser . parse_args ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-12 11:08:06 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								#************************************************ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#     PARSE THE CONFIG FILE AND BUILD STRUCTURE 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#************************************************ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								NETWORK  =  { } 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-12 18:20:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								networks  =  { } 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-12 11:08:06 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								config  =  ConfigParser . ConfigParser ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-01-03 15:01:43 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								if  not  cli_args . CFG_FILE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    cli_args . CFG_FILE  =  os . path . dirname ( os . path . abspath ( __file__ ) ) + ' /dmrlink.cfg ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								try : 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-03 15:01:43 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    if  not  config . read ( cli_args . CFG_FILE ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        sys . exit ( ' Configuration file  \' ' + cli_args . CFG_FILE + ' \'  is not a valid configuration file! Exiting... ' )         
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								except :     
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    sys . exit ( ' Configuration file  \' ' + cli_args . CFG_FILE + ' \'  is not a valid configuration file! Exiting... ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-12 11:08:06 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 11:33:52 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    for  section  in  config . sections ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  section  ==  ' GLOBAL ' : 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-02 11:16:23 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # Process GLOBAL items in the configuration 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-22 16:16:10 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            PATH  =  config . get ( section ,  ' PATH ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-15 09:45:39 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        elif  section  ==  ' REPORTS ' : 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-02 11:16:23 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # Process REPORTS items in the configuration 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-15 09:45:39 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            REPORTS  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' REPORT_PEERS ' :  config . getboolean ( section ,  ' REPORT_PEERS ' ) , 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-15 08:39:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                ' REPORT_INTERVAL ' :  config . getint ( section ,  ' REPORT_INTERVAL ' ) , 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-15 09:45:39 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                ' PEER_REPORT_INC_MODE ' :  config . getboolean ( section ,  ' PEER_REPORT_INC_MODE ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' PEER_REPORT_INC_FLAGS ' :  config . getboolean ( section ,  ' PEER_REPORT_INC_FLAGS ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        elif  section  ==  ' LOGGER ' : 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-02 11:16:23 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # Process LOGGER items in the configuration 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-15 09:45:39 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            LOGGER  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' LOG_FILE ' :  config . get ( section ,  ' LOG_FILE ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' LOG_HANDLERS ' :  config . get ( section ,  ' LOG_HANDLERS ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' LOG_LEVEL ' :  config . get ( section ,  ' LOG_LEVEL ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-28 20:34:29 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        else : 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-02 11:16:23 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # All other sections define indiviual IPSC Networks we connect to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            # Each IPSC network config will contain the following three sections 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:19:32 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            NETWORK . update ( { section :  { ' LOCAL ' :  { } ,  ' MASTER ' :  { } ,  ' PEERS ' :  { } } } ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-02 11:16:23 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # LOCAL means we need to know this stuff to be a peer in the network 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 11:33:52 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            NETWORK [ section ] [ ' LOCAL ' ] . update ( { 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-02 11:16:23 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                # In case we want to keep config, but not actually connect to the network 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' ENABLED ' :       config . getboolean ( section ,  ' ENABLED ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                # These items are used to create the MODE byte 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' PEER_OPER ' :     config . getboolean ( section ,  ' PEER_OPER ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' IPSC_MODE ' :     config . get ( section ,  ' IPSC_MODE ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' TS1_LINK ' :      config . getboolean ( section ,  ' TS1_LINK ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' TS2_LINK ' :      config . getboolean ( section ,  ' TS2_LINK ' ) , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 11:33:52 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                ' MODE ' :  ' ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-02 11:16:23 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                # These items are used to create the multi-byte FLAGS field 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' AUTH_ENABLED ' :  config . getboolean ( section ,  ' AUTH_ENABLED ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' CSBK_CALL ' :     config . getboolean ( section ,  ' CSBK_CALL ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' RCM ' :           config . getboolean ( section ,  ' RCM ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' CON_APP ' :       config . getboolean ( section ,  ' CON_APP ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' XNL_CALL ' :      config . getboolean ( section ,  ' XNL_CALL ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' XNL_MASTER ' :    config . getboolean ( section ,  ' XNL_MASTER ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' DATA_CALL ' :     config . getboolean ( section ,  ' DATA_CALL ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' VOICE_CALL ' :    config . getboolean ( section ,  ' VOICE_CALL ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' MASTER_PEER ' :   config . getboolean ( section ,  ' MASTER_PEER ' ) , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 11:33:52 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                ' FLAGS ' :  ' ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-02 11:16:23 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                # Things we need to know to connect and be a peer in this IPSC 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' RADIO_ID ' :      hex ( int ( config . get ( section ,  ' RADIO_ID ' ) ) ) [ 2 : ] . rjust ( 8 , ' 0 ' ) . decode ( ' hex ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' PORT ' :          config . getint ( section ,  ' PORT ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' ALIVE_TIMER ' :   config . getint ( section ,  ' ALIVE_TIMER ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' MAX_MISSED ' :    config . getint ( section ,  ' MAX_MISSED ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' AUTH_KEY ' :      ( config . get ( section ,  ' AUTH_KEY ' ) . rjust ( 40 , ' 0 ' ) ) . decode ( ' hex ' ) , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 11:33:52 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                ' NUM_PEERS ' :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                } ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-02 11:16:23 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # Master means things we need to know about the master peer of the network 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 11:33:52 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            NETWORK [ section ] [ ' MASTER ' ] . update ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' RADIO_ID ' :  ' \x00 \x00 \x00 \x00 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' MODE ' :  ' \x00 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-12 16:12:36 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                ' MODE_DECODE ' :  ' ' , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 11:33:52 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                ' FLAGS ' :  ' \x00 \x00 \x00 \x00 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-12 16:12:36 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                ' FLAGS_DECODE ' :  ' ' , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 11:33:52 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                ' STATUS ' :  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 22:21:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    ' CONNECTED ' :                False , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    ' PEER_LIST ' :                False , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    ' KEEP_ALIVES_SENT ' :         0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    ' KEEP_ALIVES_MISSED ' :       0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    ' KEEP_ALIVES_OUTSTANDING ' :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    ' KEEP_ALIVES_RECEIVED ' :     0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    ' KEEP_ALIVE_RX_TIME ' :       0 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 11:33:52 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    } , 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 17:17:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                ' IP ' :  ' ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' PORT ' :  ' ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            if  not  NETWORK [ section ] [ ' LOCAL ' ] [ ' MASTER_PEER ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                NETWORK [ section ] [ ' MASTER ' ] . update ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    ' IP ' :  config . get ( section ,  ' MASTER_IP ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    ' PORT ' :  config . getint ( section ,  ' MASTER_PORT ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 11:33:52 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                } ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-02 11:16:23 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            # Temporary locations for building MODE and FLAG data 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            MODE_BYTE  =  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            FLAG_1  =  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            FLAG_2  =  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            # Construct and store the MODE field 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            if  NETWORK [ section ] [ ' LOCAL ' ] [ ' PEER_OPER ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                MODE_BYTE  | =  1  <<  6 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            if  NETWORK [ section ] [ ' LOCAL ' ] [ ' IPSC_MODE ' ]  ==  ' ANALOG ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                MODE_BYTE  | =  1  <<  4 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            elif  NETWORK [ section ] [ ' LOCAL ' ] [ ' IPSC_MODE ' ]  ==  ' DIGITAL ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                MODE_BYTE  | =  1  <<  5 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            if  NETWORK [ section ] [ ' LOCAL ' ] [ ' TS1_LINK ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                MODE_BYTE  | =  1  <<  3 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 11:33:52 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            else : 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-02 11:16:23 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                MODE_BYTE  | =  1  <<  2 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            if  NETWORK [ section ] [ ' LOCAL ' ] [ ' TS2_LINK ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                MODE_BYTE  | =  1  <<  1 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 11:33:52 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            else : 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-02 11:16:23 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                MODE_BYTE  | =  1  <<  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            NETWORK [ section ] [ ' LOCAL ' ] [ ' MODE ' ]  =  chr ( MODE_BYTE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            # Construct and store the FLAGS field 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            if  NETWORK [ section ] [ ' LOCAL ' ] [ ' CSBK_CALL ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                FLAG_1  | =  1  <<  7   
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            if  NETWORK [ section ] [ ' LOCAL ' ] [ ' RCM ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                FLAG_1  | =  1  <<  6 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            if  NETWORK [ section ] [ ' LOCAL ' ] [ ' CON_APP ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                FLAG_1  | =  1  <<  5 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            if  NETWORK [ section ] [ ' LOCAL ' ] [ ' XNL_CALL ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                FLAG_2  | =  1  <<  7     
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            if  NETWORK [ section ] [ ' LOCAL ' ] [ ' XNL_CALL ' ]  and  NETWORK [ section ] [ ' LOCAL ' ] [ ' XNL_MASTER ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                FLAG_2  | =  1  <<  6 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            elif  NETWORK [ section ] [ ' LOCAL ' ] [ ' XNL_CALL ' ]  and  not  NETWORK [ section ] [ ' LOCAL ' ] [ ' XNL_MASTER ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                FLAG_2  | =  1  <<  5 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            if  NETWORK [ section ] [ ' LOCAL ' ] [ ' AUTH_ENABLED ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                FLAG_2  | =  1  <<  4 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            if  NETWORK [ section ] [ ' LOCAL ' ] [ ' DATA_CALL ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                FLAG_2  | =  1  <<  3 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            if  NETWORK [ section ] [ ' LOCAL ' ] [ ' VOICE_CALL ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                FLAG_2  | =  1  <<  2 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            if  NETWORK [ section ] [ ' LOCAL ' ] [ ' MASTER_PEER ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                FLAG_2  | =  1  <<  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            NETWORK [ section ] [ ' LOCAL ' ] [ ' FLAGS ' ]  =  ' \x00 \x00 ' + chr ( FLAG_1 ) + chr ( FLAG_2 ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 11:33:52 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								except : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    sys . exit ( ' Could not parse configuration file, exiting... ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 15:28:18 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:19:31 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-12-15 09:45:39 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								#************************************************ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#     CONFIGURE THE SYSTEM LOGGER 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#************************************************ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								dictConfig ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ' version ' :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ' disable_existing_loggers ' :  False , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ' filters ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ' formatters ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ' verbose ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            ' format ' :  ' %(levelname)s   %(asctime)s   %(module)s   %(process)d   %(thread)d   %(message)s ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ' timed ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            ' format ' :  ' %(levelname)s   %(asctime)s   %(message)s ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ' simple ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            ' format ' :  ' %(levelname)s   %(message)s ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-24 15:16:30 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        ' syslog ' :  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-24 15:20:10 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            ' format ' :  ' %(name)s  ( %(process)d ):  %(levelname)s   %(message)s ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-24 15:16:30 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-15 09:45:39 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ' handlers ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ' console ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            ' class ' :  ' logging.StreamHandler ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            ' formatter ' :  ' simple ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ' console-timed ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            ' class ' :  ' logging.StreamHandler ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            ' formatter ' :  ' timed ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ' file ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            ' class ' :  ' logging.FileHandler ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            ' formatter ' :  ' simple ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            ' filename ' :  LOGGER [ ' LOG_FILE ' ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ' file-timed ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            ' class ' :  ' logging.FileHandler ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            ' formatter ' :  ' timed ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            ' filename ' :  LOGGER [ ' LOG_FILE ' ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ' syslog ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            ' class ' :  ' logging.handlers.SysLogHandler ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-24 15:16:30 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            ' formatter ' :  ' syslog ' , 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-15 09:45:39 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ' loggers ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ' dmrlink ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            ' handlers ' :  LOGGER [ ' LOG_HANDLERS ' ] . split ( ' , ' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            ' level ' :  LOGGER [ ' LOG_LEVEL ' ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            ' propagate ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								logger  =  logging . getLogger ( ' dmrlink ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:19:31 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-12-15 09:45:39 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								#************************************************ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#     IMPORTING OTHER FILES - '#include' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#************************************************ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# Import IPSC message types and version information 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    from  ipsc . ipsc_message_types  import  * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								except  ImportError : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    sys . exit ( ' IPSC message types file not found or invalid ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# Import IPSC flag mask values 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    from  ipsc . ipsc_mask  import  * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								except  ImportError : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    sys . exit ( ' IPSC mask values file not found or invalid ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# Import the Alias files for numeric ids. This is split to save 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# time making lookups in one huge dictionary 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								curdir =  os . path . dirname ( __file__ ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								subscriber_ids  =  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								peer_ids  =  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								talkgroup_ids  =  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								try : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-22 16:16:10 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    with  open ( PATH + ' subscriber_ids.csv ' ,  ' rU ' )  as  subscriber_ids_csv : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-15 09:45:39 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        subscribers  =  csv . reader ( subscriber_ids_csv ,  dialect = ' excel ' ,  delimiter = ' , ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        for  row  in  subscribers : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            subscriber_ids [ int ( row [ 1 ] ) ]  =  ( row [ 0 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								except  ImportError : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    logger . warning ( ' subscriber_ids.csv not found: Subscriber aliases will not be available ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								try : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-22 16:16:10 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    with  open ( PATH + ' peer_ids.csv ' ,  ' rU ' )  as  peer_ids_csv : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-15 09:45:39 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        peers  =  csv . reader ( peer_ids_csv ,  dialect = ' excel ' ,  delimiter = ' , ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        for  row  in  peers : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            peer_ids [ int ( row [ 1 ] ) ]  =  ( row [ 0 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								except  ImportError : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    logger . warning ( ' peer_ids.csv not found: Peer aliases will not be available ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								try : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-22 16:16:10 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    with  open ( PATH + ' talkgroup_ids.csv ' ,  ' rU ' )  as  talkgroup_ids_csv : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-15 09:45:39 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        talkgroups  =  csv . reader ( talkgroup_ids_csv ,  dialect = ' excel ' ,  delimiter = ' , ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        for  row  in  talkgroups : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            talkgroup_ids [ int ( row [ 1 ] ) ]  =  ( row [ 0 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								except  ImportError : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    logger . warning ( ' talkgroup_ids.csv not found: Talkgroup aliases will not be available ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 15:28:18 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								#************************************************ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#     UTILITY FUNCTIONS FOR INTERNAL USE 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#************************************************ 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 08:28:52 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 20:58:58 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# Create a 2 byte hex string from an integer 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-24 21:57:38 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 20:58:58 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								def  hex_str_2 ( _int_id ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  hex ( _int_id ) [ 2 : ] . rjust ( 4 , ' 0 ' ) . decode ( ' hex ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    except  TypeError : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        logger . error ( ' hex_str_2: invalid integer length ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								     
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# Create a 3 byte hex string from an integer 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								def  hex_str_3 ( _int_id ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  hex ( _int_id ) [ 2 : ] . rjust ( 6 , ' 0 ' ) . decode ( ' hex ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    except  TypeError : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        logger . error ( ' hex_str_3: invalid integer length ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# Create a 4 byte hex string from an integer 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								def  hex_str_4 ( _int_id ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  hex ( _int_id ) [ 2 : ] . rjust ( 8 , ' 0 ' ) . decode ( ' hex ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    except  TypeError : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        logger . error ( ' hex_str_4: invalid integer length ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-24 21:57:38 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-22 11:21:32 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# Convert a hex string to an int (radio ID, etc.) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								def  int_id ( _hex_string ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:19:32 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    return  int ( h ( _hex_string ) ,  16 ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-22 11:21:32 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 10:40:29 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# Re-Write Source Radio-ID (DMR NAT) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-21 18:34:06 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								def  dmr_nat ( _data ,  _src_id ,  _nat_id ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    _data  =  _data . replace ( _src_id ,  _nat_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 10:40:29 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    return  _data 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-13 20:10:58 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# Lookup text data for numeric IDs 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-30 11:47:30 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								def  get_info ( _id ,  _dict ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  _id  in  _dict : 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-29 22:00:38 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return  _dict [ _id ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-13 20:10:58 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    return  _id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-29 21:12:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# Determine if the provided peer ID is valid for the provided network  
							 
						 
					
						
							
								
									
										
										
										
											2013-07-29 21:06:25 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-06 22:33:04 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								def  valid_peer ( _peer_list ,  _peerid ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  _peerid  in  _peer_list : 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 11:33:52 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return  True         
							 
						 
					
						
							
								
									
										
										
										
											2013-08-06 22:33:04 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    return  False 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-29 13:38:59 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-29 21:12:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# Determine if the provided master ID is valid for the provided network 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								def  valid_master ( _network ,  _peerid ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-30 10:52:10 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    if  NETWORK [ _network ] [ ' MASTER ' ] [ ' RADIO_ID ' ]  ==  _peerid : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 15:28:18 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return  True      
							 
						 
					
						
							
								
									
										
										
										
											2013-07-29 13:23:37 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  False 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 15:28:18 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
									
										
										
										
											2013-08-26 08:16:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
									
										
										
										
											2013-08-28 11:06:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# Accept a complete packet, ready to be sent, and send it to all active peers + master in an IPSC 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								def  send_to_ipsc ( _target ,  _packet ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 19:07:20 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    _network  =  NETWORK [ _target ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    _network_instance  =  networks [ _target ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    _peers  =  _network [ ' PEERS ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # Send to the Master 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-08 08:39:41 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    if  _network [ ' MASTER ' ] [ ' STATUS ' ] [ ' CONNECTED ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        _network_instance . transport . write ( _packet ,  ( _network [ ' MASTER ' ] [ ' IP ' ] ,  _network [ ' MASTER ' ] [ ' PORT ' ] ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # Send to each connected Peer 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 19:07:20 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    for  peer  in  _peers . keys ( ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        if  _peers [ peer ] [ ' STATUS ' ] [ ' CONNECTED ' ] : 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 19:07:20 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            _network_instance . transport . write ( _packet ,  ( _peers [ peer ] [ ' IP ' ] ,  _peers [ peer ] [ ' PORT ' ] ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 10:14:39 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# De-register a peer from an IPSC by removing it's information 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								def  de_register_peer ( _network ,  _peerid ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # Iterate for the peer in our data 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    if  _peerid  in  NETWORK [ _network ] [ ' PEERS ' ] . keys ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        del  NETWORK [ _network ] [ ' PEERS ' ] [ _peerid ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:19:32 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        logger . info ( ' ( %s ) Peer De-Registration Requested for:  %s ' ,  _network ,  h ( _peerid ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        logger . warning ( ' ( %s ) Peer De-Registration Requested for:  %s , but we don \' t have a listing for this peer ' ,  _network ,  h ( _peerid ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        pass 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-11 20:53:55 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-12-11 20:56:39 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# Process the MODE byte in registration/peer list packets for determining master and peer capabilities 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-11 20:53:55 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								def  process_mode_byte ( _hex_mode ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-12 07:50:47 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    _mode  =  int ( h ( _hex_mode ) ,  16 ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-11 20:53:55 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # Determine whether or not the peer is operational 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-12 07:42:56 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    _peer_op  =  bool ( _mode  &  PEER_OP_MSK )     
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # Determine whether or not timeslot 1 is linked 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    _ts1  =  bool ( _mode  &  IPSC_TS1_MSK )   
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # Determine whether or not timeslot 2 is linked 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    _ts2  =  bool ( _mode  &  IPSC_TS2_MSK ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								     
							 
						 
					
						
							
								
									
										
										
										
											2013-12-11 20:53:55 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # Determine the operational mode of the peer 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  _mode  &  PEER_MODE_MSK  ==  PEER_MODE_MSK : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        _peer_mode  =  ' UNKNOWN ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    elif  not  _mode  &  PEER_MODE_MSK : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        _peer_mode  =  ' NO_RADIO ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    elif  _mode  &  PEER_MODE_ANALOG : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        _peer_mode  =  ' ANALOG ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    elif  _mode  &  PEER_MODE_DIGITAL : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        _peer_mode  =  ' DIGITAL ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
									
										
										
										
											2013-12-12 07:42:56 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    return  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ' PEER_OP ' :  _peer_op , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ' PEER_MODE ' :  _peer_mode , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ' TS_1 ' :  _ts1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ' TS_2 ' :  _ts2 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-11 20:56:39 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# Process the FLAGS bytes in registration replies for determining what services are available 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								def  process_flags_bytes ( _hex_flags ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-12 07:42:56 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    _byte3  =  int ( h ( _hex_flags [ 2 ] ) ,  16 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    _byte4  =  int ( h ( _hex_flags [ 3 ] ) ,  16 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    _csbk        =  bool ( _byte3  &  CSBK_MSK ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    _rpt_mon     =  bool ( _byte3  &  RPT_MON_MSK ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    _con_app     =  bool ( _byte3  &  CON_APP_MSK ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    _xnl_con     =  bool ( _byte4  &  XNL_STAT_MSK ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    _xnl_master  =  bool ( _byte4  &  XNL_MSTR_MSK ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    _xnl_slave   =  bool ( _byte4  &  XNL_SLAVE_MSK ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    _auth        =  bool ( _byte4  &  PKT_AUTH_MSK ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    _data        =  bool ( _byte4  &  DATA_CALL_MSK ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    _voice       =  bool ( _byte4  &  VOICE_CALL_MSK ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    _master      =  bool ( _byte4  &  MSTR_PEER_MSK ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-12 16:12:36 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        ' CSBK ' :  _csbk , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ' RCM ' :  _rpt_mon , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ' CON_APP ' :  _con_app , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ' XNL_CON ' :  _xnl_con , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ' XNL_MASTER ' :  _xnl_master , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ' XNL_SLAVE ' :  _xnl_slave , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ' AUTH ' :  _auth , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ' DATA ' :  _data , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ' VOICE ' :  _voice , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ' MASTER ' :  _master 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-12 07:42:56 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        }  
							 
						 
					
						
							
								
									
										
										
										
											2014-05-17 13:18:45 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# Take a received peer list and the network it belongs to, process and populate the 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# data structure in my_ipsc_config with the results, and return a simple list of peers. 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-29 13:38:59 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:19:32 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								def  process_peer_list ( _data ,  _network ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 16:48:44 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # Create a temporary peer list to track who we should have in our list -- used to find old peers we should remove. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    _temp_peers  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 09:43:45 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # Determine the length of the peer list for the parsing iterator 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:19:32 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    _peer_list_length  =  int ( h ( _data [ 5 : 7 ] ) ,  16 ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 09:43:45 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # Record the number of peers in the data structure... we'll use it later (11 bytes per peer entry) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    NETWORK [ _network ] [ ' LOCAL ' ] [ ' NUM_PEERS ' ]  =  _peer_list_length / 11 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-08 08:29:57 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    logger . info ( ' ( %s ) Peer List Received from Master:  %s  peers in this IPSC ' ,  _network ,  NETWORK [ _network ] [ ' LOCAL ' ] [ ' NUM_PEERS ' ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-28 22:22:04 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # Iterate each peer entry in the peer list. Skip the header, then pull the next peer, the next, etc. 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    for  i  in  range ( 7 ,  _peer_list_length  + 7 ,  11 ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        # Extract various elements from each entry... 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        _hex_radio_id  =  ( _data [ i : i + 4 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        _hex_address   =  ( _data [ i + 4 : i + 8 ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-12 16:23:46 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        _ip_address    =  IPAddr ( _hex_address ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        _hex_port      =  ( _data [ i + 8 : i + 10 ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:19:32 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        _port          =  int ( h ( _hex_port ) ,  16 ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        _hex_mode      =  ( _data [ i + 10 : i + 11 ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-11 20:53:55 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								     
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 16:48:44 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        # Add this peer to a temporary PeerID list - used to remove any old peers no longer with us 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        _temp_peers . append ( _hex_radio_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
									
										
										
										
											2013-12-11 20:53:55 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        # This is done elsewhere for the master too, so we use a separate function 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        _decoded_mode  =  process_mode_byte ( _hex_mode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-08-26 08:01:27 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        # If this entry WAS already in our list, update everything except the stats 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        # in case this was a re-registration with a different mode, flags, etc. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  _hex_radio_id  in  NETWORK [ _network ] [ ' PEERS ' ] . keys ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            NETWORK [ _network ] [ ' PEERS ' ] [ _hex_radio_id ] [ ' IP ' ]  =  _ip_address 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            NETWORK [ _network ] [ ' PEERS ' ] [ _hex_radio_id ] [ ' PORT ' ]  =  _port 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            NETWORK [ _network ] [ ' PEERS ' ] [ _hex_radio_id ] [ ' MODE ' ]  =  _hex_mode 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            NETWORK [ _network ] [ ' PEERS ' ] [ _hex_radio_id ] [ ' MODE_DECODE ' ]  =  _decoded_mode 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            NETWORK [ _network ] [ ' PEERS ' ] [ _hex_radio_id ] [ ' FLAGS ' ]  =  ' ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            NETWORK [ _network ] [ ' PEERS ' ] [ _hex_radio_id ] [ ' FLAGS_DECODE ' ]  =  ' ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-27 19:43:42 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            logger . debug ( ' ( %s ) Peer Updated:  %s ' ,  _network ,  NETWORK [ _network ] [ ' PEERS ' ] [ _hex_radio_id ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-26 08:01:27 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-12-12 16:59:56 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        # If this entry was NOT already in our list, add it. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  _hex_radio_id  not  in  NETWORK [ _network ] [ ' PEERS ' ] . keys ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            NETWORK [ _network ] [ ' PEERS ' ] [ _hex_radio_id ]  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' IP ' :           _ip_address ,  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' PORT ' :         _port ,  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' MODE ' :         _hex_mode ,             
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' MODE_DECODE ' :  _decoded_mode , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' FLAGS ' :  ' ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' FLAGS_DECODE ' :  ' ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ' STATUS ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    ' CONNECTED ' :                False , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    ' KEEP_ALIVES_SENT ' :         0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    ' KEEP_ALIVES_MISSED ' :       0 , 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 22:21:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    ' KEEP_ALIVES_OUTSTANDING ' :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    ' KEEP_ALIVES_RECEIVED ' :     0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    ' KEEP_ALIVE_RX_TIME ' :       0 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-12 16:59:56 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    } 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:19:32 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-27 19:43:42 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            logger . debug ( ' ( %s ) Peer Added:  %s ' ,  _network ,  NETWORK [ _network ] [ ' PEERS ' ] [ _hex_radio_id ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 16:48:44 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # Finally, check to see if there's a peer already in our list that was not in this peer list 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # and if so, delete it. 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 10:20:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    for  peer  in  NETWORK [ _network ] [ ' PEERS ' ] . keys ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  peer  not  in  _temp_peers : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            de_register_peer ( _network ,  peer ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            logger . warning ( ' ( %s ) Peer Deleted (not in new peer list):  %s ' ,  _network ,  h ( peer ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-06 22:33:04 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-17 10:40:19 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# Build a peer list - used when a peer registers, re-regiseters or times out 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								def  build_peer_list ( _peers ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    concatenated_peers  =  ' ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    for  peer  in  _peers : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        hex_ip  =  IPHexStr ( _peers [ peer ] [ ' IP ' ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        hex_port  =  hex_str_2 ( _peers [ peer ] [ ' PORT ' ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        mode  =  _peers [ peer ] [ ' MODE ' ]         
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        concatenated_peers  + =  peer  +  hex_ip  +  hex_port  +  mode 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    peer_list  =  hex_str_2 ( len ( concatenated_peers ) )  +  concatenated_peers 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  peer_list 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-28 22:22:04 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# Gratuitous print-out of the peer list.. Pretty much debug stuff. 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 08:28:52 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-28 22:33:14 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								def  print_peer_list ( _network ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:19:32 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    _peers  =  NETWORK [ _network ] [ ' PEERS ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
									
										
										
										
											2013-10-28 22:39:45 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    _status  =  NETWORK [ _network ] [ ' MASTER ' ] [ ' STATUS ' ] [ ' PEER_LIST ' ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-24 15:48:16 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    #print('Peer List Status for {}: {}' .format(_network, _status)) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 15:28:18 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  _status  and  not  NETWORK [ _network ] [ ' PEERS ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        print ( ' We are the only peer for:  %s '  %  _network ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 20:36:35 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        print ( ' ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-28 22:33:14 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:19:32 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								             
							 
						 
					
						
							
								
									
										
										
										
											2013-07-31 12:33:31 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    print ( ' Peer List for:  %s '  %  _network ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:19:32 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    for  peer  in  _peers . keys ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        _this_peer  =  _peers [ peer ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        _this_peer_stat  =  _this_peer [ ' STATUS ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  peer  ==  NETWORK [ _network ] [ ' LOCAL ' ] [ ' RADIO_ID ' ] : 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-31 20:56:49 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            me  =  ' (self) ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            me  =  ' ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-11 14:50:03 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								             
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:19:32 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        print ( ' \t RADIO ID:  {}   {} '  . format ( int ( h ( peer ) ,  16 ) ,  me ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        print ( ' \t \t IP Address:  {} : {} '  . format ( _this_peer [ ' IP ' ] ,  _this_peer [ ' PORT ' ] ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-15 09:45:39 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        if  _this_peer [ ' MODE_DECODE ' ]  and  REPORTS [ ' PEER_REPORT_INC_MODE ' ] : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-12 16:12:36 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            print ( ' \t \t Mode Values: ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            for  name ,  value  in  _this_peer [ ' MODE_DECODE ' ] . items ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                print ( ' \t \t \t {} :  {} '  . format ( name ,  value ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-15 09:45:39 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        if  _this_peer [ ' FLAGS_DECODE ' ]  and  REPORTS [ ' PEER_REPORT_INC_FLAGS ' ] : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-12 16:12:36 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            print ( ' \t \t Service Flags: ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            for  name ,  value  in  _this_peer [ ' FLAGS_DECODE ' ] . items ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                print ( ' \t \t \t {} :  {} '  . format ( name ,  value ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:19:32 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        print ( ' \t \t Status:  {} ,  KeepAlives Sent:  {} ,  KeepAlives Outstanding:  {} ,  KeepAlives Missed:  {} '  . format ( _this_peer_stat [ ' CONNECTED ' ] ,  _this_peer_stat [ ' KEEP_ALIVES_SENT ' ] ,  _this_peer_stat [ ' KEEP_ALIVES_OUTSTANDING ' ] ,  _this_peer_stat [ ' KEEP_ALIVES_MISSED ' ] ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 22:21:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        print ( ' \t \t                 KeepAlives Received:  {} ,  Last KeepAlive Received at:  {} '  . format ( _this_peer_stat [ ' KEEP_ALIVES_RECEIVED ' ] ,  _this_peer_stat [ ' KEEP_ALIVE_RX_TIME ' ] ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
									
										
										
										
											2013-07-31 12:33:31 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    print ( ' ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:19:32 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# Gratuitous print-out of Master info.. Pretty much debug stuff. 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-24 15:48:16 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								def  print_master ( _network ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-08 08:39:41 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    if  NETWORK [ _network ] [ ' LOCAL ' ] [ ' MASTER_PEER ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        print ( ' DMRlink is the Master for  %s '  %  _network ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        _master  =  NETWORK [ _network ] [ ' MASTER ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        print ( ' Master for  %s '  %  _network ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        print ( ' \t RADIO ID:  {} '  . format ( int ( h ( _master [ ' RADIO_ID ' ] ) ,  16 ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  _master [ ' MODE_DECODE ' ]  and  REPORTS [ ' PEER_REPORT_INC_MODE ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            print ( ' \t \t Mode Values: ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            for  name ,  value  in  _master [ ' MODE_DECODE ' ] . items ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                print ( ' \t \t \t {} :  {} '  . format ( name ,  value ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  _master [ ' FLAGS_DECODE ' ]  and  REPORTS [ ' PEER_REPORT_INC_FLAGS ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            print ( ' \t \t Service Flags: ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            for  name ,  value  in  _master [ ' FLAGS_DECODE ' ] . items ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                print ( ' \t \t \t {} :  {} '  . format ( name ,  value ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        print ( ' \t \t Status:  {} ,  KeepAlives Sent:  {} ,  KeepAlives Outstanding:  {} ,  KeepAlives Missed:  {} '  . format ( _master [ ' STATUS ' ] [ ' CONNECTED ' ] ,  _master [ ' STATUS ' ] [ ' KEEP_ALIVES_SENT ' ] ,  _master [ ' STATUS ' ] [ ' KEEP_ALIVES_OUTSTANDING ' ] ,  _master [ ' STATUS ' ] [ ' KEEP_ALIVES_MISSED ' ] ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 22:21:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        print ( ' \t \t                 KeepAlives Received:  {} ,  Last KeepAlive Received at:  {} '  . format ( _master [ ' STATUS ' ] [ ' KEEP_ALIVES_RECEIVED ' ] ,  _master [ ' STATUS ' ] [ ' KEEP_ALIVE_RX_TIME ' ] ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 08:28:52 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-17 13:18:45 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# Shut ourselves down gracefully with the IPSC peers. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								def  handler ( _signal ,  _frame ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    logger . info ( ' *** DMRLINK IS TERMINATING WITH SIGNAL  %s  *** ' ,  str ( _signal ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    for  network  in  networks : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        this_ipsc  =  networks [ network ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        logger . info ( ' De-Registering from IPSC  %s ' ,  network ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        de_reg_req_pkt  =  this_ipsc . hashed_packet ( this_ipsc . _local [ ' AUTH_KEY ' ] ,  this_ipsc . DE_REG_REQ_PKT ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        send_to_ipsc ( network ,  de_reg_req_pkt ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    reactor . stop ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 08:28:52 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								#************************************************ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#********                             *********** 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 15:41:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								#********    IPSC Network 'Engine'    *********** 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 08:28:52 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								#********                             *********** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#************************************************ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-11 19:45:09 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								#************************************************ 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 15:28:18 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								#     Base Class (used nearly all of the time) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-11 19:45:09 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								#************************************************ 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 16:15:54 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 15:28:18 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 16:15:54 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								class  IPSC ( DatagramProtocol ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    #************************************************ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    #     IPSC INSTANCE INSTANTIATION 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    #************************************************ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 08:28:52 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # Modify the initializer to set up our environment and build the packets 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # we need to maintain connections 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 08:28:52 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 16:15:54 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								    def  __init__ ( self ,  * args ,  * * kwargs ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  len ( args )  ==  1 : 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 15:41:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # Housekeeping: create references to the configuration and status data for this IPSC instance. 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-28 15:53:56 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # Some configuration objects that are used frequently and have lengthy names are shortened 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # such as (self._master_sock) expands to (self._config['MASTER']['IP'], self._config['MASTER']['PORT']). 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            # Note that many of them reference each other... this is the Pythonic way. 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 15:41:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-28 16:22:25 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            self . _network  =  args [ 0 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . _config  =  NETWORK [ self . _network ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-28 15:53:56 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . _local  =  self . _config [ ' LOCAL ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . _local_id  =  self . _local [ ' RADIO_ID ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            # 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . _master  =  self . _config [ ' MASTER ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . _master_stat  =  self . _master [ ' STATUS ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . _master_sock  =  self . _master [ ' IP ' ] ,  self . _master [ ' PORT ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            # 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . _peers  =  self . _config [ ' PEERS ' ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-06 22:33:04 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-08 21:48:28 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # This is a regular list to store peers for the IPSC. At times, parsing a simple list is much less 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            # Spendy than iterating a list of dictionaries... Maybe I'll find a better way in the future. Also 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            # We have to know when we have a new peer list, so a variable to indicate we do (or don't) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            # 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 16:15:54 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								            args  =  ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 15:41:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # Packet 'constructors' - builds the necessary control packets for this IPSC instance. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            # This isn't really necessary for anything other than readability (reduction of code golf) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 15:41:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-12 21:18:04 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # General Items 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . TS_FLAGS                =  ( self . _local [ ' MODE ' ]  +  self . _local [ ' FLAGS ' ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            # 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            # Peer Link Maintenance Packets  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . MASTER_REG_REQ_PKT      =  ( MASTER_REG_REQ  +  self . _local_id  +  self . TS_FLAGS  +  IPSC_VER ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . MASTER_ALIVE_PKT        =  ( MASTER_ALIVE_REQ  +  self . _local_id  +  self . TS_FLAGS  +  IPSC_VER ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . PEER_LIST_REQ_PKT       =  ( PEER_LIST_REQ  +  self . _local_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . PEER_REG_REQ_PKT        =  ( PEER_REG_REQ  +  self . _local_id  +  IPSC_VER ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . PEER_REG_REPLY_PKT      =  ( PEER_REG_REPLY  +  self . _local_id  +  IPSC_VER ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . PEER_ALIVE_REQ_PKT      =  ( PEER_ALIVE_REQ  +  self . _local_id  +  self . TS_FLAGS ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . PEER_ALIVE_REPLY_PKT    =  ( PEER_ALIVE_REPLY  +  self . _local_id  +  self . TS_FLAGS ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            # 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            # Master Link Maintenance Packets 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-24 14:56:53 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # self.MASTER_REG_REPLY_PKT   is not static and must be generated when it is sent 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-12 21:18:04 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            self . MASTER_ALIVE_REPLY_PKT  =  ( MASTER_ALIVE_REPLY  +  self . _local_id  +  self . TS_FLAGS  +  IPSC_VER ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . PEER_LIST_REPLY_PKT     =  ( PEER_LIST_REPLY  +  self . _local_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            # 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-17 13:18:45 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # General Link Maintenance Packets 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . DE_REG_REQ_PKT          =  ( DE_REG_REQ  +  self . _local_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . DE_REG_REPLY_PKT        =  ( DE_REG_REPLY  +  self . _local_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            # 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 11:33:52 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            logger . info ( ' ( %s ) IPSC Instance Created ' ,  self . _network ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 16:15:54 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								        else : 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 15:41:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # If we didn't get called correctly, log it! 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            # 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 11:33:52 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            logger . error ( ' ( %s ) IPSC Instance Could Not be Created... Exiting ' ,  self . _network ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            sys . exit ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-28 21:42:47 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        # 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 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 15:28:18 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-28 20:34:29 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    #************************************************ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    #     CALLBACK FUNCTIONS FOR USER PACKET TYPES 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    #************************************************ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-18 15:28:27 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    def  call_mon_status ( self ,  _network ,  _data ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 16:14:02 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        logger . debug ( ' ( %s ) Repeater Call Monitor Origin Packet Received:  %s ' , _network ,  h ( _data ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-28 20:34:29 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
									
										
										
										
											2013-11-23 17:30:12 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    def  call_mon_rpt ( self ,  _network ,  _data ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 16:14:02 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        logger . debug ( ' ( %s ) Repeater Call Monitor Repeating Packet Received:  %s ' ,  _network ,  h ( _data ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-28 20:34:29 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
									
										
										
										
											2013-11-23 17:30:12 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    def  call_mon_nack ( self ,  _network ,  _data ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 16:14:02 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        logger . debug ( ' ( %s ) Repeater Call Monitor NACK Packet Received:  %s ' ,  _network ,  h ( _data ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-28 20:34:29 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    def  xcmp_xnl ( self ,  _network ,  _data ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 16:14:02 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        logger . debug ( ' ( %s ) XCMP/XNL Packet Received:  %s ' ,  _network ,  h ( _data ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-21 11:47:43 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
									
										
										
										
											2013-11-22 15:43:47 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    def  repeater_wake_up ( self ,  _network ,  _data ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 16:14:02 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        logger . debug ( ' ( %s ) Repeater Wake-Up Packet Received:  %s ' ,  _network ,  h ( _data ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-22 15:43:47 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
									
										
										
										
											2013-10-28 20:34:29 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    def  group_voice ( self ,  _network ,  _src_sub ,  _dst_sub ,  _ts ,  _end ,  _peerid ,  _data ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 17:17:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        logger . debug ( ' ( %s ) Group Voice Packet Received From:  %s , IPSC Peer  %s , Destination  %s ' ,  _network ,  h ( _src_sub ) ,  h ( _peerid ) ,  h ( _dst_sub ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-28 20:34:29 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    def  private_voice ( self ,  _network ,  _src_sub ,  _dst_sub ,  _ts ,  _end ,  _peerid ,  _data ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 17:17:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        logger . debug ( ' ( %s ) Private Voice Packet Received From:  %s , IPSC Peer  %s , Destination  %s ' ,  _network ,  h ( _src_sub ) ,  h ( _peerid ) ,  h ( _dst_sub ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-28 20:34:29 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    def  group_data ( self ,  _network ,  _src_sub ,  _dst_sub ,  _ts ,  _end ,  _peerid ,  _data ) :     
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 17:17:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        logger . debug ( ' ( %s ) Group Data Packet Received From:  %s , IPSC Peer  %s , Destination  %s ' ,  _network ,  h ( _src_sub ) ,  h ( _peerid ) ,  h ( _dst_sub ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-28 20:34:29 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    def  private_data ( self ,  _network ,  _src_sub ,  _dst_sub ,  _ts ,  _end ,  _peerid ,  _data ) :     
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 17:17:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        logger . debug ( ' ( %s ) Private Data Packet Received From:  %s , IPSC Peer  %s , Destination  %s ' ,  _network ,  h ( _src_sub ) ,  h ( _peerid ) ,  h ( _dst_sub ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-28 20:34:29 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    def  unknown_message ( self ,  _network ,  _packettype ,  _peerid ,  _data ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:19:32 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        _packettype  =  h ( _packettype ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 17:17:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        logger . error ( ' ( %s ) Unknown message type encountered \n \t Packet Type:  %s \n \t From:  %s \n \t Packet:  %s ' ,  _network ,  h ( _packettype ) ,  h ( _peerid ) ,  h ( _data ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-28 20:34:29 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    #************************************************ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    #     IPSC SPECIFIC MAINTENANCE FUNCTIONS 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    #************************************************ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-12-05 15:20:59 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # Reset the outstanding keep-alive counter for _peerid... 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # Used when receiving acks OR when we see traffic from a repeater, since they ignore keep-alives when transmitting 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    def  reset_keep_alive ( self ,  _peerid ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  _peerid  in  self . _peers . keys ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . _peers [ _peerid ] [ ' STATUS ' ] [ ' KEEP_ALIVES_OUTSTANDING ' ]  =  0 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 10:20:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            self . _peers [ _peerid ] [ ' STATUS ' ] [ ' KEEP_ALIVE_RX_TIME ' ]  =  int ( time . time ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-05 15:20:59 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        if  _peerid  ==  self . _master [ ' RADIO_ID ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . _master_stat [ ' KEEP_ALIVES_OUTSTANDING ' ]  =  0 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 08:28:52 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-04-28 21:42:47 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # NEXT THREE FUNCITONS ARE FOR AUTHENTICATED PACKETS 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # Take a packet to be SENT, calculate auth hash and return the whole thing 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 15:28:18 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-28 21:42:47 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    def  auth_hashed_packet ( self ,  _key ,  _data ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-12 16:23:46 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        _hash  =  binascii . a2b_hex ( ( hmac_new ( _key , _data , sha1 ) ) . hexdigest ( ) [ : 20 ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return  _data  +  _hash 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 15:28:18 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
									
										
										
										
											2013-10-30 13:36:45 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # Remove the hash from a packet and return the payload 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-28 21:42:47 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    def  auth_strip_hash ( self ,  _data ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-30 13:36:45 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return  _data [ : - 10 ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 15:28:18 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # Take a RECEIVED packet, calculate the auth hash and verify authenticity 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-28 21:42:47 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    def  auth_validate_auth ( self ,  _key ,  _data ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-30 13:36:45 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        _payload  =  self . strip_hash ( _data ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 15:28:18 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        _hash  =  _data [ - 10 : ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-12 16:23:46 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        _chk_hash  =  binascii . a2b_hex ( ( hmac_new ( _key , _payload , sha1 ) ) . hexdigest ( ) [ : 20 ] )    
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 15:28:18 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  _chk_hash  ==  _hash : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            return  True 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            return  False 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-28 21:42:47 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # 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 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 15:28:18 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 08:28:52 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    #************************************************ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    #     TIMED LOOP - CONNECTION MAINTENANCE 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    #************************************************ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # Timed loop initialization (called by the twisted reactor) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    #        
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    def  startProtocol ( self ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        # Timed loops for: 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        #   IPSC connection establishment and maintenance 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        #   Reporting/Housekeeping 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        # 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  not  self . _local [ ' MASTER_PEER ' ] : 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 17:17:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            self . _peer_maintenance  =  task . LoopingCall ( self . peer_maintenance_loop ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . _peer_maintenance_loop  =  self . _peer_maintenance . start ( self . _local [ ' ALIVE_TIMER ' ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        # 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  self . _local [ ' MASTER_PEER ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . _master_maintenance  =  task . LoopingCall ( self . master_maintenance_loop ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . _master_maintenance_loop  =  self . _master_maintenance . start ( self . _local [ ' ALIVE_TIMER ' ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        # 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        self . _reporting  =  task . LoopingCall ( self . reporting_loop ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-15 08:39:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        self . _reporting_loop  =  self . _reporting . start ( REPORTS [ ' REPORT_INTERVAL ' ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-24 15:48:16 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # Timed loop used for reporting IPSC status 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-24 15:48:16 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    def  reporting_loop ( self ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        # Right now, without this, we really don't know anything is happening. 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-13 12:07:18 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        logger . debug ( ' ( %s ) Periodic Reporting Loop Started ' ,  self . _network ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-15 09:45:39 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        if  REPORTS [ ' REPORT_PEERS ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            print_master ( self . _network ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            print_peer_list ( self . _network ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 17:17:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # Timed loop used for IPSC connection Maintenance when we are the MASTER 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    #     
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    def  master_maintenance_loop ( self ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 22:21:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        logger . debug ( ' ( %s ) MASTER Connection Maintenance Loop Started ' ,  self . _network ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        update_time  =  int ( time . time ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 10:20:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        for  peer  in  self . _peers . keys ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            keep_alive_delta  =  update_time  -  self . _peers [ peer ] [ ' STATUS ' ] [ ' KEEP_ALIVE_RX_TIME ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            logger . debug ( ' ( %s ) Time Since Last KeepAlive Request from Peer  %s :  %s  seconds ' ,  self . _network ,  h ( peer ) ,  keep_alive_delta ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 09:02:45 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								          
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            if  keep_alive_delta  >  120 : 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 10:20:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                de_register_peer ( self . _network ,  peer ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-17 10:53:27 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                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 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                send_to_ipsc ( self . _network ,  peer_list_packet ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 10:20:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                logger . warning ( ' ( %s ) Timeout Exceeded for Peer  %s , De-registering ' ,  self . _network ,  h ( peer ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 09:02:45 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 17:17:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # Timed loop used for IPSC connection Maintenance when we are a PEER 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 17:17:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    def  peer_maintenance_loop ( self ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        logger . debug ( ' ( %s ) PEER Connection Maintenance Loop Started ' ,  self . _network ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-13 12:07:18 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        # If the master isn't connected, we have to do that before we can do anything else! 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        # 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        if  not  self . _master_stat [ ' CONNECTED ' ] : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 15:28:18 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            reg_packet  =  self . hashed_packet ( self . _local [ ' AUTH_KEY ' ] ,  self . MASTER_REG_REQ_PKT ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            self . transport . write ( reg_packet ,  self . _master_sock ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-03 10:47:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            logger . info ( ' ( %s ) Registering with the Master ' ,  self . _network ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 08:28:52 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        # Once the master is connected, we have to send keep-alives.. and make sure we get them back 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        elif  self . _master_stat [ ' CONNECTED ' ] : 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # Send keep-alive to the master 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 15:28:18 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            master_alive_packet  =  self . hashed_packet ( self . _local [ ' AUTH_KEY ' ] ,  self . MASTER_ALIVE_PKT ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            self . transport . write ( master_alive_packet ,  self . _master_sock ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-21 10:40:52 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            logger . debug ( ' ( %s ) Keep Alive Sent to the Master ' ,  self . _network ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 08:28:52 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # If we had a keep-alive outstanding by the time we send another, mark it missed. 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-28 15:53:56 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            if  ( self . _master_stat [ ' KEEP_ALIVES_OUTSTANDING ' ] )  >  0 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                self . _master_stat [ ' KEEP_ALIVES_MISSED ' ]  + =  1 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-10 21:43:55 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                logger . info ( ' ( %s ) Master Keep-Alive Missed ' ,  self . _network ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 08:28:52 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # If we have missed too many keep-alives, de-register the master and start over. 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-28 15:53:56 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            if  self . _master_stat [ ' KEEP_ALIVES_OUTSTANDING ' ]  > =  self . _local [ ' MAX_MISSED ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                self . _master_stat [ ' CONNECTED ' ]  =  False 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 16:14:02 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                self . _master_stat [ ' KEEP_ALIVES_OUTSTANDING ' ]  =  0 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-10 21:43:55 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                logger . error ( ' ( %s ) Maximum Master Keep-Alives Missed -- De-registering the Master ' ,  self . _network ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            # Update our stats before we move on... 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-01 15:09:20 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            self . _master_stat [ ' KEEP_ALIVES_SENT ' ]  + =  1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . _master_stat [ ' KEEP_ALIVES_OUTSTANDING ' ]  + =  1 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 08:28:52 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        else : 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # This is bad. If we get this message, we need to reset the state and try again 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-28 16:22:25 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            logger . error ( ' ->> ( %s ) Master in UNKOWN STATE: %s : %s ' ,  self . _network ,  self . _master_sock ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            self . _master_stat [ ' CONNECTED ' ]  =  False 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        # If the master is connected and we don't have a peer-list yet.... 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        # 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        if  ( self . _master_stat [ ' CONNECTED ' ]  ==  True )  and  ( self . _master_stat [ ' PEER_LIST ' ]  ==  False ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # Ask the master for a peer-list 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            if  self . _local [ ' NUM_PEERS ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                peer_list_req_packet  =  self . hashed_packet ( self . _local [ ' AUTH_KEY ' ] ,  self . PEER_LIST_REQ_PKT ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                self . transport . write ( peer_list_req_packet ,  self . _master_sock ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                logger . info ( ' ( %s ), No Peer List - Requesting One From the Master ' ,  self . _network ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                self . _master_stat [ ' PEER_LIST ' ]  =  True 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                logger . debug ( ' ( %s ), Skip asking for a Peer List, we are the only Peer ' ,  self . _network ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 08:28:52 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-28 22:39:45 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        # If we do have a peer-list, we need to register with the peers and send keep-alives... 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        # 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        if  self . _master_stat [ ' PEER_LIST ' ] : 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # Iterate the list of peers... so we do this for each one. 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 10:20:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            for  peer  in  self . _peers . keys ( ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:19:32 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                # We will show up in the peer list, but shouldn't try to talk to ourselves. 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 10:20:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                if  peer  ==  self . _local_id : 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 08:28:52 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    continue 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:19:32 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                # If we haven't registered to a peer, send a registration 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 10:20:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                if  not  self . _peers [ peer ] [ ' STATUS ' ] [ ' CONNECTED ' ] : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 15:28:18 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    peer_reg_packet  =  self . hashed_packet ( self . _local [ ' AUTH_KEY ' ] ,  self . PEER_REG_REQ_PKT ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 10:20:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    self . transport . write ( peer_reg_packet ,  ( self . _peers [ peer ] [ ' IP ' ] ,  self . _peers [ peer ] [ ' PORT ' ] ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    logger . info ( ' ( %s ) Registering with Peer  %s ' ,  self . _network ,  int_id ( peer ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:19:32 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                # If we have registered with the peer, then send a keep-alive 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 10:20:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                elif  self . _peers [ peer ] [ ' STATUS ' ] [ ' CONNECTED ' ] : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 15:28:18 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    peer_alive_req_packet  =  self . hashed_packet ( self . _local [ ' AUTH_KEY ' ] ,  self . PEER_ALIVE_REQ_PKT ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 10:20:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    self . transport . write ( peer_alive_req_packet ,  ( self . _peers [ peer ] [ ' IP ' ] ,  self . _peers [ peer ] [ ' PORT ' ] ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    logger . debug ( ' ( %s ) Keep-Alive Sent to the Peer  %s ' ,  self . _network ,  int_id ( peer ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:19:32 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    # If we have a keep-alive outstanding by the time we send another, mark it missed. 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 10:20:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    if  self . _peers [ peer ] [ ' STATUS ' ] [ ' KEEP_ALIVES_OUTSTANDING ' ]  >  0 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                        self . _peers [ peer ] [ ' STATUS ' ] [ ' KEEP_ALIVES_MISSED ' ]  + =  1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                        logger . info ( ' ( %s ) Peer Keep-Alive Missed for  %s ' ,  self . _network ,  int_id ( peer ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:19:32 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    # If we have missed too many keep-alives, de-register the peer and start over. 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 10:20:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    if  self . _peers [ peer ] [ ' STATUS ' ] [ ' KEEP_ALIVES_OUTSTANDING ' ]  > =  self . _local [ ' MAX_MISSED ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                        self . _peers [ peer ] [ ' STATUS ' ] [ ' CONNECTED ' ]  =  False 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-13 12:07:18 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                        #del peer   # Becuase once it's out of the dictionary, you can't use it for anything else. 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 10:20:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                        logger . warning ( ' ( %s ) Maximum Peer Keep-Alives Missed -- De-registering the Peer:  %s ' ,  self . _network ,  int_id ( peer ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-01 15:09:20 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    # Update our stats before moving on... 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 10:20:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    self . _peers [ peer ] [ ' STATUS ' ] [ ' KEEP_ALIVES_SENT ' ]  + =  1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    self . _peers [ peer ] [ ' STATUS ' ] [ ' KEEP_ALIVES_OUTSTANDING ' ]  + =  1 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 08:28:52 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # For public display of information, etc. - anything not part of internal logging/diagnostics 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-14 19:07:32 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    def  _notify_event ( self ,  network ,  event ,  info ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        """ 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            Used  internally  whenever  an  event  happens  that  may  be  useful  to  notify  the  outside  world  about . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            Arguments : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                network :  string ,  network  name  to  look  up  in  config 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                event :    string ,  basic  description 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                info :     dict ,  in  the  interest  of  accomplishing  as  much  as  possible  without  code  changes . 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 10:20:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                         The  dict  will  typically  contain  the  ID  of  a  peer  so  the  origin  of  the  event  is  known . 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-14 19:07:32 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        """ 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        pass 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-22 11:21:32 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    #************************************************ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    #     MESSAGE RECEIVED - TAKE ACTION 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    #************************************************ 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 08:28:52 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # Actions for received packets by type: For every packet received, there are some things that we need to do: 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-30 16:23:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    #   Decode some of the info 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    #   Check for auth and authenticate the packet 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    #   Strip the hash from the end... we don't need it anymore 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # Once they're done, we move on to the processing or callbacks for each packet type. 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 08:28:52 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # Callbacks are iterated in the order of "more likely" to "less likely" to reduce processing time 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 16:15:54 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								    def  datagramReceived ( self ,  data ,  ( host ,  port ) ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-15 12:04:48 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        _packettype  =  data [ 0 : 1 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        _peerid      =  data [ 1 : 5 ] 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-13 17:14:46 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        _ipsc_seq    =  data [ 5 : 6 ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-29 13:23:37 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        # AUTHENTICATE THE PACKET 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        if  not  self . validate_auth ( self . _local [ ' AUTH_KEY ' ] ,  data ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-07 20:03:03 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            logger . warning ( ' ( %s ) AuthError: IPSC packet failed authentication. Type  %s : Peer ID:  %s ' ,  self . _network ,  h ( _packettype ) ,  int_id ( _peerid ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        # REMOVE SHA-1 AUTHENTICATION HASH: WE NO LONGER NEED IT 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-30 13:36:45 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        data  =  self . strip_hash ( data ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-28 23:36:39 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        # PACKETS THAT WE RECEIVE FROM ANY VALID PEER OR VALID MASTER 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        if  _packettype  in  ANY_PEER_REQUIRED : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-06 07:11:19 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            if  not ( valid_master ( self . _network ,  _peerid )  ==  False  or  valid_peer ( self . _peers . keys ( ) ,  _peerid )  ==  False ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-07 20:03:03 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                logger . warning ( ' ( %s ) PeerError: Peer not in peer-list:  %s ' ,  self . _network ,  int_id ( _peerid ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-31 20:46:03 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                return 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # ORIGINATED BY SUBSCRIBER UNITS - a.k.a someone transmitted 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            if  _packettype  in  USER_PACKETS : 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-13 17:14:46 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                # Extract IPSC header not already extracted 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                _src_sub     =  data [ 6 : 9 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                _dst_sub     =  data [ 9 : 12 ] 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-13 17:14:46 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                _call_type   =  data [ 12 : 13 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                _unknown_1   =  data [ 13 : 17 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                _call_info   =  int_id ( data [ 17 : 18 ] )                 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                _ts          =  bool ( _call_info  &  TS_CALL_MSK ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                _end         =  bool ( _call_info  &  END_MSK ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                # Extract RTP header fields 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ''' 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                Coming  soon  kids ! ! ! 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                Looks  like  version ,  padding ,  extention ,  CSIC ,  payload  type  and  SSID  never  change . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                The  things  we  might  care  about  are  below . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                _rtp_byte_1  =  int_id ( data [ 18 : 19 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                _rtp_byte_2  =  int_id ( data [ 19 : 20 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                _rtp_seq     =  int_id ( data [ 20 : 22 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                _rtp_tmstmp  =  int_id ( data [ 22 : 26 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ''' 
 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                # User Voice and Data Call Types: 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                if  _packettype  ==  GROUP_VOICE : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-05 15:20:59 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    self . reset_keep_alive ( _peerid ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-28 20:34:29 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    self . group_voice ( self . _network ,  _src_sub ,  _dst_sub ,  _ts ,  _end ,  _peerid ,  data ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 10:20:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    self . _notify_event ( self . _network ,  ' group_voice ' ,  { ' peer ' :  int_id ( _peerid ) } ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                elif  _packettype  ==  PVT_VOICE : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-05 15:20:59 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    self . reset_keep_alive ( _peerid ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-28 20:34:29 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    self . private_voice ( self . _network ,  _src_sub ,  _dst_sub ,  _ts ,  _end ,  _peerid ,  data ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 10:20:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    self . _notify_event ( self . _network ,  ' private_voice ' ,  { ' peer ' :  int_id ( _peerid ) } ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                elif  _packettype  ==  GROUP_DATA : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 16:14:02 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    self . reset_keep_alive ( _peerid ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-28 20:34:29 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    self . group_data ( self . _network ,  _src_sub ,  _dst_sub ,  _ts ,  _end ,  _peerid ,  data ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 10:20:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    self . _notify_event ( self . _network ,  ' group_data ' ,  { ' peer ' :  int_id ( _peerid ) } ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                elif  _packettype  ==  PVT_DATA : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 16:14:02 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    self . reset_keep_alive ( _peerid ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-28 20:34:29 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    self . private_data ( self . _network ,  _src_sub ,  _dst_sub ,  _ts ,  _end ,  _peerid ,  data ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 10:20:21 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    self . _notify_event ( self . _network ,  ' private_voice ' ,  { ' peer ' :  int_id ( _peerid ) } ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # MOTOROLA XCMP/XNL CONTROL PROTOCOL: We don't process these (yet)    
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            elif  _packettype  ==  XCMP_XNL : 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-28 20:34:29 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                self . xcmp_xnl ( self . _network ,  data ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # ORIGINATED BY PEERS, NOT IPSC MAINTENANCE: Call monitoring is all we've found here so far  
							 
						 
					
						
							
								
									
										
										
										
											2014-05-18 15:30:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            elif  _packettype  ==  CALL_MON_STATUS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                self . call_mon_status ( self . _network ,  data ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                
							 
						 
					
						
							
								
									
										
										
										
											2013-12-01 19:24:50 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            elif  _packettype  ==  CALL_MON_RPT : 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-23 17:30:12 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                self . call_mon_rpt ( self . _network ,  data ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                
							 
						 
					
						
							
								
									
										
										
										
											2013-12-01 19:24:50 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            elif  _packettype  ==  CALL_MON_NACK : 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-23 17:30:12 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                self . call_mon_nack ( self . _network ,  data ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # IPSC CONNECTION MAINTENANCE MESSAGES 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            elif  _packettype  ==  DE_REG_REQ : 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                de_register_peer ( self . _network ,  _peerid ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-07 20:03:03 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                logger . warning ( ' ( %s ) Peer De-Registration Request From:  %s ' ,  self . _network ,  int_id ( _peerid ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            elif  _packettype  ==  DE_REG_REPLY : 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-07 20:03:03 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                logger . warning ( ' ( %s ) Peer De-Registration Reply From:  %s ' ,  self . _network ,  int_id ( _peerid ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            elif  _packettype  ==  RPT_WAKE_UP : 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-22 15:43:47 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                self . repeater_wake_up ( self . _network ,  data ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-07 20:03:03 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                logger . debug ( ' ( %s ) Repeater Wake-Up Packet From:  %s ' ,  self . _network ,  int_id ( _peerid ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            return 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 15:28:18 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        # 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        # THE FOLLOWING PACKETS ARE RECEIVED ONLY IF WE ARE OPERATING AS A PEER 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        # 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        # ONLY ACCEPT FROM A PREVIOUSLY VALIDATED PEER 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        if  _packettype  in  PEER_REQUIRED : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            if  not  valid_peer ( self . _peers . keys ( ) ,  _peerid ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-07 20:03:03 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                logger . warning ( ' ( %s ) PeerError: Peer  %s  not in peer-list ' ,  self . _network ,  int_id ( _peerid ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-30 11:50:29 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                return 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # REQUESTS FROM PEERS: WE MUST REPLY IMMEDIATELY FOR IPSC MAINTENANCE 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            if  _packettype  ==  PEER_ALIVE_REQ : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-12 16:12:36 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                _hex_mode       =  ( data [ 5 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                _hex_flags      =  ( data [ 6 : 10 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                _decoded_mode   =  process_mode_byte ( _hex_mode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                _decoded_flags  =  process_flags_bytes ( _hex_flags ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                self . _peers [ _peerid ] [ ' MODE ' ]  =  _hex_mode 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                self . _peers [ _peerid ] [ ' MODE_DECODE ' ]  =  _decoded_mode 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                self . _peers [ _peerid ] [ ' FLAGS ' ]  =  _hex_flags 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                self . _peers [ _peerid ] [ ' FLAGS_DECODE ' ]  =  _decoded_flags 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                # Generate a hashed packet from our template and send it. 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                peer_alive_reply_packet  =  self . hashed_packet ( self . _local [ ' AUTH_KEY ' ] ,  self . PEER_ALIVE_REPLY_PKT ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                self . transport . write ( peer_alive_reply_packet ,  ( host ,  port ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-12 17:03:00 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                self . reset_keep_alive ( _peerid )   # Might as well reset our own counter, we know it's out there... 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-07 20:03:03 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                logger . debug ( ' ( %s ) Keep-Alive reply sent to Peer  %s ' ,  self . _network ,  int_id ( _peerid ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-30 11:50:29 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                return 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                                
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            elif  _packettype  ==  PEER_REG_REQ : 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-10 16:23:52 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                peer_reg_reply_packet  =  self . hashed_packet ( self . _local [ ' AUTH_KEY ' ] ,  self . PEER_REG_REPLY_PKT ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                self . transport . write ( peer_reg_reply_packet ,  ( host ,  port ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-07 20:03:03 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                logger . info ( ' ( %s ) Peer Registration Request From:  %s ' ,  self . _network ,  int_id ( _peerid ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-14 15:09:16 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                return 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            # ANSWERS FROM REQUESTS WE SENT TO PEERS: WE DO NOT REPLY 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            elif  _packettype  ==  PEER_ALIVE_REPLY : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-05 15:20:59 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                self . reset_keep_alive ( _peerid ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 22:21:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                self . _peers [ _peerid ] [ ' STATUS ' ] [ ' KEEP_ALIVES_RECEIVED ' ]  + =  1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                self . _peers [ _peerid ] [ ' STATUS ' ] [ ' KEEP_ALIVE_RX_TIME ' ]  =  int ( time . time ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-07 20:03:03 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                logger . debug ( ' ( %s ) Keep-Alive Reply (we sent the request) Received from Peer  %s ' ,  self . _network ,  int_id ( _peerid ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-11 14:38:27 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                return                 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            elif  _packettype  ==  PEER_REG_REPLY : 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:19:32 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                if  _peerid  in  self . _peers . keys ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    self . _peers [ _peerid ] [ ' STATUS ' ] [ ' CONNECTED ' ]  =  True 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-07 20:03:03 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    logger . info ( ' ( %s ) Registration Reply From:  %s ' ,  self . _network ,  int_id ( _peerid ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            return 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 15:28:18 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        # PACKETS ONLY ACCEPTED FROM OUR MASTER 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        # PACKETS WE ONLY ACCEPT IF WE HAVE FINISHED REGISTERING WITH OUR MASTER 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        if  _packettype  in  MASTER_REQUIRED : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            if  not  valid_master ( self . _network ,  _peerid ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-07 20:03:03 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                logger . warning ( ' ( %s ) MasterError:  %s  is not the master peer ' ,  self . _network ,  int_id ( _peerid ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-14 15:09:16 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                return 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            # ANSWERS FROM REQUESTS WE SENT TO THE MASTER: WE DO NOT REPLY     
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            if  _packettype  ==  MASTER_ALIVE_REPLY : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-05 15:20:59 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                self . reset_keep_alive ( _peerid ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 22:21:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                self . _master [ ' STATUS ' ] [ ' KEEP_ALIVES_RECEIVED ' ]  + =  1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                self . _master [ ' STATUS ' ] [ ' KEEP_ALIVE_RX_TIME ' ]  =  int ( time . time ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-07 20:03:03 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                logger . debug ( ' ( %s ) Keep-Alive Reply (we sent the request) Received from the Master  %s ' ,  self . _network ,  int_id ( _peerid ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-14 15:09:16 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                return 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-08 21:48:28 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            elif  _packettype  ==  PEER_LIST_REPLY : 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-28 22:39:45 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                NETWORK [ self . _network ] [ ' MASTER ' ] [ ' STATUS ' ] [ ' PEER_LIST ' ]  =  True 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                if  len ( data )  >  18 : 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-13 16:19:32 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    process_peer_list ( data ,  self . _network ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-07 20:03:03 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                logger . debug ( ' ( %s ) Peer List Reply Recieved From Master  %s ' ,  self . _network ,  int_id ( _peerid ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-14 15:09:16 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                return 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 15:28:18 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        # THIS MEANS WE HAVE SUCCESSFULLY REGISTERED TO OUR MASTER - RECORD MASTER INFORMATION 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        elif  _packettype  ==  MASTER_REG_REPLY : 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-11 19:09:35 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
									
										
										
										
											2014-05-13 11:18:44 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            _hex_mode       =  data [ 5 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            _hex_flags      =  data [ 6 : 10 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            _num_peers      =  data [ 10 : 12 ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-12 16:12:36 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            _decoded_mode   =  process_mode_byte ( _hex_mode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            _decoded_flags  =  process_flags_bytes ( _hex_flags ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-13 11:18:44 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . _local [ ' NUM_PEERS ' ]  =  int ( h ( _num_peers ) ,  16 ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            self . _master [ ' RADIO_ID ' ]  =  _peerid 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-11 20:53:55 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            self . _master [ ' MODE ' ]  =  _hex_mode 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-12 16:12:36 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            self . _master [ ' MODE_DECODE ' ]  =  _decoded_mode 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . _master [ ' FLAGS ' ]  =  _hex_flags 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . _master [ ' FLAGS_DECODE ' ]  =  _decoded_flags 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            self . _master_stat [ ' CONNECTED ' ]  =  True 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . _master_stat [ ' KEEP_ALIVES_OUTSTANDING ' ]  =  0 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-13 11:18:44 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            logger . warning ( ' ( %s ) Registration response (we requested reg) from the Master  %s  ( %s  peers) ' ,  self . _network ,  int_id ( _peerid ) ,  self . _local [ ' NUM_PEERS ' ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        # THE FOLLOWING PACKETS ARE RECEIVED ONLLY IF WE ARE OPERATING AS A MASTER 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        # REQUESTS FROM PEERS: WE MUST REPLY IMMEDIATELY FOR IPSC MAINTENANCE 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        # REQUEST TO REGISTER TO THE IPSC 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        elif  _packettype  ==  MASTER_REG_REQ : 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-12 21:18:04 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            _ip_address     =  host 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            _port           =  port 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-13 11:18:44 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            _hex_mode       =  data [ 5 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            _hex_flags      =  data [ 6 : 10 ] 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-12 21:18:04 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            _decoded_mode   =  process_mode_byte ( _hex_mode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            _decoded_flags  =  process_flags_bytes ( _hex_flags ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
									
										
										
										
											2014-05-24 14:58:49 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            self . MASTER_REG_REPLY_PKT  =  ( MASTER_REG_REPLY  +  self . _local_id  +  self . TS_FLAGS  +  hex_str_2 ( self . _local [ ' NUM_PEERS ' ] )  +  IPSC_VER ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-24 14:56:53 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
									
										
										
										
											2014-05-12 21:18:04 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            master_reg_reply_packet  =  self . hashed_packet ( self . _local [ ' AUTH_KEY ' ] ,  self . MASTER_REG_REPLY_PKT ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            self . transport . write ( master_reg_reply_packet ,  ( host ,  port ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-07 20:03:03 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            logger . debug ( ' ( %s ) Master Registration Packet Received from peer  %s ' ,  self . _network ,  int_id ( _peerid ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            # If this entry was NOT already in our list, add it. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            if  _peerid  not  in  self . _peers . keys ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                self . _peers [ _peerid ]  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    ' IP ' :           _ip_address ,  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    ' PORT ' :         _port ,  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    ' MODE ' :         _hex_mode ,             
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    ' MODE_DECODE ' :  _decoded_mode , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    ' FLAGS ' :        _hex_flags , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    ' FLAGS_DECODE ' :  _decoded_flags , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    ' STATUS ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                        ' CONNECTED ' :                True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                        ' KEEP_ALIVES_SENT ' :         0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                        ' KEEP_ALIVES_MISSED ' :       0 , 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 22:21:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                        ' KEEP_ALIVES_OUTSTANDING ' :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                        ' KEEP_ALIVES_RECEIVED ' :     0 , 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 09:02:45 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                        ' KEEP_ALIVE_RX_TIME ' :       int ( time . time ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    } 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 19:44:26 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            self . _local [ ' NUM_PEERS ' ]  =  len ( self . _peers )        
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            logger . debug ( ' ( %s ) Peer Added To Peer List:  %s  (IPSC now has  %s  Peers) ' ,  self . _network ,  self . _peers [ _peerid ] ,  self . _local [ ' NUM_PEERS ' ] )             
							 
						 
					
						
							
								
									
										
										
										
											2014-05-12 21:18:04 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            return 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								          
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        # REQUEST FOR A KEEP-ALIVE REPLY (WE KNOW THE PEER IS STILL ALIVE TOO)  
							 
						 
					
						
							
								
									
										
										
										
											2014-05-12 21:18:04 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        elif  _packettype  ==  MASTER_ALIVE_REQ : 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 20:58:58 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            if  _peerid  in  self . _peers . keys ( ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 22:21:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                self . _peers [ _peerid ] [ ' STATUS ' ] [ ' KEEP_ALIVES_RECEIVED ' ]  + =  1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                self . _peers [ _peerid ] [ ' STATUS ' ] [ ' KEEP_ALIVE_RX_TIME ' ]  =  int ( time . time ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 20:58:58 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                master_alive_reply_packet  =  self . hashed_packet ( self . _local [ ' AUTH_KEY ' ] ,  self . MASTER_ALIVE_REPLY_PKT ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                self . transport . write ( master_alive_reply_packet ,  ( host ,  port ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-15 22:21:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 20:58:58 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                logger . debug ( ' ( %s ) Master Keep-Alive Request Received from peer  %s ' ,  self . _network ,  int_id ( _peerid ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                logger . warning ( ' ( %s ) Master Keep-Alive Request Received from *UNREGISTERED* peer  %s ' ,  self . _network ,  int_id ( _peerid ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-12 21:18:04 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        # REQUEST FOR A PEER LIST 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-12 21:18:04 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        elif  _packettype  ==  PEER_LIST_REQ : 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-17 10:40:19 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 21:41:20 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            if  _peerid  in  self . _peers . keys ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                logger . debug ( ' ( %s ) Peer List Request from peer  %s ' ,  self . _network ,  int_id ( _peerid ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-17 10:40:19 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                peer_list_packet  =  self . PEER_LIST_REPLY_PKT  +  build_peer_list ( self . _peers ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 21:41:20 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                peer_list_packet  =  self . hashed_packet ( self . _local [ ' AUTH_KEY ' ] ,  peer_list_packet ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-17 10:40:19 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                send_to_ipsc ( self . _network ,  peer_list_packet ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 21:41:20 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                logger . warning ( ' ( %s ) Peer List Request Received from *UNREGISTERED* peer  %s ' ,  self . _network ,  int_id ( _peerid ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-12 21:18:04 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            return 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-11 19:45:09 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 14:18:33 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        # PACKET IS OF AN UNKNOWN TYPE. LOG IT AND IDENTTIFY IT! 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 16:15:54 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								        else : 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-28 20:34:29 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            self . unknown_message ( self . _network ,  _packettype ,  _peerid ,  data ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-21 20:54:51 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            return 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 16:15:54 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-10 15:28:18 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
									
										
										
										
											2013-07-20 08:28:52 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-11 19:45:09 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								#************************************************ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#      MAIN PROGRAM LOOP STARTS HERE 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#************************************************ 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 16:15:54 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								if  __name__  ==  ' __main__ ' : 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-28 21:42:47 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    logger . info ( ' DMRlink  \' dmrlink.py \'  (c) 2013, 2014 N0MJS & the K0USY Group - SYSTEM STARTING... ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-17 13:18:45 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # Set signal handers so that we can gracefully exit if need be 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    for  sig  in  [ signal . SIGTERM ,  signal . SIGINT ,  signal . SIGQUIT ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        signal . signal ( sig ,  handler ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
									
										
										
										
											2013-10-28 22:39:45 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    networks  =  { } 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-11 19:45:09 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    for  ipsc_network  in  NETWORK : 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-26 16:05:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        if  NETWORK [ ipsc_network ] [ ' LOCAL ' ] [ ' ENABLED ' ] : 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-28 21:42:47 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            networks [ ipsc_network ]  =  IPSC ( ipsc_network ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-16 14:30:20 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            reactor . listenUDP ( NETWORK [ ipsc_network ] [ ' LOCAL ' ] [ ' PORT ' ] ,  networks [ ipsc_network ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-02 11:16:23 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    reactor . run ( )