mirror of
https://github.com/Ylianst/MeshCentral.git
synced 2024-11-25 20:51:23 +03:00
move identifiers to server side to allow future updates (#5641)
* move identifiers to server side to allow future updates Signed-off-by: si458 <simonsmith5521@gmail.com> * add rpi support Signed-off-by: si458 <simonsmith5521@gmail.com> --------- Signed-off-by: si458 <simonsmith5521@gmail.com>
This commit is contained in:
parent
a17fd2f268
commit
bfae0d6c6e
@ -622,7 +622,7 @@ if ((require('fs').existsSync(process.cwd() + 'batterystate.txt')) && (require('
|
||||
else {
|
||||
try {
|
||||
// Setup normal battery monitoring
|
||||
if (require('identifiers').isBatteryPowered && require('identifiers').isBatteryPowered()) {
|
||||
if (require('computer-identifiers').isBatteryPowered && require('computer-identifiers').isBatteryPowered()) {
|
||||
require('MeshAgent')._battLevelChanged = function _battLevelChanged(val) {
|
||||
_battLevelChanged.self._currentBatteryLevel = val;
|
||||
_battLevelChanged.self.SendCommand({ action: 'battery', state: _battLevelChanged.self._currentPowerState, level: val });
|
||||
@ -657,14 +657,14 @@ try { require('os').name().then(function (v) { meshCoreObj.osdesc = v; meshCoreO
|
||||
// Get Volumes and BitLocker if Windows
|
||||
try {
|
||||
if (process.platform == 'win32'){
|
||||
if (require('identifiers').volumes_promise != null){
|
||||
var p = require('identifiers').volumes_promise();
|
||||
if (require('computer-identifiers').volumes_promise != null){
|
||||
var p = require('computer-identifiers').volumes_promise();
|
||||
p.then(function (res){
|
||||
meshCoreObj.volumes = res;
|
||||
meshCoreObjChanged();
|
||||
});
|
||||
}else if (require('identifiers').volumes != null){
|
||||
meshCoreObj.volumes = require('identifiers').volumes();
|
||||
}else if (require('computer-identifiers').volumes != null){
|
||||
meshCoreObj.volumes = require('computer-identifiers').volumes();
|
||||
meshCoreObjChanged();
|
||||
}
|
||||
}
|
||||
@ -1813,7 +1813,7 @@ function onFileWatcher(a, b) {
|
||||
*/
|
||||
|
||||
// Replace all key name spaces with _ in an object recursively.
|
||||
// This is a workaround since require('identifiers').get() returns key names with spaces in them on Linux.
|
||||
// This is a workaround since require('computer-identifiers').get() returns key names with spaces in them on Linux.
|
||||
function replaceSpacesWithUnderscoresRec(o) {
|
||||
if (typeof o != 'object') return;
|
||||
for (var i in o) { if (i.indexOf(' ') >= 0) { o[i.split(' ').join('_')] = o[i]; delete o[i]; } replaceSpacesWithUnderscoresRec(o[i]); }
|
||||
@ -1821,8 +1821,7 @@ function replaceSpacesWithUnderscoresRec(o) {
|
||||
|
||||
function getSystemInformation(func) {
|
||||
try {
|
||||
var results = { hardware: require('identifiers').get() }; // Hardware info
|
||||
|
||||
var results = { hardware: require('computer-identifiers').get() }; // Hardware info
|
||||
if (results.hardware && results.hardware.windows) {
|
||||
// Remove extra entries and things that change quickly
|
||||
var x = results.hardware.windows.osinfo;
|
||||
@ -1873,9 +1872,11 @@ function getSystemInformation(func) {
|
||||
}
|
||||
if(results.hardware && results.hardware.linux) {
|
||||
if (!results.hardware.identifiers['bios_serial']) {
|
||||
if (require('fs').statSync('/sys/class/dmi/id/product_serial').isFile()){
|
||||
results.hardware.identifiers['bios_serial'] = require('fs').readFileSync('/sys/class/dmi/id/product_serial').toString().trim();
|
||||
}
|
||||
try {
|
||||
if (require('fs').statSync('/sys/class/dmi/id/product_serial').isFile()){
|
||||
results.hardware.identifiers['bios_serial'] = require('fs').readFileSync('/sys/class/dmi/id/product_serial').toString().trim();
|
||||
}
|
||||
} catch (ex) { }
|
||||
}
|
||||
if (!results.hardware.identifiers['bios_mode']) {
|
||||
try {
|
||||
@ -1928,9 +1929,9 @@ function getSystemInformation(func) {
|
||||
{
|
||||
results.pendingReboot = require('win-info').pendingReboot(); // Pending reboot
|
||||
|
||||
if (require('identifiers').volumes_promise != null)
|
||||
if (require('computer-identifiers').volumes_promise != null)
|
||||
{
|
||||
var p = require('identifiers').volumes_promise();
|
||||
var p = require('computer-identifiers').volumes_promise();
|
||||
p.then(function (res)
|
||||
{
|
||||
results.hardware.windows.volumes = res;
|
||||
@ -1938,9 +1939,9 @@ function getSystemInformation(func) {
|
||||
func(results);
|
||||
});
|
||||
}
|
||||
else if (require('identifiers').volumes != null)
|
||||
else if (require('computer-identifiers').volumes != null)
|
||||
{
|
||||
results.hardware.windows.volumes = require('identifiers').volumes();
|
||||
results.hardware.windows.volumes = require('computer-identifiers').volumes();
|
||||
results.hash = hasher.syncHash(JSON.stringify(results)).toString('hex');
|
||||
func(results);
|
||||
}
|
||||
@ -4250,7 +4251,7 @@ function processConsoleCommand(cmd, args, rights, sessionid) {
|
||||
}
|
||||
break;
|
||||
case 'vm':
|
||||
response = 'Virtual Machine = ' + require('identifiers').isVM();
|
||||
response = 'Virtual Machine = ' + require('computer-identifiers').isVM();
|
||||
break;
|
||||
case 'startupoptions':
|
||||
response = JSON.stringify(require('MeshAgent').getStartupOptions());
|
||||
|
775
agents/modules_meshcore/computer-identifiers.js
Normal file
775
agents/modules_meshcore/computer-identifiers.js
Normal file
@ -0,0 +1,775 @@
|
||||
/*
|
||||
Copyright 2019-2021 Intel Corporation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
function trimIdentifiers(val)
|
||||
{
|
||||
for(var v in val)
|
||||
{
|
||||
if (!val[v] || val[v] == 'None' || val[v] == '') { delete val[v]; }
|
||||
}
|
||||
}
|
||||
function trimResults(val)
|
||||
{
|
||||
var i, x;
|
||||
for (i = 0; i < val.length; ++i)
|
||||
{
|
||||
for (x in val[i])
|
||||
{
|
||||
if (x.startsWith('_'))
|
||||
{
|
||||
delete val[i][x];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (val[i][x] == null || val[i][x] == 0)
|
||||
{
|
||||
delete val[i][x];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
function brief(headers, obj)
|
||||
{
|
||||
var i, x;
|
||||
for (x = 0; x < obj.length; ++x)
|
||||
{
|
||||
for (i in obj[x])
|
||||
{
|
||||
if (!headers.includes(i))
|
||||
{
|
||||
delete obj[x][i];
|
||||
}
|
||||
}
|
||||
}
|
||||
return (obj);
|
||||
}
|
||||
|
||||
function dataHandler(c)
|
||||
{
|
||||
this.str += c.toString();
|
||||
}
|
||||
|
||||
function linux_identifiers()
|
||||
{
|
||||
var identifiers = {};
|
||||
var ret = {};
|
||||
var values = {};
|
||||
|
||||
if (!require('fs').existsSync('/sys/class/dmi/id')) {
|
||||
if(require('fs').existsSync('/sys/firmware/devicetree/base/model')){
|
||||
if(require('fs').readFileSync('/sys/firmware/devicetree/base/model').toString().trim().startsWith('Raspberry')){
|
||||
identifiers['board_vendor'] = 'Raspberry Pi';
|
||||
identifiers['board_name'] = require('fs').readFileSync('/sys/firmware/devicetree/base/model').toString().trim();
|
||||
identifiers['board_serial'] = require('fs').readFileSync('/sys/firmware/devicetree/base/serial-number').toString().trim();
|
||||
}else{
|
||||
throw('Unknown board');
|
||||
}
|
||||
}else {
|
||||
throw ('this platform does not have DMI statistics');
|
||||
}
|
||||
} else {
|
||||
var entries = require('fs').readdirSync('/sys/class/dmi/id');
|
||||
for(var i in entries)
|
||||
{
|
||||
if (require('fs').statSync('/sys/class/dmi/id/' + entries[i]).isFile())
|
||||
{
|
||||
try
|
||||
{
|
||||
ret[entries[i]] = require('fs').readFileSync('/sys/class/dmi/id/' + entries[i]).toString().trim();
|
||||
}
|
||||
catch(z)
|
||||
{
|
||||
}
|
||||
if (ret[entries[i]] == 'None') { delete ret[entries[i]];}
|
||||
}
|
||||
}
|
||||
entries = null;
|
||||
|
||||
identifiers['bios_date'] = ret['bios_date'];
|
||||
identifiers['bios_vendor'] = ret['bios_vendor'];
|
||||
identifiers['bios_version'] = ret['bios_version'];
|
||||
identifiers['bios_serial'] = ret['product_serial'];
|
||||
identifiers['board_name'] = ret['board_name'];
|
||||
identifiers['board_serial'] = ret['board_serial'];
|
||||
identifiers['board_vendor'] = ret['board_vendor'];
|
||||
identifiers['board_version'] = ret['board_version'];
|
||||
identifiers['product_uuid'] = ret['product_uuid'];
|
||||
identifiers['product_name'] = ret['product_name'];
|
||||
}
|
||||
|
||||
try {
|
||||
identifiers['bios_mode'] = (require('fs').statSync('/sys/firmware/efi').isDirectory() ? 'UEFI': 'Legacy');
|
||||
} catch (ex) { identifiers['bios_mode'] = 'Legacy'; }
|
||||
|
||||
var child = require('child_process').execFile('/bin/sh', ['sh']);
|
||||
child.stdout.str = ''; child.stdout.on('data', dataHandler);
|
||||
child.stdin.write('cat /proc/cpuinfo | grep "model name" | ' + "tr '\\n' ':' | awk -F: '{ print $2 }'\nexit\n");
|
||||
child.waitExit();
|
||||
identifiers['cpu_name'] = child.stdout.str.trim();
|
||||
child = null;
|
||||
|
||||
|
||||
// Fetch GPU info
|
||||
child = require('child_process').execFile('/bin/sh', ['sh']);
|
||||
child.stdout.str = ''; child.stdout.on('data', dataHandler);
|
||||
child.stdin.write("lspci | grep ' VGA ' | tr '\\n' '`' | awk '{ a=split($0,lines" + ',"`"); printf "["; for(i=1;i<a;++i) { split(lines[i],gpu,"r: "); printf "%s\\"%s\\"", (i==1?"":","),gpu[2]; } printf "]"; }\'\nexit\n');
|
||||
child.waitExit();
|
||||
try { identifiers['gpu_name'] = JSON.parse(child.stdout.str.trim()); } catch (xx) { }
|
||||
child = null;
|
||||
|
||||
// Fetch Storage Info
|
||||
child = require('child_process').execFile('/bin/sh', ['sh']);
|
||||
child.stdout.str = ''; child.stdout.on('data', dataHandler);
|
||||
child.stdin.write("lshw -class disk | tr '\\n' '`' | awk '" + '{ len=split($0,lines,"*"); printf "["; for(i=2;i<=len;++i) { model=""; caption=""; size=""; clen=split(lines[i],item,"`"); for(j=2;j<clen;++j) { split(item[j],tokens,":"); split(tokens[1],key," "); if(key[1]=="description") { caption=substr(tokens[2],2); } if(key[1]=="product") { model=substr(tokens[2],2); } if(key[1]=="size") { size=substr(tokens[2],2); } } if(model=="") { model=caption; } if(caption!="" || model!="") { printf "%s{\\"Caption\\":\\"%s\\",\\"Model\\":\\"%s\\",\\"Size\\":\\"%s\\"}",(i==2?"":","),caption,model,size; } } printf "]"; }\'\nexit\n');
|
||||
child.waitExit();
|
||||
try { identifiers['storage_devices'] = JSON.parse(child.stdout.str.trim()); } catch (xx) { }
|
||||
|
||||
values.identifiers = identifiers;
|
||||
values.linux = ret;
|
||||
trimIdentifiers(values.identifiers);
|
||||
child = null;
|
||||
|
||||
var dmidecode = require('lib-finder').findBinary('dmidecode');
|
||||
if (dmidecode != null)
|
||||
{
|
||||
child = require('child_process').execFile('/bin/sh', ['sh']);
|
||||
child.stdout.str = ''; child.stdout.on('data', dataHandler);
|
||||
child.stderr.str = ''; child.stderr.on('data', dataHandler);
|
||||
child.stdin.write(dmidecode + " -t memory | tr '\\n' '`' | ");
|
||||
child.stdin.write(" awk '{ ");
|
||||
child.stdin.write(' printf("[");');
|
||||
child.stdin.write(' comma="";');
|
||||
child.stdin.write(' c=split($0, lines, "``");');
|
||||
child.stdin.write(' for(i=1;i<=c;++i)');
|
||||
child.stdin.write(' {');
|
||||
child.stdin.write(' d=split(lines[i], val, "`");');
|
||||
child.stdin.write(' split(val[1], tokens, ",");');
|
||||
child.stdin.write(' split(tokens[2], dmitype, " ");');
|
||||
child.stdin.write(' dmi = dmitype[3]+0; ');
|
||||
child.stdin.write(' if(dmi == 5 || dmi == 6 || dmi == 16 || dmi == 17)');
|
||||
child.stdin.write(' {');
|
||||
child.stdin.write(' ccx="";');
|
||||
child.stdin.write(' printf("%s{\\"%s\\": {", comma, val[2]);');
|
||||
child.stdin.write(' for(j=3;j<d;++j)');
|
||||
child.stdin.write(' {');
|
||||
child.stdin.write(' sub(/^[ \\t]*/,"",val[j]);');
|
||||
child.stdin.write(' if(split(val[j],tmp,":")>1)');
|
||||
child.stdin.write(' {');
|
||||
child.stdin.write(' sub(/^[ \\t]*/,"",tmp[2]);');
|
||||
child.stdin.write(' gsub(/ /,"",tmp[1]);');
|
||||
child.stdin.write(' printf("%s\\"%s\\": \\"%s\\"", ccx, tmp[1], tmp[2]);');
|
||||
child.stdin.write(' ccx=",";');
|
||||
child.stdin.write(' }');
|
||||
child.stdin.write(' }');
|
||||
child.stdin.write(' printf("}}");');
|
||||
child.stdin.write(' comma=",";');
|
||||
child.stdin.write(' }');
|
||||
child.stdin.write(' }');
|
||||
child.stdin.write(' printf("]");');
|
||||
child.stdin.write("}'\nexit\n");
|
||||
child.waitExit();
|
||||
|
||||
try
|
||||
{
|
||||
var j = JSON.parse(child.stdout.str);
|
||||
var i, key, key2;
|
||||
for (i = 0; i < j.length; ++i)
|
||||
{
|
||||
for (key in j[i])
|
||||
{
|
||||
delete j[i][key]['ArrayHandle'];
|
||||
delete j[i][key]['ErrorInformationHandle'];
|
||||
for (key2 in j[i][key])
|
||||
{
|
||||
if (j[i][key][key2] == 'Unknown' || j[i][key][key2] == 'Not Specified' || j[i][key][key2] == '')
|
||||
{
|
||||
delete j[i][key][key2];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(j.length > 0){
|
||||
var mem = {};
|
||||
for (i = 0; i < j.length; ++i)
|
||||
{
|
||||
for (key in j[i])
|
||||
{
|
||||
if (mem[key] == null) { mem[key] = []; }
|
||||
mem[key].push(j[i][key]);
|
||||
}
|
||||
}
|
||||
values.linux.memory = mem;
|
||||
}
|
||||
}
|
||||
catch (e)
|
||||
{ }
|
||||
child = null;
|
||||
}
|
||||
|
||||
var usbdevices = require('lib-finder').findBinary('usb-devices');
|
||||
if (usbdevices != null)
|
||||
{
|
||||
var child = require('child_process').execFile('/bin/sh', ['sh']);
|
||||
child.stdout.str = ''; child.stdout.on('data', dataHandler);
|
||||
child.stderr.str = ''; child.stderr.on('data', dataHandler);
|
||||
child.stdin.write(usbdevices + " | tr '\\n' '`' | ");
|
||||
child.stdin.write(" awk '");
|
||||
child.stdin.write('{');
|
||||
child.stdin.write(' comma="";');
|
||||
child.stdin.write(' printf("[");');
|
||||
child.stdin.write(' len=split($0, group, "``");');
|
||||
child.stdin.write(' for(i=1;i<=len;++i)');
|
||||
child.stdin.write(' {');
|
||||
child.stdin.write(' comma2="";');
|
||||
child.stdin.write(' xlen=split(group[i], line, "`");');
|
||||
child.stdin.write(' scount=0;');
|
||||
child.stdin.write(' for(x=1;x<xlen;++x)');
|
||||
child.stdin.write(' {');
|
||||
child.stdin.write(' if(line[x] ~ "^S:")');
|
||||
child.stdin.write(' {');
|
||||
child.stdin.write(' ++scount;');
|
||||
child.stdin.write(' }');
|
||||
child.stdin.write(' }');
|
||||
child.stdin.write(' if(scount>0)');
|
||||
child.stdin.write(' {');
|
||||
child.stdin.write(' printf("%s{", comma); comma=",";');
|
||||
child.stdin.write(' for(x=1;x<xlen;++x)');
|
||||
child.stdin.write(' {');
|
||||
child.stdin.write(' if(line[x] ~ "^T:")');
|
||||
child.stdin.write(' {');
|
||||
child.stdin.write(' comma3="";');
|
||||
child.stdin.write(' printf("%s\\"hardware\\": {", comma2); comma2=",";');
|
||||
child.stdin.write(' sub(/^T:[ \\t]*/, "", line[x]);');
|
||||
child.stdin.write(' gsub(/= */, "=", line[x]);');
|
||||
child.stdin.write(' blen=split(line[x], tokens, " ");');
|
||||
child.stdin.write(' for(y=1;y<blen;++y)');
|
||||
child.stdin.write(' {');
|
||||
child.stdin.write(' match(tokens[y],/=/);');
|
||||
child.stdin.write(' h=substr(tokens[y],1,RSTART-1);');
|
||||
child.stdin.write(' v=substr(tokens[y],RSTART+1);');
|
||||
child.stdin.write(' sub(/#/, "", h);');
|
||||
child.stdin.write(' printf("%s\\"%s\\": \\"%s\\"", comma3, h, v); comma3=",";');
|
||||
child.stdin.write(' }');
|
||||
child.stdin.write(' printf("}");');
|
||||
child.stdin.write(' }');
|
||||
child.stdin.write(' if(line[x] ~ "^S:")');
|
||||
child.stdin.write(' {');
|
||||
child.stdin.write(' sub(/^S:[ \\t]*/, "", line[x]);');
|
||||
child.stdin.write(' match(line[x], /=/);');
|
||||
child.stdin.write(' h=substr(line[x],1,RSTART-1);');
|
||||
child.stdin.write(' v=substr(line[x],RSTART+1);');
|
||||
child.stdin.write(' printf("%s\\"%s\\": \\"%s\\"", comma2, h,v); comma2=",";');
|
||||
child.stdin.write(' }');
|
||||
child.stdin.write(' }');
|
||||
child.stdin.write(' printf("}");');
|
||||
child.stdin.write(' }');
|
||||
child.stdin.write(' }');
|
||||
child.stdin.write(' printf("]");');
|
||||
child.stdin.write("}'\nexit\n");
|
||||
child.waitExit();
|
||||
|
||||
try
|
||||
{
|
||||
values.linux.usb = JSON.parse(child.stdout.str);
|
||||
}
|
||||
catch(x)
|
||||
{ }
|
||||
child = null;
|
||||
}
|
||||
|
||||
var pcidevices = require('lib-finder').findBinary('lspci');
|
||||
if (pcidevices != null)
|
||||
{
|
||||
var child = require('child_process').execFile('/bin/sh', ['sh']);
|
||||
child.stdout.str = ''; child.stdout.on('data', dataHandler);
|
||||
child.stderr.str = ''; child.stderr.on('data', dataHandler);
|
||||
child.stdin.write(pcidevices + " -m | tr '\\n' '`' | ");
|
||||
child.stdin.write(" awk '");
|
||||
child.stdin.write('{');
|
||||
child.stdin.write(' printf("[");');
|
||||
child.stdin.write(' comma="";');
|
||||
child.stdin.write(' alen=split($0, lines, "`");');
|
||||
child.stdin.write(' for(a=1;a<alen;++a)');
|
||||
child.stdin.write(' {');
|
||||
child.stdin.write(' match(lines[a], / /);');
|
||||
child.stdin.write(' blen=split(lines[a], meta, "\\"");');
|
||||
child.stdin.write(' bus=substr(lines[a], 1, RSTART);');
|
||||
child.stdin.write(' gsub(/ /, "", bus);');
|
||||
child.stdin.write(' printf("%s{\\"bus\\": \\"%s\\"", comma, bus); comma=",";');
|
||||
child.stdin.write(' printf(", \\"device\\": \\"%s\\"", meta[2]);');
|
||||
child.stdin.write(' printf(", \\"manufacturer\\": \\"%s\\"", meta[4]);');
|
||||
child.stdin.write(' printf(", \\"description\\": \\"%s\\"", meta[6]);');
|
||||
child.stdin.write(' if(meta[8] != "")');
|
||||
child.stdin.write(' {');
|
||||
child.stdin.write(' printf(", \\"subsystem\\": {");');
|
||||
child.stdin.write(' printf("\\"manufacturer\\": \\"%s\\"", meta[8]);');
|
||||
child.stdin.write(' printf(", \\"description\\": \\"%s\\"", meta[10]);');
|
||||
child.stdin.write(' printf("}");');
|
||||
child.stdin.write(' }');
|
||||
child.stdin.write(' printf("}");');
|
||||
child.stdin.write(' }');
|
||||
child.stdin.write(' printf("]");');
|
||||
child.stdin.write("}'\nexit\n");
|
||||
child.waitExit();
|
||||
|
||||
try
|
||||
{
|
||||
values.linux.pci = JSON.parse(child.stdout.str);
|
||||
}
|
||||
catch (x)
|
||||
{ }
|
||||
child = null;
|
||||
}
|
||||
|
||||
return (values);
|
||||
}
|
||||
|
||||
function windows_wmic_results(str)
|
||||
{
|
||||
var lines = str.trim().split('\r\n');
|
||||
var keys = lines[0].split(',');
|
||||
var i, key, keyval;
|
||||
var tokens;
|
||||
var result = [];
|
||||
|
||||
console.log('Lines: ' + lines.length, 'Keys: ' + keys.length);
|
||||
|
||||
for (i = 1; i < lines.length; ++i)
|
||||
{
|
||||
var obj = {};
|
||||
console.log('i: ' + i);
|
||||
tokens = lines[i].split(',');
|
||||
for (key = 0; key < keys.length; ++key)
|
||||
{
|
||||
var tmp = Buffer.from(tokens[key], 'binary').toString();
|
||||
console.log(tokens[key], tmp);
|
||||
tokens[key] = tmp == null ? '' : tmp;
|
||||
if (tokens[key].trim())
|
||||
{
|
||||
obj[keys[key].trim()] = tokens[key].trim();
|
||||
}
|
||||
}
|
||||
delete obj.Node;
|
||||
result.push(obj);
|
||||
}
|
||||
return (result);
|
||||
}
|
||||
|
||||
function windows_volumes()
|
||||
{
|
||||
var promise = require('promise');
|
||||
var p1 = new promise(function (res, rej) { this._res = res; this._rej = rej; });
|
||||
var p2 = new promise(function (res, rej) { this._res = res; this._rej = rej; });
|
||||
|
||||
p1._p2 = p2;
|
||||
p2._p1 = p1;
|
||||
|
||||
var child = require('child_process').execFile(process.env['windir'] + '\\System32\\WindowsPowerShell\\v1.0\\powershell.exe', ['powershell', '-noprofile', '-nologo', '-command', '-']);
|
||||
p1.child = child;
|
||||
child.promise = p1;
|
||||
child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); });
|
||||
child.stdin.write('Get-Volume | Select-Object -Property DriveLetter,FileSystemLabel,FileSystemType,Size,DriveType | ConvertTo-Csv -NoTypeInformation\nexit\n');
|
||||
child.on('exit', function (c)
|
||||
{
|
||||
var a, i, tokens, key;
|
||||
var ret = {};
|
||||
|
||||
a = this.stdout.str.trim().split('\r\n');
|
||||
for (i = 1; i < a.length; ++i)
|
||||
{
|
||||
tokens = a[i].split(',');
|
||||
if (tokens[0] != '' && tokens[1] != undefined)
|
||||
{
|
||||
ret[tokens[0].split('"')[1]] =
|
||||
{
|
||||
name: tokens[1].split('"')[1],
|
||||
type: tokens[2].split('"')[1],
|
||||
size: tokens[3].split('"')[1],
|
||||
removable: tokens[4].split('"')[1] == 'Removable'
|
||||
};
|
||||
}
|
||||
}
|
||||
this.promise._res({ r: ret, t: tokens });
|
||||
});
|
||||
|
||||
p1.then(function (j)
|
||||
{
|
||||
var ret = j.r;
|
||||
var tokens = j.t;
|
||||
|
||||
var child = require('child_process').execFile(process.env['windir'] + '\\System32\\WindowsPowerShell\\v1.0\\powershell.exe', ['powershell', '-noprofile', '-nologo', '-command', '-']);
|
||||
p2.child = child;
|
||||
child.promise = p2;
|
||||
child.tokens = tokens;
|
||||
child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); });
|
||||
child.stdin.write('Get-BitLockerVolume | Select-Object -Property MountPoint,VolumeStatus,ProtectionStatus | ConvertTo-Csv -NoTypeInformation\nexit\n');
|
||||
child.on('exit', function ()
|
||||
{
|
||||
var i;
|
||||
var a = this.stdout.str.trim().split('\r\n');
|
||||
for (i = 1; i < a.length; ++i)
|
||||
{
|
||||
tokens = a[i].split(',');
|
||||
key = tokens[0].split(':').shift().split('"').pop();
|
||||
if (ret[key] != null)
|
||||
{
|
||||
ret[key].volumeStatus = tokens[1].split('"')[1];
|
||||
ret[key].protectionStatus = tokens[2].split('"')[1];
|
||||
}
|
||||
}
|
||||
this.promise._res(ret);
|
||||
});
|
||||
});
|
||||
return (p2);
|
||||
}
|
||||
|
||||
function windows_identifiers()
|
||||
{
|
||||
var ret = { windows: {} };
|
||||
var items, item, i;
|
||||
|
||||
ret['identifiers'] = {};
|
||||
|
||||
var values = require('win-wmi').query('ROOT\\CIMV2', "SELECT * FROM Win32_Bios", ['ReleaseDate', 'Manufacturer', 'SMBIOSBIOSVersion', 'SerialNumber']);
|
||||
if(values[0]){
|
||||
ret['identifiers']['bios_date'] = values[0]['ReleaseDate'];
|
||||
ret['identifiers']['bios_vendor'] = values[0]['Manufacturer'];
|
||||
ret['identifiers']['bios_version'] = values[0]['SMBIOSBIOSVersion'];
|
||||
ret['identifiers']['bios_serial'] = values[0]['SerialNumber'];
|
||||
}
|
||||
ret['identifiers']['bios_mode'] = 'Legacy';
|
||||
|
||||
values = require('win-wmi').query('ROOT\\CIMV2', "SELECT * FROM Win32_BaseBoard", ['Product', 'SerialNumber', 'Manufacturer', 'Version']);
|
||||
if(values[0]){
|
||||
ret['identifiers']['board_name'] = values[0]['Product'];
|
||||
ret['identifiers']['board_serial'] = values[0]['SerialNumber'];
|
||||
ret['identifiers']['board_vendor'] = values[0]['Manufacturer'];
|
||||
ret['identifiers']['board_version'] = values[0]['Version'];
|
||||
}
|
||||
|
||||
values = require('win-wmi').query('ROOT\\CIMV2', "SELECT * FROM Win32_ComputerSystemProduct", ['UUID', 'Name']);
|
||||
if(values[0]){
|
||||
ret['identifiers']['product_uuid'] = values[0]['UUID'];
|
||||
ret['identifiers']['product_name'] = values[0]['Name'];
|
||||
trimIdentifiers(ret.identifiers);
|
||||
}
|
||||
|
||||
values = require('win-wmi').query('ROOT\\CIMV2', "SELECT * FROM Win32_PhysicalMemory");
|
||||
if(values[0]){
|
||||
trimResults(values);
|
||||
ret.windows.memory = values;
|
||||
}
|
||||
|
||||
values = require('win-wmi').query('ROOT\\CIMV2', "SELECT * FROM Win32_OperatingSystem");
|
||||
if(values[0]){
|
||||
trimResults(values);
|
||||
ret.windows.osinfo = values[0];
|
||||
}
|
||||
|
||||
values = require('win-wmi').query('ROOT\\CIMV2', "SELECT * FROM Win32_DiskPartition");
|
||||
if(values[0]){
|
||||
trimResults(values);
|
||||
ret.windows.partitions = values;
|
||||
for (var i in values) {
|
||||
if (values[i].Description=='GPT: System') {
|
||||
ret['identifiers']['bios_mode'] = 'UEFI';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
values = require('win-wmi').query('ROOT\\CIMV2', "SELECT * FROM Win32_Processor", ['Caption', 'DeviceID', 'Manufacturer', 'MaxClockSpeed', 'Name', 'SocketDesignation']);
|
||||
if(values[0]){
|
||||
ret.windows.cpu = values;
|
||||
}
|
||||
|
||||
values = require('win-wmi').query('ROOT\\CIMV2', "SELECT * FROM Win32_VideoController", ['Name', 'CurrentHorizontalResolution', 'CurrentVerticalResolution']);
|
||||
if(values[0]){
|
||||
ret.windows.gpu = values;
|
||||
}
|
||||
|
||||
values = require('win-wmi').query('ROOT\\CIMV2', "SELECT * FROM Win32_DiskDrive", ['Caption', 'DeviceID', 'Model', 'Partitions', 'Size', 'Status']);
|
||||
if(values[0]){
|
||||
ret.windows.drives = values;
|
||||
}
|
||||
|
||||
// Insert GPU names
|
||||
ret.identifiers.gpu_name = [];
|
||||
for (var gpuinfo in ret.windows.gpu)
|
||||
{
|
||||
if (ret.windows.gpu[gpuinfo].Name) { ret.identifiers.gpu_name.push(ret.windows.gpu[gpuinfo].Name); }
|
||||
}
|
||||
|
||||
// Insert Storage Devices
|
||||
ret.identifiers.storage_devices = [];
|
||||
for (var dv in ret.windows.drives)
|
||||
{
|
||||
ret.identifiers.storage_devices.push({ Caption: ret.windows.drives[dv].Caption, Model: ret.windows.drives[dv].Model, Size: ret.windows.drives[dv].Size });
|
||||
}
|
||||
|
||||
try { ret.identifiers.cpu_name = ret.windows.cpu[0].Name; } catch (x) { }
|
||||
return (ret);
|
||||
}
|
||||
function macos_identifiers()
|
||||
{
|
||||
var ret = { identifiers: {} };
|
||||
var child;
|
||||
|
||||
child = require('child_process').execFile('/bin/sh', ['sh']);
|
||||
child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); });
|
||||
child.stdin.write('ioreg -d2 -c IOPlatformExpertDevice | grep board-id | awk -F= \'{ split($2, res, "\\""); print res[2]; }\'\nexit\n');
|
||||
child.waitExit();
|
||||
ret.identifiers.board_name = child.stdout.str.trim();
|
||||
|
||||
child = require('child_process').execFile('/bin/sh', ['sh']);
|
||||
child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); });
|
||||
child.stdin.write('ioreg -d2 -c IOPlatformExpertDevice | grep IOPlatformSerialNumber | awk -F= \'{ split($2, res, "\\""); print res[2]; }\'\nexit\n');
|
||||
child.waitExit();
|
||||
ret.identifiers.board_serial = child.stdout.str.trim();
|
||||
|
||||
child = require('child_process').execFile('/bin/sh', ['sh']);
|
||||
child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); });
|
||||
child.stdin.write('ioreg -d2 -c IOPlatformExpertDevice | grep manufacturer | awk -F= \'{ split($2, res, "\\""); print res[2]; }\'\nexit\n');
|
||||
child.waitExit();
|
||||
ret.identifiers.board_vendor = child.stdout.str.trim();
|
||||
|
||||
child = require('child_process').execFile('/bin/sh', ['sh']);
|
||||
child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); });
|
||||
child.stdin.write('ioreg -d2 -c IOPlatformExpertDevice | grep version | awk -F= \'{ split($2, res, "\\""); print res[2]; }\'\nexit\n');
|
||||
child.waitExit();
|
||||
ret.identifiers.board_version = child.stdout.str.trim();
|
||||
|
||||
child = require('child_process').execFile('/bin/sh', ['sh']);
|
||||
child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); });
|
||||
child.stdin.write('ioreg -d2 -c IOPlatformExpertDevice | grep IOPlatformUUID | awk -F= \'{ split($2, res, "\\""); print res[2]; }\'\nexit\n');
|
||||
child.waitExit();
|
||||
ret.identifiers.product_uuid = child.stdout.str.trim();
|
||||
|
||||
child = require('child_process').execFile('/bin/sh', ['sh']);
|
||||
child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); });
|
||||
child.stdin.write('sysctl -n machdep.cpu.brand_string\nexit\n');
|
||||
child.waitExit();
|
||||
ret.identifiers.cpu_name = child.stdout.str.trim();
|
||||
|
||||
|
||||
trimIdentifiers(ret.identifiers);
|
||||
|
||||
|
||||
child = null;
|
||||
return (ret);
|
||||
}
|
||||
|
||||
function win_chassisType()
|
||||
{
|
||||
var child = require('child_process').execFile(process.env['windir'] + '\\System32\\wbem\\wmic.exe', ['wmic', 'SystemEnclosure', 'get', 'ChassisTypes']);
|
||||
child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); });
|
||||
child.stderr.str = ''; child.stderr.on('data', function (c) { this.str += c.toString(); });
|
||||
child.waitExit();
|
||||
|
||||
try
|
||||
{
|
||||
var tok = child.stdout.str.split('{')[1].split('}')[0];
|
||||
var val = tok.split(',')[0];
|
||||
return (parseInt(val));
|
||||
}
|
||||
catch (e)
|
||||
{
|
||||
return (2); // unknown
|
||||
}
|
||||
}
|
||||
|
||||
function win_systemType()
|
||||
{
|
||||
var CSV = '/FORMAT:"' + require('util-language').wmicXslPath + 'csv"';
|
||||
var child = require('child_process').execFile(process.env['windir'] + '\\System32\\wbem\\wmic.exe', ['wmic', 'ComputerSystem', 'get', 'PCSystemType', CSV]);
|
||||
child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); });
|
||||
child.stderr.str = ''; child.stderr.on('data', function (c) { this.str += c.toString(); });
|
||||
child.waitExit();
|
||||
|
||||
return (parseInt(child.stdout.str.trim().split(',').pop()));
|
||||
}
|
||||
|
||||
function win_formFactor(chassistype)
|
||||
{
|
||||
var ret = 'DESKTOP';
|
||||
switch (chassistype)
|
||||
{
|
||||
case 11: // Handheld
|
||||
case 30: // Tablet
|
||||
case 31: // Convertible
|
||||
case 32: // Detachable
|
||||
ret = 'TABLET';
|
||||
break;
|
||||
case 9: // Laptop
|
||||
case 10: // Notebook
|
||||
case 14: // Sub Notebook
|
||||
ret = 'LAPTOP';
|
||||
break;
|
||||
default:
|
||||
ret = win_systemType() == 2 ? 'MOBILE' : 'DESKTOP';
|
||||
break;
|
||||
}
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
||||
switch(process.platform)
|
||||
{
|
||||
case 'linux':
|
||||
module.exports = { _ObjectID: 'identifiers', get: linux_identifiers };
|
||||
break;
|
||||
case 'win32':
|
||||
module.exports = { _ObjectID: 'identifiers', get: windows_identifiers, chassisType: win_chassisType, formFactor: win_formFactor, systemType: win_systemType };
|
||||
break;
|
||||
case 'darwin':
|
||||
module.exports = { _ObjectID: 'identifiers', get: macos_identifiers };
|
||||
break;
|
||||
default:
|
||||
module.exports = { get: function () { throw ('Unsupported Platform'); } };
|
||||
break;
|
||||
}
|
||||
module.exports.isDocker = function isDocker()
|
||||
{
|
||||
if (process.platform != 'linux') { return (false); }
|
||||
|
||||
var child = require('child_process').execFile('/bin/sh', ['sh']);
|
||||
child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); });
|
||||
child.stdin.write("cat /proc/self/cgroup | tr '\n' '`' | awk -F'`' '{ split($1, res, " + '"/"); if(res[2]=="docker"){print "1";} }\'\nexit\n');
|
||||
child.waitExit();
|
||||
return (child.stdout.str != '');
|
||||
};
|
||||
module.exports.isBatteryPowered = function isBatteryOperated()
|
||||
{
|
||||
var ret = false;
|
||||
switch(process.platform)
|
||||
{
|
||||
default:
|
||||
break;
|
||||
case 'linux':
|
||||
var devices = require('fs').readdirSync('/sys/class/power_supply');
|
||||
for (var i in devices)
|
||||
{
|
||||
if (require('fs').readFileSync('/sys/class/power_supply/' + devices[i] + '/type').toString().trim() == 'Battery')
|
||||
{
|
||||
ret = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'win32':
|
||||
var GM = require('_GenericMarshal');
|
||||
var stats = GM.CreateVariable(12);
|
||||
var kernel32 = GM.CreateNativeProxy('Kernel32.dll');
|
||||
kernel32.CreateMethod('GetSystemPowerStatus');
|
||||
if (kernel32.GetSystemPowerStatus(stats).Val != 0)
|
||||
{
|
||||
if(stats.toBuffer()[1] != 128 && stats.toBuffer()[1] != 255)
|
||||
{
|
||||
ret = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// No Battery detected, so lets check if there is supposed to be one
|
||||
var formFactor = win_formFactor(win_chassisType());
|
||||
return (formFactor == 'LAPTOP' || formFactor == 'TABLET' || formFactor == 'MOBILE');
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'darwin':
|
||||
var child = require('child_process').execFile('/bin/sh', ['sh']);
|
||||
child.stdout.str = ''; child.stdout.on('data', function(c){ this.str += c.toString(); });
|
||||
child.stderr.str = ''; child.stderr.on('data', function(c){ this.str += c.toString(); });
|
||||
child.stdin.write("pmset -g batt | tr '\\n' '`' | awk -F'`' '{ if(NF>2) { print \"true\"; }}'\nexit\n");
|
||||
child.waitExit();
|
||||
if(child.stdout.str.trim() != '') { ret = true; }
|
||||
break;
|
||||
}
|
||||
return (ret);
|
||||
};
|
||||
module.exports.isVM = function isVM()
|
||||
{
|
||||
var ret = false;
|
||||
var id = this.get();
|
||||
if (id.linux && id.linux.sys_vendor)
|
||||
{
|
||||
switch (id.linux.sys_vendor)
|
||||
{
|
||||
case 'VMware, Inc.':
|
||||
case 'QEMU':
|
||||
case 'Xen':
|
||||
ret = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (id.identifiers.bios_vendor)
|
||||
{
|
||||
switch(id.identifiers.bios_vendor)
|
||||
{
|
||||
case 'VMware, Inc.':
|
||||
case 'Xen':
|
||||
case 'SeaBIOS':
|
||||
ret = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (id.identifiers.board_vendor && id.identifiers.board_vendor == 'VMware, Inc.') { ret = true; }
|
||||
if (id.identifiers.board_name)
|
||||
{
|
||||
switch (id.identifiers.board_name)
|
||||
{
|
||||
case 'VirtualBox':
|
||||
case 'Virtual Machine':
|
||||
ret = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (process.platform == 'win32' && !ret)
|
||||
{
|
||||
for(var i in id.identifiers.gpu_name)
|
||||
{
|
||||
if(id.identifiers.gpu_name[i].startsWith('VMware '))
|
||||
{
|
||||
ret = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!ret) { ret = this.isDocker(); }
|
||||
return (ret);
|
||||
};
|
||||
|
||||
if (process.platform == 'win32')
|
||||
{
|
||||
module.exports.volumes_promise = windows_volumes;
|
||||
}
|
||||
|
||||
// bios_date = BIOS->ReleaseDate
|
||||
// bios_vendor = BIOS->Manufacturer
|
||||
// bios_version = BIOS->SMBIOSBIOSVersion
|
||||
// board_name = BASEBOARD->Product = ioreg/board-id
|
||||
// board_serial = BASEBOARD->SerialNumber = ioreg/serial-number | ioreg/IOPlatformSerialNumber
|
||||
// board_vendor = BASEBOARD->Manufacturer = ioreg/manufacturer
|
||||
// board_version = BASEBOARD->Version
|
Loading…
Reference in New Issue
Block a user