Add automated multi-scanner support and result comparison
New Features: - 'All Available Scanners' option in all scan modes (server/user/domain/custom) - Runs ImunifyAV, ClamAV, and Maldet sequentially with progress tracking - Creates consolidated multi-scanner session reports - Shows [1/3], [2/3], [3/3] progress indicators - 3-second wait between scanners to prevent system overload - Session reports saved to logs/malware-scans/multiscan_*.txt - Stores session IDs in reference database for cross-module access - New 'Compare scanner results' option (menu option 6) - View consolidated reports from multiple scanners Workflow: 1. Select any scan scope (server/user/domain/path) 2. Choose 'All Available Scanners' option 3. All installed scanners run automatically one after another 4. Single consolidated report with all results 5. Use option 6 to compare/view latest multi-scanner session Much more automated - no need to run each scanner separately!
This commit is contained in:
@@ -299,6 +299,137 @@ scan_maldet() {
|
||||
echo " maldet -l"
|
||||
}
|
||||
|
||||
# Run all available scanners sequentially
|
||||
run_all_scanners() {
|
||||
local scan_paths=("$@")
|
||||
|
||||
if [ ${#scan_paths[@]} -eq 0 ]; then
|
||||
echo -e "${RED}No paths to scan${NC}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Create session ID for this multi-scanner run
|
||||
local session_id="multiscan_$(date +%Y%m%d_%H%M%S)"
|
||||
local report_file="$SCRIPT_DIR/logs/malware-scans/${session_id}_summary.txt"
|
||||
mkdir -p "$SCRIPT_DIR/logs/malware-scans"
|
||||
|
||||
echo ""
|
||||
print_header "Multi-Scanner Session: $session_id"
|
||||
|
||||
echo "Running ${#available_scanners[@]} scanner(s) on ${#scan_paths[@]} path(s)"
|
||||
echo "Session report: $report_file"
|
||||
echo ""
|
||||
|
||||
# Initialize report
|
||||
{
|
||||
echo "=========================================="
|
||||
echo "Multi-Scanner Malware Detection Report"
|
||||
echo "=========================================="
|
||||
echo "Session ID: $session_id"
|
||||
echo "Date: $(date)"
|
||||
echo "Scanners: ${available_scanners[*]}"
|
||||
echo "Paths: ${#scan_paths[@]}"
|
||||
echo ""
|
||||
printf '%s\n' "${scan_paths[@]}"
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
} > "$report_file"
|
||||
|
||||
local scanner_num=1
|
||||
local total_scanners=${#available_scanners[@]}
|
||||
|
||||
# Run each scanner
|
||||
for scanner in "${available_scanners[@]}"; do
|
||||
echo -e "${CYAN}[$scanner_num/$total_scanners] Starting ${scanner^} scan...${NC}"
|
||||
echo ""
|
||||
|
||||
{
|
||||
echo "Scanner: ${scanner^}"
|
||||
echo "Started: $(date)"
|
||||
echo "---"
|
||||
} >> "$report_file"
|
||||
|
||||
case "$scanner" in
|
||||
imunify)
|
||||
scan_imunify "${scan_paths[@]}" | tee -a "$report_file"
|
||||
;;
|
||||
clamav)
|
||||
scan_clamav "${scan_paths[@]}" | tee -a "$report_file"
|
||||
;;
|
||||
maldet)
|
||||
scan_maldet "${scan_paths[@]}" | tee -a "$report_file"
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "" | tee -a "$report_file"
|
||||
echo "---" >> "$report_file"
|
||||
echo "" >> "$report_file"
|
||||
|
||||
((scanner_num++))
|
||||
|
||||
# Wait a moment between scanners
|
||||
if [ $scanner_num -le $total_scanners ]; then
|
||||
echo ""
|
||||
echo "Waiting 3 seconds before next scanner..."
|
||||
sleep 3
|
||||
echo ""
|
||||
fi
|
||||
done
|
||||
|
||||
# Finalize report
|
||||
{
|
||||
echo "=========================================="
|
||||
echo "Multi-Scanner Session Complete"
|
||||
echo "Completed: $(date)"
|
||||
echo "=========================================="
|
||||
} >> "$report_file"
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}✓ All scanners completed${NC}"
|
||||
echo ""
|
||||
echo "Session report saved: $report_file"
|
||||
echo ""
|
||||
echo "View individual scanner results using option 5 from main menu"
|
||||
|
||||
# Store in reference database
|
||||
store_reference "malware_multiscan_latest" "$session_id"
|
||||
store_reference "malware_multiscan_${session_id}" "$report_file"
|
||||
|
||||
echo ""
|
||||
read -p "Press Enter to continue..."
|
||||
}
|
||||
|
||||
# Compare results from multiple scanners
|
||||
compare_scan_results() {
|
||||
echo ""
|
||||
print_header "Compare Scanner Results"
|
||||
|
||||
# Get latest multiscan session
|
||||
local latest_session=$(get_reference "malware_multiscan_latest")
|
||||
|
||||
if [ -z "$latest_session" ]; then
|
||||
echo "No multi-scanner sessions found."
|
||||
echo ""
|
||||
echo "Run a scan with 'All Available Scanners' option first."
|
||||
read -p "Press Enter to continue..."
|
||||
return
|
||||
fi
|
||||
|
||||
local report_file=$(get_reference "malware_multiscan_${latest_session}")
|
||||
|
||||
if [ -f "$report_file" ]; then
|
||||
echo "Latest multi-scanner session: $latest_session"
|
||||
echo ""
|
||||
less "$report_file"
|
||||
else
|
||||
echo "Report file not found: $report_file"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
read -p "Press Enter to continue..."
|
||||
}
|
||||
|
||||
# Main scan menu
|
||||
show_scan_menu() {
|
||||
while true; do
|
||||
@@ -316,8 +447,10 @@ show_scan_menu() {
|
||||
echo " 3. Scan specific domain"
|
||||
echo " 4. Scan custom path"
|
||||
echo ""
|
||||
echo "Results & Management:"
|
||||
echo " 5. View scan results"
|
||||
echo " 6. Scanner settings"
|
||||
echo " 6. Compare scanner results"
|
||||
echo " 7. Scanner settings"
|
||||
echo ""
|
||||
echo " 0. Back to main menu"
|
||||
echo ""
|
||||
@@ -330,7 +463,8 @@ show_scan_menu() {
|
||||
3) scan_domain ;;
|
||||
4) scan_custom_path ;;
|
||||
5) view_scan_results ;;
|
||||
6) scanner_settings ;;
|
||||
6) compare_scan_results ;;
|
||||
7) scanner_settings ;;
|
||||
0) return 0 ;;
|
||||
*) echo -e "${RED}Invalid option${NC}"; sleep 1 ;;
|
||||
esac
|
||||
@@ -362,16 +496,19 @@ scan_entire_server() {
|
||||
echo " $i. ${scanner^}"
|
||||
((i++))
|
||||
done
|
||||
echo " $i. All Available Scanners (run sequentially)"
|
||||
echo ""
|
||||
|
||||
read -p "Scanner: " scanner_choice
|
||||
|
||||
if [ "$scanner_choice" -lt 1 ] || [ "$scanner_choice" -gt ${#available_scanners[@]} ]; then
|
||||
# Check for "All Scanners" option
|
||||
if [ "$scanner_choice" -eq "$i" ]; then
|
||||
run_all_scanners "${sanitized_docroot[@]}"
|
||||
elif [ "$scanner_choice" -lt 1 ] || [ "$scanner_choice" -gt ${#available_scanners[@]} ]; then
|
||||
echo -e "${RED}Invalid choice${NC}"
|
||||
read -p "Press Enter to continue..."
|
||||
return 1
|
||||
fi
|
||||
|
||||
else
|
||||
local selected_scanner="${available_scanners[$((scanner_choice-1))]}"
|
||||
|
||||
case "$selected_scanner" in
|
||||
@@ -379,6 +516,7 @@ scan_entire_server() {
|
||||
clamav) scan_clamav "${sanitized_docroot[@]}" ;;
|
||||
maldet) scan_maldet "${sanitized_docroot[@]}" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
echo ""
|
||||
read -p "Press Enter to continue..."
|
||||
@@ -424,16 +562,19 @@ scan_user_account() {
|
||||
echo " $i. ${scanner^}"
|
||||
((i++))
|
||||
done
|
||||
echo " $i. All Available Scanners (run sequentially)"
|
||||
echo ""
|
||||
|
||||
read -p "Scanner: " scanner_choice
|
||||
|
||||
if [ "$scanner_choice" -lt 1 ] || [ "$scanner_choice" -gt ${#available_scanners[@]} ]; then
|
||||
# Check for "All Scanners" option
|
||||
if [ "$scanner_choice" -eq "$i" ]; then
|
||||
run_all_scanners "${user_paths[@]}"
|
||||
elif [ "$scanner_choice" -lt 1 ] || [ "$scanner_choice" -gt ${#available_scanners[@]} ]; then
|
||||
echo -e "${RED}Invalid choice${NC}"
|
||||
read -p "Press Enter to continue..."
|
||||
return 1
|
||||
fi
|
||||
|
||||
else
|
||||
local selected_scanner="${available_scanners[$((scanner_choice-1))]}"
|
||||
|
||||
case "$selected_scanner" in
|
||||
@@ -441,6 +582,7 @@ scan_user_account() {
|
||||
clamav) scan_clamav "${user_paths[@]}" ;;
|
||||
maldet) scan_maldet "${user_paths[@]}" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
echo ""
|
||||
read -p "Press Enter to continue..."
|
||||
@@ -481,16 +623,19 @@ scan_domain() {
|
||||
echo " $i. ${scanner^}"
|
||||
((i++))
|
||||
done
|
||||
echo " $i. All Available Scanners (run sequentially)"
|
||||
echo ""
|
||||
|
||||
read -p "Scanner: " scanner_choice
|
||||
|
||||
if [ "$scanner_choice" -lt 1 ] || [ "$scanner_choice" -gt ${#available_scanners[@]} ]; then
|
||||
# Check for "All Scanners" option
|
||||
if [ "$scanner_choice" -eq "$i" ]; then
|
||||
run_all_scanners "$domain_path"
|
||||
elif [ "$scanner_choice" -lt 1 ] || [ "$scanner_choice" -gt ${#available_scanners[@]} ]; then
|
||||
echo -e "${RED}Invalid choice${NC}"
|
||||
read -p "Press Enter to continue..."
|
||||
return 1
|
||||
fi
|
||||
|
||||
else
|
||||
local selected_scanner="${available_scanners[$((scanner_choice-1))]}"
|
||||
|
||||
case "$selected_scanner" in
|
||||
@@ -498,6 +643,7 @@ scan_domain() {
|
||||
clamav) scan_clamav "$domain_path" ;;
|
||||
maldet) scan_maldet "$domain_path" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
echo ""
|
||||
read -p "Press Enter to continue..."
|
||||
@@ -525,16 +671,19 @@ scan_custom_path() {
|
||||
echo " $i. ${scanner^}"
|
||||
((i++))
|
||||
done
|
||||
echo " $i. All Available Scanners (run sequentially)"
|
||||
echo ""
|
||||
|
||||
read -p "Scanner: " scanner_choice
|
||||
|
||||
if [ "$scanner_choice" -lt 1 ] || [ "$scanner_choice" -gt ${#available_scanners[@]} ]; then
|
||||
# Check for "All Scanners" option
|
||||
if [ "$scanner_choice" -eq "$i" ]; then
|
||||
run_all_scanners "$custom_path"
|
||||
elif [ "$scanner_choice" -lt 1 ] || [ "$scanner_choice" -gt ${#available_scanners[@]} ]; then
|
||||
echo -e "${RED}Invalid choice${NC}"
|
||||
read -p "Press Enter to continue..."
|
||||
return 1
|
||||
fi
|
||||
|
||||
else
|
||||
local selected_scanner="${available_scanners[$((scanner_choice-1))]}"
|
||||
|
||||
case "$selected_scanner" in
|
||||
@@ -542,6 +691,7 @@ scan_custom_path() {
|
||||
clamav) scan_clamav "$custom_path" ;;
|
||||
maldet) scan_maldet "$custom_path" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
echo ""
|
||||
read -p "Press Enter to continue..."
|
||||
|
||||
Reference in New Issue
Block a user