From a1959cd5b3bce22397c78f15c15c03d2e8280d93 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Mon, 28 Mar 2016 22:06:04 -0700 Subject: [PATCH] Initial manifest parsing --- fetcher.py | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100755 fetcher.py diff --git a/fetcher.py b/fetcher.py new file mode 100755 index 0000000..3ebb86f --- /dev/null +++ b/fetcher.py @@ -0,0 +1,55 @@ +#!/usr/bin/python3 +# coding=utf8 + +import argparse +import json +import hashlib +import socket +import struct +import urllib.request + + +parser = argparse.ArgumentParser(description='iconograph fetcher') +parser.add_argument( + '--base-url', + dest='base_url', + action='store', + required=True) +parser.add_argument( + '--image-type', + dest='image_type', + action='store', + required=True) +FLAGS = parser.parse_args() + + +class Fetcher(object): + + _MAX_BP = 10000 + + def __init__(self, base_url, image_type): + self._base_url = base_url + self._image_type = image_type + + def _GetManifest(self): + url = '%s/%s.manifest.json' % (self._base_url, self._image_type) + return json.loads(urllib.request.urlopen(url).read().decode('utf8')) + + def _ChooseImage(self, manifest): + hostname = socket.gethostname() + hash_base = hashlib.sha256(hostname.encode('ascii')) + for image in manifest: + hashobj = hash_base.copy() + hashobj.update(struct.pack('!L', image['timestamp'])) + my_bp = struct.unpack('!I', hashobj.digest()[-4:])[0] % self._MAX_BP + if my_bp < image['rollout_‱']: + return image + + def Fetch(self): + manifest = self._GetManifest() + image = self._ChooseImage(manifest) + print(image) + + +fetcher = Fetcher(FLAGS.base_url, FLAGS.image_type) +fetcher.Fetch()