Created test-launcher.sh: - Standalone verification tool for multi-platform reference database building - Platform-specific domain builders: build_domains_cpanel_test(), build_domains_plesk_test(), build_domains_standalone_test() - Tests users, domains, and databases discovery without modifying launcher.sh - Outputs to .sysref-test and .sysref-test.timestamp - Shows statistics and sample domain entries - Compares with production .sysref database if present Testing: - Verified on cPanel: 1 users, 1 domains, 1 databases ✅ - Platform detection working correctly - Ready for Plesk server testing Audit Documentation: - FINAL_AUDIT_VERIFIED.md: Quad-checked audit confirming domain-discovery.sh has full multi-platform support - CORRECTED_AUDIT_SUMMARY.md: Triple-checked findings, corrected initial errors - PLATFORM_AUDIT_FINDINGS.md: Initial audit (marked for review - some findings were incorrect) Key Findings: - build_domains_section() HAS fallback logic for non-cPanel (lines 90-116) ✅ - domain-discovery.sh ALL 13 functions have platform cases ✅ - Only 4 actual issues found (not 8): 1. WordPress path parsing hardcodes /home/ (MEDIUM) 2. cPanel file checks not wrapped (LOW) 3. Plesk gets less detailed domain data (MEDIUM) 4. Standalone get_user_domains() returns empty (MEDIUM) Current Platform Support Status: - cPanel: ✅ Excellent (fully working) - Plesk: ⚠️ Partially working (basic detection works, needs optimization) - Standalone: ❌ Broken (get_user_domains issue, but list_all_domains works) Next Steps: 1. Test test-launcher.sh on Plesk server 2. If successful, proceed with Priority 1 Plesk enhancements 3. Then implement Priority 2 standalone support 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
14 KiB
Complete Platform Audit Findings
Date: 2025-12-23
Auditor: Claude Code (Comprehensive Analysis)
EXECUTIVE SUMMARY
Critical Issues Found: 8
Medium Issues Found: 3
Low Issues Found: 2
Recommendation: The plan needs significant updates to address newly discovered issues.
DETAILED FINDINGS
1. lib/reference-db.sh - CRITICAL ISSUES
Issue #1: build_domains_section() - Lines 255, 265
Severity: CRITICAL Impact: Complete failure on non-cPanel systems Location: Lines 255, 265
local userdata_dir="${SYS_CPANEL_USERDATA_DIR:-/var/cpanel/userdata}/${user}"
Problem:
- Hardcodes
/var/cpanel/userdatapath - Primary logic branch assumes cPanel userdata files exist
- 100% cPanel-specific domain configuration parsing
Affected Platforms: Plesk, InterWorx, Standalone Plan Coverage: ✅ COVERED in Phase 1
Issue #2: build_domains_section() - Lines 364-382
Severity: CRITICAL Impact: Code will fail on non-cPanel systems Location: Lines 364-396
# Check /etc/localdomains (cPanel local domains not yet added)
if [ -f "/etc/localdomains" ]; then
# ... reads /etc/localdomains and /etc/trueuserdomains
fi
# Check /etc/remotedomains (cPanel remote MX domains)
if [ -f "/etc/remotedomains" ]; then
# ... reads /etc/remotedomains and /etc/trueuserdomains
fi
Problem:
/etc/localdomainsis cPanel-only (doesn't exist on Plesk/standalone)/etc/remotedomainsis cPanel-only/etc/trueuserdomainsis cPanel-only (lines 370, 390)- These files are checked OUTSIDE the cPanel conditional block
Affected Platforms: Plesk, InterWorx, Standalone Plan Coverage: ❌ NOT COVERED - Plan missed this entirely!
Fix Needed:
# Wrap in cPanel-only conditional
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
Issue #3: build_wordpress_section() - Lines 411, 414
Severity: CRITICAL Impact: WordPress not detected on Plesk/standalone systems Location: Lines 411, 414
# Line 411: Extract username from path (/home/username/...)
local username=$(echo "$wp_dir" | cut -d'/' -f3)
# Line 414: Try to get domain from path
local path_after_home=$(echo "$wp_dir" | sed "s|^/home/$username/||")
Problem:
- Hardcodes
/home/assumption - Field 3 (
cut -d'/' -f3) only works for/home/username/paths - Plesk uses
/var/www/vhosts/domain.com/(username would be "www") - Standalone could use
/var/www/or other paths
Affected Platforms: Plesk, InterWorx, Standalone Plan Coverage: ✅ COVERED in Phase 2 (but needs more detail)
Fix Needed: Panel-specific path parsing logic (see Phase 2 enhancement below)
Issue #4: build_wordpress_section() - Lines 418-428
Severity: MEDIUM Impact: Domain detection fails for non-cPanel WordPress Location: Lines 418-428
if [[ "$path_after_home" == public_html ]]; then
# This is the primary domain - get it from user info
domain=$(grep "USER|${username}|" "$SYSREF_DB" 2>/dev/null | cut -d'|' -f3 || true)
elif [[ "$path_after_home" =~ ^public_html/(.+) ]]; then
# Could be subdomain or subdirectory
Problem:
- Assumes
public_htmldirectory structure (cPanel-specific) - Plesk uses
httpdocsorhttpsdocs - Standalone uses
public_html,html, orwww
Affected Platforms: Plesk, InterWorx, Standalone Plan Coverage: ✅ COVERED in Phase 2
2. lib/domain-discovery.sh - CRITICAL GAPS
Issue #5: get_domain_docroot() - Missing Plesk Support
Severity: CRITICAL Impact: Cannot build domains section on Plesk Location: lib/domain-discovery.sh (function missing Plesk case)
Problem:
get_domain_docroot()has NO Plesk case statement- This function is used by reference-db.sh build_domains_section()
- Without it, domain document roots cannot be determined on Plesk
Affected Platforms: Plesk Plan Coverage: ❌ NOT COVERED - Plan assumed this function was complete!
Fix Needed: Add Plesk case to call plesk_get_docroot()
Issue #6: list_domains_with_docroots() - Missing Plesk Support
Severity: LOW Impact: Minor - function rarely used Location: lib/domain-discovery.sh
Problem:
- Missing Plesk case statement
- Function is used by some modules but not by launcher
Affected Platforms: Plesk Plan Coverage: ❌ NOT COVERED
3. lib/domain-discovery.sh - MISSING STANDALONE SUPPORT
Issue #7: ALL Functions Missing Standalone Cases
Severity: CRITICAL Impact: Complete failure on standalone systems Location: Every function in domain-discovery.sh
Problem:
All 13 functions have cpanel, plesk, interworx cases, but NO standalone fallback:
- 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
Current Pattern:
case "$SYS_CONTROL_PANEL" in
cpanel) ... ;;
plesk) ... ;;
interworx) ... ;;
*) echo "" ;; # ← Returns empty/fails on standalone!
esac
Affected Platforms: All standalone (Debian, Ubuntu, AlmaLinux, Rocky, RHEL, CentOS) Plan Coverage: ✅ COVERED in Phase 3 (lib/standalone-helpers.sh creation)
Fix Needed: Add *) fallback cases that:
- Parse Apache/Nginx vhosts for domains
- Use filesystem scanning for user detection
- Use
stat -c "%U"for ownership - Parse vhost configs for document roots and log paths
4. launcher.sh - MINOR ISSUE
Issue #8: Title Says "cPanel" Only
Severity: LOW Impact: Cosmetic - misleading branding Location: Line 41
echo -e "${CYAN} Complete cPanel/Linux Server Administration Suite${NC}"
Problem:
- Title implies cPanel-only support
- Should say "Multi-Platform" or list all supported platforms
Affected Platforms: All Plan Coverage: ❌ NOT COVERED (minor cosmetic fix)
Fix Needed:
echo -e "${CYAN} Complete Linux Server Administration Suite${NC}"
echo -e "${CYAN} Supporting: cPanel, Plesk, InterWorx, Standalone${NC}"
PLATFORM SUPPORT MATRIX (Current State)
| Component | cPanel | Plesk | InterWorx | Standalone |
|---|---|---|---|---|
| system-detect.sh | ✅ | ✅ | ✅ | ✅ |
| domain-discovery.sh | ✅ | ⚠️ 85% | ⚠️ 75% | ❌ 0% |
| user-manager.sh | ✅ | ✅ | ✅ | ⚠️ Partial |
| reference-db.sh | ✅ | ❌ | ❌ | ❌ |
| plesk-helpers.sh | N/A | ✅ | N/A | N/A |
| launcher.sh | ✅ | ❌ | ❌ | ❌ |
Legend:
- ✅ Fully working
- ⚠️ Partially working (% complete)
- ❌ Not working / missing
UPDATED IMPLEMENTATION PRIORITIES
PHASE 1A: Fix Critical Missing Plesk Support (NEW)
Priority: CRITICAL - MUST DO FIRST
-
Add get_domain_docroot() Plesk case
- File: lib/domain-discovery.sh
- Add case to call
plesk_get_docroot() - Required for build_domains_section() to work
-
Add list_domains_with_docroots() Plesk case
- File: lib/domain-discovery.sh
- Low priority but should be included
-
Wrap cPanel-only domain checks
- File: lib/reference-db.sh lines 364-396
- Wrap
/etc/localdomainsand/etc/remotedomainsin cPanel conditional
PHASE 1B: Create build_domains_plesk() (FROM ORIGINAL PLAN)
Priority: CRITICAL
- Create Plesk-specific domain builder function
- Use plesk_list_domains() + plesk_get_*() helpers
- Skip HTTP status checks initially (too slow)
- Test on Plesk server
PHASE 2A: Fix WordPress Path Parsing (ENHANCED)
Priority: HIGH
Need panel-specific path parsing:
case "$SYS_CONTROL_PANEL" in
cpanel)
# /home/username/public_html
username=$(echo "$wp_dir" | cut -d'/' -f3)
;;
plesk)
# /var/www/vhosts/domain.com/httpdocs
domain=$(echo "$wp_dir" | cut -d'/' -f5)
username=$(plesk_get_owner "$domain")
;;
interworx)
# /chroot/home/user/var/domain.com/html
username=$(echo "$wp_dir" | cut -d'/' -f4)
;;
*)
# Standalone: use stat to get owner
username=$(stat -c "%U" "$wp_dir" 2>/dev/null)
;;
esac
PHASE 3: Create Standalone Helpers (FROM ORIGINAL PLAN)
Priority: HIGH
Must implement ALL 13 standalone cases in domain-discovery.sh:
New file: lib/standalone-helpers.sh
Functions needed:
standalone_list_domains() # Parse Apache/Nginx vhosts
standalone_get_docroot() # Extract DocumentRoot/root
standalone_get_logdir() # Extract log directory
standalone_get_access_log() # Extract access_log path
standalone_get_error_log() # Extract error_log path
standalone_get_owner() # Use stat -c "%U"
standalone_list_users() # UID >= 1000 from /etc/passwd
standalone_get_fpm_socket() # Parse PHP-FPM pool configs
standalone_list_fpm_sockets() # Find all pool sockets
standalone_get_databases() # Query MySQL for user DBs
Vhost Parser Requirements:
- Support Apache:
/etc/apache2/sites-enabled/,/etc/httpd/conf.d/ - Support Nginx:
/etc/nginx/sites-enabled/,/etc/nginx/conf.d/ - Parse
ServerName,ServerAlias(Apache) - Parse
server_name(Nginx) - Parse
DocumentRoot(Apache) /root(Nginx) - Parse
CustomLog,ErrorLog(Apache) /access_log,error_log(Nginx)
PHASE 4: Create build_domains_standalone() (NEW)
Priority: HIGH
- Use standalone_list_domains() to get domains
- Use standalone_get_*() helpers for domain info
- Skip HTTP status checks initially
- Test on Ubuntu/Debian standalone
PHASE 5: Integration Testing (FROM ORIGINAL PLAN)
Priority: MEDIUM
Test matrix:
- cPanel (ensure no regression)
- Plesk (test full domain/WP discovery)
- Standalone Debian + Apache
- Standalone Ubuntu + Nginx
- Standalone AlmaLinux + Apache
CRITICAL PATH ANALYSIS
Blocker for Plesk Support:
- ❌
get_domain_docroot()missing Plesk case (NEW DISCOVERY) - ❌
/etc/localdomainscheck needs cPanel conditional (NEW DISCOVERY) - ❌
build_domains_section()needs Plesk branch - ❌ WordPress path parsing hardcodes
/home/
Blocker for Standalone Support:
- ❌ No standalone-helpers.sh library
- ❌ No vhost parsing logic
- ❌ domain-discovery.sh has no standalone fallbacks
- ❌ No
build_domains_standalone()function
RISK ASSESSMENT
High Risk Issues:
- Missing get_domain_docroot() Plesk case - Will cause immediate failure
- Unconditionalized cPanel file checks - May cause errors on other platforms
- No standalone support - Complete failure on non-panel systems
Medium Risk Issues:
- WordPress path parsing - Will miss WordPress installations
- Missing list_domains_with_docroots() - Some modules may fail
Low Risk Issues:
- Launcher title - Cosmetic only
UPDATED TIMELINE
Week 1:
- Days 1-2: Phase 1A - Fix critical Plesk gaps (NEW)
- Days 3-4: Phase 1B - Create build_domains_plesk()
- Day 5: Phase 2A - Fix WordPress path parsing
Week 2:
- Days 1-3: Phase 3 - Create standalone-helpers.sh + vhost parser
- Days 4-5: Phase 4 - Create build_domains_standalone()
Week 3:
- Days 1-3: Phase 5 - Integration testing all platforms
- Days 4-5: Documentation + bug fixes
RECOMMENDATIONS
Immediate Actions (Before Starting Phase 1):
-
Fix get_domain_docroot() Plesk case ← MUST DO FIRST
- Add missing Plesk case statement
- Call
plesk_get_docroot()function - Test that it returns correct paths
-
Wrap cPanel-only file checks ← SAFETY FIX
- Add
if [ "$SYS_CONTROL_PANEL" = "cpanel" ]around lines 364-396 - Prevents errors on Plesk/standalone systems
- Add
-
Update CROSS_PLATFORM_PLAN.md ← DOCUMENTATION
- Add Phase 1A for critical Plesk fixes
- Add missing issue #2, #5, #6, #7, #8
- Update risk assessment
- Revise timeline to include fix phases
Testing Strategy:
- Test EACH fix immediately on cPanel (ensure no regression)
- Test on Plesk after Phase 1A completion
- Don't start Phase 3 until Phases 1A+1B+2A tested on Plesk
- Use feature flags if needed to disable incomplete platforms
FILES REQUIRING CHANGES
| File | Changes | Priority |
|---|---|---|
| lib/domain-discovery.sh | Add Plesk cases for 2 functions | CRITICAL |
| lib/reference-db.sh | Wrap cPanel checks (lines 364-396) | CRITICAL |
| lib/reference-db.sh | Refactor build_domains_section() | CRITICAL |
| lib/reference-db.sh | Refactor build_wordpress_section() | HIGH |
| lib/standalone-helpers.sh | Create new file | HIGH |
| lib/domain-discovery.sh | Add 13 standalone fallback cases | HIGH |
| launcher.sh | Update title (line 41) | LOW |
CONCLUSION
Original Plan Assessment: ⚠️ INCOMPLETE
The original CROSS_PLATFORM_PLAN.md covered the major refactoring work but missed 5 critical issues:
- Missing
get_domain_docroot()Plesk case - Unconditionalized
/etc/localdomainsand/etc/remotedomainschecks - Missing
list_domains_with_docroots()Plesk case - No standalone fallback cases in domain-discovery.sh
- Cosmetic launcher title issue
Updated Plan Required: YES
The plan must be revised to include Phase 1A (critical Plesk fixes) before starting the original Phase 1.
Estimated Additional Time: +2 days
New Total Timeline: 2-3 weeks (unchanged, but work redistributed)
Audit Status: ✅ COMPLETE Next Step: Update CROSS_PLATFORM_PLAN.md with findings Approval Needed: User should review before implementation begins