Ver código fonte

First commit of a working script.

Dennis Juhler Aagaard 1 ano atrás
commit
e55131095a
1 arquivos alterados com 121 adições e 0 exclusões
  1. 121 0
      RetreiveUnifiAPMAC.sh

+ 121 - 0
RetreiveUnifiAPMAC.sh

@@ -0,0 +1,121 @@
+#!/bin/bash
+
+# UniFi Controller credentials
+CONTROLLER_URL="https://your-controller-url:8443"   # Replace with your Unifi Controller Domain name or IP:PORT
+USERNAME="your-username"                            # Replace with your Unifi Controller username
+PASSWORD="your-password"                            # Replace with your Unifi Controller password
+SITE_NAME="default"                                 # Replace with your site name if different
+SSH_USERNAME="your-username"                        # Replace with your SSH username
+SSH_PASSWORD="your-password"                        # Replace with your SSH password
+
+# Function to retrieve site ID
+get_site_id() {
+    SITES_RESPONSE=$(curl --silent --insecure --cookie /tmp/unifi_cookie \
+                          ${CONTROLLER_URL}/api/self/sites)
+    
+    if [[ $(echo "$SITES_RESPONSE" | jq -r '.meta.rc') != "ok" ]]; then
+        echo "Failed to retrieve sites: $(echo "$SITES_RESPONSE" | jq -r '.meta.msg')" >&2
+        exit 1
+    fi
+
+    SITE_ID=$(echo "$SITES_RESPONSE" | jq -r --arg site_name "$SITE_NAME" '.data[] | select(.desc == $site_name) | .name')
+
+    if [[ -z "$SITE_ID" ]]; then
+        echo "Site '$SITE_NAME' not found." >&2
+        exit 1
+    fi
+}
+
+# Function to get the 2.4GHz radio MAC address using sshpass
+get_radio_mac() {
+    local AP_IP=$1
+
+    # Determine the hardware architecture and set the interface name
+    ARCHITECTURE=$(sshpass -p "$SSH_PASSWORD" ssh -o StrictHostKeyChecking=no $SSH_USERNAME@$AP_IP "uname -a")
+    if echo "$ARCHITECTURE" | grep -q 'aarch64'; then
+        INTERFACE='ra0'
+    else
+        INTERFACE='ath0'
+    fi
+
+    #echo "Using interface $INTERFACE for $AP_IP"
+    if [ $INTERFACE = 'ra0' ]; then
+    # Retrieve the MAC address for the determined interface
+    MAC_ADDRESS=$(sshpass -p "$SSH_PASSWORD" ssh -o StrictHostKeyChecking=no $SSH_USERNAME@$AP_IP \
+    "iwconfig $INTERFACE 2>/dev/null | grep 'Access Point' | awk '{print \$5}'")
+    fi
+     if [ $INTERFACE = 'ath0' ]; then
+    # Retrieve the MAC address for the determined interface
+    MAC_ADDRESS=$(sshpass -p "$SSH_PASSWORD" ssh -o StrictHostKeyChecking=no $SSH_USERNAME@$AP_IP \
+    "iwconfig $INTERFACE 2>/dev/null | grep 'Access Point' | awk '{print \$6}'")
+    fi
+    echo "$MAC_ADDRESS"
+}
+
+# Login to UniFi Controller and get a session cookie
+LOGIN_RESPONSE=$(curl --silent --insecure --cookie-jar /tmp/unifi_cookie \
+     --data "{\"username\":\"${USERNAME}\",\"password\":\"${PASSWORD}\"}" \
+     --header 'Content-Type: application/json' \
+     ${CONTROLLER_URL}/api/login)
+
+# Check if login was successful
+if [[ $(echo "$LOGIN_RESPONSE" | jq -r '.meta.rc') != "ok" ]]; then
+    echo "Login failed: $(echo "$LOGIN_RESPONSE" | jq -r '.meta.msg')" >&2
+    exit 1
+fi
+
+# Retrieve the correct site ID
+get_site_id
+
+# Get the list of devices and filter for WiFi access points
+DEVICE_LIST=$(curl --silent --insecure --cookie /tmp/unifi_cookie \
+                    ${CONTROLLER_URL}/api/s/${SITE_ID}/stat/device)
+
+# Check if device list retrieval was successful
+if [[ $(echo "$DEVICE_LIST" | jq -r '.meta.rc') != "ok" ]]; then
+    echo "Failed to retrieve device list: $(echo "$DEVICE_LIST" | jq -r '.meta.msg')" >&2
+    exit 1
+fi
+
+# Extract AP names and IP addresses
+AP_LIST=$(echo ${DEVICE_LIST} | jq -r '.data[] | select(.type=="uap") | "\(.name),\(.ip)"')
+
+# Output header
+echo "Access Point Name, 2.4GHz MAC Address"
+
+# Check if AP_LIST is empty and print a message if it is
+if [ -z "$AP_LIST" ]; then
+    echo "No access points found or unable to retrieve access points. Please check your UniFi Controller settings."
+    exit 1
+fi
+
+# Read AP names and IP addresses into an array
+IFS=$'\n' read -d '' -r -a ap_array <<< "$AP_LIST"
+
+# Loop through each AP, SSH to get the MAC address, and output the result
+for AP_INFO in "${ap_array[@]}"; do
+    IFS=, read -r AP_NAME AP_IP <<< "$AP_INFO"
+    
+    #echo "Checking AP: $AP_NAME ($AP_IP)"
+    MAC_ADDRESS=$(get_radio_mac $AP_IP)
+    if [ -z "$MAC_ADDRESS" ]; then
+        COUNT=$((COUNT + 1))
+        echo "$COUNT"
+        echo "Failed to retrieve MAC address for $AP_NAME ($AP_IP)"
+        
+    else
+        COUNT=$((COUNT + 1))
+        echo "$COUNT"
+        echo "Unifi AP Name: $AP_NAME"
+        #echo " $AP_IP"
+        echo "MAC Address: $MAC_ADDRESS"
+        echo ""
+        
+    fi
+done
+
+# Logout to clean up the session and suppress output
+curl --silent --insecure --cookie /tmp/unifi_cookie ${CONTROLLER_URL}/api/logout > /dev/null
+
+# Remove the cookie file
+rm /tmp/unifi_cookie