From add6dd4d2acc2de30b7fc31ee178cc348597db3e Mon Sep 17 00:00:00 2001 From: Sebastian Hildebrandt Date: Sun, 8 Mar 2020 19:22:23 +0100 Subject: [PATCH] versions() added param to specify which program/lib versions to detect --- CHANGELOG.md | 1 + README.md | 4 +- docs/history.html | 5 + docs/index.html | 2 +- docs/os.html | 13 +- lib/osinfo.js | 712 ++++++++++++++++++++++++++-------------------- 6 files changed, 428 insertions(+), 309 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 444df95..aeb2cbf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ For major (breaking) changes - version 3 and 2 see end of page. | Version | Date | Comment | | -------------- | -------------- | -------- | +| 4.23.0 | 2020-03-08 | `versions()` added param to specify which program/lib versions to detect | | 4.22.7 | 2020-03-08 | `diskLayout()` fixed linux | | 4.22.6 | 2020-03-08 | `network()` fixed DHCP linux| | 4.22.5 | 2020-03-04 | `graphics()` fixed vram macOS | diff --git a/README.md b/README.md index 056f262..09a505d 100644 --- a/README.md +++ b/README.md @@ -85,13 +85,13 @@ si.cpu() (last 7 major and minor version releases) +- Version 4.23.0: `versions()` added param to specify which program/lib versions to detect - Version 4.22.0: `services()` added pids (windows) - Version 4.21.0: added npx copmpatibility - Version 4.20.0: `battery()` added designcapacity, voltage, unit - Version 4.19.0: `osInfo()` added uefi (OS uses UEFI during startup) - Version 4.18.0: `networkInterfaces()` added dhcp for mac os, added dhcp linux fallback - Version 4.17.0: `networkInterfaces()` added dhcp, dnsSuffix, ieee8021xAuth, ieee8021xState -- Version 4.16.0: `networkGatewayDefault()` added - ... You can find all changes here: [detailed changelog][changelog-url] @@ -296,7 +296,7 @@ I also created a nice little command line tool called [mmon][mmon-github-url] ( | | uefi | X | X | X | X | | OS started via UEFI | | si.uuid(cb) | {...} | X | X | X | X | X | object of several UUIDs | | | os | X | X | X | X | | os specific UUID | -| si.versions(cb) | {...} | X | X | X | X | X | version information (kernel, ssl, node, ...) | +| si.versions(apps, cb) | {...} | X | X | X | X | X | version information (kernel, ssl, node, ...)
apps param is optional for detecting
only specific apps/libs
(string, comma separated) | | si.shell(cb) | : string | X | X | X | | | standard shell | | si.users(cb) | [{...}] | X | X | X | X | X | array of users online | | | [0].user | X | X | X | X | X | user name | diff --git a/docs/history.html b/docs/history.html index 667da45..90e6693 100644 --- a/docs/history.html +++ b/docs/history.html @@ -83,6 +83,11 @@ + + 4.23.0 + 2020-03-08 + versions() added param to specify which program/lib versions to detect + 4.22.7 2020-03-08 diff --git a/docs/index.html b/docs/index.html index 00bb927..60d79e7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -168,7 +168,7 @@
systeminformation
-
Current Version: 4.22.7
+
Current Version: 4.23.0
diff --git a/docs/os.html b/docs/os.html index 2cf23c5..d38a0f8 100644 --- a/docs/os.html +++ b/docs/os.html @@ -259,14 +259,14 @@ si.osInfo().then(data => console.log(data)); standard shell - si.versions(cb) + si.versions(apps, cb) {...} X X X X X - version information of
node and dev software packages + version information of
node and dev software packages
optional apps param (string,
comma or space seperated)
only those apps are detected @@ -586,6 +586,15 @@ si.versions().then(data => console.log(data)); java: '', gcc: '4.2.1', virtualbox: '' +} +
Example 2
+
const si = require('systeminformation');
+                      si.versions('npm, php, postgresql').then(data => console.log(data));
+
+{
+  npm: '6.13.6',
+  php: '7.3.11',
+  postgresql: '12.1'
 }
