NETBOX - NetBox VLAN Device List Discovery.sh
From IT-Arts.net
NetBox_VLAN_Device_List_Discovery.sh
#!/usr/bin/env bash
set -euo pipefail
HOST=""
TOKEN=""
DEBUG=0
VIDS=()
usage() {
echo "USAGE: $0 -h <FQDN> -t <TOKEN> -v <VLAN_VID1> <VLAN_VID2>... [-d]"
exit 1
}
while [[ $# -gt 0 ]]; do
case "$1" in
-h) HOST="${2:-}"; shift 2 ;;
-t) TOKEN="${2:-}"; shift 2 ;;
-v)
shift
while [[ $# -gt 0 && "$1" != -* ]]; do
VIDS+=("$1")
shift
done
;;
-d) DEBUG=1; shift ;;
*) usage ;;
esac
done
[[ -z "$HOST" || -z "$TOKEN" || ${#VIDS[@]} -eq 0 ]] && usage
API="https://${HOST}/api"
AUTH="Authorization: Token ${TOKEN}"
api() {
local url="$1"
[[ $DEBUG -eq 1 ]] && echo "[DEBUG] GET $url" >&2
resp=$(curl -sS -H "$AUTH" -H "Accept: application/json" "$url")
echo "$resp" | jq -e . >/dev/null 2>&1 || {
echo "[ERROR] INVALID JSON: $url" >&2
echo "$resp" | head -n 10 >&2
return 1
}
echo "$resp"
}
echo "DEVICE, VLAN VID, VLAN NAME, INTERFACE, MODE, INTERFACE DESCRIPTION"
interfaces=$(api "${API}/dcim/interfaces/?limit=1000")
for vid in "${VIDS[@]}"; do
vlan_json=$(api "${API}/ipam/vlans/?vid=${vid}&limit=1000")
vlan_count=$(echo "$vlan_json" | jq '.results | length')
if [[ "$vlan_count" -eq 0 ]]; then
echo "VLAN ${vid} IS NOT PRESENT"
continue
fi
echo "$vlan_json" | jq -c '.results[]' | while read -r vlan; do
vlan_id=$(echo "$vlan" | jq -r '.id')
vlan_name=$(echo "$vlan" | jq -r '.name')
echo "$interfaces" | jq -r \
--arg vid "$vid" \
--arg vlan_id "$vlan_id" \
--arg name "$vlan_name" '
.results[] |
.device.name as $device |
.name as $iface |
(.description // "—") as $desc |
(.tagged_vlans // []) as $tagged_list |
($tagged_list | map(.id | tostring) | index($vlan_id)) as $is_tagged |
(.untagged_vlan?.id | tostring == $vlan_id) as $is_untagged |
if $is_tagged then
"\($device), \($vid), \($name), \($iface), TAGGED, \($desc)"
elif $is_untagged then
"\($device), \($vid), \($name), \($iface), UNTAGGED, \($desc)"
else
empty
end
'
done
done | sort -u
