blob: 1edf2e1254bba5e3fffbd651e157de6336f55ce1 [file] [log] [blame]
Tomi Pieviläinen8c6026b2013-11-01 10:37:15 +02001#!/usr/bin/env python
niemeyer672e2eb2005-02-23 00:04:12 +00002import os
Yaron de Leeuwd722aad2014-11-20 22:36:52 +02003import hashlib
Yaron de Leeuw61118922014-11-24 20:33:36 +02004import json
5import io
Yaron de Leeuwd722aad2014-11-20 22:36:52 +02006
7from six.moves.urllib import request
Paul Ganssle92715142016-02-20 10:22:46 -05008from six.moves.urllib import error as urllib_error
niemeyer672e2eb2005-02-23 00:04:12 +00009
Tomi Pieviläinene5515072012-03-28 18:04:02 +030010from dateutil.zoneinfo import rebuild
11
Yaron de Leeuw61118922014-11-24 20:33:36 +020012METADATA_FILE = "zonefile_metadata.json"
niemeyer672e2eb2005-02-23 00:04:12 +000013
Yaron de Leeuw683c66e2014-11-29 23:17:59 +020014
Paul Ganssle6f9422a2018-07-02 10:45:01 -040015def main(metadata_file):
16 with io.open(metadata_file, 'r') as f:
Yaron de Leeuw61118922014-11-24 20:33:36 +020017 metadata = json.load(f)
18
Paul Ganssle92715142016-02-20 10:22:46 -050019 releases_urls = metadata['releases_url']
20 if metadata['metadata_version'] < 2.0:
21 # In later versions the releases URL is a mirror URL
22 releases_urls = [releases_urls]
23
Yaron de Leeuw61118922014-11-24 20:33:36 +020024 if not os.path.isfile(metadata['tzdata_file']):
Paul Ganssle92715142016-02-20 10:22:46 -050025
26 for ii, releases_url in enumerate(releases_urls):
27 print("Downloading tz file from mirror {ii}".format(ii=ii))
28 try:
29 request.urlretrieve(os.path.join(releases_url,
30 metadata['tzdata_file']),
31 metadata['tzdata_file'])
32 except urllib_error.URLError as e:
33 print("Download failed, trying next mirror.")
34 last_error = e
35 continue
36
37 last_error = None
38 break
39
40 if last_error is not None:
41 raise last_error
42
Yaron de Leeuw683c66e2014-11-29 23:17:59 +020043 with open(metadata['tzdata_file'], 'rb') as tzfile:
Yaron de Leeuwd722aad2014-11-20 22:36:52 +020044 sha_hasher = hashlib.sha512()
45 sha_hasher.update(tzfile.read())
46 sha_512_file = sha_hasher.hexdigest()
Yaron de Leeuw683c66e2014-11-29 23:17:59 +020047 assert metadata['tzdata_file_sha512'] == sha_512_file, "SHA failed for"
Gustavo Niemeyerac37a802011-03-24 14:16:39 -030048 print("Updating timezone information...")
Alex Verdyan186cff22015-07-13 14:30:09 +030049 rebuild.rebuild(metadata['tzdata_file'], zonegroups=metadata['zonegroups'],
Yaron de Leeuwa0e85182015-05-25 21:32:10 +030050 metadata=metadata)
Gustavo Niemeyerac37a802011-03-24 14:16:39 -030051 print("Done.")
niemeyer672e2eb2005-02-23 00:04:12 +000052
Jon Dufresne0e73f3d2017-04-17 11:30:13 -070053
niemeyer672e2eb2005-02-23 00:04:12 +000054if __name__ == "__main__":
Paul Ganssle6f9422a2018-07-02 10:45:01 -040055 import argparse
56 parser = argparse.ArgumentParser()
57 parser.add_argument('metadata', metavar='METADATA_FILE',
58 default=METADATA_FILE,
59 nargs='?')
60
61 args = parser.parse_args()
62 main(args.metadata)