blob: d29a46804cc9a3f5df14201168527b8e9a1263cb [file] [log] [blame]
// Copyright 2015 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
'use strict';
/**
* @fileoverview Helper class for shill log processing.
*/
var logHelper = {};
/**
* RegExp for netlog start.
* @type {RegExp}
*/
logHelper.NET_LOG_START = /netlog=<multiline>/;
/**
* RegExp for netlog end.
* @type {RegExp}
*/
logHelper.NET_LOG_END = /---------- END ----------/;
/**
* RegExp for syslog start.
* @type {RegExp}
*/
logHelper.SYS_LOG_START = /syslog=<multiline>/;
/**
* RegExp for system.log section end.
* @type {RegExp}
*/
logHelper.MULTILINE_LOG_END = /---------- END ----------/;
/**
* RegExp for log timestamp.
* @type {RegExp}
*/
logHelper.TIME_FORMAT =
/\d{4}-\d+-\d+T\d{2}:\d{2}:\d{2}.\d{6}(-|\+)\d{2}:\d{2}/;
/**
* Method to format an elapsed time in ms to HH:MM:SS.
*
* @param {Number} elapsedMS elapsed ms to format.
* @return {string} HH:MM:SS formatted version of the elapsed (ms) time
* @public
*/
logHelper.formatElapsedMS = function(elapsedMS) {
var ms = elapsedMS % 1000;
if (ms < 10) {
ms = '00' + ms;
} else if (ms < 100) {
ms = '0' + ms;
}
var elapsed = Math.floor(elapsedMS / 1000);
var sec = Math.floor(elapsed % 3600 % 60);
if (sec < 10) {
sec = '0' + sec;
}
var min = Math.floor(elapsed % 3600 / 60);
if (min < 10) {
min = '0' + min;
}
var hour = Math.floor(elapsed / 3600);
if (hour < 10) {
hour = '0' + hour;
}
var formatted = hour + ':' + min + ':' + sec + '.' + ms;
return formatted;
};
/**
* Array of Objects holding regexs and handlers for system_log subsections
* @type {Object[]}
* @return {int} returns new index into supplied String[]
*/
logHelper.logDetectors = {
'netlog_multiline': {
re: logHelper.NET_LOG_START,
handler: function(logHolder, logLines, i) {
// we have a netlog section of a system_log
logHolder.fileType = 'system_log';
logHolder.netlog = logHelper.getSubLog(logLines, i);
console.log('found the netlog section!: ' + logHolder.netlog.length);
return i + logHolder.netlog.length;
}
},
'syslog_multiline': {
re: logHelper.SYS_LOG_START,
handler: function(logHolder, logLines, i) {
// we have a syslog section of a system_log
logHolder.fileType = 'system_log';
logHolder.syslog = logHelper.getSubLog(logLines, i);
console.log('found the syslog section!: ' + logHolder.syslog.length);
return i + logHolder.syslog.length;
}
}
};
/**
* Helper method checking what type of log is being processed.
*
* @param {String[]} logLines String array for lines in a log.
* @return {Object} returns String of the file type
*/
logHelper.detectFileType = function(logLines) {
var logHolder = {fileType: 'unknown'};
var match;
// first check if the supplied log has subsections
for (var i = 0; i < logLines.length; i++) {
for (var detector in logHelper.logDetectors) {
match = logLines[i].match(logHelper.logDetectors[detector].re);
if (match != null) {
i = logHelper
.logDetectors[detector]
.handler(logHolder, logLines, i + 2) + 1;
break;
}
}
}
if (logHolder.fileType == 'unknown') {
if (netlogSummary.netlogTypeCheck(logLines)) {
// supplied file is netlog
logHolder.fileType = 'netlog';
logHolder.netlog = logLines;
} else if (syslogSummary.syslogTypeCheck(logLines)) {
// supplied file is syslog
logHolder.fileType = 'syslog';
logHolder.syslog = logLines;
} else {
console.log('file type unknown');
}
}
return logHolder;
};
/**
* Helper method to extract a sublog of a file.
*
* @param {String[]} logLines String array for lines in a log.
* @param {int} i Start index for the sublog
* @return {String[]} returns String[] of the sublog lines
*/
logHelper.getSubLog = function(logLines, i) {
var subLog = [];
while (i < logLines.length) {
if (logHelper.MULTILINE_LOG_END.test(logLines[i])) {
// subsection is done...
return subLog;
}
var time = logLines[i].match(logHelper.TIME_FORMAT);
if (time == null) {
console.log('processing sublog, log line time was null');
} else {
subLog.push(logLines[i]);
}
i++;
}
return subLog;
}