NETBOX - NetBox VLAN Device List Discovery.sh

From IT-Arts.net
Revision as of 09:56, 19 June 2026 by Admin (talk | contribs) (Created page with "Category:Wiki '''''[https://it-arts.net/index.php/Category:Wiki Return to Wiki Index]''''' == NetBox_VLAN_Device_List_Discovery.sh == <nowiki> #!/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):...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)


Return to Wiki Index


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[@]}"


Return to Wiki Index