github.com/muhammedhassanm/blockchain@v0.0.0-20200120143007-697261defd4d/sawtooth-core-master/cli/sawtooth_cli/main.py (about)

     1  # Copyright 2017 Intel Corporation
     2  #
     3  # Licensed under the Apache License, Version 2.0 (the "License");
     4  # you may not use this file except in compliance with the License.
     5  # You may obtain a copy of the License at
     6  #
     7  #     http://www.apache.org/licenses/LICENSE-2.0
     8  #
     9  # Unless required by applicable law or agreed to in writing, software
    10  # distributed under the License is distributed on an "AS IS" BASIS,
    11  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  # See the License for the specific language governing permissions and
    13  # limitations under the License.
    14  # ------------------------------------------------------------------------------
    15  
    16  from __future__ import print_function
    17  
    18  import argparse
    19  import logging
    20  import os
    21  import traceback
    22  import sys
    23  import pkg_resources
    24  
    25  from colorlog import ColoredFormatter
    26  
    27  from sawtooth_cli.exceptions import CliException
    28  
    29  from sawtooth_cli.keygen import add_keygen_parser
    30  from sawtooth_cli.keygen import do_keygen
    31  from sawtooth_cli.block import add_block_parser
    32  from sawtooth_cli.block import do_block
    33  from sawtooth_cli.batch import add_batch_parser
    34  from sawtooth_cli.batch import do_batch
    35  from sawtooth_cli.transaction import add_transaction_parser
    36  from sawtooth_cli.transaction import do_transaction
    37  from sawtooth_cli.state import add_state_parser
    38  from sawtooth_cli.state import do_state
    39  from sawtooth_cli.identity import add_identity_parser
    40  from sawtooth_cli.identity import do_identity
    41  from sawtooth_cli.settings import add_settings_parser
    42  from sawtooth_cli.settings import do_settings
    43  from sawtooth_cli.peer import add_peer_parser
    44  from sawtooth_cli.peer import do_peer
    45  from sawtooth_cli.status import add_status_parser
    46  from sawtooth_cli.status import do_status
    47  
    48  from sawtooth_cli.cli_config import load_cli_config
    49  
    50  
    51  DISTRIBUTION_NAME = 'sawtooth-cli'
    52  
    53  
    54  def create_console_handler(verbose_level):
    55      clog = logging.StreamHandler()
    56      formatter = ColoredFormatter(
    57          "%(log_color)s[%(asctime)s %(levelname)-8s%(module)s]%(reset)s "
    58          "%(white)s%(message)s",
    59          datefmt="%H:%M:%S",
    60          reset=True,
    61          log_colors={
    62              'DEBUG': 'cyan',
    63              'INFO': 'green',
    64              'WARNING': 'yellow',
    65              'ERROR': 'red',
    66              'CRITICAL': 'red',
    67          })
    68  
    69      clog.setFormatter(formatter)
    70  
    71      if verbose_level == 0:
    72          clog.setLevel(logging.WARN)
    73      elif verbose_level == 1:
    74          clog.setLevel(logging.INFO)
    75      else:
    76          clog.setLevel(logging.DEBUG)
    77  
    78      return clog
    79  
    80  
    81  def setup_loggers(verbose_level):
    82      logger = logging.getLogger()
    83      logger.setLevel(logging.DEBUG)
    84      logger.addHandler(create_console_handler(verbose_level))
    85  
    86  
    87  def create_parent_parser(prog_name):
    88      parent_parser = argparse.ArgumentParser(prog=prog_name, add_help=False)
    89      parent_parser.add_argument(
    90          '-v', '--verbose',
    91          action='count',
    92          help='enable more verbose output')
    93  
    94      try:
    95          version = pkg_resources.get_distribution(DISTRIBUTION_NAME).version
    96      except pkg_resources.DistributionNotFound:
    97          version = 'UNKNOWN'
    98  
    99      parent_parser.add_argument(
   100          '-V', '--version',
   101          action='version',
   102          version=(DISTRIBUTION_NAME + ' (Hyperledger Sawtooth) version {}')
   103          .format(version),
   104          help='display version information')
   105  
   106      return parent_parser
   107  
   108  
   109  def create_parser(prog_name):
   110      parent_parser = create_parent_parser(prog_name)
   111  
   112      parser = argparse.ArgumentParser(
   113          description='Provides subcommands to configure, manage, '
   114          'and use Sawtooth components.',
   115          parents=[parent_parser],)
   116  
   117      subparsers = parser.add_subparsers(title='subcommands', dest='command')
   118      subparsers.required = True
   119  
   120      add_batch_parser(subparsers, parent_parser)
   121      add_block_parser(subparsers, parent_parser)
   122      add_identity_parser(subparsers, parent_parser)
   123      add_keygen_parser(subparsers, parent_parser)
   124      add_peer_parser(subparsers, parent_parser)
   125      add_status_parser(subparsers, parent_parser)
   126      add_settings_parser(subparsers, parent_parser)
   127      add_state_parser(subparsers, parent_parser)
   128      add_transaction_parser(subparsers, parent_parser)
   129  
   130      return parser
   131  
   132  
   133  def main(prog_name=os.path.basename(sys.argv[0]), args=None,
   134           with_loggers=True):
   135      parser = create_parser(prog_name)
   136      if args is None:
   137          args = sys.argv[1:]
   138      args = parser.parse_args(args)
   139  
   140      load_cli_config(args)
   141  
   142      if with_loggers is True:
   143          if args.verbose is None:
   144              verbose_level = 0
   145          else:
   146              verbose_level = args.verbose
   147          setup_loggers(verbose_level=verbose_level)
   148  
   149      if args.command == 'keygen':
   150          do_keygen(args)
   151      elif args.command == 'block':
   152          do_block(args)
   153      elif args.command == 'batch':
   154          do_batch(args)
   155      elif args.command == 'transaction':
   156          do_transaction(args)
   157      elif args.command == 'state':
   158          do_state(args)
   159      elif args.command == 'identity':
   160          do_identity(args)
   161      elif args.command == 'settings':
   162          do_settings(args)
   163      elif args.command == 'peer':
   164          do_peer(args)
   165      elif args.command == 'status':
   166          do_status(args)
   167      else:
   168          raise CliException("invalid command: {}".format(args.command))
   169  
   170  
   171  def main_wrapper():
   172      # pylint: disable=bare-except
   173      try:
   174          main()
   175      except CliException as e:
   176          print("Error: {}".format(e), file=sys.stderr)
   177          sys.exit(1)
   178      except KeyboardInterrupt:
   179          pass
   180      except BrokenPipeError:
   181          sys.stderr.close()
   182      except SystemExit as e:
   183          raise e
   184      except:
   185          traceback.print_exc(file=sys.stderr)
   186          sys.exit(1)