| #!/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) |