From c2476ba74a090a5a33d6089bbd5b3103fc8e0839 Mon Sep 17 00:00:00 2001 From: Douglas Barone Date: Mon, 26 Jun 2023 08:15:20 -0400 Subject: [PATCH] Enforce SN --- .../migrations/20230626121422_/migration.sql | 8 +++ prisma/schema.prisma | 4 +- src/controllers/PrinterDiscoveryController.ts | 3 - src/services/PrinterDiscoveryService.ts | 9 ++- src/services/PrinterStatusService.ts | 56 ++++++++++++------- 5 files changed, 54 insertions(+), 26 deletions(-) create mode 100644 prisma/migrations/20230626121422_/migration.sql diff --git a/prisma/migrations/20230626121422_/migration.sql b/prisma/migrations/20230626121422_/migration.sql new file mode 100644 index 0000000..1097ccc --- /dev/null +++ b/prisma/migrations/20230626121422_/migration.sql @@ -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; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 3a7f481..6e689f4 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -37,8 +37,8 @@ model Printer { friendlyName String? location String? - serialNumber String? @unique - ip String @unique + serialNumber String @unique + ip String @unique model String blackTonerModel String? diff --git a/src/controllers/PrinterDiscoveryController.ts b/src/controllers/PrinterDiscoveryController.ts index 38305aa..b2f486b 100644 --- a/src/controllers/PrinterDiscoveryController.ts +++ b/src/controllers/PrinterDiscoveryController.ts @@ -2,9 +2,6 @@ import { Router, Request, Response } from 'express' import { hasRolesMiddleware } from '../middlewares/hasRolesMiddleware.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() diff --git a/src/services/PrinterDiscoveryService.ts b/src/services/PrinterDiscoveryService.ts index 0169774..9caeec1 100644 --- a/src/services/PrinterDiscoveryService.ts +++ b/src/services/PrinterDiscoveryService.ts @@ -96,8 +96,13 @@ export class PrinterDiscoveryService { await Promise.allSettled( newPrintersIPs.map(async ip => { const model = await PrinterStatusService.getPrinterModel(ip) - const printer = await prisma.printer.create({ - data: { ip, model, networkId: network.id } + const serialNumber = + 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) diff --git a/src/services/PrinterStatusService.ts b/src/services/PrinterStatusService.ts index 82cb792..548c2e7 100644 --- a/src/services/PrinterStatusService.ts +++ b/src/services/PrinterStatusService.ts @@ -1,5 +1,5 @@ import snmp from 'net-snmp' -import { Printer, PrinterStatus } from '@prisma/client' +import { Printer } from '@prisma/client' import { prisma } from '../prisma.js' import { objectIdsRepository, @@ -45,27 +45,28 @@ export type PrinterInfo = { export class PrinterStatusService { constructor(private printer: Printer) { this.getPrinterInfo().then(async printerStatus => { - await prisma.printer.update({ - where: { id: this.printer.id }, - data: { - serialNumber: printerStatus.serialNumber, - location: printerStatus.location, - blackTonerModel: printerStatus.toners.black.model, - cyanTonerModel: printerStatus.toners.cyan?.model, - magentaTonerModel: printerStatus.toners.magenta?.model, - yellowTonerModel: printerStatus.toners.yellow?.model, + if (this.printer.serialNumber) + await prisma.printer.update({ + where: { serialNumber: this.printer.serialNumber }, + data: { + serialNumber: printerStatus.serialNumber, + location: printerStatus.location, + blackTonerModel: printerStatus.toners.black.model, + cyanTonerModel: printerStatus.toners.cyan?.model, + magentaTonerModel: printerStatus.toners.magenta?.model, + yellowTonerModel: printerStatus.toners.yellow?.model, - status: { - create: { - counter: printerStatus.counter, - tonerBlackLevel: printerStatus.toners.black.level, - tonerCyanLevel: printerStatus.toners.cyan?.level, - tonerMagentaLevel: printerStatus.toners.magenta?.level, - tonerYellowLevel: printerStatus.toners.yellow?.level + status: { + create: { + counter: printerStatus.counter, + tonerBlackLevel: printerStatus.toners.black.level, + tonerCyanLevel: printerStatus.toners.cyan?.level, + tonerMagentaLevel: printerStatus.toners.magenta?.level, + tonerYellowLevel: printerStatus.toners.yellow?.level + } } } - } - }) + }) }) } @@ -119,6 +120,23 @@ export class PrinterStatusService { }) } + static getPrinterSerialNumber(ip: string): Promise { + 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 { return new Promise((resolve, reject) => { const session = snmp.createSession(this.printer.ip, 'public')