Files
hmac-file-server/check-configs.sh
Alexander Renz 68ede52336 Add comprehensive configuration and testing for HMAC File Server 3.2
- Introduced configuration files for Docker, Podman, and SystemD deployments.
- Implemented a comprehensive test suite for HMAC validation, file uploads, and network resilience.
- Added debugging scripts for live monitoring of upload issues and service status.
- Created minimal configuration for testing purposes.
- Developed multiple test scripts to validate HMAC calculations and response handling.
- Enhanced upload tests to cover various scenarios including invalid HMAC and unsupported file extensions.
- Improved logging and error analysis capabilities for better diagnostics.
2025-07-20 18:04:23 +00:00

359 lines
12 KiB
Bash

#!/bin/bash
# HMAC File Server Configuration Consistency Checker
# Ensures all deployment methods use proper configuration structure
set -e
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# Configuration templates to check
CONFIG_LOCATIONS=(
"/opt/hmac-file-server/config.toml" # SystemD
"./hmac-docker/config/config.toml" # Docker
"/opt/podman/hmac-file-server/config/config.toml" # Podman
"/etc/hmac-file-server/config.toml" # Debian
"./config-default.toml" # Default template
"./config-simple.toml" # Simple template
"./config-simplified-production.toml" # Production template
)
# Required sections and fields
REQUIRED_SECTIONS=("server" "security" "uploads" "logging")
REQUIRED_FIELDS=(
"server.listen_address"
"server.storage_path"
"security.secret"
"uploads.networkevents"
)
NETWORK_RESILIENCE_FIELDS=(
"network_resilience.enabled"
"network_resilience.quality_monitoring"
"network_resilience.upload_resilience"
)
check_config_file() {
local config_file="$1"
local config_name="$2"
local errors=0
local warnings=0
log_info "Checking $config_name: $config_file"
if [ ! -f "$config_file" ]; then
log_warning "Configuration file not found (may not be installed)"
return 0
fi
# Check for common field naming issues
if grep -q "storagepath\s*=" "$config_file" 2>/dev/null; then
log_error "Found 'storagepath' - should be 'storage_path'"
((errors++))
fi
if grep -q "listenport\s*=" "$config_file" 2>/dev/null; then
log_error "Found 'listenport' - should be 'listen_address'"
((errors++))
fi
if grep -q "metricsenabled\s*=" "$config_file" 2>/dev/null; then
log_error "Found 'metricsenabled' - should be 'metrics_enabled'"
((errors++))
fi
# Check required sections
for section in "${REQUIRED_SECTIONS[@]}"; do
if ! grep -q "^\[$section\]" "$config_file" 2>/dev/null; then
log_error "Missing required section: [$section]"
((errors++))
fi
done
# Check required fields
for field in "${REQUIRED_FIELDS[@]}"; do
field_name=$(echo "$field" | cut -d'.' -f2)
if ! grep -q "^$field_name\s*=" "$config_file" 2>/dev/null; then
log_warning "Missing or commented field: $field_name"
((warnings++))
fi
done
# Check network resilience
local has_network_resilience=false
if grep -q "^\[network_resilience\]" "$config_file" 2>/dev/null; then
has_network_resilience=true
log_success "Network resilience section found"
for field in "${NETWORK_RESILIENCE_FIELDS[@]}"; do
field_name=$(echo "$field" | cut -d'.' -f2)
if ! grep -q "^$field_name\s*=" "$config_file" 2>/dev/null; then
log_warning "Missing network resilience field: $field_name"
((warnings++))
fi
done
else
log_warning "Network resilience section missing"
((warnings++))
fi
# Check networkevents setting
if grep -q "networkevents\s*=\s*true" "$config_file" 2>/dev/null; then
if [ "$has_network_resilience" = false ]; then
log_error "networkevents=true but no [network_resilience] section"
((errors++))
fi
fi
# Validate configuration with binary if available
if [ -f "./test-hmac-file-server" ]; then
log_info "Validating configuration syntax..."
if ./test-hmac-file-server -config "$config_file" --validate-config >/dev/null 2>&1; then
log_success "Configuration validation passed"
else
log_warning "Configuration has validation warnings"
((warnings++))
fi
fi
# Summary for this config
if [ $errors -eq 0 ] && [ $warnings -eq 0 ]; then
log_success "$config_name: Perfect configuration"
elif [ $errors -eq 0 ]; then
log_warning "$config_name: $warnings warnings"
else
log_error "$config_name: $errors errors, $warnings warnings"
fi
echo ""
return $errors
}
# Auto-fix function
fix_config_file() {
local config_file="$1"
local config_name="$2"
if [ ! -f "$config_file" ]; then
log_warning "Configuration file not found: $config_file"
return 0
fi
log_info "Auto-fixing $config_name..."
# Create backup
cp "$config_file" "$config_file.backup.$(date +%Y%m%d_%H%M%S)"
# Fix common field naming issues
sed -i 's/storagepath\s*=/storage_path =/g' "$config_file"
sed -i 's/listenport\s*=/listen_address =/g' "$config_file"
sed -i 's/metricsenabled\s*=/metrics_enabled =/g' "$config_file"
sed -i 's/metricsport\s*=/metrics_port =/g' "$config_file"
sed -i 's/pidfilepath\s*=/pid_file =/g' "$config_file"
# Ensure networkevents is enabled if network_resilience section exists
if grep -q "^\[network_resilience\]" "$config_file" 2>/dev/null; then
if ! grep -q "networkevents\s*=" "$config_file" 2>/dev/null; then
# Add networkevents = true to uploads section
sed -i '/^\[uploads\]/a networkevents = true' "$config_file"
else
# Enable existing networkevents
sed -i 's/networkevents\s*=\s*false/networkevents = true/g' "$config_file"
fi
fi
log_success "Auto-fix completed for $config_name"
}
# Generate standardized configuration
generate_standard_config() {
local config_file="$1"
local deployment_type="$2"
log_info "Generating standardized configuration for $deployment_type..."
# Create directory if needed
mkdir -p "$(dirname "$config_file")"
cat > "$config_file" << EOF
# HMAC File Server 3.2 "Tremora del Terra" Configuration
# Generated for: $deployment_type deployment
# Generated on: $(date)
[server]
listen_address = "8080"
storage_path = "/opt/hmac-file-server/data/uploads"
metrics_enabled = true
metrics_port = "9090"
pid_file = "/opt/hmac-file-server/data/hmac-file-server.pid"
max_upload_size = "10GB"
deduplication_enabled = true
min_free_bytes = "1GB"
file_naming = "original"
enable_dynamic_workers = true
[security]
secret = "CHANGE-THIS-SECRET-KEY-MINIMUM-32-CHARACTERS"
enablejwt = false
[uploads]
allowedextensions = [".txt", ".pdf", ".jpg", ".jpeg", ".png", ".gif", ".webp", ".zip", ".tar", ".gz", ".7z", ".mp4", ".webm", ".ogg", ".mp3", ".wav", ".flac", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".odt", ".ods", ".odp"]
maxfilesize = "100MB"
chunkeduploadsenabled = true
chunksize = "10MB"
networkevents = true
# Network Resilience for Enhanced Mobile Support
[network_resilience]
enabled = true
fast_detection = false # Standard detection for server deployment
quality_monitoring = true # Enable quality monitoring
predictive_switching = false # Conservative switching for servers
mobile_optimizations = false # Standard thresholds for server environment
upload_resilience = true # Resume uploads across network changes
detection_interval = "5s" # Standard detection interval
quality_check_interval = "10s" # Regular quality monitoring
network_change_threshold = 3 # Switches required to trigger network change
interface_stability_time = "30s" # Server-appropriate stability time
upload_pause_timeout = "5m" # Standard upload pause timeout
upload_retry_timeout = "10m" # Standard retry timeout
rtt_warning_threshold = "200ms" # Server network warning threshold
rtt_critical_threshold = "1000ms" # Server network critical threshold
packet_loss_warning_threshold = 2.0 # 2% packet loss warning
packet_loss_critical_threshold = 10.0 # 10% packet loss critical
[downloads]
chunkeddownloadsenabled = true
chunksize = "10MB"
[logging]
level = "INFO"
file = "/opt/hmac-file-server/data/logs/hmac-file-server.log"
max_size = 100
max_backups = 3
max_age = 30
compress = true
[workers]
numworkers = 10
uploadqueuesize = 1000
autoscaling = true
[timeouts]
readtimeout = "30s"
writetimeout = "30s"
idletimeout = "120s"
shutdown = "30s"
[clamav]
enabled = false
[redis]
enabled = false
EOF
log_success "Standard configuration generated: $config_file"
}
# Main function
main() {
echo -e "${BLUE}╔═══════════════════════════════════════════════════════════╗${NC}"
echo -e "${BLUE}${NC} HMAC File Server Configuration Consistency Checker ${BLUE}${NC}"
echo -e "${BLUE}╚═══════════════════════════════════════════════════════════╝${NC}"
echo ""
local total_errors=0
local fix_mode=false
local generate_mode=false
# Parse arguments
while [[ $# -gt 0 ]]; do
case $1 in
--fix)
fix_mode=true
shift
;;
--generate)
generate_mode=true
shift
;;
--help)
echo "Configuration Consistency Checker"
echo ""
echo "Usage: $0 [options]"
echo ""
echo "Options:"
echo " --fix Auto-fix common configuration issues"
echo " --generate Generate standardized configurations"
echo " --help Show this help"
exit 0
;;
*)
log_error "Unknown option: $1"
exit 1
;;
esac
done
if [ "$generate_mode" = true ]; then
log_info "Generating standardized configurations for all deployment methods..."
generate_standard_config "./templates/config-systemd.toml" "SystemD"
generate_standard_config "./templates/config-docker.toml" "Docker"
generate_standard_config "./templates/config-podman.toml" "Podman"
generate_standard_config "./templates/config-debian.toml" "Debian"
log_success "All standard configurations generated in ./templates/"
exit 0
fi
# Check all configuration locations
for i in "${!CONFIG_LOCATIONS[@]}"; do
config_file="${CONFIG_LOCATIONS[$i]}"
# Determine config name
case "$config_file" in
*"/opt/hmac-file-server/"*) config_name="SystemD" ;;
*"hmac-docker"*) config_name="Docker" ;;
*"podman"*) config_name="Podman" ;;
*"/etc/hmac-file-server/"*) config_name="Debian" ;;
*"config-default.toml") config_name="Default Template" ;;
*"config-simple.toml") config_name="Simple Template" ;;
*"config-simplified-production.toml") config_name="Production Template" ;;
*) config_name="Unknown" ;;
esac
if [ "$fix_mode" = true ]; then
fix_config_file "$config_file" "$config_name"
fi
if check_config_file "$config_file" "$config_name"; then
# No errors
:
else
((total_errors++))
fi
done
# Summary
echo "════════════════════════════════════════════════════════════"
if [ $total_errors -eq 0 ]; then
log_success "All configurations are consistent and valid!"
else
log_error "Found configuration issues in $total_errors files"
echo ""
log_info "Run with --fix to automatically correct common issues"
log_info "Run with --generate to create standardized configuration templates"
exit 1
fi
}
main "$@"