Cisco APs OK
This commit is contained in:
parent
3ee2504c24
commit
8172769249
|
@ -0,0 +1,58 @@
|
||||||
|
-- DropForeignKey
|
||||||
|
ALTER TABLE "PAHost" DROP CONSTRAINT "PAHost_ownerId_fkey";
|
||||||
|
|
||||||
|
-- DropForeignKey
|
||||||
|
ALTER TABLE "ResetToken" DROP CONSTRAINT "ResetToken_creatorId_fkey";
|
||||||
|
|
||||||
|
-- DropForeignKey
|
||||||
|
ALTER TABLE "ResetToken" DROP CONSTRAINT "ResetToken_userId_fkey";
|
||||||
|
|
||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "WifiDevice" ADD COLUMN "accessPointId" INTEGER;
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "AccessPoint" (
|
||||||
|
"id" SERIAL NOT NULL,
|
||||||
|
"mac" TEXT NOT NULL,
|
||||||
|
"hostname" TEXT NOT NULL,
|
||||||
|
"name" TEXT,
|
||||||
|
"local" TEXT,
|
||||||
|
"notes" TEXT,
|
||||||
|
"uptime" TEXT,
|
||||||
|
"controller" TEXT,
|
||||||
|
"model" TEXT,
|
||||||
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||||
|
|
||||||
|
CONSTRAINT "AccessPoint_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "AccessPoint_mac_key" ON "AccessPoint"("mac");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "AccessPoint_hostname_key" ON "AccessPoint"("hostname");
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "ResetToken" ADD CONSTRAINT "ResetToken_creatorId_fkey" FOREIGN KEY ("creatorId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "ResetToken" ADD CONSTRAINT "ResetToken_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "WifiDevice" ADD CONSTRAINT "WifiDevice_accessPointId_fkey" FOREIGN KEY ("accessPointId") REFERENCES "AccessPoint"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "PAHost" ADD CONSTRAINT "PAHost_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- RenameIndex
|
||||||
|
ALTER INDEX "PAHost.cidr_unique" RENAME TO "PAHost_cidr_key";
|
||||||
|
|
||||||
|
-- RenameIndex
|
||||||
|
ALTER INDEX "ResetToken.token_unique" RENAME TO "ResetToken_token_key";
|
||||||
|
|
||||||
|
-- RenameIndex
|
||||||
|
ALTER INDEX "User.sAMAccountName_unique" RENAME TO "User_sAMAccountName_key";
|
||||||
|
|
||||||
|
-- RenameIndex
|
||||||
|
ALTER INDEX "WifiDevice.mac_unique" RENAME TO "WifiDevice_mac_key";
|
3
server/prisma/migrations/migration_lock.toml
Normal file
3
server/prisma/migrations/migration_lock.toml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# Please do not edit this file manually
|
||||||
|
# It should be added in your version-control system (i.e. Git)
|
||||||
|
provider = "postgresql"
|
|
@ -83,6 +83,8 @@ model WifiDevice {
|
||||||
ip String?
|
ip String?
|
||||||
uptime String?
|
uptime String?
|
||||||
apName String?
|
apName String?
|
||||||
|
accessPointId Int?
|
||||||
|
accessPoint AccessPoint? @relation("wifidevice_to_ap", fields: [accessPointId], references: [id])
|
||||||
status Status?
|
status Status?
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
|
@ -137,3 +139,20 @@ model PAHost {
|
||||||
ownerId Int
|
ownerId Int
|
||||||
owner User @relation("pahost_to_user", fields: [ownerId], references: [id])
|
owner User @relation("pahost_to_user", fields: [ownerId], references: [id])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
model AccessPoint {
|
||||||
|
id Int @id @default(autoincrement())
|
||||||
|
mac String @unique
|
||||||
|
hostname String @unique
|
||||||
|
name String?
|
||||||
|
local String?
|
||||||
|
notes String?
|
||||||
|
uptime String?
|
||||||
|
controller String?
|
||||||
|
model String?
|
||||||
|
|
||||||
|
createdAt DateTime @default(now())
|
||||||
|
updatedAt DateTime @updatedAt
|
||||||
|
|
||||||
|
WifiDevices WifiDevice[] @relation("wifidevice_to_ap")
|
||||||
|
}
|
||||||
|
|
23
server/src/lib/accessPoints.js
Normal file
23
server/src/lib/accessPoints.js
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
import prisma from '../prisma'
|
||||||
|
import { getAccessPoints as getCiscoAccessPoints } from './ciscoController'
|
||||||
|
|
||||||
|
async function getAccessPoints() {
|
||||||
|
const ciscoAccessPoints = await getCiscoAccessPoints()
|
||||||
|
|
||||||
|
return ciscoAccessPoints
|
||||||
|
}
|
||||||
|
|
||||||
|
async function updateDB(accessPoints) {
|
||||||
|
for (const accessPoint of accessPoints) {
|
||||||
|
await prisma.accessPoint.upsert({
|
||||||
|
where: { mac: accessPoint.mac },
|
||||||
|
create: accessPoint,
|
||||||
|
update: accessPoint
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function updateAccessPoints() {
|
||||||
|
const accessPoints = await getAccessPoints()
|
||||||
|
await updateDB(accessPoints)
|
||||||
|
}
|
|
@ -6,25 +6,25 @@ import { logError } from './logger'
|
||||||
const TIMEOUT_IN_MS = 120000
|
const TIMEOUT_IN_MS = 120000
|
||||||
const REQUEST_TIMEOUT_IN_MS = 20000
|
const REQUEST_TIMEOUT_IN_MS = 20000
|
||||||
|
|
||||||
const getUri = (skip, page, take) =>
|
const getDevicesUri = (skip, page, take) =>
|
||||||
`https://${process.env.CISCO_HOST}/data/client-table.html?columns=524287&take=${take}&skip=${skip}&page=${page}&pageSize=50&sort[0][field]=ST&sort[0][dir]=desc`
|
`https://${process.env.CISCO_HOST}/data/client-table.html?columns=524287&take=${take}&skip=${skip}&page=${page}&pageSize=50&sort[0][field]=ST&sort[0][dir]=desc`
|
||||||
|
|
||||||
function getDevices() {
|
const httpsAgent = new https.Agent({
|
||||||
return new Promise(async (resolve, reject) => {
|
|
||||||
const httpsAgent = new https.Agent({
|
|
||||||
rejectUnauthorized: false,
|
rejectUnauthorized: false,
|
||||||
ciphers: 'AES256-SHA' // That's necessary to connect to a TLS 1.0 server. Run node with --tls-min-v1.0
|
ciphers: 'AES256-SHA' // That's necessary to connect to a TLS 1.0 server. Run node with --tls-min-v1.0
|
||||||
})
|
})
|
||||||
|
|
||||||
const axios = create({
|
const ciscoAxios = create({
|
||||||
httpsAgent: httpsAgent,
|
httpsAgent: httpsAgent,
|
||||||
timeout: REQUEST_TIMEOUT_IN_MS,
|
timeout: REQUEST_TIMEOUT_IN_MS,
|
||||||
auth: {
|
auth: {
|
||||||
username: process.env.CISCO_USER,
|
username: process.env.CISCO_USER,
|
||||||
password: process.env.CISCO_PASSWORD
|
password: process.env.CISCO_PASSWORD
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
function getDevices() {
|
||||||
|
return new Promise(async (resolve, reject) => {
|
||||||
const source = CancelToken.source()
|
const source = CancelToken.source()
|
||||||
|
|
||||||
const timeout = setTimeout(() => {
|
const timeout = setTimeout(() => {
|
||||||
|
@ -43,9 +43,12 @@ function getDevices() {
|
||||||
const responsesPromises = []
|
const responsesPromises = []
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const firstResponse = await axios.get(getUri(skip, page, take), {
|
const firstResponse = await ciscoAxios.get(
|
||||||
|
getDevicesUri(skip, page, take),
|
||||||
|
{
|
||||||
cancelToken: source.token
|
cancelToken: source.token
|
||||||
})
|
}
|
||||||
|
)
|
||||||
|
|
||||||
const { total, data: page1devices } = firstResponse.data
|
const { total, data: page1devices } = firstResponse.data
|
||||||
|
|
||||||
|
@ -54,7 +57,7 @@ function getDevices() {
|
||||||
|
|
||||||
while (total > skip) {
|
while (total > skip) {
|
||||||
responsesPromises.push(
|
responsesPromises.push(
|
||||||
axios.get(getUri(skip, page, take), {
|
ciscoAxios.get(getDevicesUri(skip, page, take), {
|
||||||
cancelToken: source.token
|
cancelToken: source.token
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
@ -90,7 +93,7 @@ export async function getOnlineWifiDevices() {
|
||||||
|
|
||||||
const now = new Date()
|
const now = new Date()
|
||||||
|
|
||||||
const hydratedOnlineDevices = onlineDevices.map(client => ({
|
const restructuredOnlineDevices = onlineDevices.map(client => ({
|
||||||
user: client.Name == 'unknown' ? null : client.Name,
|
user: client.Name == 'unknown' ? null : client.Name,
|
||||||
oui: ouiFinder(client.macaddr),
|
oui: ouiFinder(client.macaddr),
|
||||||
mac: client.macaddr,
|
mac: client.macaddr,
|
||||||
|
@ -105,5 +108,49 @@ export async function getOnlineWifiDevices() {
|
||||||
controller: 'Cisco'
|
controller: 'Cisco'
|
||||||
}))
|
}))
|
||||||
|
|
||||||
return hydratedOnlineDevices
|
return restructuredOnlineDevices
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getAccessPoints() {
|
||||||
|
const source = CancelToken.source()
|
||||||
|
|
||||||
|
const timeout = setTimeout(() => {
|
||||||
|
source.cancel('timeout')
|
||||||
|
reject(
|
||||||
|
new Error(
|
||||||
|
'A operação getDevices foi cancelada pois atingiu o tempo limite'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}, TIMEOUT_IN_MS)
|
||||||
|
|
||||||
|
try {
|
||||||
|
const {
|
||||||
|
data: { Data: accessPoints }
|
||||||
|
} = await ciscoAxios.get(
|
||||||
|
`https://${process.env.CISCO_HOST}/data/ap-attributes-slot0.html?columns=28157`,
|
||||||
|
{
|
||||||
|
cancelToken: source.token
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
clearTimeout(timeout)
|
||||||
|
|
||||||
|
const restructuredAccessPoints = accessPoints.map(({ Nm, Mc, Md, Ut }) => ({
|
||||||
|
mac: Mc,
|
||||||
|
hostname: Nm,
|
||||||
|
uptime: Ut.toString(),
|
||||||
|
controller: 'Cisco',
|
||||||
|
model: Md
|
||||||
|
}))
|
||||||
|
|
||||||
|
return restructuredAccessPoints
|
||||||
|
} catch (e) {
|
||||||
|
logError({
|
||||||
|
tags: ['cisco', 'accessPoints'],
|
||||||
|
message: e.message,
|
||||||
|
data: { ...e, config: { ...e.config, auth: '*****' } }
|
||||||
|
})
|
||||||
|
|
||||||
|
throw e
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,10 @@ import { ResetToken } from '../../classes/ResetToken'
|
||||||
|
|
||||||
import { updateDevicesInfo } from '../../lib/wifiDevices'
|
import { updateDevicesInfo } from '../../lib/wifiDevices'
|
||||||
import { updateUserIdMappings, addHost } from '../../lib/paloalto'
|
import { updateUserIdMappings, addHost } from '../../lib/paloalto'
|
||||||
import { logInfo, logSuccess } from '../../lib/logger'
|
import { logInfo, logSuccess, logError } from '../../lib/logger'
|
||||||
|
|
||||||
|
import { updateAccessPoints } from '../../lib/accessPoints'
|
||||||
|
|
||||||
import prisma from '../../prisma'
|
import prisma from '../../prisma'
|
||||||
|
|
||||||
const Mutation = {
|
const Mutation = {
|
||||||
|
@ -82,6 +85,19 @@ const Mutation = {
|
||||||
throw new Error('Você não pode apagar o host de outro usuário')
|
throw new Error('Você não pode apagar o host de outro usuário')
|
||||||
|
|
||||||
return prisma.pAHost.delete({ where: { id } })
|
return prisma.pAHost.delete({ where: { id } })
|
||||||
|
},
|
||||||
|
|
||||||
|
async updateAccessPoints() {
|
||||||
|
try {
|
||||||
|
await updateAccessPoints()
|
||||||
|
return 'Atualização concluída'
|
||||||
|
} catch (e) {
|
||||||
|
logError({
|
||||||
|
tags: ['accessPoints'],
|
||||||
|
message: `Erro tentando atualizar os pontos de acesso: ${e.message}`,
|
||||||
|
data: { error: e }
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,11 @@ const typeDefs = gql`
|
||||||
limit: Int = 200
|
limit: Int = 200
|
||||||
): [Log]! @auth(roles: ["superAdmin"])
|
): [Log]! @auth(roles: ["superAdmin"])
|
||||||
|
|
||||||
|
"All PA hosts"
|
||||||
pAHosts: [PAHost!]! @auth(roles: ["superAdmin"])
|
pAHosts: [PAHost!]! @auth(roles: ["superAdmin"])
|
||||||
|
|
||||||
|
"All Access Points"
|
||||||
|
accessPoints: [AccessPoint!]! @auth(roles: ["superAdmin"])
|
||||||
}
|
}
|
||||||
|
|
||||||
type Mutation {
|
type Mutation {
|
||||||
|
@ -89,6 +93,9 @@ const typeDefs = gql`
|
||||||
|
|
||||||
"Remove a PA host"
|
"Remove a PA host"
|
||||||
delPAHost(id: Int!): PAHost! @auth(roles: ["superAdmin"])
|
delPAHost(id: Int!): PAHost! @auth(roles: ["superAdmin"])
|
||||||
|
|
||||||
|
"Update Access Points"
|
||||||
|
updateAccessPoints: String! @auth(roles: ["superAdmin"])
|
||||||
}
|
}
|
||||||
|
|
||||||
type Subscription {
|
type Subscription {
|
||||||
|
@ -279,6 +286,19 @@ const typeDefs = gql`
|
||||||
updatedAt: String
|
updatedAt: String
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"A Wireless Access Point"
|
||||||
|
type AccessPoint {
|
||||||
|
id: ID!
|
||||||
|
mac: String!
|
||||||
|
hostname: String
|
||||||
|
name: String
|
||||||
|
local: String
|
||||||
|
notes: String
|
||||||
|
createdAt: String
|
||||||
|
updatedAt: String
|
||||||
|
WifiDevices: [WifiDevice]
|
||||||
|
}
|
||||||
|
|
||||||
input LoginInput {
|
input LoginInput {
|
||||||
username: String!
|
username: String!
|
||||||
password: String!
|
password: String!
|
||||||
|
|
Loading…
Reference in New Issue
Block a user