408 lines
11 KiB
Bash
408 lines
11 KiB
Bash
![]() |
#!/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 "$@"
|