diff --git a/full_bridge-SAMPLE.cfg b/full_bridge-SAMPLE.cfg index c5930cd..e608721 100644 --- a/full_bridge-SAMPLE.cfg +++ b/full_bridge-SAMPLE.cfg @@ -305,6 +305,8 @@ TGID_TS2_ACL: PERMIT:ALL # Utilizing the hotspot proxy from FreeDMR [PROXY_TEMPLATE] ENABLED: True +# Name that generated systems begin with +NAME: HOTSPOT # Port that clients will connect on. EXTERNAL_PORT: 62032 @@ -312,6 +314,18 @@ EXTERNAL_PORT: 62032 INTERNAL_PORT_START: 54000 INTERNAL_PORT_STOP: 54010 +### Utilizing the hotspot proxy from FreeDMR +##[PROXY_TEMPLATE_2] +##ENABLED: True +### Name that generated systems begin with +##NAME: REPEATER +### Port that clients will connect on. +##EXTERNAL_PORT: 62032 +## +### Internal ports used for generated master instances. +##INTERNAL_PORT_START: 54000 +##INTERNAL_PORT_STOP: 54010 + STATIC_APRS_POSITION_ENABLED: False REPEAT: True PASSPHRASE: password diff --git a/full_bridge.py b/full_bridge.py index 15fe370..227e835 100644 --- a/full_bridge.py +++ b/full_bridge.py @@ -106,6 +106,9 @@ import requests import json import hashlib +# Hotspot Proxy stuff +from hotspot_proxy_v2 import Proxy + # Does anybody read this stuff? There's a PEP somewhere that says I should do this. __author__ = 'Cortney T. Buffington, N0MJS, Eric Craw, KF7EEL' __copyright__ = 'Copyright (c) 2016-2019 Cortney T. Buffington, N0MJS and the K0USY Group' @@ -957,6 +960,51 @@ def aprs_beacon_send(): beacon_packet = CONFIG['GPS_DATA']['APRS_LOGIN_CALL'] + '>APHBL3,TCPIP*:!' + CONFIG['GPS_DATA']['IGATE_LATITUDE'] + str(CONFIG['GPS_DATA']['IGATE_BEACON_ICON'][0]) + CONFIG['GPS_DATA']['IGATE_LONGITUDE'] + str(CONFIG['GPS_DATA']['IGATE_BEACON_ICON'][1]) + '/' + CONFIG['GPS_DATA']['IGATE_BEACON_COMMENT'] aprs_send(beacon_packet) logger.info(beacon_packet) + +def hotspot_proxy(listen_port, port_start, port_stop): + Master = "127.0.0.1" + ListenPort = listen_port + DestportStart = port_start + DestPortEnd = port_stop + Timeout = 30 + Stats = True + Debug = True + BlackList = [1234567] + + + CONNTRACK = {} + + for port in range(DestportStart,DestPortEnd+1,1): + CONNTRACK[port] = False + + + reactor.listenUDP(ListenPort,Proxy(Master,ListenPort,CONNTRACK,BlackList,Timeout,Debug,DestportStart,DestPortEnd)) + + def loopingErrHandle(failure): + print('(GLOBAL) STOPPING REACTOR TO AVOID MEMORY LEAK: Unhandled error innowtimed loop.\n {}'.format(failure)) + reactor.stop() + + def stats(): + count = 0 + nowtime = time() + for port in CONNTRACK: + if CONNTRACK[port]: + count = count+1 + + totalPorts = DestPortEnd - DestportStart + freePorts = totalPorts - count + + print("{} ports out of {} in use ({} free)".format(count,totalPorts,freePorts)) + + + + if Stats == True: + stats_task = task.LoopingCall(stats) + statsa = stats_task.start(30) + statsa.addErrback(loopingErrHandle) + #reactor.run() + + ### APRS Static positions - by IU7IGU ##def sendAprs(): @@ -2824,30 +2872,30 @@ if __name__ == '__main__': # HBlink instance creation logger.info('(GLOBAL) HBlink \'bridge.py\' -- SYSTEM STARTING...') # Generates a series of MASTER instances for use with hotspot proxy from FreeDMR - def generate_proxy_masters(): - n_systems = CONFIG['PROXY_TEMPLATE']['INTERNAL_PORT_STOP'] - CONFIG['PROXY_TEMPLATE']['INTERNAL_PORT_START'] - n_count = 0 - while n_count < n_systems: - - CONFIG['SYSTEMS'].update({'MMDVM-' + str(n_count): { - 'MODE': 'MASTER', - 'ENABLED': True, - 'STATIC_APRS_POSITION_ENABLED': CONFIG['PROXY_TEMPLATE']['STATIC_APRS_POSITION_ENABLED'], - 'REPEAT': CONFIG['PROXY_TEMPLATE']['REPEAT'], - 'MAX_PEERS': 1, - 'IP': '127.0.0.1', - 'PORT': CONFIG['PROXY_TEMPLATE']['INTERNAL_PORT_START'] + n_count, - 'PASSPHRASE': CONFIG['PROXY_TEMPLATE']['PASSPHRASE'], - 'GROUP_HANGTIME': CONFIG['PROXY_TEMPLATE']['GROUP_HANGTIME'], - 'USE_ACL': CONFIG['PROXY_TEMPLATE']['USE_ACL'], - 'REG_ACL': CONFIG['PROXY_TEMPLATE']['REG_ACL'], - 'SUB_ACL': CONFIG['PROXY_TEMPLATE']['SUB_ACL'], - 'TG1_ACL': CONFIG['PROXY_TEMPLATE']['TG1_ACL'], - 'TG2_ACL': CONFIG['PROXY_TEMPLATE']['TG2_ACL'] - }}) - CONFIG['SYSTEMS']['MMDVM-' + str(n_count)].update({'PEERS': {}}) - systems['MMDVM-' + str(n_count)] = routerHBP(system, CONFIG, report_server) - n_count = n_count + 1 +## def generate_proxy_masters(): +## n_systems = CONFIG['PROXY_TEMPLATE']['INTERNAL_PORT_STOP'] - CONFIG['PROXY_TEMPLATE']['INTERNAL_PORT_START'] +## n_count = 0 +## while n_count < n_systems: +## +## CONFIG['SYSTEMS'].update({'MMDVM-' + str(n_count): { +## 'MODE': 'MASTER', +## 'ENABLED': True, +## 'STATIC_APRS_POSITION_ENABLED': CONFIG['PROXY_TEMPLATE']['STATIC_APRS_POSITION_ENABLED'], +## 'REPEAT': CONFIG['PROXY_TEMPLATE']['REPEAT'], +## 'MAX_PEERS': 1, +## 'IP': '127.0.0.1', +## 'PORT': CONFIG['PROXY_TEMPLATE']['INTERNAL_PORT_START'] + n_count, +## 'PASSPHRASE': CONFIG['PROXY_TEMPLATE']['PASSPHRASE'], +## 'GROUP_HANGTIME': CONFIG['PROXY_TEMPLATE']['GROUP_HANGTIME'], +## 'USE_ACL': CONFIG['PROXY_TEMPLATE']['USE_ACL'], +## 'REG_ACL': CONFIG['PROXY_TEMPLATE']['REG_ACL'], +## 'SUB_ACL': CONFIG['PROXY_TEMPLATE']['SUB_ACL'], +## 'TG1_ACL': CONFIG['PROXY_TEMPLATE']['TG1_ACL'], +## 'TG2_ACL': CONFIG['PROXY_TEMPLATE']['TG2_ACL'] +## }}) +## CONFIG['SYSTEMS']['MMDVM-' + str(n_count)].update({'PEERS': {}}) +## systems['MMDVM-' + str(n_count)] = routerHBP(system, CONFIG, report_server) +## n_count = n_count + 1 if CONFIG['PROXY_TEMPLATE']['ENABLED']: #generate_proxy_masters() @@ -2855,7 +2903,7 @@ if __name__ == '__main__': n_count = 0 while n_count < n_systems: - CONFIG['SYSTEMS'].update({'MMDVM-' + str(n_count): { + CONFIG['SYSTEMS'].update({CONFIG['PROXY_TEMPLATE']['NAME'] + '-' + str(n_count): { 'MODE': 'MASTER', 'ENABLED': True, 'STATIC_APRS_POSITION_ENABLED': CONFIG['PROXY_TEMPLATE']['STATIC_APRS_POSITION_ENABLED'], @@ -2866,13 +2914,13 @@ if __name__ == '__main__': 'PASSPHRASE': CONFIG['PROXY_TEMPLATE']['PASSPHRASE'], 'GROUP_HANGTIME': CONFIG['PROXY_TEMPLATE']['GROUP_HANGTIME'], 'USE_ACL': CONFIG['PROXY_TEMPLATE']['USE_ACL'], - 'REG_ACL': CONFIG['PROXY_TEMPLATE']['REG_ACL'], + 'REG_ACL': sms_aprs_config.acl_build(CONFIG['PROXY_TEMPLATE']['REG_ACL'], 4294967295), 'SUB_ACL': CONFIG['PROXY_TEMPLATE']['SUB_ACL'], - 'TG1_ACL': CONFIG['PROXY_TEMPLATE']['TG1_ACL'], - 'TG2_ACL': CONFIG['PROXY_TEMPLATE']['TG2_ACL'] + 'TGID_TS1_ACL': CONFIG['PROXY_TEMPLATE']['TGID_TS1_ACL'], + 'TGID_TS2_ACL': CONFIG['PROXY_TEMPLATE']['TGID_TS2_ACL'] }}) - CONFIG['SYSTEMS']['MMDVM-' + str(n_count)].update({'PEERS': {}}) - systems['MMDVM-' + str(n_count)] = routerHBP('MMDVM-' + str(n_count), CONFIG, report_server) + CONFIG['SYSTEMS'][CONFIG['PROXY_TEMPLATE']['NAME'] + '-' + str(n_count)].update({'PEERS': {}}) + systems[CONFIG['PROXY_TEMPLATE']['NAME'] + '-' + str(n_count)] = routerHBP(CONFIG['PROXY_TEMPLATE']['NAME'] + '-' + str(n_count), CONFIG, report_server) n_count = n_count + 1 for system in CONFIG['SYSTEMS']: @@ -2918,5 +2966,10 @@ if __name__ == '__main__': aprs_thread.start() # Create file for static positions - by IU7IGU ## open("nom_aprs","w").close + # if CONFIG['PROXY_TEMPLATE']['ENABLED']: + # proxy_thread = threading.Thread(target=hotspot_proxy, args=(CONFIG['PROXY_TEMPLATE']['EXTERNAL_PORT'],CONFIG['PROXY_TEMPLATE']['INTERNAL_PORT_START'],CONFIG['PROXY_TEMPLATE']['INTERNAL_PORT_STOP'],)) + # proxy_thread.daemon = True + # proxy_thread.start() + logger.info('Unit calls will be bridged to: ' + str(UNIT)) reactor.run() diff --git a/hblink.py b/hblink.py index 7896396..c9e95a8 100644 --- a/hblink.py +++ b/hblink.py @@ -94,7 +94,11 @@ def hblink_handler(_signal, _frame): # on matching and the action specified. def acl_check(_id, _acl): id = int_id(_id) + print(type(_acl)) for entry in _acl[1]: + print(id) + print(entry) + #print(entry[1]) if entry[0] <= id <= entry[1]: return _acl[0] return not _acl[0] diff --git a/hotspot_proxy_v2.py b/hotspot_proxy_v2.py index adf04a0..4418672 100644 --- a/hotspot_proxy_v2.py +++ b/hotspot_proxy_v2.py @@ -68,6 +68,7 @@ class Proxy(DatagramProtocol): #If the packet comes from the master if host == self.master: _command = data[:4] + print(data) if _command == DMRD: _peer_id = data[11:15] @@ -161,8 +162,8 @@ if __name__ == '__main__': Master = "127.0.0.1" ListenPort = 62031 - DestportStart = 54000 - DestPortEnd = 54002 + DestportStart = 54100 + DestPortEnd = 54102 Timeout = 30 Stats = True Debug = True diff --git a/sms_aprs_config.py b/sms_aprs_config.py index 18f42d2..683aba9 100755 --- a/sms_aprs_config.py +++ b/sms_aprs_config.py @@ -64,6 +64,7 @@ def process_acls(_config): # ORIGINAL: 'DENY:1-5,3120101,3120124' # PROCESSED: (False, set([(1, 5), (3120124, 3120124), (3120101, 3120101)])) def acl_build(_acl, _max): + #print(_max) if not _acl: return(True, set((const.ID_MIN, _max))) @@ -202,6 +203,7 @@ def build_config(_config_file): elif section == 'PROXY_TEMPLATE': CONFIG['PROXY_TEMPLATE'].update({ 'ENABLED': config.getboolean(section, 'ENABLED'), + 'NAME': config.get(section, 'NAME'), 'REPEAT': config.getboolean(section, 'REPEAT'), 'EXTERNAL_PORT': config.getint(section, 'EXTERNAL_PORT'), 'INTERNAL_PORT_START': config.getint(section, 'INTERNAL_PORT_START'), @@ -212,11 +214,26 @@ def build_config(_config_file): 'USE_ACL': config.getboolean(section, 'USE_ACL'), 'REG_ACL': config.get(section, 'REG_ACL'), 'SUB_ACL': config.get(section, 'SUB_ACL'), - 'TG1_ACL': config.get(section, 'TGID_TS1_ACL'), - 'TG2_ACL': config.get(section, 'TGID_TS2_ACL') - - + 'TGID_TS1_ACL': config.get(section, 'TGID_TS1_ACL'), + 'TGID_TS2_ACL': config.get(section, 'TGID_TS2_ACL') }) +## elif section == 'PROXY_TEMPLATE_2': +## CONFIG['PROXY_TEMPLATE'].update({ +## 'ENABLED': config.getboolean(section, 'ENABLED'), +## 'NAME': config.get(section, 'NAME'), +## 'REPEAT': config.getboolean(section, 'REPEAT'), +## 'EXTERNAL_PORT': config.getint(section, 'EXTERNAL_PORT'), +## 'INTERNAL_PORT_START': config.getint(section, 'INTERNAL_PORT_START'), +## 'INTERNAL_PORT_STOP': config.getint(section, 'INTERNAL_PORT_STOP'), +## 'STATIC_APRS_POSITION_ENABLED': config.getboolean(section, 'STATIC_APRS_POSITION_ENABLED'), +## 'PASSPHRASE': bytes(config.get(section, 'PASSPHRASE'), 'utf-8'), +## 'GROUP_HANGTIME': config.getint(section, 'GROUP_HANGTIME'), +## 'USE_ACL': config.getboolean(section, 'USE_ACL'), +## 'REG_ACL': config.get(section, 'REG_ACL'), +## 'SUB_ACL': config.get(section, 'SUB_ACL'), +## 'TG1_ACL': config.get(section, 'TGID_TS1_ACL'), +## 'TG2_ACL': config.get(section, 'TGID_TS2_ACL') +## }) elif config.getboolean(section, 'ENABLED'): if config.get(section, 'MODE') == 'PEER': @@ -329,6 +346,25 @@ def build_config(_config_file): }}) CONFIG['SYSTEMS'][section].update({'PEERS': {}}) +## elif config.get(section, 'MODE') == 'PROXY': +## CONFIG['SYSTEMS'].update({section: { +## 'MODE': 'MASTER', +## 'ENABLED': True, +## 'STATIC_APRS_POSITION_ENABLED': config.getboolean(section, 'STATIC_APRS_POSITION_ENABLED'), +## 'REPEAT': config.getboolean(section, 'REPEAT'), +## 'MAX_PEERS': config.getint(section, 'MAX_PEERS'), +## 'IP': gethostbyname(config.get(section, 'IP')), +## 'PORT': config.getint(section, 'PORT'), +## 'PASSPHRASE': bytes(config.get(section, 'PASSPHRASE'), 'utf-8'), +## 'GROUP_HANGTIME': config.getint(section, 'GROUP_HANGTIME'), +## 'USE_ACL': config.getboolean(section, 'USE_ACL'), +## 'REG_ACL': config.get(section, 'REG_ACL'), +## 'SUB_ACL': config.get(section, 'SUB_ACL'), +## 'TG1_ACL': config.get(section, 'TGID_TS1_ACL'), +## 'TG2_ACL': config.get(section, 'TGID_TS2_ACL') +## }}) +## CONFIG['SYSTEMS'][section].update({'PEERS': {}}) + elif config.get(section, 'MODE') == 'OPENBRIDGE': CONFIG['SYSTEMS'].update({section: { 'MODE': config.get(section, 'MODE'),