Add new file base system stats and MCI codes
This commit is contained in:
parent
1c2926fbe9
commit
3980c8acae
11
core/bbs.js
11
core/bbs.js
|
@ -234,6 +234,17 @@ function initialize(cb) {
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
function initFileAreaStats(callback) {
|
||||||
|
const getAreaStats = require('./file_base_area.js').getAreaStats;
|
||||||
|
getAreaStats( (err, stats) => {
|
||||||
|
if(!err) {
|
||||||
|
const StatLog = require('./stat_log.js');
|
||||||
|
StatLog.setNonPeristentSystemStat('file_base_area_stats', stats);
|
||||||
|
}
|
||||||
|
|
||||||
|
return callback(null);
|
||||||
|
});
|
||||||
|
},
|
||||||
function initMCI(callback) {
|
function initMCI(callback) {
|
||||||
return require('./predefined_mci.js').init(callback);
|
return require('./predefined_mci.js').init(callback);
|
||||||
},
|
},
|
||||||
|
|
|
@ -713,6 +713,11 @@ function getDefaultConfig() {
|
||||||
action : '@method:core/message_area.js:trimMessageAreasScheduledEvent',
|
action : '@method:core/message_area.js:trimMessageAreasScheduledEvent',
|
||||||
},
|
},
|
||||||
|
|
||||||
|
updateFileAreaStats : {
|
||||||
|
schedule : 'every 1 hours',
|
||||||
|
action : '@method:core/file_base_area.js:updateAreaStatsScheduledEvent',
|
||||||
|
},
|
||||||
|
|
||||||
forgotPasswordMaintenance : {
|
forgotPasswordMaintenance : {
|
||||||
schedule : 'every 24 hours',
|
schedule : 'every 24 hours',
|
||||||
action : '@method:core/web_password_reset.js:performMaintenanceTask',
|
action : '@method:core/web_password_reset.js:performMaintenanceTask',
|
||||||
|
|
|
@ -13,6 +13,7 @@ const Log = require('./logger.js').log;
|
||||||
const resolveMimeType = require('./mime_util.js').resolveMimeType;
|
const resolveMimeType = require('./mime_util.js').resolveMimeType;
|
||||||
const stringFormat = require('./string_format.js');
|
const stringFormat = require('./string_format.js');
|
||||||
const wordWrapText = require('./word_wrap.js').wordWrapText;
|
const wordWrapText = require('./word_wrap.js').wordWrapText;
|
||||||
|
const StatLog = require('./stat_log.js');
|
||||||
|
|
||||||
// deps
|
// deps
|
||||||
const _ = require('lodash');
|
const _ = require('lodash');
|
||||||
|
@ -39,6 +40,10 @@ exports.changeFileAreaWithOptions = changeFileAreaWithOptions;
|
||||||
exports.scanFile = scanFile;
|
exports.scanFile = scanFile;
|
||||||
exports.scanFileAreaForChanges = scanFileAreaForChanges;
|
exports.scanFileAreaForChanges = scanFileAreaForChanges;
|
||||||
exports.getDescFromFileName = getDescFromFileName;
|
exports.getDescFromFileName = getDescFromFileName;
|
||||||
|
exports.getAreaStats = getAreaStats;
|
||||||
|
|
||||||
|
// for scheduler:
|
||||||
|
exports.updateAreaStatsScheduledEvent = updateAreaStatsScheduledEvent;
|
||||||
|
|
||||||
const WellKnownAreaTags = exports.WellKnownAreaTags = {
|
const WellKnownAreaTags = exports.WellKnownAreaTags = {
|
||||||
Invalid : '',
|
Invalid : '',
|
||||||
|
@ -857,3 +862,63 @@ function getDescFromFileName(fileName) {
|
||||||
|
|
||||||
return _.upperFirst(name.replace(/[\-_.+]/g, ' ').replace(/\s+/g, ' '));
|
return _.upperFirst(name.replace(/[\-_.+]/g, ' ').replace(/\s+/g, ' '));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Return an object of stats about an area(s)
|
||||||
|
//
|
||||||
|
// {
|
||||||
|
//
|
||||||
|
// totalFiles : <totalFileCount>,
|
||||||
|
// totalBytes : <totalByteSize>,
|
||||||
|
// areas : {
|
||||||
|
// <areaTag> : {
|
||||||
|
// files : <fileCount>,
|
||||||
|
// bytes : <byteSize>
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
function getAreaStats(cb) {
|
||||||
|
FileDb.all(
|
||||||
|
`SELECT DISTINCT f.area_tag, COUNT(f.file_id) AS total_files, SUM(m.meta_value) AS total_byte_size
|
||||||
|
FROM file f, file_meta m
|
||||||
|
WHERE f.file_id = m.file_id AND m.meta_name='byte_size'
|
||||||
|
GROUP BY f.area_tag;`,
|
||||||
|
(err, statRows) => {
|
||||||
|
if(err) {
|
||||||
|
return cb(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!statRows || 0 === statRows.length) {
|
||||||
|
return cb(Errors.DoesNotExist('No file areas to acquire stats from'));
|
||||||
|
}
|
||||||
|
|
||||||
|
return cb(
|
||||||
|
null,
|
||||||
|
statRows.reduce( (stats, v) => {
|
||||||
|
stats.totalFiles = (stats.totalFiles || 0) + v.total_files;
|
||||||
|
stats.totalBytes = (stats.totalBytes || 0) + v.total_byte_size;
|
||||||
|
|
||||||
|
stats.areas = stats.areas || {};
|
||||||
|
|
||||||
|
stats.areas[v.area_tag] = {
|
||||||
|
files : v.total_files,
|
||||||
|
bytes : v.total_byte_size,
|
||||||
|
};
|
||||||
|
return stats;
|
||||||
|
}, {})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// method exposed for event scheduler
|
||||||
|
function updateAreaStatsScheduledEvent(args, cb) {
|
||||||
|
getAreaStats( (err, stats) => {
|
||||||
|
if(!err) {
|
||||||
|
StatLog.setNonPeristentSystemStat('file_base_area_stats', stats);
|
||||||
|
}
|
||||||
|
|
||||||
|
return cb(err);
|
||||||
|
});
|
||||||
|
}
|
|
@ -201,12 +201,20 @@ const PREDEFINED_MCI_GENERATORS = {
|
||||||
const byteSize = StatLog.getSystemStatNum('ul_total_bytes');
|
const byteSize = StatLog.getSystemStatNum('ul_total_bytes');
|
||||||
return formatByteSize(byteSize, true); // true=withAbbr
|
return formatByteSize(byteSize, true); // true=withAbbr
|
||||||
},
|
},
|
||||||
|
TF : function totalFilesOnSystem() {
|
||||||
|
const areaStats = StatLog.getSystemStat('file_base_area_stats');
|
||||||
|
return _.get(areaStats, 'totalFiles', 0).toString();
|
||||||
|
},
|
||||||
|
TB : function totalBytesOnSystem() {
|
||||||
|
const areaStats = StatLog.getSystemStat('file_base_area_stats');
|
||||||
|
const totalBytes = parseInt(_.get(areaStats, 'totalBytes', 0));
|
||||||
|
return formatByteSize(totalBytes, true); // true=withAbbr
|
||||||
|
},
|
||||||
|
|
||||||
// :TODO: PT - Messages posted *today* (Obv/2)
|
// :TODO: PT - Messages posted *today* (Obv/2)
|
||||||
// -> Include FTN/etc.
|
// -> Include FTN/etc.
|
||||||
// :TODO: NT - New users today (Obv/2)
|
// :TODO: NT - New users today (Obv/2)
|
||||||
// :TODO: CT - Calls *today* (Obv/2)
|
// :TODO: CT - Calls *today* (Obv/2)
|
||||||
// :TODO: TF - Total files on the system (Obv/2)
|
|
||||||
// :TODO: FT - Files uploaded/added *today* (Obv/2)
|
// :TODO: FT - Files uploaded/added *today* (Obv/2)
|
||||||
// :TODO: DD - Files downloaded *today* (iNiQUiTY)
|
// :TODO: DD - Files downloaded *today* (iNiQUiTY)
|
||||||
// :TODO: TP - total message/posts on the system (Obv/2)
|
// :TODO: TP - total message/posts on the system (Obv/2)
|
||||||
|
|
|
@ -326,9 +326,7 @@ function formatByteSizeAbbr(byteSize) {
|
||||||
return SIZE_ABBRS[Math.floor(Math.log(byteSize) / Math.log(1024))];
|
return SIZE_ABBRS[Math.floor(Math.log(byteSize) / Math.log(1024))];
|
||||||
}
|
}
|
||||||
|
|
||||||
function formatByteSize(byteSize, withAbbr, decimals) {
|
function formatByteSize(byteSize, withAbbr = false, decimals = 2) {
|
||||||
withAbbr = withAbbr || false;
|
|
||||||
decimals = decimals || 3;
|
|
||||||
const i = 0 === byteSize ? byteSize : Math.floor(Math.log(byteSize) / Math.log(1024));
|
const i = 0 === byteSize ? byteSize : Math.floor(Math.log(byteSize) / Math.log(1024));
|
||||||
let result = parseFloat((byteSize / Math.pow(1024, i)).toFixed(decimals));
|
let result = parseFloat((byteSize / Math.pow(1024, i)).toFixed(decimals));
|
||||||
if(withAbbr) {
|
if(withAbbr) {
|
||||||
|
|
Loading…
Reference in New Issue