aboutsummaryrefslogtreecommitdiff
path: root/node_modules/systeminformation/lib/printer.js
diff options
context:
space:
mode:
authorMinteck <contact@minteck.org>2022-07-05 13:40:01 +0200
committerMinteck <contact@minteck.org>2022-07-05 13:40:01 +0200
commitb74e9708f0adcc5c80095e432e8051b01b6255d9 (patch)
treee4d2fec7ac3718f97966b10f7dc12a2b4d36d115 /node_modules/systeminformation/lib/printer.js
downloadstrawberry-boot-mane.tar.gz
strawberry-boot-mane.tar.bz2
strawberry-boot-mane.zip
Initial commitHEADmane
Diffstat (limited to 'node_modules/systeminformation/lib/printer.js')
-rw-r--r--node_modules/systeminformation/lib/printer.js212
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;