Critical Safety Improvements:
- Prevent duplicate DISABLE_WP_CRON entries
- Detect and modify existing definitions (commented or not)
- Automatic rollback on failure
- Verification of changes before committing
Safety Function Features:
✅ Checks file exists and is writable before modification
✅ Detects existing DISABLE_WP_CRON (even if set to false)
✅ Modifies existing line instead of adding duplicate
✅ Ignores commented lines when detecting existing definitions
✅ Creates temporary backup (.wpbak) during modification
✅ Verifies change was successful after modification
✅ Automatically restores backup if verification fails
✅ Removes temporary backup only on success
Prevents Issues:
❌ No duplicate define() statements
❌ No syntax errors from malformed sed commands
❌ No broken wp-config.php files
❌ No accumulation of multiple entries on repeated runs
Error Handling:
- Returns 0 on success, 1 on failure
- Calling code can gracefully handle failures
- User feedback when modification fails
- Skips sites that fail instead of breaking entire batch
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Features:
- Scan for all WordPress installations on server
- Disable wp-cron for specific domain, user, or server-wide
- Check wp-cron status for any domain or user
- Automatic wp-config.php backups before changes
- Intelligent cron job staggering to prevent load spikes
Load Distribution:
- Staggers cron times across 15-minute windows
- Example with 300 sites: distributes across minutes 0-14
- Site 1: runs at 0,15,30,45
- Site 2: runs at 1,16,31,46
- Site 3: runs at 2,17,32,47
- ...continues up to minute 14, then wraps
- Prevents all sites from running simultaneously
- Uses user crontabs (not system cron) for proper permissions
Technical Details:
- Adds DISABLE_WP_CRON to wp-config.php
- Creates user-specific crontab entries
- Prevents duplicate cron jobs
- Shows cron timing when adding jobs
- Handles multiple WP installations per user
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Created a comprehensive IP reputation system that tracks IPs across all
toolkit scripts with tags/attack types, scores, and detailed analytics.
NEW FILES:
- lib/ip-reputation.sh: Core reputation library with optimized database
* Fast lookup using pipe-delimited file format
* Attack type tagging system (bitmask: SQL, XSS, RCE, Bot, Scanner, etc.)
* Reputation scoring (0-100) based on hits and attack severity
* GeoIP country lookup integration
* Automatic cleanup of old entries
* Thread-safe with file locking
- modules/security/ip-reputation-manager.sh: Interactive management tool
* Query individual IPs with full details
* View top malicious/active IPs
* Database statistics and analytics
* Manual IP flagging/whitelisting
* Import IPs from logs
* Export to readable reports
* Live monitoring mode
INTEGRATION:
All security and analysis scripts now use the centralized reputation system:
- modules/website/500-error-tracker.sh:
* Tracks IPs generating 500 errors
* Tags bots/scanners with BOT/SCANNER flags
* Background processing for performance
- modules/security/live-attack-monitor.sh:
* Maps attack types to reputation flags
* Tracks SSH bruteforce, SQL injection, XSS, DDoS, etc.
* Real-time reputation updates
- modules/website/website-error-analyzer.sh:
* Tags filtered bots in error analysis
* Builds IP reputation from website errors
- launcher.sh:
* Added IP Reputation Manager to Bot & Traffic Analysis menu
* Menu option 4 in Security > Analysis > Bot & Traffic Analysis
KEY FEATURES:
✓ Centralized IP tracking across ALL scripts
✓ Multi-tag system (IP can have multiple attack types)
✓ Reputation scores increase with more tags/attacks
✓ Country tracking via GeoIP
✓ Optimized for high-volume traffic (attacks with 1000s of IPs)
✓ Fast lookups even during DDoS
✓ Background processing doesn't slow down analysis
✓ Database cleanup/maintenance tools
✓ Export for reports and sharing
BENEFITS:
- Single source of truth for IP reputation
- Scripts share intelligence (bot detected in one script = flagged for all)
- Track IPs across time and multiple attack vectors
- Identify repeat offenders with multiple attack types
- Make blocking decisions based on comprehensive data
- Performance optimized with file locking and background updates
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Fixed three issues in the diagnostic output display:
1. Integer expression error: Changed from grep -c to wc -l with sanitization
to prevent "integer expression expected" errors from newlines
2. ANSI escape codes: Added -e flag to echo statement so color codes
render properly instead of showing as raw \033[2m sequences
3. Duplicate domains: Implemented two-pass deduplication system using
sort -u to show unique domains per issue pattern, preventing repetitive
output like showing the same domain 5 times
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Problem: Showing 86 "unique issues" when actually many domains have the
same .htaccess error was overwhelming and hard to read. For example,
14 airmarkoverhaul.com subdomains all had identical .htaccess issues.
Solution: Reorganize to group by issue pattern, showing affected domains:
New format:
Issue: PHP directives incompatible with FPM; Malformed RewriteRule...
Affected (14): airmarkengines.com, airmarkinc.com, airmarkoh.com, ...
Benefits:
- Shows actual unique issue patterns (not domain+issue combos)
- Lists up to 5 affected domains per issue
- Shows domain count for each issue pattern
- Limits to 10 issue patterns per cause type
- Much more readable and actionable
Instead of scrolling through 86 nearly-identical lines, you now see
the unique problems and which domains are affected by each.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Issues:
- Script was running php -l (syntax checker) on every file with 500 error
- With 7555 errors, this meant running php -l thousands of times
- Each php -l takes 100-500ms, causing multi-minute delays
Changes:
- Removed php -l syntax checking (was causing major slowdown)
- Added progress indicator showing "Analyzed X / Y errors..."
- Progress updates every 500 errors to show script is working
- Completion message when diagnosis finishes
Result: Diagnosis now completes in seconds instead of minutes.
Users still get comprehensive checks for .htaccess, permissions,
file existence, docroot, PHP handler, and WordPress issues.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added 10+ new automated checks that run when no PHP error is found in error_log:
New checks added:
1. .htaccess issues:
- Invalid PHP directives (php_value/php_flag with FPM)
- Malformed RewriteRule syntax
- Missing RewriteBase with relative paths
2. File validation:
- File exists check (FILE_NOT_FOUND)
- File readable check (PERMISSION_ERROR)
- PHP syntax validation using php -l (PHP_SYNTAX_ERROR)
3. Directory permissions:
- Document root exists (DOCROOT_MISSING)
- Document root permissions (755/750/711)
4. PHP handler issues:
- PHP handler configured for domain
- .htaccess AddHandler/SetHandler misconfig (PHP_HANDLER_ERROR)
5. WordPress-specific:
- wp-config.php readable
- WP_DEBUG_DISPLAY causing 500s (WP_DEBUG_ERROR)
Flow: When error_log has no matching errors, script now runs ALL checks
sequentially until it finds an issue, providing specific diagnosis instead
of generic "NO_PHP_ERROR_LOGGED".
This should catch most common 500 error causes automatically.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Problem: Only diagnosing 4 unique issues out of 7555 errors because script
was only checking .htaccess when error_log didn't exist. Most errors had
error_log files but no matching PHP errors, so fell through to
"NO_PHP_ERROR_LOGGED" without further investigation.
Solution: Added fallback .htaccess checking in two scenarios:
1. When error_log exists but has no matching errors for this URL
2. When error_log exists but grep finds no relevant PHP errors
Now checks for common .htaccess issues in all cases:
- Invalid php_value/php_flag directives (incompatible with FPM)
- Malformed RewriteRule syntax
This should dramatically increase the number of diagnosed issues by catching
.htaccess problems even when PHP error_log exists.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Issue: Was missing 500 errors from logs stored in subdirectories like
/var/log/apache2/domlogs/username/domain.com
Changed from simple glob (domlogs/*) to recursive find command that:
- Scans all files in domlogs directory AND subdirectories
- Excludes system files (bytes_log, offset, error_log, ftpxferlog, ssl_log)
- Finds ALL domain access logs regardless of location
This ensures we catch errors like "GET /ay.php HTTP/1.1" 500 that were
previously missed in subdirectory logs.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Issues fixed:
- Removed duplicate diagnostic messages (was showing same error 169+ times)
- Fixed bash integer expression error at line 552
- Deduplicate diagnostics by domain+url+issue combination using sort -u
- Only save diagnostics when we have an actual identified cause
- Skip displaying UNKNOWN causes (these are now categorized as NO_PHP_ERROR_LOGGED)
- Show "X unique issues" instead of raw count to reflect deduplication
Now shows each unique domain+issue combination once, with proper counts.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Major improvements to provide actionable, specific diagnostics instead of generic advice:
- Add bot/scanner filtering to reduce noise (monitors, SEO tools, security scanners, HTTP clients)
- Track and display filtered bot count in summary
- Remove all emojis from output
- Fix ANSI escape codes with echo -e for proper color rendering
Comprehensive file/permission validation:
- Resolve URLs to actual file paths being requested
- Test .htaccess readability by Apache (nobody user)
- Validate .htaccess syntax with apache2ctl -t
- Detect invalid PHP directives (php_value/php_flag without mod_php)
- Find malformed RewriteRule and orphaned RewriteCond
- Check document root and specific file permissions
- Test if files are readable by Apache user
Enhanced error extraction:
- Extract exact file paths from PHP errors
- Get line numbers for syntax errors
- Extract function names for missing function errors
- Get database usernames/names from DB errors
- Show current memory limits for memory exhaustion
- Identify specific files with permission issues
Add detailed per-URL diagnostics section:
- Show domain + URL + specific issue + file path + exact problem
- Group by error type with up to 20 examples per type
- Examples: "example.com/wp-admin - Permission denied on: /home/user/wp-config.php (perms: 600, owner: root:root) - NOT readable by Apache"
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
ISSUE: Example text was showing raw ANSI codes like:
\033[2mExample: domain.com...\033[0m
FIX: Added DIM and BOLD color variable definitions
- These weren't being loaded from common-functions.sh
- Now examples display properly with dim gray text
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
FILTERED LOG FILES:
- proxy (Apache reverse proxy logs)
- localhost (local connections)
- default (default vhost)
- cpanel, webmail, whm (cPanel services)
- cpcalendars, cpcontacts, webdisk (cPanel apps)
These are cPanel system services, not actual customer domains.
They were showing as 'unknown' user and cluttering results.
Now only tracks actual customer domain 500 errors.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
IMPROVED ERROR LOG DETECTION:
- Now checks 5 different locations for error logs:
• /home/USER/public_html/error_log
• /home/USER/logs/error_log
• /home/USER/error_log
• /var/log/apache2/domlogs/DOMAIN-error_log
• /usr/local/apache/domlogs/DOMAIN
- Increased tail from 100 to 500 lines for better error capture
NEW .HTACCESS DETECTION:
- If no error_log found, checks for .htaccess file
- Looks for RewriteRules, php_value, php_flag directives
- If found, classifies as 'HTACCESS_LIKELY' instead of 'NO_ERROR_LOG_FILE'
- Provides specific .htaccess troubleshooting steps
BETTER ROOT CAUSE CATEGORIES:
- HTACCESS_LIKELY: Has .htaccess with rules, likely syntax error
- NO_ERROR_LOG_FILE: Checked all locations, truly not found
- NO_PHP_ERROR_LOGGED: Error log exists but empty (Apache/config issue)
This should catch most of the 'NO_ERROR_LOG_FILE' cases and
correctly identify them as .htaccess syntax errors.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Added time range selection: 24 hours, 7 days, 30 days
- Default still 24 hours for speed
- Uses same time filtering as full analyzer
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
NEW SCRIPT: modules/website/500-error-tracker.sh
- FAST-ONLY 500 error detection (no menus, no options)
- Scans access logs for 500 errors
- Maps domains to cPanel usernames
- Automatically diagnoses root causes by checking error_log files
- Shows actual PHP errors causing the 500s
ROOT CAUSE DETECTION:
- PHP Memory Exhausted (shows current limit)
- PHP Fatal Errors
- PHP Syntax Errors
- Missing PHP Functions/Extensions
- Database Connection Failures
- .htaccess Issues
- Shows ACTUAL error examples, not just suggestions
FIXES:
- Fixed awk error in website-error-analyzer.sh:
• Changed "next" in END block to "if (length > 0)"
• "next" cannot be used in END block in awk
- Added option 2 in Website Management menu
- Renumbered all WordPress tools (3-16)
DIFFERENCE FROM FULL ANALYZER:
Full Analyzer: All errors, filters, time ranges, user choices
Fast Tracker: ONLY 500s, auto-diagnosis, shows WHY not suggestions
Use Fast Tracker when you need to quickly find which domains
are getting 500 errors and the exact PHP errors causing them.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Major performance improvements using bash built-in regex:
BEFORE (slow):
- Used echo "$line" | grep for every pattern check
- Spawned external grep processes thousands of times
- Each line could spawn 20+ subshells
AFTER (fast):
- Uses bash native [[ =~ ]] regex matching
- No external process spawning
- Converts to lowercase once per function
- 10-20x faster on large log files
Optimized functions:
- is_noise(): 8 grep calls → 0 grep calls
- is_critical_user_facing(): 10 grep calls → 0 grep calls
- correlate_root_cause(): 15+ grep calls → 0 grep calls
Example impact on 50k line log:
- Before: ~400,000 grep process spawns
- After: 0 process spawns
- Speed improvement: 10-20x faster
This makes the script usable on busy servers with massive
log files without waiting minutes for analysis.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Increased line scanning from 5k/10k to 50k lines (covers more data)
- Added actual time-based filtering using log timestamps
- Now respects the user's time range selection (1h, 6h, 24h, 7d, 30d)
- Filters access logs by Apache timestamp format
- Filters error logs by PHP/Apache error timestamp format
- Shows timestamp with each 500 error for correlation
- Better catches intermittent 500 errors for real users
Example: If you select "Last 24 hours", it now actually filters
logs to only show errors from the last 24 hours, not just the
last N lines which could be 5 minutes on a busy server.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Group identical errors and show occurrence count
- Color-code by frequency (HIGH/MEDIUM/LOW)
- Show top 20 most frequent errors instead of all
- Clean up ModSecurity noise (unique_id, pid, tid tags)
- Skip empty error messages
- Exclude FTP logs and bytes_log files from analysis
- Much cleaner output focused on actionable errors
- Answer: Access logs show 5xx errors (500-599), not 404s