#!/bin/bash MySQL Root Password Reset and Admin User Creation Script For Calendar Application Database Setup
echo "==========================================" echo "MySQL Root Password Reset & User Creation" echo "=========================================="
# Colors for output
RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color
# Function to print colored output
print_status() { echo -e "${BLUE}[INFO]${NC} $1"
}
print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"
}
print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"
}
print_error() { echo -e "${RED}[ERROR]${NC} $1"
}
# Check if running as root or with sudo
if [[ $EUID -ne 0 ]]; then print_error "This script must be run as root or with sudo" echo "Usage: sudo bash fix_mysql.sh" exit 1 fi
# Configuration
NEW_ROOT_PASSWORD="MyNewRootPassword123" ADMIN_USER="admin" ADMIN_PASSWORD="Login123" DATABASE_NAME="tenis" MYSQL_DATA_DIR="/var/lib/mysql" 
MYSQL_BACKUP_DIR="/var/lib/mysql_backup_$(date +%Y%m%d_%H%M%S)" print_status "Starting MySQL recovery process..."
# Function to backup MySQL data
backup_mysql_data() { print_status "Creating backup of MySQL data directory..." if [ -d "$MYSQL_DATA_DIR" ] && [ "$(ls -A $MYSQL_DATA_DIR)" ]; then mkdir -p 
        "$MYSQL_BACKUP_DIR" cp -r "$MYSQL_DATA_DIR"/* "$MYSQL_BACKUP_DIR/" print_success "Backup created at: $MYSQL_BACKUP_DIR"
    else print_warning "MySQL data directory is empty or doesn't exist, skipping backup" fi
}
# Function to stop MySQL
stop_mysql() { print_status "Stopping MySQL service..." systemctl stop mysql 2>/dev/null || systemctl stop mysqld 2>/dev/null sleep 2
    
    # Kill any remaining MySQL processes
    pkill -f mysqld 2>/dev/null sleep 1
    
    print_success "MySQL service stopped"
}
# Function to start MySQL in safe mode
start_mysql_safe_mode() { print_status "Starting MySQL in safe mode..."
    
    # Start MySQL in safe mode
    mysqld_safe --skip-grant-tables --skip-networking & MYSQL_PID=$!
    
    # Wait for MySQL to start
    sleep 5
    
    # Check if MySQL is running
    if ps -p $MYSQL_PID > /dev/null; then print_success "MySQL started in safe mode (PID: $MYSQL_PID)" return 0 else print_error "Failed to start MySQL in safe mode" return 1 
    fi
}
# Function to reset root password
reset_root_password() { print_status "Resetting root password..."
    
    # Create SQL commands file
    cat > /tmp/reset_password.sql << EOF USE mysql; UPDATE user SET authentication_string=PASSWORD('$NEW_ROOT_PASSWORD') WHERE User='root'; FLUSH PRIVILEGES; EXIT; EOF
    
    # Execute SQL commands
    mysql -u root < /tmp/reset_password.sql
    
    if [ $? -eq 0 ]; then print_success "Root password reset successfully" rm -f /tmp/reset_password.sql return 0 else print_error "Failed to reset root password" rm -f 
        /tmp/reset_password.sql return 1
    fi
}
# Function to stop safe mode and restart MySQL normally
restart_mysql_normal() { print_status "Stopping safe mode and restarting MySQL normally..."
    
    # Kill MySQL safe mode process
    pkill -f mysqld_safe pkill -f mysqld sleep 3
    
    # Start MySQL normally
    systemctl start mysql 2>/dev/null || systemctl start mysqld 2>/dev/null sleep 3
    
    # Check if MySQL is running
    if systemctl is-active --quiet mysql 2>/dev/null || systemctl is-active --quiet mysqld 2>/dev/null; then print_success "MySQL restarted normally" return 0 else print_error 
        "Failed to restart MySQL normally" return 1
    fi
}
# Function to create admin user and database
create_admin_user() { print_status "Creating admin user and database..."
    
    # Create SQL commands file
    cat > /tmp/create_admin.sql << EOF CREATE USER IF NOT EXISTS '$ADMIN_USER'@'localhost' IDENTIFIED BY '$ADMIN_PASSWORD'; CREATE DATABASE IF NOT EXISTS $DATABASE_NAME; GRANT 
ALL PRIVILEGES ON $DATABASE_NAME.* TO '$ADMIN_USER'@'localhost'; GRANT CREATE ON *.* TO '$ADMIN_USER'@'localhost'; FLUSH PRIVILEGES; EXIT; EOF
    
    # Execute SQL commands
    mysql -u root -p"$NEW_ROOT_PASSWORD" < /tmp/create_admin.sql
    
    if [ $? -eq 0 ]; then print_success "Admin user and database created successfully" rm -f /tmp/create_admin.sql return 0 else print_error "Failed to create admin user and 
        database" rm -f /tmp/create_admin.sql return 1
    fi
}
# Function to test admin user connection
test_admin_connection() { print_status "Testing admin user connection..."
    
    # Create test SQL file
    cat > /tmp/test_connection.sql << EOF USE $DATABASE_NAME; SHOW TABLES; EXIT; EOF
    
    # Test connection
    mysql -u "$ADMIN_USER" -p"$ADMIN_PASSWORD" < /tmp/test_connection.sql
    
    if [ $? -eq 0 ]; then print_success "Admin user connection test successful" rm -f /tmp/test_connection.sql return 0 else print_error "Admin user connection test failed" rm 
        -f /tmp/test_connection.sql return 1
    fi
}
# Function to completely reset MySQL (if safe mode fails)
complete_mysql_reset() { print_status "Performing complete MySQL reset..."
    
    # Stop MySQL
    stop_mysql
    
    # Remove MySQL data directory
    if [ -d "$MYSQL_DATA_DIR" ]; then print_status "Removing MySQL data directory..." rm -rf "$MYSQL_DATA_DIR"/* fi
    
    # Reinitialize MySQL
    print_status "Reinitializing MySQL..." mysql_install_db --user=mysql --basedir=/usr --datadir="$MYSQL_DATA_DIR"
    
    if [ $? -eq 0 ]; then print_success "MySQL reinitialized successfully"
        
        # Start MySQL
        systemctl start mysql 2>/dev/null || systemctl start mysqld 2>/dev/null sleep 3
        
        # Secure MySQL installation
        print_status "Securing MySQL installation..." mysql_secure_installation else print_error "Failed to reinitialize MySQL" return 1 fi
}
# Main execution
main() { echo "" print_status "Step 1: Creating backup..." backup_mysql_data
    
    echo "" print_status "Step 2: Stopping MySQL..." stop_mysql
    
    echo "" print_status "Step 3: Attempting safe mode password reset..."
    
    if start_mysql_safe_mode; then if reset_root_password; then restart_mysql_normal
            
            echo "" print_status "Step 4: Creating admin user..." if create_admin_user; then echo "" print_status "Step 5: Testing connection..." test_admin_connection
                
                echo "" print_success "Setup completed successfully!" echo "" echo "==========================================" echo "Final Configuration:" echo 
                "==========================================" echo "Root Password: $NEW_ROOT_PASSWORD" echo "Admin Username: $ADMIN_USER" echo "Admin Password: $ADMIN_PASSWORD" 
                echo "Database: $DATABASE_NAME" echo "Host: localhost" echo "" echo "You can now use your calendar application!" echo 
                "=========================================="
            else print_error "Failed to create admin user" exit 1 fi else print_error "Failed to reset root password" echo "" print_warning "Attempting complete MySQL 
            reset..." complete_mysql_reset
        fi else print_error "Safe mode failed, attempting complete reset..." complete_mysql_reset fi
}
# Run main function
main echo ""
print_status "Script execution completed!"
