#!/bin/bash # System Compatibility Check for ZMB Webui Backend # Run before installation to verify system meets requirements set -e RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' echo -e "${BLUE}╔═══════════════════════════════════════════════════════════╗${NC}" echo -e "${BLUE}║ ZMB Webui Backend – System Compatibility Check ║${NC}" echo -e "${BLUE}╚═══════════════════════════════════════════════════════════╝${NC}" echo "" ISSUES=0 WARNINGS=0 # ============== ARCHITECTURE ============== echo -e "${YELLOW}Architecture${NC}" ARCH=$(uname -m) case $ARCH in aarch64) echo -e " ${GREEN}✓${NC} $ARCH (ARM64 - Raspberry Pi)" ;; x86_64 | x86-64) echo -e " ${GREEN}✓${NC} $ARCH (AMD64 - 64-bit x86)" ;; i686 | i386) echo -e " ${YELLOW}⚠${NC} $ARCH (32-bit x86 - may be slow)" ((WARNINGS++)) ;; *) echo -e " ${RED}✗${NC} $ARCH (unknown/unsupported)" ((ISSUES++)) ;; esac echo "" # ============== OS ============== echo -e "${YELLOW}Operating System${NC}" if [ -f /etc/os-release ]; then . /etc/os-release OS_NAME="${NAME:-Unknown}" OS_VERSION="${VERSION_ID:-unknown}" if [[ "$ID" == "debian" ]] || [[ "$ID_LIKE" == *"debian"* ]]; then echo -e " ${GREEN}✓${NC} $OS_NAME ($OS_VERSION) - Debian-based" PKG_MANAGER="apt" elif [[ "$ID" == "ubuntu" ]]; then echo -e " ${GREEN}✓${NC} Ubuntu ($OS_VERSION) - Debian-based" PKG_MANAGER="apt" elif [[ "$ID" == "rhel" ]] || [[ "$ID" == "centos" ]] || [[ "$ID" == "fedora" ]]; then echo -e " ${YELLOW}⚠${NC} $OS_NAME ($OS_VERSION) - RHEL-based (use install-rhel.sh)" ((WARNINGS++)) PKG_MANAGER="dnf" else echo -e " ${RED}✗${NC} $OS_NAME - not tested" ((ISSUES++)) fi else echo -e " ${RED}✗${NC} Could not detect OS" ((ISSUES++)) fi echo "" # ============== PYTHON ============== echo -e "${YELLOW}Python${NC}" if command -v python3 &> /dev/null; then PYTHON_VERSION=$(python3 -c 'import sys; print(".".join(map(str, sys.version_info[:2])))') PYTHON_MAJOR=$(echo $PYTHON_VERSION | cut -d. -f1) PYTHON_MINOR=$(echo $PYTHON_VERSION | cut -d. -f2) if [ "$PYTHON_MAJOR" -ge 3 ] && [ "$PYTHON_MINOR" -ge 8 ]; then echo -e " ${GREEN}✓${NC} Python $PYTHON_VERSION" else echo -e " ${RED}✗${NC} Python $PYTHON_VERSION (need 3.8+)" ((ISSUES++)) fi else echo -e " ${RED}✗${NC} Python 3 not found" ((ISSUES++)) fi echo "" # ============== PIP ============== echo -e "${YELLOW}pip${NC}" if python3 -m pip --version &> /dev/null; then echo -e " ${GREEN}✓${NC} pip available" else echo -e " ${RED}✗${NC} pip not found" ((ISSUES++)) fi echo "" # ============== ZFS TOOLS ============== echo -e "${YELLOW}ZFS Tools${NC}" ZFS_OK=true if command -v zpool &> /dev/null; then ZPOOL_VERSION=$(zpool --version 2>/dev/null | head -1) echo -e " ${GREEN}✓${NC} zpool - $ZPOOL_VERSION" else echo -e " ${RED}✗${NC} zpool not found" ZFS_OK=false ((ISSUES++)) fi if command -v zfs &> /dev/null; then ZFS_VERSION=$(zfs --version 2>/dev/null | head -1) echo -e " ${GREEN}✓${NC} zfs - $ZFS_VERSION" else echo -e " ${RED}✗${NC} zfs not found" ZFS_OK=false ((ISSUES++)) fi if [ "$ZFS_OK" = true ]; then # Try to list pools to verify ZFS is working if zpool list &> /dev/null; then echo -e " ${GREEN}✓${NC} ZFS is functional (can list pools)" fi else echo -e " ${YELLOW}ℹ${NC} ZFS not installed - install with: $PKG_MANAGER install zfsutils-linux" ((WARNINGS++)) fi echo "" # ============== SYSTEMD ============== echo -e "${YELLOW}systemd${NC}" if command -v systemctl &> /dev/null; then echo -e " ${GREEN}✓${NC} systemd available" else echo -e " ${YELLOW}⚠${NC} systemd not found (required for service installation)" ((WARNINGS++)) fi echo "" # ============== DISK SPACE ============== echo -e "${YELLOW}Disk Space${NC}" AVAILABLE=$(df /opt 2>/dev/null | tail -1 | awk '{print $4}') if [ -z "$AVAILABLE" ]; then AVAILABLE=$(df / 2>/dev/null | tail -1 | awk '{print $4}') fi if [ ! -z "$AVAILABLE" ] && [ "$AVAILABLE" -gt 500000 ]; then AVAILABLE_MB=$((AVAILABLE / 1024)) echo -e " ${GREEN}✓${NC} ~${AVAILABLE_MB}MB available" else echo -e " ${RED}✗${NC} Less than 500MB available" ((ISSUES++)) fi echo "" # ============== MEMORY ============== echo -e "${YELLOW}Memory${NC}" if [ -f /proc/meminfo ]; then TOTAL_MEM=$(grep MemTotal /proc/meminfo | awk '{print $2}') TOTAL_MB=$((TOTAL_MEM / 1024)) if [ "$TOTAL_MB" -ge 512 ]; then echo -e " ${GREEN}✓${NC} ${TOTAL_MB}MB available" if [ "$TOTAL_MB" -lt 1024 ]; then echo -e " ${YELLOW}⚠${NC} Less than 1GB - performance may be limited" ((WARNINGS++)) fi else echo -e " ${RED}✗${NC} Only ${TOTAL_MB}MB - too little memory" ((ISSUES++)) fi else echo -e " ${YELLOW}⚠${NC} Could not determine memory" ((WARNINGS++)) fi echo "" # ============== NETWORK ============== echo -e "${YELLOW}Network${NC}" if ping -c 1 8.8.8.8 &> /dev/null; then echo -e " ${GREEN}✓${NC} Internet connectivity OK" else echo -e " ${YELLOW}⚠${NC} No internet connectivity (needed for apt)" ((WARNINGS++)) fi echo "" # ============== SUMMARY ============== echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}" if [ $ISSUES -eq 0 ]; then echo -e "${GREEN}✓ System is compatible - ready for installation${NC}" if [ $WARNINGS -gt 0 ]; then echo -e "${YELLOW}⚠ $WARNINGS warning(s) - review above${NC}" fi echo "" echo -e "Next step: ${BLUE}sudo bash install.sh${NC}" exit 0 else echo -e "${RED}✗ $ISSUES issue(s) found - cannot proceed${NC}" echo "" echo "Fix the issues above and try again." exit 1 fi