diff --git a/.gitignore b/.gitignore index f6adaa9..3e925e6 100644 --- a/.gitignore +++ b/.gitignore @@ -142,3 +142,10 @@ coverage.html # Generated files .env.vault server + +# Generated files +beckn-adapter +*.log +.env +.env.* +test_request.json diff --git a/docker-compose.yml b/docker-compose.yml index aa96cb2..6b90a2e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -33,6 +33,7 @@ services: redis: image: redis:alpine container_name: redis + platform: linux/amd64 ports: - "6379:6379" networks: @@ -47,6 +48,7 @@ services: vault: image: hashicorp/vault:latest container_name: vault + platform: linux/amd64 cap_add: - IPC_LOCK ports: @@ -71,6 +73,7 @@ services: registry: image: fidedocker/registry:latest container_name: registry + platform: linux/amd64 ports: - "3000:3000" # Main registry port - "3030:3030" # Admin/monitoring port @@ -88,6 +91,7 @@ services: gateway: image: fidedocker/gateway:latest container_name: gateway + platform: linux/amd64 ports: - "4000:4000" # Main gateway port - "4030:4030" # Admin/monitoring port @@ -111,6 +115,7 @@ services: bap-client: image: fidedocker/protocol-server:latest container_name: bap-client + platform: linux/amd64 ports: - "5001:5001" volumes: @@ -132,6 +137,7 @@ services: bap-network: image: fidedocker/protocol-server:latest container_name: bap-network + platform: linux/amd64 ports: - "5002:5002" volumes: @@ -158,6 +164,7 @@ services: bpp-client: image: fidedocker/protocol-server:latest container_name: bpp-client + platform: linux/amd64 ports: - "6001:6001" volumes: @@ -179,6 +186,7 @@ services: bpp-network: image: fidedocker/protocol-server:latest container_name: bpp-network + platform: linux/amd64 ports: - "6002:6002" volumes: diff --git a/go.mod b/go.mod index f7b427b..786d145 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/beckn/beckn-onix -go 1.24 +go 1.24.0 require ( github.com/kr/pretty v0.3.1 // indirect diff --git a/install/.gitignore b/install/.gitignore new file mode 100644 index 0000000..82efd4e --- /dev/null +++ b/install/.gitignore @@ -0,0 +1,16 @@ +docker_data +gateway_data/config/swf.properties +gateway_data/config/networks/onix.json +registry_data/config/swf.properties +.vscode +gateway_data/config/networks/onix.json +gateway_data/database/standalone.mv.db +protocol-server-data/bap-client.yml +protocol-server-data/bap-network.yml +protocol-server-data/bpp-client.yml +protocol-server-data/bpp-network.yml +ENV/.env-generic-client-layer +registry.*db +gateway.*db +gateway_data/config/networks/onix.json + diff --git a/install/ENV/.env-generic-client-layer-sample b/install/ENV/.env-generic-client-layer-sample new file mode 100644 index 0000000..f92d5bd --- /dev/null +++ b/install/ENV/.env-generic-client-layer-sample @@ -0,0 +1,19 @@ +APP_NAME="Generic Client Layer" +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_PORT=3000 +APP_URL=http://localhost + +LOG_CHANNEL=stack +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +PS_BASE_URI=BAP_CLIENT_URL +PS_BAP_ID=BAP_SUBSCRIBER_ID +PS_BAP_URI=BAP_SUBSCRIBER_URL + +PS_CITY_NAME=Bangalore +PS_CITY_CODE=std:080 +PS_COUNTRY_NAME=India +PS_COUNTRY_CODE=IND \ No newline at end of file diff --git a/install/ENV/.env-sandbox b/install/ENV/.env-sandbox new file mode 100644 index 0000000..d71b848 --- /dev/null +++ b/install/ENV/.env-sandbox @@ -0,0 +1,2 @@ +BPPCLIENTURL=http://bpp-client:6001 +BASE_URL=http://sandbox-api:3000 diff --git a/install/ENV/.env-webhook b/install/ENV/.env-webhook new file mode 100644 index 0000000..880b376 --- /dev/null +++ b/install/ENV/.env-webhook @@ -0,0 +1,2 @@ +SANDBOXURL=http://sandbox-api:3000 +BPPCLIENTURL=http://bpp-client:6001 diff --git a/install/add_layer2_conifg_manually.sh b/install/add_layer2_conifg_manually.sh new file mode 100644 index 0000000..06f70d0 --- /dev/null +++ b/install/add_layer2_conifg_manually.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +# Prompt for container name +echo "Please provide the container name for which you want to create the layer2config:" +read CONTAINER_NAME + +# Validate container name is not empty +if [ -z "$CONTAINER_NAME" ]; then + echo "Error: Container name cannot be empty" + exit 1 +fi + +# Prompt for domain name +echo "Please provide the domain name for which you want to create the layer2config:" +read DOMAIN_NAME + +# Validate domain name is not empty +if [ -z "$DOMAIN_NAME" ]; then + echo "Error: Domain name cannot be empty" + exit 1 +fi + +# Replace all occurrences of ':' with '_' in domain name +PROCESSED_DOMAIN=$(echo "$DOMAIN_NAME" | tr ':' '_') + +# Create the final filename +FINAL_FILENAME="${PROCESSED_DOMAIN}_1.1.0.yaml" + +# Execute the docker command +echo "Creating layer2 config file with name: $FINAL_FILENAME" +docker exec -it "$CONTAINER_NAME" cp schemas/core_1.1.0.yaml schemas/"$FINAL_FILENAME" + +# Check if the command was successful +if [ $? -eq 0 ]; then + echo "Successfully created $FINAL_FILENAME in container $CONTAINER_NAME" +else + echo "Failed to create the file. Please check if the container exists and is running." + exit 1 +fi \ No newline at end of file diff --git a/install/beckn-onix.sh b/install/beckn-onix.sh new file mode 100755 index 0000000..4544ded --- /dev/null +++ b/install/beckn-onix.sh @@ -0,0 +1,765 @@ +#!/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 the MongoDB, Redis, and RabbitMQ Services +start_support_services() { + #ignore orphaned containers warning + export COMPOSE_IGNORE_ORPHANS=1 + echo "${GREEN}................Installing MongoDB................${NC}" + docker compose -f docker-compose-app.yml up -d mongo_db + echo "MongoDB installation successful" + + echo "${GREEN}................Installing RabbitMQ................${NC}" + docker compose -f docker-compose-app.yml up -d queue_service + echo "RabbitMQ installation successful" + + 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 +install_bap_protocol_server() { + start_support_services + 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 + sleep 10 + docker volume create bap_client_config_volume + docker volume create bap_network_config_volume + docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bap_client_config_volume:/target busybox cp /source/bap-client.yml /target/default.yml + docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bap_client_config_volume:/target busybox cp /source/bap-client.yaml-sample /target + docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bap_network_config_volume:/target busybox cp /source/bap-network.yml /target/default.yml + docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bap_network_config_volume:/target busybox cp /source/bap-network.yaml-sample /target + docker rmi busybox + + start_container $bap_docker_compose_file "bap-client" + sleep 20 + start_container $bap_docker_compose_file "bap-network" + sleep 10 + + if [[ -z "$layer2_url" ]]; then + 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:${BLUE}https://github.com/beckn/beckn-onix/blob/main/docs/user_guide.md#downloading-layer-2-configuration-for-a-domain.${NC}" + else + echo -e "${GREEN}Installing layer configuration for $(basename "$layer2_url")${NC}" + install_layer2_config bap-client + install_layer2_config bap-network + fi + echo "Protocol server BAP installation successful" + sleep 40 +} + +# Function to install BPP Protocol Server without Sandbox +install_bpp_protocol_server() { + start_support_services + 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 + + sleep 10 + docker volume create bpp_client_config_volume + docker volume create bpp_network_config_volume + docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bpp_client_config_volume:/target busybox cp /source/bpp-client.yml /target/default.yml + docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bpp_client_config_volume:/target busybox cp /source/bpp-client.yaml-sample /target + docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bpp_network_config_volume:/target busybox cp /source/bpp-network.yml /target/default.yml + docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bpp_network_config_volume:/target busybox cp /source/bpp-network.yaml-sample /target + docker rmi busybox + + start_container $bpp_docker_compose_file "bpp-client" + start_container $bpp_docker_compose_file "bpp-network" + sleep 10 + if [[ -z "$layer2_url" ]]; then + echo -e "${BoldGreen}Please download the Layer 2 configuration files by running the download_layer_2_config_bpp.sh script located in the ../layer2 folder." + echo -e "For further information, refer to this URL:${BLUE} https://github.com/beckn/beckn-onix/blob/main/docs/user_guide.md#downloading-layer-2-configuration-for-a-domain.${NC}" + else + echo -e "${BoldGreen}Installing layer configuration for $(basename "$layer2_url")" + install_layer2_config bpp-client + install_layer2_config bpp-network + fi + echo "Protocol server BPP installation successful" +} + +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() { + start_support_services + + docker volume create bpp_client_config_volume + docker volume create bpp_network_config_volume + + 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 + + sleep 10 + docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bpp_client_config_volume:/target busybox cp /source/bpp-client.yml /target/default.yml + docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bpp_client_config_volume:/target busybox cp /source/bpp-client.yaml-sample /target + docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bpp_network_config_volume:/target busybox cp /source/bpp-network.yml /target/default.yml + docker run --rm -v $SCRIPT_DIR/../protocol-server-data:/source -v bpp_network_config_volume:/target busybox cp /source/bpp-network.yaml-sample /target + docker rmi busybox + + start_container $bpp_docker_compose_file "bpp-client" + start_container $bpp_docker_compose_file "bpp-network" + sleep 10 + echo "Protocol server BPP installation successful" +} + +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://" + + 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 + install_package + install_bap_protocol_server $registry_url $bap_subscriber_id $bap_subscriber_key_id $bap_subscriber_url + ;; + "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 + install_package + install_bpp_protocol_server $registry_url $bpp_subscriber_id $bpp_subscriber_key_id $bpp_subscriber_url $webhook_url + ;; + "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 + #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 + ;; + *) + 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 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 +} + +# 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_registry + install_gateway + install_bap_protocol_server + install_bpp_protocol_server_with_sandbox +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!" diff --git a/install/docker-compose-app.yml b/install/docker-compose-app.yml new file mode 100644 index 0000000..f67356f --- /dev/null +++ b/install/docker-compose-app.yml @@ -0,0 +1,61 @@ +services: + mongo_db: + image: mongo:4.4 + platform: linux/amd64 + restart: unless-stopped + container_name: mongoDB + volumes: + - beckn_mongo_db:/data/db + - beckn_mongo_config:/data/configdb + networks: + - beckn_network + ports: + - "27017:27017" + environment: + - MONGO_INITDB_ROOT_USERNAME=beckn + - MONGO_INITDB_ROOT_PASSWORD=beckn123 + - MONGO_INITDB_DATABASE=protocol_server + + redis_db: + image: redis:6.2.5-alpine + platform: linux/amd64 + restart: unless-stopped + container_name: redis + networks: + - beckn_network + ports: + - "6379:6379" + volumes: + - beckn_redis:/data + + queue_service: + image: rabbitmq:3.8-management-alpine + platform: linux/amd64 + restart: unless-stopped + container_name: rabbitmq + networks: + - beckn_network + ports: + - "5672:5672" + - "15672:15672" + volumes: + - beckn_rabbitmq:/var/lib/rabbitmq + environment: + AMQP_URL: "amqp://queue_service?connection_attempts=3&retry_delay=5" + RABBITMQ_DEFAULT_USER: beckn + RABBITMQ_DEFAULT_PASS: beckn123 + +networks: + beckn_network: + name: beckn_network + driver: bridge + +volumes: + beckn_mongo_db: + name: beckn_mongo_db + beckn_mongo_config: + name: beckn_mongo_config + beckn_redis: + name: beckn_redis + beckn_rabbitmq: + name: beckn_rabbitmq diff --git a/install/docker-compose-bap.yml b/install/docker-compose-bap.yml new file mode 100644 index 0000000..d9bb6a8 --- /dev/null +++ b/install/docker-compose-bap.yml @@ -0,0 +1,49 @@ +services: + bap-client: + image: fidedocker/protocol-server + container_name: bap-client + platform: linux/amd64 + networks: + - beckn_network + ports: + - 5001:5001 + restart: unless-stopped + volumes: + - bap_client_config_volume:/usr/src/app/config + - bap_client_schemas_volume:/usr/src/app/schemas + - bap_client_logs_volume:/usr/src/app/logs + + bap-network: + image: fidedocker/protocol-server + container_name: bap-network + platform: linux/amd64 + networks: + - beckn_network + ports: + - 5002:5002 + restart: unless-stopped + volumes: + - bap_network_config_volume:/usr/src/app/config + - bap_network_schemas_volume:/usr/src/app/schemas + - bap_network_logs_volume:/usr/src/app/logs + +networks: + beckn_network: + name: beckn_network + driver: bridge + +volumes: + bap_client_config_volume: + name: bap_client_config_volume + external: true + bap_client_schemas_volume: + name: bap_client_schemas_volume + bap_client_logs_volume: + name: bap_client_logs_volume + bap_network_config_volume: + name: bap_network_config_volume + external: true + bap_network_schemas_volume: + name: bap_network_schemas_volume + bap_network_logs_volume: + name: bap_network_logs_volume diff --git a/install/docker-compose-bpp-with-sandbox.yml b/install/docker-compose-bpp-with-sandbox.yml new file mode 100644 index 0000000..e3f6770 --- /dev/null +++ b/install/docker-compose-bpp-with-sandbox.yml @@ -0,0 +1,62 @@ +services: + bpp-client: + image: fidedocker/protocol-server + container_name: bpp-client + platform: linux/amd64 + networks: + - beckn_network + ports: + - 6001:6001 + restart: unless-stopped + volumes: + - bpp_client_config_volume:/usr/src/app/config + - bpp_client_schemas_volume:/usr/src/app/schemas + - bpp_client_logs_volume:/usr/src/app/logs + + bpp-network: + image: fidedocker/protocol-server + container_name: bpp-network + platform: linux/amd64 + networks: + - beckn_network + ports: + - 6002:6002 + restart: unless-stopped + volumes: + - bpp_network_config_volume:/usr/src/app/config + - bpp_network_schemas_volume:/usr/src/app/schemas + - bpp_network_logs_volume:/usr/src/app/logs + + sandbox-api: + image: fidedocker/sandbox-api + container_name: sandbox-api + platform: linux/amd64 + networks: + - beckn_network + ports: + - 4010:4000 + restart: unless-stopped + environment: + - PORT=4000 + - WEBHOOK_URL=http://host.docker.internal:3001/webhook + +networks: + beckn_network: + name: beckn_network + driver: bridge + +volumes: + bpp_client_config_volume: + name: bpp_client_config_volume + external: true + bpp_client_schemas_volume: + name: bpp_client_schemas_volume + bpp_client_logs_volume: + name: bpp_client_logs_volume + bpp_network_config_volume: + name: bpp_network_config_volume + external: true + bpp_network_schemas_volume: + name: bpp_network_schemas_volume + bpp_network_logs_volume: + name: bpp_network_logs_volume diff --git a/install/docker-compose-bpp.yml b/install/docker-compose-bpp.yml new file mode 100644 index 0000000..5282b8b --- /dev/null +++ b/install/docker-compose-bpp.yml @@ -0,0 +1,49 @@ +services: + bpp-client: + image: fidedocker/protocol-server + container_name: bpp-client + platform: linux/amd64 + networks: + - beckn_network + ports: + - 6001:6001 + restart: unless-stopped + volumes: + - bpp_client_config_volume:/usr/src/app/config + - bpp_client_schemas_volume:/usr/src/app/schemas + - bpp_client_logs_volume:/usr/src/app/logs + + bpp-network: + image: fidedocker/protocol-server + container_name: bpp-network + platform: linux/amd64 + networks: + - beckn_network + ports: + - 6002:6002 + restart: unless-stopped + volumes: + - bpp_network_config_volume:/usr/src/app/config + - bpp_network_schemas_volume:/usr/src/app/schemas + - bpp_network_logs_volume:/usr/src/app/logs + +networks: + beckn_network: + name: beckn_network + driver: bridge + +volumes: + bpp_client_config_volume: + name: bpp_client_config_volume + external: true + bpp_client_schemas_volume: + name: bpp_client_schemas_volume + bpp_client_logs_volume: + name: bpp_client_logs_volume + bpp_network_config_volume: + name: bpp_network_config_volume + external: true + bpp_network_schemas_volume: + name: bpp_network_schemas_volume + bpp_network_logs_volume: + name: bpp_network_logs_volume diff --git a/install/docker-compose-gateway.yml b/install/docker-compose-gateway.yml new file mode 100644 index 0000000..c45ca9a --- /dev/null +++ b/install/docker-compose-gateway.yml @@ -0,0 +1,30 @@ +services: + gateway: + image: fidedocker/gateway + container_name: gateway + platform: linux/amd64 + networks: + - beckn_network + ports: + - 4000:4000 + - 4030:4030 + restart: unless-stopped + volumes: + - gateway_data_volume:/gateway/overrideProperties/config + - gateway_database_volume:/gateway/database + - gateway_logs_volume:/gateway/tmp + +networks: + beckn_network: + name: beckn_network + driver: bridge + +volumes: + gateway_data_volume: + name: gateway_data_volume + external: true + gateway_database_volume: + name: gateway_database_volume + external: true + gateway_logs_volume: + name: gateway_logs_volume diff --git a/install/docker-compose-gcl.yml b/install/docker-compose-gcl.yml new file mode 100644 index 0000000..aa0953c --- /dev/null +++ b/install/docker-compose-gcl.yml @@ -0,0 +1,119 @@ +services: + registry: + image: fidedocker/registry + container_name: registry + platform: linux/amd64 + networks: + - beckn_network + ports: + - 3000:3000 + - 3030:3030 + restart: unless-stopped + volumes: + - registry_data_volume:/registry/overrideProperties/config + - registry_database_volume:/registry/database + + gateway: + image: fidedocker/gateway + container_name: gateway + platform: linux/amd64 + networks: + - beckn_network + ports: + - 4000:4000 + - 4030:4030 + restart: unless-stopped + volumes: + - gateway_data_volume:/gateway/overrideProperties/config + - gateway_database_volume:/gateway/database + + bap-client: + image: fidedocker/protocol-server + container_name: bap-client + platform: linux/amd64 + networks: + - beckn_network + ports: + - 5001:5001 + restart: unless-stopped + volumes: + - ./protocol-server-data/bap-client.yml:/usr/src/app/config/default.yml + + bap-network: + image: fidedocker/protocol-server + container_name: bap-network + platform: linux/amd64 + networks: + - beckn_network + ports: + - 5002:5002 + restart: unless-stopped + volumes: + - ./protocol-server-data/bap-network.yml:/usr/src/app/config/default.yml + + sandbox-api: + image: fidedocker/sandbox-api + container_name: sandbox-api + platform: linux/amd64 + networks: + - beckn_network + ports: + - 4010:4000 + restart: unless-stopped + volumes: + - ./ENV/.env-sandbox:/usr/src/app/.env + + bpp-client: + image: fidedocker/protocol-server + container_name: bpp-client + platform: linux/amd64 + networks: + - beckn_network + ports: + - 6001:6001 + restart: unless-stopped + volumes: + - ./protocol-server-data/bpp-client.yml:/usr/src/app/config/default.yml + + bpp-network: + image: fidedocker/protocol-server + container_name: bpp-network + platform: linux/amd64 + networks: + - beckn_network + ports: + - 6002:6002 + restart: unless-stopped + volumes: + - ./protocol-server-data/bpp-network.yml:/usr/src/app/config/default.yml + + generic-client-layer: + image: fidedocker/generic-client-layer + container_name: generic-client-layer + platform: linux/amd64 + networks: + - beckn_network + ports: + - 3015:3000 + restart: unless-stopped + volumes: + - ./ENV/.env-generic-client-layer:/app/.env + +networks: + beckn_network: + name: beckn_network + driver: bridge + +volumes: + registry_data_volume: + name: registry_data_volume + external: true + registry_database_volume: + name: registry_database_volume + external: true + gateway_data_volume: + name: gateway_data_volume + external: true + gateway_database_volume: + name: gateway_database_volume + external: true diff --git a/install/docker-compose-registry.yml b/install/docker-compose-registry.yml new file mode 100644 index 0000000..f90ce56 --- /dev/null +++ b/install/docker-compose-registry.yml @@ -0,0 +1,30 @@ +services: + registry: + image: fidedocker/registry + container_name: registry + platform: linux/amd64 + networks: + - beckn_network + ports: + - 3000:3000 + - 3030:3030 + restart: unless-stopped + volumes: + - registry_data_volume:/registry/overrideProperties/config + - registry_database_volume:/registry/database + - registry_logs_volume:/registry/tmp + +networks: + beckn_network: + name: beckn_network + driver: bridge + +volumes: + registry_data_volume: + name: registry_data_volume + external: true + registry_database_volume: + name: registry_database_volume + external: true + registry_logs_volume: + name: registry_logs_volume diff --git a/install/docker-compose-v2.yml b/install/docker-compose-v2.yml new file mode 100644 index 0000000..aa0953c --- /dev/null +++ b/install/docker-compose-v2.yml @@ -0,0 +1,119 @@ +services: + registry: + image: fidedocker/registry + container_name: registry + platform: linux/amd64 + networks: + - beckn_network + ports: + - 3000:3000 + - 3030:3030 + restart: unless-stopped + volumes: + - registry_data_volume:/registry/overrideProperties/config + - registry_database_volume:/registry/database + + gateway: + image: fidedocker/gateway + container_name: gateway + platform: linux/amd64 + networks: + - beckn_network + ports: + - 4000:4000 + - 4030:4030 + restart: unless-stopped + volumes: + - gateway_data_volume:/gateway/overrideProperties/config + - gateway_database_volume:/gateway/database + + bap-client: + image: fidedocker/protocol-server + container_name: bap-client + platform: linux/amd64 + networks: + - beckn_network + ports: + - 5001:5001 + restart: unless-stopped + volumes: + - ./protocol-server-data/bap-client.yml:/usr/src/app/config/default.yml + + bap-network: + image: fidedocker/protocol-server + container_name: bap-network + platform: linux/amd64 + networks: + - beckn_network + ports: + - 5002:5002 + restart: unless-stopped + volumes: + - ./protocol-server-data/bap-network.yml:/usr/src/app/config/default.yml + + sandbox-api: + image: fidedocker/sandbox-api + container_name: sandbox-api + platform: linux/amd64 + networks: + - beckn_network + ports: + - 4010:4000 + restart: unless-stopped + volumes: + - ./ENV/.env-sandbox:/usr/src/app/.env + + bpp-client: + image: fidedocker/protocol-server + container_name: bpp-client + platform: linux/amd64 + networks: + - beckn_network + ports: + - 6001:6001 + restart: unless-stopped + volumes: + - ./protocol-server-data/bpp-client.yml:/usr/src/app/config/default.yml + + bpp-network: + image: fidedocker/protocol-server + container_name: bpp-network + platform: linux/amd64 + networks: + - beckn_network + ports: + - 6002:6002 + restart: unless-stopped + volumes: + - ./protocol-server-data/bpp-network.yml:/usr/src/app/config/default.yml + + generic-client-layer: + image: fidedocker/generic-client-layer + container_name: generic-client-layer + platform: linux/amd64 + networks: + - beckn_network + ports: + - 3015:3000 + restart: unless-stopped + volumes: + - ./ENV/.env-generic-client-layer:/app/.env + +networks: + beckn_network: + name: beckn_network + driver: bridge + +volumes: + registry_data_volume: + name: registry_data_volume + external: true + registry_database_volume: + name: registry_database_volume + external: true + gateway_data_volume: + name: gateway_data_volume + external: true + gateway_database_volume: + name: gateway_database_volume + external: true diff --git a/install/docker-compose.yml b/install/docker-compose.yml new file mode 100644 index 0000000..deeec38 --- /dev/null +++ b/install/docker-compose.yml @@ -0,0 +1,103 @@ +services: + registry: + image: fidedocker/registry + container_name: registry + networks: + - beckn_network + ports: + - 3000:3000 + - 3030:3030 + restart: unless-stopped + volumes: + - ./registry_data/config/swf.properties:/registry/overrideProperties/config/swf.properties + - ./registry_data/database:/registry/database + + gateway: + image: fidedocker/gateway + depends_on: + - registry + container_name: gateway + networks: + - beckn_network + ports: + - 4000:4000 + - 4030:4030 + restart: unless-stopped + volumes: + - ./gateway_data/config/swf.properties:/gateway/overrideProperties/config/swf.properties + - ./gateway_data/database:/gateway/database + + bap-client: + image: fidedocker/protocol-server + depends_on: + - registry + - gateway + container_name: bap-client + networks: + - beckn_network + ports: + - 5001:5001 + restart: unless-stopped + volumes: + - ./protocol-server-data/bap-client.yml:/usr/src/app/config/default.yml + + bap-network: + image: fidedocker/protocol-server + depends_on: + - registry + - gateway + container_name: bap-network + networks: + - beckn_network + ports: + - 5002:5002 + restart: unless-stopped + volumes: + - ./protocol-server-data/bap-network.yml:/usr/src/app/config/default.yml + + sandbox-api: + image: fidedocker/sandbox-api + depends_on: + - registry + - gateway + container_name: sandbox-api + networks: + - beckn_network + ports: + - 4010:4000 + restart: unless-stopped + volumes: + - ./ENV/.env-sandbox:/usr/src/app/.env + + bpp-client: + image: fidedocker/protocol-server + depends_on: + - registry + - gateway + container_name: bpp-client + networks: + - beckn_network + ports: + - 6001:6001 + restart: unless-stopped + volumes: + - ./protocol-server-data/bpp-client.yml:/usr/src/app/config/default.yml + + bpp-network: + image: fidedocker/protocol-server + depends_on: + - registry + - gateway + container_name: bpp-network + networks: + - beckn_network + ports: + - 6002:6002 + restart: unless-stopped + volumes: + - ./protocol-server-data/bpp-network.yml:/usr/src/app/config/default.yml + +networks: + beckn_network: + name: beckn_network + driver: bridge diff --git a/install/gateway_data/config/envvars b/install/gateway_data/config/envvars new file mode 100644 index 0000000..b078dd9 --- /dev/null +++ b/install/gateway_data/config/envvars @@ -0,0 +1,2 @@ +export dport=4000 +export wport=4030 diff --git a/install/gateway_data/config/logger.properties b/install/gateway_data/config/logger.properties new file mode 100644 index 0000000..a9711be --- /dev/null +++ b/install/gateway_data/config/logger.properties @@ -0,0 +1,20 @@ +com.venky.core.log.InfoFileHandler.limit=500000 +com.venky.core.log.InfoFileHandler.count=2 +com.venky.core.log.InfoFileHandler.formatter=java.util.logging.SimpleFormatter +com.venky.core.log.InfoFileHandler.pattern=tmp/java_info%u.log +com.venky.core.log.InfoFileHandler.level=ALL + +com.venky.core.log.WarningFileHandler.limit=500000 +com.venky.core.log.WarningFileHandler.count=2 +com.venky.core.log.WarningFileHandler.formatter=java.util.logging.SimpleFormatter +com.venky.core.log.WarningFileHandler.pattern=tmp/java_warn%u.log +com.venky.core.log.WarningFileHandler.level=WARNING + + +handlers=com.venky.core.log.WarningFileHandler com.venky.core.log.InfoFileHandler +logger.useParentHandlers=false + +.level=INFO +com.venky.swf.plugins.background.core.level=FINEST +com.venky.swf.db.Database.level=FINEST +#com.venky.core.log.TimerStatistics.level=FINE diff --git a/install/gateway_data/config/networks/onix.json-sample b/install/gateway_data/config/networks/onix.json-sample new file mode 100644 index 0000000..8990d63 --- /dev/null +++ b/install/gateway_data/config/networks/onix.json-sample @@ -0,0 +1,11 @@ +{ + "core_version" : "1.1.0", + "registry_id": "REGISTRY_ID..LREG", + "search_provider_id" : "GATEWAY_ID", + "self_registration_supported": true, + "subscription_needed_post_registration" : true, + "base_url": "REGISTRY_URL", + "registry_url" : "REGISTRY_URL/subscribers", + "extension_package": "in.succinct.beckn.boc", + "wild_card" : "" +} diff --git a/install/gateway_data/config/swf.properties-sample b/install/gateway_data/config/swf.properties-sample new file mode 100644 index 0000000..64c1c08 --- /dev/null +++ b/install/gateway_data/config/swf.properties-sample @@ -0,0 +1,43 @@ +swf.load.complete.config.tables.if.count.less.than=500 +swf.user.password.encrypted=false +swf.plugins.background.core.workers.numThreads=1 +swf.application.authentication.required=false + +swf.encryption.support=false +swf.key.store.directory=./.keystore +swf.key.store.password=venky12 +swf.key.entry.succinct.password=succinct12 + + +swf.host=GATEWAY_URL +swf.external.port=GATEWAY_PORT +swf.external.scheme=PROTOCOL + +swf.jdbc.driver=org.h2.Driver +swf.jdbc.url=jdbc:h2:./database/standalone;AUTO_SERVER=TRUE; +swf.jdbc.userid=standalone +swf.jdbc.password=standalone +swf.jdbc.validationQuery=values(1) +swf.jdbc.dbschema=PUBLIC +swf.jdbc.dbschema.setonconnection=true +swf.jdbc.set.dbschema.command=set schema public + + +# These keys are needed if you want to in.succinct.beckn.gateway.subscriber_iduse push notifications. +# you can generate this from https://d3v.one/vapid-key-generator/ or similiar sites. +# you also need to specify the public key in src/main/resources/scripts/application.js + +#push.server.private.key=your_private_key +#push.server.public.key=your_public_key + +## Beckn Gateway configurations. + +beckn.auth.enabled=true + +in.succinct.beckn.gateway.subscriber_id=SUBSCRIBER_ID +in.succinct.beckn.gateway.public_key_id=SUBSCRIBER_ID.k1 + + +in.succinct.onet.country.iso.3=IND +in.succinct.onet.country.iso.2=IN +in.succinct.onet.name=onix diff --git a/install/gateway_data/database/.gitignore b/install/gateway_data/database/.gitignore new file mode 100644 index 0000000..38d6f13 --- /dev/null +++ b/install/gateway_data/database/.gitignore @@ -0,0 +1,11 @@ +docker_data +gateway_data/config/swf.properties +registry_data/config/swf.properties +.vscode +protocol-server-data/bap-client.yml +protocol-server-data/bap-network.yml +protocol-server-data/bpp-client.yml +protocol-server-data/bpp-network.yml +ENV/.env-generic-client-layer +registry.lock* +gateway.lock* diff --git a/install/onix_ascii_art.txt b/install/onix_ascii_art.txt new file mode 100644 index 0000000..f8975a8 --- /dev/null +++ b/install/onix_ascii_art.txt @@ -0,0 +1,27 @@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@::;;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:;;;;:;;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;;::;:::;;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;:;;;;:;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@::::@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@..................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@.........,,::,,.........@@@@@........@@.......@@@@@@@........@.........@@@@@........@@@@@@@ +@@@@@@.........,,::;;;;::,.........@@@...................@@@@@........@..........@@@.........@@@@@@@ +@@@@@@.......,::;;;:,::;;;::,......@@@....................@@@@........@@..........@.........@@@@@@@@ +@@@@@@.....,:;;;::,....,::;;;:,....@@@.....................@@@........@@@..................@@@@@@@@@ +@@@@@@.....:;;:,..........,:;;,....@@@.....................@@@........@@@@................@@@@@@@@@@ +@@@@@@.....:;;:............:;;,....@@@........@@@@@........@@@........@@@@@@.............@@@@@@@@@@@ +@@@@@@.....:;;:............:;;,....@@@........@@@@@........@@@........@@@@@@@..........@@@@@@@@@@@@@ +@@@@@@.....:;;:............:;;,....@@@........@@@@@........@@@........@@@@@@............@@@@@@@@@@@@ +@@@@@@.....:;;:............:;;,....@@@........@@@@@........@@@........@@@@@..............@@@@@@@@@@@ +@@@@@@.....,;;;:,,......,::;;;,....@@@........@@@@@........@@@........@@@@................@@@@@@@@@@ +@@@@@@......,::;;;:,,,::;;;::,.....@@@........@@@@@........@@@........@@@..................@@@@@@@@@ +@@@@@@........,,:;;;;;;;::,........@@@........@@@@@........@@@........@@.........@@.........@@@@@@@@ +@@@@@@@@.........,,::::,,.........@@@@........@@@@@........@@@........@.........@@@@.........@@@@@@@ +@@@@@@@@@@@.........,..........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@..............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@...@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + diff --git a/install/protocol-server-data/bap-client.yaml-sample b/install/protocol-server-data/bap-client.yaml-sample new file mode 100644 index 0000000..ad3e1cc --- /dev/null +++ b/install/protocol-server-data/bap-client.yaml-sample @@ -0,0 +1,138 @@ +# Mandatory +server: + port: BAP_CLIENT_PORT + +# Mandatory. +cache: + host: "REDIS_URL" + port: 6379 + ttl: "PT10M" + # Optional. Default is 0. + db: 1 + +# Optional. +responseCache: + mongoURL: "mongodb://MONGO_USERNAME:MONGO_PASSWORD@MONOG_URL/MONGO_DB_NAME?authSource=admin" + ttl: "PT10M" + +# Mandatory. +# Priority order will be +# 1. Synchronous +# 2. webhook +# 3. pubSub +client: + synchronous: + mongoURL: "mongodb://MONGO_USERNAME:MONGO_PASSWORD@MONOG_URL/MONGO_DB_NAME?authSource=admin" + + #webhook: + # url: "https://beckn.free.beeceptor.com/clientURL" + + #messageQueue: + # amqpURL: "amqp://guest:guest@localhost:5672" + # incomingQueue: "protocol-server-incoming" + # outgoingQueue: "protocol-server-outgoing" + +# Mandatory. +app: + # Mandatory. + mode: bap + + # Two types of gateway mode present. + # client and network. + gateway: + mode: client + inboxQueue: "inbox" + outboxQueue: "outbox" + amqpURL: "amqp://RABBITMQ_USERNAME:RABBITMQ_PASSWORD@RABBITMQ_URL:5672" + + # Mandatory. + actions: + requests: + search: + ttl : "PT15S" + init: + ttl : "PT10S" + select: + ttl : "PT10S" + confirm: + ttl : "PT10S" + status: + ttl : "PT10S" + track: + ttl : "PT10S" + cancel: + ttl : "PT10S" + update: + ttl : "PT10S" + rating: + ttl : "PT10S" + support: + ttl : "PT10S" + get_cancellation_reasons: + ttl : "PT10S" + get_rating_categories: + ttl : "PT10S" + cancellation: + ttl : "PT10S" + + responses: + on_search: + ttl: "PT15S" + on_init: + ttl: "PT10S" + on_select: + ttl: "PT10S" + on_confirm: + ttl: "PT10S" + on_status: + ttl: "PT10S" + on_track: + ttl: "PT10S" + on_cancel: + ttl: "PT10S" + on_update: + ttl: "PT10S" + on_rating: + ttl: "PT10S" + on_support: + ttl: "PT10S" + cancellation_reasons: + ttl: "PT10S" + rating_categories: + ttl: "PT10S" + + # Mandatory. + privateKey: "PRIVATE_KEY" + publicKey: "PUBLIC_KEY" + + # Mandatory. + subscriberId: "BAP_SUBSCRIBER_ID" + subscriberUri: "BAP_SUBSCRIBER_URL" + + # Mandatory. + registryUrl: REGISTRY_URL + auth: false + uniqueKey: "BAP_SUBSCRIBER_KEY_ID" + + # Mandatory. + city: "std:080" + country: "IND" + + # Mandatory. + ttl: "PT10M" + + # Mandatory. + httpTimeout: "PT3S" + httpRetryCount: 2 + telemetry: + enabled: false + url: "" + batchSize: 100 + # In minutes + syncInterval: 30 + redis_db: 3 + + useLayer2Config: USE_LAYER_2_CONFIG + mandateLayer2Config: MANDATE_LAYER_2_CONFIG + + diff --git a/install/protocol-server-data/bap-network.yaml-sample b/install/protocol-server-data/bap-network.yaml-sample new file mode 100644 index 0000000..8ed78c1 --- /dev/null +++ b/install/protocol-server-data/bap-network.yaml-sample @@ -0,0 +1,136 @@ +# Mandatory +server: + port: BAP_NETWORK_PORT + +# Mandatory. +cache: + host: "REDIS_URL" + port: 6379 + ttl: "PT10M" + # Optional. Default is 0. + db: 1 + +# Optional. +responseCache: + mongoURL: "mongodb://MONGO_USERNAME:MONGO_PASSWORD@MONOG_URL/MONGO_DB_NAME?authSource=admin" + ttl: "PT10M" + +# Mandatory. +# Priority order will be +# 1. Synchronous +# 2. webhook +# 3. pubSub +client: + synchronous: + mongoURL: "mongodb://MONGO_USERNAME:MONGO_PASSWORD@MONOG_URL/MONGO_DB_NAME?authSource=admin" + + #webhook: + # url: "https://beckn.free.beeceptor.com/clientURL" + + #messageQueue: + # amqpURL: "amqp://guest:guest@localhost:5672" + # incomingQueue: "protocol-server-incoming" + # outgoingQueue: "protocol-server-outgoing" + +# Mandatory. +app: + # Mandatory. + mode: bap + + # Two types of gateway mode present. + # client and network. + gateway: + mode: network + inboxQueue: "inbox" + outboxQueue: "outbox" + amqpURL: "amqp://RABBITMQ_USERNAME:RABBITMQ_PASSWORD@RABBITMQ_URL:5672" + + # Mandatory. + actions: + requests: + search: + ttl : "PT15S" + init: + ttl : "PT10S" + select: + ttl : "PT10S" + confirm: + ttl : "PT10S" + status: + ttl : "PT10S" + track: + ttl : "PT10S" + cancel: + ttl : "PT10S" + update: + ttl : "PT10S" + rating: + ttl : "PT10S" + support: + ttl : "PT10S" + get_cancellation_reasons: + ttl : "PT10S" + get_rating_categories: + ttl : "PT10S" + cancellation: + ttl : "PT10S" + + responses: + on_search: + ttl: "PT15S" + on_init: + ttl: "PT10S" + on_select: + ttl: "PT10S" + on_confirm: + ttl: "PT10S" + on_status: + ttl: "PT10S" + on_track: + ttl: "PT10S" + on_cancel: + ttl: "PT10S" + on_update: + ttl: "PT10S" + on_rating: + ttl: "PT10S" + on_support: + ttl: "PT10S" + cancellation_reasons: + ttl: "PT10S" + rating_categories: + ttl: "PT10S" + + # Mandatory. + privateKey: "PRIVATE_KEY" + publicKey: "PUBLIC_KEY" + + # Mandatory. + subscriberId: "BAP_SUBSCRIBER_ID" + subscriberUri: "BAP_SUBSCRIBER_URL" + + # Mandatory. + registryUrl: REGISTRY_URL + auth: false + uniqueKey: "BAP_SUBSCRIBER_KEY_ID" + + # Mandatory. + city: "std:080" + country: "IND" + + # Mandatory. + ttl: "PT10M" + + # Mandatory. + httpTimeout: "PT3S" + httpRetryCount: 2 + telemetry: + enabled: false + url: "" + batchSize: 100 + # In minutes + syncInterval: 30 + redis_db: 3 + + useLayer2Config: USE_LAYER_2_CONFIG + mandateLayer2Config: MANDATE_LAYER_2_CONFIG \ No newline at end of file diff --git a/install/protocol-server-data/bpp-client.yaml-sample b/install/protocol-server-data/bpp-client.yaml-sample new file mode 100644 index 0000000..b9890f3 --- /dev/null +++ b/install/protocol-server-data/bpp-client.yaml-sample @@ -0,0 +1,134 @@ +# Mandatory +server: + port: BPP_CLIENT_PORT + +# Mandatory. +cache: + host: "REDIS_URL" + port: 6379 + ttl: "PT10M" + # Optional. Default is 0. + db: 0 + +# Optional. +responseCache: + mongoURL: "mongodb://MONGO_USERNAME:MONGO_PASSWORD@MONOG_URL/MONGO_DB_NAME?authSource=admin" + ttl: "PT10M" + +# Mandatory. +# Priority order will be +# 1. Synchronous +# 2. webhook +# 3. pubSub +client: +# synchronous: +# mongoURL: "mongodb://tvast:password@mongoDB:27017/ps?authSource=admin" + + webhook: + url: "WEBHOOK_URL" + + #messageQueue: + # amqpURL: "amqp://guest:guest@localhost:5672" + # incomingQueue: "protocol-server-incoming" + # outgoingQueue: "protocol-server-outgoing" + +# Mandatory. +app: + # Mandatory. + mode: bpp + + # Two types of gateway mode present. + # client and network. + gateway: + mode: client + inboxQueue: "inbox-bpp" + outboxQueue: "outbox-bpp" + amqpURL: "amqp://RABBITMQ_USERNAME:RABBITMQ_PASSWORD@RABBITMQ_URL:5672" + + # Mandatory. + actions: + requests: + search: + ttl : "PT15S" + init: + ttl : "PT10S" + select: + ttl : "PT10S" + confirm: + ttl : "PT10S" + status: + ttl : "PT10S" + track: + ttl : "PT10S" + cancel: + ttl : "PT10S" + update: + ttl : "PT10S" + rating: + ttl : "PT10S" + support: + ttl : "PT10S" + get_cancellation_reasons: + ttl: "PT10S" + get_rating_categories: + ttl: "PT10S" + + responses: + on_search: + ttl: "PT15S" + on_init: + ttl: "PT10S" + on_select: + ttl: "PT10S" + on_confirm: + ttl: "PT10S" + on_status: + ttl: "PT10S" + on_track: + ttl: "PT10S" + on_cancel: + ttl: "PT10S" + on_update: + ttl: "PT10S" + on_rating: + ttl: "PT10S" + on_support: + ttl: "PT10S" + cancellation_reasons: + ttl: "PT10S" + rating_categories: + ttl: "PT10S" + + # Mandatory. + privateKey: "PRIVATE_KEY" + publicKey: "PUBLIC_KEY" + + # Mandatory. + subscriberId: "BPP_SUBSCRIBER_ID" + subscriberUri: "BPP_SUBSCRIBER_URL" + + # Mandatory. + registryUrl: REGISTRY_URL + auth: false + uniqueKey: "BPP_SUBSCRIBER_KEY_ID" + + # Mandatory. + city: "std:080" + country: "IND" + + # Mandatory. + ttl: "PT10M" + + # Mandatory. + httpTimeout: "PT3S" + httpRetryCount: 2 + telemetry: + enabled: false + url: "" + batchSize: 100 + # In minutes + syncInterval: 30 + redis_db: 3 + + useLayer2Config: USE_LAYER_2_CONFIG + mandateLayer2Config: MANDATE_LAYER_2_CONFIG \ No newline at end of file diff --git a/install/protocol-server-data/bpp-network.yaml-sample b/install/protocol-server-data/bpp-network.yaml-sample new file mode 100644 index 0000000..70b2579 --- /dev/null +++ b/install/protocol-server-data/bpp-network.yaml-sample @@ -0,0 +1,134 @@ +# Mandatory +server: + port: BPP_NETWORK_PORT + +# Mandatory. +cache: + host: "REDIS_URL" + port: 6379 + ttl: "PT10M" + # Optional. Default is 0. + db: 0 + +# Optional. +responseCache: + mongoURL: "mongodb://MONGO_USERNAME:MONGO_PASSWORD@MONOG_URL/MONGO_DB_NAME?authSource=admin" + ttl: "PT10M" + +# Mandatory. +# Priority order will be +# 1. Synchronous +# 2. webhook +# 3. pubSub +client: +# synchronous: +# mongoURL: "mongodb://tvast:password@mongoDB:27017/ps?authSource=admin" + + webhook: + url: "WEBHOOK_URL" + + #messageQueue: + # amqpURL: "amqp://guest:guest@localhost:5672" + # incomingQueue: "protocol-server-incoming" + # outgoingQueue: "protocol-server-outgoing" + +# Mandatory. +app: + # Mandatory. + mode: bpp + + # Two types of gateway mode present. + # client and network. + gateway: + mode: network + inboxQueue: "inbox-bpp" + outboxQueue: "outbox-bpp" + amqpURL: "amqp://RABBITMQ_USERNAME:RABBITMQ_PASSWORD@RABBITMQ_URL:5672" + + # Mandatory. + actions: + requests: + search: + ttl : "PT15S" + init: + ttl : "PT10S" + select: + ttl : "PT10S" + confirm: + ttl : "PT10S" + status: + ttl : "PT10S" + track: + ttl : "PT10S" + cancel: + ttl : "PT10S" + update: + ttl : "PT10S" + rating: + ttl : "PT10S" + support: + ttl : "PT10S" + get_cancellation_reasons: + ttl: "PT10S" + get_rating_categories: + ttl: "PT10S" + + responses: + on_search: + ttl: "PT15S" + on_init: + ttl: "PT10S" + on_select: + ttl: "PT10S" + on_confirm: + ttl: "PT10S" + on_status: + ttl: "PT10S" + on_track: + ttl: "PT10S" + on_cancel: + ttl: "PT10S" + on_update: + ttl: "PT10S" + on_rating: + ttl: "PT10S" + on_support: + ttl: "PT10S" + cancellation_reasons: + ttl: "PT10S" + rating_categories: + ttl: "PT10S" + + # Mandatory. + privateKey: "PRIVATE_KEY" + publicKey: "PUBLIC_KEY" + + # Mandatory. + subscriberId: "BPP_SUBSCRIBER_ID" + subscriberUri: "BPP_SUBSCRIBER_URL" + + # Mandatory. + registryUrl: REGISTRY_URL + auth: false + uniqueKey: "BPP_SUBSCRIBER_KEY_ID" + + # Mandatory. + city: "std:080" + country: "IND" + + # Mandatory. + ttl: "PT10M" + + # Mandatory. + httpTimeout: "PT3S" + httpRetryCount: 2 + telemetry: + enabled: false + url: "" + batchSize: 100 + # In minutes + syncInterval: 30 + redis_db: 3 + + useLayer2Config: USE_LAYER_2_CONFIG + mandateLayer2Config: MANDATE_LAYER_2_CONFIG \ No newline at end of file diff --git a/install/registry_data/config/envvars b/install/registry_data/config/envvars new file mode 100644 index 0000000..0965d04 --- /dev/null +++ b/install/registry_data/config/envvars @@ -0,0 +1,2 @@ +export dport=3000 +export wport=3030 diff --git a/install/registry_data/config/logger.properties b/install/registry_data/config/logger.properties new file mode 100644 index 0000000..a9711be --- /dev/null +++ b/install/registry_data/config/logger.properties @@ -0,0 +1,20 @@ +com.venky.core.log.InfoFileHandler.limit=500000 +com.venky.core.log.InfoFileHandler.count=2 +com.venky.core.log.InfoFileHandler.formatter=java.util.logging.SimpleFormatter +com.venky.core.log.InfoFileHandler.pattern=tmp/java_info%u.log +com.venky.core.log.InfoFileHandler.level=ALL + +com.venky.core.log.WarningFileHandler.limit=500000 +com.venky.core.log.WarningFileHandler.count=2 +com.venky.core.log.WarningFileHandler.formatter=java.util.logging.SimpleFormatter +com.venky.core.log.WarningFileHandler.pattern=tmp/java_warn%u.log +com.venky.core.log.WarningFileHandler.level=WARNING + + +handlers=com.venky.core.log.WarningFileHandler com.venky.core.log.InfoFileHandler +logger.useParentHandlers=false + +.level=INFO +com.venky.swf.plugins.background.core.level=FINEST +com.venky.swf.db.Database.level=FINEST +#com.venky.core.log.TimerStatistics.level=FINE diff --git a/install/registry_data/config/swf.properties-sample b/install/registry_data/config/swf.properties-sample new file mode 100644 index 0000000..1506f09 --- /dev/null +++ b/install/registry_data/config/swf.properties-sample @@ -0,0 +1,43 @@ +swf.load.complete.config.tables.if.count.less.than=500 +swf.user.password.encrypted=false +swf.plugins.background.core.workers.numThreads=3 +swf.application.authentication.required=false +swf.application.requires.registration=true + +#swf.host=localhost +swf.host=REGISTRY_URL +swf.external.port=REGISTRY_PORT +swf.external.scheme=PROTOCOL + + +swf.jdbc.driver=org.h2.Driver +swf.jdbc.url=jdbc:h2:./database/registry;AUTO_SERVER=TRUE; +swf.jdbc.userid=registry +swf.jdbc.password=registry +swf.jdbc.validationQuery=values(1) +swf.jdbc.dbschema=PUBLIC +swf.jdbc.dbschema.setonconnection=true +swf.jdbc.set.dbschema.command=set schema public + + +# These keys are needed if you want to use push notifications. +# you can generate this from https://d3v.one/vapid-key-generator/ or similiar sites. +# you also need to specify the public key in src/main/resources/scripts/application.js + +#push.server.private.key=your_private_key +#push.server.public.key=your_public_key + +swf.api.keys.case=SNAKE +swf.api.root.required=false + +# Needed for Google Login +#swf.GOOGLE.client.id= +#swf.GOOGLE.client.secret= + +swf.encryption.support=false +## Uncomment below if encryption is needed and set appropriate passwords +#swf.key.store.directory=./.keystore +#swf.key.store.password=venky12 +#swf.key.entry.succinct.password=succinct12 + +swf.ftl.dir=src/main/resources/templates \ No newline at end of file diff --git a/install/registry_data/database/.gitignore b/install/registry_data/database/.gitignore new file mode 100644 index 0000000..38d6f13 --- /dev/null +++ b/install/registry_data/database/.gitignore @@ -0,0 +1,11 @@ +docker_data +gateway_data/config/swf.properties +registry_data/config/swf.properties +.vscode +protocol-server-data/bap-client.yml +protocol-server-data/bap-network.yml +protocol-server-data/bpp-client.yml +protocol-server-data/bpp-network.yml +ENV/.env-generic-client-layer +registry.lock* +gateway.lock* diff --git a/install/scripts/RolePermission.xlsx b/install/scripts/RolePermission.xlsx new file mode 100755 index 0000000..20f360a Binary files /dev/null and b/install/scripts/RolePermission.xlsx differ diff --git a/install/scripts/banner.sh b/install/scripts/banner.sh new file mode 100755 index 0000000..1043418 --- /dev/null +++ b/install/scripts/banner.sh @@ -0,0 +1,27 @@ +#!/bin/bash +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +source $SCRIPT_DIR/variables.sh + +# Define the text to print in the banner +text=" + ###### ####### ##### # # # # + # # # # # # # ## # + # # # # # # # # # + ###### ##### # ### # # # + # # # # # # # # # + # # # # # # # # ## + ###### ####### ##### # # # # +" + +text2=" + ######## ######## ###### ## ## ## ## + ## ## ## ## ## ## ## ### ## + ## ## ## ## ## ## #### ## + ######## ###### ## ##### ## ## ## + ## ## ## ## ## ## ## #### + ## ## ## ## ## ## ## ## ### + ######## ######## ###### ## ## ## ## +" +# Clear the terminal screen +clear +echo "${GREEN}$text2${NC}" diff --git a/install/scripts/generate_keys.sh b/install/scripts/generate_keys.sh new file mode 100755 index 0000000..4f00306 --- /dev/null +++ b/install/scripts/generate_keys.sh @@ -0,0 +1,27 @@ +#!/bin/bash +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +source $SCRIPT_DIR/variables.sh + +# Run the script that generates keys and capture the output +get_keys() { + docker pull fidedocker/protocol-server > /dev/null 2>&1 + docker run --name temp -itd fidedocker/protocol-server > /dev/null 2>&1 + output=$(docker exec -i temp node /usr/src/app/scripts/generate-keys 2>&1) + docker stop temp > /dev/null 2>&1 + docker rm temp > /dev/null 2>&1 +# Check if the script executed successfully +if [ $? -eq 0 ]; then + # Extract Public Key and Private Key using grep and awk + public_key=$(echo "$output" | awk '/Your Public Key/ {getline; print $0}') + private_key=$(echo "$output" | awk '/Your Private Key/ {getline; print $0}') + # Remove leading and trailing whitespaces + public_key=$(echo "$public_key" | tr -d '[:space:]') + private_key=$(echo "$private_key" | tr -d '[:space:]') + +else + # Print an error message if the script failed + echo "${RED}Error: Key generation script failed. Please check the script output.${NC}" +fi +} + +#get_keys diff --git a/install/scripts/generic-client-layer.sh b/install/scripts/generic-client-layer.sh new file mode 100755 index 0000000..f8dc7f4 --- /dev/null +++ b/install/scripts/generic-client-layer.sh @@ -0,0 +1,21 @@ +#!/bin/bash +update_env_file(){ + cp ../ENV/.env-generic-client-layer-sample ../ENV/.env-generic-client-layer + envFile=../ENV/.env-generic-client-layer + bap_subscriber_id=$1 + bap_subscriber_url=$2 + bap_client_url=$3 + + if [[ $(uname) == "Darwin" ]]; then + sed -i '' "s|BAP_SUBSCRIBER_ID|$bap_subscriber_id|" $envFile + sed -i '' "s|BAP_SUBSCRIBER_URL|$bap_subscriber_url|" $envFile + sed -i '' "s|BAP_CLIENT_URL|$bap_client_url|" $envFile + else + sed -i "s|BAP_SUBSCRIBER_ID|$bap_subscriber_id|" $envFile + sed -i "s|BAP_SUBSCRIBER_URL|$bap_subscriber_url|" $envFile + sed -i "s|BAP_CLIENT_URL|$bap_client_url|" $envFile + fi + +} + +update_env_file $1 $2 $3 \ No newline at end of file diff --git a/install/scripts/get_container_details.sh b/install/scripts/get_container_details.sh new file mode 100755 index 0000000..4b093e6 --- /dev/null +++ b/install/scripts/get_container_details.sh @@ -0,0 +1,8 @@ +#!/bin/bash +get_container_ip() { + container_name=$1 + container_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $container_name) + echo $container_ip +} + +#get_container_ip $1 \ No newline at end of file diff --git a/install/scripts/k8s/ConfigMap.yaml b/install/scripts/k8s/ConfigMap.yaml new file mode 100644 index 0000000..04ef557 --- /dev/null +++ b/install/scripts/k8s/ConfigMap.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: swf-config +data: + swf.properties: | + # Content of swf.properties file for registry diff --git a/install/scripts/k8s/deployment.yaml b/install/scripts/k8s/deployment.yaml new file mode 100644 index 0000000..012efed --- /dev/null +++ b/install/scripts/k8s/deployment.yaml @@ -0,0 +1,59 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: registry-deployment +spec: + replicas: 1 + selector: + matchLabels: + app: registry + template: + metadata: + labels: + app: registry + spec: + containers: + - name: registry + image: fidedocker/registry + ports: + - containerPort: 3000 + - containerPort: 3030 + volumeMounts: + - name: registry-data + mountPath: /registry + volumes: + - name: registry-data + hostPath: + path: /absolute/path/to/registry_data/ + +--- + +apiVersion: apps/v1 +kind: Deployment +metadata: + name: gateway-deployment +spec: + replicas: 1 + selector: + matchLabels: + app: gateway + template: + metadata: + labels: + app: gateway + spec: + containers: + - name: gateway + image: fidedocker/gateway + ports: + - containerPort: 4000 + - containerPort: 4030 + volumeMounts: + - name: gateway-data + mountPath: /gateway + volumes: + - name: gateway-data + hostPath: + path: /path/to/gateway_data + +# Repeat the above structure for other services diff --git a/install/scripts/k8s/ingress.yaml b/install/scripts/k8s/ingress.yaml new file mode 100644 index 0000000..67888e5 --- /dev/null +++ b/install/scripts/k8s/ingress.yaml @@ -0,0 +1,24 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: beckn-ingress +spec: + rules: + - host: localhost + http: + paths: + - path: /registry + pathType: Prefix + backend: + service: + name: registry-service + port: + number: 3000 + - path: /gateway + pathType: Prefix + backend: + service: + name: gateway-service + port: + number: 4000 + # Repeat the above structure for other services diff --git a/install/scripts/k8s/service.yaml b/install/scripts/k8s/service.yaml new file mode 100644 index 0000000..bdd818c --- /dev/null +++ b/install/scripts/k8s/service.yaml @@ -0,0 +1,33 @@ +apiVersion: v1 +kind: Service +metadata: + name: registry-service +spec: + selector: + app: registry + ports: + - protocol: TCP + port: 3000 + targetPort: 3000 + - protocol: TCP + port: 3030 + targetPort: 3030 + +--- + +apiVersion: v1 +kind: Service +metadata: + name: gateway-service +spec: + selector: + app: gateway + ports: + - protocol: TCP + port: 4000 + targetPort: 4000 + - protocol: TCP + port: 4030 + targetPort: 4030 + +# Repeat the above structure for other services diff --git a/install/scripts/package_manager.sh b/install/scripts/package_manager.sh new file mode 100755 index 0000000..0e58309 --- /dev/null +++ b/install/scripts/package_manager.sh @@ -0,0 +1,172 @@ +#!/bin/bash +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +source $SCRIPT_DIR/variables.sh + +#Required packages list as below. +package_list=("docker" "docker-compose" "jq") + +command_exists() { + command -v "$1" &>/dev/null +} + +# Redirect input from /dev/null to silence prompts +export DEBIAN_FRONTEND=noninteractive +export APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=1 + + +#Install Package +install_package() { + if [ -x "$(command -v apt-get)" ]; then + # APT (Debian/Ubuntu) + if [ "$1" == "docker" ]; then + if ! docker --version > /dev/null 2>&1; then + if [ "$(lsb_release -is | tr -d '[:space:]' | tr '[:upper:]' '[:lower:]')" = "ubuntu" ]; then + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg + echo "deb [signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + else + curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg + echo "deb [signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + fi + sudo apt update >/dev/null 2>&1 + sudo apt install -y docker-ce docker-ce-cli containerd.io >/dev/null 2>&1 + sudo usermod -aG docker $USER + source ~/.bashrc + sudo systemctl enable docker.service + sudo systemctl restart docker.service + else + echo "Docker is already installed." + fi + else + if ! dpkg -l | grep -q "^ii $1 "; then + sudo apt-get update >/dev/null 2>&1 + sudo apt-get install -y $1 >/dev/null 2>&1 + else + echo "$1 is already installed." + fi + fi + elif [ -x "$(command -v yum)" ]; then + # YUM (Red Hat/CentOS/Amazon Linux) + if [ "$1" == "docker" ]; then + if ! docker --version > /dev/null 2>&1; then + if [ -f /etc/centos-release ]; then + sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo + elif [ -f /etc/redhat-release ]; then + sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo + elif grep -q "Amazon Linux release 2" /etc/system-release; then + sudo amazon-linux-extras install docker -y + elif grep -q "Amazon Linux release" /etc/system-release; then + sudo yum install -y docker + fi + sudo yum install -y docker-ce docker-ce-cli containerd.io >/dev/null 2>&1 + sudo usermod -aG docker $USER + source ~/.bashrc + sudo systemctl enable docker.service + sudo systemctl restart docker.service + else + echo "Docker is already installed." + fi + else + if ! rpm -qa | grep -q "^$1-"; then + sudo yum install -y $1 >/dev/null 2>&1 + else + echo "$1 is already installed." + fi + fi + elif [ -x "$(command -v amazon-linux-extras)" ]; then + # Amazon Linux 2 specific + if [ "$1" == "docker" ]; then + if ! docker --version > /dev/null 2>&1; then + sudo amazon-linux-extras install docker -y >/dev/null 2>&1 + sudo systemctl enable docker.service + sudo systemctl start docker.service + sudo usermod -aG docker $USER + source ~/.bashrc + else + echo "Docker is already installed." + fi + else + if ! amazon-linux-extras list | grep -q "$1"; then + sudo amazon-linux-extras install $1 -y >/dev/null 2>&1 + else + echo "$1 is already installed." + fi + fi + else + echo "Unsupported package manager. Please install $1 manually." + exit 1 + fi +} + + + +remove_package(){ + if [ -x "$(command -v apt-get)" ]; then + # APT (Debian/Ubuntu) + sudo apt-get purge -y $1 >/dev/null 2>&1 + sudo apt autoremove -y >/dev/null 2>&1 + elif [ -x "$(command -v yum)" ]; then + # YUM (Red Hat/CentOS) + sudo yum remove -y $1 >/dev/null 2>&1 + sudo yum autoremove -y >/dev/null 2>&1 + fi +} + +# Function to install Docker +install_docker_bash() { + # Install Docker Bash completion + echo "Installing Docker Bash completion..." + sudo curl -L https://raw.githubusercontent.com/docker/cli/master/contrib/completion/bash/docker -o /etc/bash_completion.d/docker +} + +# Function to install Docker Compose +install_docker_compose() { + command_exists docker-compose + if [ $? -eq 0 ]; then + echo "docker-compose is already installed." + return + else + echo "Installing Docker Compose..." + sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + sudo chmod +x /usr/local/bin/docker-compose + fi + + # Check if Docker Compose installation was successful + if [ $? -eq 0 ]; then + echo "Docker Compose installed successfully." + else + echo "${RED}Failed to install Docker Compose. Exiting.${NC}" + exit 1 + fi + + if [ -f /etc/bash_completion.d/docker-compose ]; then + echo "Docker Compose Bash completion is already installed." + else + # Install Docker Compose Bash completion + echo "Installing Docker Compose Bash completion..." + sudo curl -L https://raw.githubusercontent.com/docker/compose/master/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose + fi +} + + +# Check if package is already installed + +for package in "${package_list[@]}"; do + if ! command_exists $package; then + install_package "$package" + fi + if [ "$package" == "docker" ]; then + if [[ $(uname -s ) == 'Linux' ]];then + if [ -f /etc/bash_completion.d/docker ]; then + echo "Docker Bash completion is already installed." + else + install_docker_bash + fi + fi + fi + if [ "$package" == "docker-compose" ]; then + if [[ $(uname -s ) == 'Linux' ]];then + install_docker_compose + fi + fi +done + diff --git a/install/scripts/register_gateway.sh b/install/scripts/register_gateway.sh new file mode 100755 index 0000000..3d19407 --- /dev/null +++ b/install/scripts/register_gateway.sh @@ -0,0 +1,32 @@ +#!/bin/bash +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +source $SCRIPT_DIR/get_container_details.sh + +register_gw() { +cookie_file="cookies.txt" +# Step 1: Perform login and save the session cookies to a file +curl --cookie-jar $cookie_file --request POST $login_url + +curl --request GET --cookie $cookie_file $subscribe_url +rm -rf $cookie_file +} + +if [[ $(uname -s) == 'Darwin' ]]; then + ip=localhost +elif [[ $(systemd-detect-virt) == 'wsl' ]]; then + ip=$(hostname -I | awk '{print $1}') +else + ip=$(get_container_ip gateway) +fi + +if [[ $1 ]]; then + if [[ $1 == https://* ]]; then + login_url="$1/login?name=root&password=root&_LOGIN=Login" + subscribe_url="$1/bg/subscribe" + register_gw + fi +else + login_url="http://$ip:4030/login?name=root&password=root&_LOGIN=Login" + subscribe_url="http://$ip:4030/bg/subscribe" + register_gw +fi diff --git a/install/scripts/registry_entry.sh b/install/scripts/registry_entry.sh new file mode 100755 index 0000000..44e85ea --- /dev/null +++ b/install/scripts/registry_entry.sh @@ -0,0 +1,55 @@ +#!/bin/bash +source $SCRIPT_DIR/variables.sh + +create_network_participant() { + # Set your variables + registry_url="$1" + content_type="$2" + subscriber_id="$3" + pub_key_id="$4" + subscriber_url="$5" + encr_public_key="$6" + signing_public_key="$7" + valid_from="$8" + valid_until="$9" + type="${10}" + api_key="${11}" + np_domain="${12}" + + json_data=$(cat <&1) + if [ $? -eq 0 ]; then + + echo "${GREEN}Network Participant Entry is created. Please login to registry $registry_url and subscribe you Network Participant.${NC}" + else + response=$(curl --location --request POST "$registry_url/register" \ + --header "ApiKey:$api_key" --header "Content-Type: $content_type" \ + --data-raw "$json_data" 2>&1) + if [ $? -eq 0 ]; then + echo "${GREEN}Network Participant Entry is created. Please login to registry $registry_url and subscribe you Network Participant.${NC}" + else + echo "${RED}Error: $response${NC}" + fi + echo "${RED}Error: $response${NC}" + fi +} diff --git a/install/scripts/registry_role_permissions.sh b/install/scripts/registry_role_permissions.sh new file mode 100755 index 0000000..620f66c --- /dev/null +++ b/install/scripts/registry_role_permissions.sh @@ -0,0 +1,101 @@ +#!/bin/bash + +# Set script directory and source variables +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +source "$SCRIPT_DIR/variables.sh" + +API_KEY="" + +# Function to log in and retrieve the API key +get_api_key() { + local login_url="${registry_url%/subscribers}/login" + local username="$1" + local password="$2" + local max_retries=20 + local retry_count=0 + local success=false + + while [ $retry_count -lt $max_retries ] && [ "$success" = false ]; do + # Call the login API + local response + response=$(curl -s -H "Accept: application/json" \ + -H "Content-Type: application/json" \ + -d "{ \"Name\": \"${username}\", \"Password\": \"${password}\" }" \ + "$login_url") + + # Check if curl failed + if [ $? -ne 0 ]; then + echo -e "${BoldRed}Error: Failed to connect to $login_url. Retrying in 5 seconds... (Attempt $((retry_count + 1)) of $max_retries)${NC}" + retry_count=$((retry_count + 1)) + sleep 5 + continue + fi + + # Extract API key using jq + API_KEY=$(echo "$response" | jq -r '.api_key') + + # Validate API key + if [[ -z "$API_KEY" || "$API_KEY" == "null" ]]; then + echo -e "${BoldRed}Error: Failed to retrieve API key. Retrying in 5 seconds... (Attempt $((retry_count + 1)) of $max_retries)${NC}" + retry_count=$((retry_count + 1)) + sleep 5 + continue + fi + + success=true + echo -e "${BoldGreen}API Key retrieved successfully${NC}" + return 0 + done + + if [ "$success" = false ]; then + echo -e "${BoldRed}Error: Failed to retrieve API key after $max_retries attempts${NC}" + return 1 + fi +} + +# Function to upload the RolePermission.xlsx file +upload_role_permission() { + local api_key="$1" + local login_url="${registry_url%/subscribers}/role_permissions/importxls" + # Validate if file exists + if [[ ! -f "$REGISTRY_FILE_PATH" ]]; then + echo -e "${BoldRed}Error: File $REGISTRY_FILE_PATH not found${NC}" + return 1 + fi + # Upload the file + local response + response=$(curl -s -w "%{http_code}" -o /dev/null -H "ApiKey:$api_key" \ + -F "datafile=@${REGISTRY_FILE_PATH}" \ + "$login_url") + + # # Check if curl failed + if [ "$response" -ne 302 ]; then + echo -e "${BoldRed}Error: Failed to upload RolePermission.xlsx. HTTP Status: $response${NC}" + return 1 + fi + echo -e "${BoldGreen}RolePermission.xlsx uploaded successfully${NC}" + return 0 +} + +# Main Execution +REGISTRY_FILE_PATH=$SCRIPT_DIR/RolePermission.xlsx + +if [[ $1 ]]; then + registry_url=$1 +else + registry_url="http://localhost:3030" +fi + +# Step 1: Get the API key +if ! get_api_key "$USERNAME" "$PASSWORD"; then + echo -e "${BoldRed}Error: Role permission update failed. Please upload manually.${NC}" + exit 1 +fi + +# Step 2: Upload the file +if upload_role_permission "$API_KEY"; then + echo -e "${BoldGreen}Role permission updated in registry successfully.${NC}" +else + echo -e "${BoldRed}Error: Role permission update failed.${NC}" + exit 1 +fi \ No newline at end of file diff --git a/install/scripts/update_bap_config.sh b/install/scripts/update_bap_config.sh new file mode 100755 index 0000000..8af027d --- /dev/null +++ b/install/scripts/update_bap_config.sh @@ -0,0 +1,127 @@ +#!/bin/bash +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +source $SCRIPT_DIR/registry_entry.sh +source $SCRIPT_DIR/generate_keys.sh +source $SCRIPT_DIR/variables.sh +source $SCRIPT_DIR/get_container_details.sh + +newClientFile=$(echo "$bapClientFile" | sed 's/yaml-sample/yml/') +newNetworkFile=$(echo "$bapNetworkFile" | sed 's/yaml-sample/yml/') + +cp $bapClientFile $newClientFile +cp $bapNetworkFile $newNetworkFile + +clientFile=$newClientFile +networkFile=$newNetworkFile + +client_port=$bap_client_port +network_port=$bap_network_port + +if [[ $(uname) == "Darwin" ]]; then + sed -i '' "s|BAP_NETWORK_PORT|$network_port|" $networkFile + sed -i '' "s|BAP_CLIENT_PORT|$client_port|" $clientFile +else + sed -i "s|BAP_NETWORK_PORT|$network_port|" $networkFile + sed -i "s|BAP_CLIENT_PORT|$client_port|" $clientFile +fi + +if [[ $1 ]]; then + registry_url=$1 + bap_subscriber_id=$2 + bap_subscriber_key_id=$3 + bap_subscriber_url=$4 + api_key=$5 + np_domain=$6 +else + if [[ $(uname -s) == 'Darwin' ]]; then + ip=localhost + registry_url="http://$ip:3030/subscribers" + elif [[ $(systemd-detect-virt) == 'wsl' ]]; then + ip=$(hostname -I | awk '{print $1}') + registry_url="http://$ip:3030/subscribers" + else + registry_url="http://$(get_container_ip registry):3030/subscribers" + fi +fi + +echo "Generating public/private key pair" +get_keys + +if [[ $(uname -s ) == 'Darwin' ]];then + valid_from=$(date -u -v-1d +"%Y-%m-%dT%H:%M:%S.%000Z") + valid_until=$(date -u -v+3y +"%Y-%m-%dT%H:%M:%S.%000Z") +else + valid_from=$(date -u -d "-1 day" +"%Y-%m-%dT%H:%M:%S.%3NZ") + valid_until=$(date -u -d "+3 year" +"%Y-%m-%dT%H:%M:%S.%3NZ") +fi + +type=BAP + + +# Define an associative array for replacements +if [[ $(uname -s ) == 'Darwin' ]];then + replacements=( + "REDIS_URL=$redisUrl" + "REGISTRY_URL=$registry_url" + "MONGO_USERNAME=$mongo_initdb_root_username" + "MONGO_PASSWORD=$mongo_initdb_root_password" + "MONGO_DB_NAME=$mongo_initdb_database" + "MONOG_URL=$mongoUrl" + "RABBITMQ_USERNAME=$rabbitmq_default_user" + "RABBITMQ_PASSWORD=$rabbitmq_default_pass" + "RABBITMQ_URL=$rabbitmqUrl" + "PRIVATE_KEY=$private_key" + "PUBLIC_KEY=$public_key" + "BAP_SUBSCRIBER_ID=$bap_subscriber_id" + "BAP_SUBSCRIBER_URL=$bap_subscriber_url" + "BAP_SUBSCRIBER_KEY_ID=$bap_subscriber_key_id" + "USE_LAYER_2_CONFIG"=true + "MANDATE_LAYER_2_CONFIG"=true + ) + + echo "Configuring BAP protocol server" + # Apply replacements in both files + for file in "$clientFile" "$networkFile"; do + for line in "${replacements[@]}"; do + key="${line%%=*}" + value="${line#*=}" + + escaped_key=$(printf '%s\n' "$key" | sed 's/[]\/$*.^[]/\\&/g') + escaped_value=$(printf '%s\n' "$value" | sed 's/[&/]/\\&/g') + sed -i '' "s|$escaped_key|$escaped_value|g" "$file" + done + + done +else + declare -A replacements=( + ["REDIS_URL"]=$redisUrl + ["REGISTRY_URL"]=$registry_url + ["MONGO_USERNAME"]=$mongo_initdb_root_username + ["MONGO_PASSWORD"]=$mongo_initdb_root_password + ["MONGO_DB_NAME"]=$mongo_initdb_database + ["MONOG_URL"]=$mongoUrl + ["RABBITMQ_USERNAME"]=$rabbitmq_default_user + ["RABBITMQ_PASSWORD"]=$rabbitmq_default_pass + ["RABBITMQ_URL"]=$rabbitmqUrl + ["PRIVATE_KEY"]=$private_key + ["PUBLIC_KEY"]=$public_key + ["BAP_SUBSCRIBER_ID"]=$bap_subscriber_id + ["BAP_SUBSCRIBER_URL"]=$bap_subscriber_url + ["BAP_SUBSCRIBER_KEY_ID"]=$bap_subscriber_key_id + ["USE_LAYER_2_CONFIG"]=true + ["MANDATE_LAYER_2_CONFIG"]=true + ) + + echo "Configuring BAP protocol server" + # Apply replacements in both files + for file in "$clientFile" "$networkFile"; do + for key in "${!replacements[@]}"; do + sed -i "s|$key|${replacements[$key]}|" "$file" + done + done +fi + +echo "Registering BAP protocol server on the registry" + +create_network_participant "$registry_url" "application/json" "$bap_subscriber_id" "$bap_subscriber_key_id" "$bap_subscriber_url" "$public_key" "$public_key" "$valid_from" "$valid_until" "$type" "$api_key" "$np_domain" \ No newline at end of file diff --git a/install/scripts/update_bpp_config.sh b/install/scripts/update_bpp_config.sh new file mode 100755 index 0000000..8be31bc --- /dev/null +++ b/install/scripts/update_bpp_config.sh @@ -0,0 +1,135 @@ +#!/bin/bash +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +source $SCRIPT_DIR/registry_entry.sh +source $SCRIPT_DIR/generate_keys.sh +source $SCRIPT_DIR/variables.sh +source $SCRIPT_DIR/get_container_details.sh + + +newClientFile=$(echo "$bppClientFile" | sed 's/yaml-sample/yml/') +newNetworkFile=$(echo "$bppNetworkFile" | sed 's/yaml-sample/yml/') + +cp $bppClientFile $newClientFile +cp $bppNetworkFile $newNetworkFile + +clientFile=$newClientFile +networkFile=$newNetworkFile + +client_port=$bpp_client_port +network_port=$bpp_network_port + +if [[ $(uname) == "Darwin" ]]; then + sed -i '' "s|BPP_NETWORK_PORT|$network_port|" $networkFile + sed -i '' "s|BPP_CLIENT_PORT|$client_port|" $clientFile +else + sed -i "s|BPP_NETWORK_PORT|$network_port|" $networkFile + sed -i "s|BPP_CLIENT_PORT|$client_port|" $clientFile +fi + +if [[ $1 ]]; then + registry_url=$1 + bpp_subscriber_id=$2 + bpp_subscriber_key_id=$3 + bpp_subscriber_url=$4 + webhook_url=$5 + api_key=$6 + np_domain=$7 +else + if [[ $(uname -s) == 'Darwin' ]]; then + ip=localhost + registry_url="http://$ip:3030/subscribers" + elif [[ $(systemd-detect-virt) == 'wsl' ]]; then + ip=$(hostname -I | awk '{print $1}') + registry_url="http://$ip:3030/subscribers" + else + registry_url="http://$(get_container_ip registry):3030/subscribers" + fi +fi + +echo "Generating public/private key pair" +get_keys + +if [[ $(uname -s ) == 'Darwin' ]];then + valid_from=$(date -u -v-1d +"%Y-%m-%dT%H:%M:%S.%000Z") + valid_until=$(date -u -v+3y +"%Y-%m-%dT%H:%M:%S.%000Z") +else + valid_from=$(date -u -d "-1 day" +"%Y-%m-%dT%H:%M:%S.%3NZ") + valid_until=$(date -u -d "+3 year" +"%Y-%m-%dT%H:%M:%S.%3NZ") +fi + +type=BPP + + +# Define an associative array for replacements +if [[ $(uname -s ) == 'Darwin' ]];then + replacements=( + "REDIS_URL=$redisUrl" + "REGISTRY_URL=$registry_url" + "MONGO_USERNAME=$mongo_initdb_root_username" + "MONGO_PASSWORD=$mongo_initdb_root_password" + "MONGO_DB_NAME=$mongo_initdb_database" + "MONOG_URL=$mongoUrl" + "RABBITMQ_USERNAME=$rabbitmq_default_user" + "RABBITMQ_PASSWORD=$rabbitmq_default_pass" + "RABBITMQ_URL=$rabbitmqUrl" + "PRIVATE_KEY=$private_key" + "PUBLIC_KEY=$public_key" + "BPP_SUBSCRIBER_URL=$bpp_subscriber_url" + "BPP_SUBSCRIBER_ID=$bpp_subscriber_id" + "BPP_SUBSCRIBER_KEY_ID=$bpp_subscriber_key_id" + "WEBHOOK_URL=$webhook_url" + "USE_LAYER_2_CONFIG"=true + "MANDATE_LAYER_2_CONFIG"=true + + ) + + echo "Configuring BPP protocol server" + # Apply replacements in both files + for file in "$clientFile" "$networkFile"; do + for line in "${replacements[@]}"; do + key="${line%%=*}" + value="${line#*=}" + + escaped_key=$(printf '%s\n' "$key" | sed 's/[]\/$*.^[]/\\&/g') + escaped_value=$(printf '%s\n' "$value" | sed 's/[&/]/\\&/g') + + sed -i '' "s|$escaped_key|$escaped_value|g" "$file" + done + + done + +else + declare -A replacements=( + ["REDIS_URL"]=$redisUrl + ["REGISTRY_URL"]=$registry_url + ["MONGO_USERNAME"]=$mongo_initdb_root_username + ["MONGO_PASSWORD"]=$mongo_initdb_root_password + ["MONGO_DB_NAME"]=$mongo_initdb_database + ["MONOG_URL"]=$mongoUrl + ["RABBITMQ_USERNAME"]=$rabbitmq_default_user + ["RABBITMQ_PASSWORD"]=$rabbitmq_default_pass + ["RABBITMQ_URL"]=$rabbitmqUrl + ["PRIVATE_KEY"]=$private_key + ["PUBLIC_KEY"]=$public_key + ["BPP_SUBSCRIBER_URL"]=$bpp_subscriber_url + ["BPP_SUBSCRIBER_ID"]=$bpp_subscriber_id + ["BPP_SUBSCRIBER_KEY_ID"]=$bpp_subscriber_key_id + ["WEBHOOK_URL"]=$webhook_url + ["USE_LAYER_2_CONFIG"]=true + ["MANDATE_LAYER_2_CONFIG"]=true + + ) + + echo "Configuring BPP protocol server" + # Apply replacements in both files + for file in "$clientFile" "$networkFile"; do + for key in "${!replacements[@]}"; do + sed -i "s|$key|${replacements[$key]}|" "$file" + done + done +fi + +echo "Registering BPP protocol server on the registry" + +create_network_participant "$registry_url" "application/json" "$bpp_subscriber_id" "$bpp_subscriber_key_id" "$bpp_subscriber_url" "$public_key" "$public_key" "$valid_from" "$valid_until" "$type" "$api_key" "$np_domain" \ No newline at end of file diff --git a/install/scripts/update_gateway_details.sh b/install/scripts/update_gateway_details.sh new file mode 100755 index 0000000..5bcb187 --- /dev/null +++ b/install/scripts/update_gateway_details.sh @@ -0,0 +1,120 @@ +#!/bin/bash +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +source $SCRIPT_DIR/get_container_details.sh + +gateway_id=gateway +gateway_port=4030 +protocol=http +reg_url=http://$1:3030/subscribers/lookup +registry_id=registry +registry_url=http://registry:3030 + +update_network_json(){ + cp $SCRIPT_DIR/../gateway_data/config/networks/onix.json-sample $SCRIPT_DIR/../gateway_data/config/networks/onix.json + networks_config_file="$SCRIPT_DIR/../gateway_data/config/networks/onix.json" + tmp_file=$(mktemp "tempfile.XXXXXXXXXX") + sed " s|GATEWAY_ID|$gateway_id|g; s|REGISTRY_ID|$registry_id|g; s|REGISTRY_URL|$registry_url|g" "$networks_config_file" > "$tmp_file" + mv "$tmp_file" "$networks_config_file" + docker run --rm -v $SCRIPT_DIR/../gateway_data/config:/source -v gateway_data_volume:/target busybox cp -r /source/networks /target/ +} + +get_details_registry() { + # Make the curl request and store the output in a variable + response=$(curl --location --request POST "$reg_url" \ + --header 'Content-Type: application/json' \ + --data-raw '{ + "type": "LREG" +}') + # Check if the curl command was successful (HTTP status code 2xx) + if [ $? -eq 0 ]; then + # Extract signing_public_key and encr_public_key using jq + signing_public_key=$(echo "$response" | jq -r '.[0].signing_public_key') + encr_public_key=$(echo "$response" | jq -r '.[0].encr_public_key') + subscriber_url=$(echo "$response" | jq -r '.[0].subscriber_url') + + else + echo "Error: Unable to fetch data from the server." + fi +} + +update_gateway_config() { + # Print the extracted keys + # echo "Signing Public Key: $signing_public_key" + # echo "Encryption Public Key: $encr_public_key" + # echo "URL $subscriber_url" + + cp $SCRIPT_DIR/../gateway_data/config/swf.properties-sample $SCRIPT_DIR/../gateway_data/config/swf.properties + config_file="$SCRIPT_DIR/../gateway_data/config/swf.properties" + + tmp_file=$(mktemp "tempfile.XXXXXXXXXX") + #sed " s|SUBSCRIBER_ID|$gateway_id|g; s|SIGNING_PUBLIC_KEY|$signing_public_key|g; s|ENCRYPTION_PUBLIC_KEY|$encr_public_key|g; s|GATEWAY_URL|$gateway_id|g; s|GATEWAY_PORT|$gateway_port|g; s|PROTOCOL|$protocol|g; s|REGISTRY_URL|$subscriber_url|g" "$config_file" > "$tmp_file" + sed " s|SUBSCRIBER_ID|$gateway_id|g; s|GATEWAY_URL|$gateway_id|g; s|GATEWAY_PORT|$gateway_port|g; s|PROTOCOL|$protocol|g; s|REGISTRY_URL|$subscriber_url|g" "$config_file" > "$tmp_file" + mv "$tmp_file" "$config_file" + docker volume create gateway_data_volume + docker volume create gateway_database_volume + docker run --rm -v $SCRIPT_DIR/../gateway_data/config:/source -v gateway_data_volume:/target busybox cp /source/{envvars,logger.properties,swf.properties} /target/ + update_network_json + +} + +# if [[ $1 == https://* ]]; then +# reg_url=$1/subscribers/lookup +# get_details_registry $reg_url +# else +# service_name=$1 +# if [[ $(uname -s) == 'Darwin' ]]; then +# ip=localhost +# elif [[ $(systemd-detect-virt) == 'wsl' ]]; then +# ip=$(hostname -I | awk '{print $1}') +# else +# ip=$(get_container_ip $service_name) +# fi +# reg_url=http://$ip:3030/subscribers/lookup +# get_details_registry $reg_url +# fi + +echo "Registry: $1 && Gateway: $2" + +if [[ $1 ]]; then + registry_url=$1 + if [[ $1 == https://* ]]; then + if [[ $(uname -s) == 'Darwin' ]]; then + registry_id=$(echo "$1" | sed -E 's/https:\/\///') + else + registry_id=$(echo "$1" | sed 's/https:\/\///') + fi + elif [[ $1 == http://* ]]; then + if [[ $(uname -s) == 'Darwin' ]]; then + registry_id=$(echo "$1" | sed -E 's/http:\/\///') + else + registry_id=$(echo "$1" | sed 's/http:\/\///') + fi + fi + if [[ $registry_id = "registry:3030" ]]; then + registry_id="registry" + fi +fi + +if [[ $2 ]]; then + if [[ $2 == https://* ]]; then + if [[ $(uname -s) == 'Darwin' ]]; then + gateway_id=$(echo "$2" | sed -E 's/https:\/\///') + else + gateway_id=$(echo "$2" | sed 's/https:\/\///') + fi + gateway_port=443 + protocol=https + update_gateway_config + elif [[ $2 == http://* ]]; then + if [[ $(uname -s) == 'Darwin' ]]; then + gateway_id=$(echo "$2" | sed -E 's/http:\/\///') + else + gateway_id=$(echo "$2" | sed 's/http:\/\///') + fi + gateway_port=80 + protocol=http + update_gateway_config + fi +else + update_gateway_config +fi \ No newline at end of file diff --git a/install/scripts/variables.sh b/install/scripts/variables.sh new file mode 100755 index 0000000..321cff4 --- /dev/null +++ b/install/scripts/variables.sh @@ -0,0 +1,76 @@ +#!/bin/bash + +#Colour Code +RED=$(tput setaf 1) +GREEN=$(tput setaf 2) +YELLOW=$(tput setaf 3) +BLUE=$(tput setaf 4) +NC=$(tput sgr0) + +# Bold Colour Code +BOLD=$(tput bold) +BoldGreen="${BOLD}$(tput setaf 2)" +BoldRed="${BOLD}$(tput setaf 1)" + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +# Default registry and gateway username and password +USERNAME="root" +PASSWORD="root" + +#NP Domain +np_domain="" +api_key="" +# Registry Role Permission file path +REGISTRY_FILE_PATH="../registry_data/RolePermission.xlsx" + +#Comman Variables with Default values +mongo_initdb_root_username="beckn" +mongo_initdb_root_password="beckn123" +mongo_initdb_database="protocol_server" +mongoUrl="mongoDB:27017" + +rabbitmq_default_user="beckn" +rabbitmq_default_pass="beckn123" +rabbitmqUrl="rabbitmq" + +redisUrl="redis" + +registry_url="http://registry:3030/subscribers" +beckn_registry_url="https://registry.becknprotocol.io/subscribers" + +layer2_url="" +schemas_path="/usr/src/app/schemas" + +#BAP varibales. + +bapClientFile="$SCRIPT_DIR/../protocol-server-data/bap-client.yaml-sample" +bapNetworkFile="$SCRIPT_DIR/../protocol-server-data/bap-network.yaml-sample" + +bap_client_port=5001 +bap_network_port=5002 + +bap_subscriber_id="bap-network" +bap_subscriber_key_id="bap-network-key" +bap_subscriber_url="http://bap-network:5002" +bap_client_url="http://bap-client:5002" + +#BPP varibales. + +bppClientFile="$SCRIPT_DIR/../protocol-server-data/bpp-client.yaml-sample" +bppNetworkFile="$SCRIPT_DIR/../protocol-server-data/bpp-network.yaml-sample" + +bpp_client_port=6001 +bpp_network_port=6002 + +bpp_subscriber_id="bpp-network" +bpp_subscriber_key_id="bpp-network-key" +bpp_subscriber_url="http://bpp-network:6002" +webhook_url="http://sandbox-api:3000" + +bpp_docker_compose_file=docker-compose-bpp.yml +bpp_docker_compose_file_sandbox=docker-compose-bpp-with-sandbox.yml +bap_docker_compose_file=docker-compose-bap.yml +registry_docker_compose_file=docker-compose-registry.yml +gateway_docker_compose_file=docker-compose-gateway.yml +gcl_docker_compose_file=docker-compose-gcl.yml \ No newline at end of file diff --git a/install/uninstall.sh b/install/uninstall.sh new file mode 100644 index 0000000..a34d8d6 --- /dev/null +++ b/install/uninstall.sh @@ -0,0 +1,7 @@ +docker compose -f docker-compose-bap.yml down -v +docker compose -f docker-compose-bpp.yml down -v +docker compose -f docker-compose-bpp-with-sandbox.yml down -v +docker compose -f docker-compose-gateway.yml down -v +docker compose -f docker-compose-registry.yml down -v +docker compose -f docker-compose-app.yml down -v +docker volume rm registry_data_volume registry_database_volume registry_logs_volume gateway_data_volume gateway_database_volume bap_client_config_volume bap_network_config_volume bpp_client_config_volume bpp_network_config_volume \ No newline at end of file diff --git a/setup.sh b/setup.sh index cd002fb..ecca400 100755 --- a/setup.sh +++ b/setup.sh @@ -17,32 +17,49 @@ if ! docker info > /dev/null 2>&1; then exit 1 fi -# Step 1: Start all services with docker-compose -echo -e "${YELLOW}Step 1: Starting all Beckn network services...${NC}" -docker compose down 2>/dev/null -docker compose up -d +# Step 1: Run the Beckn network installer +echo -e "${YELLOW}Step 1: Setting up Beckn network services...${NC}" -# Wait for services to be ready +# Check if install directory exists +if [ ! -d "./install" ]; then + echo -e "${RED}Error: install directory not found.${NC}" + exit 1 +fi + +# Make the installer executable +chmod +x ./install/beckn-onix.sh + +# Navigate to install directory and run setup +cd install + +# Auto-select option 3 (local setup) for the installer +echo -e "${GREEN}Running local network setup...${NC}" +echo "3" | ./beckn-onix.sh + +cd .. + +# Wait for services to stabilize echo -e "${YELLOW}Waiting for services to be ready...${NC}" -sleep 10 +sleep 15 -# Step 2: Configure Vault -echo -e "${YELLOW}Step 2: Configuring Vault for key management...${NC}" +# Step 2: Configure Vault for key management +echo -e "${YELLOW}Step 2: Setting up Vault for key management...${NC}" -# Wait for Vault to be ready -for i in {1..30}; do - if docker exec -e VAULT_ADDR=http://127.0.0.1:8200 vault vault status > /dev/null 2>&1; then - echo -e "${GREEN}Vault is ready!${NC}" - break - fi - if [ $i -eq 30 ]; then - echo -e "${RED}Error: Vault failed to start${NC}" - exit 1 - fi - sleep 1 -done +# Check if Vault is running, if not start it +if ! docker ps | grep -q "vault"; then + echo -e "${BLUE}Starting Vault container...${NC}" + docker run -d \ + --name vault \ + --cap-add=IPC_LOCK \ + -e VAULT_DEV_ROOT_TOKEN_ID=root \ + -e VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200 \ + -p 8200:8200 \ + hashicorp/vault:latest > /dev/null 2>&1 + sleep 5 +fi # Configure Vault +echo -e "${BLUE}Configuring Vault policies...${NC}" docker exec -e VAULT_ADDR=http://127.0.0.1:8200 -e VAULT_TOKEN=root vault \ vault auth enable approle > /dev/null 2>&1 || true @@ -56,7 +73,7 @@ docker exec -e VAULT_ADDR=http://127.0.0.1:8200 -e VAULT_TOKEN=root vault \ token_ttl=24h \ token_max_ttl=48h > /dev/null 2>&1 -# Get credentials +# Get Vault credentials ROLE_ID=$(docker exec -e VAULT_ADDR=http://127.0.0.1:8200 -e VAULT_TOKEN=root vault \ vault read -field=role_id auth/approle/role/beckn-role/role-id 2>/dev/null) SECRET_ID=$(docker exec -e VAULT_ADDR=http://127.0.0.1:8200 -e VAULT_TOKEN=root vault \ @@ -66,40 +83,85 @@ SECRET_ID=$(docker exec -e VAULT_ADDR=http://127.0.0.1:8200 -e VAULT_TOKEN=root docker exec -e VAULT_ADDR=http://127.0.0.1:8200 -e VAULT_TOKEN=root vault \ vault secrets enable -path=beckn kv-v2 > /dev/null 2>&1 || true -# Store sample keys -docker exec -e VAULT_ADDR=http://127.0.0.1:8200 -e VAULT_TOKEN=root vault \ - vault kv put beckn/keys/bap \ - private_key='sample_bap_private_key' \ - public_key='sample_bap_public_key' > /dev/null 2>&1 +echo -e "${GREEN}✓ Vault configured successfully${NC}" -docker exec -e VAULT_ADDR=http://127.0.0.1:8200 -e VAULT_TOKEN=root vault \ - vault kv put beckn/keys/bpp \ - private_key='sample_bpp_private_key' \ - public_key='sample_bpp_public_key' > /dev/null 2>&1 +# Step 3: Check services status +echo -e "${YELLOW}Step 3: Checking services status...${NC}" + +# Check if services are running +if docker ps | grep -q "registry"; then + echo -e "${GREEN}✓ Registry is running${NC}" +fi +if docker ps | grep -q "gateway"; then + echo -e "${GREEN}✓ Gateway is running${NC}" +fi +if docker ps | grep -q "bap-client"; then + echo -e "${GREEN}✓ BAP services are running${NC}" +fi +if docker ps | grep -q "bpp-client"; then + echo -e "${GREEN}✓ BPP services are running${NC}" +fi +if docker ps | grep -q "vault"; then + echo -e "${GREEN}✓ Vault is running${NC}" +fi + +# Step 4: Build adapter plugins +echo -e "${YELLOW}Step 4: Building adapter plugins...${NC}" -# Step 3: Build plugins -echo -e "${YELLOW}Step 3: Building plugins...${NC}" if [ -f "./build-plugins.sh" ]; then chmod +x ./build-plugins.sh ./build-plugins.sh + echo -e "${GREEN}✓ Plugins built successfully${NC}" else - echo -e "${RED}Warning: build-plugins.sh not found. Please build plugins manually.${NC}" + echo -e "${RED}Warning: build-plugins.sh not found${NC}" fi -# Step 4: Build server -echo -e "${YELLOW}Step 4: Building Beckn-ONIX server...${NC}" -go build -o server cmd/adapter/main.go +# Step 5: Build the adapter server +echo -e "${YELLOW}Step 5: Building Beckn-ONIX adapter server...${NC}" -# Create .env.vault file -echo -e "${YELLOW}Step 5: Creating environment file...${NC}" -cat > .env.vault < .env <