Clone of official tools

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()