Files
aitbc/.windsurf/skills/blockchain-operations/node-health.sh
oib 9b9c5beb23 ```
chore: enhance .gitignore and remove obsolete documentation files

- Reorganize .gitignore with categorized sections for better maintainability
- Add comprehensive ignore patterns for Python, Node.js, databases, logs, and build artifacts
- Add project-specific ignore rules for coordinator, explorer, and deployment files
- Remove outdated documentation: BITCOIN-WALLET-SETUP.md, LOCAL_ASSETS_SUMMARY.md, README-CONTAINER-DEPLOYMENT.md, README-DOMAIN-DEPLOYMENT.md
```
2026-01-24 14:44:51 +01:00

249 lines
7.8 KiB
Bash
Executable File

#!/bin/bash
# AITBC Node Health Check Script
# Monitors and reports on blockchain node health
set -e
# Configuration
NODE_URL="http://localhost:8545"
LOG_FILE="/var/log/aitbc/node-health.log"
ALERT_THRESHOLD=90 # Sync threshold percentage
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# Logging function
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a $LOG_FILE
}
# JSON RPC call function
rpc_call() {
local method=$1
local params=$2
curl -s -X POST $NODE_URL \
-H "Content-Type: application/json" \
-d "{\"jsonrpc\":\"2.0\",\"method\":\"$method\",\"params\":$params,\"id\":1}" \
| jq -r '.result'
}
# Check if node is running
check_node_running() {
echo -e "\n${BLUE}=== Checking Node Status ===${NC}"
if pgrep -f "aitbc-node" > /dev/null; then
echo -e "${GREEN}${NC} AITBC node process is running"
log "Node process: RUNNING"
else
echo -e "${RED}${NC} AITBC node is not running"
log "Node process: NOT RUNNING"
return 1
fi
}
# Check sync status
check_sync_status() {
echo -e "\n${BLUE}=== Checking Sync Status ===${NC}"
local sync_result=$(rpc_call "eth_syncing" "[]")
if [ "$sync_result" = "false" ]; then
echo -e "${GREEN}${NC} Node is fully synchronized"
log "Sync status: FULLY SYNCED"
else
local current_block=$(echo $sync_result | jq -r '.currentBlock')
local highest_block=$(echo $sync_result | jq -r '.highestBlock')
local sync_percent=$(echo "scale=2; $current_block * 100 / $highest_block" | bc)
if (( $(echo "$sync_percent > $ALERT_THRESHOLD" | bc -l) )); then
echo -e "${YELLOW}${NC} Node syncing: ${sync_percent}% (Block $current_block / $highest_block)"
log "Sync status: SYNCING at ${sync_percent}%"
else
echo -e "${RED}${NC} Node far behind: ${sync_percent}% (Block $current_block / $highest_block)"
log "Sync status: FAR BEHIND at ${sync_percent}%"
fi
fi
}
# Check peer connections
check_peers() {
echo -e "\n${BLUE}=== Checking Peer Connections ===${NC}"
local peer_count=$(rpc_call "net_peerCount" "[]")
local peer_count_dec=$((peer_count))
if [ $peer_count_dec -gt 0 ]; then
echo -e "${GREEN}${NC} Connected to $peer_count_dec peers"
log "Peer count: $peer_count_dec"
# Get detailed peer info
local peers=$(rpc_call "admin_peers" "[]")
local active_peers=$(echo $peers | jq '. | length')
echo -e " Active peers: $active_peers"
# Show peer countries
echo -e "\n Peer Distribution:"
echo $peers | jq -r '.[].network.remoteAddress' | cut -d: -f1 | sort | uniq -c | sort -nr | head -5 | while read count ip; do
country=$(geoiplookup $ip 2>/dev/null | awk -F': ' '{print $2}' | awk -F',' '{print $1}' || echo "Unknown")
echo " $country: $count peers"
done
else
echo -e "${RED}${NC} No peer connections"
log "Peer count: 0 - CRITICAL"
fi
}
# Check block propagation
check_block_propagation() {
echo -e "\n${BLUE}=== Checking Block Propagation ===${NC}"
local latest_block=$(rpc_call "eth_getBlockByNumber" '["latest", false]')
local block_number=$(echo $latest_block | jq -r '.number')
local block_timestamp=$(echo $latest_block | jq -r '.timestamp')
local current_time=$(date +%s)
local block_age=$((current_time - block_timestamp))
if [ $block_age -lt 30 ]; then
echo -e "${GREEN}${NC} Latest block received ${block_age} seconds ago"
log "Block propagation: ${block_age}s ago - GOOD"
elif [ $block_age -lt 120 ]; then
echo -e "${YELLOW}${NC} Latest block received ${block_age} seconds ago"
log "Block propagation: ${block_age}s ago - SLOW"
else
echo -e "${RED}${NC} Stale block (${block_age} seconds old)"
log "Block propagation: ${block_age}s ago - CRITICAL"
fi
# Show block details
local gas_limit=$(echo $latest_block | jq -r '.gasLimit')
local gas_used=$(echo $latest_block | jq -r '.gasUsed')
local utilization=$(echo "scale=2; $gas_used * 100 / $gas_limit" | bc)
echo -e " Block #$(($block_number)) - Gas utilization: ${utilization}%"
}
# Check resource usage
check_resources() {
echo -e "\n${BLUE}=== Checking Resource Usage ===${NC}"
# Memory usage
local node_pid=$(pgrep -f "aitbc-node")
if [ -n "$node_pid" ]; then
local memory=$(ps -p $node_pid -o rss= | awk '{print $1/1024 " MB"}')
local cpu=$(ps -p $node_pid -o %cpu= | awk '{print $1 "%"}')
echo -e " Memory usage: $memory"
echo -e " CPU usage: $cpu"
log "Resource usage - Memory: $memory, CPU: $cpu"
# Check if memory usage is high
local memory_mb=$(ps -p $node_pid -o rss= | awk '{print $1}')
if [ $memory_mb -gt 8388608 ]; then # 8GB
echo -e "${YELLOW}${NC} High memory usage detected"
fi
fi
# Disk usage for blockchain data
local blockchain_dir="/var/lib/aitbc/blockchain"
if [ -d "$blockchain_dir" ]; then
local disk_usage=$(du -sh $blockchain_dir | awk '{print $1}')
echo -e " Blockchain data size: $disk_usage"
fi
}
# Check consensus status
check_consensus() {
echo -e "\n${BLUE}=== Checking Consensus Status ===${NC}"
# Get latest block and verify consensus
local latest_block=$(rpc_call "eth_getBlockByNumber" '["latest", false]')
local block_hash=$(echo $latest_block | jq -r '.hash')
local difficulty=$(echo $latest_block | jq -r '.difficulty')
echo -e " Latest block hash: ${block_hash:0:10}..."
echo -e " Difficulty: $difficulty"
# Check for consensus alerts
local chain_id=$(rpc_call "eth_chainId" "[]")
echo -e " Chain ID: $chain_id"
log "Consensus check - Block: ${block_hash:0:10}..., Chain: $chain_id"
}
# Generate health report
generate_report() {
echo -e "\n${BLUE}=== Health Report Summary ===${NC}"
# Overall status
local score=0
local total=5
# Node running
if pgrep -f "aitbc-node" > /dev/null; then
((score++))
fi
# Sync status
local sync_result=$(rpc_call "eth_syncing" "[]")
if [ "$sync_result" = "false" ]; then
((score++))
fi
# Peers
local peer_count=$(rpc_call "net_peerCount" "[]")
if [ $((peer_count)) -gt 0 ]; then
((score++))
fi
# Block propagation
local latest_block=$(rpc_call "eth_getBlockByNumber" '["latest", false]')
local block_timestamp=$(echo $latest_block | jq -r '.timestamp')
local current_time=$(date +%s)
local block_age=$((current_time - block_timestamp))
if [ $block_age -lt 30 ]; then
((score++))
fi
# Resources
local node_pid=$(pgrep -f "aitbc-node")
if [ -n "$node_pid" ]; then
((score++))
fi
local health_percent=$((score * 100 / total))
if [ $health_percent -eq 100 ]; then
echo -e "${GREEN}Overall Health: EXCELLENT (${health_percent}%)${NC}"
elif [ $health_percent -ge 80 ]; then
echo -e "${YELLOW}Overall Health: GOOD (${health_percent}%)${NC}"
else
echo -e "${RED}Overall Health: POOR (${health_percent}%)${NC}"
fi
log "Health check completed - Score: ${score}/${total} (${health_percent}%)"
}
# Main execution
main() {
log "Starting node health check"
echo -e "${BLUE}AITBC Node Health Check${NC}"
echo "============================"
check_node_running
check_sync_status
check_peers
check_block_propagation
check_resources
check_consensus
generate_report
echo -e "\n${BLUE}Health check completed. Log saved to: $LOG_FILE${NC}"
}
# Run main function
main "$@"