UNPKG

13 kBJavaScriptView Raw
1'use strict';
2// @ts-check
3// ==================================================================================
4// index.js
5// ----------------------------------------------------------------------------------
6// Description: System Information - library
7// for Node.js
8// Copyright: (c) 2014 - 2020
9// Author: Sebastian Hildebrandt
10// ----------------------------------------------------------------------------------
11// Contributors: Guillaume Legrain (https://github.com/glegrain)
12// Riccardo Novaglia (https://github.com/richy24)
13// Quentin Busuttil (https://github.com/Buzut)
14// Lapsio (https://github.com/lapsio)
15// csy (https://github.com/csy1983)
16// ----------------------------------------------------------------------------------
17// License: MIT
18// ==================================================================================
19
20// ----------------------------------------------------------------------------------
21// Dependencies
22// ----------------------------------------------------------------------------------
23
24const lib_version = require('../package.json').version;
25const util = require('./util');
26const system = require('./system');
27const osInfo = require('./osinfo');
28const cpu = require('./cpu');
29const memory = require('./memory');
30const battery = require('./battery');
31const graphics = require('./graphics');
32const filesystem = require('./filesystem');
33const network = require('./network');
34const wifi = require('./wifi');
35const processes = require('./processes');
36const users = require('./users');
37const internet = require('./internet');
38const docker = require('./docker');
39const vbox = require('./virtualbox');
40
41let _platform = process.platform;
42const _windows = (_platform === 'win32');
43const _freebsd = (_platform === 'freebsd');
44const _openbsd = (_platform === 'openbsd');
45const _netbsd = (_platform === 'netbsd');
46const _sunos = (_platform === 'sunos');
47
48// ----------------------------------------------------------------------------------
49// init
50// ----------------------------------------------------------------------------------
51
52if (_windows) {
53 util.getCodepage();
54}
55
56// ----------------------------------------------------------------------------------
57// General
58// ----------------------------------------------------------------------------------
59
60function version() {
61 return lib_version;
62}
63
64// ----------------------------------------------------------------------------------
65// Get static and dynamic data (all)
66// ----------------------------------------------------------------------------------
67
68// --------------------------
69// get static data - they should not change until restarted
70
71function getStaticData(callback) {
72
73 return new Promise((resolve) => {
74 process.nextTick(() => {
75
76 let data = {};
77
78 data.version = version();
79
80 Promise.all([
81 system.system(),
82 system.bios(),
83 system.baseboard(),
84 system.chassis(),
85 osInfo.osInfo(),
86 osInfo.uuid(),
87 osInfo.versions(),
88 cpu.cpu(),
89 cpu.cpuFlags(),
90 graphics.graphics(),
91 network.networkInterfaces(),
92 memory.memLayout(),
93 filesystem.diskLayout()
94 ]).then(res => {
95 data.system = res[0];
96 data.bios = res[1];
97 data.baseboard = res[2];
98 data.chassis = res[3];
99 data.os = res[4];
100 data.uuid = res[5];
101 data.versions = res[6];
102 data.cpu = res[7];
103 data.cpu.flags = res[8];
104 data.graphics = res[9];
105 data.net = res[10];
106 data.memLayout = res[11];
107 data.diskLayout = res[12];
108 if (callback) { callback(data); }
109 resolve(data);
110 });
111 });
112 });
113}
114
115
116// --------------------------
117// get all dynamic data - e.g. for monitoring agents
118// may take some seconds to get all data
119// --------------------------
120// 2 additional parameters needed
121// - srv: comma separated list of services to monitor e.g. "mysql, apache, postgresql"
122// - iface: define network interface for which you like to monitor network speed e.g. "eth0"
123
124function getDynamicData(srv, iface, callback) {
125
126 if (util.isFunction(iface)) {
127 callback = iface;
128 iface = '';
129 }
130 if (util.isFunction(srv)) {
131 callback = srv;
132 srv = '';
133 }
134
135 return new Promise((resolve) => {
136 process.nextTick(() => {
137
138 iface = iface || network.getDefaultNetworkInterface();
139 srv = srv || '';
140
141 // use closure to track ƒ completion
142 let functionProcessed = (function () {
143 let totalFunctions = 15;
144 if (_windows) totalFunctions = 11;
145 if (_freebsd || _openbsd || _netbsd) totalFunctions = 11;
146 if (_sunos) totalFunctions = 6;
147
148 return function () {
149 if (--totalFunctions === 0) {
150 if (callback) {
151 callback(data);
152 }
153 resolve(data);
154 }
155 };
156 })();
157
158 // var totalFunctions = 14;
159 // function functionProcessed() {
160 // if (--totalFunctions === 0) {
161 // if (callback) { callback(data) }
162 // resolve(data);
163 // }
164 // }
165
166 let data = {};
167
168 // get time
169 data.time = osInfo.time();
170
171 /**
172 * @namespace
173 * @property {Object} versions
174 * @property {string} versions.node
175 * @property {string} versions.v8
176 */
177 data.node = process.versions.node;
178 data.v8 = process.versions.v8;
179
180 cpu.cpuCurrentspeed().then(res => {
181 data.cpuCurrentspeed = res;
182 functionProcessed();
183 });
184
185 users.users().then(res => {
186 data.users = res;
187 functionProcessed();
188 });
189
190 if (!_windows) {
191 processes.processes().then(res => {
192 data.processes = res;
193 functionProcessed();
194 });
195 }
196
197 cpu.currentLoad().then(res => {
198 data.currentLoad = res;
199 functionProcessed();
200 });
201
202 if (!_sunos) {
203 cpu.cpuTemperature().then(res => {
204 data.temp = res;
205 functionProcessed();
206 });
207 }
208
209 if (!_openbsd && !_freebsd && !_netbsd && !_sunos) {
210 network.networkStats(iface).then(res => {
211 data.networkStats = res;
212 functionProcessed();
213 });
214 }
215
216 if (!_sunos) {
217 network.networkConnections().then(res => {
218 data.networkConnections = res;
219 functionProcessed();
220 });
221 }
222
223 memory.mem().then(res => {
224 data.mem = res;
225 functionProcessed();
226 });
227
228 if (!_sunos) {
229 battery().then(res => {
230 data.battery = res;
231 functionProcessed();
232 });
233 }
234
235 if (!_windows && !_sunos) {
236 processes.services(srv).then(res => {
237 data.services = res;
238 functionProcessed();
239 });
240 }
241
242 if (!_sunos) {
243 filesystem.fsSize().then(res => {
244 data.fsSize = res;
245 functionProcessed();
246 });
247 }
248
249 if (!_windows && !_openbsd && !_freebsd && !_netbsd && !_sunos) {
250 filesystem.fsStats().then(res => {
251 data.fsStats = res;
252 functionProcessed();
253 });
254 }
255
256 if (!_windows && !_openbsd && !_freebsd && !_netbsd && !_sunos) {
257 filesystem.disksIO().then(res => {
258 data.disksIO = res;
259 functionProcessed();
260 });
261 }
262
263 if (!_openbsd && !_freebsd && !_netbsd && !_sunos) {
264 wifi.wifiNetworks().then(res => {
265 data.wifiNetworks = res;
266 functionProcessed();
267 });
268 }
269
270 internet.inetLatency().then(res => {
271 data.inetLatency = res;
272 functionProcessed();
273 });
274 });
275 });
276}
277
278// --------------------------
279// get all data at once
280// --------------------------
281// 2 additional parameters needed
282// - srv: comma separated list of services to monitor e.g. "mysql, apache, postgresql"
283// - iface: define network interface for which you like to monitor network speed e.g. "eth0"
284
285function getAllData(srv, iface, callback) {
286
287 return new Promise((resolve) => {
288 process.nextTick(() => {
289 let data = {};
290
291 if (iface && util.isFunction(iface) && !callback) {
292 callback = iface;
293 iface = '';
294 }
295
296 if (srv && util.isFunction(srv) && !iface && !callback) {
297 callback = srv;
298 srv = '';
299 iface = '';
300 }
301
302 getStaticData().then(res => {
303 data = res;
304 getDynamicData(srv, iface).then(res => {
305 for (let key in res) {
306 if ({}.hasOwnProperty.call(res, key)) {
307 data[key] = res[key];
308 }
309 }
310 if (callback) { callback(data); }
311 resolve(data);
312 });
313 });
314 });
315 });
316}
317
318function get(valueObject, callback) {
319 return new Promise((resolve) => {
320 process.nextTick(() => {
321 const allPromises = Object.keys(valueObject)
322 .filter(func => ({}.hasOwnProperty.call(exports, func)))
323 .map(func => exports[func]());
324
325 Promise.all(allPromises).then(data => {
326 const result = {};
327 let i = 0;
328 for (let key in valueObject) {
329 if ({}.hasOwnProperty.call(valueObject, key) && {}.hasOwnProperty.call(exports, key) && data.length > i) {
330 if (valueObject[key] === '*' || valueObject[key] === 'all') {
331 result[key] = data[i];
332 } else {
333 const keys = valueObject[key].replace(/,/g, ' ').replace(/ +/g, ' ').split(' ');
334 if (Array.isArray(data[i])) {
335 // result is in an array, go through all elements of array and pick only the right ones
336 const partialArray = [];
337 data[i].forEach(element => {
338 const partialRes = {};
339 keys.forEach(k => {
340 if ({}.hasOwnProperty.call(element, k)) {
341 partialRes[k] = element[k];
342 }
343 });
344 partialArray.push(partialRes);
345 });
346 result[key] = partialArray;
347 } else {
348 const partialRes = {};
349 keys.forEach(k => {
350 if ({}.hasOwnProperty.call(data[i], k)) {
351 partialRes[k] = data[i][k];
352 }
353 });
354 result[key] = partialRes;
355 }
356 }
357 i++;
358 }
359 }
360 if (callback) { callback(result); }
361 resolve(result);
362 });
363 });
364 });
365}
366
367function observe(valueObject, interval, callback) {
368 let _data = null;
369
370 const result = setInterval(() => {
371 get(valueObject).then(data => {
372 if (JSON.stringify(_data) !== JSON.stringify(data)) {
373 _data = Object.assign({}, data);
374 callback(data);
375 }
376 });
377 }, interval);
378 return result;
379}
380
381// ----------------------------------------------------------------------------------
382// export all libs
383// ----------------------------------------------------------------------------------
384
385exports.version = version;
386exports.system = system.system;
387exports.bios = system.bios;
388exports.baseboard = system.baseboard;
389exports.chassis = system.chassis;
390
391exports.time = osInfo.time;
392exports.osInfo = osInfo.osInfo;
393exports.versions = osInfo.versions;
394exports.shell = osInfo.shell;
395exports.uuid = osInfo.uuid;
396
397exports.cpu = cpu.cpu;
398exports.cpuFlags = cpu.cpuFlags;
399exports.cpuCache = cpu.cpuCache;
400exports.cpuCurrentspeed = cpu.cpuCurrentspeed;
401exports.cpuTemperature = cpu.cpuTemperature;
402exports.currentLoad = cpu.currentLoad;
403exports.fullLoad = cpu.fullLoad;
404
405exports.mem = memory.mem;
406exports.memLayout = memory.memLayout;
407
408exports.battery = battery;
409
410exports.graphics = graphics.graphics;
411
412exports.fsSize = filesystem.fsSize;
413exports.fsOpenFiles = filesystem.fsOpenFiles;
414exports.blockDevices = filesystem.blockDevices;
415exports.fsStats = filesystem.fsStats;
416exports.disksIO = filesystem.disksIO;
417exports.diskLayout = filesystem.diskLayout;
418
419exports.networkInterfaceDefault = network.networkInterfaceDefault;
420exports.networkGatewayDefault = network.networkGatewayDefault;
421exports.networkInterfaces = network.networkInterfaces;
422exports.networkStats = network.networkStats;
423exports.networkConnections = network.networkConnections;
424
425exports.wifiNetworks = wifi.wifiNetworks;
426
427exports.services = processes.services;
428exports.processes = processes.processes;
429exports.processLoad = processes.processLoad;
430
431exports.users = users.users;
432
433exports.inetChecksite = internet.inetChecksite;
434exports.inetLatency = internet.inetLatency;
435
436exports.dockerInfo = docker.dockerInfo;
437exports.dockerContainers = docker.dockerContainers;
438exports.dockerContainerStats = docker.dockerContainerStats;
439exports.dockerContainerProcesses = docker.dockerContainerProcesses;
440exports.dockerAll = docker.dockerAll;
441
442exports.vboxInfo = vbox.vboxInfo;
443
444exports.getStaticData = getStaticData;
445exports.getDynamicData = getDynamicData;
446exports.getAllData = getAllData;
447exports.get = get;
448exports.observe = observe;
449