Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
229 changes: 206 additions & 23 deletions generate_config.sh
Original file line number Diff line number Diff line change
@@ -1,41 +1,180 @@
#!/bin/bash

# Prompt user for environment choice
# Enable strict mode for better error handling
set -euo pipefail
IFS=$'\n\t'

# Function to validate non-empty input
validate_input() {
if [ -z "$1" ]; then
echo "Error: $2 cannot be empty. Exiting." >&2
exit 1
fi
}

# Function to validate numeric input
validate_numeric_input() {
if ! [[ "$1" =~ ^[0-9]+$ ]]; then
echo "Error: $2 must be a valid number. Exiting." >&2
exit 1
fi
}

# Function to log messages
log() {
echo "[INFO] $1"
}

# Prompt user for environment choice first
log "Prompting for environment choice..."
echo "Choose the environment to run the application:"
echo "1. Docker"
echo "2. Bare Metal"
read -p "Enter your choice (1 or 2): " choice

# Prompt user for configuration values
read -p "Enter MongoDB Database Name: " MONGO_DB_NAME
read -p "Enter Secret Key (at least 32 characters): " SECRET_KEY
read -p "Enter JWT Expiry (e.g., 1h): " JWT_EXPIRY
read -p "Enter JWT Refresh Expiry (e.g., 7d): " JWT_REFRESH_EXPIRY
read -p "Enter Mail Default Sender (e.g., noreply@example.com): " MAIL_DEFAULT_SENDER
read -p "Enter Mail Sender Name: " MAIL_SENDER_NAME
read -p "Enter MT API Key (if any, leave blank if not applicable): " MT_API

# Set default values
MONGO_URL="mongodb://127.0.0.1:27017"
REDIS_HOST="127.0.0.1"
REDIS_PORT="6379"
REDIS_DB="0"
REDIS_STORAGE_URI="redis://127.0.0.1:6379/0"
if [[ "$choice" != "1" && "$choice" != "2" ]]; then
echo "Invalid choice. Exiting." >&2
exit 1
fi

# Adjust values based on the environment
# Adjust default values based on the environment
if [ "$choice" -eq 1 ]; then
echo "Configuring for Docker environment..."
log "Configuring for Docker environment..."
MONGO_URL="mongodb://mongo:27017"
REDIS_HOST="redis"
REDIS_STORAGE_URI="redis://redis:6379/0"
elif [ "$choice" -eq 2 ]; then
echo "Configuring for Bare Metal environment..."
else
echo "Invalid choice. Exiting."
exit 1
log "Configuring for Bare Metal environment..."
MONGO_URL="mongodb://127.0.0.1:27017"
REDIS_HOST="127.0.0.1"
REDIS_STORAGE_URI="redis://127.0.0.1:6379/0"
fi

# Check if environment variables are already defined
log "Checking for existing environment variables..."
if [ -n "${MONGO_URL:-}" ] || [ -n "${MONGO_DB_NAME:-}" ] || [ -n "${SECRET_KEY:-}" ] || [ -n "${JWT_EXPIRY:-}" ] || [ -n "${JWT_REFRESH_EXPIRY:-}" ] || [ -n "${MT_API:-}" ] || [ -n "${REDIS_HOST:-}" ] || [ -n "${REDIS_PORT:-}" ] || [ -n "${REDIS_DB:-}" ] || [ -n "${REDIS_STORAGE_URI:-}" ] || [ -n "${MAIL_DEFAULT_SENDER:-}" ] || [ -n "${MAIL_SENDER_NAME:-}" ]; then
log "Some environment variables are already defined."
read -p "Do you want to load values from the environment? (y/n): " load_from_env
if [[ "$load_from_env" == "y" || "$load_from_env" == "Y" ]]; then
log "Loading values from the environment..."
MONGO_URL=${MONGO_URL:-""}
MONGO_DB_NAME=${MONGO_DB_NAME:-""}
SECRET_KEY=${SECRET_KEY:-""}
JWT_EXPIRY=${JWT_EXPIRY:-""}
JWT_REFRESH_EXPIRY=${JWT_REFRESH_EXPIRY:-""}
MT_API=${MT_API:-""}
REDIS_HOST=${REDIS_HOST:-""}
REDIS_PORT=${REDIS_PORT:-""}
REDIS_DB=${REDIS_DB:-""}
REDIS_STORAGE_URI=${REDIS_STORAGE_URI:-""}
MAIL_DEFAULT_SENDER=${MAIL_DEFAULT_SENDER:-""}
MAIL_SENDER_NAME=${MAIL_SENDER_NAME:-""}
else
log "Proceeding with manual input..."
fi
fi

