Files
tor-guard-relay/scripts/utilities/quick-test.sh
rE-Bo0t.bx1 be4f2bc125 feat(v1.1.7): Happy Family support (Tor 0.4.9+ FamilyId)
🔧 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.
2026-03-02 16:23:10 +08:00

328 lines
12 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 ""