diff --git a/modules/website/website-error-analyzer.sh b/modules/website/website-error-analyzer.sh index f560d18..ca45437 100755 --- a/modules/website/website-error-analyzer.sh +++ b/modules/website/website-error-analyzer.sh @@ -14,14 +14,17 @@ source "$SCRIPT_DIR/lib/system-detect.sh" source "$SCRIPT_DIR/lib/user-manager.sh" source "$SCRIPT_DIR/lib/ip-reputation.sh" -# Configuration -APACHE_ERROR_LOG="/var/log/apache2/error_log" -DOMLOGS_DIR="/var/log/apache2/domlogs" -MODSEC_AUDIT_LOG="/usr/local/apache/logs/modsec_audit.log" +# Configuration - Use system-detected paths +APACHE_ERROR_LOG="/var/log/apache2/error_log" # Will be auto-detected +DOMLOGS_DIR="${SYS_LOG_DIR}" # From system-detect.sh +MODSEC_AUDIT_LOG="/usr/local/apache/logs/modsec_audit.log" # Will be auto-detected HOURS_TO_ANALYZE=24 FILTER_USER="" FILTER_DOMAIN="" +# Multi-panel support +CONTROL_PANEL="${SYS_CONTROL_PANEL}" + print_banner "Intelligent Website Error Analyzer" echo "" @@ -142,52 +145,161 @@ if [ -z "$FILTER_USER" ] && [ -z "$FILTER_DOMAIN" ]; then done fi -# Per-domain PHP error logs in public_html +# Per-domain PHP error logs - Multi-panel support if [ -n "$FILTER_USER" ]; then # Specific user find "/home/$FILTER_USER" -name "error_log" -type f 2>/dev/null | while read -r log; do echo "$log|php_$FILTER_USER" >> "$LOG_FILES_LIST" done elif [ -n "$FILTER_DOMAIN" ]; then - # Try to find domain's user and error logs - user=$(grep -l "DNS.*$FILTER_DOMAIN" /var/cpanel/users/* 2>/dev/null | head -1 | xargs basename 2>/dev/null) + # Try to find domain's user using multi-panel method + user="" + case "$CONTROL_PANEL" in + cpanel) + user=$(grep "^${FILTER_DOMAIN}:" /etc/userdatadomains 2>/dev/null | cut -d: -f2 | awk -F'==' '{print $1}' | head -1) + ;; + interworx) + user=$(grep -l "ServerName ${FILTER_DOMAIN}" /etc/httpd/conf.d/vhost_*.conf 2>/dev/null | head -1 | \ + xargs grep "SuexecUserGroup" 2>/dev/null | awk '{print $2}') + ;; + plesk) + # Plesk domain-to-user lookup would require DB query + user=$(plesk bin subscription --info "$FILTER_DOMAIN" 2>/dev/null | grep "Owner" | awk '{print $2}') + ;; + esac + if [ -n "$user" ]; then find "/home/$user" -name "error_log" -type f 2>/dev/null | while read -r log; do echo "$log|php_$FILTER_DOMAIN" >> "$LOG_FILES_LIST" done fi else - # All users - find /home/*/public_html -name "error_log" -type f 2>/dev/null | while read -r log; do - username=$(echo "$log" | grep -oE '/home/[^/]+' | sed 's|/home/||') - echo "$log|php_$username" >> "$LOG_FILES_LIST" - done + # All users - Search based on control panel structure + case "$CONTROL_PANEL" in + cpanel) + find /home/*/public_html -name "error_log" -type f 2>/dev/null | while read -r log; do + username=$(echo "$log" | grep -oE '/home/[^/]+' | sed 's|/home/||') + echo "$log|php_$username" >> "$LOG_FILES_LIST" + done + ;; + interworx) + find /home/*/*/html -name "error_log" -type f 2>/dev/null | while read -r log; do + username=$(echo "$log" | grep -oE '/home/[^/]+' | sed 's|/home/||') + echo "$log|php_$username" >> "$LOG_FILES_LIST" + done + ;; + plesk) + find /var/www/vhosts/*/httpdocs -name "error_log" -type f 2>/dev/null | while read -r log; do + domain=$(echo "$log" | grep -oE '/vhosts/[^/]+' | sed 's|/vhosts/||') + echo "$log|php_$domain" >> "$LOG_FILES_LIST" + done + ;; + *) + # Standalone - try common locations + find /var/www/html -name "error_log" -type f 2>/dev/null | while read -r log; do + echo "$log|php_standalone" >> "$LOG_FILES_LIST" + done + ;; + esac fi -# Per-domain Apache logs in domlogs -if [ -d "$DOMLOGS_DIR" ]; then - if [ -n "$FILTER_DOMAIN" ]; then - # Specific domain - for log in "$DOMLOGS_DIR/$FILTER_DOMAIN" "$DOMLOGS_DIR/$FILTER_DOMAIN-"*; do - [ -f "$log" ] && echo "$log|domlog_$FILTER_DOMAIN" >> "$LOG_FILES_LIST" - done - elif [ -n "$FILTER_USER" ]; then - # Specific user - find their domains - if [ -f "/var/cpanel/users/$FILTER_USER" ]; then - grep "^DNS" "/var/cpanel/users/$FILTER_USER" | awk '{print $2}' | while read -r domain; do - for log in "$DOMLOGS_DIR/$domain" "$DOMLOGS_DIR/$domain-"*; do - [ -f "$log" ] && echo "$log|domlog_$domain" >> "$LOG_FILES_LIST" +# Per-domain Apache logs - Multi-panel support +case "$CONTROL_PANEL" in + cpanel) + # cPanel: Centralized domlogs directory + if [ -d "$DOMLOGS_DIR" ]; then + if [ -n "$FILTER_DOMAIN" ]; then + # Specific domain + for log in "$DOMLOGS_DIR/$FILTER_DOMAIN" "$DOMLOGS_DIR/$FILTER_DOMAIN-"*; do + [ -f "$log" ] && echo "$log|domlog_$FILTER_DOMAIN" >> "$LOG_FILES_LIST" done + elif [ -n "$FILTER_USER" ]; then + # Specific user - use get_user_domains from user-manager.sh + local user_domains=$(get_user_domains "$FILTER_USER" 2>/dev/null) + if [ -n "$user_domains" ]; then + while IFS= read -r domain; do + for log in "$DOMLOGS_DIR/$domain" "$DOMLOGS_DIR/$domain-"*; do + [ -f "$log" ] && echo "$log|domlog_$domain" >> "$LOG_FILES_LIST" + done + done <<< "$user_domains" + fi + else + # All domains + for log in "$DOMLOGS_DIR"/*; do + [ -f "$log" ] && ! [[ "$log" =~ (bytes_log|offset|error_log|ftpxferlog)$ ]] && \ + echo "$log|domlog_$(basename "$log")" >> "$LOG_FILES_LIST" + done + fi + fi + ;; + + interworx) + # InterWorx: Per-domain logs in user home directories + if [ -n "$FILTER_DOMAIN" ]; then + # Specific domain - find its user + local user=$(grep -l "ServerName ${FILTER_DOMAIN}" /etc/httpd/conf.d/vhost_*.conf 2>/dev/null | head -1 | \ + xargs grep "SuexecUserGroup" 2>/dev/null | awk '{print $2}') + if [ -n "$user" ]; then + local log="/home/${user}/var/${FILTER_DOMAIN}/logs/access_log" + [ -f "$log" ] && echo "$log|domlog_$FILTER_DOMAIN" >> "$LOG_FILES_LIST" + fi + elif [ -n "$FILTER_USER" ]; then + # Specific user - get their domains + local user_domains=$(get_user_domains "$FILTER_USER" 2>/dev/null) + if [ -n "$user_domains" ]; then + while IFS= read -r domain; do + local log="/home/${FILTER_USER}/var/${domain}/logs/access_log" + [ -f "$log" ] && echo "$log|domlog_$domain" >> "$LOG_FILES_LIST" + done <<< "$user_domains" + fi + else + # All domains - find all access_log files + find /home/*/var/*/logs -type f -name "access_log" 2>/dev/null | while read -r log; do + local domain=$(echo "$log" | grep -oE '/var/[^/]+' | sed 's|/var/||') + echo "$log|domlog_$domain" >> "$LOG_FILES_LIST" done fi - else - # All domains - for log in "$DOMLOGS_DIR"/*; do - [ -f "$log" ] && ! [[ "$log" =~ (bytes_log|offset|error_log|ftpxferlog)$ ]] && \ - echo "$log|domlog_$(basename "$log")" >> "$LOG_FILES_LIST" - done - fi -fi + ;; + + plesk) + # Plesk: System vhosts logs + if [ -n "$FILTER_DOMAIN" ]; then + # Specific domain + for log in /var/www/vhosts/system/"$FILTER_DOMAIN"/logs/access_log \ + /var/www/vhosts/system/"$FILTER_DOMAIN"/logs/access_ssl_log; do + [ -f "$log" ] && echo "$log|domlog_$FILTER_DOMAIN" >> "$LOG_FILES_LIST" + done + elif [ -n "$FILTER_USER" ]; then + # Specific user - get their domains + local user_domains=$(get_user_domains "$FILTER_USER" 2>/dev/null) + if [ -n "$user_domains" ]; then + while IFS= read -r domain; do + for log in /var/www/vhosts/system/"$domain"/logs/access_log \ + /var/www/vhosts/system/"$domain"/logs/access_ssl_log; do + [ -f "$log" ] && echo "$log|domlog_$domain" >> "$LOG_FILES_LIST" + done + done <<< "$user_domains" + fi + else + # All domains + find /var/www/vhosts/system/*/logs -type f \( -name "access_log" -o -name "access_ssl_log" \) 2>/dev/null | \ + while read -r log; do + local domain=$(echo "$log" | grep -oE '/system/[^/]+' | sed 's|/system/||') + echo "$log|domlog_$domain" >> "$LOG_FILES_LIST" + done + fi + ;; + + *) + # Standalone Apache - try common locations + if [ -f "/var/log/httpd/access_log" ]; then + echo "/var/log/httpd/access_log|domlog_standalone" >> "$LOG_FILES_LIST" + fi + if [ -f "/var/log/apache2/access.log" ]; then + echo "/var/log/apache2/access.log|domlog_standalone" >> "$LOG_FILES_LIST" + fi + ;; +esac # ModSecurity audit log (only if not filtering or matches filter) if [ -f "$MODSEC_AUDIT_LOG" ]; then