Standard env init.
This commit is contained in:
270
scripts/common.sh
Normal file
270
scripts/common.sh
Normal file
@@ -0,0 +1,270 @@
|
||||
#!/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"
|
||||
}
|
Reference in New Issue
Block a user