Compare commits
6 Commits
75126b2839
...
9fbed0280d
| Author | SHA1 | Date | |
|---|---|---|---|
| 9fbed0280d | |||
| 07264b2ea6 | |||
| 4064d24a7f | |||
| 1c20f10642 | |||
| c040e9f821 | |||
| cc4f62bbe4 |
+41
-28
@@ -1,9 +1,9 @@
|
||||
################################################################################
|
||||
# SERVER TOOLKIT - CLAUDE AI CONTEXT DATABASE
|
||||
# SERVER TOOLKIT - DEVELOPER CONTEXT DATABASE
|
||||
################################################################################
|
||||
# OPTIMIZED FOR: Claude Code AI parsing and context loading
|
||||
# LAST UPDATED: 2025-11-12
|
||||
# VERSION: 2.1.0
|
||||
# OPTIMIZED FOR: Fast context loading and code navigation
|
||||
# LAST UPDATED: 2025-11-20
|
||||
# VERSION: 2.2.0
|
||||
# FORMAT: Structured key-value with hierarchical sections
|
||||
################################################################################
|
||||
|
||||
@@ -655,13 +655,13 @@ after_commit:
|
||||
- [ ] Update this file (REFDB_FORMAT.txt)
|
||||
- [ ] Update README.md if user-facing feature
|
||||
|
||||
[FOR_NEW_CLAUDE_INSTANCES]
|
||||
# Quick onboarding for new sessions
|
||||
[DEVELOPER_ONBOARDING]
|
||||
# Quick onboarding for new developers
|
||||
|
||||
step1_read_this_section_first: |
|
||||
You are maintaining the Server Management Toolkit.
|
||||
This file (REFDB_FORMAT.txt) is your ONLY reference document.
|
||||
README.md is for users, this file is for you.
|
||||
This is the Server Management Toolkit.
|
||||
This file (REFDB_FORMAT.txt) is the primary reference document.
|
||||
README.md is for end users, this file is for developers.
|
||||
|
||||
step2_understand_current_state: |
|
||||
Read [STATUS_SNAPSHOT_2025_11_07] to know what works.
|
||||
@@ -741,7 +741,7 @@ paths:
|
||||
|
||||
access_logs:
|
||||
cpanel: /var/log/apache2/domlogs/DOMAIN
|
||||
interworx: /home/USER/var/DOMAIN/logs/access_log
|
||||
interworx: /home/USER/var/DOMAIN/logs/transfer.log # VERIFIED: InterWorx uses 'transfer.log' not 'access_log'
|
||||
plesk: /var/www/vhosts/system/DOMAIN/logs/access_log
|
||||
|
||||
error_logs:
|
||||
@@ -763,7 +763,7 @@ paths:
|
||||
database_prefixes:
|
||||
cpanel: username_dbname
|
||||
interworx: username_dbname # SAME AS CPANEL! (verified from official docs)
|
||||
plesk: no prefix (TBD - needs verification)
|
||||
plesk: appname_RANDOM # e.g., wp_i75pa (VERIFIED: real server 2025-11-20)
|
||||
|
||||
# Module Classification System
|
||||
classes:
|
||||
@@ -962,15 +962,22 @@ unknowns_blocking_full_support:
|
||||
interworx:
|
||||
- ✅ RESOLVED: Database prefix is username_ (verified from docs)
|
||||
- ✅ RESOLVED: File paths all verified from official docs
|
||||
- Best method for user→domains lookup (vhost parsing works)
|
||||
- PHP version configuration method (non-critical)
|
||||
- InterWorx CLI commands availability (optional, vhost parsing works)
|
||||
- ✅ RESOLVED: Log file is 'transfer.log' NOT 'access_log' (TESTED: real server 2025-11-20)
|
||||
- ✅ RESOLVED: Logs are symlinks to dated files with auto-rotation/compression
|
||||
- ✅ RESOLVED: Domain→User lookup via vhost configs WORKS
|
||||
- ✅ RESOLVED: User→Domains lookup WORKS (both methods)
|
||||
- ✅ RESOLVED: Standard crontab works (crontab -u USER)
|
||||
- ✅ TESTED: InterWorx 6.14.5 - ALL assumptions verified
|
||||
- PHP version in vhost config (# iw-php-key: /opt/remi/php73) - works, non-critical
|
||||
|
||||
plesk:
|
||||
- Database prefix pattern (assumed no prefix)
|
||||
- Correct plesk bin commands for user→domains
|
||||
- System user for PHP processes (affects cron jobs!)
|
||||
- Cron management method (standard vs plesk bin)
|
||||
- ✅ RESOLVED: Database has prefix pattern appname_RANDOM (e.g., wp_i75pa) NOT no prefix (TESTED: real server 2025-11-20)
|
||||
- ✅ RESOLVED: plesk bin subscription --info DOMAIN works (Owner's contact name field)
|
||||
- ✅ RESOLVED: System user is file owner (e.g., admin_ftp) NOT www-data (TESTED: obsidian.pleskalations.com)
|
||||
- ✅ RESOLVED: Cron uses standard crontab -u FILEOWNER (TESTED: 2025-11-20)
|
||||
- ✅ RESOLVED: Log paths /var/www/vhosts/system/DOMAIN/logs/access_log VERIFIED
|
||||
- ✅ RESOLVED: nginx + Apache setup confirmed
|
||||
- ✅ TESTED: Plesk Obsidian 18.0.61.5 - ALL assumptions verified
|
||||
|
||||
################################################################################
|
||||
# TESTING & VALIDATION PHASE
|
||||
@@ -987,11 +994,11 @@ validation_scripts:
|
||||
|
||||
interworx_validator:
|
||||
script: "validate-interworx.sh"
|
||||
tests: 10
|
||||
tests: 13
|
||||
validates:
|
||||
- Control panel detection
|
||||
- File system structure (/home/USER/DOMAIN/html/)
|
||||
- Log locations (/home/USER/var/DOMAIN/logs/)
|
||||
- Virtual host configuration
|
||||
- Domain→User lookup (vhost configs)
|
||||
- User→Domains lookup (2 methods)
|
||||
- Database prefix (username_)
|
||||
@@ -999,27 +1006,33 @@ validation_scripts:
|
||||
- PHP configuration
|
||||
- WordPress detection
|
||||
- InterWorx CLI tools
|
||||
- WordPress file permissions & cron user testing
|
||||
- Directory structure visualization
|
||||
- Comprehensive system documentation
|
||||
output: "/tmp/interworx-validation-results.txt"
|
||||
status: "Ready for testing on real server"
|
||||
status: "TESTED on real server - all assumptions verified"
|
||||
|
||||
plesk_validator:
|
||||
script: "validate-plesk.sh"
|
||||
tests: 12
|
||||
tests: 15
|
||||
validates:
|
||||
- Control panel detection
|
||||
- File system structure (/var/www/vhosts/DOMAIN/httpdocs/)
|
||||
- Log locations (/var/www/vhosts/system/DOMAIN/logs/)
|
||||
- Log file locations (/var/www/vhosts/system/DOMAIN/logs/)
|
||||
- plesk bin commands
|
||||
- Domain→User lookup (plesk bin subscription --info)
|
||||
- User→Domains lookup (plesk bin subscription --list)
|
||||
- Database prefix pattern
|
||||
- System user for web processes (CRITICAL!)
|
||||
- Cron system (standard vs plesk bin cron)
|
||||
- Cron system with actual write/restore testing (CRITICAL!)
|
||||
- PHP configuration
|
||||
- WordPress detection
|
||||
- Apache/nginx configuration
|
||||
- WordPress file permissions & wp-config.php access
|
||||
- Directory structure visualization
|
||||
- Comprehensive system documentation
|
||||
output: "/tmp/plesk-validation-results.txt"
|
||||
status: "Ready for testing on real server"
|
||||
status: "TESTED on real server - all assumptions verified"
|
||||
|
||||
documentation:
|
||||
file: "testing/README.md"
|
||||
@@ -1046,8 +1059,8 @@ next_action_required:
|
||||
6. "Test real modules on validated servers"
|
||||
|
||||
[END]
|
||||
# This file is the ONLY developer reference document.
|
||||
# README.md is for users, this file is for developers (Claude).
|
||||
# This file is the primary developer reference document.
|
||||
# README.md is for end users, this file is for developers.
|
||||
# Keep this updated after every significant change.
|
||||
# Last updated: 2025-11-20 (Testing phase started)
|
||||
# Last updated: 2025-11-20 (Multi-panel validation complete)
|
||||
################################################################################
|
||||
|
||||
@@ -301,9 +301,9 @@ parse_logs() {
|
||||
local log_search_path
|
||||
local log_search_name
|
||||
if [ "$INTERWORX_MODE" = "yes" ]; then
|
||||
# InterWorx: /home/user/var/domain.com/logs/access_log
|
||||
# InterWorx: /home/user/var/domain.com/logs/transfer.log (VERIFIED: uses 'transfer.log' not 'access_log')
|
||||
log_search_path="/home/*/var/*/logs"
|
||||
log_search_name="access_log"
|
||||
log_search_name="transfer.log"
|
||||
else
|
||||
# cPanel/Plesk: /var/log/apache2/domlogs/domain.com
|
||||
log_search_path="$LOG_DIR"
|
||||
@@ -320,7 +320,7 @@ parse_logs() {
|
||||
|
||||
# Extract domain name based on control panel
|
||||
if [ "$INTERWORX_MODE" = "yes" ]; then
|
||||
# InterWorx: extract from path /home/user/var/domain.com/logs/access_log
|
||||
# InterWorx: extract from path /home/user/var/domain.com/logs/transfer.log
|
||||
domain=$(echo "$logfile" | sed -n 's|^/home/.*/var/\([^/]*\)/logs/.*|\1|p')
|
||||
else
|
||||
# cPanel: extract from filename
|
||||
@@ -1805,8 +1805,8 @@ main() {
|
||||
find_opts+=(-mtime -"$DAYS_BACK")
|
||||
fi
|
||||
|
||||
# Find all access_log files in InterWorx structure
|
||||
log_count=$(find /home/*/var/*/logs -type f -name "access_log" "${find_opts[@]}" 2>/dev/null | wc -l)
|
||||
# Find all transfer.log files in InterWorx structure
|
||||
log_count=$(find /home/*/var/*/logs -type f -name "transfer.log" "${find_opts[@]}" 2>/dev/null | wc -l)
|
||||
|
||||
if [ "$log_count" -eq 0 ]; then
|
||||
print_alert "Error: No InterWorx access logs found in /home/*/var/*/logs/"
|
||||
|
||||
@@ -1257,10 +1257,10 @@ monitor_apache_logs() {
|
||||
|
||||
if [ "$SYS_CONTROL_PANEL" = "interworx" ]; then
|
||||
# InterWorx: Monitor per-domain access logs
|
||||
# Find recent domain logs (modified in last hour for performance)
|
||||
# Find recent domain logs (modified in last hour for performance, InterWorx uses 'transfer.log')
|
||||
while IFS= read -r domain_log; do
|
||||
[ -f "$domain_log" ] && log_files+=("$domain_log")
|
||||
done < <(find /home/*/var/*/logs -type f -name "access_log" -mmin -60 2>/dev/null | head -10)
|
||||
done < <(find /home/*/var/*/logs -type f -name "transfer.log" -mmin -60 2>/dev/null | head -10)
|
||||
|
||||
elif [ -n "$LOG_DIR" ]; then
|
||||
# cPanel/Plesk: Use detected log directory
|
||||
|
||||
@@ -908,8 +908,8 @@ done
|
||||
# Use system-detected log directory with control panel-specific search
|
||||
local log_search_cmd
|
||||
if [ "$CONTROL_PANEL" = "interworx" ]; then
|
||||
# InterWorx: Search /home/*/var/*/logs/access_log
|
||||
log_search_cmd="find /home/*/var/*/logs -type f -name 'access_log' 2>/dev/null"
|
||||
# InterWorx: Search /home/*/var/*/logs/transfer.log (VERIFIED: uses 'transfer.log')
|
||||
log_search_cmd="find /home/*/var/*/logs -type f -name 'transfer.log' 2>/dev/null"
|
||||
elif [ -n "$SYS_LOG_DIR" ] && [ -d "$SYS_LOG_DIR" ]; then
|
||||
# cPanel/Plesk: Use detected log directory
|
||||
log_search_cmd="find $SYS_LOG_DIR -type f -name '*.com' -o -name '*.net' -o -name '*.org' 2>/dev/null"
|
||||
|
||||
@@ -11,8 +11,8 @@ echo ""
|
||||
|
||||
# Multi-panel log discovery
|
||||
if [ "$SYS_CONTROL_PANEL" = "interworx" ]; then
|
||||
# InterWorx: Per-domain logs in user home
|
||||
log_files=$(find /home/*/var/*/logs -type f -name "access_log" 2>/dev/null)
|
||||
# InterWorx: Per-domain logs in user home (uses 'transfer.log' not 'access_log')
|
||||
log_files=$(find /home/*/var/*/logs -type f -name "transfer.log" 2>/dev/null)
|
||||
elif [ "$SYS_CONTROL_PANEL" = "plesk" ]; then
|
||||
# Plesk: System logs
|
||||
log_files=$(find /var/www/vhosts/system/*/logs -type f -name "access_log" -o -name "access_ssl_log" 2>/dev/null)
|
||||
|
||||
@@ -13,8 +13,8 @@ echo ""
|
||||
# Multi-panel log discovery
|
||||
log_files=""
|
||||
if [ "$SYS_CONTROL_PANEL" = "interworx" ]; then
|
||||
# InterWorx: Monitor recent access logs (limit for performance)
|
||||
log_files=$(find /home/*/var/*/logs -type f -name "access_log" -mmin -60 2>/dev/null | head -10)
|
||||
# InterWorx: Monitor recent access logs (uses 'transfer.log', limit for performance)
|
||||
log_files=$(find /home/*/var/*/logs -type f -name "transfer.log" -mmin -60 2>/dev/null | head -10)
|
||||
elif [ "$SYS_CONTROL_PANEL" = "plesk" ]; then
|
||||
# Plesk: System logs
|
||||
log_files=$(find /var/www/vhosts/system/*/logs -type f -name "access_log" -o -name "access_ssl_log" 2>/dev/null | head -10)
|
||||
|
||||
@@ -194,8 +194,8 @@ done < <(
|
||||
find "$DOMLOGS_DIR" -type f ! -name "*bytes_log" ! -name "*offset*" ! -name "*error_log" ! -name "*ftpxferlog*" ! -name "*-ssl_log" 2>/dev/null
|
||||
;;
|
||||
interworx)
|
||||
# InterWorx: Per-domain logs in user homes
|
||||
find /home/*/var/*/logs -type f -name "access_log" 2>/dev/null
|
||||
# InterWorx: Per-domain logs in user homes (uses 'transfer.log')
|
||||
find /home/*/var/*/logs -type f -name "transfer.log" 2>/dev/null
|
||||
;;
|
||||
plesk)
|
||||
# Plesk: System vhosts logs
|
||||
|
||||
@@ -240,7 +240,7 @@ case "$CONTROL_PANEL" in
|
||||
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"
|
||||
local log="/home/${user}/var/${FILTER_DOMAIN}/logs/transfer.log"
|
||||
[ -f "$log" ] && echo "$log|domlog_$FILTER_DOMAIN" >> "$LOG_FILES_LIST"
|
||||
fi
|
||||
elif [ -n "$FILTER_USER" ]; then
|
||||
@@ -248,13 +248,13 @@ case "$CONTROL_PANEL" in
|
||||
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"
|
||||
local log="/home/${FILTER_USER}/var/${domain}/logs/transfer.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
|
||||
# All domains - find all transfer.log files (InterWorx uses 'transfer.log' not 'access_log')
|
||||
find /home/*/var/*/logs -type f -name "transfer.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
|
||||
|
||||
@@ -92,7 +92,7 @@ fi
|
||||
|
||||
if [ -f "/usr/local/interworx/iworx.ini" ]; then
|
||||
test_pass "InterWorx config file exists: /usr/local/interworx/iworx.ini"
|
||||
IW_VERSION=$(grep -i "^version" /usr/local/interworx/iworx.ini 2>/dev/null | cut -d'=' -f2 | tr -d ' ')
|
||||
IW_VERSION=$(grep -E "^version\s*=" /usr/local/interworx/iworx.ini 2>/dev/null | head -1 | cut -d'=' -f2 | tr -d ' "')
|
||||
test_info "InterWorx version: $IW_VERSION"
|
||||
else
|
||||
test_fail "InterWorx config file NOT found"
|
||||
@@ -140,11 +140,12 @@ if [ -n "$TEST_USER" ] && [ -n "$TEST_DOMAIN" ]; then
|
||||
if [ -d "$EXPECTED_LOG_DIR" ]; then
|
||||
test_pass "Log directory exists: $EXPECTED_LOG_DIR"
|
||||
|
||||
# Check for specific log files
|
||||
if [ -f "$EXPECTED_LOG_DIR/access_log" ]; then
|
||||
test_pass "Access log exists: $EXPECTED_LOG_DIR/access_log"
|
||||
# Check for specific log files (InterWorx uses transfer.log NOT access_log)
|
||||
if [ -f "$EXPECTED_LOG_DIR/transfer.log" ]; then
|
||||
test_pass "Access log exists: $EXPECTED_LOG_DIR/transfer.log"
|
||||
test_pass "VERIFIED: InterWorx uses 'transfer.log' for access logs"
|
||||
else
|
||||
test_warn "Access log NOT found (may not have traffic yet)"
|
||||
test_warn "Access log NOT found (may not have traffic yet or may be symlink)"
|
||||
fi
|
||||
|
||||
if [ -f "$EXPECTED_LOG_DIR/error_log" ]; then
|
||||
@@ -522,13 +523,20 @@ if [ -n "$FIRST_WP" ]; then
|
||||
crontab -u "$WP_USER" -l > "$TEMP_BACKUP" 2>/dev/null || echo "# No existing crontab" > "$TEMP_BACKUP"
|
||||
|
||||
(crontab -u "$WP_USER" -l 2>/dev/null; echo "# TEST - InterWorx Validation") | crontab -u "$WP_USER" - 2>/dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
CRON_WRITE_STATUS=$?
|
||||
|
||||
if [ "$CRON_WRITE_STATUS" -eq 0 ]; then
|
||||
test_pass "✓ CAN WRITE crontab for user: $WP_USER"
|
||||
test_pass "ANSWER: Use 'crontab -u $WP_USER' for WordPress cron jobs"
|
||||
crontab -u "$WP_USER" "$TEMP_BACKUP" 2>/dev/null
|
||||
test_info "Test entry removed, crontab restored"
|
||||
if crontab -u "$WP_USER" "$TEMP_BACKUP" 2>/dev/null; then
|
||||
test_info "Test entry removed, crontab restored"
|
||||
else
|
||||
test_warn "Failed to restore original crontab - manual check recommended"
|
||||
fi
|
||||
else
|
||||
test_fail "✗ CANNOT WRITE crontab for user: $WP_USER"
|
||||
# Attempt to restore anyway in case partial write occurred
|
||||
crontab -u "$WP_USER" "$TEMP_BACKUP" 2>/dev/null
|
||||
fi
|
||||
rm -f "$TEMP_BACKUP"
|
||||
fi
|
||||
@@ -742,7 +750,7 @@ echo "=======================================================================" >
|
||||
echo "" >> "$RESULTS_FILE"
|
||||
echo "Home directories: /home/USERNAME/" >> "$RESULTS_FILE"
|
||||
echo "Document roots: /home/USERNAME/DOMAIN/html/" >> "$RESULTS_FILE"
|
||||
echo "Access logs: /home/USERNAME/var/DOMAIN/logs/access_log" >> "$RESULTS_FILE"
|
||||
echo "Access logs: /home/USERNAME/var/DOMAIN/logs/transfer.log (VERIFIED)" >> "$RESULTS_FILE"
|
||||
echo "Error logs: /home/USERNAME/var/DOMAIN/logs/error_log" >> "$RESULTS_FILE"
|
||||
echo "WordPress: /home/USERNAME/DOMAIN/html/wp-config.php" >> "$RESULTS_FILE"
|
||||
echo "Vhost configs: /etc/httpd/conf.d/vhost_*.conf" >> "$RESULTS_FILE"
|
||||
|
||||
+19
-10
@@ -244,20 +244,23 @@ if [ -n "$TEST_DOMAIN" ]; then
|
||||
if [ -n "$SUBSCRIPTION_INFO" ]; then
|
||||
test_pass "Successfully retrieved subscription info for $TEST_DOMAIN"
|
||||
|
||||
# Look for Owner field
|
||||
OWNER=$(echo "$SUBSCRIPTION_INFO" | grep -i "^Owner:" | awk '{print $2}')
|
||||
# Look for Owner field - Plesk uses "Owner's contact name:" format
|
||||
# Example: "Owner's contact name: LW Support (admin)" -> extract "admin"
|
||||
# Uses tail -1 to get the last parentheses in case of multiple
|
||||
OWNER=$(echo "$SUBSCRIPTION_INFO" | grep -i "^Owner's contact name:" | sed "s/^Owner's contact name:[[:space:]]*//" | grep -oE '\([^)]+\)' | tail -1 | tr -d '()')
|
||||
|
||||
if [ -n "$OWNER" ]; then
|
||||
test_pass "Found Owner field: $OWNER"
|
||||
test_pass "VERIFIED: Domain→User lookup works via: plesk bin subscription --info DOMAIN | grep Owner"
|
||||
test_pass "Found Owner's contact name field: $OWNER"
|
||||
test_pass "VERIFIED: Domain→User lookup works via: plesk bin subscription --info DOMAIN | grep \"Owner's contact name\""
|
||||
TEST_OWNER="$OWNER"
|
||||
else
|
||||
# Try Login field as alternative
|
||||
OWNER=$(echo "$SUBSCRIPTION_INFO" | grep -i "^Login:" | awk '{print $2}')
|
||||
if [ -n "$OWNER" ]; then
|
||||
test_pass "Found Login field: $OWNER (alternative to Owner)"
|
||||
test_pass "Found Login field: $OWNER (alternative to Owner's contact name)"
|
||||
TEST_OWNER="$OWNER"
|
||||
else
|
||||
test_fail "Could not find Owner or Login field in subscription info"
|
||||
test_fail "Could not find Owner's contact name or Login field in subscription info"
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -494,17 +497,23 @@ if command -v crontab &> /dev/null; then
|
||||
# Try to add a test entry
|
||||
TEST_CRON_ENTRY="# TEST ENTRY - Plesk Validation - Will be removed"
|
||||
(crontab -u "$CRON_USER" -l 2>/dev/null; echo "$TEST_CRON_ENTRY") | crontab -u "$CRON_USER" - 2>/dev/null
|
||||
CRON_WRITE_STATUS=$?
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
if [ "$CRON_WRITE_STATUS" -eq 0 ]; then
|
||||
test_pass "✓ CAN WRITE crontab for user: $CRON_USER"
|
||||
test_pass "ANSWER: Standard crontab works - use 'crontab -u $CRON_USER'"
|
||||
|
||||
# Restore original crontab immediately
|
||||
crontab -u "$CRON_USER" "$TEMP_BACKUP" 2>/dev/null
|
||||
test_info "Test entry removed, original crontab restored"
|
||||
if crontab -u "$CRON_USER" "$TEMP_BACKUP" 2>/dev/null; then
|
||||
test_info "Test entry removed, original crontab restored"
|
||||
else
|
||||
test_warn "Failed to restore original crontab - manual check recommended"
|
||||
fi
|
||||
else
|
||||
test_fail "✗ CANNOT WRITE crontab for user: $CRON_USER"
|
||||
test_warn "May need to use 'plesk bin cron' instead of standard crontab"
|
||||
# Attempt to restore anyway in case partial write occurred
|
||||
crontab -u "$CRON_USER" "$TEMP_BACKUP" 2>/dev/null
|
||||
fi
|
||||
|
||||
rm -f "$TEMP_BACKUP"
|
||||
@@ -928,7 +937,7 @@ TOTAL TESTS: $TOTAL
|
||||
Completed: $(date)
|
||||
EOF
|
||||
|
||||
if [ $FAIL -eq 0 ]; then
|
||||
if [ "$FAIL" -eq 0 ]; then
|
||||
echo -e "${GREEN}✓ ALL CRITICAL TESTS PASSED${NC}"
|
||||
echo "✓ ALL CRITICAL TESTS PASSED" >> "$RESULTS_FILE"
|
||||
echo ""
|
||||
|
||||
Reference in New Issue
Block a user