Rustelo/scripts/utils/configure-features.sh
Jesús Pérex 095fd89ff7
Some checks failed
CI/CD Pipeline / Test Suite (push) Has been cancelled
CI/CD Pipeline / Security Audit (push) Has been cancelled
CI/CD Pipeline / Build Docker Image (push) Has been cancelled
CI/CD Pipeline / Deploy to Staging (push) Has been cancelled
CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / Performance Benchmarks (push) Has been cancelled
CI/CD Pipeline / Cleanup (push) Has been cancelled
chore: add scripts
2025-07-07 23:53:50 +01:00

408 lines
11 KiB
Bash
Executable File

#!/bin/bash
# Rustelo Feature Configuration Helper
# This script helps configure optional features for the Rustelo template
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Default values
ENABLE_TLS=false
ENABLE_AUTH=true
ENABLE_CONTENT_DB=true
INTERACTIVE=true
BUILD_TYPE="debug"
OUTPUT_FILE=".env"
# Function to print colored output
print_color() {
printf "${1}${2}${NC}\n"
}
# Function to show usage
show_usage() {
echo "Usage: $0 [OPTIONS]"
echo ""
echo "Options:"
echo " -h, --help Show this help message"
echo " -i, --interactive Interactive mode (default)"
echo " -n, --non-interactive Non-interactive mode"
echo " -t, --tls Enable TLS support"
echo " -a, --auth Enable authentication (default)"
echo " -c, --content-db Enable database content (default)"
echo " --no-auth Disable authentication"
echo " --no-content-db Disable database content"
echo " --minimal Minimal setup (no optional features)"
echo " --build-release Build in release mode"
echo " --build-debug Build in debug mode (default)"
echo " -o, --output FILE Output environment file (default: .env)"
echo " --dry-run Show configuration without applying"
echo ""
echo "Examples:"
echo " $0 Interactive configuration"
echo " $0 --minimal Minimal setup"
echo " $0 --tls --auth Enable TLS and auth only"
echo " $0 --non-interactive Use defaults non-interactively"
}
# Function to ask yes/no question
ask_yes_no() {
local question="$1"
local default="$2"
local response
if [ "$INTERACTIVE" = false ]; then
return $default
fi
while true; do
if [ "$default" = "0" ]; then
printf "${BLUE}${question} [Y/n]: ${NC}"
else
printf "${BLUE}${question} [y/N]: ${NC}"
fi
read -r response
case "$response" in
[Yy]|[Yy][Ee][Ss]) return 0 ;;
[Nn]|[Nn][Oo]) return 1 ;;
"") return $default ;;
*) echo "Please answer yes or no." ;;
esac
done
}
# Function to get input with default
get_input() {
local prompt="$1"
local default="$2"
local response
if [ "$INTERACTIVE" = false ]; then
echo "$default"
return
fi
printf "${BLUE}${prompt} [${default}]: ${NC}"
read -r response
if [ -z "$response" ]; then
echo "$default"
else
echo "$response"
fi
}
# Function to generate .env file
generate_env_file() {
local file="$1"
print_color "$GREEN" "Generating environment configuration in $file..."
cat > "$file" << EOF
# Rustelo Configuration
# Generated by configure-features.sh on $(date)
# Server Configuration
SERVER_HOST=127.0.0.1
SERVER_PORT=3030
SERVER_PROTOCOL=$(if [ "$ENABLE_TLS" = true ]; then echo "https"; else echo "http"; fi)
ENVIRONMENT=DEV
LOG_LEVEL=info
EOF
if [ "$ENABLE_TLS" = true ]; then
cat >> "$file" << EOF
# TLS Configuration
TLS_CERT_PATH=./certs/cert.pem
TLS_KEY_PATH=./certs/key.pem
EOF
fi
if [ "$ENABLE_AUTH" = true ] || [ "$ENABLE_CONTENT_DB" = true ]; then
cat >> "$file" << EOF
# Database Configuration
DATABASE_URL=postgres://username:password@localhost:5432/rustelo_dev
EOF
fi
if [ "$ENABLE_AUTH" = true ]; then
cat >> "$file" << EOF
# Authentication Configuration
JWT_SECRET=your-super-secret-jwt-key-change-this-in-production
JWT_EXPIRATION_HOURS=24
# OAuth Providers (optional)
# GOOGLE_CLIENT_ID=your-google-client-id
# GOOGLE_CLIENT_SECRET=your-google-client-secret
# GITHUB_CLIENT_ID=your-github-client-id
# GITHUB_CLIENT_SECRET=your-github-client-secret
# 2FA Configuration
TOTP_ISSUER=Rustelo
TOTP_SERVICE_NAME=Rustelo Authentication
EOF
fi
if [ "$ENABLE_CONTENT_DB" = true ]; then
cat >> "$file" << EOF
# Content Management Configuration
CONTENT_CACHE_ENABLED=true
CONTENT_CACHE_TTL=3600
EOF
fi
}
# Function to generate build command
get_build_command() {
local features=""
local feature_list=()
if [ "$ENABLE_TLS" = true ]; then
feature_list+=("tls")
fi
if [ "$ENABLE_AUTH" = true ]; then
feature_list+=("auth")
fi
if [ "$ENABLE_CONTENT_DB" = true ]; then
feature_list+=("content-db")
fi
if [ ${#feature_list[@]} -eq 0 ]; then
features="--no-default-features"
else
features="--features $(IFS=,; echo "${feature_list[*]}")"
fi
local build_cmd="cargo build"
if [ "$BUILD_TYPE" = "release" ]; then
build_cmd="cargo build --release"
fi
echo "$build_cmd $features"
}
# Function to show configuration summary
show_summary() {
print_color "$BLUE" "Configuration Summary:"
echo "========================"
echo "TLS Support: $(if [ "$ENABLE_TLS" = true ]; then echo "✓ Enabled"; else echo "✗ Disabled"; fi)"
echo "Authentication: $(if [ "$ENABLE_AUTH" = true ]; then echo "✓ Enabled"; else echo "✗ Disabled"; fi)"
echo "Database Content: $(if [ "$ENABLE_CONTENT_DB" = true ]; then echo "✓ Enabled"; else echo "✗ Disabled"; fi)"
echo "Build Type: $BUILD_TYPE"
echo "Output File: $OUTPUT_FILE"
echo ""
echo "Build Command: $(get_build_command)"
echo "========================"
}
# Function to interactive configuration
interactive_config() {
print_color "$GREEN" "Rustelo Feature Configuration"
print_color "$BLUE" "================================"
echo "This script will help you configure optional features for your Rustelo application."
echo ""
# TLS Configuration
if ask_yes_no "Enable TLS/HTTPS support?" 1; then
ENABLE_TLS=true
print_color "$YELLOW" "Note: You'll need to provide TLS certificates for HTTPS."
fi
# Authentication Configuration
if ask_yes_no "Enable authentication system (JWT, OAuth, 2FA)?" 0; then
ENABLE_AUTH=true
print_color "$YELLOW" "Note: Authentication requires database connection."
else
ENABLE_AUTH=false
fi
# Content Database Configuration
if ask_yes_no "Enable database-driven content management?" 0; then
ENABLE_CONTENT_DB=true
print_color "$YELLOW" "Note: Database content requires database connection."
else
ENABLE_CONTENT_DB=false
fi
# Build type
if ask_yes_no "Build in release mode?" 1; then
BUILD_TYPE="release"
else
BUILD_TYPE="debug"
fi
# Output file
OUTPUT_FILE=$(get_input "Environment file location" ".env")
}
# Function to validate configuration
validate_config() {
local errors=()
# Check if we need database but don't have any features that require it
if [ "$ENABLE_AUTH" = false ] && [ "$ENABLE_CONTENT_DB" = false ]; then
print_color "$YELLOW" "Warning: No database features enabled. Database won't be used."
fi
# Check for TLS requirements
if [ "$ENABLE_TLS" = true ]; then
if [ ! -d "certs" ]; then
print_color "$YELLOW" "Warning: TLS enabled but 'certs' directory not found."
print_color "$YELLOW" "You'll need to create certificates before running with HTTPS."
fi
fi
if [ ${#errors[@]} -gt 0 ]; then
print_color "$RED" "Configuration errors:"
for error in "${errors[@]}"; do
echo " - $error"
done
return 1
fi
return 0
}
# Function to create sample certificates
create_sample_certs() {
if [ "$ENABLE_TLS" = true ] && [ ! -d "certs" ]; then
if ask_yes_no "Create sample self-signed certificates for development?" 0; then
print_color "$BLUE" "Creating sample certificates..."
mkdir -p certs
# Generate self-signed certificate
openssl req -x509 -newkey rsa:4096 -keyout certs/key.pem -out certs/cert.pem \
-days 365 -nodes -subj "/CN=localhost" 2>/dev/null
if [ $? -eq 0 ]; then
print_color "$GREEN" "Sample certificates created in certs/ directory."
print_color "$YELLOW" "Warning: These are self-signed certificates for development only!"
else
print_color "$RED" "Failed to create certificates. Please install OpenSSL."
fi
fi
fi
}
# Main function
main() {
# Parse command line arguments
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
show_usage
exit 0
;;
-i|--interactive)
INTERACTIVE=true
shift
;;
-n|--non-interactive)
INTERACTIVE=false
shift
;;
-t|--tls)
ENABLE_TLS=true
shift
;;
-a|--auth)
ENABLE_AUTH=true
shift
;;
-c|--content-db)
ENABLE_CONTENT_DB=true
shift
;;
--no-auth)
ENABLE_AUTH=false
shift
;;
--no-content-db)
ENABLE_CONTENT_DB=false
shift
;;
--minimal)
ENABLE_TLS=false
ENABLE_AUTH=false
ENABLE_CONTENT_DB=false
shift
;;
--build-release)
BUILD_TYPE="release"
shift
;;
--build-debug)
BUILD_TYPE="debug"
shift
;;
-o|--output)
OUTPUT_FILE="$2"
shift 2
;;
--dry-run)
DRY_RUN=true
shift
;;
*)
print_color "$RED" "Unknown option: $1"
show_usage
exit 1
;;
esac
done
# Run interactive configuration if enabled
if [ "$INTERACTIVE" = true ]; then
interactive_config
fi
# Validate configuration
if ! validate_config; then
exit 1
fi
# Show summary
show_summary
# Generate configuration if not dry run
if [ "$DRY_RUN" != true ]; then
if [ "$INTERACTIVE" = true ]; then
if ! ask_yes_no "Apply this configuration?" 0; then
print_color "$YELLOW" "Configuration cancelled."
exit 0
fi
fi
generate_env_file "$OUTPUT_FILE"
create_sample_certs
print_color "$GREEN" "Configuration complete!"
print_color "$BLUE" "Next steps:"
echo "1. Review the generated $OUTPUT_FILE file"
echo "2. Update database connection if needed"
echo "3. Configure OAuth providers if using authentication"
echo "4. Run: $(get_build_command)"
echo "5. Start the server: cargo run"
else
print_color "$BLUE" "Dry run mode - no files were modified."
fi
}
# Run main function
main "$@"