Added initial support to Cisco controller

This commit is contained in:
Douglas Barone 2020-11-18 17:25:57 -04:00
parent 18e43b7ae8
commit 419d91950b
5 changed files with 877 additions and 50 deletions

775
server/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -44,6 +44,7 @@
"ldapjs": "^2.2.1",
"node-cron": "^2.0.3",
"node-unifi": "^1.3.8",
"puppeteer": "^5.5.0",
"uuid": "^8.3.1"
}
}

View File

@ -0,0 +1,52 @@
import puppeteer from 'puppeteer'
const auth = {
username: process.env.CISCO_USER,
password: process.env.CISCO_PASSWORD
}
async function getDevices() {
const take = 50
let skip = 0
let currentPage = 1
const browser = await puppeteer.launch({
ignoreHTTPSErrors: true
})
const controllerPage = await browser.newPage()
await controllerPage.authenticate({
username: auth.username,
password: auth.password
})
try {
let devices = []
let result = []
do {
const url = `https://${process.env.CISCO_HOST}/data/client-table.html?columns=524287&take=${take}&skip=${skip}&page=${currentPage}&pageSize=50&sort[0][field]=ST&sort[0][dir]=desc`
let response = await controllerPage.goto(url)
result = await response.json()
skip += take
currentPage++
devices = devices.concat(result.data)
} while (result.total > skip)
browser.close()
return devices
} catch (e) {
console.log('[Cisco Controller]', e.message)
}
}
export async function getOnlineWifiDevices() {
const onlineDevices = getDevices()
return onlineDevices
}

View File

@ -2,7 +2,7 @@ import { Controller } from 'node-unifi'
import { promisify } from 'util'
const unifiController = new Controller(
process.env.UNIFI_URL || 'unifi.pp.ifms.edu.br',
process.env.UNIFI_HOST || 'unifi.pp.ifms.edu.br',
process.env.UNIFI_PORT || 8443
)
@ -159,9 +159,44 @@ const usedControllerMethods = [
'customApiRequest'
]
const controller = {}
for (let key of usedControllerMethods)
controller[key] = promisify(unifiController[key])
unifiController[key] = promisify(unifiController[key])
export async function getOnlineWifiDevices() {
try {
await unifiController.login(
process.env.UNIFI_USER,
process.env.UNIFI_PASSWORD
)
const accessPointsPromise = unifiController.getAccessDevices('default')
const onlineDevicesPromise = unifiController.getClientDevices('default')
const [accessPoints, onlineDevices] = await Promise.all([
accessPointsPromise,
onlineDevicesPromise
])
const hydratedOnlineDevices = onlineDevices[0].map(client => ({
user: client['1x_identity'] || null,
oui: client.oui,
mac: client.mac,
hostname: client.hostname,
firstSeen: new Date(client.first_seen * 1000),
lastSeen: new Date(client.last_seen * 1000),
essid: client.essid,
ip: client.ip,
uptime: client.uptime.toString(),
apName: accessPoints[0].find(ap => ap.mac === client.ap_mac).name,
status: 'ONLINE'
}))
unifiController.logout()
return hydratedOnlineDevices
} catch (e) {
throw new Error('Error getting devices. ' + e)
}
}
export { controller }

View File

@ -1,42 +1,18 @@
import { controller } from './unifiController'
import { getOnlineWifiDevices as getOnlineUnifiDevices } from './unifiController'
import { getOnlineWifiDevices as getOnlineCiscoDevices } from './ciscoController'
import prisma from '../prisma'
async function getOnlineWifiDevices() {
try {
await controller.login(process.env.UNIFI_USER, process.env.UNIFI_PASSWORD)
async function updateDBWithOnlineDevices() {
const onlineUnifiDevicesPromise = getOnlineUnifiDevices()
const onlineCiscoDevicesPromise = getOnlineCiscoDevices()
const accessPointsPromise = controller.getAccessDevices('default')
const onlineDevicesPromise = controller.getClientDevices('default')
const [accessPoints, onlineDevices] = await Promise.all([
accessPointsPromise,
onlineDevicesPromise
const [onlineUnifiDevices, onlineCiscoDevices] = await Promise.all([
onlineUnifiDevicesPromise,
onlineCiscoDevicesPromise
])
const onlineDevicesWithUser = onlineDevices[0].map(client => ({
user: client['1x_identity'] || null,
oui: client.oui,
mac: client.mac,
hostname: client.hostname,
firstSeen: new Date(client.first_seen * 1000),
lastSeen: new Date(client.last_seen * 1000),
essid: client.essid,
ip: client.ip,
uptime: client.uptime.toString(),
apName: accessPoints[0].find(ap => ap.mac === client.ap_mac).name,
status: 'ONLINE'
}))
controller.logout()
return onlineDevicesWithUser
} catch (e) {
throw new Error('Error updating devices. ' + e)
}
}
async function updateDBWithOnlineDevices() {
let onlineDevices = await getOnlineWifiDevices()
console.log(onlineCiscoDevices.length)
await prisma.wifiDevice.updateMany({
data: {
@ -44,7 +20,7 @@ async function updateDBWithOnlineDevices() {
}
})
for (const onlineDevice of onlineDevices) {
for (const onlineDevice of onlineUnifiDevices) {
const device = {
...onlineDevice,
user: onlineDevice.user
@ -64,7 +40,7 @@ async function updateDBWithOnlineDevices() {
}
// TODO: pubsub
return onlineDevices.length
return onlineUnifiDevices.length
}
export { getOnlineWifiDevices, updateDBWithOnlineDevices }
export { updateDBWithOnlineDevices }