NETBOX - NetBox VLAN Device List Discovery.sh

From IT-Arts.net
Revision as of 11:35, 22 June 2026 by Admin (talk | contribs)


Return to Wiki Index


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


Return to Wiki Index