Files
linux-scripts/pve-netbox-diff.sh
2026-01-18 10:18:49 +01:00

59 lines
2.1 KiB
Bash

#! /bin/bash
#set -e
NETBOX_URL=""
NETBOX_AUTH_TOKEN=""
MAILTO=""
SUBJECT="PVE and NetBox mismatch"
curl -s -X GET "$NETBOX_URL/api/virtualization/virtual-machines/" \
-H "Authorization: Token $NETBOX_AUTH_TOKEN" \
-H 'Accept: application/json' | \
jq -r '
[
.results[] |
{
VMID: .custom_fields.VMID,
status: (.status.value |
gsub("active"; "running") |
gsub("offline"; "stopped")),
name: .name
}
] |
sort_by(.VMID) |
map([.VMID, .status, .name]) |
(["VMID", "Status", "Name"]) as $header |
$header, .[] |
@csv' | \
tr -d '"' > /tmp/netbox-status.csv
/usr/sbin/pct list | awk 'NR==1 {print "VMID,Status,Name"} NR>1 {print $1","$2","$3}' > /tmp/pve-status.csv
/usr/sbin/qm list | awk 'NR>1 {print $1","$3","$2}' OFS="," >> /tmp/pve-status.csv
diff -C 0 /tmp/pve-status.csv /tmp/netbox-status.csv > /tmp/diff_result.txt
EXIT_STATUS=$?
if [ $EXIT_STATUS -eq 1 ]; then
for host in $(diff -C 0 /tmp/pve-status.csv /tmp/netbox-status.csv | grep '^- ' | awk -F ',' '{sub(/^- /, ""); print $1; }'); do
if [[ ${host:0:1} -eq 1 ]]; then
echo "Resources for $host:" >> /tmp/new-host-resources.txt
/usr/sbin/pct config $host | grep -E '^hostname|^cores|^memory|^rootfs|^net' >> /tmp/new-host-resources.txt
echo >> /tmp/new-host-resources.txt
elif [[ ${host:0:1} -eq 2 ]]; then
echo "Resources for $host:" >> /tmp/new-host-resources.txt
/usr/sbin/qm config $host | grep -E '^name|^cores|^memory|^scsi[0-9]|^net' >> /tmp/new-host-resources.txt
echo >> /tmp/new-host-resources.txt
fi
done
if [ -f /tmp/new-host-resources.txt ]; then
awk 'FNR==1 && NR!=1 {print ""; print "Here is a list of hosts missing from NetBox together with their information:"}; {print}' /tmp/diff_result.txt /tmp/new-host-resources.txt > /tmp/mail.txt
else
cp /tmp/diff_result.txt /tmp/mail.txt
fi
mail -s "$SUBJECT" "$MAILTO" < /tmp/mail.txt
fi
rm -f /tmp/pve-status.csv /tmp/netbox-status.csv /tmp/diff_result.txt /tmp/new-host-resources.txt /tmp/mail.txt