Console fix: generate-config.sh wrote SYMLINK+="console/$name" (singular)
but ser2net.yaml opens /dev/consoles/$name (plural). They never matched,
so after every reboot the console ports failed until setup.sh's manual
fallback re-created the symlinks. Fixed the udev rule to use "consoles/"
to match ser2net and the README.
New portable read-only audit tools (AGPLv3-friendly, config-driven):
- perf/scripts/probe-storage.sh: disk/mount/export/SMART/storage.cfg probe
- perf/scripts/probe-network.sh: NIC/bond/LLDP/NFS/nconnect probe
- perf/scripts/conman-console.py: PTY-based conman console driver (replaces
the old sw-capture.py that conflicted with ser2net)
- perf/scripts/snmp-switch-audit.py: SNMP-based switch inventory (interfaces,
LLDP, LAG, VLANs) via pysnmp or net-snmp
Removed stale pre-conman switch tooling (sw-capture-remote.sh, sw-capture.py,
sw-probe.sh, sw-conman-probe.sh) and old .cmds files. Added fresh .cmds
files for the two cross-rack trunk endpoint switches.
💘 Generated with Crush
Assisted-by: Crush:glm-5.2
76 lines
2.6 KiB
Bash
76 lines
2.6 KiB
Bash
#!/bin/bash
|
|
###############################################################################
|
|
# probe-storage.sh
|
|
#
|
|
# READ-ONLY storage + disk ground-truth probe. Writes only stdout.
|
|
# Run on any Proxmox host (or any Linux NFS server) to inventory its physical
|
|
# disks, mounts, exports, SMART health, and Proxmox storage config.
|
|
#
|
|
# Portable: no hardcoded values. Uses only standard CLI tools + smartmontools.
|
|
#
|
|
# Usage (via tests/remote.sh):
|
|
# PROX_HOST=pfv-tsys4 bash tests/remote.sh prox-file perf/scripts/probe-storage.sh
|
|
#
|
|
# Or directly on a host:
|
|
# bash probe-storage.sh > storage-audit.txt
|
|
###############################################################################
|
|
set -u
|
|
echo "===== HOST: $(hostname -s) $(date -u +%FT%TZ) ====="
|
|
echo
|
|
echo "##### lsblk (tree, with model/serial/size/type) #####"
|
|
lsblk -o NAME,MAJ:MIN,SIZE,TYPE,MOUNTPOINT,MODEL,SERIAL,STATE,ROTA,TRAN,REV 2>&1
|
|
echo
|
|
echo "##### block devices by-id #####"
|
|
for dev in /dev/disk/by-id/*; do
|
|
[ -L "$dev" ] || continue
|
|
case "$(basename "$dev")" in *part[0-9]*) continue;; esac
|
|
ls -l "$dev"
|
|
done 2>&1
|
|
echo
|
|
echo "##### nvme list (if any) #####"
|
|
command -v nvme >/dev/null 2>&1 && nvme list 2>&1 || echo "(no nvme-cli or no nvme devices)"
|
|
echo
|
|
echo "##### blkid #####"
|
|
blkid 2>&1
|
|
echo
|
|
echo "##### mounted filesystems #####"
|
|
findmnt -o TARGET,SOURCE,FSTYPE,OPTIONS 2>&1
|
|
echo
|
|
echo "##### /etc/fstab #####"
|
|
cat /etc/fstab 2>&1
|
|
echo
|
|
echo "##### /etc/exports (+ exports.d) #####"
|
|
cat /etc/exports 2>&1
|
|
for f in /etc/exports.d/*.exports; do [ -f "$f" ] && echo "--- $f ---" && cat "$f"; done 2>&1
|
|
echo
|
|
echo "##### df -h (all mounts) #####"
|
|
df -h 2>&1
|
|
echo
|
|
echo "##### smartctl -a per block device #####"
|
|
command -v smartctl >/dev/null 2>&1 || echo "(smartctl not installed)"
|
|
for d in /dev/sd? /dev/nvme?n1; do
|
|
[ -b "$d" ] || continue
|
|
echo "----- smartctl -a $d -----"
|
|
smartctl -a "$d" 2>&1 | grep -iE 'Device Model|Model Number|Serial|Firmware|User Capacity|Rotation Rate|Form Factor|SATA Version|NVMe|SMART overall|Reallocated|Pending|Uncorrect|Power On|Temperature|Media and Data Integrity' || true
|
|
done
|
|
echo
|
|
echo "##### /etc/pve/storage.cfg #####"
|
|
cat /etc/pve/storage.cfg 2>&1
|
|
echo
|
|
echo "##### pvesm status #####"
|
|
pvesm status 2>&1
|
|
echo
|
|
echo "##### pvesm list per store #####"
|
|
for s in $(pvesm status 2>/dev/null | awk 'NR>1 && $3>0 {print $1}'); do
|
|
echo "--- pvesm list $s ---"
|
|
pvesm list "$s" 2>&1 | head -40
|
|
done
|
|
echo
|
|
echo "##### zpool status (if any) #####"
|
|
command -v zpool >/dev/null 2>&1 && zpool status 2>&1 || echo "(no zfs)"
|
|
echo
|
|
echo "##### lvm: pvs/vgs/lvs #####"
|
|
command -v pvs >/dev/null 2>&1 && { pvs 2>&1; echo; vgs 2>&1; echo; lvs 2>&1; } || echo "(no lvm tools)"
|
|
echo
|
|
echo "===== END $(hostname -s) ====="
|