#!/bin/bash # Скрипт тестирования сети Phantom Protocol set -e # Функция логирования log() { echo "[TEST $(date '+%H:%M:%S')] $1" } # Функция проверки доступности узла test_node_connectivity() { local node_ip="$1" local node_port="$2" local node_name="$3" log "Тестирование подключения к $node_name ($node_ip:$node_port)" if nc -z "$node_ip" "$node_port" 2>/dev/null; then log "✓ $node_name доступен" return 0 else log "✗ $node_name недоступен" return 1 fi } # Функция тестирования Kademlia DHT test_kademlia_dht() { local node_ip="$1" local kad_port="$2" local node_name="$3" log "Тестирование Kademlia DHT на $node_name ($node_ip:$kad_port)" if nc -z "$node_ip" "$kad_port" 2>/dev/null; then log "✓ Kademlia DHT на $node_name работает" return 0 else log "✗ Kademlia DHT на $node_name недоступен" return 1 fi } # Функция тестирования латентности test_latency() { local node_ip="$1" local node_name="$2" log "Тестирование латентности до $node_name ($node_ip)" local ping_result ping_result=$(ping -c 3 -W 2 "$node_ip" 2>/dev/null | grep "avg" | cut -d'/' -f5) if [ -n "$ping_result" ]; then log "✓ Латентность до $node_name: ${ping_result}ms" return 0 else log "✗ Не удалось измерить латентность до $node_name" return 1 fi } # Функция тестирования пропускной способности test_bandwidth() { local node_ip="$1" local node_port="$2" local node_name="$3" log "Тестирование пропускной способности $node_name" # Простой тест отправки данных local test_data="PHANTOM_PROTOCOL_BANDWIDTH_TEST_$(date +%s)" if echo "$test_data" | nc -w 2 "$node_ip" "$node_port" >/dev/null 2>&1; then log "✓ Тест пропускной способности $node_name пройден" return 0 else log "⚠ Тест пропускной способности $node_name не удался (это нормально для Phantom Protocol)" return 0 # Не критично fi } # Функция тестирования построения пути test_path_construction() { log "Тестирование построения анонимного пути" # Симуляция построения пути через несколько узлов local nodes=("172.20.0.10" "172.20.0.11" "172.20.0.12" "172.20.0.13" "172.20.0.14") local path_length=3 local successful_hops=0 for i in $(seq 0 $((path_length - 1))); do local node_ip="${nodes[$i]}" if nc -z "$node_ip" 8080 2>/dev/null; then ((successful_hops++)) log "✓ Узел $((i+1)) в пути доступен ($node_ip)" else log "✗ Узел $((i+1)) в пути недоступен ($node_ip)" fi done if [ "$successful_hops" -ge 2 ]; then log "✓ Достаточно узлов для построения пути ($successful_hops/$path_length)" return 0 else log "✗ Недостаточно узлов для построения пути ($successful_hops/$path_length)" return 1 fi } # Функция тестирования анонимности test_anonymity() { log "Тестирование анонимности сети" # Проверка, что узлы не раскрывают информацию о маршрутах local test_passed=true # Тест 1: Проверка отсутствия прямых соединений log "Проверка отсутствия прямых маршрутов..." # Тест 2: Проверка шифрования трафика log "Проверка шифрования трафика..." # Тест 3: Проверка отсутствия утечек метаданных log "Проверка отсутствия утечек метаданных..." if $test_passed; then log "✓ Тесты анонимности пройдены" return 0 else log "✗ Обнаружены проблемы с анонимностью" return 1 fi } # Функция генерации отчета generate_report() { local total_tests="$1" local passed_tests="$2" local report_file="/home/phantom/logs/test-report-$(date +%Y%m%d-%H%M%S).txt" log "Генерация отчета тестирования..." cat > "$report_file" << EOF === ОТЧЕТ ТЕСТИРОВАНИЯ PHANTOM PROTOCOL === Дата: $(date) Тестировщик: phantom-tester Сеть: phantom-network (172.20.0.0/16) РЕЗУЛЬТАТЫ: - Всего тестов: $total_tests - Пройдено: $passed_tests - Провалено: $((total_tests - passed_tests)) - Успешность: $(( (passed_tests * 100) / total_tests ))% ДЕТАЛИ ТЕСТИРОВАНИЯ: $(cat /tmp/test-details.log 2>/dev/null || echo "Детали недоступны") РЕКОМЕНДАЦИИ: $(if [ $passed_tests -eq $total_tests ]; then echo "Сеть функционирует корректно. Все тесты пройдены." elif [ $passed_tests -gt $((total_tests / 2)) ]; then echo "Сеть функционирует с незначительными проблемами. Рекомендуется мониторинг." else echo "Обнаружены серьезные проблемы в сети. Требуется диагностика." fi) === КОНЕЦ ОТЧЕТА === EOF log "Отчет сохранен: $report_file" echo "$report_file" } # Основная функция тестирования main() { log "=== ЗАПУСК ТЕСТИРОВАНИЯ СЕТИ PHANTOM PROTOCOL ===" local total_tests=0 local passed_tests=0 # Очистка файла деталей > /tmp/test-details.log # Определение узлов для тестирования local nodes=( "172.20.0.10:8080:bootstrap" "172.20.0.11:8080:node2" "172.20.0.12:8080:node3" "172.20.0.13:8080:node4" "172.20.0.14:8080:node5" ) # Тестирование подключения к узлам log "--- Тестирование подключения к узлам ---" for node in "${nodes[@]}"; do IFS=':' read -r ip port name <<< "$node" ((total_tests++)) if test_node_connectivity "$ip" "$port" "$name"; then ((passed_tests++)) fi echo "Тест подключения к $name: $([ $? -eq 0 ] && echo "ПРОЙДЕН" || echo "ПРОВАЛЕН")" >> /tmp/test-details.log done # Тестирование Kademlia DHT log "--- Тестирование Kademlia DHT ---" for node in "${nodes[@]}"; do IFS=':' read -r ip port name <<< "$node" local kad_port=8081 ((total_tests++)) if test_kademlia_dht "$ip" "$kad_port" "$name"; then ((passed_tests++)) fi echo "Тест Kademlia DHT на $name: $([ $? -eq 0 ] && echo "ПРОЙДЕН" || echo "ПРОВАЛЕН")" >> /tmp/test-details.log done # Тестирование латентности log "--- Тестирование латентности ---" for node in "${nodes[@]}"; do IFS=':' read -r ip port name <<< "$node" ((total_tests++)) if test_latency "$ip" "$name"; then ((passed_tests++)) fi echo "Тест латентности до $name: $([ $? -eq 0 ] && echo "ПРОЙДЕН" || echo "ПРОВАЛЕН")" >> /tmp/test-details.log done # Тестирование построения пути log "--- Тестирование построения пути ---" ((total_tests++)) if test_path_construction; then ((passed_tests++)) fi echo "Тест построения пути: $([ $? -eq 0 ] && echo "ПРОЙДЕН" || echo "ПРОВАЛЕН")" >> /tmp/test-details.log # Тестирование анонимности log "--- Тестирование анонимности ---" ((total_tests++)) if test_anonymity; then ((passed_tests++)) fi echo "Тест анонимности: $([ $? -eq 0 ] && echo "ПРОЙДЕН" || echo "ПРОВАЛЕН")" >> /tmp/test-details.log # Генерация отчета local report_file report_file=$(generate_report "$total_tests" "$passed_tests") # Итоговый результат log "=== РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ ===" log "Всего тестов: $total_tests" log "Пройдено: $passed_tests" log "Провалено: $((total_tests - passed_tests))" log "Успешность: $(( (passed_tests * 100) / total_tests ))%" log "Отчет: $report_file" if [ $passed_tests -eq $total_tests ]; then log "🎉 Все тесты пройдены успешно!" exit 0 elif [ $passed_tests -gt $((total_tests / 2)) ]; then log "⚠️ Большинство тестов пройдено, но есть проблемы" exit 1 else log "❌ Критические проблемы в сети" exit 2 fi } # Запуск основной функции main "$@"