From edc6fbd56afe5b1a624a933f77c52454efac1f57 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Tue, 10 May 2016 00:01:06 +0000 Subject: [PATCH] Integrate fetcher into client.py --- client/client.py | 31 +++++++++++++++++++- client/fetcher.py | 56 +----------------------------------- client/run | 14 ++++----- server/modules/iconograph.py | 19 ------------ 4 files changed, 38 insertions(+), 82 deletions(-) diff --git a/client/client.py b/client/client.py index 9e71b55..3a88a47 100755 --- a/client/client.py +++ b/client/client.py @@ -1,6 +1,7 @@ #!/usr/bin/python3 import argparse +import fetcher import json import os import socket @@ -14,6 +15,11 @@ parser.add_argument( dest='config', action='store', default='/etc/iconograph.json') +parser.add_argument( + '--ca-cert', + dest='ca_cert', + action='store', + required=True) parser.add_argument( '--https-ca-cert', dest='https_ca_cert', @@ -29,6 +35,11 @@ parser.add_argument( dest='https_client_key', action='store', required=True) +parser.add_argument( + '--image-dir', + dest='image_dir', + action='store', + required=True) parser.add_argument( '--server', dest='server', @@ -68,10 +79,28 @@ class Client(threadedclient.WebSocketClient): next_image = os.path.basename(os.readlink('/isodevice/iconograph/current')) return int(next_image.split('.', 1)[0]) + def _OnImageTypes(self, data): + assert self._config['image_type'] in data['image_types'] + + def _OnNewManifest(self, data): + if data['image_type'] != self._config['image_type']: + return + fetch = fetcher.Fetcher( + 'https://%s/image/%s' % (FLAGS.server, self._config['image_type']), + FLAGS.ca_cert, + FLAGS.image_dir, + FLAGS.https_ca_cert, + FLAGS.https_client_cert, + FLAGS.https_client_key) + fetcher.Fetch() + fetcher.DeleteOldImages() + def received_message(self, msg): parsed = json.loads(msg.data.decode('utf8')) if parsed['type'] == 'image_types': - assert self._config['image_type'] in parsed['data']['image_types'] + self._OnImageTypes(parsed['data']) + elif parsed['type'] == 'new_manifest': + self._OnNewManifest(parsed['data']) def main(): diff --git a/client/fetcher.py b/client/fetcher.py index 3d299f7..50f194d 100755 --- a/client/fetcher.py +++ b/client/fetcher.py @@ -1,6 +1,5 @@ #!/usr/bin/python3 -import argparse import codecs import json import hashlib @@ -15,43 +14,6 @@ import tempfile from OpenSSL import crypto -parser = argparse.ArgumentParser(description='iconograph fetcher') -parser.add_argument( - '--base-url', - dest='base_url', - action='store', - required=True) -parser.add_argument( - '--ca-cert', - dest='ca_cert', - action='store', - required=True) -parser.add_argument( - '--https-ca-cert', - dest='https_ca_cert', - action='store') -parser.add_argument( - '--https-client-cert', - dest='https_client_cert', - action='store') -parser.add_argument( - '--https-client-key', - dest='https_client_key', - action='store') -parser.add_argument( - '--image-dir', - dest='image_dir', - action='store', - required=True) -parser.add_argument( - '--max-images', - dest='max_images', - action='store', - type=int, - default=5) -FLAGS = parser.parse_args() - - class Error(Exception): pass @@ -204,7 +166,7 @@ class Fetcher(object): self._FetchImage(image) self._SetCurrent(image) - def DeleteOldImages(self, max_images): + def DeleteOldImages(self, max_images=5): if not max_images: return images = [] @@ -218,19 +180,3 @@ class Fetcher(object): print('Deleting old image:', filename) path = os.path.join(self._image_dir, filename) os.unlink(path) - - -def main(): - fetcher = Fetcher( - FLAGS.base_url, - FLAGS.ca_cert, - FLAGS.image_dir, - FLAGS.https_ca_cert, - FLAGS.https_client_cert, - FLAGS.https_client_key) - fetcher.Fetch() - fetcher.DeleteOldImages(FLAGS.max_images) - - -if __name__ == '__main__': - main() diff --git a/client/run b/client/run index e287b71..322e3c1 100755 --- a/client/run +++ b/client/run @@ -6,10 +6,10 @@ exec 2>&1 BASE=$(dirname $0) -FLAGS="$(cat /icon/config/client.flags)" - -HTTPS_CLIENT_KEY="/systemid/$(hostname).www.key.pem" -HTTPS_CLIENT_CERT="/systemid/$(hostname).www.cert.pem" -HTTPS_CA_CERT="/icon/config/ca.www.cert.pem" - -exec "${BASE}/client.py" --https-ca-cert="${HTTPS_CA_CERT}" --https-client-cert="${HTTPS_CLIENT_CERT}" --https-client-key="${HTTPS_CLIENT_KEY}" ${FLAGS} +exec "${BASE}/client.py" \ + --image-dir="/isodevice/iconograph" \ + --ca-cert="/icon/config/ca.image.cert.pem" \ + --https-ca-cert="/icon/config/ca.www.cert.pem" \ + --https-client-cert="/systemid/$(hostname).www.cert.pem" \ + --https-client-key="/systemid/$(hostname).www.key.pem" \ + $(cat /icon/config/client.flags) diff --git a/server/modules/iconograph.py b/server/modules/iconograph.py index 27ee609..7527ee8 100755 --- a/server/modules/iconograph.py +++ b/server/modules/iconograph.py @@ -7,11 +7,6 @@ import subprocess parser = argparse.ArgumentParser(description='iconograph install module') -parser.add_argument( - '--base-url', - dest='base_url', - action='store', - required=True) parser.add_argument( '--ca-cert', dest='ca_cert', @@ -26,12 +21,6 @@ parser.add_argument( '--https-ca-cert', dest='https_ca_cert', action='store') -parser.add_argument( - '--max-images', - dest='max_images', - action='store', - type=int, - default=5) parser.add_argument( '--server', dest='server', @@ -75,14 +64,6 @@ def main(): FLAGS.https_ca_cert, os.path.join(FLAGS.chroot_path, 'icon', 'config', 'ca.www.cert.pem')) - # TODO: remove after we integrate this into client.py - fetcher_flags = os.path.join(FLAGS.chroot_path, 'icon', 'config', 'fetcher.flags') - with open(fetcher_flags, 'w') as fh: - fh.write('--base-url=%(base_url)s --max-images=%(max_images)d\n' % { - 'base_url': FLAGS.base_url, - 'max_images': FLAGS.max_images, - }) - client_flags = os.path.join(FLAGS.chroot_path, 'icon', 'config', 'client.flags') with open(client_flags, 'w') as fh: fh.write('--server=%(server)s\n' % {