#!/bin/bash # Comprehensive Log and Error Checker for Explorer # This script checks all components and generates a full error report set -euo pipefail # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Configuration CHAIN_ID=138 RPC_URL="${RPC_URL:-http://192.168.11.250:8545}" API_BASE="${API_BASE:-http://localhost:8080/api}" BLOCKSCOUT_API="${BLOCKSCOUT_API:-https://explorer.d-bis.org/api}" REPORT_FILE="logs/error-report-$(date +%Y%m%d-%H%M%S).md" # Create logs directory mkdir -p logs echo -e "${BLUE}========================================${NC}" echo -e "${BLUE}Explorer Log and Error Checker${NC}" echo -e "${BLUE}========================================${NC}" echo "" # Function to log errors log_error() { echo -e "${RED}❌ ERROR:${NC} $1" | tee -a "$REPORT_FILE" } log_warning() { echo -e "${YELLOW}⚠️ WARNING:${NC} $1" | tee -a "$REPORT_FILE" } log_success() { echo -e "${GREEN}✅ SUCCESS:${NC} $1" | tee -a "$REPORT_FILE" } log_info() { echo -e "${BLUE}ℹ️ INFO:${NC} $1" | tee -a "$REPORT_FILE" } # Initialize report cat > "$REPORT_FILE" < /dev/null; then if cast block-number --rpc-url "$RPC_URL" &> /dev/null; then BLOCK_NUMBER=$(cast block-number --rpc-url "$RPC_URL") log_success "RPC is accessible. Current block: $BLOCK_NUMBER" echo "- **RPC Status**: ✅ Accessible" >> "$REPORT_FILE" echo "- **Current Block**: $BLOCK_NUMBER" >> "$REPORT_FILE" else log_error "RPC is not accessible at $RPC_URL" echo "- **RPC Status**: ❌ Not accessible" >> "$REPORT_FILE" fi else log_warning "cast command not found. Skipping RPC check." echo "- **RPC Status**: ⚠️ Cannot check (cast not installed)" >> "$REPORT_FILE" fi echo "" >> "$REPORT_FILE" # 2. Check API Endpoints echo -e "${BLUE}2. Checking API Endpoints...${NC}" echo "## 2. API Endpoints" >> "$REPORT_FILE" echo "" >> "$REPORT_FILE" # Check /api/v2/stats echo "### /api/v2/stats" >> "$REPORT_FILE" if curl -s -f -o /dev/null -w "%{http_code}" "$API_BASE/v2/stats" | grep -q "200"; then STATS_RESPONSE=$(curl -s "$API_BASE/v2/stats") log_success "Stats endpoint is accessible" echo "- **Status**: ✅ Accessible" >> "$REPORT_FILE" echo "- **Response**: \`\`\`json" >> "$REPORT_FILE" echo "$STATS_RESPONSE" | jq '.' 2>/dev/null || echo "$STATS_RESPONSE" >> "$REPORT_FILE" echo "\`\`\`" >> "$REPORT_FILE" else HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$API_BASE/v2/stats" || echo "000") log_error "Stats endpoint returned HTTP $HTTP_CODE" echo "- **Status**: ❌ HTTP $HTTP_CODE" >> "$REPORT_FILE" fi echo "" >> "$REPORT_FILE" # Check /api/v1/blocks echo "### /api/v1/blocks" >> "$REPORT_FILE" if curl -s -f -o /dev/null -w "%{http_code}" "$API_BASE/v1/blocks?page=1&page_size=1" | grep -q "200"; then log_success "Blocks endpoint is accessible" echo "- **Status**: ✅ Accessible" >> "$REPORT_FILE" else HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$API_BASE/v1/blocks?page=1&page_size=1" || echo "000") log_error "Blocks endpoint returned HTTP $HTTP_CODE" echo "- **Status**: ❌ HTTP $HTTP_CODE" >> "$REPORT_FILE" fi echo "" >> "$REPORT_FILE" # Check /api/v1/transactions echo "### /api/v1/transactions" >> "$REPORT_FILE" if curl -s -f -o /dev/null -w "%{http_code}" "$API_BASE/v1/transactions?page=1&page_size=1" | grep -q "200"; then log_success "Transactions endpoint is accessible" echo "- **Status**: ✅ Accessible" >> "$REPORT_FILE" else HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$API_BASE/v1/transactions?page=1&page_size=1" || echo "000") log_error "Transactions endpoint returned HTTP $HTTP_CODE" echo "- **Status**: ❌ HTTP $HTTP_CODE" >> "$REPORT_FILE" fi echo "" >> "$REPORT_FILE" # Check Etherscan-compatible API echo "### /api?module=block&action=eth_block_number" >> "$REPORT_FILE" if curl -s -f -o /dev/null -w "%{http_code}" "$API_BASE?module=block&action=eth_block_number" | grep -q "200"; then ETHERSCAN_RESPONSE=$(curl -s "$API_BASE?module=block&action=eth_block_number") log_success "Etherscan-compatible API is accessible" echo "- **Status**: ✅ Accessible" >> "$REPORT_FILE" echo "- **Response**: \`\`\`json" >> "$REPORT_FILE" echo "$ETHERSCAN_RESPONSE" | jq '.' 2>/dev/null || echo "$ETHERSCAN_RESPONSE" >> "$REPORT_FILE" echo "\`\`\`" >> "$REPORT_FILE" else HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$API_BASE?module=block&action=eth_block_number" || echo "000") log_error "Etherscan-compatible API returned HTTP $HTTP_CODE" echo "- **Status**: ❌ HTTP $HTTP_CODE" >> "$REPORT_FILE" fi echo "" >> "$REPORT_FILE" # 3. Check Blockscout API echo -e "${BLUE}3. Checking Blockscout API...${NC}" echo "## 3. Blockscout API (ChainID 138)" >> "$REPORT_FILE" echo "" >> "$REPORT_FILE" # Check Blockscout blocks endpoint echo "### Blockscout /api/v2/blocks" >> "$REPORT_FILE" if curl -s -f -o /dev/null -w "%{http_code}" "$BLOCKSCOUT_API/v2/blocks?page=1&page_size=1" | grep -q "200"; then BLOCKSCOUT_BLOCKS=$(curl -s "$BLOCKSCOUT_API/v2/blocks?page=1&page_size=1") log_success "Blockscout blocks endpoint is accessible" echo "- **Status**: ✅ Accessible" >> "$REPORT_FILE" echo "- **Response Sample**: \`\`\`json" >> "$REPORT_FILE" echo "$BLOCKSCOUT_BLOCKS" | jq '.items[0] // .' 2>/dev/null | head -20 >> "$REPORT_FILE" || echo "$BLOCKSCOUT_BLOCKS" | head -20 >> "$REPORT_FILE" echo "\`\`\`" >> "$REPORT_FILE" else HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$BLOCKSCOUT_API/v2/blocks?page=1&page_size=1" || echo "000") log_error "Blockscout blocks endpoint returned HTTP $HTTP_CODE" echo "- **Status**: ❌ HTTP $HTTP_CODE" >> "$REPORT_FILE" fi echo "" >> "$REPORT_FILE" # Check Blockscout transactions endpoint echo "### Blockscout /api/v2/transactions" >> "$REPORT_FILE" if curl -s -f -o /dev/null -w "%{http_code}" "$BLOCKSCOUT_API/v2/transactions?page=1&page_size=1" | grep -q "200"; then BLOCKSCOUT_TXS=$(curl -s "$BLOCKSCOUT_API/v2/transactions?page=1&page_size=1") log_success "Blockscout transactions endpoint is accessible" echo "- **Status**: ✅ Accessible" >> "$REPORT_FILE" echo "- **Response Sample**: \`\`\`json" >> "$REPORT_FILE" echo "$BLOCKSCOUT_TXS" | jq '.items[0] // .' 2>/dev/null | head -20 >> "$REPORT_FILE" || echo "$BLOCKSCOUT_TXS" | head -20 >> "$REPORT_FILE" echo "\`\`\`" >> "$REPORT_FILE" else HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$BLOCKSCOUT_API/v2/transactions?page=1&page_size=1" || echo "000") log_error "Blockscout transactions endpoint returned HTTP $HTTP_CODE" echo "- **Status**: ❌ HTTP $HTTP_CODE" >> "$REPORT_FILE" fi echo "" >> "$REPORT_FILE" # 4. Check Database Connectivity echo -e "${BLUE}4. Checking Database Connectivity...${NC}" echo "## 4. Database Connectivity" >> "$REPORT_FILE" echo "" >> "$REPORT_FILE" # Check if backend is running (indirect database check) if pgrep -f "backend/api/rest/main" > /dev/null; then log_success "Backend API server is running" echo "- **Backend Status**: ✅ Running" >> "$REPORT_FILE" else log_warning "Backend API server is not running" echo "- **Backend Status**: ⚠️ Not running" >> "$REPORT_FILE" echo "- **Note**: Cannot check database directly without backend running" >> "$REPORT_FILE" fi echo "" >> "$REPORT_FILE" # 5. Check Frontend Files echo -e "${BLUE}5. Checking Frontend Files...${NC}" echo "## 5. Frontend Files" >> "$REPORT_FILE" echo "" >> "$REPORT_FILE" FRONTEND_FILE="frontend/public/index.html" if [ -f "$FRONTEND_FILE" ]; then log_success "Frontend index.html exists" echo "- **Status**: ✅ File exists" >> "$REPORT_FILE" # Check for ethers library if grep -q "ethers" "$FRONTEND_FILE"; then log_success "Ethers library reference found" echo "- **Ethers Library**: ✅ Referenced" >> "$REPORT_FILE" else log_error "Ethers library reference not found" echo "- **Ethers Library**: ❌ Not found" >> "$REPORT_FILE" fi # Check for Blockscout API if grep -q "BLOCKSCOUT_API" "$FRONTEND_FILE"; then log_success "Blockscout API configuration found" echo "- **Blockscout API Config**: ✅ Found" >> "$REPORT_FILE" else log_warning "Blockscout API configuration not found" echo "- **Blockscout API Config**: ⚠️ Not found" >> "$REPORT_FILE" fi # Check for CHAIN_ID if grep -q "CHAIN_ID.*138" "$FRONTEND_FILE"; then log_success "ChainID 138 configuration found" echo "- **ChainID Config**: ✅ Found" >> "$REPORT_FILE" else log_warning "ChainID 138 configuration not found" echo "- **ChainID Config**: ⚠️ Not found" >> "$REPORT_FILE" fi else log_error "Frontend index.html not found at $FRONTEND_FILE" echo "- **Status**: ❌ File not found" >> "$REPORT_FILE" fi echo "" >> "$REPORT_FILE" # 6. Check Browser Console Errors (simulated) echo -e "${BLUE}6. Checking for Common Frontend Issues...${NC}" echo "## 6. Frontend Issues" >> "$REPORT_FILE" echo "" >> "$REPORT_FILE" if [ -f "$FRONTEND_FILE" ]; then # Check for console.error patterns ERROR_COUNT=$(grep -c "console.error" "$FRONTEND_FILE" || echo "0") log_info "Found $ERROR_COUNT console.error calls in frontend" echo "- **Error Handlers**: $ERROR_COUNT found" >> "$REPORT_FILE" # Check for try-catch blocks TRY_COUNT=$(grep -c "try {" "$FRONTEND_FILE" || echo "0") log_info "Found $TRY_COUNT try-catch blocks in frontend" echo "- **Error Handling**: $TRY_COUNT try-catch blocks" >> "$REPORT_FILE" # Check for API_BASE usage if grep -q "API_BASE" "$FRONTEND_FILE"; then API_BASE_VALUE=$(grep "const API_BASE" "$FRONTEND_FILE" | head -1 | sed 's/.*= *\([^;]*\).*/\1/' | tr -d "'\"") log_info "API_BASE configured as: $API_BASE_VALUE" echo "- **API_BASE**: $API_BASE_VALUE" >> "$REPORT_FILE" fi fi echo "" >> "$REPORT_FILE" # 7. Check Backend Logs (if available) echo -e "${BLUE}7. Checking Backend Logs...${NC}" echo "## 7. Backend Logs" >> "$REPORT_FILE" echo "" >> "$REPORT_FILE" # Check systemd logs if backend is a service if systemctl list-units --type=service | grep -q "explorer\|blockscout\|api"; then log_info "Checking systemd service logs..." echo "### Systemd Service Logs" >> "$REPORT_FILE" systemctl list-units --type=service | grep -E "explorer|blockscout|api" | while read -r service; do SERVICE_NAME=$(echo "$service" | awk '{print $1}') if systemctl is-active --quiet "$SERVICE_NAME"; then log_success "Service $SERVICE_NAME is active" echo "- **$SERVICE_NAME**: ✅ Active" >> "$REPORT_FILE" # Get recent errors RECENT_ERRORS=$(journalctl -u "$SERVICE_NAME" --since "10 minutes ago" --no-pager | grep -i "error\|fail\|panic" | tail -5 || echo "No recent errors") if [ "$RECENT_ERRORS" != "No recent errors" ]; then log_warning "Recent errors found in $SERVICE_NAME" echo " - Recent Errors:" >> "$REPORT_FILE" echo "\`\`\`" >> "$REPORT_FILE" echo "$RECENT_ERRORS" >> "$REPORT_FILE" echo "\`\`\`" >> "$REPORT_FILE" fi else log_warning "Service $SERVICE_NAME is not active" echo "- **$SERVICE_NAME**: ⚠️ Not active" >> "$REPORT_FILE" fi done else log_info "No systemd services found for explorer" echo "- **Status**: No systemd services found" >> "$REPORT_FILE" fi echo "" >> "$REPORT_FILE" # 8. Network Connectivity Tests echo -e "${BLUE}8. Testing Network Connectivity...${NC}" echo "## 8. Network Connectivity" >> "$REPORT_FILE" echo "" >> "$REPORT_FILE" # Test DNS resolution if host explorer.d-bis.org &> /dev/null; then DNS_IP=$(host explorer.d-bis.org | grep "has address" | awk '{print $4}' | head -1) log_success "DNS resolution works. explorer.d-bis.org -> $DNS_IP" echo "- **DNS**: ✅ Resolves to $DNS_IP" >> "$REPORT_FILE" else log_error "DNS resolution failed for explorer.d-bis.org" echo "- **DNS**: ❌ Failed" >> "$REPORT_FILE" fi # Test HTTPS connectivity if curl -s -f -o /dev/null --max-time 5 "https://explorer.d-bis.org" &> /dev/null; then log_success "HTTPS connectivity to explorer.d-bis.org works" echo "- **HTTPS**: ✅ Accessible" >> "$REPORT_FILE" else log_error "HTTPS connectivity to explorer.d-bis.org failed" echo "- **HTTPS**: ❌ Failed" >> "$REPORT_FILE" fi echo "" >> "$REPORT_FILE" # 9. Summary echo -e "${BLUE}9. Generating Summary...${NC}" echo "## 9. Summary" >> "$REPORT_FILE" echo "" >> "$REPORT_FILE" echo "### Issues Found" >> "$REPORT_FILE" echo "" >> "$REPORT_FILE" # Count errors and warnings from the report ERROR_COUNT=$(grep -c "❌\|❌" "$REPORT_FILE" || echo "0") WARNING_COUNT=$(grep -c "⚠️\|⚠️" "$REPORT_FILE" || echo "0") echo "- **Total Errors**: $ERROR_COUNT" >> "$REPORT_FILE" echo "- **Total Warnings**: $WARNING_COUNT" >> "$REPORT_FILE" echo "" >> "$REPORT_FILE" echo "### Recommendations" >> "$REPORT_FILE" echo "" >> "$REPORT_FILE" if [ "$ERROR_COUNT" -gt 0 ]; then echo "1. Review error sections above" >> "$REPORT_FILE" echo "2. Check backend server logs" >> "$REPORT_FILE" echo "3. Verify network connectivity" >> "$REPORT_FILE" echo "4. Check database connection" >> "$REPORT_FILE" else echo "✅ No critical errors found!" >> "$REPORT_FILE" fi echo "" >> "$REPORT_FILE" echo "---" >> "$REPORT_FILE" echo "**Report Generated**: $(date)" >> "$REPORT_FILE" # Display summary echo "" echo -e "${BLUE}========================================${NC}" echo -e "${BLUE}Summary${NC}" echo -e "${BLUE}========================================${NC}" echo -e "Errors: ${RED}$ERROR_COUNT${NC}" echo -e "Warnings: ${YELLOW}$WARNING_COUNT${NC}" echo -e "Report saved to: ${GREEN}$REPORT_FILE${NC}" echo "" # Open report if on a system with a default text editor if command -v xdg-open &> /dev/null; then echo "Opening report..." xdg-open "$REPORT_FILE" 2>/dev/null || true elif command -v open &> /dev/null; then echo "Opening report..." open "$REPORT_FILE" 2>/dev/null || true fi