Initial commit
This commit is contained in:
parent
809200a451
commit
aa41351185
86
dist/Printer.mjs
vendored
Normal file
86
dist/Printer.mjs
vendored
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
const printerObjectIDConfigs = [
|
||||||
|
{
|
||||||
|
model: 'm3655idn',
|
||||||
|
objectIds: {
|
||||||
|
model: '1.3.6.1.2.1.25.3.2.1.3.1',
|
||||||
|
serial: '1.3.6.1.2.1.43.5.1.1.17.1',
|
||||||
|
counter: '1.3.6.1.4.1.1347.43.10.1.1.12.1.1',
|
||||||
|
toners: {
|
||||||
|
black: {
|
||||||
|
current: '1.3.6.1.2.1.43.11.1.1.9.1.1',
|
||||||
|
max: '1.3.6.1.2.1.43.11.1.1.8.1.1',
|
||||||
|
model: '1.3.6.1.2.1.43.11.1.1.6.1.1'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
model: 'p6235cdn',
|
||||||
|
objectIds: {
|
||||||
|
model: '1.3.6.1.2.1.25.3.2.1.3.1',
|
||||||
|
serial: '1.3.6.1.2.1.43.5.1.1.17.1',
|
||||||
|
counter: '1.3.6.1.4.1.1347.43.10.1.1.12.1.1',
|
||||||
|
toners: {
|
||||||
|
black: {
|
||||||
|
current: '1.3.6.1.2.1.43.11.1.1.9.1.4',
|
||||||
|
max: '1.3.6.1.2.1.43.11.1.1.8.1.4',
|
||||||
|
model: '1.3.6.1.2.1.43.11.1.1.6.1.4'
|
||||||
|
},
|
||||||
|
cyan: {
|
||||||
|
current: '1.3.6.1.2.1.43.11.1.1.9.1.1',
|
||||||
|
max: '1.3.6.1.2.1.43.11.1.1.8.1.1',
|
||||||
|
model: '1.3.6.1.2.1.43.11.1.1.6.1.1'
|
||||||
|
},
|
||||||
|
magenta: {
|
||||||
|
current: '1.3.6.1.2.1.43.11.1.1.9.1.2',
|
||||||
|
max: '1.3.6.1.2.1.43.11.1.1.8.1.2',
|
||||||
|
model: '1.3.6.1.2.1.43.11.1.1.6.1.2'
|
||||||
|
},
|
||||||
|
yellow: {
|
||||||
|
current: '1.3.6.1.2.1.43.11.1.1.9.1.3',
|
||||||
|
max: '1.3.6.1.2.1.43.11.1.1.8.1.3',
|
||||||
|
model: '1.3.6.1.2.1.43.11.1.1.6.1.3'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
model: 'm2040dn',
|
||||||
|
objectIds: {
|
||||||
|
model: '1.3.6.1.2.1.25.3.2.1.3.1',
|
||||||
|
serial: '1.3.6.1.2.1.43.5.1.1.17.1',
|
||||||
|
counter: '1.3.6.1.4.1.1347.43.10.1.1.12.1.1',
|
||||||
|
toners: {
|
||||||
|
black: {
|
||||||
|
current: '1.3.6.1.2.1.43.11.1.1.9.1.1',
|
||||||
|
max: '1.3.6.1.2.1.43.11.1.1.8.1.1',
|
||||||
|
model: '1.3.6.1.2.1.43.11.1.1.6.1.1'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
export class Printer {
|
||||||
|
constructor(name, ip, model) {
|
||||||
|
this.name = name;
|
||||||
|
this.ip = ip;
|
||||||
|
this.model = model;
|
||||||
|
this.objectIds = printerObjectIDConfigs.find(x => x.model === model).objectIds;
|
||||||
|
}
|
||||||
|
oIDsArray() {
|
||||||
|
const oIDsArray = [];
|
||||||
|
function extractObjValues(obj) {
|
||||||
|
for (let key in obj) {
|
||||||
|
if (typeof obj[key] === 'object') {
|
||||||
|
extractObjValues(obj[key]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const oID = obj[key];
|
||||||
|
oIDsArray.push(oID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
extractObjValues(this.objectIds);
|
||||||
|
return oIDsArray;
|
||||||
|
}
|
||||||
|
}
|
7
dist/index.js
vendored
Normal file
7
dist/index.js
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
import express from 'express';
|
||||||
|
const app = express();
|
||||||
|
const port = 3000;
|
||||||
|
app.get('/', (req, res) => { });
|
||||||
|
app.listen(port, () => {
|
||||||
|
console.log(`http://localhost:${port}`);
|
||||||
|
});
|
27
dist/printers.mjs
vendored
Normal file
27
dist/printers.mjs
vendored
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
export const printers = [
|
||||||
|
{
|
||||||
|
name: 'p04',
|
||||||
|
ip: '10.7.0.134',
|
||||||
|
model: 'm3655idn'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'p05',
|
||||||
|
ip: '10.7.0.135',
|
||||||
|
model: 'm2040dn'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'p06',
|
||||||
|
ip: '10.7.0.136',
|
||||||
|
model: 'm2040dn'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'p07',
|
||||||
|
ip: '10.7.0.137',
|
||||||
|
model: 'm2040dn'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'p08',
|
||||||
|
ip: '10.7.0.138',
|
||||||
|
model: 'p6235cdn'
|
||||||
|
}
|
||||||
|
];
|
1
dist/types.mjs
vendored
Normal file
1
dist/types.mjs
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
export {};
|
26
package-lock.json
generated
26
package-lock.json
generated
|
@ -10,7 +10,8 @@
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"body-parser": "^1.20.2",
|
"body-parser": "^1.20.2",
|
||||||
"express": "^4.18.2"
|
"express": "^4.18.2",
|
||||||
|
"net-snmp": "^3.9.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/express": "^4.17.17",
|
"@types/express": "^4.17.17",
|
||||||
|
@ -297,6 +298,11 @@
|
||||||
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
|
||||||
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
|
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
|
||||||
},
|
},
|
||||||
|
"node_modules/asn1-ber": {
|
||||||
|
"version": "1.2.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/asn1-ber/-/asn1-ber-1.2.2.tgz",
|
||||||
|
"integrity": "sha512-CbNem/7hxrjSiOAOOTX4iZxu+0m3jiLqlsERQwwPM1IDR/22M8IPpA1VVndCLw5KtjRYyRODbvAEIfuTogNDng=="
|
||||||
|
},
|
||||||
"node_modules/available-typed-arrays": {
|
"node_modules/available-typed-arrays": {
|
||||||
"version": "1.0.5",
|
"version": "1.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
|
||||||
|
@ -1655,6 +1661,15 @@
|
||||||
"node": ">= 0.6"
|
"node": ">= 0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/net-snmp": {
|
||||||
|
"version": "3.9.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/net-snmp/-/net-snmp-3.9.3.tgz",
|
||||||
|
"integrity": "sha512-d2QjmDu7qs7QrgI8WuzALoARpOhzX4dQX/E5XY/P8zQhBga3QCRZqoJ5Tt1yFxkNFL2D+NFPvbT4LrAur754yg==",
|
||||||
|
"dependencies": {
|
||||||
|
"asn1-ber": "^1.2.1",
|
||||||
|
"smart-buffer": "^4.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/nice-try": {
|
"node_modules/nice-try": {
|
||||||
"version": "1.0.5",
|
"version": "1.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
|
||||||
|
@ -2208,6 +2223,15 @@
|
||||||
"semver": "bin/semver.js"
|
"semver": "bin/semver.js"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/smart-buffer": {
|
||||||
|
"version": "4.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
|
||||||
|
"integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 6.0.0",
|
||||||
|
"npm": ">= 3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/spdx-correct": {
|
"node_modules/spdx-correct": {
|
||||||
"version": "3.2.0",
|
"version": "3.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
|
||||||
|
|
|
@ -8,8 +8,7 @@
|
||||||
"clean": "rimraf ./dist",
|
"clean": "rimraf ./dist",
|
||||||
"build": "npm run clean && tsc",
|
"build": "npm run clean && tsc",
|
||||||
"start": "node src",
|
"start": "node src",
|
||||||
"local": "ts-node-esm ./src/index.ts",
|
"dev": "nodemon --ext js,ts,mts,mjs ./src/index.ts --exec ts-node-esm"
|
||||||
"dev": "nodemon src -e ts,json --exec 'npm run local'"
|
|
||||||
},
|
},
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
"author": "",
|
"author": "",
|
||||||
|
@ -25,6 +24,7 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"body-parser": "^1.20.2",
|
"body-parser": "^1.20.2",
|
||||||
"express": "^4.18.2"
|
"express": "^4.18.2",
|
||||||
|
"net-snmp": "^3.9.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
219
src/Printer.mts
Normal file
219
src/Printer.mts
Normal file
|
@ -0,0 +1,219 @@
|
||||||
|
import {
|
||||||
|
PrinterInfo,
|
||||||
|
PrinterModel,
|
||||||
|
PrinterObjectIDConfig,
|
||||||
|
PrinterObjectIDs,
|
||||||
|
Varbind,
|
||||||
|
VarbindString
|
||||||
|
} from './types.mjs'
|
||||||
|
|
||||||
|
import snmp from 'net-snmp'
|
||||||
|
|
||||||
|
const printerObjectIDConfigs: PrinterObjectIDConfig[] = [
|
||||||
|
{
|
||||||
|
model: 'm3655idn',
|
||||||
|
objectIds: {
|
||||||
|
model: '1.3.6.1.2.1.25.3.2.1.3.1',
|
||||||
|
serial: '1.3.6.1.2.1.43.5.1.1.17.1',
|
||||||
|
counter: '1.3.6.1.4.1.1347.43.10.1.1.12.1.1',
|
||||||
|
toners: {
|
||||||
|
black: {
|
||||||
|
current: '1.3.6.1.2.1.43.11.1.1.9.1.1',
|
||||||
|
max: '1.3.6.1.2.1.43.11.1.1.8.1.1',
|
||||||
|
model: '1.3.6.1.2.1.43.11.1.1.6.1.1'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
model: 'p6235cdn',
|
||||||
|
objectIds: {
|
||||||
|
model: '1.3.6.1.2.1.25.3.2.1.3.1',
|
||||||
|
serial: '1.3.6.1.2.1.43.5.1.1.17.1',
|
||||||
|
counter: '1.3.6.1.4.1.1347.43.10.1.1.12.1.1',
|
||||||
|
toners: {
|
||||||
|
black: {
|
||||||
|
current: '1.3.6.1.2.1.43.11.1.1.9.1.4',
|
||||||
|
max: '1.3.6.1.2.1.43.11.1.1.8.1.4',
|
||||||
|
model: '1.3.6.1.2.1.43.11.1.1.6.1.4'
|
||||||
|
},
|
||||||
|
cyan: {
|
||||||
|
current: '1.3.6.1.2.1.43.11.1.1.9.1.1',
|
||||||
|
max: '1.3.6.1.2.1.43.11.1.1.8.1.1',
|
||||||
|
model: '1.3.6.1.2.1.43.11.1.1.6.1.1'
|
||||||
|
},
|
||||||
|
magenta: {
|
||||||
|
current: '1.3.6.1.2.1.43.11.1.1.9.1.2',
|
||||||
|
max: '1.3.6.1.2.1.43.11.1.1.8.1.2',
|
||||||
|
model: '1.3.6.1.2.1.43.11.1.1.6.1.2'
|
||||||
|
},
|
||||||
|
yellow: {
|
||||||
|
current: '1.3.6.1.2.1.43.11.1.1.9.1.3',
|
||||||
|
max: '1.3.6.1.2.1.43.11.1.1.8.1.3',
|
||||||
|
model: '1.3.6.1.2.1.43.11.1.1.6.1.3'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
model: 'm2040dn',
|
||||||
|
objectIds: {
|
||||||
|
model: '1.3.6.1.2.1.25.3.2.1.3.1',
|
||||||
|
serial: '1.3.6.1.2.1.43.5.1.1.17.1',
|
||||||
|
counter: '1.3.6.1.4.1.1347.43.10.1.1.12.1.1',
|
||||||
|
toners: {
|
||||||
|
black: {
|
||||||
|
current: '1.3.6.1.2.1.43.11.1.1.9.1.1',
|
||||||
|
max: '1.3.6.1.2.1.43.11.1.1.8.1.1',
|
||||||
|
model: '1.3.6.1.2.1.43.11.1.1.6.1.1'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
export class Printer {
|
||||||
|
constructor(name: string, ip: string, model: PrinterModel) {
|
||||||
|
this.name = name
|
||||||
|
this.ip = ip
|
||||||
|
this.model = model
|
||||||
|
|
||||||
|
const objectIds = printerObjectIDConfigs.find(
|
||||||
|
x => x.model === model
|
||||||
|
)?.objectIds
|
||||||
|
|
||||||
|
if (!objectIds) throw new Error(`No objectIds found for model ${model}`)
|
||||||
|
|
||||||
|
this.objectIds = objectIds
|
||||||
|
|
||||||
|
this.getPrinterInfo()
|
||||||
|
}
|
||||||
|
|
||||||
|
name: string
|
||||||
|
ip: string
|
||||||
|
model: PrinterModel
|
||||||
|
objectIds: PrinterObjectIDs
|
||||||
|
|
||||||
|
private oIDsArray(): string[] {
|
||||||
|
const oIDsArray: string[] = []
|
||||||
|
function extractObjValues(obj: any) {
|
||||||
|
for (let key in obj) {
|
||||||
|
if (typeof obj[key] === 'object') {
|
||||||
|
extractObjValues(obj[key])
|
||||||
|
} else {
|
||||||
|
const oID = obj[key]
|
||||||
|
oIDsArray.push(oID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extractObjValues(this.objectIds)
|
||||||
|
|
||||||
|
return oIDsArray
|
||||||
|
}
|
||||||
|
|
||||||
|
private deBufferizeVarbinds(varbinds: Varbind[]) {
|
||||||
|
const varbindsString: VarbindString[] = []
|
||||||
|
|
||||||
|
varbinds.forEach((varbind: Varbind) => {
|
||||||
|
if (varbind.value instanceof Buffer)
|
||||||
|
varbindsString.push({ ...varbind, value: varbind.value.toString() })
|
||||||
|
else varbindsString.push({ ...varbind, value: varbind.value })
|
||||||
|
})
|
||||||
|
|
||||||
|
return varbindsString
|
||||||
|
}
|
||||||
|
|
||||||
|
private calcTonerLevelPercentage(
|
||||||
|
current: string | undefined,
|
||||||
|
max: string | undefined
|
||||||
|
) {
|
||||||
|
if (typeof current === 'undefined' || typeof max === 'undefined')
|
||||||
|
throw new Error('current or max is undefined')
|
||||||
|
|
||||||
|
return (+current! / +max!) * 100
|
||||||
|
}
|
||||||
|
|
||||||
|
private objectIDsToPrinterInfo(varbinds: Varbind[]) {
|
||||||
|
const snmpInfo = this.deBufferizeVarbinds(varbinds)
|
||||||
|
|
||||||
|
const printerInfo: PrinterInfo = {
|
||||||
|
name: this.name,
|
||||||
|
ip: this.ip,
|
||||||
|
model: snmpInfo.find(x => x.oid === this.objectIds.model)
|
||||||
|
?.value as string,
|
||||||
|
serial: snmpInfo.find(x => x.oid === this.objectIds.serial)
|
||||||
|
?.value as string,
|
||||||
|
counter: snmpInfo.find(x => x.oid === this.objectIds.counter)
|
||||||
|
?.value as string,
|
||||||
|
toners: {
|
||||||
|
black: {
|
||||||
|
level: this.calcTonerLevelPercentage(
|
||||||
|
snmpInfo.find(x => x.oid === this.objectIds.toners.black.current)
|
||||||
|
?.value,
|
||||||
|
snmpInfo.find(x => x.oid === this.objectIds.toners.black.max)?.value
|
||||||
|
),
|
||||||
|
model: snmpInfo.find(x => x.oid === this.objectIds.toners.black.model)
|
||||||
|
?.value as string
|
||||||
|
},
|
||||||
|
cyan: this.objectIds.toners.cyan
|
||||||
|
? {
|
||||||
|
level: this.calcTonerLevelPercentage(
|
||||||
|
snmpInfo.find(
|
||||||
|
x => x.oid === this.objectIds.toners.cyan?.current
|
||||||
|
)?.value,
|
||||||
|
snmpInfo.find(x => x.oid === this.objectIds.toners.cyan?.max)
|
||||||
|
?.value
|
||||||
|
),
|
||||||
|
model: snmpInfo.find(
|
||||||
|
x => x.oid === this.objectIds.toners.cyan?.model
|
||||||
|
)?.value as string
|
||||||
|
}
|
||||||
|
: undefined,
|
||||||
|
magenta: this.objectIds.toners.magenta
|
||||||
|
? {
|
||||||
|
level: this.calcTonerLevelPercentage(
|
||||||
|
snmpInfo.find(
|
||||||
|
x => x.oid === this.objectIds.toners.magenta?.current
|
||||||
|
)?.value,
|
||||||
|
snmpInfo.find(x => x.oid === this.objectIds.toners.magenta?.max)
|
||||||
|
?.value
|
||||||
|
),
|
||||||
|
model: snmpInfo.find(
|
||||||
|
x => x.oid === this.objectIds.toners.magenta?.model
|
||||||
|
)?.value as string
|
||||||
|
}
|
||||||
|
: undefined,
|
||||||
|
yellow: this.objectIds.toners.yellow
|
||||||
|
? {
|
||||||
|
level: this.calcTonerLevelPercentage(
|
||||||
|
snmpInfo.find(
|
||||||
|
x => x.oid === this.objectIds.toners.yellow?.current
|
||||||
|
)?.value,
|
||||||
|
snmpInfo.find(x => x.oid === this.objectIds.toners.yellow?.max)
|
||||||
|
?.value
|
||||||
|
),
|
||||||
|
model: snmpInfo.find(
|
||||||
|
x => x.oid === this.objectIds.toners.yellow?.model
|
||||||
|
)?.value as string
|
||||||
|
}
|
||||||
|
: undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return printerInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
async getPrinterInfo(): Promise<PrinterInfo> {
|
||||||
|
const session = snmp.createSession(this.ip, 'public')
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
session.get(this.oIDsArray(), (error, varbinds) => {
|
||||||
|
const varbindsString = this.deBufferizeVarbinds(varbinds)
|
||||||
|
const info = this.objectIDsToPrinterInfo(varbindsString)
|
||||||
|
|
||||||
|
resolve(info)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
29
src/index.ts
29
src/index.ts
|
@ -1,10 +1,35 @@
|
||||||
import express from 'express'
|
import express from 'express'
|
||||||
|
import { printersDB } from './printers.mjs'
|
||||||
|
import { Printer } from './Printer.mjs'
|
||||||
|
import { PrinterInfo } from './types.mjs'
|
||||||
|
|
||||||
const app = express()
|
const app = express()
|
||||||
const port = 3000
|
const port = 3000
|
||||||
|
|
||||||
app.get('/', (req, res) => {
|
const printers: Printer[] = printersDB.map(
|
||||||
res.send('Hello World!')
|
printer => new Printer(printer.name, printer.ip, printer.model)
|
||||||
|
)
|
||||||
|
|
||||||
|
app.get('/', async (req, res) => {
|
||||||
|
const printersInfo: PrinterInfo[] = await Promise.all(
|
||||||
|
printers.map(printer => printer.getPrinterInfo())
|
||||||
|
)
|
||||||
|
|
||||||
|
res.send(printersInfo)
|
||||||
|
})
|
||||||
|
|
||||||
|
app.get('/:printerName', async (req, res) => {
|
||||||
|
const printerName = req.params.printerName
|
||||||
|
const printer = printers.find(printer => printer.name === printerName)
|
||||||
|
|
||||||
|
if (!printer) {
|
||||||
|
res.status(404).send('Printer not found')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const printerInfo: PrinterInfo = await printer.getPrinterInfo()
|
||||||
|
|
||||||
|
res.send(printerInfo)
|
||||||
})
|
})
|
||||||
|
|
||||||
app.listen(port, () => {
|
app.listen(port, () => {
|
||||||
|
|
29
src/printers.mts
Normal file
29
src/printers.mts
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
import { Printer } from './types.mjs'
|
||||||
|
|
||||||
|
export const printersDB: Printer[] = [
|
||||||
|
{
|
||||||
|
name: 'p04',
|
||||||
|
ip: '10.7.0.134',
|
||||||
|
model: 'm3655idn'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'p05',
|
||||||
|
ip: '10.7.0.135',
|
||||||
|
model: 'm2040dn'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'p06',
|
||||||
|
ip: '10.7.0.136',
|
||||||
|
model: 'm2040dn'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'p07',
|
||||||
|
ip: '10.7.0.137',
|
||||||
|
model: 'm2040dn'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'p08',
|
||||||
|
ip: '10.7.0.138',
|
||||||
|
model: 'p6235cdn'
|
||||||
|
}
|
||||||
|
]
|
78
src/types.mts
Normal file
78
src/types.mts
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
export type PrinterModel = 'm3655idn' | 'm2040dn' | 'p6235cdn'
|
||||||
|
|
||||||
|
export type PrinterObjectIDs = {
|
||||||
|
model: string
|
||||||
|
serial: string
|
||||||
|
counter: string
|
||||||
|
toners: {
|
||||||
|
black: {
|
||||||
|
current: string
|
||||||
|
max: string
|
||||||
|
model: string
|
||||||
|
}
|
||||||
|
cyan?: {
|
||||||
|
current: string
|
||||||
|
max: string
|
||||||
|
model: string
|
||||||
|
}
|
||||||
|
magenta?: {
|
||||||
|
current: string
|
||||||
|
max: string
|
||||||
|
model: string
|
||||||
|
}
|
||||||
|
yellow?: {
|
||||||
|
current: string
|
||||||
|
max: string
|
||||||
|
model: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export type PrinterObjectIDConfig = {
|
||||||
|
model: PrinterModel
|
||||||
|
objectIds: PrinterObjectIDs
|
||||||
|
}
|
||||||
|
|
||||||
|
export type PrinterInfo = {
|
||||||
|
name: string
|
||||||
|
ip: string
|
||||||
|
model: string
|
||||||
|
serial: string
|
||||||
|
counter: string
|
||||||
|
toners: {
|
||||||
|
black: {
|
||||||
|
level: number
|
||||||
|
model: string
|
||||||
|
}
|
||||||
|
cyan?: {
|
||||||
|
level: number
|
||||||
|
model: string
|
||||||
|
}
|
||||||
|
magenta?: {
|
||||||
|
level: number
|
||||||
|
model: string
|
||||||
|
}
|
||||||
|
yellow?: {
|
||||||
|
level: number
|
||||||
|
model: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export type Printer = {
|
||||||
|
name: string
|
||||||
|
ip: string
|
||||||
|
model: PrinterModel
|
||||||
|
}
|
||||||
|
|
||||||
|
export type Varbind = {
|
||||||
|
oid: string
|
||||||
|
type: number
|
||||||
|
value: string | Buffer
|
||||||
|
}
|
||||||
|
|
||||||
|
export type VarbindString = {
|
||||||
|
oid: string
|
||||||
|
type: number
|
||||||
|
value: string
|
||||||
|
}
|
|
@ -35,7 +35,7 @@
|
||||||
// "types": [], /* Specify type package names to be included without being referenced in a source file. */
|
// "types": [], /* Specify type package names to be included without being referenced in a source file. */
|
||||||
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
|
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
|
||||||
// "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
|
// "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
|
||||||
// "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */
|
// "allowImportingTsExtensions": true /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */,
|
||||||
// "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */
|
// "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */
|
||||||
// "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */
|
// "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */
|
||||||
// "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */
|
// "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */
|
||||||
|
@ -83,7 +83,7 @@
|
||||||
|
|
||||||
/* Type Checking */
|
/* Type Checking */
|
||||||
"strict": true /* Enable all strict type-checking options. */,
|
"strict": true /* Enable all strict type-checking options. */,
|
||||||
"noImplicitAny": true /* Enable error reporting for expressions and declarations with an implied 'any' type. */,
|
"noImplicitAny": false /* Enable error reporting for expressions and declarations with an implied 'any' type. */,
|
||||||
// "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
|
// "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
|
||||||
// "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
|
// "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
|
||||||
// "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
|
// "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
|
||||||
|
@ -91,7 +91,7 @@
|
||||||
// "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */
|
// "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */
|
||||||
// "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
|
// "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
|
||||||
// "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
|
// "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
|
||||||
// "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */
|
"noUnusedLocals": true /* Enable error reporting when local variables aren't read. */,
|
||||||
// "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
|
// "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
|
||||||
// "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
|
// "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
|
||||||
// "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
|
// "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user