mirror of
https://github.com/r3bo0tbx1/tor-guard-relay.git
synced 2026-04-06 00:32:04 +02:00
🔧 New tool: gen-family - generate/view Happy Family keys - Supports --force flag to overwrite existing keys without backup prompt 🐳 Dockerfiles: gen-family in both Dockerfile and Dockerfile.edge 🔧 Entrypoint: - Phase 2: detect *.secret_family_key, log found keys (informational only) - Guard/exit config gen: append FamilyId + MyFamily from ENV vars - Bridge intentionally excluded 📊 Status tool: show family key count + Happy Family config state 📚 Docs: - README: Happy Family section (generate / import), persistence table, flowchart - ARCHITECTURE: all mermaid diagrams updated (Phase 2, config gen, tools, dirs) - TOOLS: full gen-family reference with examples and exit codes - DEPLOYMENT, MIGRATION, MIGRATION-V1.1.X, TROUBLESHOOTING: 5 -> 6 tools - FAQ, example configs: version bump + FamilyId/MyFamily placeholders - Directory authority voting: how 9 dirauths vote on relay flags (5/9 consensus) - CIISS v2 ContactInfo: field reference, generator link, proof:uri-rsa verification - All TOR_CONTACT_INFO examples updated to CIISS v2 format across templates and docs 📋 Templates: - Guard/exit/multi-relay compose: TOR_FAMILY_ID + TOR_MY_FAMILY env vars - All cosmos-compose + docker-compose versions -> 1.1.7 👷 CI: validate.yml gen-family in 8 spots (threshold 6), security tests, quick-test 🛡️ SECURITY.md: 1.1.7 active, 1.1.6 maintenance, gen-family in tools list 🔖 Version bump 1.1.6 -> 1.1.7 across 30+ files, tool count 5 -> 6, CHANGELOG entry No breaking changes. TOR_FAMILY_ID and TOR_MY_FAMILY are optional.
328 lines
12 KiB
Bash
328 lines
12 KiB
Bash
#!/bin/bash
|
||
# quick-test.sh - Quick local testing for Tor relay official bridge compatibility
|
||
# Tests official ENV naming, TOR_* naming, and OBFS4V_* processing
|
||
|
||
set -e
|
||
|
||
# Colors for output
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
log() { echo -e "${BLUE}ℹ️ $1${NC}"; }
|
||
success() { echo -e "${GREEN}✅ $1${NC}"; }
|
||
error() { echo -e "${RED}❌ $1${NC}"; exit 1; }
|
||
warn() { echo -e "${YELLOW}⚠️ $1${NC}"; }
|
||
|
||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||
echo "🧪 Tor Relay Quick Test Suite"
|
||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||
echo ""
|
||
|
||
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
# Step 1: Build the image
|
||
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
||
log "Step 1: Building Docker image..."
|
||
|
||
# Fix line endings (Windows compatibility)
|
||
if command -v dos2unix &> /dev/null; then
|
||
dos2unix docker-entrypoint.sh tools/* 2>/dev/null || true
|
||
success "Line endings normalized"
|
||
else
|
||
warn "dos2unix not found, skipping line ending normalization"
|
||
fi
|
||
|
||
# Build the image
|
||
docker build -t tor-relay:test . -q || error "Docker build failed"
|
||
success "Docker image built: tor-relay:test"
|
||
|
||
# Verify build info
|
||
BUILD_INFO=$(docker run --rm tor-relay:test cat /build-info.txt 2>/dev/null || echo "Not found")
|
||
echo "$BUILD_INFO" | head -3 | sed 's/^/ /'
|
||
echo ""
|
||
|
||
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
# Step 2: Test official bridge ENV naming
|
||
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
||
log "Step 2: Testing official Tor Project bridge ENV naming..."
|
||
|
||
docker run -d --name test-official \
|
||
--network host \
|
||
-e OR_PORT=9001 \
|
||
-e PT_PORT=9002 \
|
||
-e EMAIL="test@example.com" \
|
||
-e NICKNAME=TestOfficial \
|
||
-e OBFS4_ENABLE_ADDITIONAL_VARIABLES=1 \
|
||
-e OBFS4V_AddressDisableIPv6=0 \
|
||
-e OBFS4V_MaxMemInQueues="512 MB" \
|
||
-v test-official-data:/var/lib/tor \
|
||
tor-relay:test >/dev/null || error "Failed to start container"
|
||
|
||
sleep 8
|
||
|
||
# Check logs
|
||
LOGS=$(docker logs test-official 2>&1)
|
||
|
||
# Test 2.1: Bridge mode auto-detection
|
||
if echo "$LOGS" | grep -q "Relay mode: bridge"; then
|
||
success "Bridge mode auto-detected from PT_PORT"
|
||
else
|
||
error "Bridge mode auto-detection failed"
|
||
fi
|
||
|
||
# Test 2.2: Configuration from ENV
|
||
if echo "$LOGS" | grep -q "Configuration generated from ENV vars"; then
|
||
success "Configuration generated from environment variables"
|
||
else
|
||
error "ENV configuration generation failed"
|
||
fi
|
||
|
||
# Test 2.3: OBFS4V_* processing
|
||
TORRC=$(docker exec test-official cat /etc/tor/torrc 2>/dev/null)
|
||
if echo "$TORRC" | grep -q "MaxMemInQueues 512 MB"; then
|
||
success "OBFS4V_MaxMemInQueues processed correctly"
|
||
else
|
||
error "OBFS4V_ variable processing failed"
|
||
fi
|
||
|
||
if echo "$TORRC" | grep -q "AddressDisableIPv6 0"; then
|
||
success "OBFS4V_AddressDisableIPv6 processed correctly"
|
||
else
|
||
error "OBFS4V_AddressDisableIPv6 processing failed"
|
||
fi
|
||
|
||
# Test 2.4: Bridge configuration
|
||
if echo "$TORRC" | grep -q "BridgeRelay 1"; then
|
||
success "BridgeRelay configured"
|
||
else
|
||
error "BridgeRelay not configured"
|
||
fi
|
||
|
||
if echo "$TORRC" | grep -q "ServerTransportPlugin obfs4 exec /usr/bin/lyrebird"; then
|
||
success "obfs4 transport configured with lyrebird"
|
||
else
|
||
error "obfs4 transport not configured"
|
||
fi
|
||
|
||
# Test 2.5: Health check
|
||
HEALTH=$(docker exec test-official health 2>/dev/null)
|
||
if echo "$HEALTH" | jq -e '.status' >/dev/null 2>&1; then
|
||
STATUS=$(echo "$HEALTH" | jq -r '.status')
|
||
success "Health check works (status: $STATUS)"
|
||
else
|
||
error "Health check failed"
|
||
fi
|
||
|
||
# Cleanup
|
||
docker stop test-official >/dev/null 2>&1
|
||
docker rm test-official >/dev/null 2>&1
|
||
docker volume rm test-official-data >/dev/null 2>&1
|
||
|
||
echo ""
|
||
|
||
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
# Step 3: Test TOR_* ENV naming (guard mode)
|
||
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
||
log "Step 3: Testing TOR_* ENV naming (guard mode)..."
|
||
|
||
docker run -d --name test-guard \
|
||
--network host \
|
||
-e TOR_RELAY_MODE=guard \
|
||
-e TOR_NICKNAME=TestGuard \
|
||
-e TOR_CONTACT_INFO="test@example.com" \
|
||
-e TOR_ORPORT=9001 \
|
||
-e TOR_DIRPORT=9030 \
|
||
-e TOR_BANDWIDTH_RATE="5 MBytes" \
|
||
-v test-guard-data:/var/lib/tor \
|
||
tor-relay:test >/dev/null || error "Failed to start guard container"
|
||
|
||
sleep 8
|
||
|
||
GUARD_LOGS=$(docker logs test-guard 2>&1)
|
||
|
||
# Test 3.1: Guard mode
|
||
if echo "$GUARD_LOGS" | grep -q "Relay mode: guard"; then
|
||
success "Guard mode configured correctly"
|
||
else
|
||
error "Guard mode configuration failed"
|
||
fi
|
||
|
||
# Test 3.2: Guard torrc
|
||
GUARD_TORRC=$(docker exec test-guard cat /etc/tor/torrc 2>/dev/null)
|
||
if echo "$GUARD_TORRC" | grep -q "ExitRelay 0"; then
|
||
success "ExitRelay 0 set (not an exit)"
|
||
else
|
||
error "ExitRelay configuration failed"
|
||
fi
|
||
|
||
if echo "$GUARD_TORRC" | grep -q "BridgeRelay 0"; then
|
||
success "BridgeRelay 0 set (not a bridge)"
|
||
else
|
||
error "BridgeRelay configuration failed"
|
||
fi
|
||
|
||
if echo "$GUARD_TORRC" | grep -q "DirPort 9030"; then
|
||
success "DirPort configured"
|
||
else
|
||
error "DirPort configuration failed"
|
||
fi
|
||
|
||
if echo "$GUARD_TORRC" | grep -q "RelayBandwidthRate 5 MBytes"; then
|
||
success "Bandwidth rate configured"
|
||
else
|
||
error "Bandwidth rate configuration failed"
|
||
fi
|
||
|
||
# Cleanup
|
||
docker stop test-guard >/dev/null 2>&1
|
||
docker rm test-guard >/dev/null 2>&1
|
||
docker volume rm test-guard-data >/dev/null 2>&1
|
||
|
||
echo ""
|
||
|
||
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
# Step 4: Test diagnostic tools
|
||
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
||
log "Step 4: Testing diagnostic tools..."
|
||
|
||
docker run -d --name test-tools \
|
||
--network host \
|
||
-e OR_PORT=9001 \
|
||
-e PT_PORT=9002 \
|
||
-e EMAIL="test@example.com" \
|
||
-e NICKNAME=TestTools \
|
||
-v test-tools-data:/var/lib/tor \
|
||
tor-relay:test >/dev/null || error "Failed to start tools test container"
|
||
|
||
sleep 10
|
||
|
||
# Test 4.1: status tool
|
||
if docker exec test-tools status >/dev/null 2>&1; then
|
||
success "status tool works"
|
||
else
|
||
error "status tool failed"
|
||
fi
|
||
|
||
# Test 4.2: health tool (JSON)
|
||
HEALTH_JSON=$(docker exec test-tools health 2>/dev/null)
|
||
if echo "$HEALTH_JSON" | jq -e '.' >/dev/null 2>&1; then
|
||
success "health tool works (valid JSON)"
|
||
else
|
||
error "health tool failed or invalid JSON"
|
||
fi
|
||
|
||
# Test 4.3: fingerprint tool
|
||
if docker exec test-tools fingerprint >/dev/null 2>&1; then
|
||
success "fingerprint tool works"
|
||
else
|
||
warn "fingerprint tool not ready yet (needs more time to bootstrap)"
|
||
fi
|
||
|
||
# Test 4.4: bridge-line tool (may not be ready yet)
|
||
if docker exec test-tools bridge-line >/dev/null 2>&1; then
|
||
success "bridge-line tool works"
|
||
else
|
||
warn "bridge-line tool not ready yet (needs full bootstrap - 10-30 minutes)"
|
||
fi
|
||
|
||
# Test 4.5: gen-family tool (help flag)
|
||
if docker exec test-tools gen-family --help >/dev/null 2>&1; then
|
||
success "gen-family tool works"
|
||
else
|
||
warn "gen-family tool not available (requires Tor 0.4.9+)"
|
||
fi
|
||
|
||
# Cleanup
|
||
docker stop test-tools >/dev/null 2>&1
|
||
docker rm test-tools >/dev/null 2>&1
|
||
docker volume rm test-tools-data >/dev/null 2>&1
|
||
|
||
echo ""
|
||
|
||
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
# Step 5: Test mixed ENV naming
|
||
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
||
log "Step 5: Testing mixed ENV naming..."
|
||
|
||
docker run -d --name test-mixed \
|
||
--network host \
|
||
-e OR_PORT=9001 \
|
||
-e PT_PORT=9002 \
|
||
-e TOR_CONTACT_INFO="test@example.com" \
|
||
-e NICKNAME=TestMixed \
|
||
-e TOR_BANDWIDTH_RATE="10 MBytes" \
|
||
-v test-mixed-data:/var/lib/tor \
|
||
tor-relay:test >/dev/null || error "Failed to start mixed test container"
|
||
|
||
sleep 8
|
||
|
||
MIXED_TORRC=$(docker exec test-mixed cat /etc/tor/torrc 2>/dev/null)
|
||
|
||
# Test 5.1: Official OR_PORT mapped
|
||
if echo "$MIXED_TORRC" | grep -q "ORPort 9001"; then
|
||
success "OR_PORT mapped correctly"
|
||
else
|
||
error "OR_PORT mapping failed"
|
||
fi
|
||
|
||
# Test 5.2: TOR_CONTACT_INFO used
|
||
if echo "$MIXED_TORRC" | grep -q "ContactInfo test@example.com"; then
|
||
success "TOR_CONTACT_INFO used correctly"
|
||
else
|
||
error "TOR_CONTACT_INFO failed"
|
||
fi
|
||
|
||
# Test 5.3: Official NICKNAME used
|
||
if echo "$MIXED_TORRC" | grep -q "Nickname TestMixed"; then
|
||
success "NICKNAME used correctly"
|
||
else
|
||
error "NICKNAME mapping failed"
|
||
fi
|
||
|
||
# Test 5.4: TOR_BANDWIDTH_RATE used
|
||
if echo "$MIXED_TORRC" | grep -q "RelayBandwidthRate 10 MBytes"; then
|
||
success "TOR_BANDWIDTH_RATE used correctly"
|
||
else
|
||
error "TOR_BANDWIDTH_RATE failed"
|
||
fi
|
||
|
||
# Cleanup
|
||
docker stop test-mixed >/dev/null 2>&1
|
||
docker rm test-mixed >/dev/null 2>&1
|
||
docker volume rm test-mixed-data >/dev/null 2>&1
|
||
|
||
echo ""
|
||
|
||
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
# Final Summary
|
||
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||
success "All tests passed! 🎉"
|
||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||
echo ""
|
||
echo "✅ Official bridge ENV naming works (OR_PORT, PT_PORT, EMAIL, NICKNAME)"
|
||
echo "✅ OBFS4V_* variables are processed correctly"
|
||
echo "✅ Bridge mode auto-detected from PT_PORT"
|
||
echo "✅ TOR_* ENV naming works (TOR_ORPORT, TOR_CONTACT_INFO, etc.)"
|
||
echo "✅ Guard/Exit/Bridge modes configured correctly"
|
||
echo "✅ Diagnostic tools work (status, health, fingerprint, bridge-line, gen-family)"
|
||
echo "✅ Mixed ENV naming works (can combine official + TOR_* prefix)"
|
||
echo ""
|
||
echo "🎯 Your image is fully compatible with thetorproject/obfs4-bridge!"
|
||
echo ""
|
||
echo "Next steps:"
|
||
echo " 1. Test with Docker Compose: docker-compose -f templates/docker-compose-bridge-official.yml up -d"
|
||
echo " 2. Deploy to production"
|
||
echo " 3. Monitor with: docker exec <container> health | jq ."
|
||
echo ""
|
||
echo "See LOCAL-TESTING.md for comprehensive testing guide."
|
||
echo ""
|