diff options
author | Minteck <contact@minteck.org> | 2022-07-05 13:40:01 +0200 |
---|---|---|
committer | Minteck <contact@minteck.org> | 2022-07-05 13:40:01 +0200 |
commit | b74e9708f0adcc5c80095e432e8051b01b6255d9 (patch) | |
tree | e4d2fec7ac3718f97966b10f7dc12a2b4d36d115 /node_modules/systeminformation/lib/printer.js | |
download | strawberry-boot-mane.tar.gz strawberry-boot-mane.tar.bz2 strawberry-boot-mane.zip |
Diffstat (limited to 'node_modules/systeminformation/lib/printer.js')
-rw-r--r-- | node_modules/systeminformation/lib/printer.js | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/node_modules/systeminformation/lib/printer.js b/node_modules/systeminformation/lib/printer.js new file mode 100644 index 0000000..1a6f319 --- /dev/null +++ b/node_modules/systeminformation/lib/printer.js @@ -0,0 +1,212 @@ +'use strict'; +// @ts-check +// ================================================================================== +// printers.js +// ---------------------------------------------------------------------------------- +// Description: System Information - library +// for Node.js +// Copyright: (c) 2014 - 2022 +// Author: Sebastian Hildebrandt +// ---------------------------------------------------------------------------------- +// License: MIT +// ================================================================================== +// 15. printers +// ---------------------------------------------------------------------------------- + +const exec = require('child_process').exec; +// const execSync = require('child_process').execSync; +const util = require('./util'); +// const fs = require('fs'); + +let _platform = process.platform; + +const _linux = (_platform === 'linux' || _platform === 'android'); +const _darwin = (_platform === 'darwin'); +const _windows = (_platform === 'win32'); +const _freebsd = (_platform === 'freebsd'); +const _openbsd = (_platform === 'openbsd'); +const _netbsd = (_platform === 'netbsd'); +const _sunos = (_platform === 'sunos'); + +const winPrinterStatus = { + 1: 'Other', + 2: 'Unknown', + 3: 'Idle', + 4: 'Printing', + 5: 'Warmup', + 6: 'Stopped Printing', + 7: 'Offline', +}; + +function parseLinuxCupsHeader(lines) { + const result = {}; + if (lines && lines.length) { + if (lines[0].indexOf(' CUPS v') > 0) { + const parts = lines[0].split(' CUPS v'); + result.cupsVersion = parts[1]; + } + } + return result; +} + +function parseLinuxCupsPrinter(lines) { + const result = {}; + const printerId = util.getValue(lines, 'PrinterId', ' '); + result.id = printerId ? parseInt(printerId, 10) : null; + result.name = util.getValue(lines, 'Info', ' '); + result.model = lines.length > 0 && lines[0] ? lines[0].split(' ')[0] : ''; + result.uri = util.getValue(lines, 'DeviceURI', ' '); + result.uuid = util.getValue(lines, 'UUID', ' '); + result.status = util.getValue(lines, 'State', ' '); + result.local = util.getValue(lines, 'Location', ' ').toLowerCase().startsWith('local'); + result.default = null; + result.shared = util.getValue(lines, 'Shared', ' ').toLowerCase().startsWith('yes'); + + return result; +} + +function parseLinuxLpstatPrinter(lines, id) { + const result = {}; + result.id = id; + result.name = util.getValue(lines, 'Description', ':', true); + result.model = lines.length > 0 && lines[0] ? lines[0].split(' ')[0] : ''; + result.uri = null; + result.uuid = null; + result.status = lines.length > 0 && lines[0] ? (lines[0].indexOf(' idle') > 0 ? 'idle' : (lines[0].indexOf(' printing') > 0 ? 'printing' : 'unknown')) : null; + result.local = util.getValue(lines, 'Location', ':', true).toLowerCase().startsWith('local'); + result.default = null; + result.shared = util.getValue(lines, 'Shared', ' ').toLowerCase().startsWith('yes'); + + return result; +} + +function parseDarwinPrinters(printerObject, id) { + const result = {}; + const uriParts = printerObject.uri.split('/'); + result.id = id; + result.name = printerObject._name; + result.model = uriParts.length ? uriParts[uriParts.length - 1] : ''; + result.uri = printerObject.uri; + result.uuid = null; + result.status = printerObject.status; + result.local = printerObject.printserver === 'local'; + result.default = printerObject.default === 'yes'; + result.shared = printerObject.shared === 'yes'; + + return result; +} + +function parseWindowsPrinters(lines, id) { + const result = {}; + const status = parseInt(util.getValue(lines, 'PrinterStatus', ':'), 10); + + result.id = id; + result.name = util.getValue(lines, 'name', ':'); + result.model = util.getValue(lines, 'DriverName', ':'); + result.uri = null; + result.uuid = null; + result.status = winPrinterStatus[status] ? winPrinterStatus[status] : null; + result.local = util.getValue(lines, 'Local', ':').toUpperCase() === 'TRUE'; + result.default = util.getValue(lines, 'Default', ':').toUpperCase() === 'TRUE'; + result.shared = util.getValue(lines, 'Shared', ':').toUpperCase() === 'TRUE'; + + return result; +} + +function printer(callback) { + + return new Promise((resolve) => { + process.nextTick(() => { + let result = []; + if (_linux || _freebsd || _openbsd || _netbsd) { + let cmd = 'cat /etc/cups/printers.conf 2>/dev/null'; + exec(cmd, function (error, stdout) { + // printers.conf + if (!error) { + const parts = stdout.toString().split('<Printer '); + const printerHeader = parseLinuxCupsHeader(parts[0]); + for (let i = 1; i < parts.length; i++) { + const printers = parseLinuxCupsPrinter(parts[i].split('\n')); + if (printers.name) { + printers.engine = 'CUPS'; + printers.engineVersion = printerHeader.cupsVersion; + result.push(printers); + } + } + } + if (result.length === 0) { + if (_linux) { + cmd = 'export LC_ALL=C; lpstat -lp 2>/dev/null; unset LC_ALL'; + // lpstat + exec(cmd, function (error, stdout) { + const parts = ('\n' + stdout.toString()).split('\nprinter '); + for (let i = 1; i < parts.length; i++) { + const printers = parseLinuxLpstatPrinter(parts[i].split('\n'), i); + result.push(printers); + } + }); + if (callback) { + callback(result); + } + resolve(result); + } else { + if (callback) { + callback(result); + } + resolve(result); + } + } else { + if (callback) { + callback(result); + } + resolve(result); + } + }); + } + if (_darwin) { + let cmd = 'system_profiler SPPrintersDataType -json'; + exec(cmd, function (error, stdout) { + if (!error) { + try { + const outObj = JSON.parse(stdout.toString()); + if (outObj.SPPrintersDataType && outObj.SPPrintersDataType.length) { + for (let i = 0; i < outObj.SPPrintersDataType.length; i++) { + const printer = parseDarwinPrinters(outObj.SPPrintersDataType[i], i); + result.push(printer); + } + } + } catch (e) { + util.noop(); + } + } + if (callback) { + callback(result); + } + resolve(result); + }); + } + if (_windows) { + util.powerShell('Get-WmiObject Win32_Printer | select PrinterStatus,Name,DriverName,Local,Default,Shared | fl').then((stdout, error) => { + if (!error) { + const parts = stdout.toString().split(/\n\s*\n/); + for (let i = 0; i < parts.length; i++) { + const printer = parseWindowsPrinters(parts[i].split('\n'), i); + if (printer.name || printer.model) { + result.push(parseWindowsPrinters(parts[i].split('\n'), i)); + } + } + } + if (callback) { + callback(result); + } + resolve(result); + }); + } + if (_sunos) { + resolve(null); + } + }); + }); +} + +exports.printer = printer; |