Browse Source

Generated Per Host and Per App Up to Date Scores

v0.0.12
John Haverlack 3 years ago
parent
commit
0c492f8e63
  1. 390
      itam-data-analyzer.js
  2. 56
      skqitam-client/index.js
  3. 67
      web/root/docs/js/skq-it-am.js
  4. 17
      web/root/docs/stats.md
  5. 67
      web/root/site/js/skq-it-am.js
  6. 2
      web/root/site/search/search_index.json
  7. 10
      web/root/site/sitemap.xml
  8. BIN
      web/root/site/sitemap.xml.gz
  9. 17
      web/root/site/stats.html

390
itam-data-analyzer.js

@ -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
}

56
skqitam-client/index.js

@ -778,34 +778,34 @@ function apt_history_to_json() {
}
break;
case 'Remove':
pkg_list = apt_history_event[ Object.keys(apt_history_event)[k] ].split('), ')
// console.log(JSON.stringify(pkg_list, null, 2))
for (pkl in pkg_list) {
// console.log ('DEBUG: ' + pkg_list[pkl])
if (pkg_meta1 = String(pkg_list[pkl].replace(/\)$/, '')).split(' (')) {
// console.log('META1' + JSON.stringify(pkg_meta1, null, 2))
if (pkg_meta2 = String(pkg_meta1[0]).split(':')) { // Pkg Name : Arch
// console.log('META2' + JSON.stringify(pkg_meta2, null, 2))
if (! apt_history_obj.hasOwnProperty(pkg_meta2[0])) { apt_history_obj[ pkg_meta2[0] ] = {} }
apt_history_obj[ pkg_meta2[0] ][apt_history_event['Start-Date']] = {}
apt_history_obj[ pkg_meta2[0] ][apt_history_event['Start-Date']]['EVENT'] = Object.keys(apt_history_event)[k]
apt_history_obj[ pkg_meta2[0] ][apt_history_event['Start-Date']]['ARCH'] = pkg_meta2[1]
if (pkg_meta3 = String(pkg_meta1[1]).split(', ')) { // Version, Status
// console.log('META3' + JSON.stringify(pkg_meta3, null, 2))
apt_history_obj[ pkg_meta2[0] ][apt_history_event['Start-Date']]['VERSION'] = pkg_meta3[0]
} else {
console.log("WARNING: META3 MisMatch")
}
} else {
console.log("WARNING: META2 MisMatch")
}
} else {
console.log("WARNING: META1 MisMatch")
}
}
// pkg_list = apt_history_event[ Object.keys(apt_history_event)[k] ].split('), ')
// // console.log(JSON.stringify(pkg_list, null, 2))
// for (pkl in pkg_list) {
// // console.log ('DEBUG: ' + pkg_list[pkl])
// if (pkg_meta1 = String(pkg_list[pkl].replace(/\)$/, '')).split(' (')) {
// // console.log('META1' + JSON.stringify(pkg_meta1, null, 2))
// if (pkg_meta2 = String(pkg_meta1[0]).split(':')) { // Pkg Name : Arch
// // console.log('META2' + JSON.stringify(pkg_meta2, null, 2))
// if (! apt_history_obj.hasOwnProperty(pkg_meta2[0])) { apt_history_obj[ pkg_meta2[0] ] = {} }
// apt_history_obj[ pkg_meta2[0] ][apt_history_event['Start-Date']] = {}
// apt_history_obj[ pkg_meta2[0] ][apt_history_event['Start-Date']]['EVENT'] = Object.keys(apt_history_event)[k]
// apt_history_obj[ pkg_meta2[0] ][apt_history_event['Start-Date']]['ARCH'] = pkg_meta2[1]
//
// if (pkg_meta3 = String(pkg_meta1[1]).split(', ')) { // Version, Status
// // console.log('META3' + JSON.stringify(pkg_meta3, null, 2))
// apt_history_obj[ pkg_meta2[0] ][apt_history_event['Start-Date']]['VERSION'] = pkg_meta3[0]
//
// } else {
// console.log("WARNING: META3 MisMatch")
// }
// } else {
// console.log("WARNING: META2 MisMatch")
// }
//
// } else {
// console.log("WARNING: META1 MisMatch")
// }
// }
break;
case 'Upgrade':
pkg_list = apt_history_event[ Object.keys(apt_history_event)[k] ].split('), ')

