ACP event log

This commit is contained in:
calzoneman 2014-02-07 10:45:28 -06:00
parent afa17165f7
commit 0a480515d7
6 changed files with 101 additions and 2 deletions

View file

@ -16,6 +16,10 @@ var util = require("./utilities");
var Config = require("./config"); var Config = require("./config");
var Server = require("./server"); var Server = require("./server");
function eventUsername(user) {
return user.name + "@" + user.ip;
}
function handleAnnounce(user, data) { function handleAnnounce(user, data) {
var sv = Server.getServer(); var sv = Server.getServer();
@ -24,10 +28,14 @@ function handleAnnounce(user, data) {
text: data.content, text: data.content,
from: user.name from: user.name
}); });
Logger.eventlog.log("[acp] " + eventUsername(user) + " opened announcement `" +
data.title + "`");
} }
function handleAnnounceClear(user) { function handleAnnounceClear(user) {
Server.getServer().announce(null); Server.getServer().announce(null);
Logger.eventlog.log("[acp] " + eventUsername(user) + " cleared announcement");
} }
function handleGlobalBan(user, data) { function handleGlobalBan(user, data) {
@ -39,6 +47,8 @@ function handleGlobalBan(user, data) {
return; return;
} }
Logger.eventlog.log("[acp] " + eventUsername(user) + " global banned " + data.ip);
db.listGlobalBans(function (err, bans) { db.listGlobalBans(function (err, bans) {
if (err) { if (err) {
user.socket.emit("errMessage", { user.socket.emit("errMessage", {
@ -68,6 +78,9 @@ function handleGlobalBanDelete(user, data) {
return; return;
} }
Logger.eventlog.log("[acp] " + eventUsername(user) + " un-global banned " +
data.ip);
db.listGlobalBans(function (err, bans) { db.listGlobalBans(function (err, bans) {
if (err) { if (err) {
user.socket.emit("errMessage", { user.socket.emit("errMessage", {
@ -144,6 +157,8 @@ function handleSetRank(user, data) {
msg: err msg: err
}); });
} else { } else {
Logger.eventlog.log("[acp] " + eventUsername(user) + " set " + name +
"'s global_rank to " + rank);
user.socket.emit("acp-set-rank", data); user.socket.emit("acp-set-rank", data);
} }
}); });
@ -181,6 +196,9 @@ function handleResetPassword(user, data) {
return; return;
} }
Logger.eventlog.log("[acp] " + eventUsername(user) + " initialized a " +
"password recovery for " + name);
user.socket.emit("errMessage", { user.socket.emit("errMessage", {
msg: "Reset link: " + Config.get("http.domain") + msg: "Reset link: " + Config.get("http.domain") +
"/account/passwordrecover/" + hash "/account/passwordrecover/" + hash
@ -229,6 +247,7 @@ function handleDeleteChannel(user, data) {
} }
db.channels.drop(name, function (err) { db.channels.drop(name, function (err) {
Logger.eventlog.log("[acp] " + eventUsername(user) + " deleted channel " + name);
if (err) { if (err) {
user.socket.emit("errMessage", { user.socket.emit("errMessage", {
msg: err msg: err
@ -262,6 +281,8 @@ function handleForceUnload(user, data) {
users.forEach(function (u) { users.forEach(function (u) {
u.kick("Channel shutting down"); u.kick("Channel shutting down");
}); });
Logger.eventlog.log("[acp] " + eventUsername(user) + " forced unload of " + name);
} }
function init(user) { function init(user) {
@ -295,7 +316,7 @@ function init(user) {
} }
user.socket.emit("acp-gbanlist", flat); user.socket.emit("acp-gbanlist", flat);
}); });
Logger.eventlog.log("[acp] Initialized ACP for " + user.name + "@" + user.ip); Logger.eventlog.log("[acp] Initialized ACP for " + eventUsername(user));
} }
module.exports.init = init; module.exports.init = init;

View file

@ -370,6 +370,7 @@ function handleDeleteChannel(req, res) {
}); });
return; return;
} }
db.channels.drop(name, function (err) { db.channels.drop(name, function (err) {
if (!err) { if (!err) {
Logger.eventlog.log("[channel] " + loginName + "@" + Logger.eventlog.log("[channel] " + loginName + "@" +
@ -688,6 +689,7 @@ function handlePasswordRecover(req, res) {
} }
db.deletePasswordReset(hash); db.deletePasswordReset(hash);
Logger.eventlog.log("[account] " + ip + " recovered password for " + row.name);
sendJade(res, "account-passwordrecover", { sendJade(res, "account-passwordrecover", {
recovered: true, recovered: true,

View file

@ -100,6 +100,13 @@ function handleReadHttplog(req, res) {
readLog(res, path.join(__dirname, "..", "..", "http.log"), 1048576); readLog(res, path.join(__dirname, "..", "..", "http.log"), 1048576);
} }
/**
* Handles a request to read the event log
*/
function handleReadEventlog(req, res) {
readLog(res, path.join(__dirname, "..", "..", "events.log"), 1048576);
}
/** /**
* Handles a request to read a channel log * Handles a request to read a channel log
*/ */
@ -117,6 +124,7 @@ module.exports = {
app.get("/acp/syslog", checkAdmin(handleReadSyslog)); app.get("/acp/syslog", checkAdmin(handleReadSyslog));
app.get("/acp/errlog", checkAdmin(handleReadErrlog)); app.get("/acp/errlog", checkAdmin(handleReadErrlog));
app.get("/acp/httplog", checkAdmin(handleReadHttplog)); app.get("/acp/httplog", checkAdmin(handleReadHttplog));
app.get("/acp/eventlog", checkAdmin(handleReadEventlog));
app.get("/acp/chanlog/:name", checkAdmin(handleReadChanlog)); app.get("/acp/chanlog/:name", checkAdmin(handleReadChanlog));
} }
}; };

View file

@ -114,7 +114,8 @@ html(lang="en")
h3 Event Log h3 Event Log
strong Filter event types strong Filter event types
select#acp-eventlog-filter.form-control(multiple="multiple", style="max-width: 25%") select#acp-eventlog-filter.form-control(multiple="multiple", style="max-width: 25%")
pre#acp-eventlog-text(style="margin-top: 20px") button#acp-eventlog-refresh.btn.btn-default Refresh
pre#acp-eventlog-text
#acp-stats.acp-panel.col-md-12(style="display: none") #acp-stats.acp-panel.col-md-12(style="display: none")
h3 User Count h3 User Count
canvas#stat_users(width="100%", height="400") canvas#stat_users(width="100%", height="400")

View file

@ -11,3 +11,18 @@
overflow-y: scroll; overflow-y: scroll;
overflow-x: hidden; overflow-x: hidden;
} }
#acp-eventlog-text {
border-top-left-radius: 0;
border-top-right-radius: 0;
max-height: 500px;
overflow-y: scroll;
overflow-x: hidden;
}
#acp-eventlog-refresh {
margin-top: 20px;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
border-bottom: 0;
}

View file

@ -7,6 +7,7 @@
window.socket.on("connect", function () { window.socket.on("connect", function () {
window.socket.emit("initACP"); window.socket.emit("initACP");
window.socket.emit("acp-list-activechannels"); window.socket.emit("acp-list-activechannels");
readEventlog();
}); });
window.socket.on("errMessage", function (data) { window.socket.on("errMessage", function (data) {
@ -57,6 +58,12 @@ function readHttplog() {
}); });
} }
function readEventlog() {
$.ajax(location.protocol + "//" + location.host + "/acp/eventlog").done(function (data) {
handleEventLog(data);
});
}
function readChanlog(name) { function readChanlog(name) {
$.ajax(location.protocol + "//" + location.host + "/acp/chanlog/" + name).done(function (data) { $.ajax(location.protocol + "//" + location.host + "/acp/chanlog/" + name).done(function (data) {
$("#acp-log").text(data); $("#acp-log").text(data);
@ -389,6 +396,51 @@ $("#acp-lchannels-refresh").click(function () {
socket.emit("acp-list-activechannels"); socket.emit("acp-list-activechannels");
}); });
/* Event log */
function getEventKey(line) {
var left = line.indexOf("[", 1);
var right = line.indexOf("]", left);
return line.substring(left+1, right);
}
function handleEventLog(data) {
data = data.split("\n").filter(function (ln) { return ln.indexOf("[") === 0; });
var keys = {};
data.forEach(function (ln) {
keys[getEventKey(ln)] = true;
});
$("#acp-eventlog-text").data("lines", data);
$("#acp-eventlog-filter").html("");
for (var k in keys) {
$("<option/>").attr("value", k)
.text(k)
.appendTo($("#acp-eventlog-filter"));
}
filterEventLog();
}
function filterEventLog() {
var selected = $("#acp-eventlog-filter").val();
var all = selected == null || selected.length === 0;
var lines = $("#acp-eventlog-text").data("lines");
var show = [];
lines.forEach(function (ln) {
if (all || selected.indexOf(getEventKey(ln)) !== -1) {
show.push(ln);
}
});
$("#acp-eventlog-text").text(show.join("\n"));
$("#acp-eventlog-text").scrollTop($("#acp-eventlog-text").prop("scrollHeight"));
}
$("#acp-eventlog-filter").change(filterEventLog);
$("#acp-eventlog-refresh").click(readEventlog);
/* Initialize keyed table sorts */ /* Initialize keyed table sorts */
$("table").each(function () { $("table").each(function () {
var table = $(this); var table = $(this);