#!/usr/bin/env python import os import hashlib import json import io from six.moves.urllib import request from six.moves.urllib import error as urllib_error from dateutil.zoneinfo import rebuild METADATA_FILE = "zonefile_metadata.json" def main(metadata_file): with io.open(metadata_file, 'r') as f: metadata = json.load(f) releases_urls = metadata['releases_url'] if metadata['metadata_version'] < 2.0: # In later versions the releases URL is a mirror URL releases_urls = [releases_urls] if not os.path.isfile(metadata['tzdata_file']): for ii, releases_url in enumerate(releases_urls): print("Downloading tz file from mirror {ii}".format(ii=ii)) try: request.urlretrieve(os.path.join(releases_url, metadata['tzdata_file']), metadata['tzdata_file']) except urllib_error.URLError as e: print("Download failed, trying next mirror.") last_error = e continue last_error = None break if last_error is not None: raise last_error with open(metadata['tzdata_file'], 'rb') as tzfile: sha_hasher = hashlib.sha512() sha_hasher.update(tzfile.read()) sha_512_file = sha_hasher.hexdigest() assert metadata['tzdata_file_sha512'] == sha_512_file, "SHA failed for" print("Updating timezone information...") rebuild.rebuild(metadata['tzdata_file'], zonegroups=metadata['zonegroups'], metadata=metadata) print("Done.") if __name__ == "__main__": import argparse parser = argparse.ArgumentParser() parser.add_argument('metadata', metavar='METADATA_FILE', default=METADATA_FILE, nargs='?') args = parser.parse_args() main(args.metadata)