Files
onix/install/beckn-onix.sh

986 lines
36 KiB
Bash
Executable File

#!/bin/bash
source scripts/variables.sh
source scripts/get_container_details.sh
# Function to start a specific service inside docker-compose file
install_package() {
echo "${GREEN}................Installing required packages................${NC}"
bash scripts/package_manager.sh
echo "Package Installation is done"
}
start_container() {
#ignore orphaned containers warning
export COMPOSE_IGNORE_ORPHANS=1
docker compose -f $1 up -d $2
}
update_registry_details() {
if [[ $1 ]]; then
if [[ $1 == https://* ]]; then
if [[ $(uname -s) == 'Darwin' ]]; then
registry_url=$(echo "$1" | sed -E 's/https:\/\///')
else
registry_url=$(echo "$1" | sed 's/https:\/\///')
fi
registry_port=443
protocol=https
elif [[ $1 == http://* ]]; then
if [[ $(uname -s) == 'Darwin' ]]; then
registry_url=$(echo "$1" | sed -E 's/http:\/\///')
else
registry_url=$(echo "$1" | sed 's/http:\/\///')
fi
registry_port=80
protocol=http
fi
else
registry_url=registry
registry_port=3030
protocol=http
fi
echo $registry_url
cp $SCRIPT_DIR/../registry_data/config/swf.properties-sample $SCRIPT_DIR/../registry_data/config/swf.properties
config_file="$SCRIPT_DIR/../registry_data/config/swf.properties"
tmp_file=$(mktemp "tempfile.XXXXXXXXXX")
sed "s|REGISTRY_URL|$registry_url|g; s|REGISTRY_PORT|$registry_port|g; s|PROTOCOL|$protocol|g" "$config_file" >"$tmp_file"
mv "$tmp_file" "$config_file"
docker volume create registry_data_volume
docker volume create registry_database_volume
docker run --rm -v $SCRIPT_DIR/../registry_data/config:/source -v registry_data_volume:/target busybox cp /source/{envvars,logger.properties,swf.properties} /target/
docker rmi busybox
}
# Function to start Redis service only
start_support_services() {
#ignore orphaned containers warning
export COMPOSE_IGNORE_ORPHANS=1
echo "${GREEN}................Installing Redis................${NC}"
docker compose -f docker-compose-app.yml up -d redis_db
echo "Redis installation successful"
}
install_gateway() {
if [[ $1 && $2 ]]; then
bash scripts/update_gateway_details.sh $1 $2
else
bash scripts/update_gateway_details.sh http://registry:3030
fi
echo "${GREEN}................Installing Gateway service................${NC}"
start_container $gateway_docker_compose_file gateway
echo "Registering Gateway in the registry"
sleep 10
# if [[ $1 && $2 ]]; then
# bash scripts/register_gateway.sh $2
# else
# bash scripts/register_gateway.sh
# fi
echo " "
echo "Gateway installation successful"
}
# Function to install Beckn Gateway and Beckn Registry
install_registry() {
if [[ $1 ]]; then
update_registry_details $1
else
update_registry_details
fi
echo "${GREEN}................Installing Registry service................${NC}"
start_container $registry_docker_compose_file registry
sleep 10
echo "Registry installation successful"
#Update Role Permission for registry.
if [[ $1 ]]; then
bash scripts/registry_role_permissions.sh $1
else
bash scripts/registry_role_permissions.sh
fi
}
# Function to install Layer2 Config
install_layer2_config() {
container_name=$1
FILENAME="$(basename "$layer2_url")"
wget -O "$(basename "$layer2_url")" "$layer2_url" >/dev/null 2>&1
if [ $? -eq 0 ]; then
docker cp "$FILENAME" $container_name:"$schemas_path/$FILENAME" >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo "${GREEN}Successfully copied $FILENAME to Docker container $container_name.${NC}"
fi
else
echo "${BoldRed}The Layer 2 configuration file has not been downloaded.${NC}"
echo -e "${BoldGreen}Please download the Layer 2 configuration files by running the download_layer_2_config_bap.sh script located in the ../layer2 folder."
echo -e "For further information, refer to this URL: https://github.com/beckn/beckn-onix/blob/main/docs/user_guide.md#downloading-layer-2-configuration-for-a-domain.${NC}"
fi
rm -f $FILENAME >/dev/null 2>&1
}
# Function to install BAP Protocol Server - creates registry entries only
install_bap_protocol_server() {
if [[ $1 ]]; then
registry_url=$1
bap_subscriber_id=$2
bap_subscriber_key_id=$3
bap_subscriber_url=$4
bash scripts/update_bap_config.sh $registry_url $bap_subscriber_id $bap_subscriber_key_id $bap_subscriber_url $api_key $np_domain
else
bash scripts/update_bap_config.sh
fi
echo "Protocol server BAP registry entries created successfully"
}
# Function to install BPP Protocol Server - creates registry entries only
install_bpp_protocol_server() {
echo "${GREEN}................Installing Protocol Server for BPP................${NC}"
if [[ $1 ]]; then
registry_url=$1
bpp_subscriber_id=$2
bpp_subscriber_key_id=$3
bpp_subscriber_url=$4
webhook_url=$5
bash scripts/update_bpp_config.sh $registry_url $bpp_subscriber_id $bpp_subscriber_key_id $bpp_subscriber_url $webhook_url $api_key $np_domain
else
bash scripts/update_bpp_config.sh
fi
echo "Protocol server BPP registry entries created successfully"
}
mergingNetworks() {
echo -e "1. Merge Two Different Registries \n2. Merge Multiple Registries into a Super Registry"
read -p "Enter your choice: " merging_network
urls=()
if [ "$merging_network" = "2" ]; then
while true; do
read -p "Enter registry URL (or 'N' to stop): " url
if [[ $url == 'N' ]]; then
break
else
urls+=("$url")
fi
done
read -p "Enter the Super Registry URL: " registry_super_url
else
read -p "Enter A registry URL: " registry_a_url
read -p "Enter B registry URL: " registry_b_url
urls+=("$registry_a_url")
fi
if [[ ${#urls[@]} -gt 0 ]]; then
echo "Entered registry URLs:"
all_responses=""
for url in "${urls[@]}"; do
response=$(curl -s -H 'ACCEPT: application/json' -H 'CONTENT-TYPE: application/json' "$url"+/subscribers/lookup -d '{}')
all_responses+="$response"
done
for element in $(echo "$all_responses" | jq -c '.[]'); do
if [ "$merging_network" -eq 1 ]; then
curl --location "$registry_b_url"+/subscribers/register \
--header 'Content-Type: application/json' \
--data "$element"
echo
else
curl --location "$registry_super_url"+/subscribers/register \
--header 'Content-Type: application/json' \
--data "$element"
echo
fi
done
echo "Merging Multiple Registries into a Super Registry Done ..."
else
echo "No registry URLs entered."
fi
if [ "$merging_network" = "2" ]; then
echo "Merging Multiple Registries into a Super Registry"
else
echo "Invalid option. Please restart the script and select a valid option."
exit 1
fi
}
# Function to install BPP Protocol Server with Sandbox
install_bpp_protocol_server_with_sandbox() {
echo "${GREEN}................Installing Sandbox................${NC}"
start_container $bpp_docker_compose_file_sandbox "sandbox-api"
sleep 5
echo "Sandbox installation successful"
echo "${GREEN}................Installing Protocol Server for BPP................${NC}"
if [[ $1 ]]; then
registry_url=$1
bpp_subscriber_id=$2
bpp_subscriber_key_id=$3
bpp_subscriber_url=$4
webhook_url=$5
bash scripts/update_bpp_config.sh $registry_url $bpp_subscriber_id $bpp_subscriber_key_id $bpp_subscriber_url $webhook_url $api_key $np_domain
else
bash scripts/update_bpp_config.sh
fi
echo "Protocol server BPP registry entries created successfully"
}
layer2_config() {
while true; do
read -p "Paste the URL of the Layer 2 configuration here (or press Enter to skip): " layer2_url
if [[ -z "$layer2_url" ]]; then
break #If URL is empty then skip the URL validation
elif [[ $layer2_url =~ ^(http|https):// ]]; then
break
else
echo "${RED}Invalid URL format. Please enter a valid URL starting with http:// or https://.${NC}"
fi
done
}
# Validate the user credentials against the Registry
validate_user() {
# Prompt for username
read -p "Enter your registry username: " username
# Prompt for password with '*' masking
echo -n "Enter your registry password: "
stty -echo # Disable terminal echo
password=""
while IFS= read -r -n1 char; do
if [[ "$char" == $'\0' ]]; then
break
fi
password+="$char"
echo -n "*" # Display '*' for each character typed
done
stty echo # Re-enable terminal echo
echo # Move to a new line after input
# Replace '/subscribers' with '/login' for validation
local login_url="${registry_url%/subscribers}/login"
# Validate credentials using a POST request
local response
response=$(curl -s -w "%{http_code}" -X POST "$login_url" \
-H "Content-Type: application/json" \
-d '{ "Name" : "'"$username"'", "Password" : "'"$password"'" }')
# Check if the HTTP response is 200 (success)
status_code="${response: -3}"
if [ "$status_code" -eq 200 ]; then
response_body="${response%???}"
api_key=$(echo "$response_body" | jq -r '.api_key')
return 0
else
response=$(curl -s -w "%{http_code}" -X POST "$login_url" \
-H "Content-Type: application/json" \
-d '{ "User" : { "Name" : "'"$username"'", "Password" : "'"$password"'" }}')
status_code="${response: -3}"
if [ "$status_code" -eq 200 ]; then
response_body="${response%???}"
api_key=$(echo "$response_body" | jq -r '.api_key')
return 0
fi
fi
echo "Please check your credentials or register new user on $login_url"
return 1
}
get_np_domain() {
if [[ $2 ]]; then
read -p "Do you want to setup this $1 and $2 for specific domain? {Y/N} " dchoice
else
read -p "Do you want to setup this $1 for specific domain? {Y/N} " dchoice
fi
if [[ "$dchoice" == "Y" || "$dchoice" == "y" ]]; then
local login_url="${registry_url%/subscribers}"
read -p "Enter the domain name for $1 : " np_domain
domain_present=$(curl -s -H "ApiKey:$api_key" --header 'Content-Type: application/json' $login_url/network_domains/index | jq -r '.[].name' | tr '\n' ' ')
if echo "$domain_present" | grep -Fqw "$np_domain"; then
return 0
else
echo "${BoldRed}The domain '$np_domain' is NOT present in the network domains.${NC}"
echo "${BoldGreen}Available network domains: $domain_present ${NC}"
fi
else
np_domain=" " #If user don't want to add specific domain then save empty string
return 0
fi
}
# Function to handle the setup process for each platform
completeSetup() {
platform=$1
public_address="https://<your public IP address>"
echo "Proceeding with the setup for $platform..."
case $platform in
"Registry")
while true; do
read -p "Enter publicly accessible registry URL: " registry_url
if [[ $registry_url =~ ^(http|https):// ]]; then
break
else
echo "${RED}Invalid URL format. Please enter a valid URL starting with http:// or https://.${NC}"
fi
done
new_registry_url="${registry_url%/}"
public_address=$registry_url
install_package
install_registry $new_registry_url
;;
"Gateway" | "Beckn Gateway")
while true; do
read -p "Enter your registry URL: " registry_url
if [[ $registry_url =~ ^(http|https):// ]]; then
break
else
echo "${RED}Invalid URL format. Please enter a valid URL starting with http:// or https://.${NC}"
fi
done
while true; do
read -p "Enter publicly accessible gateway URL: " gateway_url
if [[ $gateway_url =~ ^(http|https):// ]]; then
gateway_url="${gateway_url%/}"
break
else
echo "${RED}Invalid URL format. Please enter a valid URL starting with http:// or https://.${NC}"
fi
done
public_address=$gateway_url
install_package
install_gateway $registry_url $gateway_url
;;
"BAP")
echo "${GREEN}................Installing Protocol Server for BAP................${NC}"
read -p "Enter BAP Subscriber ID: " bap_subscriber_id
while true; do
read -p "Enter BAP Subscriber URL: " bap_subscriber_url
if [[ $bap_subscriber_url =~ ^(http|https):// ]]; then
break
else
echo "${RED}Invalid URL format. Please enter a valid URL starting with http:// or https://.${NC}"
fi
done
while true; do
read -p "Enter the registry URL (e.g., https://registry.becknprotocol.io/subscribers): " registry_url
if [[ $registry_url =~ ^(http|https):// ]] && [[ $registry_url == */subscribers ]]; then
break
else
echo "${RED}Invalid URL format. Please enter a valid URL starting with http:// or https://.${NC}"
fi
done
validate_user
if [ $? -eq 1 ]; then
exit
fi
get_np_domain $bap_subscriber_id
if [ $? -eq 1 ]; then
exit
fi
bap_subscriber_key_id="$bap_subscriber_id-key"
public_address=$bap_subscriber_url
# layer2_config # Commented out - ONIX adapter handles schemas differently
install_package
install_bap_protocol_server $registry_url $bap_subscriber_id $bap_subscriber_key_id $bap_subscriber_url
# Ask if user wants ONIX adapter
read -p "${GREEN}Do you want to install ONIX adapter (Y/N): ${NC}" onix_choice
if [[ "$onix_choice" == "Y" || "$onix_choice" == "y" ]]; then
install_bap_adapter
fi
;;
"BPP")
echo "${GREEN}................Installing Protocol Server for BPP................${NC}"
read -p "Enter BPP Subscriber ID: " bpp_subscriber_id
while true; do
read -p "Enter BPP Subscriber URL: " bpp_subscriber_url
if [[ $bpp_subscriber_url =~ ^(http|https):// ]]; then
break
else
echo "${RED}Invalid URL format. Please enter a valid URL starting with http:// or https://.${NC}"
fi
done
while true; do
read -p "Enter Webhook URL: " webhook_url
if [[ $webhook_url =~ ^(http|https):// ]]; then
break
else
echo "${RED}Invalid URL format. Please enter a valid URL starting with http:// or https://.${NC}"
fi
done
while true; do
read -p "Enter the registry URL (e.g., https://registry.becknprotocol.io/subscribers): " registry_url
if [[ $registry_url =~ ^(http|https):// ]] && [[ $registry_url == */subscribers ]]; then
break
else
echo "${RED}Please mention /subscribers in your registry URL${NC}"
fi
done
validate_user
if [ $? -eq 1 ]; then
exit
fi
get_np_domain $bpp_subscriber_id
if [ $? -eq 1 ]; then
exit
fi
bpp_subscriber_key_id="$bpp_subscriber_id-key"
public_address=$bpp_subscriber_url
# layer2_config # Commented out - ONIX adapter handles schemas differently
install_package
install_bpp_protocol_server $registry_url $bpp_subscriber_id $bpp_subscriber_key_id $bpp_subscriber_url $webhook_url
# Ask if user wants ONIX adapter
read -p "${GREEN}Do you want to install ONIX adapter (Y/N): ${NC}" onix_choice
if [[ "$onix_choice" == "Y" || "$onix_choice" == "y" ]]; then
install_bpp_adapter
fi
;;
"ALL")
# Collect all inputs at once for all components
# Registry input
while true; do
read -p "Enter publicly accessible registry URL: " registry_url
if [[ $registry_url =~ ^(http|https):// ]]; then
break
else
echo "${RED}Invalid URL format. Please enter a valid URL starting with http:// or https://.${NC}"
fi
done
# Gateway inputs
while true; do
read -p "Enter publicly accessible gateway URL: " gateway_url
if [[ $gateway_url =~ ^(http|https):// ]]; then
gateway_url="${gateway_url%/}"
break
else
echo "${RED}Invalid URL format. Please enter a valid URL starting with http:// or https://.${NC}"
fi
done
# BAP inputs
read -p "Enter BAP Subscriber ID: " bap_subscriber_id
while true; do
read -p "Enter BAP Subscriber URL: " bap_subscriber_url
if [[ $bap_subscriber_url =~ ^(http|https):// ]]; then
break
else
echo "${RED}Invalid URL format. Please enter a valid URL starting with http:// or https://.${NC}"
fi
done
# BPP inputs
read -p "Enter BPP Subscriber ID: " bpp_subscriber_id
while true; do
read -p "Enter BPP Subscriber URL: " bpp_subscriber_url
if [[ $bpp_subscriber_url =~ ^(http|https):// ]]; then
break
else
echo "${RED}Invalid URL format. Please enter a valid URL starting with http:// or https://.${NC}"
fi
done
while true; do
read -p "Enter Webhook URL: " webhook_url
if [[ $webhook_url =~ ^(http|https):// ]]; then
break
else
echo "${RED}Invalid URL format. Please enter a valid URL starting with http:// or https://.${NC}"
fi
done
# Install components after gathering all inputs
install_package
install_registry $registry_url
install_gateway $registry_url $gateway_url
# layer2_config # Commented out - ONIX adapter handles schemas differently
#Append /subscribers for registry_url
new_registry_url="${registry_url%/}/subscribers"
bap_subscriber_key_id="$bap_subscriber_id-key"
install_bap_protocol_server $new_registry_url $bap_subscriber_id $bap_subscriber_key_id $bap_subscriber_url
bpp_subscriber_key_id="$bpp_subscriber_id-key"
install_bpp_protocol_server $new_registry_url $bpp_subscriber_id $bpp_subscriber_key_id $bpp_subscriber_url $webhook_url
# Ask if user wants ONIX adapter
read -p "${GREEN}Do you want to install ONIX adapter (Y/N): ${NC}" onix_choice
if [[ "$onix_choice" == "Y" || "$onix_choice" == "y" ]]; then
install_adapter "BOTH"
fi
;;
*)
echo "Unknown platform: $platform"
;;
esac
}
restart_script() {
read -p "${GREEN}Do you want to restart the script or exit the script? (r for restart, e for exit): ${NC}" choice
if [[ $choice == "r" ]]; then
echo "Restarting the script..."
exec "$0" # Restart the script by re-executing it
elif [[ $choice == "e" ]]; then
echo "Exiting the script..."
exit 0
fi
}
# Function to validate user input
validate_input() {
local input=$1
local max_option=$2
# Check if the input is a digit and within the valid range
if [[ "$input" =~ ^[0-9]+$ ]] && ((input >= 1 && input <= max_option)); then
return 0 # Valid input
else
echo "${RED}Invalid input. Please enter a number between 1 and $max_option.${NC}"
return 1 # Invalid input
fi
}
check_docker_permissions() {
if ! command -v docker &>/dev/null; then
echo -e "${RED}Error: Docker is not installed on this system.${NC}"
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
install_package
if [[ $? -ne 0 ]]; then
echo -e "${RED}Please install Docker and try again.${NC}"
echo -e "${RED}Please install Docker and jq manually.${NC}"
exit 1
fi
fi
fi
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
if ! groups "$USER" | grep -q '\bdocker\b'; then
echo -e "${RED}Error: You do not have permission to run Docker. Please add yourself to the docker group by running the following command:${NC}"
echo -e "${BoldGreen}sudo usermod -aG docker \$USER"
echo -e "After running the above command, please log out and log back in to your system, then restart the deployment script.${NC}"
exit 1
fi
fi
}
# Function to update/upgrade a specific service
update_service() {
service_name=$1
docker_compose_file=$2
image_name=$3
echo "${GREEN}................Updating $service_name................${NC}"
export COMPOSE_IGNORE_ORPHANS=1
# Pull the latest image
docker pull "$image_name"
# Stop and remove the existing container
docker compose -f "$docker_compose_file" stop "$service_name"
docker compose -f "$docker_compose_file" rm -f "$service_name"
# Start the service with the new image
docker compose -f "$docker_compose_file" up -d "$service_name"
echo "$service_name update successful"
}
# Function to validate required modules exist in config file
validate_config_modules() {
local key_type=$1
local config_file=$2
local has_bap_modules=$(grep -c "name: bapTxn" "$config_file")
local has_bpp_modules=$(grep -c "name: bppTxn" "$config_file")
# Only validate that required modules exist, don't enforce strict matching
if [[ "$key_type" == "BAP" && $has_bap_modules -eq 0 ]]; then
echo "${RED}Error: BAP deployment selected but no BAP modules found in config file${NC}"
echo "${BLUE}Config file: $config_file${NC}"
echo "${YELLOW}Please update docker-compose-adapter2.yml to use a config file with BAP modules${NC}"
return 1
elif [[ "$key_type" == "BPP" && $has_bpp_modules -eq 0 ]]; then
echo "${RED}Error: BPP deployment selected but no BPP modules found in config file${NC}"
echo "${BLUE}Config file: $config_file${NC}"
echo "${YELLOW}Please update docker-compose-adapter2.yml to use a config file with BPP modules${NC}"
return 1
elif [[ "$key_type" == "BOTH" && ($has_bap_modules -eq 0 || $has_bpp_modules -eq 0) ]]; then
echo "${RED}Error: Combined deployment selected but missing modules in config file${NC}"
echo "${BLUE}Config file: $config_file${NC}"
echo "${BLUE}BAP modules found: $has_bap_modules, BPP modules found: $has_bpp_modules${NC}"
echo "${YELLOW}Please update docker-compose-adapter2.yml to use a config file with both BAP and BPP modules${NC}"
return 1
fi
# Allow BAP deployment with combined config (BAP + BPP modules)
# Allow BPP deployment with combined config (BAP + BPP modules)
echo "${GREEN}✓ Config validation passed - $key_type deployment with available modules${NC}"
return 0
}
# Function to configure ONIX adapter with registry keys
# Usage: configure_onix_registry_keys [BAP|BPP|BOTH] [config_file]
configure_onix_registry_keys() {
local key_type=${1:-"BOTH"}
local config_file=$2
echo "${GREEN}Setting up ONIX keys ($key_type) from existing protocol server configs...${NC}"
# Determine config file - only auto-detect if not provided
if [ -z "$config_file" ]; then
local docker_config=$(grep -o '/app/config/[^"]*' docker-compose-adapter2.yml | head -1)
if [ -z "$docker_config" ]; then
echo "${RED}Error: Could not find config file in docker-compose-adapter2.yml${NC}"
return 1
fi
config_file="${docker_config/\/app\/config\//../config/}"
echo "${BLUE}detected config file from docker-compose: $config_file${NC}"
else
echo "${BLUE}Using specified config file: $config_file${NC}"
fi
echo "${BLUE}Updating config file: $config_file${NC}"
local bap_config="protocol-server-data/bap-client.yml"
local bpp_config="protocol-server-data/bpp-client.yml"
# Extract keys based on type
local bap_private_key bap_public_key bpp_private_key bpp_public_key
if [[ "$key_type" == "BAP" || "$key_type" == "BOTH" ]]; then
if [ -f "$bap_config" ]; then
bap_private_key_full=$(awk '/privateKey:/ {print $2}' "$bap_config" | tr -d '"')
bap_public_key=$(awk '/publicKey:/ {print $2}' "$bap_config" | tr -d '"')
bap_private_key=$(echo "$bap_private_key_full" | base64 -d | head -c 32 | base64 -w 0)
echo "${GREEN}✓ Extracted BAP keys from $bap_config${NC}"
else
echo "${RED}Error: BAP config file not found at $bap_config${NC}"
return 1
fi
fi
if [[ "$key_type" == "BPP" || "$key_type" == "BOTH" ]]; then
if [ -f "$bpp_config" ]; then
bpp_private_key_full=$(awk '/privateKey:/ {print $2}' "$bpp_config" | tr -d '"')
bpp_public_key=$(awk '/publicKey:/ {print $2}' "$bpp_config" | tr -d '"')
bpp_private_key=$(echo "$bpp_private_key_full" | base64 -d | head -c 32 | base64 -w 0)
echo "${GREEN}✓ Extracted BPP keys from $bpp_config${NC}"
else
echo "${YELLOW}⚠ BPP config file not found at $bpp_config - BPP modules will be skipped${NC}"
# Don't return error, just skip BPP key extraction
fi
fi
if [ ! -f "$config_file" ]; then
echo "${RED}Error: ONIX config file not found at $config_file${NC}"
return 1
fi
# Validate required modules exist
validate_config_modules "$key_type" "$config_file"
if [ $? -ne 0 ]; then
return 1
fi
# Detect indentation pattern from the file
local steps_indent=$(grep -m1 "steps:" "$config_file" | sed 's/steps:.*//' | wc -c)
steps_indent=$((steps_indent - 1)) # Remove newline
local plugin_indent=$((steps_indent + 2))
local config_indent=$((steps_indent + 4))
# Process the config file with dynamic indentation
awk -v bap_pub="$bap_public_key" -v bap_priv="$bap_private_key" \
-v bpp_pub="$bpp_public_key" -v bpp_priv="$bpp_private_key" \
-v key_type="$key_type" \
-v steps_spaces="$steps_indent" -v plugin_spaces="$plugin_indent" -v config_spaces="$config_indent" '
BEGIN {
module_type = ""
in_keymanager = 0
has_keymanager = 0
# Create indent strings
steps_indent = sprintf("%*s", steps_spaces, "")
plugin_indent = sprintf("%*s", plugin_spaces, "")
config_indent = sprintf("%*s", config_spaces, "")
steps_pattern = "^" steps_indent "steps:"
}
# Track module type and reset keymanager flag
/- name: bapTxn/ {
if ((key_type == "BAP" || key_type == "BOTH") && bap_priv != "") module_type = "bap"
else module_type = ""
has_keymanager = 0; print; next
}
/- name: bppTxn/ {
if ((key_type == "BPP" || key_type == "BOTH") && bpp_priv != "") module_type = "bpp"
else module_type = ""
has_keymanager = 0; print; next
}
/^ - name:/ && !/bapTxn/ && !/bppTxn/ { module_type = ""; has_keymanager = 0; print; next }
# Handle keyManager section
/keyManager:/ {
in_keymanager = 1
has_keymanager = 1
print
next
}
# Force simplekeymanager id
in_keymanager && /id:/ {
print config_indent "id: simplekeymanager"
next
}
# Replace config section entirely
in_keymanager && /config:/ {
print config_indent "config:"
# Skip existing config lines until next plugin or steps
while (getline) {
if (match($0, "^" plugin_indent "[a-zA-Z]") || match($0, steps_pattern)) {
# Add complete config based on module
if (module_type == "bap") {
print config_indent " networkParticipant: bap-network"
print config_indent " keyId: bap-network-key"
print config_indent " signingPrivateKey: \"" bap_priv "\""
print config_indent " signingPublicKey: \"" bap_pub "\""
print config_indent " encrPrivateKey: \"" bap_priv "\""
print config_indent " encrPublicKey: \"" bap_pub "\""
} else if (module_type == "bpp") {
print config_indent " networkParticipant: bpp-network"
print config_indent " keyId: bpp-network-key"
print config_indent " signingPrivateKey: \"" bpp_priv "\""
print config_indent " signingPublicKey: \"" bpp_pub "\""
print config_indent " encrPrivateKey: \"" bpp_priv "\""
print config_indent " encrPublicKey: \"" bpp_pub "\""
}
in_keymanager = 0
print
next
}
}
next
}
# Exit keyManager on unindented line
in_keymanager && match($0, "^" plugin_indent "[a-zA-Z]") && !match($0, "^" config_indent) {
in_keymanager = 0
}
# Add keyManager if missing before steps
module_type && match($0, steps_pattern) && !has_keymanager {
print plugin_indent "keyManager:"
print config_indent "id: simplekeymanager"
print config_indent "config:"
if (module_type == "bap") {
print config_indent " networkParticipant: bap-network"
print config_indent " keyId: bap-network-key"
print config_indent " signingPrivateKey: \"" bap_priv "\""
print config_indent " signingPublicKey: \"" bap_pub "\""
print config_indent " encrPrivateKey: \"" bap_priv "\""
print config_indent " encrPublicKey: \"" bap_pub "\""
} else if (module_type == "bpp") {
print config_indent " networkParticipant: bpp-network"
print config_indent " keyId: bpp-network-key"
print config_indent " signingPrivateKey: \"" bpp_priv "\""
print config_indent " signingPublicKey: \"" bpp_pub "\""
print config_indent " encrPrivateKey: \"" bpp_priv "\""
print config_indent " encrPublicKey: \"" bpp_pub "\""
}
}
# Print all other lines
{ print }
' "$config_file" > "${config_file}.tmp"
if [ $? -eq 0 ] && [ -f "${config_file}.tmp" ]; then
mv "${config_file}.tmp" "$config_file"
echo "${GREEN}✓ ONIX keys configured with existing registry keys${NC}"
else
echo "${RED}Error: AWK script failed to process config file${NC}"
rm -f "${config_file}.tmp"
return 1
fi
[[ "$key_type" == "BAP" || "$key_type" == "BOTH" ]] && echo "${GREEN}✓ BAP modules using BAP keys${NC}"
[[ "$key_type" == "BPP" || "$key_type" == "BOTH" ]] && echo "${GREEN}✓ BPP modules using BPP keys${NC}"
return 0
}
# Function to handle the update/upgrade process
update_network() {
echo -e "\nWhich component would you like to update?\n1. Registry\n2. Gateway\n3. BAP Protocol Server\n4. BPP Protocol Server\n5. All components"
read -p "Enter your choice: " update_choice
validate_input "$update_choice" 5
if [[ $? -ne 0 ]]; then
restart_script
fi
case $update_choice in
1)
update_service "registry" "$registry_docker_compose_file" "fidedocker/registry"
;;
2)
update_service "gateway" "$gateway_docker_compose_file" "fidedocker/gateway"
;;
3)
update_service "bap-client" "$bap_docker_compose_file" "fidedocker/protocol-server"
update_service "bap-network" "$bap_docker_compose_file" "fidedocker/protocol-server"
;;
4)
update_service "bpp-client" "$bpp_docker_compose_file" "fidedocker/protocol-server"
update_service "bpp-network" "$bpp_docker_compose_file" "fidedocker/protocol-server"
;;
5)
update_service "registry" "$registry_docker_compose_file" "fidedocker/registry"
update_service "gateway" "$gateway_docker_compose_file" "fidedocker/gateway"
update_service "bap-client" "$bap_docker_compose_file" "fidedocker/protocol-server"
update_service "bap-network" "$bap_docker_compose_file" "fidedocker/protocol-server"
update_service "bpp-client" "$bpp_docker_compose_file" "fidedocker/protocol-server"
update_service "bpp-network" "$bpp_docker_compose_file" "fidedocker/protocol-server"
;;
*)
echo "Unknown choice"
;;
esac
}
# Function to install ONIX adapter with specified key type
install_adapter() {
local key_type=${1:-"BOTH"}
local config_file=$2
echo "${GREEN}................Building plugins for ONIX Adapter................${NC}"
# Build plugins the same way as setup.sh
cd ..
if [ -f "./install/build-plugins.sh" ]; then
chmod +x ./install/build-plugins.sh
./install/build-plugins.sh
if [ $? -eq 0 ]; then
echo "${GREEN}✓ Plugins built successfully${NC}"
else
echo "${RED}Error: Plugin build failed${NC}"
exit 1
fi
else
echo "${RED}Error: install/build-plugins.sh not found${NC}"
exit 1
fi
cd install
echo "${GREEN}................Setting up keys for ONIX Adapter ($key_type)................${NC}"
configure_onix_registry_keys "$key_type" "$config_file"
if [ $? -ne 0 ]; then
echo "${RED}ONIX Adapter installation failed due to configuration errors${NC}"
exit 1
fi
echo "${GREEN}................Starting Redis and ONIX Adapter................${NC}"
start_support_services
start_container $adapter_docker_compose_file "onix-adapter"
sleep 10
echo "ONIX Adapter installation successful"
}
# Helper function for BAP-only ONIX setup
install_bap_adapter() {
install_adapter "BAP"
}
# Helper function for BPP-only ONIX setup
install_bpp_adapter() {
install_adapter "BPP"
}
# MAIN SCRIPT STARTS HERE
echo "Welcome to Beckn-ONIX!"
if [ -f ./onix_ascii_art.txt ]; then
cat ./onix_ascii_art.txt
else
echo "[Display Beckn-ONIX ASCII Art]"
fi
echo "Checking prerequisites of Beckn-ONIX deployment"
check_docker_permissions
echo "Beckn-ONIX is a platform that helps you quickly launch and configure beckn-enabled networks."
echo -e "\nWhat would you like to do?\n1. Join an existing network\n2. Create new production network\n3. Set up a network on your local machine\n4. Merge multiple networks\n5. Configure Existing Network\n6. Update/Upgrade Application\n(Press Ctrl+C to exit)"
read -p "Enter your choice: " choice
validate_input "$choice" 6
if [[ $? -ne 0 ]]; then
restart_script # Restart the script if input is invalid
fi
if [[ $choice -eq 3 ]]; then
echo "Installing all components on the local machine"
install_package
install_registry
install_gateway
install_bap_protocol_server
install_bpp_protocol_server_with_sandbox
install_adapter "BOTH"
elif [[ $choice -eq 4 ]]; then
echo "Determining the platforms available based on the initial choice"
mergingNetworks
elif [[ $choice -eq 5 ]]; then
echo "${BoldGreen}Currently this feature is not available in this distribution of Beckn ONIX${NC}"
restart_script
elif [[ $choice -eq 6 ]]; then
update_network
else
# Determine the platforms available based on the initial choice
platforms=("Gateway" "BAP" "BPP" "ALL")
[ "$choice" -eq 2 ] && platforms=("Registry" "${platforms[@]}") # Add Registry for new network setups
echo "Great choice! Get ready."
echo -e "\nWhich platform would you like to set up?"
for i in "${!platforms[@]}"; do
echo "$((i + 1)). ${platforms[$i]}"
done
read -p "Enter your choice: " platform_choice
validate_input "$platform_choice" "${#platforms[@]}"
if [[ $? -ne 0 ]]; then
restart_script # Restart the script if input is invalid
fi
selected_platform="${platforms[$((platform_choice - 1))]}"
if [[ -n $selected_platform ]]; then
completeSetup "$selected_platform"
else
restart_script
fi
fi
echo "Process complete. Thank you for using Beckn-ONIX!"