docs: Document critical standalone server support gaps
CRITICAL ISSUES FOUND: 1. Domain discovery broken for standalone servers - get_user_domains() returns empty for standalone - No method to find domains on non-control-panel systems - Shows 'Domains: 0' in detection summary 2. Log discovery completely disabled - build_logs_section() is empty (commented out) - No log file locations cached - Log tailing tools cannot function IMPACT: - Tools fail on standalone: malware-scanner, bot-analyzer, website-diagnostics - Tools work on standalone: system-health-check, mysql-analyzer, hardware-check CAUSE: - No implementation for parsing Apache/Nginx configs on standalone - No safe log discovery mechanism (was disabled due to hangs) RECOMMENDATION: Implement standalone domain/log discovery (11-17 hours total effort)
This commit is contained in:
@@ -0,0 +1,253 @@
|
||||
# CRITICAL: Standalone Server Support Broken
|
||||
|
||||
**Date**: March 19, 2026
|
||||
**Severity**: 🔴 CRITICAL - Toolkit cannot function on standalone servers
|
||||
**Scope**: Domain discovery, Log discovery, Analysis tools
|
||||
**Status**: IDENTIFIED - Needs implementation
|
||||
|
||||
---
|
||||
|
||||
## The Problem
|
||||
|
||||
The toolkit **detects standalone servers correctly** but then **FAILS to discover domains and logs**. This means:
|
||||
|
||||
- ✅ Detection shows "Standalone (no control panel)"
|
||||
- ✅ System info is displayed (OS, web server, database, PHP)
|
||||
- ❌ **Domains: 0** (should show actual domains)
|
||||
- ❌ **Logs: none** (should show log file locations)
|
||||
- ❌ **Analysis tools cannot run** (they need domains/logs)
|
||||
|
||||
---
|
||||
|
||||
## Issue #1: Domain Discovery Returns Empty
|
||||
|
||||
**File**: `lib/user-manager.sh` (lines 239-256)
|
||||
**Function**: `get_user_domains()`
|
||||
|
||||
**Code**:
|
||||
```bash
|
||||
get_user_domains() {
|
||||
[ -z "$1" ] && return 1
|
||||
local username="$1"
|
||||
|
||||
case "$SYS_CONTROL_PANEL" in
|
||||
cpanel)
|
||||
get_cpanel_user_domains "$username"
|
||||
;;
|
||||
plesk)
|
||||
get_plesk_user_domains "$username"
|
||||
;;
|
||||
interworx)
|
||||
get_interworx_user_domains "$username"
|
||||
;;
|
||||
*)
|
||||
echo "" # ← RETURNS EMPTY FOR STANDALONE!
|
||||
;;
|
||||
esac
|
||||
}
|
||||
```
|
||||
|
||||
**Impact**:
|
||||
- When `SYS_CONTROL_PANEL="none"` (standalone), this function returns **nothing**
|
||||
- The reference database building process in `lib/reference-db.sh` relies on this function
|
||||
- Result: **0 domains found** for standalone servers
|
||||
|
||||
**What Should Happen**:
|
||||
For standalone servers, the function should:
|
||||
1. Parse Apache VirtualHost configurations
|
||||
2. Check Nginx server blocks
|
||||
3. Query Apache httpd configs for domain information
|
||||
4. Look in `/etc/apache2/sites-enabled/` or `/etc/httpd/conf.d/`
|
||||
|
||||
**Current Status**: NOT IMPLEMENTED for standalone
|
||||
|
||||
---
|
||||
|
||||
## Issue #2: Log Discovery Disabled
|
||||
|
||||
**File**: `lib/reference-db.sh` (lines 549-557)
|
||||
**Function**: `build_logs_section()`
|
||||
|
||||
**Code**:
|
||||
```bash
|
||||
build_logs_section() {
|
||||
echo "[LOGS]" >> "$SYSREF_DB"
|
||||
|
||||
# Apache/Web server logs
|
||||
# Temporarily disabled - causes hangs with large log directories
|
||||
# TODO: Implement log scanning with progress indicator and limits
|
||||
|
||||
echo "" >> "$SYSREF_DB"
|
||||
}
|
||||
```
|
||||
|
||||
**Impact**:
|
||||
- The entire log discovery section is **disabled**
|
||||
- No log file locations are cached
|
||||
- Log tailing tools cannot find logs
|
||||
|
||||
**Why It's Disabled**:
|
||||
Comment says "causes hangs with large log directories" - needs safe filesystem scanning with:
|
||||
- Progress indicator
|
||||
- Depth limits
|
||||
- File count limits
|
||||
- Timeout protection
|
||||
|
||||
**Current Status**: NOT IMPLEMENTED
|
||||
|
||||
---
|
||||
|
||||
## Broken Call Chain for Standalone
|
||||
|
||||
Here's what happens when building the reference database for a standalone server:
|
||||
|
||||
```
|
||||
build_domains_section()
|
||||
↓
|
||||
For each user in $users array:
|
||||
↓
|
||||
get_user_domains("username") ← Returns EMPTY for standalone
|
||||
↓
|
||||
Loop processes 0 domains
|
||||
↓
|
||||
Result: Domain count = 0, No logs found
|
||||
```
|
||||
|
||||
**In Detail** (reference-db.sh lines 325-481):
|
||||
|
||||
1. **Lines 336-342**: Count total domains
|
||||
- Tries to access `/var/cpanel/userdata/$user` (doesn't exist on standalone)
|
||||
- Count returns 0
|
||||
|
||||
2. **Lines 345-414**: cPanel-specific parsing
|
||||
- Skipped (userdata_dir doesn't exist)
|
||||
|
||||
3. **Lines 416-441**: Fallback domain discovery
|
||||
- Calls `get_user_domains()`
|
||||
- **Gets empty result** ← CHAIN BROKEN HERE
|
||||
- Loop never executes
|
||||
- No domains processed
|
||||
|
||||
---
|
||||
|
||||
## Impact on Tools
|
||||
|
||||
**Tools that FAIL on standalone**:
|
||||
- malware-scanner.sh (needs domains to scan)
|
||||
- bot-analyzer.sh (needs logs to analyze)
|
||||
- website-slowness-diagnostics.sh (needs domain mapping)
|
||||
- website-error-analyzer.sh (needs logs)
|
||||
- live-attack-monitor.sh (needs domain/log mapping)
|
||||
- 500-error-tracker.sh (needs logs)
|
||||
- tail-apache-access.sh (needs log paths)
|
||||
- tail-apache-error.sh (needs log paths)
|
||||
- tail-mail-log.sh (needs log paths)
|
||||
- Any tool that queries cached domains/logs
|
||||
|
||||
**Tools that WORK on standalone**:
|
||||
- system-health-check.sh
|
||||
- mysql-query-analyzer.sh
|
||||
- hardware diagnostics
|
||||
|
||||
---
|
||||
|
||||
## What Needs to Be Implemented
|
||||
|
||||
### For Standalone Domain Discovery:
|
||||
```bash
|
||||
get_standalone_user_domains() {
|
||||
local username="$1"
|
||||
|
||||
# Method 1: Parse Apache VirtualHost configurations
|
||||
grep -h "ServerName\|ServerAlias" /etc/apache2/sites-enabled/* 2>/dev/null | \
|
||||
grep -i "# $username\|# apache2\|# webmaster"
|
||||
|
||||
# Method 2: Parse Nginx server blocks
|
||||
grep -h "server_name" /etc/nginx/sites-enabled/* 2>/dev/null
|
||||
|
||||
# Method 3: Check /home/$username/public_html for detected domains
|
||||
find /home/"$username" -maxdepth 3 -name ".htaccess" -o -name "index.php" 2>/dev/null | \
|
||||
sed "s|/home/$username/||; s|/.*||" | sort -u
|
||||
}
|
||||
```
|
||||
|
||||
### For Standalone Log Discovery:
|
||||
```bash
|
||||
build_logs_section() {
|
||||
echo "[LOGS]" >> "$SYSREF_DB"
|
||||
|
||||
# Find Apache access logs with safety limits
|
||||
find "$SYS_LOG_DIR" -name "*access*" -type f -mtime -30 2>/dev/null | \
|
||||
head -50 | while read -r log; do
|
||||
echo "LOG|access|$log|"
|
||||
done >> "$SYSREF_DB"
|
||||
|
||||
# Find Apache error logs with safety limits
|
||||
find "$SYS_LOG_DIR" -name "*error*" -type f -mtime -30 2>/dev/null | \
|
||||
head -50 | while read -r log; do
|
||||
echo "LOG|error|$log|"
|
||||
done >> "$SYSREF_DB"
|
||||
|
||||
echo "" >> "$SYSREF_DB"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## The Discovery Status
|
||||
|
||||
### Detection Phase: ✅ WORKING
|
||||
```
|
||||
System: Standalone (no control panel)
|
||||
OS: AlmaLinux 9.7
|
||||
Web Server: Apache 2.4.66
|
||||
Database: MariaDB 10.6.25
|
||||
```
|
||||
|
||||
### Discovery Phase: ❌ BROKEN
|
||||
```
|
||||
Users: 5 (found via /etc/passwd)
|
||||
Domains: 0 (NOT FOUND - broken function)
|
||||
Databases: 12 (found via MySQL queries)
|
||||
Logs: (NOT DISCOVERED - disabled)
|
||||
WordPress: 0 (cannot search without domains/paths)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
The standalone server support has a **critical gap** between detection and discovery:
|
||||
|
||||
| Phase | Status | Notes |
|
||||
|-------|--------|-------|
|
||||
| **Detection** | ✅ Works | Correctly identifies as "none" |
|
||||
| **Initialization** | ✅ Works | Sets correct paths and variables |
|
||||
| **System Info** | ✅ Works | Gathers OS, web, database info |
|
||||
| **Users** | ✅ Works | Enumerates /etc/passwd users |
|
||||
| **Domains** | ❌ Broken | Function returns empty for standalone |
|
||||
| **Logs** | ❌ Disabled | Entire section commented out |
|
||||
| **WordPress** | ❌ Broken | Cannot detect without domain paths |
|
||||
| **Tools** | ❌ Fail | No domains/logs = tools can't run |
|
||||
|
||||
---
|
||||
|
||||
## Recommendation
|
||||
|
||||
**PRIORITY 1: Implement standalone domain discovery**
|
||||
- Parse Apache/Nginx configs
|
||||
- Check user directories for web content
|
||||
- Estimated effort: 4-6 hours
|
||||
|
||||
**PRIORITY 2: Implement safe log discovery**
|
||||
- Find logs with safety limits (depth, count, time range)
|
||||
- Add progress indicator to prevent hangs
|
||||
- Estimated effort: 5-8 hours
|
||||
|
||||
**PRIORITY 3: Update WordPress detection**
|
||||
- Use discovered domains to find WordPress installations
|
||||
- Estimated effort: 2-3 hours
|
||||
|
||||
**Total**: 11-17 hours to full standalone support
|
||||
|
||||
Until these are implemented, standalone servers will detect correctly but fail at discovery and cannot run analysis tools.
|
||||
Reference in New Issue
Block a user