gumijasta račka \(^o^)/

pve-netbox-diff.sh

#! /bin/bash

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 /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