Sikuliaq IT Asset Manager (skqitam)
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

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