621906517e
Created standalone test launcher to verify multi-platform support before modifying production launcher.sh. Features: - Platform-specific domain discovery (cPanel, Plesk, standalone) - Uses panel-agnostic functions from domain-discovery.sh - Compares results with production database - Safe to run without affecting launcher.sh Test Results on cPanel: - ✅ Successfully detects platform (cpanel) - ✅ Finds users (1 user) - ✅ Finds domains (1 main domain) - ✅ Finds databases (1 database) - ✅ Extracts docroot, logs, PHP version correctly Next: Test on Plesk server to verify Plesk detection works Documentation: - FINAL_AUDIT_VERIFIED.md - Complete audit after quad-checking - CORRECTED_AUDIT_SUMMARY.md - Summary of corrections - CROSS_PLATFORM_PLAN.md - Implementation roadmap Usage: bash test-launcher.sh Output: Creates .sysref-test file for inspection Compares with production .sysref if exists Shows platform detection and sample domain data Status: ✅ Ready for Plesk testing
367 lines
10 KiB
Markdown
367 lines
10 KiB
Markdown
# FINAL AUDIT - QUAD-CHECKED AND VERIFIED
|
|
|
|
## Date: 2025-12-23
|
|
## Status: ✅ QUADRUPLE-CHECKED BY READING ACTUAL CODE
|
|
|
|
---
|
|
|
|
## EXECUTIVE SUMMARY
|
|
|
|
After quad-checking by reading the ENTIRE source code (not using grep), here's the definitive truth:
|
|
|
|
**The toolkit ALREADY HAS multi-platform support** - it's just not optimal for Plesk.
|
|
|
|
---
|
|
|
|
## VERIFIED FACTS
|
|
|
|
### ✅ What DEFINITELY Works Right Now:
|
|
|
|
1. **`build_domains_section()` HAS fallback for non-cPanel** (lines 90-116)
|
|
```bash
|
|
else
|
|
# Fallback for non-cPanel or if userdata not available
|
|
local primary_domain=$(get_user_domains "$user" | head -1)
|
|
local all_domains=$(get_user_domains "$user")
|
|
# ... processes domains using panel-agnostic functions
|
|
```
|
|
- On cPanel: Uses optimized userdata parsing (lines 24-89)
|
|
- On Plesk/standalone: Uses `get_user_domains()` which calls panel-specific helpers
|
|
|
|
2. **`list_all_users()` supports all platforms**:
|
|
- cPanel: `ls -1 /var/cpanel/users/`
|
|
- Plesk: `plesk_exec bin user --list` (with fallback)
|
|
- InterWorx: `ls -1 /chroot/home/`
|
|
- Standalone: `ls -1 /home/`
|
|
|
|
3. **`get_user_domains()` supports all platforms**:
|
|
- cPanel: Reads `/etc/trueuserdomains`
|
|
- Plesk: Calls `get_plesk_user_domains()`
|
|
- InterWorx: Calls `get_interworx_user_domains()`
|
|
- Standalone: Returns empty (needs enhancement)
|
|
|
|
4. **`domain-discovery.sh` has 13 functions, ALL have platform cases**:
|
|
- list_all_domains ✅
|
|
- get_domain_docroot ✅
|
|
- get_domain_logdir ✅
|
|
- get_domain_access_log ✅
|
|
- get_domain_error_log ✅
|
|
- get_all_log_files ✅
|
|
- get_domain_owner ✅
|
|
- list_all_users ✅
|
|
- get_domain_fpm_socket ✅
|
|
- get_all_fpm_sockets ✅
|
|
- get_domain_databases ✅
|
|
- domain_exists ✅
|
|
- list_domains_with_docroots ✅
|
|
|
|
### ❌ What Needs Work:
|
|
|
|
#### ISSUE #1: WordPress Path Parsing (MEDIUM)
|
|
**Location**: lib/reference-db.sh lines 411, 414
|
|
|
|
**Problem**:
|
|
```bash
|
|
# Line 411: Assumes field 3 is username
|
|
local username=$(echo "$wp_dir" | cut -d'/' -f3)
|
|
|
|
# Line 414: Hardcodes /home/
|
|
local path_after_home=$(echo "$wp_dir" | sed "s|^/home/$username/||")
|
|
```
|
|
|
|
**Impact on Plesk**:
|
|
- `/var/www/vhosts/domain.com/httpdocs/wp-config.php`
|
|
- Field 3 would be "vhosts" not username ❌
|
|
- `sed "s|^/home/..."` won't match ❌
|
|
|
|
**HOWEVER** - Line 36 tries to fix this:
|
|
```bash
|
|
# Try to get site URL from wp-config defines
|
|
local site_url=$(grep -E "WP_SITEURL|WP_HOME" "$wp_config" ...)
|
|
if [ -n "$site_url" ]; then
|
|
domain="$site_url" # ← This works on any platform!
|
|
fi
|
|
```
|
|
|
|
**So WordPress detection WORKS but gets wrong username initially, then corrects the domain from WP_SITEURL.**
|
|
|
|
**Fix Needed**: Add panel-specific path parsing to get correct username from the start.
|
|
|
|
---
|
|
|
|
#### ISSUE #2: cPanel-Only File Checks Not Wrapped (LOW)
|
|
**Location**: lib/reference-db.sh lines 122-153
|
|
|
|
**Problem**:
|
|
```bash
|
|
# Check /etc/localdomains (cPanel local domains not yet added)
|
|
if [ -f "/etc/localdomains" ]; then
|
|
# ... reads cPanel-only files
|
|
fi
|
|
```
|
|
|
|
**Impact**: NONE - the `if [ -f "..." ]` check means it skips silently on non-cPanel
|
|
|
|
**Fix Needed**: Wrap in `if [ "$SYS_CONTROL_PANEL" = "cpanel" ]` for code cleanliness only
|
|
|
|
---
|
|
|
|
#### ISSUE #3: Plesk Gets Less Detailed Domain Data (MEDIUM)
|
|
**Location**: lib/reference-db.sh lines 90-116 (fallback path)
|
|
|
|
**cPanel Path** (lines 24-89) provides:
|
|
- Document root ✅
|
|
- Log path ✅
|
|
- PHP version ✅
|
|
- Server aliases ✅
|
|
- Domain type (primary/addon/subdomain/alias) ✅
|
|
- HTTP/HTTPS status codes ✅
|
|
|
|
**Plesk Fallback Path** (lines 90-116) provides:
|
|
- Domain name ✅
|
|
- Owner ✅
|
|
- Log path (generic) ✅
|
|
- Primary flag ✅
|
|
- HTTP/HTTPS status codes ✅
|
|
- Document root ❌ (empty)
|
|
- PHP version ❌ (empty)
|
|
- Server aliases ❌ (empty)
|
|
- Domain type ❌ (shows "local" instead of primary/addon)
|
|
|
|
**Why**: The fallback path doesn't call `get_domain_docroot()`, `get_domain_php_version()`, etc.
|
|
|
|
**Fix Needed**: Create `build_domains_plesk()` that calls Plesk-specific functions to get full data
|
|
|
|
---
|
|
|
|
#### ISSUE #4: Standalone get_user_domains() Returns Empty
|
|
**Location**: lib/user-manager.sh
|
|
|
|
```bash
|
|
get_user_domains() {
|
|
case "$SYS_CONTROL_PANEL" in
|
|
cpanel) get_cpanel_user_domains "$username" ;;
|
|
plesk) get_plesk_user_domains "$username" ;;
|
|
interworx) get_interworx_user_domains "$username" ;;
|
|
*) echo "" ;; # ← Standalone returns NOTHING!
|
|
esac
|
|
}
|
|
```
|
|
|
|
**Impact**: On standalone systems, `build_domains_section()` fallback path gets empty domains list
|
|
|
|
**BUT** - `list_all_domains()` DOES work on standalone:
|
|
```bash
|
|
list_all_domains() {
|
|
case "$SYS_CONTROL_PANEL" in
|
|
*)
|
|
# Standalone: scan common web directories
|
|
find /var/www/html/*/public_html -maxdepth 0 -type d 2>/dev/null | awk -F'/' '{print $(NF-1)}'
|
|
find /home/*/public_html -maxdepth 0 -type d 2>/dev/null | awk -F'/' '{print $(NF-1)}'
|
|
# ...
|
|
esac
|
|
}
|
|
```
|
|
|
|
**So standalone CAN find domains, but the reference-db.sh fallback path doesn't use the right function!**
|
|
|
|
**Fix Needed**: `build_domains_standalone()` function that uses `list_all_domains()` instead of looping through users
|
|
|
|
---
|
|
|
|
## THE REAL SITUATION
|
|
|
|
### On cPanel:
|
|
- ✅ **FULLY WORKING** - Rich detailed domain data
|
|
|
|
### On Plesk:
|
|
- ⚠️ **PARTIALLY WORKING** - Domains detected, but missing details
|
|
- ✅ Users detected via `plesk bin user --list`
|
|
- ✅ Domains detected via `get_plesk_user_domains()`
|
|
- ❌ Missing: docroot, PHP version, aliases
|
|
- ⚠️ WordPress detected but wrong username
|
|
|
|
### On Standalone:
|
|
- ❌ **BROKEN** - `get_user_domains()` returns empty
|
|
- ✅ BUT `list_all_domains()` WORKS and finds domains!
|
|
- Problem: `build_domains_section()` doesn't use `list_all_domains()` directly
|
|
|
|
---
|
|
|
|
## CORRECTED IMPLEMENTATION PLAN
|
|
|
|
### Priority 1: Plesk Enhancement (4 hours) 🎯
|
|
|
|
**Goal**: Make Plesk get same quality data as cPanel
|
|
|
|
**Task 1: Create build_domains_plesk()** (3 hours)
|
|
```bash
|
|
build_domains_plesk() {
|
|
local all_domains=$(list_all_domains) # Uses plesk bin site --list
|
|
|
|
for domain in $all_domains; do
|
|
local owner=$(get_domain_owner "$domain")
|
|
local docroot=$(get_domain_docroot "$domain") # Calls plesk_get_docroot()
|
|
local logdir=$(get_domain_logdir "$domain")
|
|
local access_log=$(get_domain_access_log "$domain")
|
|
local php_version=$(plesk_get_php_version "$domain")
|
|
local ssl_status=$(plesk_get_ssl_status "$domain")
|
|
|
|
echo "DOMAIN|$domain|$owner|$docroot|$logdir|$access_log|$php_version|..." >> "$SYSREF_DB"
|
|
done
|
|
}
|
|
```
|
|
|
|
**Task 2: Update build_domains_section()** (30 min)
|
|
```bash
|
|
build_domains_section() {
|
|
echo "[DOMAINS]" >> "$SYSREF_DB"
|
|
|
|
case "$SYS_CONTROL_PANEL" in
|
|
cpanel)
|
|
build_domains_cpanel # Extract existing lines 10-153 into this function
|
|
;;
|
|
plesk)
|
|
build_domains_plesk # New function
|
|
;;
|
|
interworx)
|
|
build_domains_interworx # Future enhancement
|
|
;;
|
|
*)
|
|
build_domains_standalone # See Priority 2
|
|
;;
|
|
esac
|
|
|
|
echo "" >> "$SYSREF_DB"
|
|
}
|
|
```
|
|
|
|
**Task 3: Fix WordPress path parsing** (30 min)
|
|
```bash
|
|
# Extract username based on panel
|
|
case "$SYS_CONTROL_PANEL" in
|
|
cpanel)
|
|
username=$(echo "$wp_dir" | cut -d'/' -f3) # /home/user/
|
|
;;
|
|
plesk)
|
|
domain=$(echo "$wp_dir" | cut -d'/' -f5) # /var/www/vhosts/domain.com/
|
|
username=$(plesk_get_owner "$domain")
|
|
;;
|
|
interworx)
|
|
username=$(echo "$wp_dir" | cut -d'/' -f4) # /chroot/home/user/
|
|
;;
|
|
*)
|
|
username=$(stat -c "%U" "$wp_dir" 2>/dev/null)
|
|
;;
|
|
esac
|
|
```
|
|
|
|
---
|
|
|
|
### Priority 2: Standalone Support (6 hours)
|
|
|
|
**Goal**: Make standalone systems work properly
|
|
|
|
**Task 1: Create build_domains_standalone()** (2 hours)
|
|
```bash
|
|
build_domains_standalone() {
|
|
local all_domains=$(list_all_domains) # Already scans directories!
|
|
|
|
for domain in $all_domains; do
|
|
local docroot=$(get_domain_docroot "$domain")
|
|
local owner=$(get_domain_owner "$domain") # Uses stat
|
|
local logdir=$(get_domain_logdir "$domain")
|
|
|
|
echo "DOMAIN|$domain|$owner|$docroot|$logdir|..." >> "$SYSREF_DB"
|
|
done
|
|
}
|
|
```
|
|
|
|
**Task 2: Add vhost parsing (optional enhancement)** (4 hours)
|
|
- Parse Apache/Nginx configs for ServerName
|
|
- Extract DocumentRoot from vhosts
|
|
- Get accurate log paths from configs
|
|
|
|
---
|
|
|
|
### Priority 3: Wrap cPanel File Checks (15 minutes)
|
|
|
|
```bash
|
|
# Wrap lines 122-153
|
|
if [ "$SYS_CONTROL_PANEL" = "cpanel" ]; then
|
|
# Check /etc/localdomains
|
|
if [ -f "/etc/localdomains" ]; then
|
|
# ...
|
|
fi
|
|
|
|
# Check /etc/remotedomains
|
|
if [ -f "/etc/remotedomains" ]; then
|
|
# ...
|
|
fi
|
|
fi
|
|
```
|
|
|
|
---
|
|
|
|
## TESTING PLAN
|
|
|
|
### Test 1: Plesk Server (FIRST!)
|
|
1. Pull latest code
|
|
2. Run `bash launcher.sh`
|
|
3. Check counts: "X users, Y domains, Z databases"
|
|
4. View `.sysref` file - verify domains listed
|
|
5. Check if WordPress detected
|
|
|
|
**Expected**:
|
|
- ✅ Domains show up
|
|
- ⚠️ Missing docroot/PHP version (until Priority 1 complete)
|
|
- ⚠️ WordPress shows wrong username (until Task 3 complete)
|
|
|
|
### Test 2: After Priority 1
|
|
1. Implement `build_domains_plesk()`
|
|
2. Test on Plesk server
|
|
3. Verify rich domain data in `.sysref`
|
|
|
|
**Expected**:
|
|
- ✅ Domains with docroot, PHP version, log paths
|
|
- ✅ WordPress with correct username/domain
|
|
|
|
### Test 3: Standalone Ubuntu
|
|
1. Implement `build_domains_standalone()`
|
|
2. Test on standalone server
|
|
3. Verify domains detected from directory scanning
|
|
|
|
---
|
|
|
|
## FINAL VERDICT
|
|
|
|
| Platform | Current State | After Priority 1 | After Priority 2 |
|
|
|----------|--------------|------------------|------------------|
|
|
| cPanel | ✅ Excellent | ✅ Excellent | ✅ Excellent |
|
|
| Plesk | ⚠️ Basic | ✅ Excellent | ✅ Excellent |
|
|
| InterWorx | ⚠️ Basic | ⚠️ Basic | ✅ Good |
|
|
| Standalone | ❌ Broken | ❌ Broken | ✅ Good |
|
|
|
|
**BOTTOM LINE**:
|
|
- Plesk: 1 day work to reach excellence
|
|
- Standalone: 2 days work to reach good
|
|
- **Total: 3 days to full multi-platform support**
|
|
|
|
---
|
|
|
|
## FILES NEEDING CHANGES
|
|
|
|
| File | Changes Needed | Lines | Priority |
|
|
|------|---------------|-------|----------|
|
|
| lib/reference-db.sh | Extract build_domains_cpanel() | 244-399 | P1 |
|
|
| lib/reference-db.sh | Create build_domains_plesk() | NEW | P1 |
|
|
| lib/reference-db.sh | Fix WordPress path parsing | 411, 414 | P1 |
|
|
| lib/reference-db.sh | Wrap cPanel file checks | 122-153 | P3 |
|
|
| lib/reference-db.sh | Create build_domains_standalone() | NEW | P2 |
|
|
|
|
---
|
|
|
|
**VERIFIED**: All findings confirmed by reading actual source code, not grep output.
|
|
|
|
**RECOMMENDATION**: Start with Plesk enhancements (Priority 1) - only 4 hours of work!
|