# Prompt user for undefined configuration values with defaults
if [ -z "${MONGO_URL:-}" ]; then
read -p "Enter MongoDB URL [Default: mongodb://127.0.0.1:27017]: " MONGO_URL
MONGO_URL=${MONGO_URL:-"mongodb://127.0.0.1:27017"}
validate_input "$MONGO_URL" "MongoDB URL"
fi
if [ -z "${MONGO_DB_NAME:-}" ]; then
read -p "Enter MongoDB Database Name [Default: app_db]: " MONGO_DB_NAME
MONGO_DB_NAME=${MONGO_DB_NAME:-"app_db"}
validate_input "$MONGO_DB_NAME" "MongoDB Database Name"
fi
if [ -z "${SECRET_KEY:-}" ]; then
read -p "Enter Secret Key (at least 32 characters) [Default: auto-generated]: " SECRET_KEY
SECRET_KEY=${SECRET_KEY:-$(openssl rand -base64 32)}
validate_input "$SECRET_KEY" "Secret Key"
if [ ${#SECRET_KEY} -lt 32 ]; then
echo "Error: Secret Key must be at least 32 characters. Exiting." >&2
exit 1
fi
fi
if [ -z "${JWT_EXPIRY:-}" ]; then
read -p "Enter JWT Expiry (e.g., 1h) [Default: 1h]: " JWT_EXPIRY
JWT_EXPIRY=${JWT_EXPIRY:-"1h"}
validate_input "$JWT_EXPIRY" "JWT Expiry"
fi
if [ -z "${JWT_REFRESH_EXPIRY:-}" ]; then
read -p "Enter JWT Refresh Expiry (e.g., 7d) [Default: 7d]: " JWT_REFRESH_EXPIRY
JWT_REFRESH_EXPIRY=${JWT_REFRESH_EXPIRY:-"7d"}
validate_input "$JWT_REFRESH_EXPIRY" "JWT Refresh Expiry"
fi
if [ -z "${MT_API:-}" ]; then
read -p "Enter MT API Key [Default: none]: " MT_API
MT_API=${MT_API:-""}
validate_input "$MT_API" "MT API Key"
fi
if [ -z "${REDIS_HOST:-}" ]; then
read -p "Enter Redis Host [Default: 127.0.0.1]: " REDIS_HOST
REDIS_HOST=${REDIS_HOST:-"127.0.0.1"}
validate_input "$REDIS_HOST" "Redis Host"
fi
if [ -z "${REDIS_PORT:-}" ]; then
read -p "Enter Redis Port [Default: 6379]: " REDIS_PORT
REDIS_PORT=${REDIS_PORT:-"6379"}
validate_numeric_input "$REDIS_PORT" "Redis Port"
fi
if [ -z "${REDIS_DB:-}" ]; then
read -p "Enter Redis DB [Default: 0]: " REDIS_DB
REDIS_DB=${REDIS_DB:-"0"}
validate_numeric_input "$REDIS_DB" "Redis DB"
fi
if [ -z "${REDIS_STORAGE_URI:-}" ]; then
read -p "Enter Redis Storage URI [Default: redis://127.0.0.1:6379/0]: " REDIS_STORAGE_URI
REDIS_STORAGE_URI=${REDIS_STORAGE_URI:-"redis://127.0.0.1:6379/0"}
validate_input "$REDIS_STORAGE_URI" "Redis Storage URI"
fi
if [ -z "${MAIL_DEFAULT_SENDER:-}" ]; then
read -p "Enter Mail Default Sender (e.g., noreply@example.com) [Default: noreply@example.com]: " MAIL_DEFAULT_SENDER
MAIL_DEFAULT_SENDER=${MAIL_DEFAULT_SENDER:-"noreply@example.com"}
validate_input "$MAIL_DEFAULT_SENDER" "Mail Default Sender"
fi
if [ -z "${MAIL_SENDER_NAME:-}" ]; then
read -p "Enter Mail Sender Name [Default: App Mailer]: " MAIL_SENDER_NAME
MAIL_SENDER_NAME=${MAIL_SENDER_NAME:-"App Mailer"}
validate_input "$MAIL_SENDER_NAME" "Mail Sender Name"
fi

# Set default values
MONGO_URL=${MONGO_URL:-"mongodb://127.0.0.1:27017"}
REDIS_HOST=${REDIS_HOST:-"127.0.0.1"}
REDIS_PORT=${REDIS_PORT:-"6379"}
REDIS_DB=${REDIS_DB:-"0"}
REDIS_STORAGE_URI=${REDIS_STORAGE_URI:-"redis://127.0.0.1:6379/0"}

# Export configuration values as environment variables
log "Exporting configuration values as environment variables..."
export MONGO_URL="$MONGO_URL"
export MONGO_DB_NAME="$MONGO_DB_NAME"
export SECRET_KEY="$SECRET_KEY"
export JWT_EXPIRY="$JWT_EXPIRY"
export JWT_REFRESH_EXPIRY="$JWT_REFRESH_EXPIRY"
export MT_API="$MT_API"
export REDIS_HOST="$REDIS_HOST"
export REDIS_PORT="$REDIS_PORT"
export REDIS_DB="$REDIS_DB"
export REDIS_STORAGE_URI="$REDIS_STORAGE_URI"
export MAIL_DEFAULT_SENDER="$MAIL_DEFAULT_SENDER"
export MAIL_SENDER_NAME="$MAIL_SENDER_NAME"

# Backup existing .sbd_config.json if it exists
if [ -f .sbd_config.json ]; then
log "Backing up existing .sbd_config.json..."
cp .sbd_config.json .sbd_config.json.bak
if [ $? -ne 0 ]; then
echo "Error: Failed to backup existing .sbd_config.json. Exiting." >&2
exit 1
fi
log "Backup created: .sbd_config.json.bak"
fi

# Generate .sbd_config.json
log "Generating .sbd_config.json..."
cat <<EOL > .sbd_config.json
{
"MONGO_URL": "$MONGO_URL",
Expand All @@ -53,4 +192,48 @@ cat <<EOL > .sbd_config.json
}
EOL

echo ".sbd_config.json has been generated successfully."
if [ $? -ne 0 ]; then
echo "Error: Failed to write .sbd_config.json. Exiting." >&2
exit 1
fi

log ".sbd_config.json has been generated successfully."

# Make environment variables persistent
PROFILE_FILE="$HOME/.bashrc"
if [ -n "$ZSH_VERSION" ]; then
PROFILE_FILE="$HOME/.zshrc"
fi

log "Making environment variables persistent in $PROFILE_FILE..."
cat <<EOL >> $PROFILE_FILE
# Exported by generate_config.sh
export MONGO_URL="$MONGO_URL"
export MONGO_DB_NAME="$MONGO_DB_NAME"
export SECRET_KEY="$SECRET_KEY"
export JWT_EXPIRY="$JWT_EXPIRY"
export JWT_REFRESH_EXPIRY="$JWT_REFRESH_EXPIRY"
export MT_API="$MT_API"
export REDIS_HOST="$REDIS_HOST"
export REDIS_PORT="$REDIS_PORT"
export REDIS_DB="$REDIS_DB"
export REDIS_STORAGE_URI="$REDIS_STORAGE_URI"
export MAIL_DEFAULT_SENDER="$MAIL_DEFAULT_SENDER"
export MAIL_SENDER_NAME="$MAIL_SENDER_NAME"
EOL

if [ $? -ne 0 ]; then
echo "Error: Failed to update $PROFILE_FILE. Exiting." >&2
exit 1
fi

# Source the updated profile file to apply changes immediately
log "Sourcing $PROFILE_FILE to apply changes..."
source $PROFILE_FILE

if [ $? -ne 0 ]; then
echo "Error: Failed to source $PROFILE_FILE. Please source it manually by running 'source $PROFILE_FILE'." >&2
exit 1
fi

log "Environment variables have been applied successfully."