-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathindex.js
More file actions
200 lines (152 loc) · 5.77 KB
/
Copy pathindex.js
File metadata and controls
200 lines (152 loc) · 5.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
const express = require('express')
const bodyParser = require('body-parser')
const fs = require('fs')
const Printer = require('ipp-printer')
const snmp = require('snmpjs')
const os = require('os')
const MIB_OID_HOSTNAME = ".1.3.6.1.2.1.1.5"
const MIB_OID_DEVICE_STATE = ".1.3.6.1.2.1.25.3.2.1.5"
const MIB_OID_PRINTER_STATE = ".1.3.6.1.2.1.25.3.5.1.1"
const MIB_OID_INPUT_LEVELS = ".1.3.6.1.2.1.43.8.2.1.10.1"
const MIB_OID_INPUT_NAMES = ".1.3.6.1.2.1.43.8.2.1.18.1"
const MIB_OID_MARKER_NAMES = ".1.3.6.1.2.1.43.11.1.1.6.1"
const MIB_OID_MARKER_LEVELS = ".1.3.6.1.2.1.43.11.1.1.9.1"
const MIB_OID_ALERTS = ".1.3.6.1.2.1.43.18.1.1"
const ipp_port = 9100
const snmp_port = 161
const web_port = 5000
const printer = new Printer({
name: 'PrinterSim',
port: ipp_port,
zeroconf: false,
fallback: true
})
const agent = snmp.createAgent()
const app = express()
var is_printing = false
var has_ink = true
var has_paper = true
var jobs = []
printer.on('job', function (job) {
console.log('Received Print Job')
job.attributes().forEach(function(attribute) {
console.log(attribute.name + "=" + attribute.value)
}, this);
is_printing = true
var job_id = job.id
printjob = {
"id": job_id ,
"name": job.name,
"href": "#",
"status": "Downloading"
}
jobs.push(printjob)
var filename = 'job-' + job.id + '.ps'
var file = fs.createWriteStream('public/printjobs/' + filename)
job.on('end', function () {
var job = jobs[job_id - 1]
job.status = "Printed"
job.href = 'printjobs/' + filename
console.log('written job to', filename)
is_printing = false
})
job.pipe(file)
})
printer.on('error', function(error) {
console.log("Error: " + error)
})
agent.request({ oid: MIB_OID_HOSTNAME, handler: function (prq) {
var nodename = os.hostname();
var val = snmp.data.createData({ type: 'OctetString', value: nodename });
snmp.provider.readOnlyScalar(prq, val);
}});
agent.request({ oid: MIB_OID_PRINTER_STATE, handler: function (prq) {
var MIB_PRINTER_STATE_IDLE = 3
var MIB_PRINTER_STATE_PRINTING = 4
var val = snmp.data.createData({ type: 'Integer', value: (is_printing) ? MIB_PRINTER_STATE_PRINTING : MIB_PRINTER_STATE_IDLE });
snmp.provider.readOnlyScalar(prq, val);
}});
agent.request({ oid: MIB_OID_DEVICE_STATE, handler: function (prq) {
var MIB_DEVICE_STATE_RUNNING = 2
var val = snmp.data.createData({ type: 'Integer', value: MIB_DEVICE_STATE_RUNNING });
snmp.provider.readOnlyScalar(prq, val);
}});
agent.request({ oid: MIB_OID_MARKER_NAMES + ".1", handler: function (prq) {
var val = snmp.data.createData({ type: 'OctetString', value:"Ink"});
snmp.provider.readOnlyScalar(prq, val);
}});
agent.request({ oid: MIB_OID_MARKER_LEVELS + ".1", handler: function (prq) {
var val = snmp.data.createData({ type: 'Integer', value: (has_ink) ? 100 : 0});
snmp.provider.readOnlyScalar(prq, val);
}});
agent.request({ oid: MIB_OID_INPUT_NAMES + ".1", handler: function (prq) {
var val = snmp.data.createData({ type: 'OctetString', value:"Input Tray"});
snmp.provider.readOnlyScalar(prq, val);
}});
agent.request({ oid: MIB_OID_INPUT_LEVELS + ".1", handler: function (prq) {
var val = snmp.data.createData({ type: 'Integer', value: (has_paper) ? -3 : 0});
snmp.provider.readOnlyScalar(prq, val);
}});
agent.request({ oid: MIB_OID_ALERTS + ".1", handler: function (prq) {
var val = snmp.data.createData({ type: 'OctetString', value: "0"});
snmp.provider.readOnlyScalar(prq, val);
}});
agent.request({ oid: MIB_OID_ALERTS + ".2", handler: function (prq) {
var val = snmp.data.createData({ type: 'OctetString', value: "0"});
snmp.provider.readOnlyScalar(prq, val);
}});
agent.request({ oid: MIB_OID_ALERTS + ".3", handler: function (prq) {
var val = snmp.data.createData({ type: 'OctetString', value: "0"});
snmp.provider.readOnlyScalar(prq, val);
}});
agent.request({ oid: MIB_OID_ALERTS + ".4", handler: function (prq) {
var val = snmp.data.createData({ type: 'OctetString', value: "0"});
snmp.provider.readOnlyScalar(prq, val);
}});
agent.request({ oid: MIB_OID_ALERTS + ".5", handler: function (prq) {
var val = snmp.data.createData({ type: 'OctetString', value: "0"});
snmp.provider.readOnlyScalar(prq, val);
}});
agent.request({ oid: MIB_OID_ALERTS + ".6", handler: function (prq) {
var val = snmp.data.createData({ type: 'OctetString', value: "0"});
snmp.provider.readOnlyScalar(prq, val);
}});
agent.request({ oid: MIB_OID_ALERTS + ".7", handler: function (prq) {
var val = snmp.data.createData({ type: 'OctetString', value: "0"});
snmp.provider.readOnlyScalar(prq, val);
}});
agent.request({ oid: MIB_OID_ALERTS + ".8", handler: function (prq) {
var val = snmp.data.createData({ type: 'OctetString', value: "0"});
snmp.provider.readOnlyScalar(prq, val);
}});
// Some clients get confused by the standard end of mib response sent by snmpjs, this is a workaround
const MIB_OID_END_OF_VIEW = ".1.3.6.1.2.1.43.99.1.1.9.1"
agent.request({ oid: MIB_OID_END_OF_VIEW, handler: function (prq) {
var val = snmp.data.createData({ type: 'OctetString', value: "0" });
snmp.provider.readOnlyScalar(prq, val);
}});
agent.bind({ family: 'udp4', port: snmp_port });
app.use(bodyParser.json())
app.use(express.static('public'))
app.get('/printer', function (req, res) {
res.send({
'has_ink': has_ink,
'has_paper': has_paper,
'jobs': jobs
})
})
app.post('/printer', function (req, res) {
var json = req.body
has_ink = json.has_ink
has_paper = json.has_paper
res.send({
'has_ink': has_ink,
'has_paper': has_paper,
'jobs': jobs
})
})
app.listen(web_port, function () {
console.log('Frontend listening on port ' + web_port)
})
console.log('IPP listening on port ' + ipp_port)
console.log('SNMP listening on port ' + snmp_port)