| #!/usr/bin/env python |
| # Copyright 2018 The Fuchsia Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| from __future__ import print_function |
| |
| import argparse |
| import collections |
| import json |
| import os |
| import sys |
| |
| |
| def extract_update_root_keys(manifest_path): |
| with open(manifest_path, 'r') as fin: |
| manifest = json.loads(fin.read()) |
| |
| keyids = manifest['signed']['roles']['root']['keyids'] |
| keys = manifest['signed']['keys'] |
| |
| rootKeys = [] |
| for keyid in keyids: |
| key = keys[keyid] |
| rootKeys.append(collections.OrderedDict(( |
| ('type', key['keytype']), |
| ('value', key['keyval']['public']), |
| ))) |
| |
| return rootKeys |
| |
| |
| def generate_devhost_config(args): |
| manifest_path = os.path.join(args.build_dir, 'amber-files', 'repository', 'root.json') |
| rootKeys = extract_update_root_keys(manifest_path) |
| status_config = collections.OrderedDict() |
| status_config['enabled']=args.enabled |
| |
| config = collections.OrderedDict(( |
| ('id', args.name), |
| ('repoUrl', args.repo_url), |
| ('blobRepoUrl', args.blobs_url), |
| ('rateLimit', 0), |
| ('ratePeriod', 0), |
| ('rootKeys', rootKeys), |
| ('statusConfig', status_config), |
| )) |
| |
| return config |
| |
| |
| def parseargs(): |
| parser = argparse.ArgumentParser( |
| description='Generate amber update source config file') |
| |
| parser.add_argument( |
| '--build-dir', |
| required=True, |
| help="Fuchsia build output directory") |
| parser.add_argument( |
| '--name', |
| default='devhost', |
| help="Name of update source") |
| parser.add_argument( |
| '--repo-url', |
| required=True, |
| help="URL of update repository") |
| parser.add_argument( |
| '--blobs-url', |
| required=False, |
| help="URL of update blobs repository (<repo-url>/blobs if not specified)") |
| parser.add_argument( |
| '--output', |
| required=True, |
| help="Path to write generated config") |
| enabled = parser.add_mutually_exclusive_group() |
| enabled.add_argument( |
| '--enabled', |
| dest='enabled', |
| action='store_true', |
| help="Enable the repository (default)") |
| enabled.add_argument( |
| '--disabled', |
| dest='enabled', |
| action='store_false', |
| help="Disable the repository") |
| enabled.set_defaults(enabled=True) |
| |
| |
| args = parser.parse_args() |
| |
| return args |
| |
| |
| def main(args): |
| if not args.blobs_url: |
| args.blobs_url = '{0}/blobs'.format(args.repo_url) |
| |
| if not os.path.isdir(args.build_dir): |
| print("Build directory does not exist", file=sys.stderr) |
| return 1 |
| |
| config = generate_devhost_config(args) |
| |
| encoded = json.dumps(config, indent=4) |
| with open(args.output, 'w') as fout: |
| fout.write(encoded) |
| |
| return 0 |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main(parseargs())) |