-
Notifications
You must be signed in to change notification settings - Fork 8.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
install-fabric.sh script - updated version of bootstrap.
Uses positional arugments and opt-in logic to control the components to install Uses options to define the optional fabric and ca versions Order of arguments and options is not important eg install-fabric.sh docker binary samples # install docker images, binaries and clones samples dir install-fabric.sh d b s # install all components but with short-hand install-fabric.sh -f 2.4.0-beta b # 2.4.0-beta for binaries only install-fabric.sh docker -c 1.5.1 -f 2.4.0-beta # docker images but for 1.5.1 CA and 2.4.0-beta it is an error to NOT specify a component Signed-off-by: Matthew B White <whitemat@uk.ibm.com>
- Loading branch information
Showing
1 changed file
with
286 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,286 @@ | ||
#!/bin/bash | ||
# | ||
# Copyright IBM Corp. All Rights Reserved. | ||
# | ||
# SPDX-License-Identifier: Apache-2.0 | ||
# | ||
|
||
# A modified version of the Fabric bootstrap script | ||
# Use positional arguments to select componenets to install | ||
# | ||
# Has exactly the same functional power of bootstrap.sh | ||
|
||
|
||
### START OF CODE GENERATED BY Argbash v2.9.0 ### | ||
# Argbash is a bash code generator used to get arguments parsing right. | ||
# Argbash is FREE SOFTWARE, see https://argbash.io for more info | ||
# Generated online by https://argbash.io/generate | ||
|
||
|
||
# Default values | ||
_positionals=() | ||
_arg_comp=('' ) | ||
|
||
# if version not passed in, default to latest released version | ||
# if ca version not passed in, default to latest released version | ||
_arg_fabric_version="2.3.4" | ||
_arg_ca_version="1.5.1" | ||
|
||
ARCH=$(echo "$(uname -s|tr '[:upper:]' '[:lower:]'|sed 's/mingw64_nt.*/windows/')-$(uname -m | sed 's/x86_64/amd64/g')") | ||
MARCH=$(uname -m) | ||
|
||
die() | ||
{ | ||
local _ret="${2:-1}" | ||
test "${_PRINT_HELP:-no}" = yes && print_help >&2 | ||
echo "$1" >&2 | ||
exit "${_ret}" | ||
} | ||
|
||
|
||
begins_with_short_option() | ||
{ | ||
local first_option all_short_options='fc' | ||
first_option="${1:0:1}" | ||
test "$all_short_options" = "${all_short_options/$first_option/}" && return 1 || return 0 | ||
} | ||
|
||
|
||
|
||
print_help() | ||
{ | ||
printf 'Usage: %s [-f|--fabric-version <arg>] [-c|--ca-version <arg>] <comp-1> [<comp-2>] ... [<comp-n>] ...\n' "$0" | ||
printf '\t%s\n' "<comp>: Component to install one or more of d[ocker]|b[inary]|s[amples]" | ||
printf '\t%s\n' "-f, --fabric-version: FabricVersion (default: '2.3.4')" | ||
printf '\t%s\n' "-c, --ca-version: Fabric CA Version (default: '1.5.1')" | ||
} | ||
|
||
|
||
parse_commandline() | ||
{ | ||
_positionals_count=0 | ||
while test $# -gt 0 | ||
do | ||
_key="$1" | ||
case "$_key" in | ||
-f|--fabric-version) | ||
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1 | ||
_arg_fabric_version="$2" | ||
shift | ||
;; | ||
--fabric-version=*) | ||
_arg_fabric_version="${_key##--fabric-version=}" | ||
;; | ||
-f*) | ||
_arg_fabric_version="${_key##-f}" | ||
;; | ||
-c|--ca-version) | ||
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1 | ||
_arg_ca_version="$2" | ||
shift | ||
;; | ||
-h|--help) | ||
print_help | ||
exit 0 | ||
;; | ||
-h*) | ||
print_help | ||
exit 0 | ||
;; | ||
--ca-version=*) | ||
_arg_ca_version="${_key##--ca-version=}" | ||
;; | ||
-c*) | ||
_arg_ca_version="${_key##-c}" | ||
;; | ||
*) | ||
_last_positional="$1" | ||
_positionals+=("$_last_positional") | ||
_positionals_count=$((_positionals_count + 1)) | ||
;; | ||
esac | ||
shift | ||
done | ||
} | ||
|
||
|
||
handle_passed_args_count() | ||
{ | ||
local _required_args_string="'comp'" | ||
test "${_positionals_count}" -ge 1 || _PRINT_HELP=yes die "FATAL ERROR: Not enough positional arguments - we require at least 1 (namely: $_required_args_string), but got only ${_positionals_count}." 1 | ||
} | ||
|
||
|
||
assign_positional_args() | ||
{ | ||
local _positional_name _shift_for=$1 | ||
_positional_names="_arg_comp " | ||
_our_args=$((${#_positionals[@]} - 1)) | ||
for ((ii = 0; ii < _our_args; ii++)) | ||
do | ||
_positional_names="$_positional_names _arg_comp[$((ii + 1))]" | ||
done | ||
|
||
shift "$_shift_for" | ||
for _positional_name in ${_positional_names} | ||
do | ||
test $# -gt 0 || break | ||
eval "$_positional_name=\${1}" || die "Error during argument parsing, possibly an Argbash bug." 1 | ||
shift | ||
done | ||
} | ||
|
||
# End of ARGBASH code | ||
|
||
# dockerPull() pulls docker images from fabric and chaincode repositories | ||
# note, if a docker image doesn't exist for a requested release, it will simply | ||
# be skipped, since this script doesn't terminate upon errors. | ||
|
||
dockerPull() { | ||
#three_digit_image_tag is passed in, e.g. "1.4.7" | ||
three_digit_image_tag=$1 | ||
shift | ||
#two_digit_image_tag is derived, e.g. "1.4", especially useful as a local tag for two digit references to most recent baseos, ccenv, javaenv, nodeenv patch releases | ||
two_digit_image_tag=$(echo "$three_digit_image_tag" | cut -d'.' -f1,2) | ||
while [[ $# -gt 0 ]] | ||
do | ||
image_name="$1" | ||
echo "====> hyperledger/fabric-$image_name:$three_digit_image_tag" | ||
docker pull "hyperledger/fabric-$image_name:$three_digit_image_tag" | ||
docker tag "hyperledger/fabric-$image_name:$three_digit_image_tag" "hyperledger/fabric-$image_name" | ||
docker tag "hyperledger/fabric-$image_name:$three_digit_image_tag" "hyperledger/fabric-$image_name:$two_digit_image_tag" | ||
shift | ||
done | ||
} | ||
|
||
cloneSamplesRepo() { | ||
# clone (if needed) hyperledger/fabric-samples and checkout corresponding | ||
# version to the binaries and docker images to be downloaded | ||
if [ -d test-network ]; then | ||
# if we are in the fabric-samples repo, checkout corresponding version | ||
echo "==> Already in fabric-samples repo" | ||
elif [ -d fabric-samples ]; then | ||
# if fabric-samples repo already cloned and in current directory, | ||
# cd fabric-samples | ||
echo "===> Changing directory to fabric-samples" | ||
cd fabric-samples | ||
else | ||
echo "===> Cloning hyperledger/fabric-samples repo" | ||
git clone -b main https://github.com/hyperledger/fabric-samples.git && cd fabric-samples | ||
fi | ||
|
||
if GIT_DIR=.git git rev-parse v${VERSION} >/dev/null 2>&1; then | ||
echo "===> Checking out v${VERSION} of hyperledger/fabric-samples" | ||
git checkout -q v${VERSION} | ||
else | ||
echo "fabric-samples v${VERSION} does not exist, defaulting to main. fabric-samples main branch is intended to work with recent versions of fabric." | ||
git checkout -q main | ||
fi | ||
} | ||
|
||
# This will download the .tar.gz | ||
download() { | ||
local BINARY_FILE=$1 | ||
local URL=$2 | ||
echo "===> Downloading: " "${URL}" | ||
curl -L --retry 5 --retry-delay 3 "${URL}" | tar xz || rc=$? | ||
if [ -n "$rc" ]; then | ||
echo "==> There was an error downloading the binary file." | ||
return 22 | ||
else | ||
echo "==> Done." | ||
fi | ||
} | ||
|
||
pullBinaries() { | ||
echo "===> Downloading version ${FABRIC_TAG} platform specific fabric binaries" | ||
download "${BINARY_FILE}" "https://github.com/hyperledger/fabric/releases/download/v${VERSION}/${BINARY_FILE}" | ||
if [ $? -eq 22 ]; then | ||
echo | ||
echo "------> ${FABRIC_TAG} platform specific fabric binary is not available to download <----" | ||
echo | ||
exit | ||
fi | ||
|
||
echo "===> Downloading version ${CA_TAG} platform specific fabric-ca-client binary" | ||
download "${CA_BINARY_FILE}" "https://github.com/hyperledger/fabric-ca/releases/download/v${CA_VERSION}/${CA_BINARY_FILE}" | ||
if [ $? -eq 22 ]; then | ||
echo | ||
echo "------> ${CA_TAG} fabric-ca-client binary is not available to download (Available from 1.1.0-rc1) <----" | ||
echo | ||
exit | ||
fi | ||
} | ||
|
||
pullDockerImages() { | ||
command -v docker >& /dev/null | ||
NODOCKER=$? | ||
if [ "${NODOCKER}" == 0 ]; then | ||
FABRIC_IMAGES=(peer orderer ccenv tools) | ||
case "$VERSION" in | ||
2.*) | ||
FABRIC_IMAGES+=(baseos) | ||
shift | ||
;; | ||
esac | ||
echo "FABRIC_IMAGES:" "${FABRIC_IMAGES[@]}" | ||
echo "===> Pulling fabric Images" | ||
dockerPull "${FABRIC_TAG}" "${FABRIC_IMAGES[@]}" | ||
echo "===> Pulling fabric ca Image" | ||
CA_IMAGE=(ca) | ||
dockerPull "${CA_TAG}" "${CA_IMAGE[@]}" | ||
echo "===> List out hyperledger docker images" | ||
docker images | grep hyperledger | ||
else | ||
echo "=========================================================" | ||
echo "Docker not installed, bypassing download of Fabric images" | ||
echo "=========================================================" | ||
fi | ||
} | ||
|
||
|
||
# Main code starts here | ||
parse_commandline "$@" | ||
handle_passed_args_count | ||
assign_positional_args 1 "${_positionals[@]}" | ||
|
||
|
||
VERSION=$_arg_fabric_version | ||
CA_VERSION=$_arg_ca_version | ||
|
||
# prior to 1.2.0 architecture was determined by uname -m | ||
if [[ $VERSION =~ ^1\.[0-1]\.* ]]; then | ||
export FABRIC_TAG=${MARCH}-${VERSION} | ||
export CA_TAG=${MARCH}-${CA_VERSION} | ||
else | ||
# starting with 1.2.0, multi-arch images will be default | ||
: "${CA_TAG:="$CA_VERSION"}" | ||
: "${FABRIC_TAG:="$VERSION"}" | ||
fi | ||
|
||
BINARY_FILE=hyperledger-fabric-${ARCH}-${VERSION}.tar.gz | ||
CA_BINARY_FILE=hyperledger-fabric-ca-${ARCH}-${CA_VERSION}.tar.gz | ||
|
||
|
||
for _comp in ${_arg_comp[@]} | ||
do | ||
if [[ "$_comp" == "samples" || "$_comp" == "s" ]]; then | ||
echo | ||
echo "Clone hyperledger/fabric-samples repo" | ||
echo | ||
cloneSamplesRepo | ||
elif [[ "$_comp" == "binary" || "$_comp" == "b" ]]; then | ||
echo | ||
echo "Pull Hyperledger Fabric binaries" | ||
echo | ||
pullBinaries | ||
elif [[ "$_comp" == "docker" || "$_comp" == "d" ]]; then | ||
echo | ||
echo "Pull Hyperledger Fabric docker images" | ||
echo | ||
pullDockerImages | ||
else | ||
echo | ||
_PRINT_HELP=yes die "Unknown component ${_comp}" 1 | ||
fi | ||
done |