Files
hmac-file-server/debug-uploads.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

224 lines
7.2 KiB
Bash

#!/bin/bash
# Live debugging script for HMAC File Server upload issues
# Monitors logs in real-time and provides detailed diagnostics
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"; }
# Function to check service status
check_services() {
log_info "=== SERVICE STATUS CHECK ==="
echo "HMAC File Server:"
systemctl is-active hmac-file-server && echo "✅ Running" || echo "❌ Not running"
echo "Nginx:"
systemctl is-active nginx && echo "✅ Running" || echo "❌ Not running"
echo ""
}
# Function to show current configuration
show_config() {
log_info "=== CONFIGURATION SUMMARY ==="
echo "HMAC File Server Config:"
echo "- Max Upload Size: $(grep max_upload_size /opt/hmac-file-server/config.toml | cut -d'"' -f2)"
echo "- Chunk Size: $(grep chunksize /opt/hmac-file-server/config.toml | head -1 | cut -d'"' -f2)"
echo "- Chunked Uploads: $(grep chunkeduploadsenabled /opt/hmac-file-server/config.toml | cut -d'=' -f2 | tr -d ' ')"
echo "- Network Events: $(grep networkevents /opt/hmac-file-server/config.toml | cut -d'=' -f2 | tr -d ' ')"
echo "- Listen Address: $(grep listen_address /opt/hmac-file-server/config.toml | cut -d'"' -f2)"
echo ""
echo "Nginx Config:"
echo "- Client Max Body Size: $(nginx -T 2>/dev/null | grep client_max_body_size | head -1 | awk '{print $2}' | tr -d ';')"
echo "- Proxy Buffering: $(nginx -T 2>/dev/null | grep proxy_request_buffering | head -1 | awk '{print $2}' | tr -d ';')"
echo "- Proxy Timeouts: $(nginx -T 2>/dev/null | grep proxy_read_timeout | head -1 | awk '{print $2}' | tr -d ';')"
echo ""
}
# Function to monitor logs in real-time
monitor_logs() {
log_info "=== STARTING LIVE LOG MONITORING ==="
log_warning "Press Ctrl+C to stop monitoring"
echo ""
# Create named pipes for log monitoring
mkfifo /tmp/hmac_logs /tmp/nginx_logs 2>/dev/null || true
# Start log monitoring in background
journalctl -u hmac-file-server -f --no-pager > /tmp/hmac_logs &
HMAC_PID=$!
tail -f /var/log/nginx/access.log > /tmp/nginx_logs &
NGINX_PID=$!
# Monitor both logs with timestamps
{
while read line; do
echo -e "${BLUE}[HMAC]${NC} $line"
done < /tmp/hmac_logs &
while read line; do
if [[ "$line" =~ (PUT|POST) ]] && [[ "$line" =~ (40[0-9]|50[0-9]) ]]; then
echo -e "${RED}[NGINX-ERROR]${NC} $line"
elif [[ "$line" =~ (PUT|POST) ]]; then
echo -e "${GREEN}[NGINX-OK]${NC} $line"
else
echo -e "${YELLOW}[NGINX]${NC} $line"
fi
done < /tmp/nginx_logs &
wait
}
# Cleanup on exit
trap 'kill $HMAC_PID $NGINX_PID 2>/dev/null; rm -f /tmp/hmac_logs /tmp/nginx_logs' EXIT
}
# Function to test file upload
test_upload() {
local test_file="$1"
local test_size="${2:-1MB}"
if [ -z "$test_file" ]; then
test_file="/tmp/test_upload_${test_size}.bin"
log_info "Creating test file: $test_file ($test_size)"
case "$test_size" in
"1MB") dd if=/dev/urandom of="$test_file" bs=1M count=1 >/dev/null 2>&1 ;;
"10MB") dd if=/dev/urandom of="$test_file" bs=1M count=10 >/dev/null 2>&1 ;;
"100MB") dd if=/dev/urandom of="$test_file" bs=1M count=100 >/dev/null 2>&1 ;;
"1GB") dd if=/dev/urandom of="$test_file" bs=1M count=1024 >/dev/null 2>&1 ;;
esac
log_success "Test file created: $(ls -lh $test_file | awk '{print $5}')"
fi
# Get current timestamp for log filtering
log_info "=== TESTING UPLOAD: $test_file ==="
# Test with curl - simulate XMPP client behavior
local url="https://share.uuxo.net/test_path/test_file_$(date +%s).bin"
log_info "Testing upload to: $url"
curl -X PUT \
-H "Content-Type: application/octet-stream" \
-H "User-Agent: TestClient/1.0" \
--data-binary "@$test_file" \
"$url" \
-v \
-w "Response: %{http_code}, Size: %{size_upload}, Time: %{time_total}s\n" \
2>&1 | tee /tmp/curl_test.log
echo ""
log_info "Upload test completed. Check logs above for details."
}
# Function to analyze recent errors
analyze_errors() {
log_info "=== ERROR ANALYSIS ==="
echo "Recent 400 errors from Nginx:"
tail -100 /var/log/nginx/access.log | grep " 400 " | tail -5
echo ""
echo "Recent HMAC file server errors:"
tail -100 /opt/hmac-file-server/data/logs/hmac-file-server.log | grep -i error | tail -5
echo ""
echo "File extension configuration:"
grep -A 20 "allowedextensions" /opt/hmac-file-server/config.toml | head -10
echo ""
}
# Function to check file permissions and disk space
check_system() {
log_info "=== SYSTEM CHECK ==="
echo "Disk space:"
df -h /opt/hmac-file-server/data/uploads
echo ""
echo "Upload directory permissions:"
ls -la /opt/hmac-file-server/data/uploads/
echo ""
echo "Process information:"
ps aux | grep hmac-file-server | grep -v grep
echo ""
echo "Network connections:"
netstat -tlnp | grep :8080
echo ""
}
# Main menu
main_menu() {
echo -e "${BLUE}╔═══════════════════════════════════════════════════════════╗${NC}"
echo -e "${BLUE}${NC} HMAC File Server Live Debugging Tool ${BLUE}${NC}"
echo -e "${BLUE}╚═══════════════════════════════════════════════════════════╝${NC}"
echo ""
echo "1) Check service status"
echo "2) Show configuration summary"
echo "3) Start live log monitoring"
echo "4) Test file upload (1MB)"
echo "5) Test file upload (10MB)"
echo "6) Test file upload (100MB)"
echo "7) Analyze recent errors"
echo "8) Check system resources"
echo "9) Full diagnostic run"
echo "0) Exit"
echo ""
read -p "Choose an option [0-9]: " choice
case $choice in
1) check_services ;;
2) show_config ;;
3) monitor_logs ;;
4) test_upload "" "1MB" ;;
5) test_upload "" "10MB" ;;
6) test_upload "" "100MB" ;;
7) analyze_errors ;;
8) check_system ;;
9)
check_services
show_config
check_system
analyze_errors
;;
0) exit 0 ;;
*) log_error "Invalid option. Please choose 0-9." ;;
esac
echo ""
read -p "Press Enter to continue..."
main_menu
}
# Handle command line arguments
case "${1:-}" in
"monitor") monitor_logs ;;
"test") test_upload "$2" "$3" ;;
"analyze") analyze_errors ;;
"status") check_services ;;
"config") show_config ;;
"system") check_system ;;
*) main_menu ;;
esac