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 }