Инициализация
This commit is contained in:
Executable
+314
@@ -0,0 +1,314 @@
|
||||
#!/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 "$@"
|
||||
Reference in New Issue
Block a user