600 lines
24 KiB
Bash
600 lines
24 KiB
Bash
#!/bin/bash
|
||
|
||
# Phantom Protocol Extended - Комплексный тест инфраструктуры
|
||
# Автор: Phantom Protocol Team 2025
|
||
# Версия: 2.0.0
|
||
|
||
set -e
|
||
|
||
# Цвета для вывода
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
PURPLE='\033[0;35m'
|
||
CYAN='\033[0;36m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# Конфигурация
|
||
PHANTOM_DIR="/home/ubuntu/project_analysis/phantom-protocol-2025-release"
|
||
LOG_DIR="$PHANTOM_DIR/test-logs"
|
||
RESULTS_FILE="$LOG_DIR/test-results-$(date +%Y%m%d-%H%M%S).log"
|
||
|
||
# Создание директории для логов
|
||
mkdir -p "$LOG_DIR"
|
||
|
||
# Функция логирования
|
||
log() {
|
||
echo -e "${CYAN}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1" | tee -a "$RESULTS_FILE"
|
||
}
|
||
|
||
log_success() {
|
||
echo -e "${GREEN}[SUCCESS]${NC} $1" | tee -a "$RESULTS_FILE"
|
||
}
|
||
|
||
log_error() {
|
||
echo -e "${RED}[ERROR]${NC} $1" | tee -a "$RESULTS_FILE"
|
||
}
|
||
|
||
log_warning() {
|
||
echo -e "${YELLOW}[WARNING]${NC} $1" | tee -a "$RESULTS_FILE"
|
||
}
|
||
|
||
log_info() {
|
||
echo -e "${BLUE}[INFO]${NC} $1" | tee -a "$RESULTS_FILE"
|
||
}
|
||
|
||
# Функция проверки зависимостей
|
||
check_dependencies() {
|
||
log "Проверка зависимостей..."
|
||
|
||
# Проверка Docker
|
||
if ! command -v docker &> /dev/null; then
|
||
log_error "Docker не установлен"
|
||
return 1
|
||
fi
|
||
|
||
# Проверка docker-compose
|
||
if ! command -v docker-compose &> /dev/null; then
|
||
log_error "docker-compose не установлен"
|
||
return 1
|
||
fi
|
||
|
||
# Проверка прав Docker
|
||
if ! docker ps &> /dev/null; then
|
||
log_error "Нет прав для использования Docker"
|
||
return 1
|
||
fi
|
||
|
||
log_success "Все зависимости установлены"
|
||
return 0
|
||
}
|
||
|
||
# Функция сборки образов
|
||
build_images() {
|
||
log "Сборка Docker образов..."
|
||
|
||
cd "$PHANTOM_DIR"
|
||
|
||
# Сборка базового образа
|
||
log_info "Сборка базового Phantom образа..."
|
||
if docker build -t phantom-protocol:extended . > "$LOG_DIR/build-base.log" 2>&1; then
|
||
log_success "Базовый образ собран"
|
||
else
|
||
log_error "Ошибка сборки базового образа"
|
||
return 1
|
||
fi
|
||
|
||
# Сборка DNS образа
|
||
log_info "Сборка Phantom DNS образа..."
|
||
if docker build -f docker/Dockerfile.dns -t phantom-dns:latest . > "$LOG_DIR/build-dns.log" 2>&1; then
|
||
log_success "DNS образ собран"
|
||
else
|
||
log_error "Ошибка сборки DNS образа"
|
||
return 1
|
||
fi
|
||
|
||
# Сборка Hidden Service образа
|
||
log_info "Сборка Hidden Service образа..."
|
||
if docker build -f docker/Dockerfile.hidden-service -t phantom-hidden-service:latest . > "$LOG_DIR/build-hs.log" 2>&1; then
|
||
log_success "Hidden Service образ собран"
|
||
else
|
||
log_error "Ошибка сборки Hidden Service образа"
|
||
return 1
|
||
fi
|
||
|
||
# Сборка Exit Node образа
|
||
log_info "Сборка Exit Node образа..."
|
||
if docker build -f docker/Dockerfile.exit-node -t phantom-exit-node:latest . > "$LOG_DIR/build-exit.log" 2>&1; then
|
||
log_success "Exit Node образ собран"
|
||
else
|
||
log_error "Ошибка сборки Exit Node образа"
|
||
return 1
|
||
fi
|
||
|
||
log_success "Все образы собраны успешно"
|
||
return 0
|
||
}
|
||
|
||
# Функция запуска инфраструктуры
|
||
start_infrastructure() {
|
||
log "Запуск Phantom инфраструктуры..."
|
||
|
||
cd "$PHANTOM_DIR"
|
||
|
||
# Остановка существующих контейнеров
|
||
log_info "Остановка существующих контейнеров..."
|
||
docker-compose -f docker-compose.extended.yml down > /dev/null 2>&1 || true
|
||
|
||
# Запуск инфраструктуры
|
||
log_info "Запуск расширенной инфраструктуры..."
|
||
if docker-compose -f docker-compose.extended.yml up -d > "$LOG_DIR/startup.log" 2>&1; then
|
||
log_success "Инфраструктура запущена"
|
||
else
|
||
log_error "Ошибка запуска инфраструктуры"
|
||
return 1
|
||
fi
|
||
|
||
# Ожидание готовности сервисов
|
||
log_info "Ожидание готовности сервисов (60 секунд)..."
|
||
sleep 60
|
||
|
||
return 0
|
||
}
|
||
|
||
# Функция тестирования DNS
|
||
test_phantom_dns() {
|
||
log "Тестирование Phantom DNS..."
|
||
|
||
# Проверка доступности DNS серверов
|
||
log_info "Проверка доступности DNS серверов..."
|
||
|
||
if nc -z -u localhost 5353 2>/dev/null; then
|
||
log_success "DNS сервер 1 доступен на порту 5353"
|
||
else
|
||
log_error "DNS сервер 1 недоступен"
|
||
return 1
|
||
fi
|
||
|
||
if nc -z -u localhost 5354 2>/dev/null; then
|
||
log_success "DNS сервер 2 доступен на порту 5354"
|
||
else
|
||
log_warning "DNS сервер 2 недоступен"
|
||
fi
|
||
|
||
# Тестирование разрешения .phantom доменов
|
||
log_info "Тестирование разрешения .phantom доменов..."
|
||
|
||
# Создание тестового DNS запроса
|
||
echo "welcome.phantom" | nc -u localhost 5353 > /dev/null 2>&1 && \
|
||
log_success "DNS запрос для welcome.phantom обработан" || \
|
||
log_warning "Ошибка DNS запроса для welcome.phantom"
|
||
|
||
return 0
|
||
}
|
||
|
||
# Функция тестирования Hidden Services
|
||
test_hidden_services() {
|
||
log "Тестирование Hidden Services..."
|
||
|
||
# Проверка доступности Hidden Services
|
||
log_info "Проверка доступности Hidden Services..."
|
||
|
||
# Проверка welcome сайта
|
||
if curl -s --connect-timeout 10 http://localhost:8080/status > /dev/null 2>&1; then
|
||
log_success "Welcome Hidden Service доступен"
|
||
else
|
||
log_warning "Welcome Hidden Service недоступен"
|
||
fi
|
||
|
||
# Проверка forum сайта
|
||
if curl -s --connect-timeout 10 http://localhost:8081/status > /dev/null 2>&1; then
|
||
log_success "Forum Hidden Service доступен"
|
||
else
|
||
log_warning "Forum Hidden Service недоступен"
|
||
fi
|
||
|
||
# Проверка marketplace сайта
|
||
if curl -s --connect-timeout 10 http://localhost:8082/status > /dev/null 2>&1; then
|
||
log_success "Marketplace Hidden Service доступен"
|
||
else
|
||
log_warning "Marketplace Hidden Service недоступен"
|
||
fi
|
||
|
||
# Тестирование генерации .phantom адресов
|
||
log_info "Тестирование генерации .phantom адресов..."
|
||
|
||
# Симуляция генерации адреса
|
||
PHANTOM_ADDR=$(echo -n "test-service" | sha256sum | cut -d' ' -f1 | head -c 16)
|
||
log_info "Сгенерирован тестовый .phantom адрес: ${PHANTOM_ADDR}.phantom"
|
||
|
||
return 0
|
||
}
|
||
|
||
# Функция тестирования Exit Nodes
|
||
test_exit_nodes() {
|
||
log "Тестирование Exit Nodes..."
|
||
|
||
# Проверка доступности Exit Nodes
|
||
log_info "Проверка доступности Exit Nodes..."
|
||
|
||
# Проверка US Exit Node
|
||
if nc -z localhost 1080 2>/dev/null; then
|
||
log_success "US Exit Node SOCKS5 доступен на порту 1080"
|
||
else
|
||
log_warning "US Exit Node SOCKS5 недоступен"
|
||
fi
|
||
|
||
if nc -z localhost 3128 2>/dev/null; then
|
||
log_success "US Exit Node HTTP прокси доступен на порту 3128"
|
||
else
|
||
log_warning "US Exit Node HTTP прокси недоступен"
|
||
fi
|
||
|
||
# Проверка EU Exit Node
|
||
if nc -z localhost 1081 2>/dev/null; then
|
||
log_success "EU Exit Node SOCKS5 доступен на порту 1081"
|
||
else
|
||
log_warning "EU Exit Node SOCKS5 недоступен"
|
||
fi
|
||
|
||
if nc -z localhost 3129 2>/dev/null; then
|
||
log_success "EU Exit Node HTTP прокси доступен на порту 3129"
|
||
else
|
||
log_warning "EU Exit Node HTTP прокси недоступен"
|
||
fi
|
||
|
||
# Тестирование Exit Policy
|
||
log_info "Тестирование Exit Policy..."
|
||
|
||
# Проверка разрешенных портов (HTTP/HTTPS)
|
||
log_info "Проверка политики для HTTP (порт 80) - должен быть разрешен"
|
||
log_info "Проверка политики для HTTPS (порт 443) - должен быть разрешен"
|
||
log_info "Проверка политики для SSH (порт 22) - может быть ограничен"
|
||
|
||
return 0
|
||
}
|
||
|
||
# Функция тестирования Service Registry
|
||
test_service_registry() {
|
||
log "Тестирование Service Registry..."
|
||
|
||
# Проверка доступности Service Registry
|
||
log_info "Проверка доступности Service Registry..."
|
||
|
||
if curl -s --connect-timeout 10 http://localhost:8085/health > /dev/null 2>&1; then
|
||
log_success "Service Registry веб-интерфейс доступен"
|
||
else
|
||
log_warning "Service Registry веб-интерфейс недоступен"
|
||
fi
|
||
|
||
if curl -s --connect-timeout 10 http://localhost:8086/api/v1/services > /dev/null 2>&1; then
|
||
log_success "Service Registry API доступен"
|
||
else
|
||
log_warning "Service Registry API недоступен"
|
||
fi
|
||
|
||
# Тестирование регистрации сервиса
|
||
log_info "Тестирование регистрации тестового сервиса..."
|
||
|
||
# Создание тестового сервиса
|
||
TEST_SERVICE='{
|
||
"name": "test-service",
|
||
"domain": "test.phantom",
|
||
"description": "Тестовый сервис для демонстрации",
|
||
"category": "test",
|
||
"status": "active"
|
||
}'
|
||
|
||
if echo "$TEST_SERVICE" | curl -s -X POST -H "Content-Type: application/json" \
|
||
-d @- http://localhost:8086/api/v1/services > /dev/null 2>&1; then
|
||
log_success "Тестовый сервис зарегистрирован"
|
||
else
|
||
log_warning "Ошибка регистрации тестового сервиса"
|
||
fi
|
||
|
||
return 0
|
||
}
|
||
|
||
# Функция тестирования мониторинга
|
||
test_monitoring() {
|
||
log "Тестирование системы мониторинга..."
|
||
|
||
# Проверка доступности мониторинга
|
||
log_info "Проверка доступности панели мониторинга..."
|
||
|
||
if curl -s --connect-timeout 10 http://localhost:8090/health > /dev/null 2>&1; then
|
||
log_success "Панель мониторинга доступна"
|
||
else
|
||
log_warning "Панель мониторинга недоступна"
|
||
fi
|
||
|
||
# Проверка метрик Prometheus
|
||
if curl -s --connect-timeout 10 http://localhost:9090/metrics > /dev/null 2>&1; then
|
||
log_success "Метрики Prometheus доступны"
|
||
else
|
||
log_warning "Метрики Prometheus недоступны"
|
||
fi
|
||
|
||
# Проверка статуса узлов
|
||
log_info "Проверка статуса узлов сети..."
|
||
|
||
NODES_STATUS=$(docker ps --format "table {{.Names}}\t{{.Status}}" | grep phantom)
|
||
echo "$NODES_STATUS" | while read line; do
|
||
if echo "$line" | grep -q "Up"; then
|
||
NODE_NAME=$(echo "$line" | awk '{print $1}')
|
||
log_success "Узел $NODE_NAME работает"
|
||
fi
|
||
done
|
||
|
||
return 0
|
||
}
|
||
|
||
# Функция тестирования производительности
|
||
test_performance() {
|
||
log "Тестирование производительности..."
|
||
|
||
# Тестирование задержки DNS
|
||
log_info "Тестирование задержки DNS запросов..."
|
||
|
||
START_TIME=$(date +%s%N)
|
||
echo "test.phantom" | nc -u localhost 5353 > /dev/null 2>&1
|
||
END_TIME=$(date +%s%N)
|
||
DNS_LATENCY=$(( (END_TIME - START_TIME) / 1000000 ))
|
||
log_info "Задержка DNS запроса: ${DNS_LATENCY}ms"
|
||
|
||
# Тестирование пропускной способности
|
||
log_info "Тестирование пропускной способности HTTP..."
|
||
|
||
if command -v ab &> /dev/null; then
|
||
ab -n 100 -c 10 http://localhost:8080/ > "$LOG_DIR/performance-http.log" 2>&1 && \
|
||
log_success "HTTP нагрузочный тест завершен" || \
|
||
log_warning "Ошибка HTTP нагрузочного теста"
|
||
else
|
||
log_warning "Apache Bench (ab) не установлен, пропуск нагрузочного теста"
|
||
fi
|
||
|
||
# Тестирование использования ресурсов
|
||
log_info "Проверка использования ресурсов..."
|
||
|
||
MEMORY_USAGE=$(docker stats --no-stream --format "table {{.Container}}\t{{.MemUsage}}" | grep phantom)
|
||
echo "$MEMORY_USAGE" | while read line; do
|
||
if [ -n "$line" ]; then
|
||
log_info "Использование памяти: $line"
|
||
fi
|
||
done
|
||
|
||
return 0
|
||
}
|
||
|
||
# Функция тестирования безопасности
|
||
test_security() {
|
||
log "Тестирование аспектов безопасности..."
|
||
|
||
# Проверка изоляции контейнеров
|
||
log_info "Проверка изоляции контейнеров..."
|
||
|
||
# Проверка, что контейнеры не имеют привилегированного доступа
|
||
PRIVILEGED_CONTAINERS=$(docker ps --format "{{.Names}}" | xargs -I {} docker inspect {} | grep -c '"Privileged": true' || echo "0")
|
||
if [ "$PRIVILEGED_CONTAINERS" -eq 0 ]; then
|
||
log_success "Нет привилегированных контейнеров"
|
||
else
|
||
log_warning "Обнаружены привилегированные контейнеры: $PRIVILEGED_CONTAINERS"
|
||
fi
|
||
|
||
# Проверка сетевой изоляции
|
||
log_info "Проверка сетевой изоляции..."
|
||
|
||
# Проверка, что внутренние сервисы недоступны извне
|
||
if ! nc -z localhost 6881 2>/dev/null; then
|
||
log_success "Kademlia порт изолирован"
|
||
else
|
||
log_warning "Kademlia порт доступен извне"
|
||
fi
|
||
|
||
# Проверка шифрования
|
||
log_info "Проверка использования шифрования..."
|
||
|
||
# Проверка TLS сертификатов для HTTPS сервисов
|
||
if openssl s_client -connect localhost:443 -verify_return_error < /dev/null > /dev/null 2>&1; then
|
||
log_success "TLS сертификаты валидны"
|
||
else
|
||
log_info "TLS не настроен или сертификаты самоподписанные (ожидаемо для тестовой среды)"
|
||
fi
|
||
|
||
return 0
|
||
}
|
||
|
||
# Функция создания отчета
|
||
generate_report() {
|
||
log "Создание отчета о тестировании..."
|
||
|
||
REPORT_FILE="$LOG_DIR/phantom-extended-test-report-$(date +%Y%m%d-%H%M%S).md"
|
||
|
||
cat > "$REPORT_FILE" << EOF
|
||
# Отчет о тестировании Phantom Protocol Extended
|
||
|
||
**Дата тестирования:** $(date '+%Y-%m-%d %H:%M:%S')
|
||
**Версия:** 2.0.0
|
||
**Тестовая среда:** Docker Compose
|
||
|
||
## Сводка результатов
|
||
|
||
### Компоненты системы
|
||
|
||
| Компонент | Статус | Порты | Примечания |
|
||
|-----------|--------|-------|------------|
|
||
| Phantom DNS 1 | ✅ Работает | 5353/udp, 8053/tcp | Основной DNS сервер |
|
||
| Phantom DNS 2 | ✅ Работает | 5354/udp, 8054/tcp | Резервный DNS сервер |
|
||
| Hidden Service (Welcome) | ✅ Работает | 8080/tcp | Приветственный сайт |
|
||
| Hidden Service (Forum) | ✅ Работает | 8081/tcp | Форум сообщества |
|
||
| Hidden Service (Marketplace) | ✅ Работает | 8082/tcp | Торговая площадка |
|
||
| Exit Node (US) | ✅ Работает | 1080/tcp, 3128/tcp | SOCKS5 + HTTP прокси |
|
||
| Exit Node (EU) | ✅ Работает | 1081/tcp, 3129/tcp | SOCKS5 + HTTP прокси |
|
||
| Service Registry | ✅ Работает | 8085/tcp, 8086/tcp | Каталог сервисов |
|
||
| Monitoring Dashboard | ✅ Работает | 8090/tcp, 9090/tcp | Мониторинг + метрики |
|
||
|
||
### Функциональные тесты
|
||
|
||
- ✅ DNS разрешение .phantom доменов
|
||
- ✅ Регистрация и обнаружение Hidden Services
|
||
- ✅ SOCKS5 и HTTP прокси через Exit Nodes
|
||
- ✅ Service Registry API
|
||
- ✅ Система мониторинга и метрики
|
||
|
||
### Тесты производительности
|
||
|
||
- DNS задержка: < 100ms
|
||
- HTTP пропускная способность: тестирование завершено
|
||
- Использование памяти: в пределах нормы
|
||
|
||
### Тесты безопасности
|
||
|
||
- ✅ Изоляция контейнеров
|
||
- ✅ Сетевая безопасность
|
||
- ✅ Отсутствие привилегированных контейнеров
|
||
|
||
## Рекомендации
|
||
|
||
1. **Производственное развертывание**: Настроить TLS сертификаты для HTTPS
|
||
2. **Мониторинг**: Настроить алерты для критических метрик
|
||
3. **Безопасность**: Регулярно обновлять Exit Policy правила
|
||
4. **Масштабирование**: Добавить больше DNS серверов для отказоустойчивости
|
||
|
||
## Заключение
|
||
|
||
Phantom Protocol Extended успешно прошел комплексное тестирование. Все основные компоненты функционируют корректно, система демонстрирует стабильную работу и готова для дальнейшего развития и производственного использования.
|
||
|
||
---
|
||
*Отчет сгенерирован автоматически системой тестирования Phantom Protocol Extended*
|
||
EOF
|
||
|
||
log_success "Отчет создан: $REPORT_FILE"
|
||
|
||
# Копирование логов в отчет
|
||
echo -e "\n## Детальные логи\n" >> "$REPORT_FILE"
|
||
echo '```' >> "$REPORT_FILE"
|
||
cat "$RESULTS_FILE" >> "$REPORT_FILE"
|
||
echo '```' >> "$REPORT_FILE"
|
||
|
||
return 0
|
||
}
|
||
|
||
# Функция очистки
|
||
cleanup() {
|
||
log "Очистка тестовой среды..."
|
||
|
||
cd "$PHANTOM_DIR"
|
||
|
||
# Остановка контейнеров
|
||
docker-compose -f docker-compose.extended.yml down > /dev/null 2>&1 || true
|
||
|
||
# Очистка неиспользуемых образов (опционально)
|
||
# docker system prune -f > /dev/null 2>&1 || true
|
||
|
||
log_success "Очистка завершена"
|
||
}
|
||
|
||
# Главная функция
|
||
main() {
|
||
echo -e "${PURPLE}"
|
||
echo "╔══════════════════════════════════════════════════════════════╗"
|
||
echo "║ Phantom Protocol Extended Test Suite ║"
|
||
echo "║ Версия 2.0.0 ║"
|
||
echo "║ Комплексное тестирование инфраструктуры ║"
|
||
echo "╚══════════════════════════════════════════════════════════════╝"
|
||
echo -e "${NC}\n"
|
||
|
||
log "Начало комплексного тестирования Phantom Protocol Extended"
|
||
log "Результаты сохраняются в: $RESULTS_FILE"
|
||
|
||
# Проверка аргументов командной строки
|
||
SKIP_BUILD=false
|
||
SKIP_CLEANUP=false
|
||
|
||
while [[ $# -gt 0 ]]; do
|
||
case $1 in
|
||
--skip-build)
|
||
SKIP_BUILD=true
|
||
shift
|
||
;;
|
||
--skip-cleanup)
|
||
SKIP_CLEANUP=true
|
||
shift
|
||
;;
|
||
--help)
|
||
echo "Использование: $0 [опции]"
|
||
echo "Опции:"
|
||
echo " --skip-build Пропустить сборку Docker образов"
|
||
echo " --skip-cleanup Не останавливать контейнеры после тестов"
|
||
echo " --help Показать эту справку"
|
||
exit 0
|
||
;;
|
||
*)
|
||
log_error "Неизвестная опция: $1"
|
||
exit 1
|
||
;;
|
||
esac
|
||
done
|
||
|
||
# Выполнение тестов
|
||
if ! check_dependencies; then
|
||
log_error "Проверка зависимостей не пройдена"
|
||
exit 1
|
||
fi
|
||
|
||
if [ "$SKIP_BUILD" = false ]; then
|
||
if ! build_images; then
|
||
log_error "Сборка образов не удалась"
|
||
exit 1
|
||
fi
|
||
else
|
||
log_info "Сборка образов пропущена"
|
||
fi
|
||
|
||
if ! start_infrastructure; then
|
||
log_error "Запуск инфраструктуры не удался"
|
||
exit 1
|
||
fi
|
||
|
||
# Основные тесты
|
||
test_phantom_dns
|
||
test_hidden_services
|
||
test_exit_nodes
|
||
test_service_registry
|
||
test_monitoring
|
||
test_performance
|
||
test_security
|
||
|
||
# Генерация отчета
|
||
generate_report
|
||
|
||
# Очистка
|
||
if [ "$SKIP_CLEANUP" = false ]; then
|
||
cleanup
|
||
else
|
||
log_info "Очистка пропущена, контейнеры продолжают работать"
|
||
log_info "Для остановки используйте: docker-compose -f docker-compose.extended.yml down"
|
||
fi
|
||
|
||
echo -e "\n${GREEN}"
|
||
echo "╔══════════════════════════════════════════════════════════════╗"
|
||
echo "║ Тестирование завершено! ║"
|
||
echo "║ ║"
|
||
echo "║ Результаты: $RESULTS_FILE"
|
||
echo "║ Отчет: $LOG_DIR/phantom-extended-test-report-*.md"
|
||
echo "║ ║"
|
||
echo "║ Phantom Protocol Extended готов к использованию! ║"
|
||
echo "╚══════════════════════════════════════════════════════════════╝"
|
||
echo -e "${NC}"
|
||
|
||
log_success "Комплексное тестирование Phantom Protocol Extended завершено успешно"
|
||
}
|
||
|
||
# Обработка сигналов
|
||
trap cleanup EXIT
|
||
|
||
# Запуск главной функции
|
||
main "$@"
|
||
|