Enforce SN

This commit is contained in:
Douglas Barone 2023-06-26 08:15:20 -04:00
parent 02090fd62e
commit c2476ba74a
5 changed files with 54 additions and 26 deletions

View File

@ -0,0 +1,8 @@
/*
Warnings:
- Made the column `serialNumber` on table `Printer` required. This step will fail if there are existing NULL values in that column.
*/
-- AlterTable
ALTER TABLE "Printer" ALTER COLUMN "serialNumber" SET NOT NULL;

View File

@ -37,7 +37,7 @@ model Printer {
friendlyName String? friendlyName String?
location String? location String?
serialNumber String? @unique serialNumber String @unique
ip String @unique ip String @unique
model String model String

View File

@ -2,9 +2,6 @@ import { Router, Request, Response } from 'express'
import { hasRolesMiddleware } from '../middlewares/hasRolesMiddleware.js' import { hasRolesMiddleware } from '../middlewares/hasRolesMiddleware.js'
import { PrinterDiscoveryService } from '../services/PrinterDiscoveryService.js' import { PrinterDiscoveryService } from '../services/PrinterDiscoveryService.js'
import { prisma } from '../prisma.js'
import { PrinterStatusService } from '../services/PrinterStatusService.js'
import { Printer } from '@prisma/client'
const router = Router() const router = Router()

View File

@ -96,8 +96,13 @@ export class PrinterDiscoveryService {
await Promise.allSettled( await Promise.allSettled(
newPrintersIPs.map(async ip => { newPrintersIPs.map(async ip => {
const model = await PrinterStatusService.getPrinterModel(ip) const model = await PrinterStatusService.getPrinterModel(ip)
const printer = await prisma.printer.create({ const serialNumber =
data: { ip, model, networkId: network.id } await PrinterStatusService.getPrinterSerialNumber(ip)
const printer = await prisma.printer.upsert({
where: { serialNumber },
create: { ip, model, networkId: network.id, serialNumber },
update: { ip, model, networkId: network.id }
}) })
new PrinterStatusService(printer) new PrinterStatusService(printer)

View File

@ -1,5 +1,5 @@
import snmp from 'net-snmp' import snmp from 'net-snmp'
import { Printer, PrinterStatus } from '@prisma/client' import { Printer } from '@prisma/client'
import { prisma } from '../prisma.js' import { prisma } from '../prisma.js'
import { import {
objectIdsRepository, objectIdsRepository,
@ -45,8 +45,9 @@ export type PrinterInfo = {
export class PrinterStatusService { export class PrinterStatusService {
constructor(private printer: Printer) { constructor(private printer: Printer) {
this.getPrinterInfo().then(async printerStatus => { this.getPrinterInfo().then(async printerStatus => {
if (this.printer.serialNumber)
await prisma.printer.update({ await prisma.printer.update({
where: { id: this.printer.id }, where: { serialNumber: this.printer.serialNumber },
data: { data: {
serialNumber: printerStatus.serialNumber, serialNumber: printerStatus.serialNumber,
location: printerStatus.location, location: printerStatus.location,
@ -119,6 +120,23 @@ export class PrinterStatusService {
}) })
} }
static getPrinterSerialNumber(ip: string): Promise<string> {
return new Promise((resolve, reject) => {
const snmpSession = snmp.createSession(ip, 'public')
snmpSession.get(
['1.3.6.1.2.1.43.5.1.1.17.1'],
(error: any, varbinds: any) => {
if (error) {
reject(error)
} else {
resolve(varbinds[0].value.toString())
}
snmpSession.close()
}
)
})
}
async getPrinterInfo(): Promise<PrinterInfo> { async getPrinterInfo(): Promise<PrinterInfo> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const session = snmp.createSession(this.printer.ip, 'public') const session = snmp.createSession(this.printer.ip, 'public')