|
|
@ -47,6 +47,7 @@ let index_keys = [ |
|
|
|
let sw_index_keys = [ |
|
|
|
"NAME", |
|
|
|
"VERSION", |
|
|
|
"KERNEL", |
|
|
|
"ARCH", |
|
|
|
"INSTALL_DATE", |
|
|
|
"ORIGIN" |
|
|
@ -283,7 +284,14 @@ for (hd in hostdirs) { |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx] = {} |
|
|
|
|
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['NAME'] = sw |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['VERSION'] = host_data['SOURCE']['SYSTEM_PROFILER']['SPApplicationsDataType']['Applications'][sw]['Version'] |
|
|
|
|
|
|
|
if (host_data['SOURCE']['SYSTEM_PROFILER']['SPApplicationsDataType']['Applications'][sw].hasOwnProperty('Version')) { |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['VERSION'] = host_data['SOURCE']['SYSTEM_PROFILER']['SPApplicationsDataType']['Applications'][sw]['Version'] |
|
|
|
} else { |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['VERSION'] = host_data['SOURCE']['SYSTEM_PROFILER']['SPApplicationsDataType']['Applications'][sw]['Last Modified'] |
|
|
|
} |
|
|
|
|
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['KERNEL'] = host_data['SOURCE']['NODEJS']['OS']['KERNEL'] |
|
|
|
|
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['ARCH'] = '' |
|
|
|
|
|
|
@ -307,7 +315,12 @@ for (hd in hostdirs) { |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx] = {} |
|
|
|
|
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['NAME'] = host_data['SOURCE']['SYSTEM_PROFILER']['SPApplicationsDataType'][sw]['_name'] |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['VERSION'] = host_data['SOURCE']['SYSTEM_PROFILER']['SPApplicationsDataType'][sw]['version'] |
|
|
|
if (host_data['SOURCE']['SYSTEM_PROFILER']['SPApplicationsDataType'][sw].hasOwnProperty('version')) { |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['VERSION'] = host_data['SOURCE']['SYSTEM_PROFILER']['SPApplicationsDataType'][sw]['version'] |
|
|
|
} else { |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['VERSION'] = host_data['SOURCE']['SYSTEM_PROFILER']['SPApplicationsDataType'][sw]['lastModified'] |
|
|
|
} |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['KERNEL'] = host_data['SOURCE']['NODEJS']['OS']['KERNEL'] |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['ARCH'] = host_data['SOURCE']['SYSTEM_PROFILER']['SPApplicationsDataType'][sw]['arch_kind'] |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['INSTALL_DATE'] = host_data['SOURCE']['SYSTEM_PROFILER']['SPApplicationsDataType'][sw]['lastModified'] |
|
|
|
if (host_data['SOURCE']['SYSTEM_PROFILER']['SPApplicationsDataType'][sw].hasOwnProperty('signed_by')) { |
|
|
@ -339,9 +352,11 @@ for (hd in hostdirs) { |
|
|
|
|
|
|
|
if (Object.keys(host_data['SOURCE']['SW'][swsrc][sw]['DPKG_LIST']).length > 0) { |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['VERSION'] = host_data['SOURCE']['SW'][swsrc][sw]['DPKG_LIST']['VERSION'] |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['KERNEL'] = host_data['SOURCE']['NODEJS']['OS']['KERNEL'] |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['ARCH'] = host_data['SOURCE']['SW'][swsrc][sw]['DPKG_LIST']['ARCH'] |
|
|
|
} else if (Object.keys(host_data['SOURCE']['SW'][swsrc][sw]['APT_CACHE']).length > 0) { |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['VERSION'] = host_data['SOURCE']['SW'][swsrc][sw]['APT_CACHE']['Version'] |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['KERNEL'] = host_data['SOURCE']['NODEJS']['OS']['KERNEL'] |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['ARCH'] = host_data['SOURCE']['SW'][swsrc][sw]['APT_CACHE']['Architecture'] |
|
|
|
} |
|
|
|
|
|
|
@ -389,6 +404,7 @@ for (hd in hostdirs) { |
|
|
|
|
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['NAME'] = host_data['SOURCE']['SW'][swsrc][sw]['Name'] |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['VERSION'] = host_data['SOURCE']['SW'][swsrc][sw]['Version'] |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['KERNEL'] = host_data['SOURCE']['NODEJS']['OS']['KERNEL'] |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['ARCH'] = host_data['SOURCE']['SW'][swsrc][sw]['Architecture'] |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['INSTALL_DATE'] = host_data['SOURCE']['SW'][swsrc][sw]['InstallDate'] |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['ORIGIN'] = host_data['SOURCE']['SW'][swsrc][sw]['Packager'] |
|
|
@ -405,6 +421,7 @@ for (hd in hostdirs) { |
|
|
|
|
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['NAME'] = host_data['SOURCE']['SW'][swsrc][sw]['DisplayName'] |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['VERSION'] = host_data['SOURCE']['SW'][swsrc][sw]['DisplayVersion'] |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['KERNEL'] = host_data['SOURCE']['NODEJS']['OS']['KERNEL'] |
|
|
|
if (host_data['SOURCE']['SW'][swsrc][sw]['InstallLocation']) { |
|
|
|
sw_index_data[ host_data['ITAM']['ID'] ][sw_idx]['ARCH'] = host_data['SOURCE']['SW'][swsrc][sw]['InstallLocation'] |
|
|
|
} else { |
|
|
@ -433,103 +450,244 @@ kernel_map['Linux'] = 'Linux' |
|
|
|
kernel_map['Darwin'] = 'OS X' |
|
|
|
kernel_map['Windows_NT'] = 'Windows' |
|
|
|
|
|
|
|
let os_stats = {} |
|
|
|
os_stats['HISTOGRAMS'] = {} |
|
|
|
os_stats['HISTOGRAMS']['KERNEL'] = {} |
|
|
|
os_stats['HISTOGRAMS']['OS'] = {} |
|
|
|
os_stats['HISTOGRAMS']['OS_VERSIONS'] = {} |
|
|
|
os_stats['HISTOGRAMS']['INSTALL_DATES_YYYY'] = {} |
|
|
|
os_stats['HISTOGRAMS']['INSTALL_DATES_YYYY-MM-DD'] = {} |
|
|
|
|
|
|
|
// os_stats['OS'] = {}
|
|
|
|
// os_stats['OS']['HOSTS'] = {}
|
|
|
|
// os_stats['OS']['HOSTS']['COUNT'] = 0
|
|
|
|
// os_stats['OS']['HOSTS']['INSTALL_DATE'] = {}
|
|
|
|
// os_stats['OS']['HOSTS']['INSTALL_DATE']['YYYY'] = {}
|
|
|
|
// os_stats['OS']['HOSTS']['INSTALL_DATE']['YYYY-MM'] = {}
|
|
|
|
// os_stats['OS']['HOSTS']['INSTALL_DATE']['YYYY-MM-DD'] = {}
|
|
|
|
|
|
|
|
let stats = {} |
|
|
|
stats['HISTOGRAMS'] = {} |
|
|
|
stats['HISTOGRAMS']['KERNEL'] = {} |
|
|
|
stats['HISTOGRAMS']['OS'] = {} |
|
|
|
stats['HISTOGRAMS']['OS_VERSIONS'] = {} |
|
|
|
stats['HISTOGRAMS']['INSTALL_DATES_YYYY'] = {} |
|
|
|
stats['HISTOGRAMS']['INSTALL_DATES_YYYY-MM-DD'] = {} |
|
|
|
stats['HISTOGRAMS']['SW_APPLICATIONS'] = {} |
|
|
|
stats['HISTOGRAMS']['SW_VERSIONS'] = {} |
|
|
|
stats['HISTOGRAMS']['SW_INSTALL_DATES'] = {} |
|
|
|
stats['HISTOGRAMS']['SW_AGE_DAYS'] = {} |
|
|
|
stats['HISTOGRAMS']['SW_PER_APP_LATEST_VERSION'] = {} |
|
|
|
stats['HISTOGRAMS']['SW_PER_HOST_LATEST_VERSION'] = {} |
|
|
|
stats['HISTOGRAMS']['SW_VERSIONS_STATUS'] = {} |
|
|
|
stats['HISTOGRAMS']['SW_PER_APP_LATEST_VERSION_SCORES'] = {} |
|
|
|
stats['HISTOGRAMS']['SW_PER_HOST_LATEST_VERSION_SCORES'] = {} |
|
|
|
|
|
|
|
for (h in index_data) { |
|
|
|
// os_stats['OS']['HOSTS']['COUNT']++
|
|
|
|
let isd = skqlib.tell_time(index_data[h]['OS_INSTALL_DATE']) |
|
|
|
// console.log(h + ' ' + isd['UTC']['YYYY-MM-DD'])
|
|
|
|
|
|
|
|
// if (!os_stats['OS']['HOSTS']['INSTALL_DATE']['YYYY'].hasOwnProperty(isd['UTC']['YYYY'])) {
|
|
|
|
// os_stats['OS']['HOSTS']['INSTALL_DATE']['YYYY'][ isd['UTC']['YYYY'] ] = {}
|
|
|
|
// os_stats['OS']['HOSTS']['INSTALL_DATE']['YYYY'][ isd['UTC']['YYYY'] ]['COUNT'] = 0
|
|
|
|
// os_stats['HISTOGRAMS']['INSTALL_DATES_YYYY'][ isd['UTC']['YYYY'] ] = 0
|
|
|
|
// }
|
|
|
|
// os_stats['OS']['HOSTS']['INSTALL_DATE']['YYYY'][ isd['UTC']['YYYY'] ]['COUNT']++
|
|
|
|
|
|
|
|
if ( !os_stats['HISTOGRAMS']['INSTALL_DATES_YYYY'].hasOwnProperty(isd['UTC']['YYYY']) ) { |
|
|
|
os_stats['HISTOGRAMS']['INSTALL_DATES_YYYY'][ isd['UTC']['YYYY'] ] = 0 |
|
|
|
if ( !stats['HISTOGRAMS']['INSTALL_DATES_YYYY'].hasOwnProperty(isd['UTC']['YYYY']) ) { |
|
|
|
stats['HISTOGRAMS']['INSTALL_DATES_YYYY'][ isd['UTC']['YYYY'] ] = 0 |
|
|
|
} |
|
|
|
os_stats['HISTOGRAMS']['INSTALL_DATES_YYYY'][ isd['UTC']['YYYY'] ]++ |
|
|
|
stats['HISTOGRAMS']['INSTALL_DATES_YYYY'][ isd['UTC']['YYYY'] ]++ |
|
|
|
|
|
|
|
// if (!os_stats['OS']['HOSTS']['INSTALL_DATE']['YYYY-MM'].hasOwnProperty(isd['UTC']['YYYY'] + '-' + isd['UTC']['MM'])) {
|
|
|
|
// os_stats['OS']['HOSTS']['INSTALL_DATE']['YYYY-MM'][ isd['UTC']['YYYY'] + '-' + isd['UTC']['MM'] ] = {}
|
|
|
|
// os_stats['OS']['HOSTS']['INSTALL_DATE']['YYYY-MM'][ isd['UTC']['YYYY'] + '-' + isd['UTC']['MM'] ]['COUNT'] = 0
|
|
|
|
// }
|
|
|
|
// os_stats['OS']['HOSTS']['INSTALL_DATE']['YYYY-MM'][ isd['UTC']['YYYY'] + '-' + isd['UTC']['MM'] ]['COUNT']++
|
|
|
|
if ( !stats['HISTOGRAMS']['INSTALL_DATES_YYYY-MM-DD'].hasOwnProperty(isd['UTC']['YYYY-MM-DD']) ) { |
|
|
|
stats['HISTOGRAMS']['INSTALL_DATES_YYYY-MM-DD'][ isd['UTC']['YYYY-MM-DD'] ] = 0 |
|
|
|
} |
|
|
|
stats['HISTOGRAMS']['INSTALL_DATES_YYYY-MM-DD'][ isd['UTC']['YYYY-MM-DD'] ]++ |
|
|
|
|
|
|
|
if (!stats['HISTOGRAMS']['KERNEL'].hasOwnProperty(kernel_map [ index_data[h]['KERNEL'] ])) { |
|
|
|
stats['HISTOGRAMS']['KERNEL'][ kernel_map [ index_data[h]['KERNEL'] ] ] = 0 |
|
|
|
} |
|
|
|
stats['HISTOGRAMS']['KERNEL'][ kernel_map [ index_data[h]['KERNEL'] ] ]++ |
|
|
|
|
|
|
|
// if (!os_stats['OS']['HOSTS']['INSTALL_DATE']['YYYY-MM-DD'].hasOwnProperty(isd['UTC']['YYYY-MM-DD'])) {
|
|
|
|
// os_stats['OS']['HOSTS']['INSTALL_DATE']['YYYY-MM-DD'][ isd['UTC']['YYYY-MM-DD'] ] = {}
|
|
|
|
// os_stats['OS']['HOSTS']['INSTALL_DATE']['YYYY-MM-DD'][ isd['UTC']['YYYY-MM-DD'] ]['COUNT'] = 0
|
|
|
|
// os_stats['HISTOGRAMS']['INSTALL_DATES_YYYY-MM-DD'][ isd['UTC']['YYYY-MM-DD'] ] = 0
|
|
|
|
// }
|
|
|
|
// os_stats['OS']['HOSTS']['INSTALL_DATE']['YYYY-MM-DD'][ isd['UTC']['YYYY-MM-DD'] ]['COUNT']++
|
|
|
|
if (!stats['HISTOGRAMS']['OS'].hasOwnProperty(index_data[h]['OS'])) { |
|
|
|
stats['HISTOGRAMS']['OS'][ index_data[h]['OS'] ] = 0 |
|
|
|
} |
|
|
|
stats['HISTOGRAMS']['OS'][ index_data[h]['OS'] ]++ |
|
|
|
|
|
|
|
if ( !os_stats['HISTOGRAMS']['INSTALL_DATES_YYYY-MM-DD'].hasOwnProperty(isd['UTC']['YYYY-MM-DD']) ) { |
|
|
|
os_stats['HISTOGRAMS']['INSTALL_DATES_YYYY-MM-DD'][ isd['UTC']['YYYY-MM-DD'] ] = 0 |
|
|
|
if (!stats['HISTOGRAMS']['OS_VERSIONS'].hasOwnProperty(String(index_data[h]['OS'])[0].toUpperCase() + String(index_data[h]['OS']).slice(1) + ' ' + index_data[h]['OS_VERSION'])) { |
|
|
|
stats['HISTOGRAMS']['OS_VERSIONS'][ String(index_data[h]['OS'])[0].toUpperCase() + String(index_data[h]['OS']).slice(1) + ' ' + index_data[h]['OS_VERSION'] ] = 0 |
|
|
|
} |
|
|
|
os_stats['HISTOGRAMS']['INSTALL_DATES_YYYY-MM-DD'][ isd['UTC']['YYYY-MM-DD'] ]++ |
|
|
|
stats['HISTOGRAMS']['OS_VERSIONS'][ String(index_data[h]['OS'])[0].toUpperCase() + String(index_data[h]['OS']).slice(1) + ' ' + index_data[h]['OS_VERSION'] ]++ |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (!os_stats['HISTOGRAMS']['KERNEL'].hasOwnProperty(kernel_map [ index_data[h]['KERNEL'] ])) { |
|
|
|
os_stats['HISTOGRAMS']['KERNEL'][ kernel_map [ index_data[h]['KERNEL'] ] ] = 0 |
|
|
|
} |
|
|
|
os_stats['HISTOGRAMS']['KERNEL'][ kernel_map [ index_data[h]['KERNEL'] ] ]++ |
|
|
|
|
|
|
|
// if (!os_stats['OS'].hasOwnProperty(index_data[h]['OS'])) {
|
|
|
|
// os_stats['OS'][ index_data[h]['OS'] ] = {}
|
|
|
|
// os_stats['OS'][ index_data[h]['OS'] ]['COUNT'] = 0
|
|
|
|
// os_stats['OS'][ index_data[h]['OS'] ]['VERSIONS'] = {}
|
|
|
|
// os_stats['OS']['OS_INSTALL_DATE'] = {}
|
|
|
|
// os_stats['HISTOGRAMS']['OS'][ index_data[h]['OS'] ] = 0
|
|
|
|
// }
|
|
|
|
// os_stats['OS'][ index_data[h]['OS'] ]['COUNT']++
|
|
|
|
if (!os_stats['HISTOGRAMS']['OS'].hasOwnProperty(index_data[h]['OS'])) { |
|
|
|
os_stats['HISTOGRAMS']['OS'][ index_data[h]['OS'] ] = 0 |
|
|
|
// Software Stats
|
|
|
|
let now = skqlib.tell_time() |
|
|
|
|
|
|
|
let regx_swver = [] |
|
|
|
rx = 0 |
|
|
|
// regx_swver[rx++] = '/^(\d+)\.$/'
|
|
|
|
// regx_swver[rx++] = /^(\d+)[.:~](\d+)[.:~](\d+)[.:~](\d+)[+\-_:](\S+)$/
|
|
|
|
// regx_swver[rx++] = /^(\d+)[.:~](\d+)[.:~](\d+)[+\-_:](\S+)$/
|
|
|
|
// regx_swver[rx++] = /^(\d+)[.:~](\d+)[+\-_:](\S+)$/
|
|
|
|
// regx_swver[rx++] = /^(\d+)[+\-_:](\S+)$/
|
|
|
|
regx_swver[rx++] = /^(\d+)[\.\:\~](\d+)[\.\:\~](\d+)[\.\:\~](\d+)/ |
|
|
|
regx_swver[rx++] = /^(\d+)[\.\:\~](\d+)[\.\:\~](\d+)/ |
|
|
|
regx_swver[rx++] = /^(\d+)[\.\:\~](\d+)/ |
|
|
|
regx_swver[rx++] = /^(\d+)/ |
|
|
|
// console.log(JSON.stringify(regx_swver, null, 2))
|
|
|
|
|
|
|
|
let swver_status = {} |
|
|
|
swver_status['MATCH'] = 0 |
|
|
|
swver_status['MISMATCH'] = 0 |
|
|
|
swver_status['MISSING'] = 0 |
|
|
|
swver_status['TOTAL'] = 0 |
|
|
|
|
|
|
|
for (h in sw_index_data) { |
|
|
|
for (sw in sw_index_data[h]) { |
|
|
|
|
|
|
|
swver_status['TOTAL']++ |
|
|
|
|
|
|
|
let swisd = {} |
|
|
|
swisd['UTC'] = {} |
|
|
|
swisd['UTC']['YYYY-MM-DD'] = 'YYYY-MM-DD' |
|
|
|
|
|
|
|
if (sw_index_data[h][sw].hasOwnProperty('INSTALL_DATE')) { |
|
|
|
swisd = skqlib.tell_time(sw_index_data[h][sw]['INSTALL_DATE']) |
|
|
|
} |
|
|
|
|
|
|
|
if (!stats['HISTOGRAMS']['SW_APPLICATIONS'].hasOwnProperty(sw)) { |
|
|
|
stats['HISTOGRAMS']['SW_APPLICATIONS'][sw] = 0 |
|
|
|
} |
|
|
|
stats['HISTOGRAMS']['SW_APPLICATIONS'][sw]++ |
|
|
|
|
|
|
|
// console.log(h + ' ' + sw + ' ' + swisd['UTC']['YYYY-MM-DD'])
|
|
|
|
if (!stats['HISTOGRAMS']['SW_INSTALL_DATES'].hasOwnProperty( swisd['UTC']['YYYY-MM-DD'] )) { |
|
|
|
stats['HISTOGRAMS']['SW_INSTALL_DATES'][ swisd['UTC']['YYYY-MM-DD'] ] = 0 |
|
|
|
} |
|
|
|
stats['HISTOGRAMS']['SW_INSTALL_DATES'][ swisd['UTC']['YYYY-MM-DD'] ]++ |
|
|
|
|
|
|
|
if (swisd['UTC']['YYYY-MM-DD'].match(/^\d{4}\-\d{2}\-\d{2}$/)) { |
|
|
|
let sw_age_days = Math.round( (Number(now['UTC']['EPOCH']) - Number(swisd['UTC']['EPOCH'])) / (24*3600) ) |
|
|
|
if (!stats['HISTOGRAMS']['SW_AGE_DAYS'].hasOwnProperty( sw_age_days )) { |
|
|
|
stats['HISTOGRAMS']['SW_AGE_DAYS'][ sw_age_days ] = 0 |
|
|
|
} |
|
|
|
stats['HISTOGRAMS']['SW_AGE_DAYS'][ sw_age_days ]++ |
|
|
|
} else { |
|
|
|
swage = 'UNKNOWN' |
|
|
|
if (!stats['HISTOGRAMS']['SW_AGE_DAYS'].hasOwnProperty( swage )) { |
|
|
|
stats['HISTOGRAMS']['SW_AGE_DAYS'][ swage ] = 0 |
|
|
|
} |
|
|
|
stats['HISTOGRAMS']['SW_AGE_DAYS'][ swage ]++ |
|
|
|
} |
|
|
|
|
|
|
|
if (!stats['HISTOGRAMS']['SW_VERSIONS'].hasOwnProperty(sw)) { |
|
|
|
stats['HISTOGRAMS']['SW_VERSIONS'][sw] = {} |
|
|
|
} |
|
|
|
|
|
|
|
let sw_version = '' |
|
|
|
let version_match = false |
|
|
|
for (rx in regx_swver) { |
|
|
|
regx = RegExp(regx_swver[rx]) |
|
|
|
if (sw_index_data[h][sw].hasOwnProperty('VERSION')) { |
|
|
|
// console.log(JSON.stringify(sw_index_data[h][sw], null, 2))
|
|
|
|
// console.log(sw + ' REGX: ' + regx + ' ' + sw_index_data[h][sw]['VERSION'])
|
|
|
|
if (!version_match && (swver_mch = sw_index_data[h][sw]['VERSION'].match(regx))) { |
|
|
|
// console.log(sw + ' ' + sw_index_data[h][sw]['VERSION'] + ' ' + rx + ': ' + regx + ' => ' + JSON.stringify(swver_mch, null, 2))
|
|
|
|
version_match = true |
|
|
|
swver_status['MATCH']++ |
|
|
|
for (iv=1; iv<swver_mch.length; iv++) { |
|
|
|
if (swver_mch[iv].match(/^\d+$/)) { |
|
|
|
sw_version += swver_mch[iv] + '.' |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
// console.log("MISSING VERSION: \n" + h + "\n" + JSON.stringify(sw_index_data[h][sw], null, 2))
|
|
|
|
sw_version = 'NULL' |
|
|
|
swver_status['MISSING']++ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (!version_match) { |
|
|
|
// console.log("WARNING: Unmatched Version Pattern (" + sw_index_data[h][sw]['VERSION'] + ")")
|
|
|
|
sw_version = 'ERROR: ' + sw_index_data[h][sw]['VERSION'] |
|
|
|
swver_status['MISMATCH']++ |
|
|
|
} |
|
|
|
|
|
|
|
sw_version = sw_version.replace(RegExp(/\.$/), '') |
|
|
|
// console.log(sw + ' ' + sw_version)
|
|
|
|
|
|
|
|
if (!stats['HISTOGRAMS']['SW_VERSIONS'][sw].hasOwnProperty(sw_version)) { |
|
|
|
stats['HISTOGRAMS']['SW_VERSIONS'][sw][ sw_version ] = [] |
|
|
|
} |
|
|
|
stats['HISTOGRAMS']['SW_VERSIONS'][sw][ sw_version ]++ |
|
|
|
|
|
|
|
} |
|
|
|
os_stats['HISTOGRAMS']['OS'][ index_data[h]['OS'] ]++ |
|
|
|
|
|
|
|
// if (!os_stats['OS'][ index_data[h]['OS'] ]['VERSIONS'].hasOwnProperty(index_data[h]['OS_VERSION'])) {
|
|
|
|
// os_stats['OS'][ index_data[h]['OS'] ]['VERSIONS'][ index_data[h]['OS_VERSION'] ] = {}
|
|
|
|
// os_stats['OS'][ index_data[h]['OS'] ]['VERSIONS'][ index_data[h]['OS_VERSION'] ]['COUNT'] = 0
|
|
|
|
// os_stats['OS'][ index_data[h]['OS'] ]['VERSIONS'][ index_data[h]['OS_VERSION'] ]['ARCH'] = {}
|
|
|
|
// os_stats['HISTOGRAMS']['OS_VERSIONS'][ index_data[h]['OS'] + ' ' + index_data[h]['OS_VERSION'] ] = 0
|
|
|
|
// }
|
|
|
|
// os_stats['OS'][ index_data[h]['OS'] ]['VERSIONS'][ index_data[h]['OS_VERSION'] ]['COUNT']++
|
|
|
|
|
|
|
|
if (!os_stats['HISTOGRAMS']['OS_VERSIONS'].hasOwnProperty(String(index_data[h]['OS'])[0].toUpperCase() + String(index_data[h]['OS']).slice(1) + ' ' + index_data[h]['OS_VERSION'])) { |
|
|
|
os_stats['HISTOGRAMS']['OS_VERSIONS'][ String(index_data[h]['OS'])[0].toUpperCase() + String(index_data[h]['OS']).slice(1) + ' ' + index_data[h]['OS_VERSION'] ] = 0 |
|
|
|
} |
|
|
|
|
|
|
|
stats['HISTOGRAMS']['SW_VERSIONS_STATUS'] = swver_status |
|
|
|
// console.log('swver_status: ' + "\n" + JSON.stringify(swver_status, null, 2))
|
|
|
|
|
|
|
|
let sorted_vers = [] |
|
|
|
for (h in sw_index_data) { |
|
|
|
for (sw in sw_index_data[h]) { |
|
|
|
// console.log(sw)
|
|
|
|
if (Object.keys(stats['HISTOGRAMS']['SW_VERSIONS'][sw]).length > 1) { |
|
|
|
// console.log(JSON.stringify(stats['HISTOGRAMS']['SW_VERSIONS'][sw], null, 2))
|
|
|
|
// console.log(JSON.stringify(Object.keys(stats['HISTOGRAMS']['SW_VERSIONS'][sw]), null, 2))
|
|
|
|
sorted_vers = sort_versions(Object.keys(stats['HISTOGRAMS']['SW_VERSIONS'][sw])) |
|
|
|
} else { |
|
|
|
sorted_vers.push( Object.keys( stats['HISTOGRAMS']['SW_VERSIONS'][sw] )[0] ) |
|
|
|
} |
|
|
|
// console.log(JSON.stringify(sorted_vers, null, 2))
|
|
|
|
let lastest_version = false |
|
|
|
let regx = RegExp('^' + sorted_vers[ (sorted_vers.length-1) ].replace(/\./g, '\\.')) |
|
|
|
// console.log(regx)
|
|
|
|
if (String(sw_index_data[h][sw]['VERSION']).match(regx)) { |
|
|
|
lastest_version = true |
|
|
|
} |
|
|
|
// console.log(h + ' : ' + sw + ' ' + sw_index_data[h][sw]['VERSION'] + ' <=> ' + sorted_vers[ (sorted_vers.length-1) ] + ' UPTODATE: ' + lastest_version)
|
|
|
|
|
|
|
|
if (!stats['HISTOGRAMS']['SW_PER_APP_LATEST_VERSION'].hasOwnProperty(sw)) { |
|
|
|
stats['HISTOGRAMS']['SW_PER_APP_LATEST_VERSION'][sw] = {} |
|
|
|
stats['HISTOGRAMS']['SW_PER_APP_LATEST_VERSION'][sw]['UP_TO_DATE'] = 0 |
|
|
|
stats['HISTOGRAMS']['SW_PER_APP_LATEST_VERSION'][sw]['OUT_OF_DATE'] = 0 |
|
|
|
} |
|
|
|
if (lastest_version) { |
|
|
|
stats['HISTOGRAMS']['SW_PER_APP_LATEST_VERSION'][sw]['UP_TO_DATE']++ |
|
|
|
} else { |
|
|
|
stats['HISTOGRAMS']['SW_PER_APP_LATEST_VERSION'][sw]['OUT_OF_DATE']++ |
|
|
|
} |
|
|
|
|
|
|
|
if (!stats['HISTOGRAMS']['SW_PER_HOST_LATEST_VERSION'].hasOwnProperty(h)) { |
|
|
|
stats['HISTOGRAMS']['SW_PER_HOST_LATEST_VERSION'][h] = {} |
|
|
|
stats['HISTOGRAMS']['SW_PER_HOST_LATEST_VERSION'][h]['UP_TO_DATE'] = 0 |
|
|
|
stats['HISTOGRAMS']['SW_PER_HOST_LATEST_VERSION'][h]['OUT_OF_DATE'] = 0 |
|
|
|
} |
|
|
|
if (lastest_version) { |
|
|
|
stats['HISTOGRAMS']['SW_PER_HOST_LATEST_VERSION'][h]['UP_TO_DATE']++ |
|
|
|
} else { |
|
|
|
stats['HISTOGRAMS']['SW_PER_HOST_LATEST_VERSION'][h]['OUT_OF_DATE']++ |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
os_stats['HISTOGRAMS']['OS_VERSIONS'][ String(index_data[h]['OS'])[0].toUpperCase() + String(index_data[h]['OS']).slice(1) + ' ' + index_data[h]['OS_VERSION'] ]++ |
|
|
|
} |
|
|
|
|
|
|
|
for (sw in stats['HISTOGRAMS']['SW_PER_APP_LATEST_VERSION']) { |
|
|
|
stats['HISTOGRAMS']['SW_PER_APP_LATEST_VERSION'][sw]['UP_TO_DATE_SCORE'] = Number(stats['HISTOGRAMS']['SW_PER_APP_LATEST_VERSION'][sw]['UP_TO_DATE'])/(Number(stats['HISTOGRAMS']['SW_PER_APP_LATEST_VERSION'][sw]['UP_TO_DATE']) + Number(stats['HISTOGRAMS']['SW_PER_APP_LATEST_VERSION'][sw]['OUT_OF_DATE'])) |
|
|
|
|
|
|
|
// if (!os_stats['OS'][ index_data[h]['OS'] ]['VERSIONS'][ index_data[h]['OS_VERSION'] ]['ARCH'].hasOwnProperty(index_data[h]['OS_ARCH'])) {
|
|
|
|
// os_stats['OS'][ index_data[h]['OS'] ]['VERSIONS'][ index_data[h]['OS_VERSION'] ]['ARCH'][ index_data[h]['OS_ARCH'] ] = {}
|
|
|
|
// os_stats['OS'][ index_data[h]['OS'] ]['VERSIONS'][ index_data[h]['OS_VERSION'] ]['ARCH'][ index_data[h]['OS_ARCH'] ]['COUNT'] = 0
|
|
|
|
// }
|
|
|
|
// os_stats['OS'][ index_data[h]['OS'] ]['VERSIONS'][ index_data[h]['OS_VERSION'] ]['ARCH'][ index_data[h]['OS_ARCH'] ]['COUNT']++
|
|
|
|
for (scr=0; scr<=1; scr+=0.1) { |
|
|
|
scridx = Number(scr).toPrecision(2) |
|
|
|
if (!stats['HISTOGRAMS']['SW_PER_APP_LATEST_VERSION_SCORES'].hasOwnProperty(scridx)) { |
|
|
|
stats['HISTOGRAMS']['SW_PER_APP_LATEST_VERSION_SCORES'][scridx] = 0 |
|
|
|
} |
|
|
|
|
|
|
|
if ( (Number(scridx) <= stats['HISTOGRAMS']['SW_PER_APP_LATEST_VERSION'][sw]['UP_TO_DATE_SCORE']) && (stats['HISTOGRAMS']['SW_PER_APP_LATEST_VERSION'][sw]['UP_TO_DATE_SCORE'] < (Number(scridx)+0.1)) ) { |
|
|
|
stats['HISTOGRAMS']['SW_PER_APP_LATEST_VERSION_SCORES'][scridx]++ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
for (h in stats['HISTOGRAMS']['SW_PER_HOST_LATEST_VERSION']) { |
|
|
|
stats['HISTOGRAMS']['SW_PER_HOST_LATEST_VERSION'][h]['UP_TO_DATE_SCORE'] = Number(stats['HISTOGRAMS']['SW_PER_HOST_LATEST_VERSION'][h]['UP_TO_DATE'])/(Number(stats['HISTOGRAMS']['SW_PER_HOST_LATEST_VERSION'][h]['UP_TO_DATE']) + Number(stats['HISTOGRAMS']['SW_PER_HOST_LATEST_VERSION'][h]['OUT_OF_DATE'])) |
|
|
|
|
|
|
|
for (scr=0; scr<=1; scr+=0.1) { |
|
|
|
scridx = Number(scr).toPrecision(2) |
|
|
|
if (!stats['HISTOGRAMS']['SW_PER_HOST_LATEST_VERSION_SCORES'].hasOwnProperty(scridx)) { |
|
|
|
stats['HISTOGRAMS']['SW_PER_HOST_LATEST_VERSION_SCORES'][scridx] = 0 |
|
|
|
} |
|
|
|
|
|
|
|
if ( (Number(scridx) <= stats['HISTOGRAMS']['SW_PER_HOST_LATEST_VERSION'][h]['UP_TO_DATE_SCORE']) && (stats['HISTOGRAMS']['SW_PER_HOST_LATEST_VERSION'][h]['UP_TO_DATE_SCORE'] < (Number(scridx)+0.1)) ) { |
|
|
|
stats['HISTOGRAMS']['SW_PER_HOST_LATEST_VERSION_SCORES'][scridx]++ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
console.log(JSON.stringify(os_stats, null, 2)) |
|
|
|
|
|
|
|
// console.log(JSON.stringify(stats, null, 2))
|
|
|
|
|
|
|
|
// Save Data Files
|
|
|
|
console.log('---------- Writing Files ------------') |
|
|
|
// console.log(JSON.stringify(index_data, null, 2))
|
|
|
|
console.log('WRITING: ' + index_data_file) |
|
|
|
fs.writeFileSync(index_data_file, JSON.stringify(index_data, null, 2), 'utf8') |
|
|
@ -540,9 +698,15 @@ fs.writeFileSync(sw_index_data_file, JSON.stringify(sw_index_data, null, 2), 'ut |
|
|
|
console.log('WRITING: ' + index_data_file.replace(/json$/, 'csv')) |
|
|
|
fs.writeFileSync(index_data_file.replace(/json$/, 'csv'), index_data_to_csv(index_keys, index_data), 'utf8') |
|
|
|
|
|
|
|
|
|
|
|
console.log('WRITING: ' + sw_index_data_file.replace(/json$/, 'csv')) |
|
|
|
fs.writeFileSync(sw_index_data_file.replace(/json$/, 'csv'), index_data_to_csv(sw_index_keys, sw_index_data), 'utf8') |
|
|
|
|
|
|
|
|
|
|
|
let stats_file = path.join(__dirname, 'itam-data', 'proc', 'stats.json') |
|
|
|
console.log('WRITING: ' + stats_file) |
|
|
|
fs.writeFileSync(stats_file, JSON.stringify(os_stats, null, 2), 'utf8') |
|
|
|
fs.writeFileSync(stats_file, JSON.stringify(stats, null, 2), 'utf8') |
|
|
|
|
|
|
|
|
|
|
|
// Sikuliaq CSV Reports
|
|
|
|
console.log('WRITING: ' + path.join(__dirname, 'itam-data', 'reports', 'skq_appendix_d_hw.csv')) |
|
|
@ -834,3 +998,71 @@ function skq_index_data_to_app_d_hw_csv(keys, data) { |
|
|
|
|
|
|
|
return csv |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function sort_versions (version_array) { |
|
|
|
// Takes in a array of semver (w.x.y.z) values and sort them numerically by version
|
|
|
|
// Supports up to 4 numeric version levels
|
|
|
|
let sorted = [] |
|
|
|
|
|
|
|
let version_obj = {} |
|
|
|
for (v in version_array) { |
|
|
|
if(version_split = String(version_array[v]).split(/\./)) { |
|
|
|
// console.log(JSON.stringify(version_split, null, 2))
|
|
|
|
for (i=0; i<version_split.length; i++) { |
|
|
|
// console.log(i + ' < ' + version_split.length + ' ' + version_array[v])
|
|
|
|
switch (i) { |
|
|
|
case 0: |
|
|
|
if (version_split.hasOwnProperty(0) && !version_obj.hasOwnProperty( version_split[0] )) { |
|
|
|
version_obj[ version_split[0] ] = {} |
|
|
|
} |
|
|
|
case 1: |
|
|
|
if (version_split.hasOwnProperty(1) && !version_obj[ version_split[0] ].hasOwnProperty( version_split[1] )) { |
|
|
|
version_obj[ version_split[0] ][ version_split[1] ] = {} |
|
|
|
} |
|
|
|
case 2: |
|
|
|
if (version_split.hasOwnProperty(2) && !version_obj[ version_split[0] ][ version_split[1] ].hasOwnProperty( version_split[2] )) { |
|
|
|
version_obj[ version_split[0] ][ version_split[1] ][ version_split[2] ] = {} |
|
|
|
} |
|
|
|
case 3: |
|
|
|
if (version_split.hasOwnProperty(3) && !version_obj[ version_split[0] ][ version_split[1] ][ version_split[2] ].hasOwnProperty( version_split[3] )) { |
|
|
|
version_obj[ version_split[0] ][ version_split[1] ][ version_split[2] ][ version_split[3] ] = {} |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
// console.log(i + JSON.stringify(version_obj, null, 2))
|
|
|
|
} |
|
|
|
} else { |
|
|
|
console.log('ERROR: Version Split Parser: ' + version_array[v]) |
|
|
|
} |
|
|
|
} |
|
|
|
// console.log(JSON.stringify(version_obj, null, 2))
|
|
|
|
|
|
|
|
for (v1 in version_obj) { |
|
|
|
// console.log('ln ' + Object.keys(version_obj[v1]).length)
|
|
|
|
if (Object.keys(version_obj[v1]).length == 0) { |
|
|
|
// console.log ('ver: ' + v1)
|
|
|
|
sorted.push(v1) |
|
|
|
} |
|
|
|
for (v2 in version_obj[v1]) { |
|
|
|
if (Object.keys(version_obj[v1][v2]).length == 0) { |
|
|
|
// console.log ('ver: ' + v1 + '.' + v2)
|
|
|
|
sorted.push(v1 + '.' + v2) |
|
|
|
} |
|
|
|
for (v3 in version_obj[v1][v2]) { |
|
|
|
if (Object.keys(version_obj[v1][v2][v3]).length == 0) { |
|
|
|
// console.log ('ver: ' + v1 + '.' + v2 + '.' + v3)
|
|
|
|
sorted.push(v1 + '.' + v2 + '.' + v3) |
|
|
|
} |
|
|
|
for (v4 in version_obj[v1][v2][v3]) { |
|
|
|
if (Object.keys(version_obj[v1][v2][v3][v4]).length == 0) { |
|
|
|
// console.log ('ver: ' + v1 + '.' + v2 + '.' + v3 + '.' + v4)
|
|
|
|
sorted.push(v1 + '.' + v2 + '.' + v3 + '.' + v4) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return sorted |
|
|
|
} |