| Index: services/catalog/public/tools/generate_manifest.py
|
| diff --git a/services/catalog/public/tools/generate_manifest.py b/services/catalog/public/tools/generate_manifest.py
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..20ec8f41436cbdd1c57146ae00c61caad92dc048
|
| --- /dev/null
|
| +++ b/services/catalog/public/tools/generate_manifest.py
|
| @@ -0,0 +1,97 @@
|
| +#!/usr/bin/env python
|
| +# Copyright 2016 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +"""Generates a static catalog manifest to be loaded at runtime. This includes
|
| +embedded service manifests for every supported service, as well as information
|
| +indicating how to start each service."""
|
| +
|
| +import argparse
|
| +import json
|
| +import os.path
|
| +import sys
|
| +
|
| +eater_relative = "../../../../../tools/json_comment_eater"
|
| +eater_relative = os.path.join(os.path.abspath(__file__), eater_relative)
|
| +sys.path.insert(0, os.path.normpath(eater_relative))
|
| +try:
|
| + import json_comment_eater
|
| +finally:
|
| + sys.path.pop(0)
|
| +
|
| +
|
| +def ParseJSONFile(filename):
|
| + with open(filename) as json_file:
|
| + try:
|
| + return json.loads(json_comment_eater.Nom(json_file.read()))
|
| + except ValueError as e:
|
| + print "%s is not a valid JSON document" % filename
|
| + raise e
|
| +
|
| +
|
| +def ParseManifest(filename):
|
| + manifest = ParseJSONFile(filename)
|
| + if "name" not in manifest:
|
| + raise Exception("Manifest %s missing \"name\" key." % filename)
|
| + return manifest["name"], manifest
|
| +
|
| +
|
| +def AddServiceEntryToCatalog(services, name, entry):
|
| + if name in services:
|
| + raise Exception("Duplicate service entry for %s" % name)
|
| + services[name] = entry
|
| +
|
| +
|
| +def main():
|
| + parser = argparse.ArgumentParser(
|
| + description="Generates a Service Manager catalog manifest.")
|
| + parser.add_argument("--output")
|
| + parser.add_argument("--packages-dir")
|
| + parser.add_argument("--pretty", action="store_true")
|
| + parser.add_argument("--embedded-services", nargs="+",
|
| + dest="embedded_services", default=[])
|
| + parser.add_argument("--standalone-services", nargs="+",
|
| + dest="standalone_services", default=[])
|
| + parser.add_argument("--include-catalogs", nargs="+", dest="included_catalogs",
|
| + default=[])
|
| + parser.add_argument("--override-service-executables", nargs="+",
|
| + dest="executable_override_specs", default=[])
|
| + args, _ = parser.parse_known_args()
|
| +
|
| + if args.output is None or args.packages_dir is None:
|
| + raise Exception("--output and --packages-dir required")
|
| +
|
| + services = {}
|
| + for subcatalog_path in args.included_catalogs:
|
| + subcatalog = ParseJSONFile(subcatalog_path)
|
| + for name, entry in subcatalog["services"].iteritems():
|
| + AddServiceEntryToCatalog(services, name, entry)
|
| +
|
| + executable_overrides = {}
|
| + for override_spec in args.executable_override_specs:
|
| + service_name, exe_path = override_spec.split(":", 1)
|
| + executable_overrides[service_name] = exe_path
|
| +
|
| + for name in args.embedded_services:
|
| + manifest_path = os.path.join(args.packages_dir, name, "manifest.json")
|
| + service_name, manifest = ParseManifest(manifest_path)
|
| + entry = { "embedded": True, "manifest": manifest }
|
| + AddServiceEntryToCatalog(services, service_name, entry)
|
| +
|
| + for name in args.standalone_services:
|
| + manifest_path = os.path.join(args.packages_dir, name, "manifest.json")
|
| + service_name, manifest = ParseManifest(manifest_path)
|
| + entry = { "embedded": False, "manifest": ParseJSONFile(manifest_path) }
|
| + if name in executable_overrides:
|
| + entry["executable"] = executable_overrides[name]
|
| + AddServiceEntryToCatalog(services, service_name, entry)
|
| +
|
| + catalog = { "services": services }
|
| + with open(args.output, 'w') as output_file:
|
| + json.dump(catalog, output_file, indent=2 if args.pretty else -1)
|
| +
|
| + return 0
|
| +
|
| +if __name__ == "__main__":
|
| + sys.exit(main())
|
|
|