calista_main/driver_installer

315 lines
12 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 "$@"