Added initial support to Cisco controller
This commit is contained in:
parent
18e43b7ae8
commit
419d91950b
775
server/package-lock.json
generated
775
server/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
52
server/src/utils/ciscoController.js
Normal file
52
server/src/utils/ciscoController.js
Normal 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
|
||||
}
|
|
@ -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 }
|
||||
|
|
|
@ -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 }
|
||||
|
|
Loading…
Reference in New Issue
Block a user