#!/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"