#!/bin/bash #-----------------------------------# # VARIABLES # #-----------------------------------# this_script_url="https://git.hhf.technology/hhf/script-management-cloudpanel/raw/branch/main/backup/wp_backup.sh" this_script_name="WordPress Backup Script" formatter_url="https://git.hhf.technology/hhf/TaskFormatter/raw/branch/main/bash_task_formatter/task_formatter.sh" scriptname=$0 # Initialize success flag success=0 # Determine the user (use the first argument if provided, otherwise fallback) USER_TO_RUN_AS="${1:-$SUDO_USER}" USER_HOME=$(eval echo ~$USER_TO_RUN_AS) #-----------------------------------# # FORMATTER # #-----------------------------------# # Download and source the formatter with error handling download_formatter() { if [ ! -f "task_formatter.sh" ]; then if ! wget "$formatter_url" --no-check-certificate -O task_formatter.sh > /dev/null 2>&1; then echo "Error: Failed to download task_formatter.sh" exit 1 fi fi if [ ! -f "task_formatter.sh" ]; then echo "Error: task_formatter.sh not found after download attempt" exit 1 fi chmod +x task_formatter.sh source ./task_formatter.sh || { echo "Error: Failed to source task_formatter.sh"; exit 1; } if ! declare -f print_header > /dev/null; then echo "Error: print_header function not found after sourcing." exit 1 fi } # Call the download_formatter function download_formatter #-----------------------------------# # FUNCTIONS # #-----------------------------------# # Function to collect WordPress and backup variables collect_variables() { # Clear any existing values unset DATABASE WP_DIR SCRIPTS_DIR S3_BUCKET_NAME S3_FOLDER_NAME echo "Please provide the following information:" echo "----------------------------------------" # Database name echo -n "Enter database name: " read -r DATABASE echo "Received database name: $DATABASE" # WordPress directory echo -n "Enter WordPress installation path (e.g., /home/username/htdocs/domain.com): " read -r WP_DIR echo "Received WordPress path: $WP_DIR" # Derive WordPress content directories UPLOADS_DIR="${WP_DIR}/wp-content/uploads" THEMES_DIR="${WP_DIR}/wp-content/themes" PLUGINS_DIR="${WP_DIR}/wp-content/plugins" WPCONTENT_DIR="${WP_DIR}/wp-content" echo -e "\nBackup Locations:" echo -n "Enter scripts directory path (e.g., /home/username/scripts): " read -r SCRIPTS_DIR echo "Received scripts path: $SCRIPTS_DIR" # Backup directory BACKUP_DIR="${SCRIPTS_DIR}/backups" echo "Backup directory will be: ${BACKUP_DIR}" echo -e "\nS3 Configuration:" # S3cmd path S3_CMD="/usr/local/bin/s3cmd" if [ ! -f "$S3_CMD" ]; then echo -n "s3cmd not found at default location. Enter s3cmd path: " read -r S3_CMD echo "Received s3cmd path: $S3_CMD" fi # S3 bucket information echo -n "Enter S3 bucket name (e.g., my-bucket): " read -r S3_BUCKET_NAME echo "Received bucket name: $S3_BUCKET_NAME" echo -n "Enter S3 folder name (e.g., backups): " read -r S3_FOLDER_NAME echo "Received folder name: $S3_FOLDER_NAME" S3_BUCKET="s3://${S3_BUCKET_NAME}/${S3_FOLDER_NAME}/" # Current date for backup naming CURRENT_DATE=$(date +"%Y-%m-%d") # Display collected information echo -e "\nSummary of collected information:" echo "----------------------------------------" echo "Database Name: $DATABASE" echo "WordPress Directory: $WP_DIR" echo "Scripts Directory: $SCRIPTS_DIR" echo "Backup Directory: $BACKUP_DIR" echo "S3 Bucket Path: $S3_BUCKET" # Confirm information echo -n "Is this information correct? (y/n): " read -r confirm if [[ $confirm != [Yy]* ]]; then echo "Please run the script again with correct information." return 1 fi # Export variables so they're available to other functions export DATABASE WP_DIR UPLOADS_DIR THEMES_DIR PLUGINS_DIR WPCONTENT_DIR export BACKUP_DIR SCRIPTS_DIR CURRENT_DATE S3_CMD S3_BUCKET return 0 } # Current date for backup naming CURRENT_DATE=$(date +"%Y-%m-%d") # Display collected information echo -e "\nSummary of collected information:" echo "----------------------------------------" echo "Database Name: $DATABASE" echo "WordPress Directory: $WP_DIR" echo "Scripts Directory: $SCRIPTS_DIR" echo "Backup Directory: $BACKUP_DIR" echo "S3 Bucket Path: $S3_BUCKET" # Confirm information read -p "Is this information correct? (y/n): " confirm if [[ $confirm != [Yy]* ]]; then echo "Please run the script again with correct information." return 1 fi return 0 } # Function to check WordPress installation check_wordpress() { if [ ! -d "${WP_DIR}" ]; then echo "Directory ${WP_DIR} does not exist" return 1 fi if [ ! -f "${WP_DIR}/wp-config.php" ]; then echo "No wp-config.php in ${WP_DIR}" return 1 fi echo "Found wp-config.php in ${WP_DIR}" return 0 } # Function to prepare backup directory prepare_backup_dir() { mkdir -p "$BACKUP_DIR" rm -rf "${BACKUP_DIR:?}/*" echo "Created and cleaned ${BACKUP_DIR}" return 0 } # Function to backup database backup_database() { echo "Creating Database dump..." if ! clpctl db:export --databaseName="${DATABASE}" --file="$BACKUP_DIR/${DATABASE}.sql.gz"; then echo "Database backup failed" return 1 fi echo "Database dump created at ${BACKUP_DIR}/${DATABASE}.sql.gz" return 0 } # Function to backup WordPress files backup_wordpress_files() { echo "Creating WordPress file backups..." # Backup WordPress core files tar -cjf "${BACKUP_DIR}/wp_files.tar.bz2" --exclude='wp-content' "${WP_DIR}" # Backup wp-content excluding specific directories tar -cjf "${BACKUP_DIR}/others.tar.bz2" \ --exclude='themes' --exclude='plugins' --exclude='uploads' \ --exclude='cache' --exclude='updraft' --exclude='backups-dup-pro' \ --exclude='backups-dup' --exclude='ai1wm-backups' "${WPCONTENT_DIR}" # Backup specific directories tar -cjf "${BACKUP_DIR}/uploads.tar.bz2" "${UPLOADS_DIR}" tar -cjf "${BACKUP_DIR}/themes.tar.bz2" "${THEMES_DIR}" tar -cjf "${BACKUP_DIR}/plugins.tar.bz2" "${PLUGINS_DIR}" return 0 } # Function to upload to S3 upload_to_s3() { mv "${BACKUP_DIR}" "${SCRIPTS_DIR}/${CURRENT_DATE}" echo "Uploading backup to S3..." if ! $S3_CMD sync "${SCRIPTS_DIR}/${CURRENT_DATE}" "${S3_BUCKET}"; then echo "S3 upload failed" return 1 fi return 0 } # Function to clean up cleanup() { echo "Removing local files..." rm -rf "${SCRIPTS_DIR:?}/${CURRENT_DATE}" return 0 } #-----------------------------------# # MAIN LOGIC # #-----------------------------------# # Check if print_header function exists if ! command -v print_header >/dev/null 2>&1; then echo "Error: print_header function not found. Formatter may not be properly sourced." exit 1 fi # Print header print_header "$this_script_name" "$this_script_url" echo -e "Running as User: $USER_TO_RUN_AS\nUser Home: $USER_HOME\n" # Collect variables from user if ! format_output collect_variables "Collecting Configuration Information"; then success=1 exit $success fi # Run the backup functions with formatted output if ! format_output check_wordpress "Checking WordPress Installation"; then success=1 exit $success fi if ! format_output prepare_backup_dir "Preparing Backup Directory"; then success=1 exit $success fi if ! format_output backup_database "Backing up Database"; then success=1 exit $success fi if ! format_output backup_wordpress_files "Backing up WordPress Files"; then success=1 exit $success fi if ! format_output upload_to_s3 "Uploading to S3"; then success=1 exit $success fi if ! format_output cleanup "Cleaning up temporary files"; then success=1 exit $success fi # Print final message final_message "$this_script_name" "$success" # Exit with appropriate status exit $success