Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- # Умный watchdog для PlutoSDR v5 (Полный исправленный вариант)
- # Включает: автокалибровку, периодическую проверку, восстановление после любых сбросов
- LOGFILE="/var/log/pluto_smart_watchdog.log"
- TRX_LOG="/tmp/trx.log"
- BTS_LOG="/tmp/bts.log"
- CONFIG_DIR="/root/osmo-trx_soapy/Osmocom_configs/VOICE"
- TRX_DIR="/root/osmo-trx_soapy/Transceiver52M"
- SESSION="gsm_base"
- # Калибровка PlutoSDR NANO
- PLUTO_IP="192.168.2.1"
- XO_VALUE=39999368 # ← Ваша уникальная калибровка!
- # Интервалы
- CHECK_INTERVAL=120
- MAX_SOFT_RESTARTS=3
- MAX_USB_RESETS=2
- RESTART_DELAY=30
- STABILIZATION_TIME=180
- # Счётчики
- SOFT_RESTART_COUNT=0
- USB_RESET_COUNT=0
- LAST_ERROR_TIME=0
- LAST_RESTART_TIME=0
- log() {
- echo "$(date '+%Y-%m-%d %H:%M:%S'): $1" >> "$LOGFILE"
- echo "$(date '+%Y-%m-%d %H:%M:%S'): $1"
- }
- # ========== ФУНКЦИЯ КАЛИБРОВКИ (Улучшенная, с повторами) ==========
- calibrate_pluto() {
- log "[CALIBRATE] Проверка и применение xo_correction = $XO_VALUE..."
- # Ждём доступности сети Pluto
- local ping_ok=0
- for i in {1..20}; do
- if ping -c 1 -W 2 "$PLUTO_IP" > /dev/null 2>&1; then
- ping_ok=1
- break
- fi
- sleep 2
- done
- if [ "$ping_ok" -eq 0 ]; then
- log "[CALIBRATE] ❌ Pluto недоступен по сети"
- return 1
- fi
- # Даем время на инициализацию libiio после сброса
- sleep 8
- # Применяем калибровку (до 3 попыток)
- local attempt=0
- while [ $attempt -lt 3 ]; do
- attempt=$((attempt + 1))
- log "[CALIBRATE] Попытка $attempt/3: запись xo_correction..."
- iio_attr -u "ip:$PLUTO_IP" -d ad9361-phy xo_correction "$XO_VALUE" > /dev/null 2>&1
- sleep 2
- # Читаем текущее значение
- local raw_output
- raw_output=$(iio_attr -u "ip:$PLUTO_IP" -d ad9361-phy xo_correction 2>/dev/null)
- local current
- current=$(echo "$raw_output" | grep -o '[0-9]\+' | head -1)
- if [ "$current" = "$XO_VALUE" ]; then
- log "[CALIBRATE] ✅ Успешно: $current"
- return 0
- else
- log "[CALIBRATE] ⚠️ Не совпало (ожид.: $XO_VALUE, факт.: $current). Повтор..."
- fi
- done
- log "[CALIBRATE] Не удалось применить калибровку после 3 попыток!"
- return 1
- }
- # ========================================================
- # ========== ФУНКЦИЯ ПЕРИОДИЧЕСКОЙ ПРОВЕРКИ (НОВАЯ) ==========
- # Вызывается каждые 2 минуты. Если калибровка слетела (например, после кнопки RESET на Pluto),
- # скрипт обнаружит это и применит заново БЕЗ перезапуска процессов.
- check_calibration() {
- local raw_output
- raw_output=$(iio_attr -u "ip:$PLUTO_IP" -d ad9361-phy xo_correction 2>/dev/null)
- local current
- current=$(echo "$raw_output" | grep -o '[0-9]\+' | head -1)
- if [ -z "$current" ]; then
- log "[CHECK] ⚠️ Не удалось прочитать xo_correction, принудительно применяем..."
- calibrate_pluto
- return
- fi
- if [ "$current" != "$XO_VALUE" ]; then
- log "[CHECK] ⚠️ Калибровка слетела! Было: $XO_VALUE, стало: $current. Исправляю..."
- calibrate_pluto
- fi
- }
- # ========================================================
- check_trx_running() {
- if ! pgrep -f "osmo-trx-soapy" > /dev/null; then return 1; fi
- local state
- state=$(ps -p "$(pgrep -f 'osmo-trx-soapy' | head -1)" -o state= 2>/dev/null)
- [ "$state" = "Z" ] && return 1
- return 0
- }
- check_bts_running() {
- if ! pgrep -f "osmo-bts-trx" > /dev/null; then return 1; fi
- local state
- state=$(ps -p "$(pgrep -f 'osmo-bts-trx' | head -1)" -o state= 2>/dev/null)
- [ "$state" = "Z" ] && return 1
- return 0
- }
- check_pluto_usb() {
- lsusb | grep -q "0456:b673" && return 0 || return 1
- }
- check_for_errors() {
- if [ -f "$TRX_LOG" ] && tail -20 "$TRX_LOG" | grep -qE "FATAL|Device receive timed out"; then return 0; fi
- if [ -f "$BTS_LOG" ] && tail -20 "$BTS_LOG" | grep -qE "TRX closed"; then return 0; fi
- return 1
- }
- soft_restart() {
- log "[RESTART] Мягкий перезапуск процессов..."
- pkill -9 -f "osmo-trx-soapy" 2>/dev/null
- pkill -9 -f "osmo-bts-trx" 2>/dev/null
- tmux kill-session -t "$SESSION" 2>/dev/null
- sleep 3
- > "$TRX_LOG" 2>/dev/null
- > "$BTS_LOG" 2>/dev/null
- # === ВАЖНО: калибруем ПЕРЕД запуском процессов ===
- calibrate_pluto
- tmux new-session -d -s "$SESSION" -n 'BASE'
- tmux split-window -v -t "$SESSION:0"
- tmux select-layout -t "$SESSION:0" even-vertical
- tmux send-keys -t "$SESSION:0.0" "cd $CONFIG_DIR && osmo-bts-trx -c osmo-bts-trx.cfg 2>&1 | tee -a $BTS_LOG" Enter
- tmux send-keys -t "$SESSION:0.1" "cd $TRX_DIR && ./osmo-trx-soapy -C test1.cfg 2>&1 | tee -a $TRX_LOG" Enter
- log "[RESTART] Ожидание запуска ($RESTART_DELAY сек)..."
- sleep $RESTART_DELAY
- if check_trx_running && check_bts_running; then
- log "[RESTART] ✅ Успешно запущено"
- LAST_RESTART_TIME=$(date +%s)
- log "[DISPLAY] Перезапуск отображения на tty1..."
- sudo systemctl restart gsm-display.service
- sleep 2
- return 0
- else
- log "[RESTART] ❌ Ошибка запуска"
- return 1
- fi
- }
- usb_reset() {
- log "[USB] Сброс USB устройства..."
- local PLUTO_PATH
- PLUTO_PATH=$(ls -l /sys/bus/usb/devices/*/ | grep "0456:b673" 2>/dev/null | head -1 | cut -d'/' -f6)
- if [ -z "$PLUTO_PATH" ]; then
- log "[USB] ❌ Устройство не найдено"
- return 1
- fi
- echo -n "$PLUTO_PATH" | sudo tee /sys/bus/usb/drivers/usb/unbind > /dev/null 2>&1
- sleep 3
- echo -n "$PLUTO_PATH" | sudo tee /sys/bus/usb/drivers/usb/bind > /dev/null 2>&1
- sleep 5
- if lsusb | grep -q "0456:b673"; then
- log "[USB] ✅ Сброс выполнен"
- calibrate_pluto # Калибруем после аппаратного сброса USB
- return $?
- else
- log "[USB] ❌ Сброс не удался"
- return 1
- fi
- }
- full_reboot() {
- log "[REBOOT] Полная перезагрузка системы!"
- sleep 3
- sudo reboot
- }
- handle_error() {
- local CURRENT_TIME
- CURRENT_TIME=$(date +%s)
- if [ $((CURRENT_TIME - LAST_RESTART_TIME)) -lt $STABILIZATION_TIME ]; then
- log "[SKIP] Недавно был перезапуск, пропускаю проверку"
- return
- fi
- if [ $((CURRENT_TIME - LAST_ERROR_TIME)) -gt 3600 ]; then
- SOFT_RESTART_COUNT=0
- USB_RESET_COUNT=0
- fi
- LAST_ERROR_TIME=$CURRENT_TIME
- if [ $SOFT_RESTART_COUNT -lt $MAX_SOFT_RESTARTS ]; then
- SOFT_RESTART_COUNT=$((SOFT_RESTART_COUNT + 1))
- soft_restart
- elif [ $USB_RESET_COUNT -lt $MAX_USB_RESETS ]; then
- USB_RESET_COUNT=$((USB_RESET_COUNT + 1))
- if usb_reset; then
- soft_restart
- else
- full_reboot
- fi
- else
- log "[CRITICAL] Исчерпаны все попытки восстановления"
- full_reboot
- fi
- }
- # ========== ГЛАВНЫЙ ЦИКЛ ==========
- log "========================================="
- log "Watchdog PlutoSDR v5 запущен"
- log "Интервал проверки: ${CHECK_INTERVAL}с"
- log "Целевая калибровка: $XO_VALUE"
- log "========================================="
- # Первичная калибровка при старте скрипта
- calibrate_pluto
- while true; do
- # 1. Проверка физического подключения
- if ! check_pluto_usb; then
- log "[ERROR] PlutoSDR не найден в USB"
- handle_error
- sleep $CHECK_INTERVAL
- continue
- fi
- # 2. Проверка запущенных процессов
- if ! check_trx_running || ! check_bts_running; then
- log "[ERROR] Процессы osmo-trx/bts не работают"
- handle_error
- sleep $CHECK_INTERVAL
- continue
- fi
- # 3. === НОВАЯ ФУНКЦИЯ: Периодическая проверка калибровки ===
- # Именно она спасает ситуацию, когда вы нажимаете RESET на Pluto,
- # но USB не отваливается и процессы продолжают работать.
- check_calibration
- # 4. Проверка логов на критические ошибки
- if check_for_errors; then
- log "[ERROR] Критические ошибки в логах"
- handle_error
- sleep $CHECK_INTERVAL
- continue
- fi
- sleep $CHECK_INTERVAL
- done
Advertisement
Add Comment
Please, Sign In to add comment