Skip to content

Commit

Permalink
packaging updates (#5)
Browse files Browse the repository at this point in the history
  • Loading branch information
msimerson authored Oct 7, 2016
1 parent 412426d commit 7975594
Show file tree
Hide file tree
Showing 8 changed files with 193 additions and 176 deletions.
10 changes: 10 additions & 0 deletions .codeclimate.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
engines:
eslint:
enabled: true
channel: "eslint-3"
config:
config: ".eslintrc.json"

ratings:
paths:
- "**.js"
20 changes: 0 additions & 20 deletions .eslintrc

This file was deleted.

25 changes: 25 additions & 0 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"env": {
"node": true,
"mocha": true
},
"extends": "eslint:recommended",
"installedESLint": true,
"root": true,
"rules": {
"comma-dangle": [2, "only-multiline"],
"dot-notation": 2,
"indent": [2, 2, {"SwitchCase": 1}],
"one-var": [2, "never"],
"no-trailing-spaces": [2, { "skipBlankLines": false }],
"keyword-spacing": [2, {
"before": true,
"after": true
}],
"no-delete-var": 2,
"no-label-var": 2,
"no-shadow": 2,
"no-unused-vars": [ 1, { "args": "none" }],
"no-console": 0
}
}
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ script:

after_success:
- npm install istanbul codecov
- ./node_modules/.bin/istanbul cover ./node_modules/.bin/_mocha -- -R spec
- npm run coverage
- ./node_modules/.bin/codecov

sudo: false
234 changes: 117 additions & 117 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,100 +7,100 @@ var log = '/var/log/haraka.log';
var plugin;

exports.register = function () {
plugin = this;
plugin.get_logreader_ini();
plugin.load_karma_ini();
plugin = this;
plugin.get_logreader_ini();
plugin.load_karma_ini();
};

exports.hook_init_http = function (next, server) {
server.http.app.use('/logs/:uuid', exports.get_logs);
server.http.app.use('/karma/rules', exports.get_rules);
return next();
server.http.app.use('/logs/:uuid', exports.get_logs);
server.http.app.use('/karma/rules', exports.get_rules);
return next();
};

exports.get_logreader_ini = function () {
plugin = this;
plugin.cfg = plugin.config.get('log.reader.ini', function () {
plugin.get_logreader_ini();
});
plugin = this;
plugin.cfg = plugin.config.get('log.reader.ini', function () {
plugin.get_logreader_ini();
});

if (plugin.cfg.log && plugin.cfg.log.file) {
log = plugin.cfg.log.file;
}
if (plugin.cfg.log && plugin.cfg.log.file) {
log = plugin.cfg.log.file;
}
};

exports.load_karma_ini = function () {
plugin.karma_cfg = plugin.config.get('karma.ini', function () {
plugin.load_karma_ini();
});
plugin.karma_cfg = plugin.config.get('karma.ini', function () {
plugin.load_karma_ini();
});

if (!plugin.karma_cfg.result_awards) return;
if (!plugin.result_awards) plugin.result_awards = {};
if (!plugin.karma_cfg.result_awards) return;
if (!plugin.result_awards) plugin.result_awards = {};

Object.keys(plugin.karma_cfg.result_awards).forEach(function (anum) {
var parts = plugin.karma_cfg.result_awards[anum]
Object.keys(plugin.karma_cfg.result_awards).forEach(function (anum) {
var parts = plugin.karma_cfg.result_awards[anum]
.replace(/\s+/, ' ')
.split(/(?:\s*\|\s*)/);
plugin.result_awards[anum] = {
pi_name : parts[0],
property : parts[1],
operator : parts[2],
value : parts[3],
award : parts[4],
reason : parts[5],
resolution : parts[6],
};
});
plugin.result_awards[anum] = {
pi_name : parts[0],
property : parts[1],
operator : parts[2],
value : parts[3],
award : parts[4],
reason : parts[5],
resolution : parts[6],
};
});
};

