206 lines
6.7 KiB
Bash
206 lines
6.7 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
# Environment management script for /core:env command
|
||
|
|
|
||
|
|
set -e
|
||
|
|
|
||
|
|
# Function to mask sensitive values
|
||
|
|
mask_sensitive_value() {
|
||
|
|
local key="$1"
|
||
|
|
local value="$2"
|
||
|
|
if [[ "$key" =~ (_SECRET|_KEY|_PASSWORD|_TOKEN)$ ]]; then
|
||
|
|
if [ -z "$value" ]; then
|
||
|
|
echo "***not set***"
|
||
|
|
else
|
||
|
|
echo "***set***"
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
echo "$value"
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
# The subcommand is the first argument
|
||
|
|
SUBCOMMAND="$1"
|
||
|
|
|
||
|
|
case "$SUBCOMMAND" in
|
||
|
|
"")
|
||
|
|
# Default command: Show env vars
|
||
|
|
if [ ! -f ".env" ]; then
|
||
|
|
echo ".env file not found."
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
while IFS= read -r line || [[ -n "$line" ]]; do
|
||
|
|
# Skip comments and empty lines
|
||
|
|
if [[ "$line" =~ ^\s*#.*$ || -z "$line" ]]; then
|
||
|
|
continue
|
||
|
|
fi
|
||
|
|
# Extract key and value
|
||
|
|
key=$(echo "$line" | cut -d '=' -f 1)
|
||
|
|
value=$(echo "$line" | cut -d '=' -f 2-)
|
||
|
|
masked_value=$(mask_sensitive_value "$key" "$value")
|
||
|
|
echo "$key=$masked_value"
|
||
|
|
done < ".env"
|
||
|
|
;;
|
||
|
|
check)
|
||
|
|
# Subcommand: check
|
||
|
|
if [ ! -f ".env.example" ]; then
|
||
|
|
echo ".env.example file not found."
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Create an associative array of env vars
|
||
|
|
declare -A env_vars
|
||
|
|
if [ -f ".env" ]; then
|
||
|
|
while IFS= read -r line || [[ -n "$line" ]]; do
|
||
|
|
if [[ ! "$line" =~ ^\s*# && "$line" =~ = ]]; then
|
||
|
|
key=$(echo "$line" | cut -d '=' -f 1)
|
||
|
|
value=$(echo "$line" | cut -d '=' -f 2-)
|
||
|
|
env_vars["$key"]="$value"
|
||
|
|
fi
|
||
|
|
done < ".env"
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "Environment Check"
|
||
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||
|
|
echo
|
||
|
|
|
||
|
|
errors=0
|
||
|
|
warnings=0
|
||
|
|
|
||
|
|
while IFS= read -r line || [[ -n "$line" ]]; do
|
||
|
|
if [[ -z "$line" || "$line" =~ ^\s*# ]]; then
|
||
|
|
continue
|
||
|
|
fi
|
||
|
|
|
||
|
|
example_key=$(echo "$line" | cut -d '=' -f 1)
|
||
|
|
example_value=$(echo "$line" | cut -d '=' -f 2-)
|
||
|
|
|
||
|
|
if [[ ${env_vars[$example_key]+_} ]]; then
|
||
|
|
# Key exists in .env
|
||
|
|
env_value="${env_vars[$example_key]}"
|
||
|
|
if [ -n "$env_value" ]; then
|
||
|
|
echo "✓ $example_key=$(mask_sensitive_value "$example_key" "$env_value")"
|
||
|
|
else
|
||
|
|
# Key exists but value is empty
|
||
|
|
if [ -z "$example_value" ]; then
|
||
|
|
echo "✗ $example_key missing (required, no default)"
|
||
|
|
((errors++))
|
||
|
|
else
|
||
|
|
echo "⚠ $example_key missing (default: $example_value)"
|
||
|
|
((warnings++))
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
# Key does not exist in .env
|
||
|
|
if [ -z "$example_value" ]; then
|
||
|
|
echo "✗ $example_key missing (required, no default)"
|
||
|
|
((errors++))
|
||
|
|
else
|
||
|
|
echo "⚠ $example_key missing (default: $example_value)"
|
||
|
|
((warnings++))
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
done < ".env.example"
|
||
|
|
|
||
|
|
echo
|
||
|
|
if [ "$errors" -gt 0 ] || [ "$warnings" -gt 0 ]; then
|
||
|
|
echo "$errors errors, $warnings warnings"
|
||
|
|
else
|
||
|
|
echo "✓ All checks passed."
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
diff)
|
||
|
|
# Subcommand: diff
|
||
|
|
if [ ! -f ".env.example" ]; then
|
||
|
|
echo ".env.example file not found."
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Create associative arrays for both files
|
||
|
|
declare -A env_vars
|
||
|
|
if [ -f ".env" ]; then
|
||
|
|
while IFS= read -r line || [[ -n "$line" ]]; do
|
||
|
|
if [[ ! "$line" =~ ^\s*# && "$line" =~ = ]]; then
|
||
|
|
key=$(echo "$line" | cut -d '=' -f 1)
|
||
|
|
value=$(echo "$line" | cut -d '=' -f 2-)
|
||
|
|
env_vars["$key"]="$value"
|
||
|
|
fi
|
||
|
|
done < ".env"
|
||
|
|
fi
|
||
|
|
|
||
|
|
declare -A example_vars
|
||
|
|
while IFS= read -r line || [[ -n "$line" ]]; do
|
||
|
|
if [[ ! "$line" =~ ^\s*# && "$line" =~ = ]]; then
|
||
|
|
key=$(echo "$line" | cut -d '=' -f 1)
|
||
|
|
value=$(echo "$line" | cut -d '=' -f 2-)
|
||
|
|
example_vars["$key"]="$value"
|
||
|
|
fi
|
||
|
|
done < ".env.example"
|
||
|
|
|
||
|
|
echo "Environment Diff"
|
||
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||
|
|
echo
|
||
|
|
|
||
|
|
# Check for modifications and deletions
|
||
|
|
for key in "${!example_vars[@]}"; do
|
||
|
|
example_value="${example_vars[$key]}"
|
||
|
|
if [[ ${env_vars[$key]+_} ]]; then
|
||
|
|
# Key exists in .env
|
||
|
|
env_value="${env_vars[$key]}"
|
||
|
|
if [ "$env_value" != "$example_value" ]; then
|
||
|
|
echo "~ $key: $(mask_sensitive_value "$key" "$example_value") -> $(mask_sensitive_value "$key" "$env_value")"
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
# Key does not exist in .env
|
||
|
|
echo "- $key: $(mask_sensitive_value "$key" "$example_value")"
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
# Check for additions
|
||
|
|
for key in "${!env_vars[@]}"; do
|
||
|
|
if [[ ! ${example_vars[$key]+_} ]]; then
|
||
|
|
echo "+ $key: $(mask_sensitive_value "$key" "${env_vars[$key]}")"
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
;;
|
||
|
|
sync)
|
||
|
|
# Subcommand: sync
|
||
|
|
if [ ! -f ".env.example" ]; then
|
||
|
|
echo ".env.example file not found."
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Create an associative array of env vars
|
||
|
|
declare -A env_vars
|
||
|
|
if [ -f ".env" ]; then
|
||
|
|
while IFS= read -r line || [[ -n "$line" ]]; do
|
||
|
|
if [[ ! "$line" =~ ^\s*# && "$line" =~ = ]]; then
|
||
|
|
key=$(echo "$line" | cut -d '=' -f 1)
|
||
|
|
value=$(echo "$line" | cut -d '=' -f 2-)
|
||
|
|
env_vars["$key"]="$value"
|
||
|
|
fi
|
||
|
|
done < ".env"
|
||
|
|
fi
|
||
|
|
|
||
|
|
while IFS= read -r line || [[ -n "$line" ]]; do
|
||
|
|
if [[ -z "$line" || "$line" =~ ^\s*# ]]; then
|
||
|
|
continue
|
||
|
|
fi
|
||
|
|
|
||
|
|
example_key=$(echo "$line" | cut -d '=' -f 1)
|
||
|
|
example_value=$(echo "$line" | cut -d '=' -f 2-)
|
||
|
|
|
||
|
|
if [[ ! ${env_vars[$example_key]+_} ]]; then
|
||
|
|
# Key does not exist in .env, so add it
|
||
|
|
echo "$example_key=$example_value" >> ".env"
|
||
|
|
echo "Added: $example_key"
|
||
|
|
fi
|
||
|
|
done < ".env.example"
|
||
|
|
|
||
|
|
echo "Sync complete."
|
||
|
|
;;
|
||
|
|
*)
|
||
|
|
echo "Unknown subcommand: $SUBCOMMAND"
|
||
|
|
exit 1
|
||
|
|
;;
|
||
|
|
esac
|