diff --git a/lib/osinfo.js b/lib/osinfo.js index 63e1ae9..6e3d088 100644 --- a/lib/osinfo.js +++ b/lib/osinfo.js @@ -351,357 +351,461 @@ function isUefiWindows() { }); } -function versions(callback) { +function versions(apps, callback) { + let versionObject = { + kernel: os.release(), + openssl: '', + systemOpenssl: '', + systemOpensslLib: '', + node: process.versions.node, + v8: process.versions.v8, + npm: '', + yarn: '', + pm2: '', + gulp: '', + grunt: '', + git: '', + tsc: '', + mysql: '', + redis: '', + mongodb: '', + apache: '', + nginx: '', + php: '', + docker: '', + postfix: '', + postgresql: '', + perl: '', + python: '', + python3: '', + pip: '', + pip3: '', + java: '', + gcc: '', + virtualbox: '', + dotnet: '' + }; + + function checkVersionParam(apps) { + if (apps === '*') { + return { + versions: versionObject, + counter: 26 + } + } + if (!Array.isArray(apps)) { + apps = apps.trim().toLowerCase().replace(/,+/g, '|').replace(/ /g, '|'); + apps = apps.split('|'); + const result = { + versions: {}, + counter: 0 + } + apps.forEach(el => { + if (el) { + for (let key in versionObject) { + if ({}.hasOwnProperty.call(versionObject, key)) { + if (key.toLowerCase() === el.toLowerCase() && !{}.hasOwnProperty.call(result.versions, key)) { + result.versions[key] = versionObject[key]; + if (key === 'openssl') { + result.versions.systemOpenssl = ''; + result.versions.systemOpensslLib = ''; + } + + if (!result.versions[key]) { result.counter++; } + } + } + } + } + }); + return result; + } + } + return new Promise((resolve) => { process.nextTick(() => { - let result = { - kernel: os.release(), - openssl: process.versions.openssl, - systemOpenssl: '', - systemOpensslLib: '', - node: process.versions.node, - v8: process.versions.v8, - npm: '', - yarn: '', - pm2: '', - gulp: '', - grunt: '', - git: '', - tsc: '', - mysql: '', - redis: '', - mongodb: '', - apache: '', - nginx: '', - php: '', - docker: '', - postfix: '', - postgresql: '', - perl: '', - python: '', - python3: '', - pip: '', - pip3: '', - java: '', - gcc: '', - virtualbox: '', - dotnet: '' - }; + if (util.isFunction(apps) && !callback) { + callback = apps; + apps = '*'; + } else { + apps = apps || '*'; + } + const appsObj = checkVersionParam(apps); + let totalFunctions = appsObj.counter; let functionProcessed = (function () { - let totalFunctions = 26; return function () { if (--totalFunctions === 0) { if (callback) { - callback(result); + callback(appsObj.versions); } - resolve(result); + resolve(appsObj.versions); } }; })(); try { - exec('openssl version', function (error, stdout) { - if (!error) { - let openssl_string = stdout.toString().split('\n')[0].trim(); - let openssl = openssl_string.split(' '); - result.systemOpenssl = openssl.length > 0 ? openssl[1] : openssl[0]; - result.systemOpensslLib = openssl.length > 0 ? openssl[0] : 'openssl'; - } - functionProcessed(); - }); - exec('npm -v', function (error, stdout) { - if (!error) { - result.npm = stdout.toString().split('\n')[0]; - } - functionProcessed(); - }); - exec('pm2 -v', function (error, stdout) { - if (!error) { - let pm2 = stdout.toString().split('\n')[0].trim(); - if (!pm2.startsWith('[PM2]')) { - result.pm2 = pm2; - } - } - functionProcessed(); - }); - exec('yarn --version', function (error, stdout) { - if (!error) { - result.yarn = stdout.toString().split('\n')[0]; - } - functionProcessed(); - }); - exec('gulp --version', function (error, stdout) { - if (!error) { - const gulp = stdout.toString().split('\n')[0] || ''; - result.gulp = (gulp.toLowerCase().split('version')[1] || '').trim(); - } - functionProcessed(); - }); - exec('tsc --version', function (error, stdout) { - if (!error) { - const tsc = stdout.toString().split('\n')[0] || ''; - result.tsc = (tsc.toLowerCase().split('version')[1] || '').trim(); - } - functionProcessed(); - }); - exec('grunt --version', function (error, stdout) { - if (!error) { - const grunt = stdout.toString().split('\n')[0] || ''; - result.grunt = (grunt.toLowerCase().split('cli v')[1] || '').trim(); - } - functionProcessed(); - }); - if (_darwin) { - const gitHomebrewExists = fs.existsSync('/usr/local/Cellar/git'); - if (util.darwinXcodeExists() || gitHomebrewExists) { - exec('git --version', function (error, stdout) { - if (!error) { - let git = stdout.toString().split('\n')[0] || ''; - git = (git.toLowerCase().split('version')[1] || '').trim(); - result.git = (git.split(' ')[0] || '').trim(); - } - functionProcessed(); - }); - } else { - functionProcessed(); - } - } else { - exec('git --version', function (error, stdout) { + if ({}.hasOwnProperty.call(appsObj.versions, 'openssl')) { + appsObj.versions.openssl = process.versions.openssl; + exec('openssl version', function (error, stdout) { if (!error) { - let git = stdout.toString().split('\n')[0] || ''; - git = (git.toLowerCase().split('version')[1] || '').trim(); - result.git = (git.split(' ')[0] || '').trim(); + let openssl_string = stdout.toString().split('\n')[0].trim(); + let openssl = openssl_string.split(' '); + appsObj.versions.systemOpenssl = openssl.length > 0 ? openssl[1] : openssl[0]; + appsObj.versions.systemOpensslLib = openssl.length > 0 ? openssl[0] : 'openssl'; } functionProcessed(); }); } - exec('apachectl -v 2>&1', function (error, stdout) { - if (!error) { - const apache = (stdout.toString().split('\n')[0] || '').split(':'); - result.apache = (apache.length > 1 ? apache[1].replace('Apache', '').replace('/', '').trim() : ''); - } - functionProcessed(); - }); - exec('nginx -v 2>&1', function (error, stdout) { - if (!error) { - const nginx = stdout.toString().split('\n')[0] || ''; - result.nginx = (nginx.toLowerCase().split('/')[1] || '').trim(); - } - functionProcessed(); - }); - exec('mysql -V', function (error, stdout) { - if (!error) { - let mysql = stdout.toString().split('\n')[0] || ''; - mysql = mysql.toLowerCase(); - if (mysql.indexOf(',') > -1) { - mysql = (mysql.split(',')[0] || '').trim(); - const parts = mysql.split(' '); - result.mysql = (parts[parts.length - 1] || '').trim(); - } else { - if (mysql.indexOf(' ver ') > -1) { - mysql = mysql.split(' ver ')[1]; - result.mysql = mysql.split(' ')[0]; + if ({}.hasOwnProperty.call(appsObj.versions, 'npm')) { + exec('npm -v', function (error, stdout) { + if (!error) { + appsObj.versions.npm = stdout.toString().split('\n')[0]; + } + functionProcessed(); + }); + } + if ({}.hasOwnProperty.call(appsObj.versions, 'pm2')) { + exec('pm2 -v', function (error, stdout) { + if (!error) { + let pm2 = stdout.toString().split('\n')[0].trim(); + if (!pm2.startsWith('[PM2]')) { + appsObj.versions.pm2 = pm2; } } - } - functionProcessed(); - }); - exec('php -v', function (error, stdout) { - if (!error) { - const php = stdout.toString().split('\n')[0] || ''; - let parts = php.split('('); - if (parts[0].indexOf('-')) { - parts = parts[0].split('-'); - } - result.php = parts[0].replace(/[^0-9.]/g, ''); - } - functionProcessed(); - }); - exec('redis-server --version', function (error, stdout) { - if (!error) { - const redis = stdout.toString().split('\n')[0] || ''; - const parts = redis.split(' '); - result.redis = util.getValue(parts, 'v', '=', true); - } - functionProcessed(); - }); - exec('docker --version', function (error, stdout) { - if (!error) { - const docker = stdout.toString().split('\n')[0] || ''; - const parts = docker.split(' '); - result.docker = parts.length > 2 && parts[2].endsWith(',') ? parts[2].slice(0, -1) : ''; - } - functionProcessed(); - }); - exec('postconf -d | grep mail_version', function (error, stdout) { - if (!error) { - const postfix = stdout.toString().split('\n') || []; - result.postfix = util.getValue(postfix, 'mail_version', '=', true); - } - functionProcessed(); - }); - exec('mongod --version', function (error, stdout) { - if (!error) { - const mongodb = stdout.toString().split('\n')[0] || ''; - result.mongodb = (mongodb.toLowerCase().split(',')[0] || '').replace(/[^0-9.]/g, ''); - } - functionProcessed(); - }); - if (_linux) { - exec('locate bin/postgres', function (error, stdout) { + functionProcessed(); + }); + } + if ({}.hasOwnProperty.call(appsObj.versions, 'yarn')) { + exec('yarn --version', function (error, stdout) { if (!error) { - const postgresqlBin = stdout.toString().split('\n').sort(); - if (postgresqlBin.length) { - exec(postgresqlBin[postgresqlBin.length - 1] + ' -V', function (error, stdout) { + appsObj.versions.yarn = stdout.toString().split('\n')[0]; + } + functionProcessed(); + }); + } + if ({}.hasOwnProperty.call(appsObj.versions, 'gulp')) { + exec('gulp --version', function (error, stdout) { + if (!error) { + const gulp = stdout.toString().split('\n')[0] || ''; + appsObj.versions.gulp = (gulp.toLowerCase().split('version')[1] || '').trim(); + } + functionProcessed(); + }); + } + if ({}.hasOwnProperty.call(appsObj.versions, 'tsc')) { + exec('tsc --version', function (error, stdout) { + if (!error) { + const tsc = stdout.toString().split('\n')[0] || ''; + appsObj.versions.tsc = (tsc.toLowerCase().split('version')[1] || '').trim(); + } + functionProcessed(); + }); + } + if ({}.hasOwnProperty.call(appsObj.versions, 'grunt')) { + exec('grunt --version', function (error, stdout) { + if (!error) { + const grunt = stdout.toString().split('\n')[0] || ''; + appsObj.versions.grunt = (grunt.toLowerCase().split('cli v')[1] || '').trim(); + } + functionProcessed(); + }); + } + if ({}.hasOwnProperty.call(appsObj.versions, 'git')) { + if (_darwin) { + const gitHomebrewExists = fs.existsSync('/usr/local/Cellar/git'); + if (util.darwinXcodeExists() || gitHomebrewExists) { + exec('git --version', function (error, stdout) { + if (!error) { + let git = stdout.toString().split('\n')[0] || ''; + git = (git.toLowerCase().split('version')[1] || '').trim(); + appsObj.versions.git = (git.split(' ')[0] || '').trim(); + } + functionProcessed(); + }); + } else { + functionProcessed(); + } + } else { + exec('git --version', function (error, stdout) { + if (!error) { + let git = stdout.toString().split('\n')[0] || ''; + git = (git.toLowerCase().split('version')[1] || '').trim(); + appsObj.versions.git = (git.split(' ')[0] || '').trim(); + } + functionProcessed(); + }); + } + } + if ({}.hasOwnProperty.call(appsObj.versions, 'apache')) { + exec('apachectl -v 2>&1', function (error, stdout) { + if (!error) { + const apache = (stdout.toString().split('\n')[0] || '').split(':'); + appsObj.versions.apache = (apache.length > 1 ? apache[1].replace('Apache', '').replace('/', '').trim() : ''); + } + functionProcessed(); + }); + } + if ({}.hasOwnProperty.call(appsObj.versions, 'nginx')) { + exec('nginx -v 2>&1', function (error, stdout) { + if (!error) { + const nginx = stdout.toString().split('\n')[0] || ''; + appsObj.versions.nginx = (nginx.toLowerCase().split('/')[1] || '').trim(); + } + functionProcessed(); + }); + } + if ({}.hasOwnProperty.call(appsObj.versions, 'mysql')) { + exec('mysql -V', function (error, stdout) { + if (!error) { + let mysql = stdout.toString().split('\n')[0] || ''; + mysql = mysql.toLowerCase(); + if (mysql.indexOf(',') > -1) { + mysql = (mysql.split(',')[0] || '').trim(); + const parts = mysql.split(' '); + appsObj.versions.mysql = (parts[parts.length - 1] || '').trim(); + } else { + if (mysql.indexOf(' ver ') > -1) { + mysql = mysql.split(' ver ')[1]; + appsObj.versions.mysql = mysql.split(' ')[0]; + } + } + } + functionProcessed(); + }); + } + if ({}.hasOwnProperty.call(appsObj.versions, 'php')) { + exec('php -v', function (error, stdout) { + if (!error) { + const php = stdout.toString().split('\n')[0] || ''; + let parts = php.split('('); + if (parts[0].indexOf('-')) { + parts = parts[0].split('-'); + } + appsObj.versions.php = parts[0].replace(/[^0-9.]/g, ''); + } + functionProcessed(); + }); + } + if ({}.hasOwnProperty.call(appsObj.versions, 'redis')) { + exec('redis-server --version', function (error, stdout) { + if (!error) { + const redis = stdout.toString().split('\n')[0] || ''; + const parts = redis.split(' '); + appsObj.versions.redis = util.getValue(parts, 'v', '=', true); + } + functionProcessed(); + }); + } + if ({}.hasOwnProperty.call(appsObj.versions, 'docker')) { + exec('docker --version', function (error, stdout) { + if (!error) { + const docker = stdout.toString().split('\n')[0] || ''; + const parts = docker.split(' '); + appsObj.versions.docker = parts.length > 2 && parts[2].endsWith(',') ? parts[2].slice(0, -1) : ''; + } + functionProcessed(); + }); + } + if ({}.hasOwnProperty.call(appsObj.versions, 'postfix')) { + exec('postconf -d | grep mail_version', function (error, stdout) { + if (!error) { + const postfix = stdout.toString().split('\n') || []; + appsObj.versions.postfix = util.getValue(postfix, 'mail_version', '=', true); + } + functionProcessed(); + }); + } + if ({}.hasOwnProperty.call(appsObj.versions, 'mongodb')) { + exec('mongod --version', function (error, stdout) { + if (!error) { + const mongodb = stdout.toString().split('\n')[0] || ''; + appsObj.versions.mongodb = (mongodb.toLowerCase().split(',')[0] || '').replace(/[^0-9.]/g, ''); + } + functionProcessed(); + }); + } + if ({}.hasOwnProperty.call(appsObj.versions, 'postgresql')) { + if (_linux) { + exec('locate bin/postgres', function (error, stdout) { + if (!error) { + const postgresqlBin = stdout.toString().split('\n').sort(); + if (postgresqlBin.length) { + exec(postgresqlBin[postgresqlBin.length - 1] + ' -V', function (error, stdout) { + if (!error) { + const postgresql = stdout.toString().split('\n')[0].split(' ') || []; + appsObj.versions.postgresql = postgresql.length ? postgresql[postgresql.length - 1] : ''; + } + functionProcessed(); + }); + } else { + functionProcessed(); + } + } else { + exec('psql -V', function (error, stdout) { if (!error) { const postgresql = stdout.toString().split('\n')[0].split(' ') || []; - result.postgresql = postgresql.length ? postgresql[postgresql.length - 1] : ''; + appsObj.versions.postgresql = postgresql.length ? postgresql[postgresql.length - 1] : ''; + appsObj.versions.postgresql = appsObj.versions.postgresql.split('-')[0]; + } + functionProcessed(); + }); + functionProcessed(); + } + }); + } else { + if (_windows) { + util.wmic('service get /value').then((stdout) => { + let serviceSections = stdout.split(/\n\s*\n/); + for (let i = 0; i < serviceSections.length; i++) { + if (serviceSections[i].trim() !== '') { + let lines = serviceSections[i].trim().split('\r\n'); + let srvCaption = util.getValue(lines, 'caption', '=', true).toLowerCase(); + if (srvCaption.indexOf('postgresql') > -1) { + const parts = srvCaption.split(' server '); + if (parts.length > 1) { + appsObj.versions.postgresql = parts[1]; + } + } + } + } + functionProcessed(); + }); + } else { + exec('postgres -V', function (error, stdout) { + if (!error) { + const postgresql = stdout.toString().split('\n')[0].split(' ') || []; + appsObj.versions.postgresql = postgresql.length ? postgresql[postgresql.length - 1] : ''; + } + functionProcessed(); + }); + } + } + } + if ({}.hasOwnProperty.call(appsObj.versions, 'perl')) { + exec('perl -v', function (error, stdout) { + if (!error) { + const perl = stdout.toString().split('\n') || ''; + while (perl.length > 0 && perl[0].trim() === '') { + perl.shift(); + } + if (perl.length > 0) { + appsObj.versions.perl = perl[0].split('(').pop().split(')')[0].replace('v', ''); + } + } + functionProcessed(); + }); + } + if ({}.hasOwnProperty.call(appsObj.versions, 'python')) { + exec('python -V 2>&1', function (error, stdout) { + if (!error) { + const python = stdout.toString().split('\n')[0] || ''; + appsObj.versions.python = python.toLowerCase().replace('python', '').trim(); + } + functionProcessed(); + }); + } + if ({}.hasOwnProperty.call(appsObj.versions, 'python3')) { + exec('python3 -V 2>&1', function (error, stdout) { + if (!error) { + const python = stdout.toString().split('\n')[0] || ''; + appsObj.versions.python3 = python.toLowerCase().replace('python', '').trim(); + } + functionProcessed(); + }); + } + if ({}.hasOwnProperty.call(appsObj.versions, 'pip')) { + exec('pip -V 2>&1', function (error, stdout) { + if (!error) { + const pip = stdout.toString().split('\n')[0] || ''; + const parts = pip.split(' '); + appsObj.versions.pip = parts.length >= 2 ? parts[1] : ''; + } + functionProcessed(); + }); + } + if ({}.hasOwnProperty.call(appsObj.versions, 'pip3')) { + exec('pip3 -V 2>&1', function (error, stdout) { + if (!error) { + const pip = stdout.toString().split('\n')[0] || ''; + const parts = pip.split(' '); + appsObj.versions.pip3 = parts.length >= 2 ? parts[1] : ''; + } + functionProcessed(); + }); + } + if ({}.hasOwnProperty.call(appsObj.versions, 'java')) { + if (_darwin) { + // check if any JVM is installed but avoid dialog box that Java needs to be installed + exec('/usr/libexec/java_home -V 2>&1', function (error, stdout) { + if (!error && stdout.toString().toLowerCase().indexOf('no java runtime') === -1) { + // now this can be done savely + exec('java -version 2>&1', function (error, stdout) { + if (!error) { + const java = stdout.toString().split('\n')[0] || ''; + const parts = java.split('"'); + appsObj.versions.java = parts.length === 3 ? parts[1].trim() : ''; } functionProcessed(); }); } else { functionProcessed(); } - } else { - functionProcessed(); - } - }); - } else { - if (_windows) { - util.wmic('service get /value').then((stdout) => { - let serviceSections = stdout.split(/\n\s*\n/); - for (let i = 0; i < serviceSections.length; i++) { - if (serviceSections[i].trim() !== '') { - let lines = serviceSections[i].trim().split('\r\n'); - let srvCaption = util.getValue(lines, 'caption', '=', true).toLowerCase(); - if (srvCaption.indexOf('postgresql') > -1) { - const parts = srvCaption.split(' server '); - if (parts.length > 1) { - result.postgresql = parts[1]; - } - } - } - } - functionProcessed(); }); } else { - exec('postgres -V', function (error, stdout) { + exec('java -version 2>&1', function (error, stdout) { if (!error) { - const postgresql = stdout.toString().split('\n')[0].split(' ') || []; - result.postgresql = postgresql.length ? postgresql[postgresql.length - 1] : ''; + const java = stdout.toString().split('\n')[0] || ''; + const parts = java.split('"'); + appsObj.versions.java = parts.length === 3 ? parts[1].trim() : ''; } functionProcessed(); }); } } - exec('perl -v', function (error, stdout) { - if (!error) { - const perl = stdout.toString().split('\n') || ''; - while (perl.length > 0 && perl[0].trim() === '') { - perl.shift(); - } - if (perl.length > 0) { - result.perl = perl[0].split('(').pop().split(')')[0].replace('v', ''); - } - } - functionProcessed(); - }); - exec('python -V 2>&1', function (error, stdout) { - if (!error) { - const python = stdout.toString().split('\n')[0] || ''; - result.python = python.toLowerCase().replace('python', '').trim(); - } - functionProcessed(); - }); - exec('python3 -V 2>&1', function (error, stdout) { - if (!error) { - const python = stdout.toString().split('\n')[0] || ''; - result.python3 = python.toLowerCase().replace('python', '').trim(); - } - functionProcessed(); - }); - exec('pip -V 2>&1', function (error, stdout) { - if (!error) { - const pip = stdout.toString().split('\n')[0] || ''; - const parts = pip.split(' '); - result.pip = parts.length >= 2 ? parts[1] : ''; - } - functionProcessed(); - }); - exec('pip3 -V 2>&1', function (error, stdout) { - if (!error) { - const pip = stdout.toString().split('\n')[0] || ''; - const parts = pip.split(' '); - result.pip3 = parts.length >= 2 ? parts[1] : ''; - } - functionProcessed(); - }); - if (_darwin) { - // check if any JVM is installed but avoid dialog box that Java needs to be installed - exec('/usr/libexec/java_home -V 2>&1', function (error, stdout) { - if (!error && stdout.toString().toLowerCase().indexOf('no java runtime') === -1) { - // now this can be done savely - exec('java -version 2>&1', function (error, stdout) { - if (!error) { - const java = stdout.toString().split('\n')[0] || ''; - const parts = java.split('"'); - result.java = parts.length === 3 ? parts[1].trim() : ''; - } + if ({}.hasOwnProperty.call(appsObj.versions, 'gcc')) { + if ((_darwin && util.darwinXcodeExists()) || !_darwin) { + exec('gcc -dumpversion', function (error, stdout) { + if (!error) { + appsObj.versions.gcc = stdout.toString().split('\n')[0].trim() || ''; + } + if (appsObj.versions.gcc.indexOf('.') > -1) { functionProcessed(); - }); - } else { - functionProcessed(); - } - }); - } else { - exec('java -version 2>&1', function (error, stdout) { + } else { + exec('gcc --version', function (error, stdout) { + if (!error) { + const gcc = stdout.toString().split('\n')[0].trim(); + if (gcc.indexOf('gcc') > -1 && gcc.indexOf(')') > -1) { + const parts = gcc.split(')'); + appsObj.versions.gcc = parts[1].trim() || appsObj.versions.gcc; + } + } + functionProcessed(); + }); + } + }); + } else { + functionProcessed(); + } + } + if ({}.hasOwnProperty.call(appsObj.versions, 'virtualbox')) { + exec(util.getVboxmanage() + ' -v 2>&1', function (error, stdout) { if (!error) { - const java = stdout.toString().split('\n')[0] || ''; - const parts = java.split('"'); - result.java = parts.length === 3 ? parts[1].trim() : ''; + const vbox = stdout.toString().split('\n')[0] || ''; + const parts = vbox.split('r'); + appsObj.versions.virtualbox = parts[0]; } functionProcessed(); }); } - if ((_darwin && util.darwinXcodeExists()) || !_darwin) { - exec('gcc -dumpversion', function (error, stdout) { + if ({}.hasOwnProperty.call(appsObj.versions, 'dotnet')) { + exec('dotnet --version 2>&1', function (error, stdout) { if (!error) { - result.gcc = stdout.toString().split('\n')[0].trim() || ''; - } - if (result.gcc.indexOf('.') > -1) { - functionProcessed(); - } else { - exec('gcc --version', function (error, stdout) { - if (!error) { - const gcc = stdout.toString().split('\n')[0].trim(); - if (gcc.indexOf('gcc') > -1 && gcc.indexOf(')') > -1) { - const parts = gcc.split(')'); - result.gcc = parts[1].trim() || result.gcc; - } - } - functionProcessed(); - }); + const dotnet = stdout.toString().split('\n')[0] || ''; + appsObj.versions.dotnet = dotnet.trim(); } + functionProcessed(); }); - } else { - functionProcessed(); } - exec(util.getVboxmanage() + ' -v 2>&1', function (error, stdout) { - if (!error) { - const vbox = stdout.toString().split('\n')[0] || ''; - const parts = vbox.split('r'); - result.virtualbox = parts[0]; - } - functionProcessed(); - }); - exec('dotnet --version 2>&1', function (error, stdout) { - if (!error) { - const dotnet = stdout.toString().split('\n')[0] || ''; - result.dotnet = dotnet.trim(); - } - functionProcessed(); - }); } catch (e) { if (callback) { callback(result); } resolve(result);