mirror of
https://github.com/shenmintao/aic8800d80.git
synced 2026-11-10 16:49:17 +00:00
install.sh ran as root and created /tmp/aic8800d80_install.log with mode
666 at a fixed, predictable path. Root writing to a fixed name in /tmp is
open to symlink races (mitigated, not removed, by fs.protected_symlinks),
and a world-writable log lets any local user alter what an administrator
later reads.
The log now lives at /var/log/aic8800-install.log, is created with mode
0644 only after the root check, and failed writes before that point are
silenced instead of printing redirection errors. diagnostic_build.sh
reads the new path and falls back to the old one for logs left by
earlier installers.
(cherry picked from commit ef66811ca5)
197 lines
6.5 KiB
Bash
Executable File
197 lines
6.5 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
#############################################################################
|
|
# Diagnostic Build Script - AIC8800D80 Driver Build Failure
|
|
# Run this script to diagnose the problem with the DKMS
|
|
#############################################################################
|
|
|
|
echo "╔════════════════════════════════════════════════════════════════╗"
|
|
echo "║ DIAGNOSTIC BUILD SCRIPT - AIC8800D80 DRIVER ║"
|
|
echo "╚════════════════════════════════════════════════════════════════╝"
|
|
echo ""
|
|
|
|
# Colors
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
DRV_NAME="aic8800"
|
|
DRV_VERSION="1.0.0"
|
|
INSTALL_LOG="/var/log/aic8800-install.log"
|
|
# Installers before this change wrote their log to /tmp.
|
|
if [ ! -f "$INSTALL_LOG" ] && [ -f /tmp/aic8800d80_install.log ]; then
|
|
INSTALL_LOG="/tmp/aic8800d80_install.log"
|
|
fi
|
|
|
|
read_dkms_conf_value() {
|
|
local key="$1"
|
|
local file="$2"
|
|
|
|
grep -E "^[[:space:]]*${key}[[:space:]]*=" "$file" 2>/dev/null \
|
|
| head -1 \
|
|
| cut -d= -f2- \
|
|
| tr -d "\"'[:space:]"
|
|
}
|
|
|
|
if [ -f "./dkms.conf" ]; then
|
|
detected_name="$(read_dkms_conf_value PACKAGE_NAME ./dkms.conf)"
|
|
detected_version="$(read_dkms_conf_value PACKAGE_VERSION ./dkms.conf)"
|
|
[ -n "$detected_name" ] && DRV_NAME="$detected_name"
|
|
[ -n "$detected_version" ] && DRV_VERSION="$detected_version"
|
|
fi
|
|
|
|
mapfile -t DKMS_SOURCE_DIRS < <(find /usr/src -maxdepth 1 -type d -name "${DRV_NAME}-*" -print 2>/dev/null | sort)
|
|
|
|
print_section() {
|
|
echo ""
|
|
echo -e "${BLUE}━━━ $1 ━━━${NC}"
|
|
echo ""
|
|
}
|
|
|
|
print_section "1. Checking directory structure"
|
|
|
|
echo "Current directory:"
|
|
pwd
|
|
echo ""
|
|
|
|
echo "Current directory content:"
|
|
ls -la
|
|
echo ""
|
|
|
|
echo "Checking if drivers/aic8800/ exists:"
|
|
if [ -d "drivers/aic8800" ]; then
|
|
echo -e "${GREEN}✓${NC} drivers/aic8800 directory exists"
|
|
echo ""
|
|
echo "drivers/aic8800/ content:"
|
|
ls -la drivers/aic8800/
|
|
echo ""
|
|
|
|
echo "Checking Makefile:"
|
|
if [ -f "drivers/aic8800/Makefile" ]; then
|
|
echo -e "${GREEN}✓${NC} Makefile found"
|
|
echo ""
|
|
echo "First 20 lines of Makefile:"
|
|
head -20 drivers/aic8800/Makefile
|
|
else
|
|
echo -e "${RED}✗${NC} Makefile NOT FOUND!"
|
|
echo "This is probably the problem!"
|
|
fi
|
|
else
|
|
echo -e "${RED}✗${NC} drivers/aic8800 directory NOT FOUND!"
|
|
echo "The script expects to find the source code in drivers/aic8800/"
|
|
fi
|
|
|
|
print_section "2. Checking DKMS directory"
|
|
|
|
echo "Detected package: ${DRV_NAME}/${DRV_VERSION}"
|
|
if [ "${#DKMS_SOURCE_DIRS[@]}" -gt 0 ]; then
|
|
for source_dir in "${DKMS_SOURCE_DIRS[@]}"; do
|
|
echo -e "${GREEN}✓${NC} $source_dir directory exists"
|
|
echo ""
|
|
echo "Content:"
|
|
ls -la "$source_dir/"
|
|
echo ""
|
|
|
|
echo "Checking drivers/aic8800 inside DKMS:"
|
|
if [ -d "$source_dir/drivers/aic8800" ]; then
|
|
echo -e "${GREEN}✓${NC} drivers/aic8800 copied to DKMS"
|
|
ls -la "$source_dir/drivers/aic8800/"
|
|
else
|
|
echo -e "${RED}✗${NC} drivers/aic8800 NOT copied correctly!"
|
|
fi
|
|
echo ""
|
|
done
|
|
else
|
|
echo -e "${RED}✗${NC} No /usr/src/${DRV_NAME}-* directory found"
|
|
fi
|
|
|
|
print_section "3. Checking DKMS build logs"
|
|
|
|
mapfile -t BUILD_LOGS < <(find "/var/lib/dkms/${DRV_NAME}" -type f -name make.log -print 2>/dev/null | sort)
|
|
|
|
if [ "${#BUILD_LOGS[@]}" -gt 0 ]; then
|
|
for build_log in "${BUILD_LOGS[@]}"; do
|
|
echo -e "${GREEN}✓${NC} Build log found: $build_log"
|
|
echo ""
|
|
echo "Last 50 lines of make.log:"
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
tail -50 "$build_log"
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo ""
|
|
done
|
|
else
|
|
echo -e "${RED}✗${NC} No make.log found under /var/lib/dkms/${DRV_NAME}/"
|
|
echo "The module may not have reached the build step yet, or this DKMS version stores logs elsewhere."
|
|
fi
|
|
|
|
if [ -f "$INSTALL_LOG" ]; then
|
|
echo ""
|
|
echo -e "${GREEN}✓${NC} Installer log found: $INSTALL_LOG"
|
|
echo "Last 50 lines of installer log:"
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
tail -50 "$INSTALL_LOG"
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
else
|
|
echo -e "${YELLOW}!${NC} Installer log not found: $INSTALL_LOG"
|
|
fi
|
|
|
|
print_section "4. Checking dkms.conf"
|
|
|
|
if [ "${#DKMS_SOURCE_DIRS[@]}" -gt 0 ]; then
|
|
for source_dir in "${DKMS_SOURCE_DIRS[@]}"; do
|
|
if [ -f "$source_dir/dkms.conf" ]; then
|
|
echo -e "${GREEN}✓${NC} dkms.conf found: $source_dir/dkms.conf"
|
|
echo ""
|
|
cat "$source_dir/dkms.conf"
|
|
echo ""
|
|
else
|
|
echo -e "${RED}✗${NC} dkms.conf NOT FOUND in $source_dir"
|
|
fi
|
|
done
|
|
else
|
|
echo -e "${RED}✗${NC} No DKMS source directory available to inspect"
|
|
fi
|
|
|
|
if [ -f "./dkms.conf" ]; then
|
|
echo ""
|
|
echo "dkms.conf in current directory:"
|
|
cat ./dkms.conf
|
|
fi
|
|
|
|
print_section "5. Checking firmware"
|
|
|
|
if [ -d "/lib/firmware/aic8800D80" ]; then
|
|
echo -e "${GREEN}✓${NC} Firmware installed"
|
|
ls -la /lib/firmware/aic8800D80/
|
|
else
|
|
echo -e "${RED}✗${NC} Firmware NOT installed"
|
|
fi
|
|
|
|
print_section "6. System information"
|
|
|
|
echo "Kernel: $(uname -r)"
|
|
echo "Architecture: $(uname -m)"
|
|
echo ""
|
|
echo "Compiler version:"
|
|
if command -v gcc >/dev/null 2>&1; then
|
|
gcc --version | head -1
|
|
elif command -v clang >/dev/null 2>&1; then
|
|
clang --version | head -1
|
|
else
|
|
echo "No gcc or clang found"
|
|
fi
|
|
echo ""
|
|
echo "Installed kernel headers:"
|
|
ls -d "/lib/modules/$(uname -r)/build" 2>/dev/null && echo "✓ Headers found" || echo "✗ Headers NOT found"
|
|
|
|
print_section "7. DKMS status"
|
|
|
|
echo "DKMS modules registered:"
|
|
if command -v dkms >/dev/null 2>&1; then
|
|
dkms status
|
|
else
|
|
echo -e "${RED}✗${NC} dkms command not found"
|
|
fi
|