Files
smom-dbis-138/scripts/deployment/populate-env.sh
defiQUG 1fb7266469 Add Oracle Aggregator and CCIP Integration
- Introduced Aggregator.sol for Chainlink-compatible oracle functionality, including round-based updates and access control.
- Added OracleWithCCIP.sol to extend Aggregator with CCIP cross-chain messaging capabilities.
- Created .gitmodules to include OpenZeppelin contracts as a submodule.
- Developed a comprehensive deployment guide in NEXT_STEPS_COMPLETE_GUIDE.md for Phase 2 and smart contract deployment.
- Implemented Vite configuration for the orchestration portal, supporting both Vue and React frameworks.
- Added server-side logic for the Multi-Cloud Orchestration Portal, including API endpoints for environment management and monitoring.
- Created scripts for resource import and usage validation across non-US regions.
- Added tests for CCIP error handling and integration to ensure robust functionality.
- Included various new files and directories for the orchestration portal and deployment scripts.
2025-12-12 14:57:48 -08:00

342 lines
10 KiB
Bash
Executable File

#!/usr/bin/env bash
# Populate .env file with Azure and Cloudflare values
# This script retrieves values from Azure CLI and prompts for Cloudflare values
set -euo pipefail
# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
SCRIPT_NAME="populate-env.sh"
SCRIPT_DESC="Populate .env with Azure & Cloudflare values; prompts and checks prerequisites"
SCRIPT_USAGE="${SCRIPT_NAME} [--help]"
SCRIPT_OPTIONS="--help Show help"
SCRIPT_REQUIREMENTS="Azure CLI (ensure_azure_cli), permissions to write .env"
handle_help "${1:-}"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
ENV_FILE="${PROJECT_ROOT}/.env"
# Logging functions
log() {
log_success "[INFO] $1"
}
error() {
log_error "[ERROR] $1"
exit 1
}
warn() {
log_warn "[WARNING] $1"
}
info() {
log_info "[INFO] $1"
}
prompt() {
log_info "[PROMPT] $1"
}
# Check if Azure CLI is installed
check_azure_cli() {
if ! command -v az &> /dev/null; then
error "Azure CLI is not installed. Please install it first."
error "Installation: curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash"
exit 1
fi
log "Azure CLI is installed"
}
# Check if user is logged in to Azure
check_azure_login() {
if ! az account show &> /dev/null; then
error "Not logged in to Azure. Please run 'az login' first."
error "Or use: ./scripts/deployment/azure-login.sh"
exit 1
fi
log "Azure authentication verified"
}
# Get Azure subscription ID
get_azure_subscription_id() {
local sub_id=$(az account show --query id -o tsv 2>/dev/null || echo "")
if [ -z "$sub_id" ]; then
warn "Could not get Azure subscription ID. You may need to login."
return 1
fi
echo "$sub_id"
}
# Get Azure tenant ID
get_azure_tenant_id() {
local tenant_id=$(az account show --query tenantId -o tsv 2>/dev/null || echo "")
if [ -z "$tenant_id" ]; then
warn "Could not get Azure tenant ID."
return 1
fi
echo "$tenant_id"
}
# Get Azure resource group (if exists)
get_azure_resource_group() {
local rg="${AZURE_RESOURCE_GROUP:-defi-oracle-mainnet-rg}"
# Check if resource group exists
if az group show --name "$rg" &> /dev/null; then
echo "$rg"
return 0
fi
# Try to find any resource group with "defi-oracle" in the name
local found_rg=$(az group list --query "[?contains(name, 'defi-oracle')].name" -o tsv 2>/dev/null | head -n 1 || echo "")
if [ -n "$found_rg" ]; then
echo "$found_rg"
return 0
fi
# Return default
echo "$rg"
}
# Get or create Terraform backend storage account
get_terraform_backend_info() {
local tfstate_rg="${ARM_RESOURCE_GROUP_NAME:-tfstate-rg}"
local location="${AZURE_LOCATION:-westeurope}"
info "Checking Terraform backend storage account..."
# Check if storage account exists
local storage_account=$(az storage account list --resource-group "$tfstate_rg" --query "[?contains(name, 'tfstate')].name" -o tsv 2>/dev/null | head -n 1 || echo "")
if [ -z "$storage_account" ]; then
warn "Terraform backend storage account not found."
read -p "Do you want to create a new storage account for Terraform backend? (y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
# Generate random suffix for storage account name
local random_suffix=$(openssl rand -hex 4 2>/dev/null || echo $(date +%s | sha256sum | head -c 8))
storage_account="tfstate${random_suffix}"
log "Creating resource group: $tfstate_rg"
az group create --name "$tfstate_rg" --location "$location" --output none 2>/dev/null || true
log "Creating storage account: $storage_account"
az storage account create \
--resource-group "$tfstate_rg" \
--name "$storage_account" \
--sku Standard_LRS \
--kind StorageV2 \
--location "$location" \
--output none || error "Failed to create storage account"
log "Creating storage container: tfstate"
az storage container create \
--name "tfstate" \
--account-name "$storage_account" \
--output none || error "Failed to create storage container"
log "Storage account created: $storage_account"
else
warn "Skipping storage account creation. You'll need to set ARM_STORAGE_ACCOUNT_NAME manually."
return 1
fi
else
log "Found existing storage account: $storage_account"
fi
# Get access key
local access_key=$(az storage account keys list \
--resource-group "$tfstate_rg" \
--account-name "$storage_account" \
--query "[0].value" -o tsv 2>/dev/null || echo "")
if [ -z "$access_key" ]; then
warn "Could not get storage account access key"
return 1
fi
# Return values (we'll set them in the env file)
echo "STORAGE_ACCOUNT=$storage_account"
echo "STORAGE_RG=$tfstate_rg"
echo "ACCESS_KEY=$access_key"
}
# Prompt for Cloudflare values
get_cloudflare_values() {
info "Cloudflare configuration required"
info "You can find these values in your Cloudflare dashboard:"
info " - Zone ID: Cloudflare Dashboard > Your Domain > Overview > Zone ID"
info " - API Token: Cloudflare Dashboard > My Profile > API Tokens > Create Token"
echo
# Zone ID
if [ -z "${CLOUDFLARE_ZONE_ID:-}" ]; then
prompt "Enter Cloudflare Zone ID:"
read -r zone_id
if [ -z "$zone_id" ]; then
warn "Zone ID not provided. Skipping Cloudflare configuration."
return 1
fi
else
zone_id="${CLOUDFLARE_ZONE_ID}"
log "Using existing CLOUDFLARE_ZONE_ID"
fi
# API Token
if [ -z "${CLOUDFLARE_API_TOKEN:-}" ]; then
prompt "Enter Cloudflare API Token:"
read -rs api_token
echo
if [ -z "$api_token" ]; then
warn "API Token not provided. Skipping Cloudflare configuration."
return 1
fi
else
api_token="${CLOUDFLARE_API_TOKEN}"
log "Using existing CLOUDFLARE_API_TOKEN"
fi
echo "CLOUDFLARE_ZONE_ID=$zone_id"
echo "CLOUDFLARE_API_TOKEN=$api_token"
}
# Update .env file
update_env_file() {
local updates="$1"
info "Updating .env file..."
# Create .env file if it doesn't exist
if [ ! -f "$ENV_FILE" ]; then
log "Creating .env file..."
touch "$ENV_FILE"
fi
# Process each update
while IFS= read -r line; do
if [ -z "$line" ]; then
continue
fi
local key=$(echo "$line" | cut -d'=' -f1)
local value=$(echo "$line" | cut -d'=' -f2-)
# Remove quotes if present
value=$(echo "$value" | sed 's/^"//;s/"$//')
# Check if key exists in .env file
if grep -q "^${key}=" "$ENV_FILE" 2>/dev/null; then
# Update existing value
if [[ "$OSTYPE" == "darwin"* ]]; then
# macOS
sed -i '' "s|^${key}=.*|${key}=${value}|" "$ENV_FILE"
else
# Linux
sed -i "s|^${key}=.*|${key}=${value}|" "$ENV_FILE"
fi
log "Updated: $key"
else
# Append new value
echo "${key}=${value}" >> "$ENV_FILE"
log "Added: $key"
fi
done <<< "$updates"
log ".env file updated successfully"
}
# Main function
main() {
log "Populating .env file with Azure and Cloudflare values"
log "======================================================"
echo
# Check prerequisites
check_azure_cli
check_azure_login
# Collect all updates
local updates=""
# Get Azure values
info "Retrieving Azure configuration..."
local sub_id=$(get_azure_subscription_id)
if [ -n "$sub_id" ]; then
updates+="AZURE_SUBSCRIPTION_ID=$sub_id"$'\n'
log "Azure Subscription ID: $sub_id"
else
warn "Could not retrieve Azure Subscription ID"
fi
local tenant_id=$(get_azure_tenant_id)
if [ -n "$tenant_id" ]; then
updates+="AZURE_TENANT_ID=$tenant_id"$'\n'
log "Azure Tenant ID: $tenant_id"
else
warn "Could not retrieve Azure Tenant ID"
fi
local rg=$(get_azure_resource_group)
updates+="AZURE_RESOURCE_GROUP=$rg"$'\n'
log "Azure Resource Group: $rg"
# Get Terraform backend info
echo
info "Checking Terraform backend storage..."
local backend_info=$(get_terraform_backend_info)
if [ -n "$backend_info" ]; then
while IFS= read -r line; do
if [[ "$line" == STORAGE_ACCOUNT=* ]]; then
updates+="ARM_STORAGE_ACCOUNT_NAME=$(echo "$line" | cut -d'=' -f2-)"$'\n'
elif [[ "$line" == STORAGE_RG=* ]]; then
updates+="ARM_RESOURCE_GROUP_NAME=$(echo "$line" | cut -d'=' -f2-)"$'\n'
elif [[ "$line" == ACCESS_KEY=* ]]; then
updates+="ARM_ACCESS_KEY=$(echo "$line" | cut -d'=' -f2-)"$'\n'
fi
done <<< "$backend_info"
updates+="ARM_CONTAINER_NAME=tfstate"$'\n'
else
warn "Terraform backend configuration skipped"
fi
# Get Cloudflare values
echo
local cloudflare_info=$(get_cloudflare_values)
if [ -n "$cloudflare_info" ]; then
updates+="$cloudflare_info"$'\n'
else
warn "Cloudflare configuration skipped"
fi
# Update .env file
echo
if [ -n "$updates" ]; then
update_env_file "$updates"
echo
log "Summary of updates:"
echo "$updates" | grep -v "^$" | while IFS= read -r line; do
local key=$(echo "$line" | cut -d'=' -f1)
if [[ "$key" == *"TOKEN"* ]] || [[ "$key" == *"SECRET"* ]] || [[ "$key" == *"KEY"* ]]; then
echo " $key=*** (hidden)"
else
echo " $line"
fi
done
else
warn "No updates to apply"
fi
echo
log "Done! Review your .env file at: $ENV_FILE"
log "Note: Sensitive values (tokens, keys, secrets) are hidden in the summary above"
}
# Run main function
main "$@"