From 33f7064e666496ce0504dc0529a33ddd7ab63fd8 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 24 May 2022 12:10:46 +0100 Subject: [PATCH] Check top-level server IDs for validity: Add this to freedmr.cfg [ALIASES] SERVER_ID_URL: http://downloads.freedmr.uk/downloads/FreeDMR_Hosts.csv SERVER_ID_FILE: freedmr_hosts.tsv Also, if you run docker, you may need to map the file outside: touch /etc/freedmr/json/freedmr_hosts.tsv chown 54000:54000 /etc/freedmr/json/freedmr_hosts.tsv then in docker-compose.yml: - '/etc/freedmr/json/server_ids.tsv:/opt/freedmr/server_ids.tsv' --- bridge_master.py | 11 ++++++----- config.py | 5 ++++- hblink.py | 32 ++++++++++++++++++++++++++++++-- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/bridge_master.py b/bridge_master.py index 1f6a876..2d15fc9 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -654,12 +654,12 @@ def threadAlias(): logger.debug('(ALIAS) starting alias thread') reactor.callInThread(aliasb) -def setAlias(_peer_ids,_subscriber_ids, _talkgroup_ids, _local_subscriber_ids): - peer_ids, subscriber_ids, talkgroup_ids,local_subscriber_ids = _peer_ids, _subscriber_ids, _talkgroup_ids, _local_subscriber_ids +def setAlias(_peer_ids,_subscriber_ids, _talkgroup_ids, _local_subscriber_ids, _server_ids): + peer_ids, subscriber_ids, talkgroup_ids,local_subscriber_ids,server_ids = _peer_ids, _subscriber_ids, _talkgroup_ids, _local_subscriber_ids,_server_ids def aliasb(): - _peer_ids, _subscriber_ids, _talkgroup_ids, _local_subscriber_ids = mk_aliases(CONFIG) - reactor.callFromThread(setAlias,_peer_ids, _subscriber_ids, _talkgroup_ids, _local_subscriber_ids) + _peer_ids, _subscriber_ids, _talkgroup_ids, _local_subscriber_ids, _server_ids = mk_aliases(CONFIG) + reactor.callFromThread(setAlias,_peer_ids, _subscriber_ids, _talkgroup_ids, _local_subscriber_ids, _server_ids) def ident(): for system in systems: @@ -2863,7 +2863,7 @@ if __name__ == '__main__': signal.signal(sig, sig_handler) # Create the name-number mapping dictionaries - peer_ids, subscriber_ids, talkgroup_ids, local_subscriber_ids = mk_aliases(CONFIG) + peer_ids, subscriber_ids, talkgroup_ids, local_subscriber_ids, server_ids = mk_aliases(CONFIG) #Add special IDs to DB subscriber_ids[900999] = 'D-APRS' @@ -2872,6 +2872,7 @@ if __name__ == '__main__': CONFIG['_SUB_IDS'] = subscriber_ids CONFIG['_PEER_IDS'] = peer_ids CONFIG['_LOCAL_SUBSCRIBER_IDS'] = local_subscriber_ids + CONFIG['_SERVER_IDS'] = server_ids diff --git a/config.py b/config.py index 260e1a4..9076b8e 100755 --- a/config.py +++ b/config.py @@ -183,7 +183,10 @@ def build_config(_config_file): 'TGID_URL': config.get(section, 'TGID_URL'), 'STALE_TIME': config.getint(section, 'STALE_DAYS') * 86400, 'SUB_MAP_FILE': config.get(section, 'SUB_MAP_FILE'), - 'LOCAL_SUBSCRIBER_FILE': config.get(section, 'LOCAL_SUBSCRIBER_FILE') + 'LOCAL_SUBSCRIBER_FILE': config.get(section, 'LOCAL_SUBSCRIBER_FILE'), + 'SERVER_ID_URL': config.get(section, 'SERVER_ID_URL'), + 'SERVER_ID_FILE': config.get(section, 'SERVER_ID_FILE') + }) elif section == 'MYSQL': diff --git a/hblink.py b/hblink.py index d27f736..0e1bffc 100755 --- a/hblink.py +++ b/hblink.py @@ -62,6 +62,8 @@ import ssl from os.path import isfile, getmtime from urllib.request import urlopen +import csv + logging.TRACE = 5 logging.addLevelName(logging.TRACE, 'TRACE') @@ -455,6 +457,12 @@ class OPENBRIDGE(DatagramProtocol): self.send_bcsq(_dst_id,_stream_id) self._laststrid.append(_stream_id) return + elif (len(str(int.from_bytes(_source_server,'big'))) == 4 or (len(str(int.from_bytes(_source_server,'big'))) == 5)) and ((str(int.from_bytes(_source_server,'big'))[:4]) not in self._CONFIG['_SERVER_IDS'] ): + if _stream_id not in self._laststrid: + logger.warning('(%s) Source Server ID is 4 or 5 digits but not in list: %s', self._system, int.from_bytes(_source_server,'big')) + self.send_bcsq(_dst_id,_stream_id) + self._laststrid.append(_stream_id) + return elif len(str(int.from_bytes(_source_server,'big'))) > 5 and not self.validate_id(_source_server): if _stream_id not in self._laststrid: logger.warning('(%s) Source Server 6 or 7 digits but not a valid DMR ID, discarding Src: %s', self._system, int.from_bytes(_source_server,'big')) @@ -1384,6 +1392,19 @@ def try_download(_path, _file, _url, _stale,): return result +#Read list of listed servers from CSV (actually TSV) file +def mk_server_dict(path,filename): + server_ids = {} + try: + with open(path+filename,newline='') as csvfile: + reader = csv.DictReader(csvfile,dialect='excel-tab') + for _row in reader: + server_ids[_row['OPB Net ID']] = _row['Country'] + return(server_ids) + except IOError as err: + logger.warning('ID ALIAS MAPPER: %s could not be read due to IOError: %s',file,err) + return(False) + # ID ALIAS CREATION # Download @@ -1398,6 +1419,10 @@ def mk_aliases(_config): #Try updating tgid aliases file result = try_download(_config['ALIASES']['PATH'], _config['ALIASES']['TGID_FILE'], _config['ALIASES']['TGID_URL'], _config['ALIASES']['STALE_TIME']) logger.info('(ALIAS) %s', result) + #Try updating server ids file + result = try_download(_config['ALIASES']['PATH'], _config['ALIASES']['SERVER_ID_FILE'], _config['ALIASES']['SERVER_ID_URL'], _config['ALIASES']['STALE_TIME']) + logger.info('(ALIAS) %s', result) + # Make Dictionaries @@ -1420,10 +1445,13 @@ def mk_aliases(_config): local_subscriber_ids = mk_id_dict(_config['ALIASES']['PATH'], _config['ALIASES']['LOCAL_SUBSCRIBER_FILE']) if subscriber_ids: logger.info('(ALIAS) ID ALIAS MAPPER: local_subscriber_ids dictionary is available') - + + server_ids = mk_server_dict(_config['ALIASES']['PATH'], _config['ALIASES']['SERVER_ID_FILE']) + if server_ids: + logger.info('(ALIAS) ID ALIAS MAPPER: server_ids dictionary is available') - return peer_ids, subscriber_ids, talkgroup_ids, local_subscriber_ids + return peer_ids, subscriber_ids, talkgroup_ids, local_subscriber_ids, server_ids #************************************************