Clone of official tools
Diff: device_management.py
- Revision:
- 43:2a7da56ebd24
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/device_management.py Tue Sep 25 13:43:09 2018 -0500 @@ -0,0 +1,167 @@ +#! /usr/bin/env python2 +""" +mbed SDK +Copyright (c) 2011-2013 ARM Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +device-management, dev-mgmt, and dm sub command +""" +from __future__ import print_function, absolute_import +import logging +import sys +import argparse +from os.path import join, abspath, dirname, basename +from os import getenv + +from manifesttool import create, parse, verify, cert, init, update +from manifesttool.argparser import MainArgumentParser +from mbed_cloud import AccountManagementAPI, CertificatesAPI +import colorama +colorama.init() + + +LOG = logging.getLogger(__name__) +LOG_FORMAT = '[%(levelname)s] %(asctime)s - %(name)s - %(message)s' + +# Be sure that the tools directory is in the search path +ROOT = abspath(join(dirname(__file__), "..")) +sys.path.insert(0, ROOT) + +from tools.config import Config +from tools.options import extract_mcus + + +class MbedExtendedArgs(MainArgumentParser): + def _addCreateArgs(self, parser, exclusions=[]): + if 'payload' not in exclusions: + parser.add_argument( + '-p', '--payload', + help='Supply a local copy of the payload file.' + 'This option overrides any payload file supplied in a ' + '`-i` argument.', + metavar='FILE', + type=argparse.FileType('rb') + ) + parser.add_argument('-m', '--mcu') + parser.add_argument('-t', '--toolchain') + parser.add_argument('--source', nargs='+', dest='source_dir') + parser.add_argument('--build') + exclusions.append('payload') + super(MbedExtendedArgs, self)._addCreateArgs(parser, exclusions) + + +def wrap_payload(func): + def inner(options): + if not options.payload and options.mcu and options.build: + mcus = extract_mcus(MbedExtendedArgs(), options) + sources = options.source_dir or ['.'] + config = Config(mcus[0], sources) + app_name = config.name or basename(abspath(sources[0])) + output_ext = getattr(config.target, "OUTPUT_EXT", "bin") + payload_name = join(options.build, "{}_application.{}".format( + app_name, output_ext + )) + options.payload = open(payload_name, "rb") + return func(options) + return inner + + +def wrap_init(func): + def inner(options): + if getattr(options, 'api_key', None): + api_key = options.api_key + else: + api_key = getenv("MBED_CLOUD_SDK_API_KEY") + if getattr(options, 'server_address', None): + host_addr = options.server_address + else: + host_addr = getenv("MBED_CLOUD_SDK_HOST", + "https://api.us-east-1.mbedcloud.com/") + config = { + "api_key": api_key, + "host": host_addr, + } + accounts = AccountManagementAPI(config) + certs = CertificatesAPI(config) + api_key = accounts.list_api_keys(filter={ + 'key': api_key + }).next() + certificates_owned = list(certs.list_certificates()) + dev_cert_info = None + for certif in certificates_owned: + if certif.type == "developer" and (certif.owner_id == api_key.owner_id or + certif.owner_id == api_key.id): + dev_cert_info = certs.get_certificate(certif.id) + LOG.info("Found developer certificate named %s", + dev_cert_info.name) + break + else: + LOG.warning( + "Could not find developer certificate for this account." + " Generting a new developer certificate." + ) + dev_cert_info = CertificatesAPI().add_developer_certificate( + "mbed-cli-auto {}".format(api_key.name), + description="cetificate auto-generated by Mbed CLI" + ) + LOG.info("Writing developer certificate %s into c file " + "mbed_cloud_dev_credentials.c", dev_cert_info.name) + with open("mbed_cloud_dev_credentials.c", "w") as fout: + fout.write(dev_cert_info.header_file) + return func(options) + return inner + + +def main(): + options = MbedExtendedArgs().parse_args().options + + log_level = { + 'debug': logging.DEBUG, + 'info': logging.INFO, + 'warning': logging.WARNING, + 'exception': logging.CRITICAL, + }[options.log_level] + logging.basicConfig( + level=log_level, + format=LOG_FORMAT, + datefmt='%Y-%m-%d %H:%M:%S', + ) + logging.addLevelName( + logging.INFO, + "\033[1;32m%s\033[1;0m" % logging.getLevelName(logging.INFO) + ) + logging.addLevelName( + logging.WARNING, + "\033[1;93m%s\033[1;0m" % logging.getLevelName(logging.WARNING) + ) + logging.addLevelName( + logging.CRITICAL, + "\033[1;31m%s\033[1;0m" % logging.getLevelName(logging.CRITICAL) + ) + LOG.debug('CLIDriver created. Arguments parsed and logging setup.') + + rc = { + "create": wrap_payload(create.main), + "parse": parse.main, + "verify": verify.main, + "cert": cert.main, + "init": wrap_init(init.main), + "update": wrap_payload(update.main), + }[options.action](options) or 0 + + sys.exit(rc) + +if __name__ == "__main__": + main()