diff --git a/unifi.ps1 b/unifi.ps1 new file mode 100644 index 0000000..28fdf22 --- /dev/null +++ b/unifi.ps1 @@ -0,0 +1,137 @@ + +$URI = "https://unifi.freifunk-troisdorf.de/v2.1/devices" +$headers = @{ + "x-auth-token" = "" +} + +$devices = (Get-Content -Path .\devices.json | ConvertFrom-Json).devices + +$request = Invoke-Restmethod -URI $URI -Method GET -Headers $headers + +# Get timestamp +$timestamp = Get-Date -UFormat "%Y-%m-%dT%R:00%Z00" +$timeDiffFromUTC = Get-Date -UFormat "%Z00" + + + +# create empty nodes array +$nodes = @() +$links = @() + +# loop through each device +foreach ($device in $devices) { + $dev = $request | Where-Object { $_.identification.mac -eq $device.mac} + # implement function that reports not found mac addresses in API + + ## Get info from API + $firstseen = Get-Date -Date $dev.overview.createdAt -UFormat "%Y-%m-%dT%R:00$timeDiffFromUTC" + $lastseen = Get-Date -Date $dev.overview.lastSeen -UFormat "%Y-%m-%dT%R:00$timeDiffFromUTC" + if ($dev.overview.status -eq "active") { + $is_online = $true + } else { + $is_online = $false + } + + $uptime = Get-Date -Date $dev.identification.started -UFormat "%Y-%m-%dT%R:00$timeDiffFromUTC" + $mac = $dev.identification.mac + $node_id = $mac.replace(":","") + + + ## End of API call 1 + + + # get more info from each device + ## Get more info from second API call + $id = $dev.identification.id + $URI = "https://unifi.freifunk-troisdorf.de/v2.1/devices/erouters/$id" + $details = Invoke-Restmethod -URI $URI -Method GET -Headers $headers + + $loadavg = $details.overview.cpu / 100 + $memory_usage = $details.overview.ram / 100 + + $addresses = @() + # cut away network mask + $addresses += $details.ipAddress.split("/")[0] + + $hostname = "[RiFu] " + $details.identification.name + + $firmware = @{ + base = "Ubiquiti - Stock" + release = $details.firmware.current + } + $model = $details.identification.model + + ## End of API call 2 + + ## API Call 3 (Links) + $URI = "https://unifi.freifunk-troisdorf.de/v2.1/devices/airmaxes/$id/stations" + $airmaxes = Invoke-Restmethod -URI $URI -Method GET -Headers $headers + $remoteMAC = $airmaxes.deviceIdentification.mac + + + # check if remote mac address is part of our published network + if ($devices | Where-Object -Property mac -EQ $remoteMAC) { + # this is a public link, let's advertise it + if (!($links | Where-Object -Property source_addr -EQ $remoteMAC)) { + # this link does not exist already, let's add it + $links += @{ + type = "wifi" + source = $mac.replace(":","") + target = $remoteMAC.replace(":","") + source_tq = $airmaxes.statistics.linkScore + target_tq = $airmaxes.statistics.linkScore + source_addr = $mac + target_addr = $remoteMAC + } + } + } + + ## Get info from json file (static) + $currentDev = $devices | Where-Object -Property mac -EQ $dev.identification.mac + $gateway_nexthop = $currentDev.gateway_nexthop + $gateway = $currentDev.gateway + $domain = $currentDev.domain + $location = $currentDev.location + + # assemble all into nodes an links + $nodes += @{ + firstseen = $firstseen + lastseen = $lastseen + is_online = $is_online + is_gateway = $false + clients = 0 + clients_wifi24 = 0 + clients_wifi5 = 0 + clients_other = 0 + rootfs_usage = 0 + loadavg = $loadavg + memory_usage = $memory_usage + uptime = $uptime + gateway_nexthop = $gateway_nexthop + gateway = $gateway + location = $location + node_id = $node_id + mac = $mac + addresses = $addresses + domain = $domain + hostname = $hostname + owner = "Freifunk Rhein-Sieg" + firmware = $firmware + autoupdater = @{ + enabled = $false + branch = "stable" + } + nproc = 1 + model = $model + } +} + + +# create file output +$output = @{ + timestamp = $timestamp + nodes = $nodes + links = $links +} + +$output | ConvertTo-Json -Depth 4 | Out-File example.json \ No newline at end of file