add printer status and job queues to console output #7844
Signed-off-by: si458 <simonsmith5521@gmail.com>
si458 committed
Jun 1, 2026 at 13:14 UTC
398af23e50e67f670bc739b34c336aab1f5e9ec0
1 file changed
+54
-2
agents/meshcore.js
+54
-2
@@ -4529,10 +4529,62 @@ function processConsoleCommand(cmd, args, rights, sessionid) {
4529
if (process.platform != 'win32') {
4530
response = 'Unknown command "printers", type "help" for list of available commands.';
4531
} else {
4532
- var printers = require('win-wmi-fixed').query('ROOT\\CIMV2', 'SELECT * FROM Win32_Printer');
4532
+ var wmi = require('win-wmi-fixed');
4533
+ var printers = wmi.query('ROOT\\CIMV2', 'SELECT * FROM Win32_Printer');
4534
trimResults(printers);
4535
+ var tcpPorts = wmi.query('ROOT\\CIMV2', 'SELECT Name, HostAddress, PortNumber FROM Win32_TCPIPPrinterPort');
4536
+ trimResults(tcpPorts);
4537
+ var portMap = {};
4538
+ for (var j = 0; j < tcpPorts.length; ++j) { portMap[tcpPorts[j].Name] = tcpPorts[j].HostAddress + ':' + tcpPorts[j].PortNumber; }
4539
+ // For vendor ports not covered by Win32_TCPIPPrinterPort, walk the registry under Print\Monitors
4540
+ try {
4541
+ var reg = require('win-registry');
4542
+ var HKLM = reg.HKEY.LocalMachine;
4543
+ var monitorsKey = 'SYSTEM\\CurrentControlSet\\Control\\Print\\Monitors';
4544
+ var monitors = reg.QueryKey(HKLM, monitorsKey);
4545
+ if (monitors && monitors.keys) {
4546
+ for (var m = 0; m < monitors.keys.length; ++m) {
4547
+ var portsKey = monitorsKey + '\\' + monitors.keys[m] + '\\Ports';
4548
+ try {
4549
+ var portsNode = reg.QueryKey(HKLM, portsKey);
4550
+ if (portsNode && portsNode.keys) {
4551
+ for (var p = 0; p < portsNode.keys.length; ++p) {
4552
+ var portName = portsNode.keys[p];
4553
+ if (portMap[portName]) continue;
4554
+ var portKey = portsKey + '\\' + portName;
4555
+ var ip = null;
4556
+ try { ip = reg.QueryKey(HKLM, portKey, 'IPAddress'); } catch (e) {}
4557
+ if (!ip) { try { ip = reg.QueryKey(HKLM, portKey, 'HostName'); } catch (e) {} }
4558
+ if (ip) { portMap[portName] = ip; }
4559
+ }
4560
+ }
4561
+ } catch (e) {}
4562
+ }
4563
+ }
4564
+ } catch (e) {}
4565
+ var printJobs = wmi.query('ROOT\\CIMV2', 'SELECT Name FROM Win32_PrintJob');
4566
+ trimResults(printJobs);
4567
+ var jobCount = {};
4568
+ for (var j = 0; j < printJobs.length; ++j) {
4569
+ var jobPrinter = printJobs[j].Name.split(',')[0];
4570
+ jobCount[jobPrinter] = (jobCount[jobPrinter] || 0) + 1;
4571
+ }
4572
+ var printerStatusMap = { 1: 'Other', 2: 'Unknown', 3: 'Idle', 4: 'Printing', 5: 'Warmup', 6: 'Stopped', 7: 'Offline' };
4573
+ var errorStateMap = { 0: 'Unknown', 1: 'Other', 2: 'No Error', 3: 'Low Paper', 4: 'No Paper', 5: 'Low Toner', 6: 'No Toner', 7: 'Door Open', 8: 'Jammed', 9: 'Offline', 10: 'Service Requested', 11: 'Output Bin Full' };
4574
for (var i = 0; i < printers.length; ++i) {
4535
- sendConsoleText(printers[i].Name + ' - ' + printers[i].PortName, sessionid);
4575
+ var portDesc = portMap[printers[i].PortName];
4576
+ var jobs = jobCount[printers[i].Name] || 0;
4577
+ var status = printerStatusMap[printers[i].PrinterStatus] || 'Unknown';
4578
+ var errors = [];
4579
+ var err = parseInt(printers[i].DetectedErrorState) || 0;
4580
+ if (err > 2) { errors.push(errorStateMap[err] || ('Error ' + err)); }
4581
+ var line = printers[i].Name +
4582
+ ' - ' + printers[i].PortName +
4583
+ (portDesc ? ' (' + portDesc + ')' : '') +
4584
+ ' [' + status + ']' +
4585
+ (errors.length > 0 ? ' [' + errors.join(', ') + ']' : '') +
4586
+ (jobs > 0 ? ' [' + jobs + ' job' + (jobs > 1 ? 's' : '') + ' queued]' : '');
4587
+ sendConsoleText(line, sessionid);
4588
}
4589
}
4590
break;