83 lines
2.7 KiB
Bash
83 lines
2.7 KiB
Bash
#!/bin/bash
|
|
###############################################################################
|
|
# probe-network.sh
|
|
#
|
|
# READ-ONLY network + NFS ground-truth probe. Writes only stdout.
|
|
# Run on any Proxmox host to inventory its NICs, bonds, LLDP neighbors,
|
|
# NFS client mounts (including nconnect), ethtool link state, and error
|
|
# counters. No hardcoded values — fully portable.
|
|
#
|
|
# Usage (via tests/remote.sh):
|
|
# PROX_HOST=pfv-tsys6 bash tests/remote.sh prox-file perf/scripts/probe-network.sh
|
|
###############################################################################
|
|
set -u
|
|
echo "===== HOST: $(hostname -s) $(date -u +%FT%TZ) ====="
|
|
echo
|
|
echo "##### ip -br link #####"
|
|
ip -br link 2>&1
|
|
echo
|
|
echo "##### ip -br addr #####"
|
|
ip -br addr 2>&1
|
|
echo
|
|
echo "##### /etc/network/interfaces #####"
|
|
cat /etc/network/interfaces 2>&1
|
|
echo
|
|
echo "##### bond0 state (if present) #####"
|
|
if [ -r /proc/net/bonding/bond0 ]; then
|
|
cat /proc/net/bonding/bond0 2>&1
|
|
else
|
|
echo "(no bond0)"
|
|
fi
|
|
echo
|
|
echo "##### ethtool per physical NIC #####"
|
|
for nic in /sys/class/net/*; do
|
|
nic=$(basename "$nic")
|
|
case "$nic" in lo|bond*|br*|venet*|veth*|docker*|tap*|vnet*|fw*) continue;; esac
|
|
echo "--- ethtool $nic ---"
|
|
ethtool "$nic" 2>&1 | grep -iE 'Speed|Duplex|Port|Link|Supported link modes|Advertising|Auto-neg|Settings' || echo "(ethtool failed for $nic)"
|
|
done
|
|
echo
|
|
echo "##### lldpcli (if installed) #####"
|
|
if command -v lldpcli >/dev/null 2>&1; then
|
|
echo "--- lldpcli show neighbors ---"
|
|
lldpcli show neighbors 2>&1
|
|
echo
|
|
echo "--- lldpcli show interfaces ---"
|
|
lldpcli show interfaces 2>&1
|
|
echo
|
|
echo "--- lldpcli show chassis ---"
|
|
lldpcli show chassis 2>&1
|
|
else
|
|
echo "(lldpcli not installed)"
|
|
fi
|
|
echo
|
|
echo "##### lldpd / lldpad service #####"
|
|
systemctl is-active lldpd 2>&1 || true
|
|
systemctl is-enabled lldpd 2>&1 || true
|
|
echo
|
|
echo "##### NFS mounts (mount | grep nfs) #####"
|
|
mount | grep -i nfs 2>&1 || echo "(no nfs mounts)"
|
|
echo
|
|
echo "##### mount nconnect detail (nfsstat -m) #####"
|
|
nfsstat -m 2>&1
|
|
echo
|
|
echo "##### storage.cfg NFS stanzas (options) #####"
|
|
grep -A3 '^nfs:' /etc/pve/storage.cfg 2>&1
|
|
echo
|
|
echo "##### ip route #####"
|
|
ip route 2>&1
|
|
echo
|
|
echo "##### ethtool -S bond slaves (key counters) #####"
|
|
if [ -r /proc/net/bonding/bond0 ]; then
|
|
# shellcheck disable=SC2013 # intentional: extract NIC names from bonding info
|
|
for nic in $(grep -oE 'eth[0-9]+|en[psx][a-z0-9]+' /proc/net/bonding/bond0 2>/dev/null | sort -u); do
|
|
echo "--- ethtool -S $nic (errors) ---"
|
|
ethtool -S "$nic" 2>/dev/null | grep -iE 'error|drop|discard|crc|pause|miss' || echo "(no error counters)"
|
|
done
|
|
fi
|
|
echo
|
|
echo "##### ip neigh (ARP table, reachable/stale) #####"
|
|
ip neigh show 2>&1 | grep -vE ' FAILED|INCOMPLETE' | sort -t. -k4 -n
|
|
echo
|
|
echo "===== END $(hostname -s) ====="
|