Files
calista_main/driver_installer
2026-04-18 23:37:16 +05:00

315 lines
12 KiB
Bash
Executable File

#!/bin/sh
# Конфигурация
CACHE_DIR="/calista/cache"
DRIVER_LIST_URL="https://gitlab.svsptech.ru/svsptech/calista_drivers/raw/branch/main/driver.list"
DRIVER_LIST_FILE="$CACHE_DIR/driver.list"
REGISTRY_FILE="/calista/registry.db"
EXPECTED_VERSION="ver0"
# Создаём директорию кеша, если её нет
mkdir -p "$CACHE_DIR"
# Функция логирования в реестр
log_to_registry() {
local type="$1"
local details="$2"
if [ -f "$REGISTRY_FILE" ]; then
sqlite3 "$REGISTRY_FILE" "INSERT INTO calista_log (type, user, details)
VALUES ('$type', '$USER', '$details');" 2>/dev/null
fi
}
# Функция скачивания и обновления файла driver.list
update_driver_list() {
echo "Обновление списка драйверов..."
# Скачиваем файл во временный
TEMP_FILE="$CACHE_DIR/driver.list.tmp"
if fetch -o "$TEMP_FILE" "$DRIVER_LIST_URL" 2>/dev/null; then
# Проверяем версию файла (первая строка)
VERSION=$(head -1 "$TEMP_FILE" 2>/dev/null)
if [ "$VERSION" != "$EXPECTED_VERSION" ]; then
echo "Ошибка: Неподдерживаемая версия файла драйверов: $VERSION (ожидается $EXPECTED_VERSION)"
log_to_registry "error" "Неподдерживаемая версия driver.list: $VERSION"
rm -f "$TEMP_FILE"
return 1
fi
# Перемещаем временный файл в основной
mv "$TEMP_FILE" "$DRIVER_LIST_FILE"
echo "Список драйверов обновлён (версия: $VERSION)"
log_to_registry "info" "Список драйверов обновлён (версия: $VERSION)"
return 0
else
echo "Ошибка: Не удалось скачать список драйверов"
log_to_registry "error" "Не удалось скачать $DRIVER_LIST_URL"
rm -f "$TEMP_FILE"
return 1
fi
}
# Функция поиска устройства в driver.list
# Возвращает полную строку из файла
find_device_in_list() {
local vendor="$1"
local device="$2"
if [ ! -f "$DRIVER_LIST_FILE" ]; then
return 1
fi
# Пропускаем первую строку (версия) и ищем точное совпадение
grep -v "^ver" "$DRIVER_LIST_FILE" 2>/dev/null | grep "^${vendor}:${device}:" | head -1
}
# -------------------------------------------------------------------
# Команда: get_name
# Получение названия устройства по vendor и device
# -------------------------------------------------------------------
cmd_get_name() {
local vendor="$1"
local device="$2"
if [ -z "$vendor" ] || [ -z "$device" ]; then
echo "Ошибка: Не указаны vendor и device"
exit 1
fi
# Проверяем наличие файла, если нет — скачиваем
if [ ! -f "$DRIVER_LIST_FILE" ]; then
echo "Файл driver.list не найден, скачиваем..."
if ! update_driver_list; then
echo "Неизвестное устройство"
exit 1
fi
fi
# Ищем устройство
DEVICE_LINE=$(find_device_in_list "$vendor" "$device")
if [ -n "$DEVICE_LINE" ]; then
# Извлекаем название (третий столбец)
DEVICE_NAME=$(echo "$DEVICE_LINE" | cut -d':' -f3)
echo "$DEVICE_NAME"
else
echo "Неизвестное устройство"
fi
}
# -------------------------------------------------------------------
# Команда: install
# Установка драйвера для устройства
# -------------------------------------------------------------------
cmd_install() {
local vendor="$1"
local device="$2"
if [ -z "$vendor" ] || [ -z "$device" ]; then
echo "Ошибка: Не указаны vendor и device"
exit 1
fi
echo "Установка драйвера для $vendor:$device..."
log_to_registry "info" "Начало установки драйвера для $vendor:$device"
# Проверяем наличие файла, если нет — скачиваем
if [ ! -f "$DRIVER_LIST_FILE" ]; then
echo "Файл driver.list не найден, скачиваем..."
if ! update_driver_list; then
log_to_registry "error" "Не удалось скачать driver.list"
exit 1
fi
fi
# Ищем устройство
DEVICE_LINE=$(find_device_in_list "$vendor" "$device")
if [ -z "$DEVICE_LINE" ]; then
echo "Ошибка: Устройство $vendor:$device не найдено в driver.list"
log_to_registry "error" "Устройство $vendor:$device не найдено в driver.list"
exit 1
fi
# Разбираем строку: vendor:device:name:type:url
DEVICE_NAME=$(echo "$DEVICE_LINE" | cut -d':' -f3)
DEVICE_TYPE=$(echo "$DEVICE_LINE" | cut -d':' -f4)
DEVICE_URL=$(echo "$DEVICE_LINE" | cut -d':' -f5)
echo " Устройство: $DEVICE_NAME"
echo " Тип драйвера: $DEVICE_TYPE"
# Проверяем тип драйвера
if [ "$DEVICE_TYPE" = "builtin" ]; then
echo " Драйвер встроен в ядро FreeBSD, установка не требуется"
log_to_registry "info" "Драйвер для $vendor:$device встроен в ядро"
# Обновляем статус в реестре
if [ -f "$REGISTRY_FILE" ]; then
sqlite3 "$REGISTRY_FILE" "UPDATE devices SET status='installed'
WHERE vendor='$vendor' AND device='$device';" 2>/dev/null
fi
exit 0
fi
# Проверяем тип https
if [ "$DEVICE_TYPE" != "https" ]; then
echo "Ошибка: Неподдерживаемый тип драйвера: $DEVICE_TYPE"
log_to_registry "error" "Неподдерживаемый тип драйвера: $DEVICE_TYPE"
exit 1
fi
if [ -z "$DEVICE_URL" ]; then
echo "Ошибка: Не указана ссылка для скачивания"
log_to_registry "error" "Не указана ссылка для скачивания драйвера"
exit 1
fi
# Создаём директорию для драйвера
DRIVER_CACHE_DIR="$CACHE_DIR/drivers/${vendor}_${device}"
mkdir -p "$DRIVER_CACHE_DIR"
# Скачиваем архив
echo " Скачивание драйвера из $DEVICE_URL..."
ARCHIVE_FILE="$DRIVER_CACHE_DIR/driver.zip"
if fetch -o "$ARCHIVE_FILE" "https://$DEVICE_URL" 2>/dev/null; then
echo " Архив скачан: $ARCHIVE_FILE"
else
echo "Ошибка: Не удалось скачать архив"
log_to_registry "error" "Не удалось скачать архив $DEVICE_URL"
exit 1
fi
# Распаковываем архив
echo " Распаковка архива..."
EXTRACT_DIR="$DRIVER_CACHE_DIR/extracted"
mkdir -p "$EXTRACT_DIR"
# Определяем тип архива по расширению
case "$ARCHIVE_FILE" in
*.zip)
if ! unzip -q "$ARCHIVE_FILE" -d "$EXTRACT_DIR" 2>/dev/null; then
echo "Ошибка: Не удалось распаковать zip-архив"
log_to_registry "error" "Не удалось распаковать zip-архив"
exit 1
fi
;;
*.tar.gz|*.tgz)
if ! tar -xzf "$ARCHIVE_FILE" -C "$EXTRACT_DIR" 2>/dev/null; then
echo "Ошибка: Не удалось распаковать tar.gz-архив"
log_to_registry "error" "Не удалось распаковать tar.gz-архив"
exit 1
fi
;;
*.tar)
if ! tar -xf "$ARCHIVE_FILE" -C "$EXTRACT_DIR" 2>/dev/null; then
echo "Ошибка: Не удалось распаковать tar-архив"
log_to_registry "error" "Не удалось распаковать tar-архив"
exit 1
fi
;;
*)
echo "Ошибка: Неизвестный формат архива"
log_to_registry "error" "Неизвестный формат архива: $ARCHIVE_FILE"
exit 1
;;
esac
echo " Архив распакован в $EXTRACT_DIR"
# Ищем файл build в распакованной директории
BUILD_SCRIPT=$(find "$EXTRACT_DIR" -name "build" -type f -executable 2>/dev/null | head -1)
if [ -z "$BUILD_SCRIPT" ]; then
echo "Ошибка: Файл build не найден в архиве"
log_to_registry "error" "Файл build не найден в архиве"
exit 1
fi
BUILD_DIR=$(dirname "$BUILD_SCRIPT")
# Выполняем сборку
echo " Запуск сборки драйвера..."
echo " Рабочая директория: $BUILD_DIR"
cd "$BUILD_DIR" || {
echo "Ошибка: Не удалось перейти в директорию $BUILD_DIR"
log_to_registry "error" "Не удалось перейти в директорию $BUILD_DIR"
exit 1
}
if ./build; then
echo " Сборка драйвера завершена успешно"
log_to_registry "info" "Драйвер для $vendor:$device установлен успешно"
# Обновляем статус в реестре
if [ -f "$REGISTRY_FILE" ]; then
sqlite3 "$REGISTRY_FILE" "UPDATE devices SET status='installed_calista', name='$DEVICE_NAME'
WHERE vendor='$vendor' AND device='$device';" 2>/dev/null
fi
exit 0
else
if [ -f "$REGISTRY_FILE" ]; then
sqlite3 "$REGISTRY_FILE" "UPDATE devices SET status='installed_calista_error', name='$DEVICE_NAME'
WHERE vendor='$vendor' AND device='$device';" 2>/dev/null
fi
echo "Ошибка: Сборка драйвера завершилась с ошибкой"
log_to_registry "error" "Сборка драйвера для $vendor:$device завершилась с ошибкой"
exit 1
fi
}
# -------------------------------------------------------------------
# Команда: update_list
# Принудительное обновление списка драйверов
# -------------------------------------------------------------------
cmd_update_list() {
echo "Принудительное обновление списка драйверов..."
if update_driver_list; then
echo "Список драйверов успешно обновлён"
exit 0
else
echo "Ошибка обновления списка драйверов"
exit 1
fi
}
# -------------------------------------------------------------------
# Точка входа
# -------------------------------------------------------------------
main() {
local command="$1"
local vendor="$2"
local device="$3"
case "$command" in
get_name)
cmd_get_name "$vendor" "$device"
;;
install)
cmd_install "$vendor" "$device"
;;
update_list)
cmd_update_list
;;
*)
echo "Использование:"
echo " $0 get_name <vendor> <device> - получить название устройства"
echo " $0 install <vendor> <device> - установить драйвер"
echo " $0 update_list - обновить список драйверов"
echo ""
echo "Пример:"
echo " $0 get_name 0x10de 0x0398"
echo " $0 install 0x10de 0x0398"
exit 1
;;
esac
}
main "$@"