# ############################################################################### # Copyright (C) 2020 Simon Adlem, G7RZU # Copyright (C) 2016-2019 Cortney T. Buffington, N0MJS # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ############################################################################### #Some utilty functions from dmr_utils3 have been modified. These live here. # Also new FreeDMR specific functions. import ssl from time import time from os.path import isfile, getmtime from urllib.request import urlopen from json import load as jload import hashlib #Use this try_download instead of that from dmr_utils3 def try_download(_path, _file, _url, _stale,): no_verify = ssl._create_unverified_context() now = time() file_exists = isfile(''.join([_path,_file])) == True if file_exists: file_old = (getmtime(''.join([_path,_file])) + _stale) < now if not file_exists or (file_exists and file_old): try: with urlopen(_url, context=no_verify) as response: data = response.read() #outfile.write(data) response.close() result = 'ID ALIAS MAPPER: \'{}\' successfully downloaded'.format(_file) except IOError: result = 'ID ALIAS MAPPER: \'{}\' could not be downloaded due to an IOError'.format(_file) else: if data and (data != b'{}'): try: with open(''.join([_path,_file]), 'wb') as outfile: outfile.write(data) outfile.close() except IOError: result = 'ID ALIAS mapper \'{}\' file could not be written due to an IOError'.format(_file) else: result = 'ID ALIAS mapper \'{}\' file not written because downloaded data is empty for some reason'.format(_file) else: result = 'ID ALIAS MAPPER: \'{}\' is current, not downloaded'.format(_file) return result # SHORT VERSION - MAKES A SIMPLE {INTEGER ID: 'CALLSIGN'} DICTIONARY def mk_id_dict(_path, _file): _dict = {} try: with open(_path+_file, 'r', encoding='latin1') as _handle: records = jload(_handle) if 'count' in [*records]: records.pop('count') records = records[[*records][0]] _handle.close for record in records: try: _dict[int(record['id'])] = record['callsign'] except: pass return _dict except: raise #Read JSON from file def load_json(filename): try: with open(filename) as f: data = jload(f) except: raise else: return(data) #Calculate blake2b checksum of file def blake2bsum(filename): blake2b_hash = hashlib.blake2b() try: with open(filename,"rb") as f: for byte_block in iter(lambda: f.read(4096),b""): blake2b_hash.update(byte_block) return(blake2b_hash.hexdigest()) except: raise