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,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?

View File

@ -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()

View File

@ -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)

View File

@ -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<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> {
return new Promise((resolve, reject) => {
const session = snmp.createSession(this.printer.ip, 'public')