# Quick Migration Guide - Using New Variables **Purpose**: Help existing scripts migrate from hardcoded paths to SYS_* variables **Time to migrate**: 5 minutes per script **Benefit**: Multi-platform compatibility with zero code branching --- ## Step 1: Add Variable Sourcing Add to the top of any script that needs platform abstraction: ```bash #!/bin/bash # ... existing header comments ... # Get platform information and variables source "$(dirname "${BASH_SOURCE[0]}")/../lib/system-variables.sh" # Now all SYS_* variables are available ``` --- ## Step 2: Replace Hardcoded Paths ### Mail System Example **BEFORE** (only works on Exim): ```bash queue_count=$(exim -bpc) queue_list=$(exim -bp) exim -Mrm "$message_id" ``` **AFTER** (works on Exim, Postfix, or Sendmail): ```bash queue_count=$(eval "$SYS_MAIL_CMD_QUEUE_COUNT") queue_list=$(eval "$SYS_MAIL_CMD_QUEUE_LIST") eval "$SYS_MAIL_CMD_QUEUE_REMOVE '$message_id'" ``` --- ### Database Example **BEFORE** (only works with MySQL at /usr/bin): ```bash mysqldump -u root --all-databases > backup.sql mysql -u root -e "SHOW DATABASES" ``` **AFTER** (works with MySQL or PostgreSQL): ```bash $SYS_DB_DUMP_COMMAND -u root --all-databases > backup.sql $SYS_DB_CLI_COMMAND -u root -c "SELECT datname FROM pg_database WHERE datistemplate=false" ``` --- ### Domain Logs Example **BEFORE** (hardcoded, wrong on Plesk <18.0.50 or InterWorx): ```bash access_log="/var/log/apache2/domlogs/$domain" error_log="${access_log}-error_log" ``` **AFTER** (works on all platforms): ```bash # On cPanel access_log="${SYS_CPANEL_DOMLOGS_PATTERN//\{DOMAIN\}/$domain}" # Or if supporting multiple panels: case "$SYS_CONTROL_PANEL" in cpanel) access_log="${SYS_CPANEL_DOMLOGS_PATTERN//\{DOMAIN\}/$domain}" error_log="${access_log}-error_log" ;; plesk) # Plesk version is auto-detected in variable access_log="${SYS_PLESK_DOMLOGS_PATTERN//\{DOMAIN\}/$domain}/access_log" error_log="${SYS_PLESK_DOMLOGS_PATTERN//\{DOMAIN\}/$domain}/error_log" ;; interworx) # Extract account from domain (first 8 chars) account="${domain:0:8}" access_log="${SYS_INTERWORX_DOMAIN_LOGS//\{ACCOUNT\}/$account//\{DOMAIN\}/$domain}/access.log" error_log="${SYS_INTERWORX_DOMAIN_LOGS//\{ACCOUNT\}/$account//\{DOMAIN\}/$domain}/error.log" ;; esac tail -f "$access_log" ``` --- ### PHP Version Example **BEFORE** (hardcoded for one version): ```bash php="/opt/cpanel/ea-php81/root/usr/bin/php" # Hardcoded! Breaks if cPanel updates $php --version ``` **AFTER** (dynamic, works with any version): ```bash # For a specific version php81="${SYS_CPANEL_EAPHP_BINARY_PATTERN//\{VERSION\}/81}" $php81 --version # Or detect from domain configuration config="/var/cpanel/userdata/$user/$domain.cache" php_version=$(grep "php_version=" "$config" | cut -d= -f2) php="${SYS_CPANEL_EAPHP_BINARY_PATTERN//\{VERSION\}/$php_version}" $php --version ``` --- ### Permission Check Example **BEFORE** (hardcoded UID, different on each OS): ```bash if [ "$(stat -c %u "$file")" -eq 48 ]; then # 48 is RHEL, 33 is Debian! echo "Owned by Apache" fi ``` **AFTER** (works on all OS): ```bash if [ "$(stat -c %u "$file")" -eq "$SYS_WEB_UID" ]; then echo "Owned by web server" fi ``` --- ### Security Scanner Example **BEFORE** (tries all scanners, fails if not installed): ```bash /usr/bin/clamscan -r /home # Fails if ClamAV not installed /usr/local/maldetect/maldet -a /home # Fails if Maldet not installed /usr/bin/rkhunter --update # Fails if RKHunter not installed ``` **AFTER** (only runs installed scanners): ```bash if [ -n "$SYS_SCANNER_CLAMAV" ]; then $SYS_SCANNER_CLAMAV -r /home fi if [ -n "$SYS_SCANNER_MALDET" ]; then $SYS_SCANNER_MALDET -a /home fi if [ -n "$SYS_SCANNER_RKHUNTER" ]; then $SYS_SCANNER_RKHUNTER --update fi ``` --- ## Step 3: Test on Multiple Platforms After migration, test the script: ```bash # Test on cPanel (SYS_CONTROL_PANEL will be "cpanel") ./your-script.sh # To test as if it were Plesk (for code paths only): export SYS_CONTROL_PANEL="plesk" ./your-script.sh ``` --- ## Common Variable Replacements ### Quick Reference Table | Old Hardcoded | New Variable | Use Case | |---------------|--------------|----------| | `/var/log/apache2/domlogs/$domain` | `$SYS_CPANEL_DOMLOGS_PATTERN` | cPanel domain logs | | `/var/www/vhosts/DOMAIN/logs` | `$SYS_PLESK_DOMLOGS_PATTERN` | Plesk domain logs | | `/opt/cpanel/ea-phpXX/...` | `$SYS_CPANEL_EAPHP_BINARY_PATTERN` | cPanel PHP binary | | `/opt/plesk/php/X.Y/bin/php` | `$SYS_PLESK_PHP_BINARY_PATTERN` | Plesk PHP binary | | `exim -bpc` | `eval "$SYS_MAIL_CMD_QUEUE_COUNT"` | Mail queue count | | `mysqldump` | `$SYS_DB_DUMP_COMMAND` | Database backup | | `uid=48` | `$SYS_WEB_UID` | Web server UID check | | `/usr/bin/clamscan` | `$SYS_SCANNER_CLAMAV` | ClamAV scanner | | `/etc/passwd` | `$SYS_AUTH_PASSWD_FILE` | User list | | `/var/cpanel/userdata` | `$SYS_CPANEL_USERDATA_DIR` | cPanel config cache | --- ## Real-World Migration Examples ### Example 1: Mail Queue Inspector **Original Script** (modules/email/mail-queue-inspector.sh): ```bash #!/bin/bash echo "=== Mail Queue Analysis ===" # Check Exim queue if command -v exim &>/dev/null; then count=$(exim -bpc) echo "Queued messages: $count" exim -bp | head -20 fi ``` **Migrated Script**: ```bash #!/bin/bash # Get system variables source "$(dirname "${BASH_SOURCE[0]}")/../lib/system-variables.sh" echo "=== Mail Queue Analysis ===" echo "Mail System: $SYS_MAIL_SYSTEM" # Works with Exim, Postfix, or Sendmail count=$(eval "$SYS_MAIL_CMD_QUEUE_COUNT") echo "Queued messages: $count" eval "$SYS_MAIL_CMD_QUEUE_LIST" | head -20 ``` **Benefit**: Script now works with any MTA without changes --- ### Example 2: Domain Log Analyzer **Original Script**: ```bash #!/bin/bash domain=$1 # Only works on cPanel access_log="/var/log/apache2/domlogs/$domain" error_log="${access_log}-error_log" tail -f "$access_log" & tail -f "$error_log" ``` **Migrated Script**: ```bash #!/bin/bash source "$(dirname "${BASH_SOURCE[0]}")/../lib/system-variables.sh" domain=$1 # Works on cPanel, Plesk, InterWorx case "$SYS_CONTROL_PANEL" in cpanel) access_log="${SYS_CPANEL_DOMLOGS_PATTERN//\{DOMAIN\}/$domain}" error_log="${access_log}-error_log" ;; plesk) base="${SYS_PLESK_DOMLOGS_PATTERN//\{DOMAIN\}/$domain}" access_log="$base/access_log" error_log="$base/error_log" ;; interworx) account="${domain:0:8}" base="${SYS_INTERWORX_DOMAIN_LOGS//\{ACCOUNT\}/$account//\{DOMAIN\}/$domain}" access_log="$base/access.log" error_log="$base/error.log" ;; *) echo "Unsupported control panel" exit 1 ;; esac [ -f "$access_log" ] && tail -f "$access_log" & [ -f "$error_log" ] && tail -f "$error_log" ``` **Benefit**: Single script deploys to any panel --- ### Example 3: PHP Configuration Checker **Original Script**: ```bash #!/bin/bash # Check PHP configuration - hardcoded paths php74="/opt/cpanel/ea-php74/root/usr/bin/php" php81="/opt/cpanel/ea-php81/root/usr/bin/php" for php in "$php74" "$php81"; do if [ -x "$php" ]; then $php -i | grep "memory_limit" fi done ``` **Migrated Script**: ```bash #!/bin/bash source "$(dirname "${BASH_SOURCE[0]}")/../lib/system-variables.sh" case "$SYS_CONTROL_PANEL" in cpanel) # cPanel: check all available ea-phpXX versions for version in 72 73 74 80 81 82 83; do php="${SYS_CPANEL_EAPHP_BINARY_PATTERN//\{VERSION\}/$version}" [ -x "$php" ] && echo "PHP $version:" && $php -i | grep "memory_limit" done ;; plesk) # Plesk: check all installed versions for version in 7.4 8.0 8.1 8.2 8.3; do php="${SYS_PLESK_PHP_BINARY_PATTERN//\{VERSION\}/$version}" [ -x "$php" ] && echo "PHP $version:" && $php -i | grep "memory_limit" done ;; interworx) # InterWorx: system PHP only $SYS_INTERWORX_PHP_SYSTEM -i | grep "memory_limit" ;; esac ``` **Benefit**: Future-proof (automatically works with new PHP versions) --- ## Best Practices ### ✅ DO - ✅ Always source `lib/system-variables.sh` at script start - ✅ Use pattern substitution for dynamic values: `${var//\{PLACEHOLDER\}/value}` - ✅ Check for optional tools before using: `if [ -n "$VAR" ]; then ...` - ✅ Use `eval` for multi-argument commands: `eval "$SYS_MAIL_CMD_QUEUE_COUNT"` - ✅ Document which platforms a migrated script supports - ✅ Test on at least 2 different control panels (if possible) ### ❌ DON'T - ❌ Don't hardcode paths like `/var/log/apache2/domlogs/` - ❌ Don't assume a specific UID (use `$SYS_*_UID` instead) - ❌ Don't hardcode `/opt/cpanel/` or `/opt/plesk/` - ❌ Don't assume `/home/` is the user home (use `$SYS_USER_HOME_BASE`) - ❌ Don't check `if [ "$UID" = "48" ]` (use `if [ "$UID" = "$SYS_WEB_UID" ]`) - ❌ Don't assume MySQL socket location (use `$SYS_DB_SOCKET`) --- ## Testing Checklist Before considering a script migrated, verify: - [ ] Script sources `lib/system-variables.sh` - [ ] No hardcoded `/home/`, `/var/www/`, or `/chroot/home/` paths - [ ] No hardcoded PHP version paths - [ ] No hardcoded mail system commands (using SYS_MAIL_* instead) - [ ] No hardcoded UIDs (using SYS_*_UID instead) - [ ] All optional tools checked with `if [ -n "$VAR" ]` - [ ] All `eval` commands use proper quoting - [ ] Script tested on actual platform (not just syntax check) --- ## Migration Priority ### Priority 1 (This Week) - [ ] All email modules (mail-queue-inspector.sh, mail-log-analyzer.sh) - [ ] All website domain-related scripts - [ ] Any security modules that scan domains ### Priority 2 (This Month) - [ ] All database modules - [ ] All PHP analysis scripts - [ ] All performance monitoring scripts ### Priority 3 (Ongoing) - [ ] Any remaining hardcoded paths - [ ] UID/GID checks - [ ] Tool path assumptions --- ## Support & Questions **Question**: What if my script needs to work on standalone systems (no control panel)? **Answer**: Use empty variable checks: ```bash if [ -z "$SYS_CPANEL_DOMLOGS_PATTERN" ]; then # No control panel - fallback to standard paths access_log="/var/log/apache2/$domain" else # Use control-panel-aware variable access_log="${SYS_CPANEL_DOMLOGS_PATTERN//\{DOMAIN\}/$domain}" fi ``` --- **Question**: Can I use these variables in cron jobs? **Answer**: Yes, but source them first: ```bash #!/bin/bash source /root/server-toolkit/lib/system-variables.sh # Now use SYS_* variables ``` --- **Question**: What if a variable is empty on my system? **Answer**: It means that tool/feature isn't installed or available. Always check before using: ```bash if [ -n "$SYS_SCANNER_CLAMAV" ]; then # ClamAV is available $SYS_SCANNER_CLAMAV -r /home fi ``` --- ## Summary **Migrating to SYS_* variables is simple:** 1. Add `source lib/system-variables.sh` to your script 2. Replace hardcoded paths with variable substitution 3. Use `eval` for multi-argument commands 4. Check optional tools with `if [ -n "$VAR" ]` 5. Test on multiple platforms **Result**: Single script works everywhere with zero branching logic