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;