Refactor script for other Linux distros with automatic kernel updates

This commit is contained in:
Spacery
2025-12-30 18:01:39 -04:00
parent 1ce24d71ff
commit 6cefc43cda
21 changed files with 706 additions and 387 deletions
Regular → Executable
+401 -283
View File
@@ -1,438 +1,556 @@
#!/bin/bash
# Cores for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
#############################################################################
# AIC8800D80 WiFi 6 Driver - Universal Installer (DKMS) - VERSÃO CORRIGIDA
# Version: 2.0.4
# Date: 2025-12-30
# Description: Multi-distribution installer with DKMS support
# Supported: Debian/Ubuntu, Fedora/RHEL, Arch Linux, and derivatives
# FIX: Corrected DKMS module configuration for aic8800_fdrv
#############################################################################
# Variables
DRIVER_REPO="https://github.com/shenmintao/aic8800d80.git"
DRIVER_DIR="$HOME/aic8800d80"
LOG_FILE="/tmp/aic8800d80_install.log"
MODULE_NAME="aic8800_fdrv"
set -e # Exit on error
# Color definitions
readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly BLUE='\033[0;34m'
readonly CYAN='\033[0;36m'
readonly NC='\033[0m' # No Color
# Driver configuration
readonly DRV_NAME="aic8800"
readonly DRV_VERSION="1.0.0"
readonly SRC_DIR="/usr/src/${DRV_NAME}-${DRV_VERSION}"
readonly MODULE_NAME="aic8800_fdrv"
readonly LOG_FILE="/tmp/aic8800d80_install.log"
# Script directory (where the script is located)
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
#############################################################################
# Logging and Output Functions
#############################################################################
log_message() {
local level="$1"
shift
# Garantir que o arquivo de log existe e tem permissões corretas
if [ ! -f "$LOG_FILE" ]; then
touch "$LOG_FILE" 2>/dev/null || true
chmod 666 "$LOG_FILE" 2>/dev/null || true
fi
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $*" >> "$LOG_FILE" 2>/dev/null || true
}
# Auxiliary functions
print_info() {
echo -e "${BLUE}[INFO]${NC} $1"
echo "[INFO] $1" >> "$LOG_FILE"
log_message "INFO" "$1"
}
print_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
echo "[SUCCESS] $1" >> "$LOG_FILE"
log_message "SUCCESS" "$1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
echo "[WARNING] $1" >> "$LOG_FILE"
log_message "WARNING" "$1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
echo "[ERROR] $1" >> "$LOG_FILE"
log_message "ERROR" "$1"
}
print_step() {
echo -e "\n${CYAN}==>${NC} ${1}"
echo "==> $1" >> "$LOG_FILE"
echo ""
echo -e "${CYAN}==>${NC} ${1}"
log_message "STEP" "$1"
}
# Function to check if the command was successful
check_success() {
if [ $? -eq 0 ]; then
print_success "$1"
return 0
else
print_error "$2"
return 1
#############################################################################
# Error Handling
#############################################################################
cleanup_on_error() {
print_error "Installation failed. Check $LOG_FILE for details."
exit 1
}
trap cleanup_on_error ERR
#############################################################################
# Root Privilege Check
#############################################################################
check_root() {
if [ "$EUID" -ne 0 ]; then
print_error "This script must be run as root (use sudo)"
echo ""
echo "Usage: sudo ./install.sh"
exit 1
fi
}
#############################################################################
# Check Secure Boot
# Secure Boot Detection
#############################################################################
check_secure_boot() {
print_step "Checking Secure Boot status..."
# Method 1: Check via mokutil (more reliable)
local secure_boot_enabled=false
# Method 1: Check via mokutil
if command -v mokutil &> /dev/null; then
SECURE_BOOT_STATUS=$(mokutil --sb-state 2>/dev/null | grep -i "SecureBoot" | awk '{print $2}')
if [[ "$SECURE_BOOT_STATUS" == "enabled" ]]; then
print_error "Secure Boot is ENABLED!"
echo ""
echo -e "${RED}╔════════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${RED}║ SECURE BOOT IS ENABLED - INSTALLATION CANNOT PROCEED ║${NC}"
echo -e "${RED}╚════════════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo -e "${YELLOW}Why does Secure Boot need to be disabled?${NC}"
echo ""
echo "Secure Boot is a security feature of UEFI that prevents the loading"
echo "of unsigned kernel modules. The AIC8800D80 driver is a custom module"
echo "compiled locally and does not have a digital signature recognized by the system."
echo ""
echo -e "${CYAN}How to disable Secure Boot:${NC}"
echo ""
echo "1. Restart the computer"
echo "2. Enter the BIOS/UEFI (usually pressing DEL, F2, F10 or ESC)"
echo "3. Search for 'Secure Boot' in the settings (usually in Security)"
echo "4. Change from 'Enabled' to 'Disabled'"
echo "5. Save the settings and restart (usually F10)"
echo "6. Execute this script again"
echo ""
echo -e "${YELLOW}Note:${NC} Disabling Secure Boot is safe for personal use, but"
echo " slightly reduces security against bootrootkits."
echo ""
return 1
else
print_success "Secure Boot is disabled. Proceeding..."
return 0
if mokutil --sb-state 2>/dev/null | grep -qi "SecureBoot enabled"; then
secure_boot_enabled=true
fi
fi
# Method 2: Check via /sys/firmware/efi/efivars (fallback)
if [ -d /sys/firmware/efi/efivars ]; then
if [ -f /sys/firmware/efi/efivars/SecureBoot-* ]; then
SB_VALUE=$(od -An -t u1 /sys/firmware/efi/efivars/SecureBoot-* | awk '{print $NF}')
if [ "$SB_VALUE" = "1" ]; then
print_error "Secure Boot is ENABLED (detected via EFI vars)!"
echo ""
echo -e "${RED}Secure Boot needs to be disabled to install this driver.${NC}"
echo "See the instructions above on how to disable it."
return 1
else
print_success "Secure Boot is disabled (verified via EFI vars)."
return 0
# Method 2: Check via EFI variables (fallback)
if [ "$secure_boot_enabled" = false ] && [ -d /sys/firmware/efi ]; then
local secureboot_files=(/sys/firmware/efi/efivars/SecureBoot-*)
if [ -f "${secureboot_files[0]}" ]; then
local sb_value
sb_value=$(od -An -t u1 "${secureboot_files[0]}" 2>/dev/null | awk '{print $NF}')
if [ "$sb_value" = "1" ]; then
secure_boot_enabled=true
fi
fi
fi
# Method 3: Check via dmesg (last resort)
DMESG_SB=$(dmesg | grep -i "secure boot" | grep -i "enabled")
if [ -n "$DMESG_SB" ]; then
print_warning "Secure Boot may be enabled (detected via dmesg)."
echo "Please check manually and disable if necessary."
read -p "Do you want to continue anyway? (y/N): " choice
if [[ ! "$choice" =~ ^[Ss]$ ]]; then
return 1
if [ "$secure_boot_enabled" = true ]; then
echo ""
echo -e "${YELLOW}╔════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${YELLOW}║ SECURE BOOT IS ENABLED ║${NC}"
echo -e "${YELLOW}╚════════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo "The driver may not load automatically due to Secure Boot restrictions."
echo "Third-party modules require signing or Secure Boot must be disabled."
echo ""
echo -e "${CYAN}Options:${NC}"
echo " 1. Disable Secure Boot in BIOS/UEFI settings (recommended)"
echo " 2. Sign the module manually (advanced)"
echo " 3. Continue installation anyway (module may fail to load)"
echo ""
read -p "Continue installation? (y/N): " choice
if [[ ! "$choice" =~ ^[Yy]$ ]]; then
print_info "Installation cancelled by user."
exit 0
fi
print_warning "Continuing with Secure Boot enabled..."
else
print_success "Secure Boot is disabled or not present."
fi
print_success "Secure Boot verification completed."
return 0
}
#############################################################################
# Check requirements
# Package Manager Detection and Dependency Installation
#############################################################################
check_requirements() {
print_step "Checking system requirements..."
detect_package_manager() {
print_step "Detecting package manager and distribution..."
# Verificar se é root
if [ "$EUID" -eq 0 ]; then
print_error "This script MUST NOT be run as root!"
echo "Run as a normal user. The script will request sudo when necessary."
local pkg_manager=""
local distro_name=""
if command -v apt-get &> /dev/null; then
pkg_manager="apt"
distro_name="Debian/Ubuntu"
elif command -v dnf &> /dev/null; then
pkg_manager="dnf"
distro_name="Fedora/RHEL"
elif command -v yum &> /dev/null; then
pkg_manager="yum"
distro_name="CentOS/RHEL (legacy)"
elif command -v pacman &> /dev/null; then
pkg_manager="pacman"
distro_name="Arch Linux"
elif command -v zypper &> /dev/null; then
pkg_manager="zypper"
distro_name="openSUSE"
else
print_error "No supported package manager found!"
echo ""
echo "Please install the following packages manually:"
echo " - dkms"
echo " - build-essential / base-devel / development tools"
echo " - linux-headers for your kernel version"
echo " - mokutil (optional, for Secure Boot detection)"
echo ""
exit 1
fi
# Check kernel
KERNEL_VERSION=$(uname -r)
print_info "Kernel detected: $KERNEL_VERSION"
# Check if has access to sudo
if ! sudo -n true 2>/dev/null; then
print_info "This script requires sudo privileges."
sudo -v || { print_error "Failed to obtain sudo privileges."; exit 1; }
fi
print_success "Basic requirements met."
print_success "Detected: $distro_name ($pkg_manager)"
DETECTED_PKG_MANAGER="$pkg_manager"
}
#############################################################################
# Install dependencies
#############################################################################
install_dependencies() {
print_step "Installing necessary dependencies..."
local pkg_manager="$1"
# Update package list
print_info "Updating package list..."
sudo apt update >> "$LOG_FILE" 2>&1
check_success "Package list updated" "Failed to update package list"
print_step "Installing dependencies..."
# List of dependencies
DEPENDENCIES=(
"git"
"build-essential"
"dkms"
"bc"
"linux-headers-$(uname -r)"
"mokutil"
)
case "$pkg_manager" in
apt)
print_info "Updating package database..."
apt-get update -qq >> "$LOG_FILE" 2>&1
print_info "Installing: dkms, build-essential, linux-headers, mokutil..."
apt-get install -y dkms build-essential linux-headers-$(uname -r) mokutil >> "$LOG_FILE" 2>&1
;;
dnf)
print_info "Installing: dkms, gcc, make, kernel-devel, kernel-headers, mokutil..."
dnf install -y dkms make gcc kernel-devel kernel-headers mokutil >> "$LOG_FILE" 2>&1
;;
yum)
print_info "Installing: dkms, gcc, make, kernel-devel, mokutil..."
yum install -y epel-release >> "$LOG_FILE" 2>&1
yum install -y dkms make gcc kernel-devel mokutil >> "$LOG_FILE" 2>&1
;;
pacman)
print_info "Syncing package database..."
pacman -Sy --noconfirm >> "$LOG_FILE" 2>&1
print_info "Installing: dkms, base-devel, linux-headers, mokutil..."
pacman -S --noconfirm dkms base-devel linux-headers mokutil >> "$LOG_FILE" 2>&1
;;
zypper)
print_info "Installing: dkms, gcc, make, kernel-devel, mokutil..."
zypper install -y dkms make gcc kernel-devel mokutil >> "$LOG_FILE" 2>&1
;;
*)
print_error "Unsupported package manager: $pkg_manager"
exit 1
;;
esac
print_info "Installing: ${DEPENDENCIES[*]}"
sudo apt install -y "${DEPENDENCIES[@]}" >> "$LOG_FILE" 2>&1
check_success "Dependencies installed" "Failed to install dependencies"
print_success "Dependencies installed successfully."
}
#############################################################################
# Download driver
# Firmware Installation
#############################################################################
download_driver() {
print_step "Downloading AIC8800D80 driver..."
install_firmware() {
print_step "Installing firmware..."
# If the directory already exists, ask if you want to update
if [ -d "$DRIVER_DIR" ]; then
print_warning "Directory $DRIVER_DIR already exists."
read -p "Do you want to remove and download again? (y/N): " choice
if [[ "$choice" =~ ^[Ss]$ ]]; then
print_info "Removing old directory..."
rm -rf "$DRIVER_DIR"
check_success "Old directory removed" "Failed to remove old directory"
else
print_info "Using existing directory."
cd "$DRIVER_DIR" || exit 1
git pull >> "$LOG_FILE" 2>&1
print_info "Repository updated."
return 0
fi
fi
local fw_source="${SCRIPT_DIR}/fw/aic8800D80"
local fw_dest="/lib/firmware/aic8800D80"
# Clone repository
print_info "Cloning repository..."
cd "$HOME" || exit 1
git clone "$DRIVER_REPO" >> "$LOG_FILE" 2>&1
check_success "Repository cloned successfully" "Failed to clone repository" || exit 1
cd "$DRIVER_DIR" || exit 1
}
#############################################################################
# Installation of driver
#############################################################################
install_driver() {
print_step "Installing AIC8800D80 driver..."
cd "$DRIVER_DIR" || { print_error "Driver directory not found!"; exit 1; }
# Step 1: Copy udev rules
print_info "Copying udev rules..."
sudo cp aic.rules /lib/udev/rules.d/ >> "$LOG_FILE" 2>&1
check_success "Udev rules copied" "Failed to copy udev rules"
# Step 2: Remove old firmwares (IMPORTANT!)
print_info "Removing old firmwares (prevents freezes)..."
sudo rm -rf /lib/firmware/aic8800* >> "$LOG_FILE" 2>&1
print_success "Old firmwares removed"
# Step 3: Copy new firmware
print_info "Copying new firmware AIC8800D80..."
sudo cp -r ./fw/aic8800D80 /lib/firmware/ >> "$LOG_FILE" 2>&1
check_success "Firmware copied" "Failed to copy firmware" || exit 1
# Step 4: Navigate to driver directory
print_info "Navigating to driver directory..."
cd ./drivers/aic8800 || { print_error "Driver directory drivers/aic8800 not found!"; exit 1; }
# Check if Makefile exists
if [ ! -f "Makefile" ]; then
print_error "Makefile not found in $(pwd)"
if [ ! -d "$fw_source" ]; then
print_error "Firmware directory not found: $fw_source"
echo "Please ensure you're running the script from the repository root."
exit 1
fi
# Step 5: Compile driver
print_info "Compiling driver (this may take a few minutes)..."
make >> "$LOG_FILE" 2>&1
if [ $? -ne 0 ]; then
print_warning "Compilation failed with default GCC. Trying with gcc-12..."
make clean >> "$LOG_FILE" 2>&1
make CC=gcc-12 >> "$LOG_FILE" 2>&1
check_success "Driver compiled with gcc-12" "Failed to compile driver" || exit 1
else
print_success "Driver compiled successfully"
# Remove old firmware versions
if [ -d "$fw_dest" ]; then
print_info "Removing existing firmware..."
if [ -d "/lib/firmware" ] && [ -n "$(find /lib/firmware -maxdepth 1 -name 'aic8800*' -type d 2>/dev/null)" ]; then
rm -rf /lib/firmware/aic8800* >> "$LOG_FILE" 2>&1
fi
fi
# Step 6: Install driver
print_info "Installing driver..."
sudo make install >> "$LOG_FILE" 2>&1
check_success "Driver installed" "Failed to install driver" || exit 1
# Copy new firmware
print_info "Copying firmware to $fw_dest..."
cp -r "$fw_source" "$fw_dest" >> "$LOG_FILE" 2>&1
print_success "Firmware installed successfully."
}
#############################################################################
# Configure automatic loading
# DKMS Configuration - CORRIGIDO v2.0.4
#############################################################################
configure_autoload() {
print_step "Configuring automatic loading on boot..."
create_dkms_conf() {
print_step "Configuring DKMS..."
# Add module to /etc/modules
if ! grep -q "^$MODULE_NAME$" /etc/modules 2>/dev/null; then
echo "$MODULE_NAME" | sudo tee -a /etc/modules >> "$LOG_FILE" 2>&1
print_success "Module added to /etc/modules"
else
print_info "Module already configured in /etc/modules"
local dkms_conf="${SCRIPT_DIR}/dkms.conf"
# Check if dkms.conf already exists
if [ -f "$dkms_conf" ]; then
print_info "DKMS configuration file already exists."
return 0
fi
# Create configuration file modules-load.d
echo "$MODULE_NAME" | sudo tee /etc/modules-load.d/aic8800.conf >> "$LOG_FILE" 2>&1
print_success "Configuration file created in /etc/modules-load.d/"
print_info "Creating dkms.conf..."
# CORRIGIDO: Configuração para múltiplos módulos
cat > "$dkms_conf" << EOF
PACKAGE_NAME="${DRV_NAME}"
PACKAGE_VERSION="${DRV_VERSION}"
CLEAN="cd drivers/aic8800 && make clean"
MAKE="cd drivers/aic8800 && make"
# Módulo principal (aic8800_fdrv)
BUILT_MODULE_NAME[0]="aic8800_fdrv"
BUILT_MODULE_LOCATION[0]="drivers/aic8800/aic8800_fdrv"
DEST_MODULE_LOCATION[0]="/updates/dkms"
# Módulo de carregamento de firmware (aic_load_fw)
BUILT_MODULE_NAME[1]="aic_load_fw"
BUILT_MODULE_LOCATION[1]="drivers/aic8800/aic_load_fw"
DEST_MODULE_LOCATION[1]="/updates/dkms"
AUTOINSTALL="yes"
EOF
print_success "DKMS configuration created."
}
#############################################################################
# Load module
# DKMS Installation
#############################################################################
install_via_dkms() {
print_step "Installing driver via DKMS..."
# Remove existing DKMS installation if present
if dkms status | grep -q "${DRV_NAME}/${DRV_VERSION}"; then
print_info "Removing existing DKMS installation..."
dkms remove "${DRV_NAME}/${DRV_VERSION}" --all >> "$LOG_FILE" 2>&1 || true
fi
# Clean up old source directory
if [ -n "$SRC_DIR" ] && [ -d "$SRC_DIR" ]; then
print_info "Cleaning up old source directory..."
rm -rf "$SRC_DIR"
fi
# Copy source to /usr/src
print_info "Copying source files to $SRC_DIR..."
mkdir -p "$SRC_DIR"
cp -r "${SCRIPT_DIR}"/* "$SRC_DIR/" >> "$LOG_FILE" 2>&1
# Add to DKMS
print_info "Adding module to DKMS..."
dkms add -m "${DRV_NAME}" -v "${DRV_VERSION}" >> "$LOG_FILE" 2>&1
# Build with DKMS
print_info "Building module (this may take a few minutes)..."
if ! dkms build -m "${DRV_NAME}" -v "${DRV_VERSION}" >> "$LOG_FILE" 2>&1; then
print_error "DKMS build failed!"
echo ""
echo "Please check the log file: $LOG_FILE"
echo "Common issues:"
echo " - Missing kernel headers"
echo " - Compiler version mismatch"
echo " - Kernel version too new/old"
exit 1
fi
print_success "Module built successfully."
# Install with DKMS
print_info "Installing module..."
dkms install -m "${DRV_NAME}" -v "${DRV_VERSION}" >> "$LOG_FILE" 2>&1
print_success "Module installed via DKMS."
print_info "The driver will automatically rebuild after kernel updates."
}
#############################################################################
# Module Loading
#############################################################################
load_module() {
print_step "Loading driver module..."
print_step "Loading kernel module..."
# Update module dependencies
print_info "Updating module dependencies..."
depmod -a >> "$LOG_FILE" 2>&1
# Unload module if already loaded
if lsmod | grep -q "$MODULE_NAME"; then
print_info "Module already loaded. Reloading..."
sudo modprobe -r "$MODULE_NAME" >> "$LOG_FILE" 2>&1
modprobe -r "$MODULE_NAME" >> "$LOG_FILE" 2>&1 || true
fi
# Load module
sudo modprobe "$MODULE_NAME" >> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then
print_success "Module loaded successfully"
# Load the module
print_info "Loading $MODULE_NAME..."
if modprobe "$MODULE_NAME" >> "$LOG_FILE" 2>&1; then
print_success "Module loaded successfully."
# Check if it is listed
sleep 2
if lsmod | grep -q "$MODULE_NAME"; then
print_success "Module active in kernel"
lsmod | grep aic | tee -a "$LOG_FILE"
# Verify module is loaded
print_info "Waiting for module to initialize..."
local module_loaded=false
for i in {1..10}; do
if lsmod | grep -q "$MODULE_NAME"; then
module_loaded=true
break
fi
sleep 0.5
done
if [ "$module_loaded" = true ]; then
print_success "Module is active in kernel."
else
print_warning "Module not appears in lsmod"
print_warning "Module may not be fully initialized yet."
fi
else
print_error "Failed to load module"
echo "Check dmesg for more details: sudo dmesg | tail -50"
return 1
print_warning "Module installed but could not be loaded immediately."
print_info "This may be due to Secure Boot or missing hardware."
print_info "Try rebooting or check: sudo dmesg | grep aic8800"
fi
}
#############################################################################
# Post-installation verification
# Post-Installation Verification
#############################################################################
verify_installation() {
print_step "Verifying installation..."
# Check module
if lsmod | grep -q "$MODULE_NAME"; then
print_success "Module $MODULE_NAME is loaded"
# Check DKMS status
local dkms_status
dkms_status=$(dkms status "${DRV_NAME}/${DRV_VERSION}" 2>/dev/null || echo "not found")
if echo "$dkms_status" | grep -q "installed"; then
print_success "DKMS module registered: $dkms_status"
else
print_warning "Module is not loaded"
print_warning "DKMS status unclear: $dkms_status"
fi
# Check if module is loaded
if lsmod | grep -q "$MODULE_NAME"; then
print_success "Kernel module is loaded."
echo ""
lsmod | grep aic
else
print_info "Module not currently loaded (this is OK if no hardware is connected)."
fi
# Check firmware
if [ -d "/lib/firmware/aic8800D80" ]; then
print_success "Firmware installed in /lib/firmware/aic8800D80"
else
print_error "Firmware not found!"
fi
# Check wireless interfaces
print_info "Wireless interfaces available:"
iwconfig 2>/dev/null | grep -E "wlan|IEEE" | tee -a "$LOG_FILE"
# Check USB devices
print_info "USB devices AIC detected:"
lsusb | grep -i "aic\|368B" | tee -a "$LOG_FILE"
# Check for wireless interfaces
print_info "Checking for wireless interfaces..."
if command -v iwconfig &> /dev/null; then
iwconfig 2>/dev/null | grep -E "wlan|IEEE" || echo "No wireless interfaces detected (hardware may not be connected)"
fi
}
#############################################################################
# Final instructions
# Final Instructions
#############################################################################
show_final_instructions() {
echo ""
echo -e "${GREEN}╔════════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ INSTALLATION COMPLETED SUCCESSFULLY! ║${NC}"
echo -e "${GREEN}╚════════════════════════════════════════════════════════════════════╝${NC}"
echo -e "${GREEN}╔════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ INSTALLATION COMPLETED SUCCESSFULLY! ║${NC}"
echo -e "${GREEN}╚════════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo -e "${CYAN}Next steps:${NC}"
echo -e "${CYAN}Important Information:${NC}"
echo ""
echo "1. ${YELLOW}CONNECT THE USB ADAPTER${NC} physically (if not already connected)"
echo "✓ Driver installed via DKMS"
echo "✓ Automatic rebuild enabled for kernel updates"
echo "✓ Firmware installed in /lib/firmware/"
echo ""
echo "2. Wait a few seconds and check if it was detected:"
echo -e "${CYAN}Next Steps:${NC}"
echo ""
echo "1. Connect your AIC8800D80 USB WiFi adapter"
echo ""
echo "2. Check if the adapter is detected:"
echo " ${BLUE}lsusb | grep -i aic${NC}"
echo " ${BLUE}iwconfig${NC}"
echo " ${BLUE}ip link show${NC}"
echo ""
echo "3. To view kernel logs about the device:"
echo " ${BLUE}sudo dmesg | tail -30${NC}"
echo "3. View kernel messages about the driver:"
echo " ${BLUE}sudo dmesg | grep aic8800${NC}"
echo ""
echo "4. To connect to a WiFi network:"
echo "4. Connect to a WiFi network:"
echo " ${BLUE}nmcli device wifi list${NC}"
echo " ${BLUE}nmcli device wifi connect \"NETWORK_NAME\" password \"PASSWORD\"${NC}"
echo " ${BLUE}nmcli device wifi connect \"SSID\" password \"PASSWORD\"${NC}"
echo ""
echo "5. To disable internal WiFi (optional):"
echo " ${BLUE}rfkill list${NC}"
echo " ${BLUE}sudo rfkill block <internal_wifi_number>${NC}"
echo -e "${CYAN}Troubleshooting:${NC}"
echo ""
echo -e "${YELLOW}Important notes:${NC}"
echo "- Bluetooth does not work with this driver (known limitation)"
echo "- After kernel update, recompile the driver:"
echo " ${BLUE}cd $DRIVER_DIR/drivers/aic8800${NC}"
echo " ${BLUE}make clean && make && sudo make install${NC}"
echo "• Check DKMS status:"
echo " ${BLUE}dkms status${NC}"
echo ""
echo -e "${CYAN}Complete log saved in:${NC} $LOG_FILE"
echo "• Check loaded modules:"
echo " ${BLUE}lsmod | grep aic8800${NC}"
echo ""
echo "• Manually load the module:"
echo " ${BLUE}sudo modprobe aic8800_fdrv${NC}"
echo ""
echo "• View detailed logs:"
echo " ${BLUE}cat $LOG_FILE${NC}"
echo ""
echo -e "${YELLOW}Known Limitations:${NC}"
echo "• Bluetooth functionality is not supported"
echo "• Secure Boot may prevent module loading (disable in BIOS if needed)"
echo ""
echo -e "${CYAN}Uninstallation:${NC}"
echo " ${BLUE}sudo dkms remove ${DRV_NAME}/${DRV_VERSION} --all${NC}"
echo " ${BLUE}sudo rm -rf /lib/firmware/aic8800D80${NC}"
echo ""
}
#############################################################################
# Main function
# Main Installation Flow
#############################################################################
main() {
# Clear previous log
> "$LOG_FILE"
# Initialize log file
rm -f "$LOG_FILE" 2>/dev/null || true
touch "$LOG_FILE" 2>/dev/null || true
chmod 666 "$LOG_FILE" 2>/dev/null || true
echo -e "${CYAN}"
echo "╔════════════════════════════════════════════════════════════════════╗"
echo "║ Installation script for AIC8800D80 WiFi 6 driver ║"
echo "║ Version 1.0 - 2025-12-29 ║"
echo "╚════════════════════════════════════════════════════════════════════╝"
echo "╔════════════════════════════════════════════════════════════════╗"
echo "║ AIC8800D80 WiFi 6 Driver - Universal Installer (DKMS) ║"
echo "║ Version 2.0.4 (Fixed) ║"
echo "╚════════════════════════════════════════════════════════════════╝"
echo -e "${NC}"
# Step 1: Check Secure Boot (REQUIRED)
check_secure_boot || exit 1
log_message "START" "Installation started"
log_message "INFO" "Kernel: $(uname -r)"
log_message "INFO" "Distribution: $(cat /etc/os-release 2>/dev/null | grep PRETTY_NAME | cut -d= -f2 | tr -d '"')"
# Step 2: Check requirements
check_requirements
# Step 1: Check root privileges
check_root
# Step 3: Install dependencies
install_dependencies
# Step 2: Check Secure Boot
check_secure_boot
# Step 4: Download driver
download_driver
# Step 3: Detect package manager
detect_package_manager
# Step 5: Install driver
install_driver
# Step 4: Install dependencies
install_dependencies "$DETECTED_PKG_MANAGER"
# Step 6: Configure autoload
configure_autoload
# Step 5: Install firmware
install_firmware
# Step 7: Load module
# Step 6: Create DKMS configuration
create_dkms_conf
# Step 7: Install via DKMS
install_via_dkms
# Step 8: Load the module
load_module
# Step 8: Verify installation
# Step 9: Verify installation
verify_installation
# Step 9: Show final instructions
# Step 10: Show final instructions
show_final_instructions
log_message "END" "Installation completed successfully"
}
# Execute script
# Execute main function
main "$@"
exit 0