#!/bin/bash # AutoNAS Installation & Node Admin Script # Executed on target nodes; deploy.sh invokes this with subcommands. # Usage: install.sh [install|start|restart|stop|status] set -e # Exit on any error SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" CONFIG_DIR="/etc/pve/autonas" # Script names UNIFIED_SCRIPT="autonas.sh" SCRIPT_NAME="autonas-disk-handler.sh" WRAPPER_NAME="autonas-udev-wrapper.sh" BOOT_SCAN_SCRIPT="autonas-boot-scan.sh" INTERFACE_HANDLER_SCRIPT="autonas-network-handler.sh" CAMERA_IMPORT_SCRIPT="autonas-media-importer.sh" UDEV_RULES="99-autonas-disk.rules" INTERFACE_RULES="98-autonas-interfaces.rules" SYSTEMD_SERVICE="autonas-attach@.service" MAIN_SERVICE="autonas.service" BOOT_SCAN_SERVICE="autonas-boot-scan.service" require_root() { if [ "$EUID" -ne 0 ]; then echo "❌ This action must be run as root (use sudo)" >&2 exit 1 fi } # Verifică dacă un pachet este instalat is_package_installed() { local package="$1" dpkg -l "$package" 2>/dev/null | grep -q "^ii" } # Verifică dependințele necesare check_dependencies() { local missing_packages=() local required_packages=("nfs-kernel-server" "autofs" "udev" "libimage-exiftool-perl") echo "🔍 Verificare dependințe AutoNAS..." for package in "${required_packages[@]}"; do if is_package_installed "$package"; then echo "✓ $package - instalat" else echo "❌ $package - LIPSĂ" missing_packages+=("$package") fi done if [ ${#missing_packages[@]} -gt 0 ]; then echo "" echo "⚠️ DEPENDINȚE LIPSĂ DETECTATE:" printf " %s\n" "${missing_packages[@]}" echo "" echo "Pentru a instala dependințele lipsă, rulați:" echo " apt update && apt install -y ${missing_packages[*]}" echo "" echo "Sau utilizați comanda 'install-deps' pentru instalare automată:" echo " $0 install-deps" echo "" return 1 else echo "✅ Toate dependințele sunt instalate" return 0 fi } # Instalează doar dependințele lipsă install_dependencies() { require_root echo "📦 Instalare dependințe AutoNAS..." if ! command -v apt >/dev/null 2>&1; then echo "❌ Sistemul nu folosește apt - instalarea automată nu este suportată" echo "Instalați manual pachetele: nfs-kernel-server autofs udev libimage-exiftool-perl" exit 1 fi echo "Actualizare lista de pachete..." if ! apt update; then echo "❌ Nu s-a putut actualiza lista de pachete - verificați conectivitatea la internet" exit 1 fi echo "Instalare pachete necesare..." if apt install -y nfs-kernel-server autofs udev libimage-exiftool-perl; then echo "✅ Dependințele au fost instalate cu succes" else echo "❌ Eroare la instalarea dependințelor" exit 1 fi } do_start() { require_root echo "Starting AutoNAS services..." systemctl enable nfs-kernel-server >/dev/null 2>&1 || true systemctl start nfs-kernel-server || true udevadm control --reload-rules || true udevadm trigger --subsystem-match=block --action=add || true echo "✓ Start complete" } do_restart() { require_root echo "Restarting AutoNAS services..." systemctl restart nfs-kernel-server || true udevadm control --reload-rules || true udevadm trigger --subsystem-match=block --action=add || true echo "✓ Restart complete" } do_stop() { require_root echo "Stopping AutoNAS services..." systemctl stop nfs-kernel-server || true echo "✓ Stop complete" } do_status() { echo "=== Status Servicii ===" systemctl status nfs-kernel-server --no-pager -l || true echo "" echo "=== Exports NFS ===" cat /etc/exports 2>/dev/null || echo "Fișier /etc/exports nu există" echo "" echo "=== Mount Points AutoNAS ===" ls -la /mnt/autonas/ 2>/dev/null || echo "Director /mnt/autonas nu există" echo "" echo "=== Configurație Diskuri ===" cat "$CONFIG_DIR/disks.conf" 2>/dev/null || echo "Fișier configurație nu există" echo "" echo "=== Procese AutoNAS ===" ps aux | grep autonas | grep -v grep || true } do_install() { require_root echo "=== AutoNAS Installation Script ===" echo "" # Verifică dependințele mai întâi if ! check_dependencies; then echo "❌ Instalarea nu poate continua - dependințe lipsă" echo "Rulați mai întâi: $0 install-deps" exit 1 fi echo "" echo "Installing AutoNAS..." echo "🧹 Cleanup previous installation to prevent orphan files..." if [ -f "/usr/local/lib/autonas/autonas-uninstall.sh" ]; then echo "Previous AutoNAS installation detected. Running uninstall first..." bash /usr/local/lib/autonas/autonas-uninstall.sh --force >/dev/null 2>&1 || true echo "Previous installation cleaned up." fi echo "📁 Creating directories..." mkdir -p "$CONFIG_DIR" mkdir -p "/mnt/autonas" echo "✓ Directories created" echo "Installing AutoNAS scripts..." mkdir -p "/usr/local/lib/autonas" if [ -f "$SCRIPT_DIR/$UNIFIED_SCRIPT" ]; then cp "$SCRIPT_DIR/$UNIFIED_SCRIPT" "/usr/local/bin/" chmod +x "/usr/local/bin/$UNIFIED_SCRIPT" echo "✓ Unified AutoNAS script installed" ln -sf "/usr/local/bin/$UNIFIED_SCRIPT" "/usr/local/bin/autonas" echo "✓ Created 'autonas' command symlink" fi if [ -f "$SCRIPT_DIR/autonas-core.sh" ]; then cp "$SCRIPT_DIR/autonas-core.sh" "/usr/local/bin/" chmod +x "/usr/local/bin/autonas-core.sh" echo "✓ Core library installed" fi cp "$SCRIPT_DIR/$SCRIPT_NAME" "/usr/local/bin/" chmod +x "/usr/local/bin/$SCRIPT_NAME" echo "✓ autonas-disk-handler.sh installed" cp "$SCRIPT_DIR/$WRAPPER_NAME" "/usr/local/bin/" chmod +x "/usr/local/bin/$WRAPPER_NAME" echo "✓ autonas-udev-wrapper.sh installed" if [ -f "$SCRIPT_DIR/$BOOT_SCAN_SCRIPT" ]; then cp "$SCRIPT_DIR/$BOOT_SCAN_SCRIPT" "/usr/local/bin/" chmod +x "/usr/local/bin/$BOOT_SCAN_SCRIPT" echo "✓ Boot scan script installed" fi if [ -f "$SCRIPT_DIR/$INTERFACE_HANDLER_SCRIPT" ]; then cp "$SCRIPT_DIR/$INTERFACE_HANDLER_SCRIPT" "/usr/local/bin/" chmod +x "/usr/local/bin/$INTERFACE_HANDLER_SCRIPT" echo "✓ Interface handler script installed" fi if [ -f "$SCRIPT_DIR/$CAMERA_IMPORT_SCRIPT" ]; then cp "$SCRIPT_DIR/$CAMERA_IMPORT_SCRIPT" "/usr/local/bin/" chmod +x "/usr/local/bin/$CAMERA_IMPORT_SCRIPT" echo "✓ Camera import script installed" fi echo "Installing udev rules..." cp "$PROJECT_DIR/config/$UDEV_RULES" "/etc/udev/rules.d/" if [ -f "$PROJECT_DIR/config/$INTERFACE_RULES" ]; then cp "$PROJECT_DIR/config/$INTERFACE_RULES" "/etc/udev/rules.d/" echo "✓ Interface monitoring udev rules installed" fi udevadm control --reload-rules echo "✓ Udev rules installed" echo "Installing systemd services..." cp "$PROJECT_DIR/config/$SYSTEMD_SERVICE" "/etc/systemd/system/" systemctl daemon-reload echo "✓ Systemd service installed" echo "Installing main AutoNAS service..." cp "$PROJECT_DIR/config/$MAIN_SERVICE" "/etc/systemd/system/" systemctl daemon-reload systemctl enable autonas.service echo "✓ Main AutoNAS service installed and enabled" echo "Installing boot scan service..." cp "$PROJECT_DIR/config/$BOOT_SCAN_SERVICE" "/etc/systemd/system/" systemctl daemon-reload systemctl enable autonas-boot-scan.service echo "✓ Boot scan service installed and enabled" echo "Setting up configuration..." if [ ! -f "$CONFIG_DIR/disks.conf" ]; then cp "$PROJECT_DIR/config/disks.conf" "$CONFIG_DIR/" echo "✓ Configuration template installed" else echo "⚠️ Configuration file already exists, preserving user settings" echo " Existing file: $CONFIG_DIR/disks.conf" echo " Template available at: $PROJECT_DIR/config/disks.conf" if grep -v '^#' "$CONFIG_DIR/disks.conf" | grep -v '^$' | grep -q ':'; then echo "✓ User configurations detected in existing file - preserving" else echo "ℹ️ Existing file appears to be template only" fi fi echo "Starting services..." systemctl enable nfs-kernel-server systemctl start nfs-kernel-server if [ ! -f /etc/exports ]; then touch /etc/exports fi echo "🔐 Setting permissions..." if [ -f "/usr/local/bin/$UNIFIED_SCRIPT" ]; then chown root:root "/usr/local/bin/$UNIFIED_SCRIPT" chmod 755 "/usr/local/bin/$UNIFIED_SCRIPT" fi chown root:root "/usr/local/bin/$SCRIPT_NAME" chown root:root "/usr/local/bin/$WRAPPER_NAME" if [ -f "/usr/local/bin/$CONFIG_SCRIPT" ]; then chown root:root "/usr/local/bin/$CONFIG_SCRIPT" fi if [ -f "/usr/local/bin/$BOOT_SCAN_SCRIPT" ]; then chown root:root "/usr/local/bin/$BOOT_SCAN_SCRIPT" fi if [ -f "/usr/local/bin/$INTERFACE_MONITOR_SCRIPT" ]; then chown root:root "/usr/local/bin/$INTERFACE_MONITOR_SCRIPT" fi if [ -f "/usr/local/bin/$INTERFACE_HANDLER_SCRIPT" ]; then chown root:root "/usr/local/bin/$INTERFACE_HANDLER_SCRIPT" fi chmod 755 "/usr/local/bin/$SCRIPT_NAME" chmod 755 "/usr/local/bin/$WRAPPER_NAME" if [ -f "/usr/local/bin/$UNIFIED_SCRIPT" ]; then chmod 755 "/usr/local/bin/$UNIFIED_SCRIPT" fi if [ -f "/usr/local/bin/$CONFIG_SCRIPT" ]; then chmod 755 "/usr/local/bin/$CONFIG_SCRIPT" fi if [ -f "/usr/local/bin/$BOOT_SCAN_SCRIPT" ]; then chmod 755 "/usr/local/bin/$BOOT_SCAN_SCRIPT" fi if [ -f "/usr/local/bin/$INTERFACE_MONITOR_SCRIPT" ]; then chmod 755 "/usr/local/bin/$INTERFACE_MONITOR_SCRIPT" fi if [ -f "/usr/local/bin/$INTERFACE_HANDLER_SCRIPT" ]; then chmod 755 "/usr/local/bin/$INTERFACE_HANDLER_SCRIPT" fi echo "✓ Permissions set" echo "📁 Verifying installation..." [ -f "/usr/local/bin/$SCRIPT_NAME" ] && echo "✓ Manager script: /usr/local/bin/$SCRIPT_NAME" [ -f "/usr/local/bin/$WRAPPER_NAME" ] && echo "✓ Wrapper script: /usr/local/bin/$WRAPPER_NAME" [ -f "/usr/local/bin/$UNIFIED_SCRIPT" ] && echo "✓ Unified script: /usr/local/bin/$UNIFIED_SCRIPT" [ -f "/usr/local/bin/$CONFIG_SCRIPT" ] && echo "✓ Configuration script: /usr/local/bin/$CONFIG_SCRIPT" [ -f "/usr/local/bin/$BOOT_SCAN_SCRIPT" ] && echo "✓ Boot scan script: /usr/local/bin/$BOOT_SCAN_SCRIPT" [ -f "/etc/udev/rules.d/$UDEV_RULES" ] && echo "✓ Udev rules: /etc/udev/rules.d/$UDEV_RULES" [ -f "/etc/systemd/system/$SYSTEMD_SERVICE" ] && echo "✓ Systemd service: /etc/systemd/system/$SYSTEMD_SERVICE" [ -f "/etc/systemd/system/$MAIN_SERVICE" ] && echo "✓ Main AutoNAS service: /etc/systemd/system/$MAIN_SERVICE" [ -f "/etc/systemd/system/$BOOT_SCAN_SERVICE" ] && echo "✓ Boot scan service: /etc/systemd/system/$BOOT_SCAN_SERVICE" [ -f "$CONFIG_DIR/disks.conf" ] && echo "✓ Configuration file: $CONFIG_DIR/disks.conf" echo "Installing uninstall script for future upgrades..." if [ -f "$SCRIPT_DIR/autonas-uninstall.sh" ]; then cp "$SCRIPT_DIR/autonas-uninstall.sh" "/usr/local/lib/autonas/autonas-uninstall.sh" chmod +x "/usr/local/lib/autonas/autonas-uninstall.sh" chown root:root "/usr/local/lib/autonas/autonas-uninstall.sh" echo "✓ Uninstall script: /usr/local/lib/autonas/autonas-uninstall.sh" else echo "⚠️ Uninstall script not found - manual cleanup may be required for future reinstalls" fi echo "" echo "🎉 AutoNAS installation completed successfully!" echo "" echo "🔄 Starting services..." if [ -n "${INTERFACE_MONITOR_SCRIPT:-}" ] && [ -f "/usr/local/bin/$INTERFACE_MONITOR_SCRIPT" ]; then echo "🔄 Running initial interface IP restore..." "/usr/local/bin/$INTERFACE_MONITOR_SCRIPT" restore || true echo "✓ Initial interface restore completed" fi echo "" echo "📝 Next steps:" echo "1. Connect your external disks to test auto-detection" echo "2. Use 'autonas add ' to configure detected disks" echo "3. Monitor with: journalctl -t autonas -t autonas-wrapper -f" echo "" echo "🔧 Configuration commands:" echo " autonas add [UUID] - Add new disk configuration" echo " autonas list - List configured disks" echo " autonas test [UUID] - Test disk configuration" echo " autonas remove - Remove disk configuration" echo "" echo "📋 Example disk configuration:" echo "12345678-1234-1234-1234-123456789abc:storage1:192.168.1.100:eth0:/mnt/autonas/storage1:*(rw,all_squash,insecure,async,no_subtree_check,anonuid=0,anongid=0)" echo "" echo "✅ AutoNAS is ready to use!" echo "🔍 Interface monitoring is handled automatically by udev events" } cmd="${1:-install}" case "$cmd" in install) do_install ;; install-deps) install_dependencies ;; check-deps) check_dependencies ;; start) do_start ;; restart) do_restart ;; stop) do_stop ;; status) do_status ;; *) echo "Usage: $0 [install|install-deps|check-deps|start|restart|stop|status]" >&2 echo "" echo "Commands:" echo " install - Install AutoNAS (requires dependencies)" echo " install-deps- Install only the required dependencies" echo " check-deps - Check if dependencies are installed" echo " start - Start AutoNAS services" echo " restart - Restart AutoNAS services" echo " stop - Stop AutoNAS services" echo " status - Show AutoNAS status" exit 2 ;; esac