Files
proxmox/scripts/generate-comprehensive-report.sh

171 lines
7.1 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
# Generate comprehensive Proxmox inventory report
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
PROXMOX_HOST_ML110="${PROXMOX_HOST_ML110:-192.168.11.10}"
PROXMOX_HOST_R630_01="${PROXMOX_HOST_R630_01:-192.168.11.11}"
PROXMOX_HOST_R630_02="${PROXMOX_HOST_R630_02:-192.168.11.12}"
SSH_OPTS="-o StrictHostKeyChecking=no -o ConnectTimeout=5"
OUTPUT_FILE="${PROJECT_ROOT}/reports/comprehensive-proxmox-inventory-$(date +%Y%m%d_%H%M%S).md"
mkdir -p "$(dirname "$OUTPUT_FILE")"
{
echo "# Comprehensive Proxmox Inventory Report"
echo ""
echo "**Generated:** $(date)"
echo ""
echo "---"
echo ""
echo "## Proxmox Hosts"
echo ""
echo "| Hostname | IP Address | Status |"
echo "|----------|------------|--------|"
for host_info in "ml110:$PROXMOX_HOST_ML110" "r630-01:$PROXMOX_HOST_R630_01" "r630-02:$PROXMOX_HOST_R630_02"; do
IFS=: read -r hostname host_ip <<< "$host_info"
if ping -c 1 -W 2 "$host_ip" >/dev/null 2>&1; then
status="✅ Online"
else
status="❌ Offline"
fi
echo "| $hostname | $host_ip | $status |"
done
echo ""
echo "---"
echo ""
echo "## All VMIDs - Complete Inventory"
echo ""
echo "| VMID | Type | Name | Host | IP Address | FQDN | Status | Ports |"
echo "|------|------|------|------|------------|------|--------|-------|"
# Process each host
for host_info in "ml110:$PROXMOX_HOST_ML110" "r630-01:$PROXMOX_HOST_R630_01" "r630-02:$PROXMOX_HOST_R630_02"; do
IFS=: read -r hostname host_ip <<< "$host_info"
# Get all containers
containers=$(ssh $SSH_OPTS root@"$host_ip" "pct list 2>/dev/null | tail -n +2" 2>/dev/null || true)
while IFS= read -r line; do
[ -z "$line" ] && continue
vmid=$(echo "$line" | awk '{print $1}')
status=$(echo "$line" | awk '{print $2}')
name=$(echo "$line" | awk '{for(i=3;i<=NF;i++) printf "%s ", $i; print ""}' | sed 's/ $//')
# Get IP and hostname
ip=$(ssh $SSH_OPTS root@"$host_ip" "pct config $vmid 2>/dev/null | grep -oP 'ip=\K[^/]+' | head -1" 2>/dev/null || echo "N/A")
if [ "$ip" = "dhcp" ] || [ "$ip" = "auto" ] || [ -z "$ip" ]; then
if [ "$status" = "running" ]; then
ip=$(ssh $SSH_OPTS root@"$host_ip" "pct exec $vmid -- hostname -I 2>/dev/null | awk '{print \$1}'" 2>/dev/null || echo "N/A")
fi
fi
fqdn=$(ssh $SSH_OPTS root@"$host_ip" "pct config $vmid 2>/dev/null | grep '^hostname:' | cut -d: -f2 | tr -d ' '" 2>/dev/null || echo "N/A")
# Identify ports based on service name
ports="N/A"
if echo "$name" | grep -qi "rpc\|besu"; then
ports="8545,8546,30303,9545"
elif echo "$name" | grep -qi "postgres"; then
ports="5432"
elif echo "$name" | grep -qi "redis"; then
ports="6379"
elif echo "$name" | grep -qi "vault"; then
ports="8200"
elif echo "$name" | grep -qi "web3signer"; then
ports="9000"
elif echo "$name" | grep -qi "nginx\|npm"; then
ports="80,81,443"
elif echo "$name" | grep -qi "blockscout\|explorer"; then
ports="80,4000"
elif echo "$name" | grep -qi "api" && ! echo "$name" | grep -qi "3000"; then
ports="3000"
elif echo "$name" | grep -qi "frontend\|web"; then
ports="80"
fi
echo "| $vmid | LXC | $name | $hostname | $ip | $fqdn | $status | $ports |"
done <<< "$containers"
done
echo ""
echo "---"
echo ""
echo "## NPMplus Instances"
echo ""
npmplus_found=false
for host_info in "ml110:$PROXMOX_HOST_ML110" "r630-01:$PROXMOX_HOST_R630_01" "r630-02:$PROXMOX_HOST_R630_02"; do
IFS=: read -r hostname host_ip <<< "$host_info"
containers=$(ssh $SSH_OPTS root@"$host_ip" "pct list 2>/dev/null | tail -n +2" 2>/dev/null || true)
while IFS= read -r line; do
[ -z "$line" ] && continue
vmid=$(echo "$line" | awk '{print $1}')
name=$(echo "$line" | awk '{for(i=3;i<=NF;i++) printf "%s ", $i; print ""}' | sed 's/ $//')
if echo "$name" | grep -qi "npmplus"; then
npmplus_found=true
status=$(echo "$line" | awk '{print $2}')
ip=$(ssh $SSH_OPTS root@"$host_ip" "pct config $vmid 2>/dev/null | grep -oP 'ip=\K[^/]+' | head -1" 2>/dev/null || echo "N/A")
fqdn=$(ssh $SSH_OPTS root@"$host_ip" "pct config $vmid 2>/dev/null | grep '^hostname:' | cut -d: -f2 | tr -d ' '" 2>/dev/null || echo "N/A")
echo "### VMID $vmid: $name"
echo ""
echo "- **Host:** $hostname ($host_ip)"
echo "- **IP Address:** $ip"
echo "- **FQDN:** $fqdn"
echo "- **Status:** $status"
echo "- **Ports:** 80, 81, 443"
echo ""
# Get NPMplus configuration if running
if [ "$status" = "running" ] && [ -f "$SCRIPT_DIR/get-npmplus-mappings.py" ]; then
echo "#### NPMplus Configuration"
echo ""
echo "Attempting to retrieve configuration..."
echo ""
# Note: This would require .env file with credentials
fi
fi
done <<< "$containers"
done
if [ "$npmplus_found" = false ]; then
echo "No NPMplus instances found in running containers."
echo ""
echo "**Note:** NPMplus may be running on VMID 10233. Checking..."
echo ""
# Check specifically for 10233
for host_info in "ml110:$PROXMOX_HOST_ML110" "r630-01:$PROXMOX_HOST_R630_01" "r630-02:$PROXMOX_HOST_R630_02"; do
IFS=: read -r hostname host_ip <<< "$host_info"
if ssh $SSH_OPTS root@"$host_ip" "pct list | grep -q '^10233'" 2>/dev/null; then
echo "✅ Found VMID 10233 on $hostname"
info=$(ssh $SSH_OPTS root@"$host_ip" "pct list | grep '^10233'" 2>/dev/null)
echo " $info"
fi
done
fi
echo ""
echo "---"
echo ""
echo "## Summary"
echo ""
echo "- **Total Proxmox Hosts:** 3"
echo "- **Total VMIDs:** $(ssh $SSH_OPTS root@"$PROXMOX_HOST_ML110" "pct list 2>/dev/null | tail -n +2 | wc -l" 2>/dev/null || echo 0) + $(ssh $SSH_OPTS root@"$PROXMOX_HOST_R630_01" "pct list 2>/dev/null | tail -n +2 | wc -l" 2>/dev/null || echo 0) + $(ssh $SSH_OPTS root@"$PROXMOX_HOST_R630_02" "pct list 2>/dev/null | tail -n +2 | wc -l" 2>/dev/null || echo 0)"
echo ""
} > "$OUTPUT_FILE"
echo "Report generated: $OUTPUT_FILE"
cat "$OUTPUT_FILE"