github.com/tenywen/fabric@v1.0.0-beta.0.20170620030522-a5b1ed380643/examples/configtxupdate/common_scripts/common.sh (about)

     1  #!/bin/bash
     2  
     3  SDIR="$(dirname ${BASH_SOURCE[0]})"
     4  
     5  # Set default variables if they have not been set 
     6  : ${INTERACTIVE:=false}
     7  : ${CONFIGTXLATOR_URL:="http://127.0.0.1:7059"}
     8  : ${ORDERER_ADDRESS:=127.0.0.1:7050}
     9  
    10  bigMsg() {
    11  	echo
    12  	echo "#####################################################"
    13  	echo "$1"
    14  	echo "#####################################################"
    15  	echo
    16  }
    17  
    18  die() {
    19  	bigMsg "FAILURE: $1"
    20  	exit 1
    21  }
    22  
    23  pauseIfInteractive() {
    24  	if ${INTERACTIVE} ; then
    25  		echo -en "\nPress enter to continue:"
    26  		read
    27  		echo
    28  	fi
    29  }
    30  
    31  verifyEncodeDecodeArgs() {
    32  	if [ "$#" -ne 3 ] ; then
    33  		echo "Requires 3 arguments, got $#"
    34  		return 1
    35  	fi
    36  
    37  	if [ ! -e "$2" ] ; then
    38  		echo "Input file '$2' must exist"
    39  		return 1
    40  	fi
    41  
    42  	return 0
    43  }
    44  
    45  assertFileContainsProto() {
    46  	if [ ! -s "$1" ] ; then
    47  		echo "Unexpected empty file: '$1'"
    48  		return 1
    49  	fi
    50  
    51  	if ! (file -b --mime "$1" | grep 'charset=binary' &>/dev/null) ; then
    52  		echo "File '$1' does not appear to be protobuf"
    53  		return 1
    54  	fi
    55  
    56  	return 0
    57  }
    58  
    59  assertFileContainsJSON() {
    60  	if [ ! -s "$1" ] ; then
    61  		echo "Unexpected empty file: '$1'"
    62  		return 1
    63  	fi
    64  
    65  	if ! jq . "$1" &> /dev/null ; then
    66  		echo "File '$1' does not appear to be json"
    67  		return 1
    68  	fi
    69  
    70  	return 0
    71  }
    72  
    73  decode() {
    74  	verifyEncodeDecodeArgs $@ || die "bad invocation of decode"
    75  
    76  	MSG_TYPE=$1
    77  		INPUT_FILE=$2
    78  	OUTPUT_FILE=$3
    79  
    80  	echo Executing:
    81  	echo -e "\t" curl -X POST --data-binary @${INPUT_FILE} "$CONFIGTXLATOR_URL/protolator/decode/${MSG_TYPE} > ${OUTPUT_FILE}"
    82  
    83  	curl -s -X POST --data-binary @${INPUT_FILE} "$CONFIGTXLATOR_URL/protolator/decode/${MSG_TYPE}" | jq . >  "${OUTPUT_FILE}"
    84  	[ $? -eq 0 ] || die "unable to decode via REST"
    85  
    86  	assertFileContainsJSON "${OUTPUT_FILE}" || die "expected JSON output"
    87  
    88  	pauseIfInteractive
    89  }
    90  
    91  encode() {
    92  	verifyEncodeDecodeArgs $@ || die "with bad invocation of encode"
    93  
    94  	MSG_TYPE=$1
    95  		INPUT_FILE=$2
    96  	OUTPUT_FILE=$3
    97  
    98  	echo Executing:
    99  	echo -e "\t" curl -X POST --data-binary @${INPUT_FILE} "$CONFIGTXLATOR_URL/protolator/decode/${MSG_TYPE} > ${OUTPUT_FILE}"
   100  
   101  	curl -s -X POST --data-binary @${INPUT_FILE} "$CONFIGTXLATOR_URL/protolator/encode/${MSG_TYPE}" >  "${OUTPUT_FILE}"
   102  	[ $? -eq 0 ] || die "unable to encode via REST"
   103  
   104  	assertFileContainsProto "${OUTPUT_FILE}" || die "expected protobuf output"
   105  
   106  	pauseIfInteractive
   107  }
   108  
   109  computeUpdate() {
   110  	if [ "$#" -ne 4 ] ; then
   111  		echo "Requires 4 arguments, got $#"
   112  		exit 1
   113  	fi
   114  
   115  	CHANNEL_ID=$1
   116  		ORIGINAL_CONFIG=$2
   117  	UPDATED_CONFIG=$3
   118  	OUTPUT_FILE=$4
   119  
   120  	if [ ! -e "${ORIGINAL_CONFIG}" ] ; then
   121  		echo "Input file '${ORIGINAL_CONFIG}' must exist"
   122  		exit 1
   123  	fi
   124  
   125  	if [ ! -e "${UPDATED_CONFIG}" ] ; then
   126  		echo "Input file '${UPDATED_CONFIG}' must exist"
   127  		exit 1
   128  	fi
   129  
   130  	echo Executing:
   131  	echo -e "\tcurl -X POST -F channel=${CHANNEL_ID} -F original=@${ORIGINAL_CONFIG} -F updated=@${UPDATED_CONFIG} ${CONFIGTXLATOR_URL}/configtxlator/compute/update-from-configs > ${OUTPUT_FILE}"
   132  
   133  	curl -s -X POST -F channel="${CHANNEL_ID}" -F "original=@${ORIGINAL_CONFIG}" -F "updated=@${UPDATED_CONFIG}" "${CONFIGTXLATOR_URL}/configtxlator/compute/update-from-configs" > "${OUTPUT_FILE}"
   134  	[ $? -eq 0 ] || die "unable to compute config update via REST"
   135  
   136  	assertFileContainsProto "${OUTPUT_FILE}" || die "expected protobuf output"
   137  
   138  	pauseIfInteractive
   139  }
   140  
   141  fetchConfigBlock() {
   142  	if [ "$#" -ne 2 ] ; then
   143  		echo "Requires 2 arguments, got $#"
   144  		exit 1
   145  	fi
   146  
   147  	CHANNEL_ID="$1"
   148  	OUTPUT_FILE="$2"
   149  
   150  	echo Executing:
   151  	echo -e "\t$PEER channel fetch config '${OUTPUT_FILE}' -o '${ORDERER_ADDRESS}' -c '${CHANNEL_ID}'"
   152  	$PEER channel fetch config "${OUTPUT_FILE}" -o "${ORDERER_ADDRESS}" -c "${CHANNEL_ID}" &> /dev/null || die "Unable to fetch config block"
   153  
   154  	assertFileContainsProto "${OUTPUT_FILE}" || die "expected protobuf output for config block"
   155  
   156  	pauseIfInteractive
   157  }
   158  
   159  wrapConfigEnvelope() {
   160  	CONFIG_UPDATE_JSON="$1"
   161  	OUTPUT_FILE="$2"
   162  
   163  	echo "Wrapping config update in envelope message, like an SDK would."
   164  	echo '{"payload":{"header":{"channel_header":{"channel_id":"'$CHANNEL'", "type":2}},"data":{"config_update":'$(cat ${CONFIG_UPDATE_JSON})'}}}' | jq . > ${OUTPUT_FILE} || die "malformed json"
   165  }
   166  
   167  updateConfig() {
   168  	if [ "$#" -ne 2 ] ; then
   169  		echo "Requires 2 arguments, got $#"
   170  		exit 1
   171  	fi
   172  
   173  	CHANNEL_ID="$1"
   174  	CONFIGTX="$2"
   175  
   176  	echo Executing:
   177  	echo -e "\t$PEER channel update -f '${CONFIGTX}' -c '${CHANNEL_ID}' -o '${ORDERER_ADDRESS}'"
   178  	$PEER channel update -f "${CONFIGTX}" -c "${CHANNEL_ID}" -o "${ORDERER_ADDRESS}" &> /dev/null || die "Error updating channel"
   179  
   180  	pauseIfInteractive
   181  }
   182  
   183  createChannel() {
   184  	if [ "$#" -ne 2 ] ; then
   185  		echo "Requires 2 arguments, got $#"
   186  		exit 1
   187  	fi
   188  
   189  	CHANNEL_ID="$1"
   190  	CONFIGTX="$2"
   191  
   192  	echo Executing:
   193  	echo -e "\t$PEER channel create -f '${CONFIGTX}' -c '${CHANNEL_ID}' -o '${ORDERER_ADDRESS}'"
   194  	$PEER channel create -f "${CONFIGTX}" -c "${CHANNEL_ID}" -o "${ORDERER_ADDRESS}" &> /dev/null || die "Error creating channel"
   195  
   196  	pauseIfInteractive
   197  }
   198  
   199  
   200  findConfigtxgen() {
   201  	if hash configtxgen 2>/dev/null ; then
   202  		CONFIGTXGEN=configtxgen
   203  		return 0
   204  	fi
   205  
   206  	if [ -e "../../../build/bin/configtxgen" ] ; then
   207  		CONFIGTXGEN="../../../build/bin/configtxgen" 
   208  		return 0
   209  	fi
   210  
   211  	echo "No configtxgen found, try 'make configtxgen'"
   212  	return 1
   213  }
   214  
   215  findConfigtxlator() {
   216  	if hash configtxlator 2>/dev/null ; then
   217  		CONFIGTXGEN=configtxgen
   218  		return 0
   219  	fi
   220  
   221  	if [ -e "${SDIR}/../../../build/bin/configtxlator" ] ; then
   222  		CONFIGTXGEN="${SDIR}/../../../build/bin/configtxlator" 
   223  		return 0
   224  	fi
   225  
   226  	echo "No configtxlator found, try 'make configtxlator'"
   227  	return 1
   228  }
   229  
   230  findPeer() {
   231  	if hash peer 2>/dev/null ; then
   232  		PEER=peer
   233  		return 0
   234  	fi
   235  
   236  	if [ -e "${SDIR}/../../../build/bin/peer" ] ; then
   237  		PEER="${SDIR}/../../../build/bin/peer" 
   238  		return 0
   239  	fi
   240  
   241  	echo "No configtxlator found, try 'make configtxlator'"
   242  	return 1
   243  }