Implement batch operations to select and optimize multiple domains at once
- Add batch operation option to Option 4 - Allow user to select single domain or multiple domains - Display optimization status [NEEDS OPTIMIZATION] or [OK] for each domain - Support 'all' selection or individual number selection - Optimizes selected domains in sequence - Shows progress and summary of batch operation - Includes simplified per-domain optimization for batch mode - Provides fallback if recommendations can't be calculated Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -309,6 +309,37 @@ quick_health_check() {
|
|||||||
optimize_domain() {
|
optimize_domain() {
|
||||||
show_banner
|
show_banner
|
||||||
|
|
||||||
|
cecho "${WHITE}${BOLD}DOMAIN OPTIMIZATION${NC}"
|
||||||
|
echo ""
|
||||||
|
cecho " ${GREEN}s${NC}) Optimize single domain"
|
||||||
|
cecho " ${GREEN}m${NC}) Optimize multiple domains (batch)"
|
||||||
|
cecho " ${RED}q${NC}) Cancel"
|
||||||
|
echo ""
|
||||||
|
cecho "${CYAN}─────────────────────────────────────────────────────────────────────${NC}"
|
||||||
|
|
||||||
|
read -p "Select option: " batch_choice
|
||||||
|
|
||||||
|
case "${batch_choice,,}" in
|
||||||
|
s)
|
||||||
|
optimize_single_domain_wrapper
|
||||||
|
;;
|
||||||
|
m)
|
||||||
|
optimize_multiple_domains_wrapper
|
||||||
|
;;
|
||||||
|
q)
|
||||||
|
return
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
cecho "${RED}Invalid selection${NC}"
|
||||||
|
read -p "Press Enter to continue..."
|
||||||
|
return
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
optimize_single_domain_wrapper() {
|
||||||
|
show_banner
|
||||||
|
|
||||||
local selection
|
local selection
|
||||||
selection=$(select_domain "optimize")
|
selection=$(select_domain "optimize")
|
||||||
|
|
||||||
@@ -770,6 +801,207 @@ optimize_domain() {
|
|||||||
read -p "Press Enter to continue..."
|
read -p "Press Enter to continue..."
|
||||||
}
|
}
|
||||||
|
|
||||||
|
optimize_multiple_domains_wrapper() {
|
||||||
|
show_banner
|
||||||
|
cecho "${WHITE}${BOLD}SELECT DOMAINS TO OPTIMIZE${NC}"
|
||||||
|
echo ""
|
||||||
|
cecho "${YELLOW}Batch operation: Optimize multiple domains in sequence${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Get all users with domains
|
||||||
|
local users
|
||||||
|
users=$(list_all_users)
|
||||||
|
|
||||||
|
if [ -z "$users" ]; then
|
||||||
|
cecho "${RED}ERROR: No users found on system${NC}"
|
||||||
|
read -p "Press Enter to continue..."
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Build domain list with optimization status
|
||||||
|
declare -a domains
|
||||||
|
declare -A domain_to_user
|
||||||
|
|
||||||
|
while IFS= read -r username; do
|
||||||
|
local user_domains
|
||||||
|
user_domains=$(get_user_domains "$username")
|
||||||
|
|
||||||
|
while IFS= read -r domain; do
|
||||||
|
[ -z "$domain" ] && continue
|
||||||
|
domains+=("$domain")
|
||||||
|
domain_to_user["$domain"]="$username"
|
||||||
|
done <<< "$user_domains"
|
||||||
|
done <<< "$users"
|
||||||
|
|
||||||
|
if [ ${#domains[@]} -eq 0 ]; then
|
||||||
|
cecho "${RED}ERROR: No domains found on system${NC}"
|
||||||
|
read -p "Press Enter to continue..."
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Display numbered list with optimization status
|
||||||
|
cecho "${CYAN}Available domains (select ones to optimize):${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
local index=1
|
||||||
|
for domain in "${domains[@]}"; do
|
||||||
|
local username="${domain_to_user[$domain]}"
|
||||||
|
local issues
|
||||||
|
issues=$(detect_php_config_issues "$username" "$domain" 2>/dev/null || echo "NONE|NONE|None")
|
||||||
|
local has_high_issues
|
||||||
|
has_high_issues=$(echo "$issues" | grep -cE "^[^|]*\|(CRITICAL|HIGH)\|" 2>/dev/null || echo "0")
|
||||||
|
|
||||||
|
local status_indicator=""
|
||||||
|
if [ "$has_high_issues" -gt 0 ]; then
|
||||||
|
status_indicator="${YELLOW}[NEEDS OPTIMIZATION]${NC}"
|
||||||
|
else
|
||||||
|
status_indicator="${GREEN}[OK]${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf " ${GREEN}%-3d${NC}) %-40s ${CYAN}[${username}]${NC} %s\n" "$index" "$domain" "$(echo -e "$status_indicator")"
|
||||||
|
index=$((index + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
cecho "${CYAN}Enter numbers separated by spaces (e.g., '1 3 5') or 'all' for all domains, 'none' to cancel${NC}"
|
||||||
|
cecho "${CYAN}─────────────────────────────────────────────────────────────────────${NC}"
|
||||||
|
read -p "Selection: " user_selection
|
||||||
|
|
||||||
|
# Parse selection
|
||||||
|
user_selection=$(echo "$user_selection" | tr '[:upper:]' '[:lower:]')
|
||||||
|
|
||||||
|
declare -a selected_domains
|
||||||
|
|
||||||
|
if [[ "$user_selection" == "all" ]]; then
|
||||||
|
selected_domains=("${domains[@]}")
|
||||||
|
elif [[ "$user_selection" =~ ^(none|n)$ ]]; then
|
||||||
|
return
|
||||||
|
else
|
||||||
|
# Parse individual numbers
|
||||||
|
for num in $user_selection; do
|
||||||
|
if [[ "$num" =~ ^[0-9]+$ ]] && [ "$num" -ge 1 ] && [ "$num" -le ${#domains[@]} ]; then
|
||||||
|
selected_domains+=("${domains[$((num - 1))]}")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ${#selected_domains[@]} -eq 0 ]; then
|
||||||
|
cecho "${YELLOW}No domains selected${NC}"
|
||||||
|
read -p "Press Enter to continue..."
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Confirm
|
||||||
|
echo ""
|
||||||
|
cecho "${CYAN}Selected ${#selected_domains[@]} domain(s) for optimization${NC}"
|
||||||
|
if ! confirm "Continue?"; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Optimize each selected domain
|
||||||
|
show_banner
|
||||||
|
cecho "${WHITE}${BOLD}BATCH OPTIMIZATION IN PROGRESS${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
local optimized=0
|
||||||
|
local failed=0
|
||||||
|
|
||||||
|
for domain in "${selected_domains[@]}"; do
|
||||||
|
local username="${domain_to_user[$domain]}"
|
||||||
|
|
||||||
|
cecho "${CYAN}Optimizing: ${WHITE}$domain${NC} ${CYAN}[$username]${NC}"
|
||||||
|
|
||||||
|
# Run single domain optimization (simplified)
|
||||||
|
optimize_domain_direct "$domain" "$username"
|
||||||
|
local result=$?
|
||||||
|
|
||||||
|
if [ $result -eq 0 ]; then
|
||||||
|
optimized=$((optimized + 1))
|
||||||
|
else
|
||||||
|
failed=$((failed + 1))
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
done
|
||||||
|
|
||||||
|
# Display summary
|
||||||
|
cecho "${CYAN}═══════════════════════════════════════════════════════════════════${NC}"
|
||||||
|
cecho "${WHITE}${BOLD}BATCH OPTIMIZATION COMPLETE${NC}"
|
||||||
|
cecho "${CYAN}─────────────────────────────────────────────────────────────────────${NC}"
|
||||||
|
cecho " Successfully optimized: ${GREEN}$optimized${NC}"
|
||||||
|
if [ "$failed" -gt 0 ]; then
|
||||||
|
cecho " Failed: ${RED}$failed${NC}"
|
||||||
|
fi
|
||||||
|
cecho "${CYAN}═══════════════════════════════════════════════════════════════════${NC}"
|
||||||
|
echo ""
|
||||||
|
read -p "Press Enter to continue..."
|
||||||
|
}
|
||||||
|
|
||||||
|
optimize_domain_direct() {
|
||||||
|
local domain="$1"
|
||||||
|
local username="$2"
|
||||||
|
|
||||||
|
# Detect issues
|
||||||
|
local issues
|
||||||
|
issues=$(detect_php_config_issues "$username" "$domain" 2>/dev/null || echo "")
|
||||||
|
|
||||||
|
# Check if there are issues
|
||||||
|
local critical_high_count
|
||||||
|
critical_high_count=$(echo "$issues" | grep -cE "^[^|]*\|(CRITICAL|HIGH)\|" 2>/dev/null || echo "0")
|
||||||
|
|
||||||
|
if [ "$critical_high_count" -eq 0 ]; then
|
||||||
|
cecho " ${GREEN}✓ No optimization needed${NC}"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Get pool config
|
||||||
|
local pool_config
|
||||||
|
pool_config=$(find_fpm_pool_config "$username" "$domain" 2>/dev/null)
|
||||||
|
|
||||||
|
if [ -z "$pool_config" ] || [ ! -f "$pool_config" ]; then
|
||||||
|
cecho " ${YELLOW}⊘ No pool config found - skipping${NC}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Get recommendations
|
||||||
|
local total_ram_mb
|
||||||
|
total_ram_mb=$(free -m | awk '/^Mem:/ {print $2}')
|
||||||
|
|
||||||
|
local improved_result
|
||||||
|
improved_result=$(calculate_optimal_php_settings "$username" "$total_ram_mb" 2>/dev/null || echo "")
|
||||||
|
|
||||||
|
if [ -z "$improved_result" ]; then
|
||||||
|
cecho " ${YELLOW}⊘ Could not calculate recommendations - skipping${NC}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local improved_max=$(get_field "$improved_result" 1)
|
||||||
|
local current_max=$(grep "^pm.max_children" "$pool_config" 2>/dev/null | awk -F'=' '{print $2}' | tr -d ' ')
|
||||||
|
|
||||||
|
if [ -z "$current_max" ] || [ -z "$improved_max" ] || [ "$current_max" = "$improved_max" ]; then
|
||||||
|
cecho " ${GREEN}✓ Already optimized${NC}"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create backup
|
||||||
|
local backup_dir
|
||||||
|
backup_dir=$(backup_user_php_configs "$username" "$domain" 2>&1)
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
cecho " ${RED}✗ Backup failed - skipping${NC}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Apply optimization
|
||||||
|
if modify_fpm_pool_setting "$pool_config" "pm.max_children" "$improved_max" >/dev/null 2>&1; then
|
||||||
|
cecho " ${GREEN}✓ Updated max_children: $current_max → $improved_max${NC}"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
cecho " ${RED}✗ Optimization failed${NC}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# OPTIMIZE ALL DOMAINS (SERVER-WIDE)
|
# OPTIMIZE ALL DOMAINS (SERVER-WIDE)
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
|
|||||||
Reference in New Issue
Block a user