You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
338 lines
11 KiB
338 lines
11 KiB
var fs = require('fs')
|
|
var path = require('path')
|
|
var os = require('os')
|
|
const isAdmin = require('is-admin')
|
|
const crypto = require('crypto')
|
|
var http = require('http')
|
|
|
|
function it_am_init() {
|
|
let config = {}
|
|
|
|
// Admin Permission Test
|
|
if (running_as_admin() && !process['CONFIG']['RUN_AS_ADMIN']) {
|
|
console.log('WARNING: Cannot run with Administrative Permissions')
|
|
process.exit(1)
|
|
}
|
|
|
|
// Static Parameters
|
|
config['OS'] = {}
|
|
config['OS']['ARCH'] = process.arch
|
|
config['OS']['ENDIAN'] = os.endianness()
|
|
config['OS']['PLATFORM'] = os.platform()
|
|
config['OS']['RELEASE'] = os.release()
|
|
config['OS']['TYPE'] = os.type()
|
|
config['OS']['EOL'] = os.EOL
|
|
config['OS']['PATHSEP'] = path.sep
|
|
|
|
config['PROC'] = {}
|
|
config['PROC']['PID'] = process.pid
|
|
config['PROC']['RUN_DIR'] = process['CONFIG']['GLOBAL']['RUN_DIR']
|
|
config['PROC']['CWD'] = process.cwd()
|
|
config['PROC']['ARCH'] = process.arch
|
|
config['PROC']['PLATFORM'] = process.platform
|
|
config['PROC']['VERSIONS'] = process.versions
|
|
config['PROC']['ARGV'] = process.argv
|
|
config['PROC']['EXECPATH'] = process.execPath
|
|
//config['PROC']['ENV'] = process.env
|
|
|
|
config['HOST'] = {}
|
|
|
|
config['HOST']['HOSTNAME'] = os.hostname()
|
|
config['HOST']['HOST_ID'] = ''
|
|
config['HOST']['HW'] = {}
|
|
|
|
config['HOST']['HW']['CPUS'] = os.cpus()
|
|
for (c in config['HOST']['HW']['CPUS']) { delete config['HOST']['HW']['CPUS'][c]['times'] }
|
|
if(!config['HOST']['HW'].hasOwnProperty('CPU_CORES')) {
|
|
config['HOST']['HW']['CPU_CORES'] = config['HOST']['HW']['CPUS'].length
|
|
config['HOST']['HW']['CPU_MODEL'] = config['HOST']['HW']['CPUS'][0]['model']
|
|
}
|
|
config['HOST']['HW']['MEMORY_BYTES'] = os.totalmem()
|
|
config['HOST']['HW']['NETWORK'] = os.networkInterfaces()
|
|
|
|
config['HOST']['NETWORK'] = {}
|
|
config['HOST']['NETWORK']['IP_ADDR'] = {}
|
|
config['HOST']['NETWORK']['IP_ADDR']['IPv4'] = []
|
|
config['HOST']['NETWORK']['IP_ADDR']['IPv6'] = []
|
|
for (n in config['HOST']['HW']['NETWORK']) {
|
|
for (i in config['HOST']['HW']['NETWORK'][n]) {
|
|
if (!config['HOST']['HW']['NETWORK'][n][i]['internal'] && !config['HOST']['HW']['NETWORK'][n][i]['netmask'].match('ffff:ffff')) {
|
|
config['HOST']['NETWORK']['IP_ADDR'][ config['HOST']['HW']['NETWORK'][n][i]["family"] ].push(config['HOST']['HW']['NETWORK'][n][i]["address"])
|
|
}
|
|
}
|
|
}
|
|
|
|
// Load ABL App Configuration Parameters
|
|
config['PACKAGE'] = JSON.parse(fs.readFileSync(path.join(config['PROC']['RUN_DIR'],'package.json'), 'utf8'))
|
|
|
|
get_abl_id(config)
|
|
|
|
|
|
// Web CONFIG - Prune parameters for Web UI
|
|
config['WEB'] = {}
|
|
config['WEB']['WEBUI_PORT'] = process['CONFIG']['GLOBAL']['WEBUI_PORT']
|
|
config['WEB']['NETWORK'] = config['HOST']['NETWORK']
|
|
|
|
|
|
// console.log(JSON.stringify(config, null, 2))
|
|
|
|
return config
|
|
}
|
|
|
|
exports.it_am_init = it_am_init
|
|
|
|
|
|
function running_as_admin() { // Code Source: ABL Rolecall (http://appliedbitlogistics.io/)
|
|
|
|
let admin_perms = false
|
|
|
|
switch(os.platform()) {
|
|
case "linux":
|
|
if (os.userInfo['username'] == 'root' || os.userInfo()['uid'] == 0) {
|
|
admin_perms = true
|
|
}
|
|
break
|
|
|
|
case "darwin":
|
|
if (os.userInfo()['username'] == 'root' || os.userInfo()['uid'] == 0) {
|
|
admin_perms = true
|
|
}
|
|
break
|
|
|
|
case "win32":
|
|
let isAdmin = require('is-admin')
|
|
|
|
isAdmin().then(elevated => {
|
|
if (elevated) {
|
|
admin_perms = true
|
|
}
|
|
})
|
|
break
|
|
}
|
|
|
|
return admin_perms
|
|
}
|
|
|
|
function get_abl_id (cfg) { // Code Source: ABL Rolecall (http://appliedbitlogistics.io/)
|
|
// ABL ID
|
|
let abl_id = {}
|
|
|
|
switch (cfg['OS']['PLATFORM']) {
|
|
case 'linux':
|
|
try {
|
|
fs.accessSync('/var/lib/dbus/machine-id', fs.constants.R_OK);
|
|
cfg['HOST']['HOST_ID'] = crypto.createHash('sha256').update(fs.readFileSync('/var/lib/dbus/machine-id', 'utf8').replace(/\n$/, '')).digest('hex')
|
|
} catch (err) {
|
|
try {
|
|
fs.accessSync('/etc/machine-id', fs.constants.R_OK);
|
|
cfg['HOST']['HOST_ID'] = crypto.createHash('sha256').update(fs.readFileSync('/etc/machine-id', 'utf8').replace(/\n$/, '')).digest('hex')
|
|
} catch (err) {
|
|
console.error('ERROR: Missing: /var/lib/dbus/machine-id and /etc/machine-id');
|
|
}
|
|
}
|
|
|
|
try {
|
|
fs.accessSync('/etc/lsb-release', fs.constants.R_OK);
|
|
let line = fs.readFileSync('/etc/lsb-release', 'utf8').split(/\n/)
|
|
for (l in line) {
|
|
if (mch = line[l].match(/^DISTRIB_ID=(.*)$/)) {
|
|
cfg['OS']['DISTRO'] = mch[1].replace(/\"/g, '')
|
|
} else if (mch = line[l].match(/^DISTRIB_RELEASE=(.*)$/)) {
|
|
cfg['OS']['DISTRO_VERSION'] = mch[1].replace(/\"/g, '')
|
|
}
|
|
}
|
|
} catch (err) {
|
|
// console.log('WARNING: Missing /etc/lsb-release')
|
|
}
|
|
|
|
try {
|
|
fs.accessSync('/etc/os-release', fs.constants.R_OK);
|
|
let line = fs.readFileSync('/etc/os-release', 'utf8').split(/\n/)
|
|
for (l in line) {
|
|
if (mch = line[l].match(/^NAME=(.*)$/)) {
|
|
cfg['OS']['DISTRO'] = mch[1].replace(/\"/g, '')
|
|
} else if (mch = line[l].match(/^VERSION_ID=(.*)$/)) {
|
|
cfg['OS']['DISTRO_VERSION'] = mch[1].replace(/\"/g, '')
|
|
}
|
|
}
|
|
} catch(err) {
|
|
// console.log('WARNING: Missing /etc/os-release')
|
|
}
|
|
break;
|
|
|
|
case 'darwin':
|
|
let osxcmd = 'ioreg -rd1 -c IOPlatformExpertDevice | grep IOPlatformUUID|cut -d ' + "'" + '"' + "'" + ' -f4'
|
|
|
|
cfg['HOST']['HOST_ID'] = crypto.createHash('sha256').update(childProcess.execSync(osxcmd, { encoding: 'utf8' }).replace(/\n$/, '')).digest('hex')
|
|
|
|
osxcmd = 'sw_vers -productName'
|
|
cfg['OS']['DISTRO'] = childProcess.execSync(osxcmd, { encoding: 'utf8' }).replace(/\n$/, '')
|
|
|
|
osxcmd = 'sw_vers -productVersion'
|
|
cfg['OS']['DISTRO_VERSION'] = childProcess.execSync(osxcmd, { encoding: 'utf8' }).replace(/\n$/, '')
|
|
|
|
break;
|
|
|
|
case 'win32':
|
|
let wincmd = 'Reg Query "HKLM\\SOFTWARE\\Microsoft\\Cryptography"'
|
|
let machid = childProcess.execSync(wincmd, { encoding: 'utf8' })
|
|
let line = machid.split(/\n/)
|
|
for (l in line) {
|
|
if (mch = line[l].match(/MachineGuid\s+\S+\s+(\S+)/)) {
|
|
cfg['HOST']['HOST_ID'] = crypto.createHash('sha256').update(mch[1]).digest('hex')
|
|
}
|
|
}
|
|
|
|
wincmd = 'systeminfo'
|
|
line = childProcess.execSync(wincmd, { encoding: 'utf8' }).split(/\n/)
|
|
for (l in line) {
|
|
if (mch = line[l].match(/^OS\s+Name:\s+(.*)/)) {
|
|
cfg['OS']['DISTRO'] = mch[1]
|
|
} else if (mch = line[l].match(/^OS\s+Version:\s+(\S+)/)) {
|
|
cfg['OS']['DISTRO_VERSION'] = mch[1]
|
|
}
|
|
}
|
|
|
|
break;
|
|
default:
|
|
|
|
}
|
|
|
|
return abl_id
|
|
}
|
|
|
|
function tell_time (ts) {
|
|
var timeds = {} // Time Data Structure
|
|
var time = new Date()
|
|
|
|
if(ts) {
|
|
if(String(ts).match(/^\d+$/)) {
|
|
time = new Date(ts*1000)
|
|
} else {
|
|
time = new Date(ts)
|
|
}
|
|
}
|
|
|
|
timeds['LOCAL'] = {}
|
|
timeds['LOCAL']['YYYY'] = '' + time.getFullYear() + ''
|
|
|
|
if(time.getMonth() < 9) {
|
|
timeds['LOCAL']['MM'] = '0' + (time.getMonth() + 1) + ''
|
|
}else {
|
|
timeds['LOCAL']['MM'] = '' + (time.getMonth() + 1) + ''
|
|
}
|
|
|
|
if(time.getDate() <= 9) {
|
|
timeds['LOCAL']['DD'] = '0' + time.getDate() + ''
|
|
}else {
|
|
timeds['LOCAL']['DD'] = '' + time.getDate() + ''
|
|
}
|
|
|
|
if(time.getHours() <= 9) {
|
|
timeds['LOCAL']['hh'] = '0' + time.getHours() + '';
|
|
}else {
|
|
timeds['LOCAL']['hh'] = '' + time.getHours() + '';
|
|
}
|
|
|
|
if(time.getMinutes() <= 9) {
|
|
timeds['LOCAL']['mm'] = '0' + time.getMinutes() + '';
|
|
}else {
|
|
timeds['LOCAL']['mm'] = '' + time.getMinutes() + '';
|
|
}
|
|
|
|
if(time.getSeconds() <= 9) {
|
|
timeds['LOCAL']['ss'] = '0' + time.getSeconds() + '';
|
|
}else {
|
|
timeds['LOCAL']['ss'] = '' + time.getSeconds() + '';
|
|
}
|
|
|
|
timeds['LOCAL']['ms'] = time.getMilliseconds()
|
|
|
|
timeds['LOCAL']['YYYY-MM-DD'] = timeds['LOCAL']['YYYY'] + '-' + timeds['LOCAL']['MM'] + '-' + timeds['LOCAL']['DD'];
|
|
timeds['LOCAL']['hh:mm:ss'] = timeds['LOCAL']['hh'] + ':' + timeds['LOCAL']['mm'] + ':' + timeds['LOCAL']['ss'];
|
|
timeds['LOCAL']['YYYY-MM-DD hh:mm:ss'] = timeds['LOCAL']['YYYY-MM-DD'] + ' ' + timeds['LOCAL']['hh:mm:ss'];
|
|
|
|
timeds['LOCAL']['DOW'] = time.getDay();
|
|
// timeds['LOCAL']['DOY'] = '';
|
|
timeds['LOCAL']['WOY'] = get_week_of_year(time)[1] + 1;
|
|
|
|
timeds['LOCAL']['TZONE'] = time.getTimezoneOffset()/60;
|
|
|
|
timeds['UTC'] = {};
|
|
timeds['UTC']['YYYY'] = '' + time.getUTCFullYear() + '';
|
|
if(time.getUTCMonth() < 9) {
|
|
timeds['UTC']['MM'] = '0' + (time.getUTCMonth() + 1) + '';
|
|
}else {
|
|
timeds['UTC']['MM'] = '' + (time.getUTCMonth() + 1) + '';
|
|
}
|
|
|
|
if(time.getUTCDate() <= 9) {
|
|
timeds['UTC']['DD'] = '0' + time.getUTCDate() + '';
|
|
}else {
|
|
timeds['UTC']['DD'] = '' + time.getUTCDate() + '';
|
|
}
|
|
|
|
if(time.getUTCHours() <= 9) {
|
|
timeds['UTC']['hh'] = '0' + time.getUTCHours() + '';
|
|
}else {
|
|
timeds['UTC']['hh'] = '' + time.getUTCHours() + '';
|
|
}
|
|
|
|
if(time.getUTCMinutes() <= 9) {
|
|
timeds['UTC']['mm'] = '0' + time.getUTCMinutes() + '';
|
|
}else {
|
|
timeds['UTC']['mm'] = '' + time.getUTCMinutes() + '';
|
|
}
|
|
|
|
if(time.getUTCSeconds() <= 9) {
|
|
timeds['UTC']['ss'] = '0' + time.getUTCSeconds() + '';
|
|
}else {
|
|
timeds['UTC']['ss'] = '' + time.getUTCSeconds() + '';
|
|
}
|
|
|
|
timeds['UTC']['ms'] = time.getUTCMilliseconds()
|
|
|
|
timeds['UTC']['YYYY-MM-DD'] = timeds['UTC']['YYYY'] + '-' + timeds['UTC']['MM'] + '-' + timeds['UTC']['DD'];
|
|
timeds['UTC']['hh:mm:ss'] = timeds['UTC']['hh'] + ':' + timeds['UTC']['mm'] + ':' + timeds['UTC']['ss'];
|
|
timeds['UTC']['YYYY-MM-DD hh:mm:ss'] = timeds['UTC']['YYYY-MM-DD'] + ' ' + timeds['UTC']['hh:mm:ss'];
|
|
timeds['UTC']['ISO8601'] = timeds['UTC']['YYYY-MM-DD'] + 'T' + timeds['UTC']['hh:mm:ss'] + 'Z'
|
|
timeds['UTC']['TZONE'] = 0;
|
|
|
|
timeds['UTC']['DOW'] = time.getUTCDay();
|
|
timeds['UTC']['WOY'] = get_week_of_year(time)[1];
|
|
|
|
timeds['UTC']['EPOCH_MS'] = time.getTime();
|
|
timeds['UTC']['EPOCH'] = timeds['UTC']['EPOCH_MS']/1000;
|
|
|
|
timeds['UTC']['TIMESTAMP'] = Math.round(timeds['UTC']['EPOCH'])
|
|
timeds['UTC']['DOW'] = time.getUTCDay();
|
|
//timeds['UTC']['WOY'] = get_week_of_year(Date(timeds['UTC']['TIMESTAMP']))[1];
|
|
|
|
timeds['LOCAL']['TIMESTAMP'] = timeds['UTC']['TIMESTAMP'] - timeds['LOCAL']['TZONE'] * 3600
|
|
|
|
return timeds;
|
|
}
|
|
|
|
exports.tell_time = tell_time
|
|
|
|
function get_week_of_year( d ) {
|
|
https://stackoverflow.com/questions/6117814/get-week-of-year-in-javascript-like-in-php
|
|
// Copy date so don't modify original
|
|
d = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));
|
|
// Set to nearest Thursday: current date + 4 - current day number
|
|
// Make Sunday's day number 7
|
|
d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay()||7));
|
|
// Get first day of year
|
|
var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1));
|
|
// Calculate full weeks to nearest Thursday
|
|
var weekNo = String(Math.ceil(( ( (d - yearStart) / 86400000) + 1)/7));
|
|
// Return array of year and week number
|
|
|
|
if (weekNo <= 9) {
|
|
weekNo = '0' + weekNo
|
|
}
|
|
|
|
return [d.getUTCFullYear(), weekNo]
|
|
}
|
|
|
|
exports.get_week_of_year = get_week_of_year
|