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)