67
web/root/docs/js/skq-it-am.js

@ -396,7 +396,7 @@ load_webconf.get('api/data/proc/stats.json', function(response) {
let labels = Object.keys(stats['HISTOGRAMS']['INSTALL_DATES_YYYY']).sort()
let data = []
// console.log()
for (k in labels) {
// console.log(k + ' ' + stats['HISTOGRAMS']['OS_VERSIONS'][k]);
data.push(stats['HISTOGRAMS']['INSTALL_DATES_YYYY'][labels[k]])
@ -411,7 +411,7 @@ load_webconf.get('api/data/proc/stats.json', function(response) {
data: {
labels: labels,
datasets: [{
label: 'System Install Year',
label: 'System Install by Year',
data: data,
backgroundColor: [
'rgba(75, 192, 192, 0.2)'
@ -434,7 +434,68 @@ load_webconf.get('api/data/proc/stats.json', function(response) {
});
}
})
// SW Summary
if (document.getElementById("stats_sw_age_days")) {
let age_days = {}
let unknown = 0
for (sad in stats['HISTOGRAMS']['SW_AGE_DAYS']) {
if (sad == 'UNKNOWN') {
unknown = stats['HISTOGRAMS']['SW_AGE_DAYS'][sad]
} else {
age_days[Number(sad)] = Number(stats['HISTOGRAMS']['SW_AGE_DAYS'][sad])
}
}
// console.log(JSON.stringify(age_days, null, 2))
let labels = Object.keys(age_days).sort((a,b)=>a-b)
let data = []
for (k in labels) {
// console.log(k + ' ' + stats['HISTOGRAMS']['OS_VERSIONS'][k]);
data.push(age_days[labels[k]])
}
// console.log(JSON.stringify(labels, null, 2))
// console.log(JSON.stringify(data, null, 2))
var canvas = document.getElementById('stats_sw_age_days');
var plot = new Chart(canvas, {
type: 'bar',
data: {
labels: labels,
datasets: [{
label: 'Software Age (Days)',
data: data,
backgroundColor: [
'rgba(75, 192, 192, 0.2)'
],
borderColor: [
'rgba(75, 192, 192, 1)'
],
borderWidth: 1
}]
},
options: {
scales: {
yAxes: [{
ticks: {
beginAtZero: true
}
}]
// y: {
// type: 'logarithmic',
// }
}
}
});
}
}) // End load_webconf

17
web/root/docs/stats.md

@ -11,8 +11,21 @@
</div>
</div>
## OS Versions
## System OS Versions
<canvas id="stats_os_vers" width="600" height="200"></canvas>
## System Install Year
## Systems Installed by Year
<canvas id="stats_os_inst_yyyy" width="600" height="200"></canvas>
## Software Summary
<div class="row">
<div class="col-sm-4">
<canvas id="stats_sw" width="200" height="200" style="max-width: 300px; max-height: 300px;"></canvas>
</div>
<div class="col-sm-4">
<div id="stats_sw_summary"></div>
</div>
</div>
## Software Age (Days)
<canvas id="stats_sw_age_days" width="600" height="200"></canvas>

67
web/root/site/js/skq-it-am.js

@ -396,7 +396,7 @@ load_webconf.get('api/data/proc/stats.json', function(response) {
let labels = Object.keys(stats['HISTOGRAMS']['INSTALL_DATES_YYYY']).sort()
let data = []
// console.log()
for (k in labels) {
// console.log(k + ' ' + stats['HISTOGRAMS']['OS_VERSIONS'][k]);
data.push(stats['HISTOGRAMS']['INSTALL_DATES_YYYY'][labels[k]])
@ -411,7 +411,7 @@ load_webconf.get('api/data/proc/stats.json', function(response) {
data: {
labels: labels,
datasets: [{
label: 'System Install Year',
label: 'System Install by Year',
data: data,
backgroundColor: [
'rgba(75, 192, 192, 0.2)'
@ -434,7 +434,68 @@ load_webconf.get('api/data/proc/stats.json', function(response) {
});
}
})
// SW Summary
if (document.getElementById("stats_sw_age_days")) {
let age_days = {}
let unknown = 0
for (sad in stats['HISTOGRAMS']['SW_AGE_DAYS']) {
if (sad == 'UNKNOWN') {
unknown = stats['HISTOGRAMS']['SW_AGE_DAYS'][sad]
} else {
age_days[Number(sad)] = Number(stats['HISTOGRAMS']['SW_AGE_DAYS'][sad])
}
}
// console.log(JSON.stringify(age_days, null, 2))
let labels = Object.keys(age_days).sort((a,b)=>a-b)
let data = []
for (k in labels) {
// console.log(k + ' ' + stats['HISTOGRAMS']['OS_VERSIONS'][k]);
data.push(age_days[labels[k]])
}
// console.log(JSON.stringify(labels, null, 2))
// console.log(JSON.stringify(data, null, 2))
var canvas = document.getElementById('stats_sw_age_days');
var plot = new Chart(canvas, {
type: 'bar',
data: {
labels: labels,
datasets: [{
label: 'Software Age (Days)',
data: data,
backgroundColor: [
'rgba(75, 192, 192, 0.2)'
],
borderColor: [
'rgba(75, 192, 192, 1)'
],
borderWidth: 1
}]
},
options: {
scales: {
yAxes: [{
ticks: {
beginAtZero: true
}
}]
// y: {
// type: 'logarithmic',
// }
}
}
});
}
}) // End load_webconf

2
web/root/site/search/search_index.json
File diff suppressed because it is too large
View File

10
web/root/site/sitemap.xml

@ -1,23 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><url>
<loc>None</loc>
<lastmod>2021-07-01</lastmod>
<lastmod>2021-07-02</lastmod>
<changefreq>daily</changefreq>
</url><url>
<loc>None</loc>
<lastmod>2021-07-01</lastmod>
<lastmod>2021-07-02</lastmod>
<changefreq>daily</changefreq>
</url><url>
<loc>None</loc>
<lastmod>2021-07-01</lastmod>
<lastmod>2021-07-02</lastmod>
<changefreq>daily</changefreq>
</url><url>
<loc>None</loc>
<lastmod>2021-07-01</lastmod>
<lastmod>2021-07-02</lastmod>
<changefreq>daily</changefreq>
</url><url>
<loc>None</loc>
<lastmod>2021-07-01</lastmod>
<lastmod>2021-07-02</lastmod>
<changefreq>daily</changefreq>
</url>
</urlset>

BIN
web/root/site/sitemap.xml.gz

17
web/root/site/stats.html

@ -136,10 +136,21 @@
<div id="stats_summary"></div>
</div>
</div></p>
<h2 id="os-versions">OS Versions</h2>
<h2 id="system-os-versions">System OS Versions</h2>
<p><canvas id="stats_os_vers" width="600" height="200"></canvas></p>
<h2 id="system-install-year">System Install Year</h2>
<p><canvas id="stats_os_inst_yyyy" width="600" height="200"></canvas></p></div>
<h2 id="systems-installed-by-year">Systems Installed by Year</h2>
<p><canvas id="stats_os_inst_yyyy" width="600" height="200"></canvas></p>
<h2 id="software-summary">Software Summary</h2>
<p><div class="row">
<div class="col-sm-4">
<canvas id="stats_sw" width="200" height="200" style="max-width: 300px; max-height: 300px;"></canvas>
</div>
<div class="col-sm-4">
<div id="stats_sw_summary"></div>
</div>
</div></p>
<h2 id="software-age-days">Software Age (Days)</h2>
<p><canvas id="stats_sw_age_days" width="600" height="200"></canvas></p></div>
</div>
</div>

Loading…
Cancel
Save