/
Roman_arv
/
UpnpUtil
Обзор
Документация
Войти
/
Roman_arv
/
UpnpUtil
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/scan.py
135 строк
4 KB
Roman_arv
03082026 #4 Analyzer
03 авг 2026, 16:21
03 авг 2026, 16:21
7686271
Код
Авторство
О чём код?
#!/usr/bin/env python3 """ UPnP/DLNA Сканер сети Сканирует сеть для поиска UPnP/DLNA устройств. Использование: python scan.py # Быстрое сканирование python scan.py --full # Полное сканирование с подробным выводом python scan.py --timeout 5 # Указать таймаут (по умолчанию 3 сек) """ import sys import os import argparse import logging # Добавляем текущий каталог в путь импорта sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from dlna.models.api import UPnPClient from dlna.models.logger import setup_logging from dlna.models import MediaServer, Renderer def main(): # Настройка парсера аргументов parser = argparse.ArgumentParser(description='UPnP/DLNA Сканер сети') parser.add_argument( '--full', '-f', action='store_true', help='Полное сканирование с подробным выводом' ) parser.add_argument( '--timeout', '-t', type=float, default=3.0, help='Таймаут поиска в секундах (по умолчанию: 3)' ) parser.add_argument( '--log-level', '-l', choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'], default='INFO', help='Уровень логирования (по умолчанию: INFO)' ) parser.add_argument( '--log-file', type=str, default=None, help='Путь к файлу лога (по умолчанию: logs/scan.log)' ) args = parser.parse_args() # Настройка логирования log_file = args.log_file or 'logs/scan.log' setup_logging( log_level=args.log_level, log_file=log_file, debug=False ) _log = logging.getLogger(__name__) _log.info(f"Starting scan with timeout={args.timeout}s, full_mode={args.full}") print('') print('=' * 60) print(' Поиск UPnP устройств') print('=' * 60) print('') print(f'Таймаут: {args.timeout} сек') if args.full: print('Режим: Полный') else: print('Режим: Быстрый') print('') print('Поиск устройств...') print('') client = UPnPClient( discovery_timeout=args.timeout, connection_timeout=2.0 ) 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 args.full: 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) _log.info("Scan completed") if __name__ == '__main__': main()