/
Roman_arv
/
UpnpUtil
Обзор
Документация
Войти
/
Roman_arv
/
UpnpUtil
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/scan.sh
187 строк
6 KB
Roman_arv
gigacode generated v2 Fix menu fix 6 browse + logging
22 июл 2026, 16:51
22 июл 2026, 16:51
ada8b9a
Код
Авторство
О чём код?
#!/bin/bash # # Скрипт быстрого сканирования сети для поиска UPnP/DLNA устройств # # Использование: # ./scan.sh # Быстрое сканирование # ./scan.sh --full # Полное сканирование с подробным выводом # ./scan.sh --timeout 5 # Указать таймаут (по умолчанию 3 сек) # set -e # Цвета для вывода RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Параметры TIMEOUT=7 FULL_MODE=false # Парсинг аргументов while [[ $# -gt 0 ]]; do case $1 in --full|-f) FULL_MODE=true shift ;; --timeout|-t) TIMEOUT="$2" shift 2 ;; --help|-h) echo "Использование: $0 [опции]" echo "" echo "Опции:" echo " --full, -f Полное сканирование с подробным выводом" echo " --timeout, -t Указать таймаут в секундах (по умолчанию 3)" echo " --help, -h Показать эту справку" exit 0 ;; *) echo -e "${RED}Неизвестная опция: $1${NC}" echo "Используйте --help для справки" exit 1 ;; esac shift done # Определение Python команды PYTHON_CMD="python3" # Проверка Python if ! $PYTHON_CMD --version &> /dev/null; then echo -e "${RED}Python 3 не найден${NC}" exit 1 fi # Проверка зависимостей if ! $PYTHON_CMD -m pip check &> /dev/null; then echo -e "${YELLOW}⚠ Зависимости не установлены${NC}" echo "Запустите: ./scripts/install.sh" exit 1 fi echo -e "${BLUE}UPnP/DLNA Сканер сети${NC}" echo -e "${BLUE}======================${NC}" echo "" echo -e "${GREEN}Таймаут: ${YELLOW}${TIMEOUT} сек${NC}" if [ "$FULL_MODE" = true ]; then echo -e "${GREEN}Режим: ${YELLOW}Полный${NC}" else echo -e "${GREEN}Режим: ${YELLOW}Быстрый${NC}" fi echo "" echo -e "${YELLOW}Поиск устройств...${NC}" echo "" # Создание и запуск скрипта сканирования cd "$(dirname "$0")" CURRENT_DIR="$(pwd)" export SCAN_TIMEOUT="$TIMEOUT" export SCAN_FULL="$FULL_MODE" export SCAN_SCRIPT_DIR="$CURRENT_DIR" # Создаем Python скрипт для сканирования PYTHON_SCRIPT=$(mktemp) cat > "$PYTHON_SCRIPT" << 'PYTHON_EOF' import sys import os import logging sys.path.insert(0, os.environ.get('SCAN_SCRIPT_DIR', os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) from dlna.models.api import UPnPClient from dlna.models import MediaServer, Renderer # Настройка логирования в файл log_dir = os.path.join(os.environ.get('SCAN_SCRIPT_DIR', os.getcwd()), 'logs') os.makedirs(log_dir, exist_ok=True) log_file = os.path.join(log_dir, f'scan_{os.environ.get("SCAN_TIMEOUT", "3")}s.log') logging.basicConfig( level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler(log_file, encoding='utf-8'), logging.StreamHandler(sys.stdout) ] ) _log = logging.getLogger(__name__) def main(): timeout = int(os.environ.get('SCAN_TIMEOUT', '3')) full_mode = os.environ.get('SCAN_FULL', 'false').lower() == 'true' _log.info(f"Starting scan with timeout={timeout}s, full_mode={full_mode}") client = UPnPClient( discovery_timeout=float(timeout), connection_timeout=2.0 ) print('') print('=' * 60) print(' Поиск UPnP устройств') print('=' * 60) print('') devices = client.find_devices() servers = client.find_media_servers() renderers = client.find_renderers() _log.info(f"Found {len(devices)} devices, {len(servers)} servers, {len(renderers)} renderers") print(f'\nВсего устройств найдено: {len(devices)}') print(f' - Медиа-серверов: {len(servers)}') print(f' - Рендереров: {len(renderers)}') print('') if full_mode: for i, device in enumerate(devices, 1): print('\n' + '=' * 60) print(f'Устройство #{i}') print('=' * 60) print(f' Имя: {device.friendly_name}') print(f' Тип: {device.device_type}') print(f' UDN: {device.udn}') print(f' URL: {device.url}') if hasattr(device, 'manufacturer'): print(f' Производитель: {getattr(device, "manufacturer", "")}') if hasattr(device, 'model_name'): print(f' Модель: {getattr(device, "model_name", "")}') else: if servers: print('\nМедиа-серверы (DLNA):') print('-' * 40) for server in servers: print(f' * {server.friendly_name}') print(f' URL: {server.url}') if renderers: print('\nРендереры (воспроизведение):') print('-' * 40) for renderer in renderers: print(f' * {renderer.friendly_name}') print(f' URL: {renderer.url}') print('\n' + '=' * 60) print(' Сканирование завершено') print('=' * 60) if __name__ == '__main__': main() PYTHON_EOF # Запускаем Python скрипт $PYTHON_CMD "$PYTHON_SCRIPT" rm "$PYTHON_SCRIPT"