Files
wild-cloud/scripts/common.sh

270 lines
7.7 KiB
Bash

#!/bin/bash
# wild-common.sh
# Common utility functions for Wild Cloud shell scripts
# Source this file at the beginning of scripts to access shared functionality
#
# USAGE PATTERN:
# Replace the common function definitions in your script with:
#
# #!/bin/bash
# set -e
# set -o pipefail
#
# # Source common utilities
# source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/wild-common.sh"
#
# # Initialize Wild Cloud environment
# init_wild_env
#
# AVAILABLE FUNCTIONS:
# - Print functions: print_header, print_info, print_warning, print_success, print_error
# - Config functions: get_current_config, get_current_secret, prompt_with_default
# - Config helpers: prompt_if_unset_config, prompt_if_unset_secret
# - Validation: check_wild_directory, check_basic_config
# - Utilities: command_exists, file_readable, dir_writable, generate_random_string
# =============================================================================
# COLOR VARIABLES
# =============================================================================
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# =============================================================================
# PRINT FUNCTIONS
# =============================================================================
# Print functions for consistent output formatting
print_header() {
echo -e "\n${BLUE}=== $1 ===${NC}\n"
}
print_info() {
echo -e "${BLUE}INFO:${NC} $1"
}
print_warning() {
echo -e "${YELLOW}WARNING:${NC} $1"
}
print_success() {
echo -e "${GREEN}SUCCESS:${NC} $1"
}
print_error() {
echo -e "${RED}ERROR:${NC} $1"
}
# =============================================================================
# CONFIGURATION UTILITIES
# =============================================================================
# Function to get current config value safely
get_current_config() {
local key="$1"
if [ -f "${WC_HOME}/config.yaml" ]; then
set +e
result=$(wild-config "${key}" 2>/dev/null)
set -e
echo "${result}"
else
echo ""
fi
}
# Function to get current secret value safely
get_current_secret() {
local key="$1"
if [ -f "${WC_HOME}/secrets.yaml" ]; then
set +e
result=$(wild-secret "${key}" 2>/dev/null)
set -e
echo "${result}"
else
echo ""
fi
}
# Function to prompt for input with default value
prompt_with_default() {
local prompt="$1"
local default="$2"
local current_value="$3"
local result
if [ -n "${current_value}" ] && [ "${current_value}" != "null" ]; then
printf "%s [current: %s]: " "${prompt}" "${current_value}" >&2
read -r result
if [ -z "${result}" ]; then
result="${current_value}"
fi
elif [ -n "${default}" ]; then
printf "%s [default: %s]: " "${prompt}" "${default}" >&2
read -r result
if [ -z "${result}" ]; then
result="${default}"
fi
else
printf "%s: " "${prompt}" >&2
read -r result
while [ -z "${result}" ]; do
printf "This value is required. Please enter a value: " >&2
read -r result
done
fi
echo "${result}"
}
# Prompt for config value only if it's not already set
prompt_if_unset_config() {
local config_path="$1"
local prompt="$2"
local default="$3"
local current_value
current_value=$(get_current_config "${config_path}")
if [ -z "${current_value}" ] || [ "${current_value}" = "null" ]; then
local new_value
new_value=$(prompt_with_default "${prompt}" "${default}" "")
wild-config-set "${config_path}" "${new_value}"
print_info "Set ${config_path} = ${new_value}"
else
print_info "Using existing ${config_path} = ${current_value}"
fi
}
# Prompt for secret value only if it's not already set
prompt_if_unset_secret() {
local secret_path="$1"
local prompt="$2"
local default="$3"
local current_value
current_value=$(get_current_secret "${secret_path}")
if [ -z "${current_value}" ] || [ "${current_value}" = "null" ]; then
local new_value
new_value=$(prompt_with_default "${prompt}" "${default}" "")
wild-secret-set "${secret_path}" "${new_value}"
print_info "Set secret ${secret_path}"
else
print_info "Using existing secret ${secret_path}"
fi
}
# =============================================================================
# ENVIRONMENT SETUP
# =============================================================================
# Find the wild-cloud project home directory by searching for .wildcloud
# Returns the path to the project root, or empty string if not found
find_wc_home() {
local current_dir="$(pwd)"
while [ "$current_dir" != "/" ]; do
if [ -d "$current_dir/.wildcloud" ]; then
echo "$current_dir"
return 0
fi
current_dir="$(dirname "$current_dir")"
done
# Not found
return 1
}
# Initialize common Wild Cloud environment variables
# Call this function at the beginning of scripts
init_wild_env() {
if [ -z "${WC_ROOT}" ]; then
print "Fail"
exit 1
else
# Check if WC_ROOT is a valid directory
if [ ! -d "${WC_ROOT}" ]; then
echo "ERROR: WC_ROOT directory does not exist! Did you install the wild-cloud root?"
exit 1
fi
# Check if WC_ROOT/bin is in path
if [[ ":$PATH:" != *":$WC_ROOT/bin:"* ]]; then
echo "ERROR: Your wildcloud seed bin path should be in your PATH environment."
exit 1
fi
WC_HOME="$(find_wc_home)"
if [ -z "${WC_HOME}" ]; then
echo "ERROR: This command must be run from within a wildcloud home directory."
exit 1
fi
fi
}
# =============================================================================
# VALIDATION FUNCTIONS
# =============================================================================
# Check if we're in a wild-cloud directory
check_wild_directory() {
local found_home
if found_home="$(find_wc_home)"; then
# Update WC_HOME if it's not set correctly
if [ -z "${WC_HOME}" ] || [ "${WC_HOME}" != "$found_home" ]; then
WC_HOME="$found_home"
export WC_HOME
fi
else
print_error "No wild-cloud project found in current directory or ancestors"
print_info "Run 'wild-setup-scaffold' first to initialize a wild-cloud project"
print_info "Current working directory: $(pwd)"
local search_path="$(pwd)"
while [ "$search_path" != "/" ]; do
print_info " Searched: $search_path"
search_path="$(dirname "$search_path")"
done
exit 1
fi
}
# Check if basic configuration exists
check_basic_config() {
if [ -z "$(get_current_config "operator.email")" ]; then
print_error "Basic configuration is missing"
print_info "Run 'wild-setup-scaffold' first to configure basic settings"
exit 1
fi
}
# =============================================================================
# UTILITY FUNCTIONS
# =============================================================================
# Check if a command exists
command_exists() {
command -v "$1" >/dev/null 2>&1
}
# Check if a file exists and is readable
file_readable() {
[ -f "$1" ] && [ -r "$1" ]
}
# Check if a directory exists and is writable
dir_writable() {
[ -d "$1" ] && [ -w "$1" ]
}
# Generate a random string of specified length
generate_random_string() {
local length="${1:-32}"
openssl rand -hex "$((length / 2))" 2>/dev/null || \
head -c "$length" /dev/urandom | base64 | tr -d '=+/' | cut -c1-"$length"
}