#!/usr/bin/env bash # Check explorer indexer lag; if above threshold, run fix-explorer-indexer-lag.sh (restart Blockscout). # For use from cron. Run from project root. Requires LAN/SSH to r630-02 for the fix. # Usage: bash scripts/maintenance/check-and-fix-explorer-lag.sh # Env: EXPLORER_INDEXER_LAG_THRESHOLD (default 500) set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" source "${PROJECT_ROOT}/config/ip-addresses.conf" 2>/dev/null || true IP_RPC_2201="${RPC_2201:-192.168.11.221}" IP_BLOCKSCOUT="${IP_BLOCKSCOUT:-192.168.11.140}" BLOCKSCOUT_API_PORT="${BLOCKSCOUT_API_PORT:-4000}" EXPLORER_INDEXER_LAG_THRESHOLD="${EXPLORER_INDEXER_LAG_THRESHOLD:-500}" get_rpc_block() { local hex hex=$(curl -sf --max-time 10 -X POST -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ "http://${IP_RPC_2201}:8545" 2>/dev/null | sed -n 's/.*"result":"\(0x[0-9a-fA-F]*\)".*/\1/p') [ -n "$hex" ] && echo $((hex)) || true } get_explorer_block() { local body block body=$(curl -sf --max-time 10 "http://${IP_BLOCKSCOUT}:${BLOCKSCOUT_API_PORT}/api/v2/stats" 2>/dev/null || true) [ -z "$body" ] && return block=$(echo "$body" | sed -n 's/.*"total_blocks"\s*:\s*"\([0-9]*\)".*/\1/p' | head -1) [ -z "$block" ] && block=$(echo "$body" | sed -n 's/.*"total_blocks"\s*:\s*\([0-9]*\).*/\1/p' | head -1) [ -n "$block" ] && echo "$block" } rpc_block=$(get_rpc_block) explorer_block=$(get_explorer_block) if [ -z "$rpc_block" ] || [ -z "$explorer_block" ]; then echo "$(date -Iseconds) SKIP (RPC or Blockscout unreachable)" exit 0 fi lag=$((rpc_block - explorer_block)) if [ "$lag" -le "${EXPLORER_INDEXER_LAG_THRESHOLD}" ] 2>/dev/null; then echo "$(date -Iseconds) OK lag=$lag (threshold=${EXPLORER_INDEXER_LAG_THRESHOLD})" exit 0 fi echo "$(date -Iseconds) LAG $lag > ${EXPLORER_INDEXER_LAG_THRESHOLD} — running fix" bash "$PROJECT_ROOT/scripts/fix-explorer-indexer-lag.sh" 2>&1 || true