Инициализация
This commit is contained in:
commit
37c4c35308
Binary file not shown.
Binary file not shown.
22
builtin_devices
Normal file
22
builtin_devices
Normal file
@ -0,0 +1,22 @@
|
||||
ver0
|
||||
0x8086:0x27a0:Intel 945GM/PM Host Bridge:builtin:
|
||||
0x8086:0x27a1:Intel 945GM/PM PCI Express Root Port:builtin:
|
||||
0x8086:0x27d8:Intel ICH7-M High Definition Audio:builtin:
|
||||
0x8086:0x27d0:Intel ICH7-M PCI Express Port 1:builtin:
|
||||
0x8086:0x27d2:Intel ICH7-M PCI Express Port 2:builtin:
|
||||
0x8086:0x27d4:Intel ICH7-M PCI Express Port 3:builtin:
|
||||
0x8086:0x27c8:Intel ICH7-M USB UHCI Controller #1:builtin:
|
||||
0x8086:0x27c9:Intel ICH7-M USB UHCI Controller #2:builtin:
|
||||
0x8086:0x27ca:Intel ICH7-M USB UHCI Controller #3:builtin:
|
||||
0x8086:0x27cb:Intel ICH7-M USB UHCI Controller #4:builtin:
|
||||
0x8086:0x27cc:Intel ICH7-M USB2 EHCI Controller:builtin:
|
||||
0x8086:0x2448:Intel 82801 PCI Bridge:builtin:
|
||||
0x8086:0x27b9:Intel ICH7-M LPC Interface Bridge:builtin:
|
||||
0x8086:0x27c4:Intel ICH7-M IDE/SATA Controller:builtin:
|
||||
0x8086:0x27da:Intel ICH7-M SMBus Controller:builtin:
|
||||
0x8086:0x4222:Intel PRO/Wireless 3945ABG Wi-Fi:builtin:
|
||||
0x104c:0x8039:Texas Instruments PCIxx12 CardBus Controller:builtin:
|
||||
0x104c:0x803a:Texas Instruments PCIxx12 FireWire Controller:builtin:
|
||||
0x104c:0x803b:Texas Instruments PCIxx12 Flash Media Controller:builtin:
|
||||
0x104c:0x803c:Texas Instruments PCIxx12 SD/MMC Host Controller:builtin:
|
||||
0x8086:0x1092:Intel PRO/100 VE Ethernet:builtin:
|
||||
23
cache/driver.list
vendored
Normal file
23
cache/driver.list
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
ver0
|
||||
0x8086:0x27a0:Intel 945GM/PM Host Bridge:builtin:
|
||||
0x8086:0x27a1:Intel 945GM/PM PCI Express Root Port:builtin:
|
||||
0x8086:0x27d8:Intel ICH7-M High Definition Audio:builtin:
|
||||
0x8086:0x27d0:Intel ICH7-M PCI Express Port 1:builtin:
|
||||
0x8086:0x27d2:Intel ICH7-M PCI Express Port 2:builtin:
|
||||
0x8086:0x27d4:Intel ICH7-M PCI Express Port 3:builtin:
|
||||
0x8086:0x27c8:Intel ICH7-M USB UHCI Controller #1:builtin:
|
||||
0x8086:0x27c9:Intel ICH7-M USB UHCI Controller #2:builtin:
|
||||
0x8086:0x27ca:Intel ICH7-M USB UHCI Controller #3:builtin:
|
||||
0x8086:0x27cb:Intel ICH7-M USB UHCI Controller #4:builtin:
|
||||
0x8086:0x27cc:Intel ICH7-M USB2 EHCI Controller:builtin:
|
||||
0x8086:0x2448:Intel 82801 PCI Bridge:builtin:
|
||||
0x8086:0x27b9:Intel ICH7-M LPC Interface Bridge:builtin:
|
||||
0x8086:0x27c4:Intel ICH7-M IDE/SATA Controller:builtin:
|
||||
0x8086:0x27da:Intel ICH7-M SMBus Controller:builtin:
|
||||
0x10de:0x0398:Nvidia GeForce Go 7600:https:gitlab.svsptech.ru/svsptech/calista_nvidia304driver/archive/main.zip
|
||||
0x8086:0x4222:Intel PRO/Wireless 3945ABG Wi-Fi:builtin:
|
||||
0x104c:0x8039:Texas Instruments PCIxx12 CardBus Controller:builtin:
|
||||
0x104c:0x803a:Texas Instruments PCIxx12 FireWire Controller:builtin:
|
||||
0x104c:0x803b:Texas Instruments PCIxx12 Flash Media Controller:builtin:
|
||||
0x104c:0x803c:Texas Instruments PCIxx12 SD/MMC Host Controller:builtin:
|
||||
0x8086:0x1092:Intel PRO/100 VE Ethernet:builtin:
|
||||
BIN
cache/drivers/0x10de_0x0398/driver.zip
vendored
Normal file
BIN
cache/drivers/0x10de_0x0398/driver.zip
vendored
Normal file
Binary file not shown.
13
cache/drivers/0x10de_0x0398/extracted/calista_nvidia304driver/build
vendored
Executable file
13
cache/drivers/0x10de_0x0398/extracted/calista_nvidia304driver/build
vendored
Executable file
@ -0,0 +1,13 @@
|
||||
#/bin/sh
|
||||
|
||||
tar -xzvf driver304.pkg -C /
|
||||
tar -xzvf kmod304.pkg -C /
|
||||
|
||||
if grep -q "kld_list=.*nvidia" "/etc/rc.conf" 2>/dev/null; then
|
||||
echo "Модуль nvidia уже есть в kld_list"
|
||||
else
|
||||
sysrc kld_list+=" nvidia"
|
||||
echo "Модуль nvidia добавлен в kld_list"
|
||||
fi
|
||||
|
||||
kldload nvidia
|
||||
BIN
cache/drivers/0x10de_0x0398/extracted/calista_nvidia304driver/driver304.pkg
vendored
Normal file
BIN
cache/drivers/0x10de_0x0398/extracted/calista_nvidia304driver/driver304.pkg
vendored
Normal file
Binary file not shown.
BIN
cache/drivers/0x10de_0x0398/extracted/calista_nvidia304driver/kmod304.pkg
vendored
Normal file
BIN
cache/drivers/0x10de_0x0398/extracted/calista_nvidia304driver/kmod304.pkg
vendored
Normal file
Binary file not shown.
221
devices
Executable file
221
devices
Executable file
@ -0,0 +1,221 @@
|
||||
#!/bin/sh
|
||||
|
||||
export PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin"
|
||||
|
||||
REGISTRY_FILE="/calista/registry.db"
|
||||
BUILTIN_FILE="/calista/builtin_devices"
|
||||
DRIVER_INSTALLER="/calista/driver_installer"
|
||||
DETECTED_DEVICES="/tmp/calista_detected_devices.tmp"
|
||||
|
||||
# Функция логирования
|
||||
log_to_registry() {
|
||||
local type="$1"
|
||||
local details="$2"
|
||||
sqlite3 "$REGISTRY_FILE" "INSERT INTO calista_log (type, user, details)
|
||||
VALUES ('$type', '$USER', '$details');" 2>/dev/null
|
||||
}
|
||||
|
||||
# Проверяем, что реестр существует
|
||||
if [ ! -f "$REGISTRY_FILE" ]; then
|
||||
echo "Ошибка: Реестр не найден: $REGISTRY_FILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Функция поиска устройства в файле builtin_devices
|
||||
lookup_builtin_device() {
|
||||
local vendor="$1"
|
||||
local device="$2"
|
||||
if [ -f "$BUILTIN_FILE" ]; then
|
||||
grep -v "^ver" "$BUILTIN_FILE" 2>/dev/null | grep "^${vendor}:${device}:" | head -1
|
||||
fi
|
||||
}
|
||||
|
||||
# Очищаем файл обнаруженных устройств
|
||||
> "$DETECTED_DEVICES"
|
||||
|
||||
log_to_registry "info" "Запущено обновление списка устройств"
|
||||
|
||||
# -------------------------------------------------------------------
|
||||
# 1. Сканирование PCI-устройств
|
||||
# -------------------------------------------------------------------
|
||||
echo "Сканирование PCI-устройств..."
|
||||
|
||||
pciconf -l | while read -r line; do
|
||||
DEV_NAME=$(echo "$line" | awk '{print $1}' | cut -d'@' -f1)
|
||||
|
||||
VENDOR=$(echo "$line" | grep -o 'vendor=0x[0-9a-fA-F]*' | cut -d'=' -f2 | head -1)
|
||||
DEVICE=$(echo "$line" | grep -o 'device=0x[0-9a-fA-F]*' | cut -d'=' -f2 | head -1)
|
||||
SUBVENDOR=$(echo "$line" | grep -o 'subvendor=0x[0-9a-fA-F]*' | cut -d'=' -f2 | head -1)
|
||||
SUBDEVICE=$(echo "$line" | grep -o 'subdevice=0x[0-9a-fA-F]*' | cut -d'=' -f2 | head -1)
|
||||
CLASS=$(echo "$line" | grep -o 'class=0x[0-9a-fA-F]*' | cut -d'=' -f2 | head -1)
|
||||
|
||||
if [ -z "$VENDOR" ] || [ -z "$DEVICE" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
echo "pci|$VENDOR|$DEVICE" >> "$DETECTED_DEVICES"
|
||||
|
||||
CURRENT_STATUS=$(sqlite3 "$REGISTRY_FILE" "SELECT status FROM devices
|
||||
WHERE bus='pci' AND vendor='$VENDOR' AND device='$DEVICE';" 2>/dev/null)
|
||||
|
||||
BUILTIN_INFO=$(lookup_builtin_device "$VENDOR" "$DEVICE")
|
||||
|
||||
if [ -n "$BUILTIN_INFO" ]; then
|
||||
DEVICE_NAME=$(echo "$BUILTIN_INFO" | cut -d':' -f3)
|
||||
DEVICE_TYPE=$(echo "$BUILTIN_INFO" | cut -d':' -f4)
|
||||
|
||||
if [ "$DEVICE_TYPE" = "builtin" ]; then
|
||||
if [ "$DEV_NAME" != "none" ] && [ -n "$DEV_NAME" ]; then
|
||||
STATUS="installed"
|
||||
DRIVER="$DEV_NAME"
|
||||
else
|
||||
STATUS="builtin_available"
|
||||
DRIVER=""
|
||||
fi
|
||||
else
|
||||
if [ "$DEV_NAME" != "none" ] && [ -n "$DEV_NAME" ]; then
|
||||
STATUS="installed"
|
||||
DRIVER="$DEV_NAME"
|
||||
else
|
||||
STATUS="not_installed"
|
||||
DRIVER=""
|
||||
fi
|
||||
fi
|
||||
else
|
||||
DEVICE_NAME="Неизвестное устройство (Class: $CLASS)"
|
||||
DEVICE_TYPE="unknown"
|
||||
|
||||
if [ "$DEV_NAME" != "none" ] && [ -n "$DEV_NAME" ]; then
|
||||
STATUS="installed"
|
||||
DRIVER="$DEV_NAME"
|
||||
else
|
||||
STATUS="not_installed"
|
||||
DRIVER=""
|
||||
fi
|
||||
fi
|
||||
|
||||
# Проверяем, существует ли запись
|
||||
EXISTS=$(sqlite3 "$REGISTRY_FILE" "SELECT 1 FROM devices WHERE bus='pci' AND vendor='$VENDOR' AND device='$DEVICE';" 2>/dev/null)
|
||||
|
||||
if [ -z "$EXISTS" ]; then
|
||||
# Новая запись
|
||||
sqlite3 "$REGISTRY_FILE" <<EOF
|
||||
INSERT INTO devices (bus, vendor, device, subvendor, subdevice, name, status, driver, detected_at)
|
||||
VALUES ('pci', '$VENDOR', '$DEVICE', '$SUBVENDOR', '$SUBDEVICE', '$DEVICE_NAME', '$STATUS', '$DRIVER', CURRENT_TIMESTAMP);
|
||||
EOF
|
||||
echo " PCI: $VENDOR:$DEVICE -> $DEVICE_NAME (статус: $STATUS) [НОВОЕ]"
|
||||
else
|
||||
# Обновляем только статус и driver, если они изменились и статус не calista
|
||||
if [ "$CURRENT_STATUS" != "installed_calista" ] && [ "$CURRENT_STATUS" != "installed_calista_error" ]; then
|
||||
sqlite3 "$REGISTRY_FILE" <<EOF
|
||||
UPDATE devices SET status='$STATUS', driver='$DRIVER', detected_at=CURRENT_TIMESTAMP
|
||||
WHERE bus='pci' AND vendor='$VENDOR' AND device='$DEVICE';
|
||||
EOF
|
||||
fi
|
||||
echo " PCI: $VENDOR:$DEVICE -> $DEVICE_NAME (статус: $STATUS) [ОБНОВЛЕНО]"
|
||||
fi
|
||||
|
||||
# Логика установки драйвера
|
||||
if [ "$CURRENT_STATUS" != "installed_calista" ] && [ "$CURRENT_STATUS" != "installed_calista_error" ] && [ "$DEVICE_TYPE" != "builtin" ]; then
|
||||
echo " -> Попытка установки через driver-installer..."
|
||||
|
||||
if [ -x "$DRIVER_INSTALLER" ]; then
|
||||
"$DRIVER_INSTALLER" get_name "$VENDOR" "$DEVICE" > /dev/null 2>&1
|
||||
DEVICE_CHECK=$("$DRIVER_INSTALLER" get_name "$VENDOR" "$DEVICE" 2>/dev/null)
|
||||
|
||||
if [ "$DEVICE_CHECK" != "Неизвестное устройство" ] && [ -n "$DEVICE_CHECK" ]; then
|
||||
echo " -> Найден драйвер: $DEVICE_CHECK"
|
||||
"$DRIVER_INSTALLER" install "$VENDOR" "$DEVICE"
|
||||
else
|
||||
echo " -> Драйвер не найден в driver.list"
|
||||
fi
|
||||
fi
|
||||
elif [ "$CURRENT_STATUS" = "installed_calista" ]; then
|
||||
echo " -> Уже установлен через Calista, пропускаем"
|
||||
elif [ "$DEVICE_TYPE" = "builtin" ]; then
|
||||
echo " -> Встроен в ядро, установка не требуется"
|
||||
fi
|
||||
done
|
||||
|
||||
# -------------------------------------------------------------------
|
||||
# 2. Сканирование USB-устройств
|
||||
# -------------------------------------------------------------------
|
||||
echo "Сканирование USB-устройств..."
|
||||
|
||||
usbconfig list | grep -E "^ugen[0-9]+\.[0-9]+:" | while read -r line; do
|
||||
DEV_NAME=$(echo "$line" | awk '{print $1}' | cut -d':' -f1)
|
||||
|
||||
if echo "$DEV_NAME" | grep -q "\.1$"; then
|
||||
continue
|
||||
fi
|
||||
|
||||
DEV_INFO=$(usbconfig -d "$DEV_NAME" dump_device_desc 2>/dev/null)
|
||||
|
||||
VENDOR=$(echo "$DEV_INFO" | grep "idVendor" | sed -E 's/.*idVendor *= *0x([0-9a-fA-F]+).*/0x\1/' | head -1)
|
||||
PRODUCT=$(echo "$DEV_INFO" | grep "idProduct" | sed -E 's/.*idProduct *= *0x([0-9a-fA-F]+).*/0x\1/' | head -1)
|
||||
|
||||
if [ -z "$VENDOR" ] || [ -z "$PRODUCT" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
echo "usb|$VENDOR|$PRODUCT" >> "$DETECTED_DEVICES"
|
||||
|
||||
BUILTIN_INFO=$(lookup_builtin_device "$VENDOR" "$PRODUCT")
|
||||
|
||||
if [ -n "$BUILTIN_INFO" ]; then
|
||||
DEVICE_NAME=$(echo "$BUILTIN_INFO" | cut -d':' -f3)
|
||||
DEVICE_TYPE=$(echo "$BUILTIN_INFO" | cut -d':' -f4)
|
||||
STATUS="not_installed"
|
||||
else
|
||||
MANUFACTURER=$(echo "$DEV_INFO" | grep "iManufacturer" | head -1 | sed -E 's/.*<([^>]+)>.*/\1/')
|
||||
PRODUCT_NAME=$(echo "$DEV_INFO" | grep "iProduct" | head -1 | sed -E 's/.*<([^>]+)>.*/\1/')
|
||||
|
||||
if [ -n "$MANUFACTURER" ] && [ -n "$PRODUCT_NAME" ]; then
|
||||
DEVICE_NAME="$MANUFACTURER $PRODUCT_NAME"
|
||||
else
|
||||
DEVICE_NAME="USB-устройство"
|
||||
fi
|
||||
STATUS="unknown"
|
||||
fi
|
||||
|
||||
# Проверяем, существует ли запись
|
||||
EXISTS=$(sqlite3 "$REGISTRY_FILE" "SELECT 1 FROM devices WHERE bus='usb' AND vendor='$VENDOR' AND device='$PRODUCT';" 2>/dev/null)
|
||||
|
||||
if [ -z "$EXISTS" ]; then
|
||||
sqlite3 "$REGISTRY_FILE" <<EOF
|
||||
INSERT INTO devices (bus, vendor, device, name, status, driver, detected_at)
|
||||
VALUES ('usb', '$VENDOR', '$PRODUCT', '$DEVICE_NAME', '$STATUS', '', CURRENT_TIMESTAMP);
|
||||
EOF
|
||||
echo " USB: $VENDOR:$PRODUCT -> $DEVICE_NAME (статус: $STATUS) [НОВОЕ]"
|
||||
else
|
||||
sqlite3 "$REGISTRY_FILE" <<EOF
|
||||
UPDATE devices SET name='$DEVICE_NAME', status='$STATUS', detected_at=CURRENT_TIMESTAMP
|
||||
WHERE bus='usb' AND vendor='$VENDOR' AND device='$PRODUCT';
|
||||
EOF
|
||||
echo " USB: $VENDOR:$PRODUCT -> $DEVICE_NAME (статус: $STATUS) [ОБНОВЛЕНО]"
|
||||
fi
|
||||
done
|
||||
|
||||
# -------------------------------------------------------------------
|
||||
# 3. Удаление отсутствующих устройств
|
||||
# -------------------------------------------------------------------
|
||||
echo "Проверка отсутствующих устройств..."
|
||||
|
||||
sqlite3 "$REGISTRY_FILE" "SELECT bus, vendor, device FROM devices;" 2>/dev/null | while IFS='|' read -r bus vendor device; do
|
||||
if [ -z "$bus" ] || [ -z "$vendor" ] || [ -z "$device" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
if ! grep -q "^${bus}|${vendor}|${device}$" "$DETECTED_DEVICES" 2>/dev/null; then
|
||||
DEVICE_NAME=$(sqlite3 "$REGISTRY_FILE" "SELECT name FROM devices
|
||||
WHERE bus='$bus' AND vendor='$vendor' AND device='$device';" 2>/dev/null)
|
||||
echo " Удаление: $bus $vendor:$device ($DEVICE_NAME)"
|
||||
log_to_registry "info" "Устройство удалено: $bus $vendor:$device"
|
||||
sqlite3 "$REGISTRY_FILE" "DELETE FROM devices
|
||||
WHERE bus='$bus' AND vendor='$vendor' AND device='$device';" 2>/dev/null
|
||||
fi
|
||||
done
|
||||
|
||||
rm -f "$DETECTED_DEVICES"
|
||||
log_to_registry "info" "Проверка устройств завершена"
|
||||
echo "Проверка устройств завершена."
|
||||
314
driver_installer
Executable file
314
driver_installer
Executable file
@ -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 "$@"
|
||||
62
init_device_demon
Executable file
62
init_device_demon
Executable file
@ -0,0 +1,62 @@
|
||||
#!/bin/sh
|
||||
|
||||
DEVD_CONF="/etc/devd/calista-devices.conf"
|
||||
DEVICE_CHECK_SCRIPT="/calista/devices"
|
||||
DEVD_PATH="/bin:/sbin:/usr/bin:/usr/local/bin:/usr/sbin"
|
||||
|
||||
# Проверяем, существует ли скрипт проверки устройств
|
||||
if [ ! -x "$DEVICE_CHECK_SCRIPT" ]; then
|
||||
echo "Ошибка: Скрипт $DEVICE_CHECK_SCRIPT не найден или не исполняемый"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Создаём конфигурационный файл
|
||||
cat > "$DEVD_CONF" <<EOF
|
||||
# Файл: /etc/devd/calista-devices.conf
|
||||
# Отслеживание подключения и отключения устройств для Calista Driver Manager
|
||||
|
||||
# PCI-устройства: подключение
|
||||
notify 100 {
|
||||
match "system" "PCI";
|
||||
match "subsystem" "!unknown";
|
||||
action "$DEVICE_CHECK_SCRIPT";
|
||||
};
|
||||
|
||||
# USB-устройства: подключение
|
||||
notify 100 {
|
||||
match "system" "USB";
|
||||
match "subsystem" "DEVICE";
|
||||
match "type" "ATTACH";
|
||||
action "/bin/sh -c 'PATH=$DEVD_PATH $DEVICE_CHECK_SCRIPT >> /tmp/calista-devd.log 2>&1'";
|
||||
};
|
||||
|
||||
# USB-устройства: отключение
|
||||
notify 100 {
|
||||
match "system" "USB";
|
||||
match "subsystem" "DEVICE";
|
||||
match "type" "DETACH";
|
||||
action "/bin/sh -c 'PATH=$DEVD_PATH $DEVICE_CHECK_SCRIPT >> /tmp/calista-devd.log 2>&1'";
|
||||
};
|
||||
EOF
|
||||
|
||||
# Проверяем, что файл создался
|
||||
if [ -f "$DEVD_CONF" ]; then
|
||||
echo "Конфигурационный файл создан: $DEVD_CONF"
|
||||
else
|
||||
echo "Ошибка: Не удалось создать $DEVD_CONF"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Перезагружаем devd
|
||||
echo "Перезагрузка devd..."
|
||||
service devd restart
|
||||
|
||||
# Проверяем статус
|
||||
if service devd status > /dev/null 2>&1; then
|
||||
echo "devd успешно перезагружен"
|
||||
else
|
||||
echo "Ошибка: Не удалось перезагрузить devd"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Настройка devd для Calista завершена успешно."
|
||||
72
reginit
Executable file
72
reginit
Executable file
@ -0,0 +1,72 @@
|
||||
#/bin/sh
|
||||
|
||||
SYSTEM_DIR="/calista"
|
||||
REGISTRY_FILE="$SYSTEM_DIR/registry.db"
|
||||
USER=$(whoami)
|
||||
|
||||
# Проверяем, существует ли файл реестра
|
||||
if [ -f "$REGISTRY_FILE" ]; then
|
||||
echo "Ошибка: Файл реестра уже существует: $REGISTRY_FILE"
|
||||
echo "Инициализация запрещена. Если вы хотите пересоздать реестр, удалите файл вручную."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Файла нет — создаём директорию (если её нет)
|
||||
if [ ! -d "$SYSTEM_DIR" ]; then
|
||||
mkdir -p "$SYSTEM_DIR"
|
||||
if [ ! -d "$SYSTEM_DIR" ]; then
|
||||
echo "Критическая ошибка: Не удалось создать системную директорию"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Создаём базу данных и таблицы
|
||||
echo "Создаём файл реестра: $REGISTRY_FILE"
|
||||
|
||||
#Calista log
|
||||
sqlite3 "$REGISTRY_FILE" <<EOF
|
||||
CREATE TABLE IF NOT EXISTS calista_log (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
type TEXT NOT NULL, -- 'error', 'info'
|
||||
user TEXT NOT NULL,
|
||||
details TEXT, -- дополнительная информация
|
||||
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
EOF
|
||||
|
||||
sqlite3 "$REGISTRY_FILE" <<EOF
|
||||
INSERT INTO calista_log (type, user, details) VALUES ('info', '$USER', 'Регистр Calista инициализирован успешно');
|
||||
INSERT INTO calista_log (type, user, details) VALUES ('info', '$USER', 'Путь к реестру - $REGISTRY_FILE');
|
||||
EOF
|
||||
|
||||
#Создание таблицы компонентов
|
||||
sqlite3 "$REGISTRY_FILE" <<EOF
|
||||
CREATE TABLE IF NOT EXISTS components (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT UNIQUE NOT NULL, -- уникальный идентификатор компонента (cpm, cgl)
|
||||
version TEXT, -- версия
|
||||
source TEXT, -- git / local
|
||||
description TEXT, -- описание
|
||||
installed_at TIMESTAMP -- время установки
|
||||
);
|
||||
EOF
|
||||
|
||||
#Создание таблицы устройств
|
||||
sqlite3 "$REGISTRY_FILE" <<EOF
|
||||
-- Таблица устройств (текущее состояние системы)
|
||||
CREATE TABLE IF NOT EXISTS devices (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
bus TEXT NOT NULL, -- 'pci', 'usb'
|
||||
vendor TEXT NOT NULL, -- '0x8086'
|
||||
device TEXT NOT NULL, -- '0x4222'
|
||||
subvendor TEXT, -- '0x1179' (опционально)
|
||||
subdevice TEXT, -- '0xff10' (опционально)
|
||||
name TEXT DEFAULT 'unknown', -- 'Intel 3945ABG Wi-Fi'
|
||||
status TEXT DEFAULT 'unknown', -- 'installed', 'not_installed', 'builtin', 'unknown'
|
||||
driver TEXT, -- 'wpi', 'nvidia', 'snd_hda'
|
||||
module_path TEXT, -- путь к модулю (если известен)
|
||||
detected_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
UNIQUE(bus, vendor, device, subvendor, subdevice)
|
||||
);
|
||||
EOF
|
||||
Loading…
x
Reference in New Issue
Block a user