exports.get_rules = function (req, res) {
res.send(JSON.stringify(plugin.result_awards));
res.send(JSON.stringify(plugin.result_awards));
};

exports.get_logs = function (req, res) {

var uuid = req.params.uuid;
if (!/\-/.test(uuid)) {
return res.send('<html><body>Invalid Request</body></html>');
}
if (!/^[0-9A-F\-\.]{12,40}$/.test(uuid)) {
return res.send('<html><body>Invalid Request</body></html>');
}
var uuid = req.params.uuid;
if (!/\-/.test(uuid)) {
return res.send('<html><body>Invalid Request</body></html>');
}
if (!/^[0-9A-F\-\.]{12,40}$/.test(uuid)) {
return res.send('<html><body>Invalid Request</body></html>');
}

var matched = '';
var matched = '';

// spawning a grep process is quite a lot faster than fs.read
// (yes, I benchmarked it)
var child = spawn('grep', [ uuid, log ]);
child.stdout.on('data', function (buffer) {
matched += buffer.toString();
var child = spawn('grep', [ uuid, log ]);
child.stdout.on('data', function (buffer) {
matched += buffer.toString();
});

child.stdout.on('end', function (err) {
if (err) return res.send('<p>' + err + '</p>');

var rawLogs = '';
var lastKarmaLine;
matched.split('\n').forEach(function (line) {
var trimmed = line.replace(/[A-F0-9\-\.]{12,40}/, '$UUID');
rawLogs += trimmed + '<br>';
if (/\[karma/.test(line) && /awards/.test(line)) {
lastKarmaLine = line;
}
});

child.stdout.on('end', function (err) {
if (err) return res.send('<p>' + err + '</p>');

var rawLogs = '';
var lastKarmaLine;
matched.split('\n').forEach(function (line) {
var trimmed = line.replace(/[A-F0-9\-\.]{12,40}/, '$UUID');
rawLogs += trimmed + '<br>';
if (/\[karma/.test(line) && /awards/.test(line)) {
lastKarmaLine = line;
}
});

var awardNums = [];
if (lastKarmaLine) {
var bits = lastKarmaLine.match(/awards: ([0-9,]+)?\s*/);
if (bits && bits[1]) awardNums = bits[1].split(',');
}
var awards = getAwards(awardNums);
var resolv = getResolutions(awardNums);

var head = htmlHead();
var body = htmlBody(uuid, awards.join(''), resolv.join(''));
res.send(head + body + rawLogs + '</pre></div></body></html>');
});
var awardNums = [];
if (lastKarmaLine) {
var bits = lastKarmaLine.match(/awards: ([0-9,]+)?\s*/);
if (bits && bits[1]) awardNums = bits[1].split(',');
}
var awards = getAwards(awardNums);
var resolv = getResolutions(awardNums);

var head = htmlHead();
var body = htmlBody(uuid, awards.join(''), resolv.join(''));
res.send(head + body + rawLogs + '</pre></div></body></html>');
});
};

// exports.grepWithFs = function (file, regex, done) {
Expand All @@ -118,46 +118,46 @@ exports.get_logs = function (req, res) {
// };

function getAwards (awardNums) {
if (!awardNums || awardNums.length === 0) return [];

var awards = [];
awardNums.forEach(function (a) {
if (!a || !plugin.result_awards[a]) return;
plugin.result_awards[a].id = a;
awards.push(plugin.result_awards[a]);
});

var listItems = [];
awards.sort(sortByAward).forEach(function (a) {
var start = '<li> ' + a.award + ', ';
if (a.reason) {
listItems.push(start + a.reason + ' (' + a.value + ')</li>');
return;
}
listItems.push(start + a.pi_name + ' ' + a.property +
if (!awardNums || awardNums.length === 0) return [];

var awards = [];
awardNums.forEach(function (a) {
if (!a || !plugin.result_awards[a]) return;
plugin.result_awards[a].id = a;
awards.push(plugin.result_awards[a]);
});

var listItems = [];
awards.sort(sortByAward).forEach(function (a) {
var start = '<li> ' + a.award + ', ';
if (a.reason) {
listItems.push(start + a.reason + ' (' + a.value + ')</li>');
return;
}
listItems.push(start + a.pi_name + ' ' + a.property +
' ' + a.value + '</li>');
});
return listItems;
});
return listItems;
}

function getResolutions (awardNums) {
if (!awardNums || awardNums.length === 0) return [];

var awards = [];
awardNums.forEach(function (a) {
if (!a || !plugin.result_awards[a]) return;
awards.push(plugin.result_awards[a]);
});

var listItems = [];
var resolutionSeen = {};
awards.sort(sortByAward).forEach(function (a) {
if (!a.resolution) return;
if (resolutionSeen[a.resolution]) return;
resolutionSeen[a.resolution] = true;
listItems.push('<li>' + a.resolution + '</li>');
});
return listItems;
if (!awardNums || awardNums.length === 0) return [];

var awards = [];
awardNums.forEach(function (a) {
if (!a || !plugin.result_awards[a]) return;
awards.push(plugin.result_awards[a]);
});

var listItems = [];
var resolutionSeen = {};
awards.sort(sortByAward).forEach(function (a) {
if (!a.resolution) return;
if (resolutionSeen[a.resolution]) return;
resolutionSeen[a.resolution] = true;
listItems.push('<li>' + a.resolution + '</li>');
});
return listItems;
}

// function grepWithShell (file, string, done) {
Expand All @@ -169,14 +169,14 @@ function getResolutions (awardNums) {
// }

function sortByAward (a, b) {
if (parseFloat(b.award) > parseFloat(a.award)) return -1;
if (parseFloat(b.award) < parseFloat(a.award)) return 1;
return 0;
if (parseFloat(b.award) > parseFloat(a.award)) return -1;
if (parseFloat(b.award) < parseFloat(a.award)) return 1;
return 0;
}

function htmlHead () {
/* jshint multistr: true */
var str = '<html> \
var str = '<html> \
<head> \
<meta charset="utf-8"> \
<link rel="stylesheet" href="/haraka/css/bootstrap.min.css"> \
Expand All @@ -185,32 +185,32 @@ function htmlHead () {
div { padding: 1em; } \
</style> \
</head>';
return str;
return str;
}

function htmlBody (uuid, awards, resolve) {
/* jshint multistr: true */
var str = '<body> \
var str = '<body> \
<div class="tab-content"> \
<h3>Sorry we blocked your message:</h3> \
<p>Our filters mistook your server for a malicious computer attempting \
to send spam. To improve your mail servers reputation, please contact \
your IT helpdesk or Systems Administrator and ask them for help.</p>';

if (awards) {
str += '<hr><h3>Policy Rules</h3> \
if (awards) {
str += '<hr><h3>Policy Rules</h3> \
<ul>' + awards + '</ul>';
}
}

if (resolve) {
str += '<hr><h3>Steps to Resolve</h3> \
if (resolve) {
str += '<hr><h3>Steps to Resolve</h3> \
<ul>' + resolve + '</ul>';
}
}

str += '<hr> \
str += '<hr> \
<h3>Raw Logs</h3> \
<p>' + uuid + '</p> \
<pre> \
\n';
return str;
return str;
}
7 changes: 4 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
{
"name": "haraka-plugin-log-reader",
"version": "1.0.2",
"version": "1.0.3",
"description": "display log entries from haraka log files via HTTP",
"main": "index.js",
"scripts": {
"test": "mocha",
"lint": "node node_modules/.bin/eslint *.js test/*.js"
"test": "./node_modules/.bin/mocha",
"lint": "./node_modules/.bin/eslint *.js test",
"coverage": "./node_modules/.bin/istanbul cover ./node_modules/.bin/_mocha"
},
"repository": {
"type": "git",
Expand Down
Loading

0 comments on commit 7975594

Please sign in to comment.