NETBOX - NetBox VLAN Device List Discovery.sh
From IT-Arts.net
NetBox_VLAN_Device_List_Discovery.sh
#!/usr/bin/env bash
set -euo pipefail
###############################################################################
# INTERACTIVE CONFIG
###############################################################################
read -rp "NetBox URL (e.g. https://netbox.example.com): " NETBOX_URL
read -rsp "NetBox API Token (v1): " NETBOX_TOKEN
echo
###############################################################################
# ARGUMENT CHECK
###############################################################################
if [[ $# -ne 1 ]]; then
echo "Usage: $0 <VLAN_VID>"
exit 1
fi
VLAN_VID="$1"
###############################################################################
# DATA STORE
###############################################################################
declare -A RESULTS
###############################################################################
# API CALL (v1 TOKEN FORMAT)
###############################################################################
netbox_get() {
local url="$1"
curl -sS \
-H "Authorization: Token ${NETBOX_TOKEN}" \
-H "Accept: application/json" \
"${url}"
}
###############################################################################
# VLAN LOOKUP
###############################################################################
get_vlan_id() {
local response
response="$(netbox_get "${NETBOX_URL}/api/ipam/vlans/?vid=${VLAN_VID}")"
# fail fast if API error
echo "$response" | jq -e . >/dev/null
echo "$response" | jq -r '.results[0].id'
}
###############################################################################
# PAGINATION HANDLER
###############################################################################
process_interface_pages() {
local url="$1"
while [[ -n "${url}" && "${url}" != "null" ]]; do
response="$(netbox_get "${url}")"
# validate JSON
echo "$response" | jq -e . >/dev/null
while IFS=$'\t' read -r device iface desc; do
[[ -z "$device" ]] && continue
key="${device} / ${iface}"
RESULTS["$key"]="${desc:-N/A}"
done < <(
echo "${response}" | jq -r '
.results[]
| select(.device != null)
| [
(.device.display // .device.name),
.name,
.description
]
| @tsv
'
)
url="$(echo "${response}" | jq -r '.next')"
done
}
###############################################################################
# STEP 1 - VLAN LOOKUP
###############################################################################
echo "Searching VLAN VID ${VLAN_VID}..."
VLAN_ID="$(get_vlan_id)"
if [[ -z "${VLAN_ID}" || "${VLAN_ID}" == "null" ]]; then
echo "ERROR: VLAN not found"
exit 1
fi
echo "Found VLAN ID: ${VLAN_ID}"
echo
###############################################################################
# STEP 2 - UNTAGGED INTERFACES
###############################################################################
echo "Scanning untagged interfaces..."
process_interface_pages \
"${NETBOX_URL}/api/dcim/interfaces/?untagged_vlan=${VLAN_ID}"
###############################################################################
# STEP 3 - TAGGED INTERFACES
###############################################################################
echo "Scanning tagged interfaces..."
process_interface_pages \
"${NETBOX_URL}/api/dcim/interfaces/?tagged_vlans=${VLAN_ID}"
###############################################################################
# STEP 4 - OUTPUT
###############################################################################
echo
echo "====================================================="
echo "Device / Interface / Description"
echo "VLAN ${VLAN_VID}"
echo "====================================================="
echo
printf "%s\n" "${!RESULTS[@]}" \
| sort \
| while read -r key; do
printf "%s / %s\n" "$key" "${RESULTS[$key]}"
done
echo
echo "Total entries: ${#RESULTS[@]}"
