- Add cache refresh mechanism for config updates - Implement selective re-initialization for NIP-11 relay info changes - Categorize configs as dynamic vs restart-required using requires_restart field - Enhance admin API responses with restart requirement information - Add comprehensive test for dynamic config updates - Update documentation for dynamic configuration capabilities Most relay settings can now be updated via admin API without requiring restart, improving operational flexibility while maintaining stability for critical changes.
133 lines
4.1 KiB
Bash
Executable File
133 lines
4.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Test dynamic config updates without restart
|
|
|
|
set -e
|
|
|
|
# Configuration from relay startup
|
|
ADMIN_PRIVKEY="ddea442930976541e199a05248eb6cd92f2a65ba366a883a8f6880add9bdc9c9"
|
|
RELAY_PUBKEY="1bd4a5e2e32401737f8c16cc0dfa89b93f25f395770a2896fe78c9fb61582dfc"
|
|
RELAY_URL="ws://localhost:8888"
|
|
|
|
# Colors
|
|
GREEN='\033[0;32m'
|
|
RED='\033[0;31m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
log_info() {
|
|
echo -e "${BLUE}[INFO]${NC} $1"
|
|
}
|
|
|
|
log_success() {
|
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
|
}
|
|
|
|
log_error() {
|
|
echo -e "${RED}[ERROR]${NC} $1"
|
|
}
|
|
|
|
# Check if nak is available
|
|
if ! command -v nak &> /dev/null; then
|
|
log_error "nak command not found. Please install nak first."
|
|
exit 1
|
|
fi
|
|
|
|
log_info "Testing dynamic config updates without restart..."
|
|
|
|
# Test 1: Check current NIP-11 info
|
|
log_info "Checking current NIP-11 relay info..."
|
|
CURRENT_DESC=$(curl -s -H "Accept: application/nostr+json" http://localhost:8888 | jq -r '.description')
|
|
log_info "Current description: $CURRENT_DESC"
|
|
|
|
# Test 2: Update relay description dynamically
|
|
NEW_DESC="Dynamic Config Test - Updated at $(date)"
|
|
log_info "Updating relay description to: $NEW_DESC"
|
|
|
|
COMMAND="[\"config_update\", [{\"key\": \"relay_description\", \"value\": \"$NEW_DESC\", \"data_type\": \"string\", \"category\": \"relay\"}]]"
|
|
|
|
# Encrypt the command
|
|
ENCRYPTED_COMMAND=$(nak encrypt "$COMMAND" --sec "$ADMIN_PRIVKEY" --recipient-pubkey "$RELAY_PUBKEY")
|
|
|
|
if [ -z "$ENCRYPTED_COMMAND" ]; then
|
|
log_error "Failed to encrypt config update command"
|
|
exit 1
|
|
fi
|
|
|
|
# Create admin event
|
|
ADMIN_EVENT=$(nak event \
|
|
--kind 23456 \
|
|
--content "$ENCRYPTED_COMMAND" \
|
|
--sec "$ADMIN_PRIVKEY" \
|
|
--tag "p=$RELAY_PUBKEY")
|
|
|
|
# Send the admin command
|
|
log_info "Sending config update command..."
|
|
ADMIN_RESULT=$(echo "$ADMIN_EVENT" | nak event "$RELAY_URL")
|
|
|
|
if echo "$ADMIN_RESULT" | grep -q "error\|failed\|denied"; then
|
|
log_error "Failed to send config update: $ADMIN_RESULT"
|
|
exit 1
|
|
fi
|
|
|
|
log_success "Config update command sent successfully"
|
|
|
|
# Wait for processing
|
|
sleep 3
|
|
|
|
# Test 3: Check if NIP-11 info updated without restart
|
|
log_info "Checking if NIP-11 info was updated without restart..."
|
|
UPDATED_DESC=$(curl -s -H "Accept: application/nostr+json" http://localhost:8888 | jq -r '.description')
|
|
|
|
if [ "$UPDATED_DESC" = "$NEW_DESC" ]; then
|
|
log_success "SUCCESS: Relay description updated dynamically without restart!"
|
|
log_success "Old: $CURRENT_DESC"
|
|
log_success "New: $UPDATED_DESC"
|
|
else
|
|
log_error "FAILED: Relay description was not updated"
|
|
log_error "Expected: $NEW_DESC"
|
|
log_error "Got: $UPDATED_DESC"
|
|
exit 1
|
|
fi
|
|
|
|
# Test 4: Test another dynamic config - max_subscriptions_per_client
|
|
log_info "Testing another dynamic config: max_subscriptions_per_client"
|
|
|
|
# Get current value from database
|
|
OLD_LIMIT=$(sqlite3 build/*.db "SELECT value FROM config WHERE key = 'max_subscriptions_per_client';" 2>/dev/null || echo "25")
|
|
log_info "Current max_subscriptions_per_client: $OLD_LIMIT"
|
|
|
|
NEW_LIMIT=50
|
|
|
|
COMMAND2="[\"config_update\", [{\"key\": \"max_subscriptions_per_client\", \"value\": \"$NEW_LIMIT\", \"data_type\": \"integer\", \"category\": \"limits\"}]]"
|
|
|
|
ENCRYPTED_COMMAND2=$(nak encrypt "$COMMAND2" --sec "$ADMIN_PRIVKEY" --recipient-pubkey "$RELAY_PUBKEY")
|
|
|
|
ADMIN_EVENT2=$(nak event \
|
|
--kind 23456 \
|
|
--content "$ENCRYPTED_COMMAND2" \
|
|
--sec "$ADMIN_PRIVKEY" \
|
|
--tag "p=$RELAY_PUBKEY")
|
|
|
|
log_info "Updating max_subscriptions_per_client to $NEW_LIMIT..."
|
|
ADMIN_RESULT2=$(echo "$ADMIN_EVENT2" | nak event "$RELAY_URL")
|
|
|
|
if echo "$ADMIN_RESULT2" | grep -q "error\|failed\|denied"; then
|
|
log_error "Failed to send second config update: $ADMIN_RESULT2"
|
|
exit 1
|
|
fi
|
|
|
|
sleep 3
|
|
|
|
# Check updated value from database
|
|
UPDATED_LIMIT=$(sqlite3 build/*.db "SELECT value FROM config WHERE key = 'max_subscriptions_per_client';" 2>/dev/null || echo "25")
|
|
|
|
if [ "$UPDATED_LIMIT" = "$NEW_LIMIT" ]; then
|
|
log_success "SUCCESS: max_subscriptions_per_client updated dynamically!"
|
|
log_success "Old: $OLD_LIMIT, New: $UPDATED_LIMIT"
|
|
else
|
|
log_error "FAILED: max_subscriptions_per_client was not updated"
|
|
log_error "Expected: $NEW_LIMIT, Got: $UPDATED_LIMIT"
|
|
fi
|
|
|
|
log_success "Dynamic config update testing completed successfully!" |