324 lines
8.3 KiB
JavaScript
324 lines
8.3 KiB
JavaScript
var refreshTimer = null;
|
|
var isFetching = null;
|
|
var storedEvents = new Array();
|
|
var notVisited = {};
|
|
|
|
$(window).on("load", function() {
|
|
initilise();
|
|
// Wait some ms to throw main function
|
|
var delay = setTimeout(main, 100);
|
|
resetInterval();
|
|
});
|
|
|
|
function fetchEvents() {
|
|
return storedEvents;
|
|
}
|
|
|
|
function fetchNotVisited() {
|
|
return notVisited;
|
|
}
|
|
|
|
function removeNotVisited(eventId) {
|
|
if (notVisited[eventId] === true) delete notVisited[eventId];
|
|
}
|
|
|
|
function main() {
|
|
chrome.runtime.sendMessage({ text: "FETCH_EVENTS" });
|
|
// Do not fetch if is fetching now
|
|
if (isFetching) return;
|
|
isFetching = true;
|
|
|
|
var url =
|
|
localStorage["ip_address"] +
|
|
"/include/api.php?op=get&op2=events&return_type=json";
|
|
var feedUrl = url;
|
|
var data = new FormData();
|
|
|
|
data.append("apipass", localStorage["api_pass"]);
|
|
data.append("user", localStorage["user_name"]);
|
|
data.append("pass", localStorage["pass"]);
|
|
|
|
req = new XMLHttpRequest();
|
|
req.onload = handleResponse;
|
|
req.onerror = handleError;
|
|
req.open("POST", feedUrl, true);
|
|
req.withCredentials = true;
|
|
req.send(data);
|
|
}
|
|
|
|
function handleError() {
|
|
chrome.runtime.sendMessage({ text: "FETCH_EVENTS_URL_ERROR" });
|
|
isFetching = false;
|
|
}
|
|
|
|
function handleResponse() {
|
|
var doc = req.responseText;
|
|
if (doc == "auth error") {
|
|
chrome.runtime.sendMessage({ text: "FETCH_EVENTS_URL_ERROR" });
|
|
} else {
|
|
var n = doc.search("404 Not Found");
|
|
if (n > 0) {
|
|
chrome.runtime.sendMessage({ text: "FETCH_EVENTS_DATA_ERROR" });
|
|
} else {
|
|
getEvents(doc);
|
|
chrome.runtime.sendMessage({ text: "FETCH_EVENTS_SUCCESS" });
|
|
}
|
|
}
|
|
isFetching = false;
|
|
}
|
|
|
|
function getEvents(reply) {
|
|
var fetchedEvents = parseReplyEvents(reply);
|
|
|
|
// If there is no events requested, mark all as visited
|
|
if (typeof storedEvents != "undefined" && storedEvents.length == 0) {
|
|
notVisited = {};
|
|
storedEvents = fetchedEvents;
|
|
return;
|
|
}
|
|
|
|
// Discriminate the new events
|
|
newEvents = fetchNewEvents(fetchedEvents, storedEvents);
|
|
var newNotVisited = {};
|
|
var notVisitedCount = 0;
|
|
|
|
// Check if popup is displayed to make some actions
|
|
var views = chrome.extension.getViews({ type: "popup" });
|
|
for (var k = 0; k < newEvents.length; k++) {
|
|
newNotVisited[newEvents[k]["id"]] = true;
|
|
if (views.length == 0) {
|
|
notVisitedCount++;
|
|
displayNotification(newEvents[k]);
|
|
alertsSound(newEvents[k]);
|
|
}
|
|
}
|
|
|
|
// Make that the old events marked as not visited remains with the
|
|
// same status
|
|
for (var k = 0; k < fetchedEvents.length; k++) {
|
|
if (notVisited[fetchedEvents[k]["id"]] === true) {
|
|
newNotVisited[fetchedEvents[k]["id"]] = true;
|
|
notVisitedCount++;
|
|
}
|
|
}
|
|
notVisited = newNotVisited;
|
|
|
|
// Update the number
|
|
localStorage["new_events"] = views.length == 0 ? notVisitedCount : 0;
|
|
updateBadge();
|
|
|
|
// Store the requested events
|
|
storedEvents = fetchedEvents;
|
|
}
|
|
|
|
function updateBadge() {
|
|
if (localStorage["new_events"] != 0) {
|
|
chrome.browserAction.setBadgeBackgroundColor({ color: [0, 200, 0, 255] });
|
|
chrome.browserAction.setBadgeText({ text: localStorage["new_events"] });
|
|
} else {
|
|
chrome.browserAction.setBadgeText({ text: "" });
|
|
}
|
|
}
|
|
|
|
function fetchNewEvents(A, B) {
|
|
var arrDiff = new Array();
|
|
for (var i = 0; i < A.length; i++) {
|
|
var id = false;
|
|
for (var j = 0; j < B.length; j++) {
|
|
if (A[i]["id"] == B[j]["id"]) {
|
|
id = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!id) {
|
|
arrDiff.push(A[i]);
|
|
}
|
|
}
|
|
return arrDiff;
|
|
}
|
|
|
|
function parseReplyEvents(reply) {
|
|
// Split the API response
|
|
var data;
|
|
try {
|
|
data = JSON.parse(reply);
|
|
} catch (error) {
|
|
console.log(error);
|
|
return [];
|
|
}
|
|
var e_array = JSON.parse(reply).data;
|
|
|
|
// Form a properly object
|
|
var fetchedEvents = new Array();
|
|
for (var i = 0; i < e_array.length; i++) {
|
|
var event = e_array[i];
|
|
fetchedEvents.push({
|
|
id: event.id_evento,
|
|
agent_name: event.agent_name,
|
|
agent: event.id_agente,
|
|
date: event.timestamp,
|
|
title: event.evento,
|
|
module: event.id_agentmodule,
|
|
type: event.event_type,
|
|
source: event.source,
|
|
severity: event.criticity_name,
|
|
visited: false
|
|
});
|
|
}
|
|
// Return the events
|
|
return fetchedEvents;
|
|
}
|
|
|
|
function alertsSound(pEvent) {
|
|
if (localStorage["sound_alert"] != "on") {
|
|
return;
|
|
}
|
|
|
|
switch (pEvent["severity"]) {
|
|
case "Critical":
|
|
playSound(localStorage["critical"]);
|
|
break;
|
|
case "Informational":
|
|
playSound(localStorage["informational"]);
|
|
break;
|
|
case "Maintenance":
|
|
playSound(localStorage["maintenance"]);
|
|
break;
|
|
case "Normal":
|
|
playSound(localStorage["normal"]);
|
|
break;
|
|
case "Warning":
|
|
playSound(localStorage["warning"]);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function displayNotification(pEvent) {
|
|
// Check if the user is okay to get some notification
|
|
if (Notification.permission === "granted") {
|
|
// If it's okay create a notification
|
|
getNotification(pEvent);
|
|
}
|
|
|
|
// Otherwise, we need to ask the user for permission
|
|
// Note, Chrome does not implement the permission static property
|
|
// So we have to check for NOT 'denied' instead of 'default'
|
|
else if (Notification.permission !== "denied") {
|
|
Notification.requestPermission(function(permission) {
|
|
// Whatever the user answers, we make sure we store the information
|
|
if (!("permission" in Notification)) {
|
|
Notification.permission = permission;
|
|
}
|
|
|
|
// If the user is okay, let's create a notification
|
|
if (permission === "granted") getNotification(pEvent);
|
|
});
|
|
}
|
|
}
|
|
|
|
function getNotification(pEvent) {
|
|
// Build the event text
|
|
var even = pEvent["type"];
|
|
if (pEvent["source"] != "") even += " : " + pEvent["source"];
|
|
even += ". Event occured at " + pEvent["date"];
|
|
if (pEvent["module"] != 0)
|
|
even += " in the module with Id " + pEvent["module"];
|
|
even += ".";
|
|
|
|
var url =
|
|
pEvent["agent"] == 0
|
|
? localStorage["ip_address"] +
|
|
"/index.php?sec=eventos&sec2=operation/events/events"
|
|
: localStorage["ip_address"] +
|
|
"/index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=" +
|
|
pEvent["agent"];
|
|
|
|
var notification = new Notification(pEvent["title"], {
|
|
body: even,
|
|
icon: "images/icon.png"
|
|
});
|
|
|
|
// Add the link
|
|
notification.onclick = function(event) {
|
|
event.preventDefault();
|
|
window.open(url, "_blank");
|
|
};
|
|
|
|
// Close notification after 10 secs
|
|
setTimeout(function() {
|
|
notification.close();
|
|
}, 10000);
|
|
}
|
|
|
|
function resetInterval() {
|
|
if (refreshTimer) clearInterval(refreshTimer);
|
|
refreshTimer = setInterval(main, localStorage["refresh"] * 1000);
|
|
}
|
|
|
|
function initilise() {
|
|
if (isFetching == null) isFetching = false;
|
|
if (localStorage["ip_address"] == undefined) {
|
|
localStorage["ip_address"] = "http://firefly.artica.es/pandora_demo";
|
|
}
|
|
|
|
if (localStorage["api_pass"] == undefined) {
|
|
localStorage["api_pass"] = "doreik0";
|
|
}
|
|
|
|
if (localStorage["user_name"] == undefined) {
|
|
localStorage["user_name"] = "demo";
|
|
}
|
|
|
|
if (localStorage["pass"] == undefined) {
|
|
localStorage["pass"] = "demo";
|
|
}
|
|
if (localStorage["critical"] == null) {
|
|
localStorage["critical"] = "11";
|
|
}
|
|
if (localStorage["informational"] == null) {
|
|
localStorage["informational"] = "1";
|
|
}
|
|
if (localStorage["maintenance"] == null) {
|
|
localStorage["maintenance"] = "10";
|
|
}
|
|
if (localStorage["normal"] == null) {
|
|
localStorage["normal"] = "6";
|
|
}
|
|
if (localStorage["warning"] == null) {
|
|
localStorage["warning"] = "2";
|
|
}
|
|
if (localStorage["events"] == null) {
|
|
localStorage["events"] = 20;
|
|
}
|
|
if (localStorage["refresh"] == null) {
|
|
localStorage["refresh"] = "10";
|
|
}
|
|
if (localStorage["ip_address"] == null) {
|
|
localStorage["ip_address"] = "http://firefly.artica.es/pandora_demo";
|
|
}
|
|
|
|
if (localStorage["api_pass"] == null) {
|
|
localStorage["api_pass"] = "doreik0";
|
|
}
|
|
|
|
if (localStorage["user_name"] == null) {
|
|
localStorage["user_name"] = "demo";
|
|
}
|
|
|
|
if (localStorage["pass"] == null) {
|
|
localStorage["pass"] = "demo";
|
|
}
|
|
if (localStorage["sound_alert"] == null) {
|
|
localStorage["sound_alert"] = "on";
|
|
}
|
|
if (localStorage["changed"] == null) {
|
|
localStorage["changed"] = "false";
|
|
}
|
|
if (localStorage["new_events"] == null) {
|
|
localStorage["new_events"] = parseInt(localStorage["events"]);
|
|
}
|
|
if (localStorage["error"] == null) {
|
|
localStorage["error"] = true;
|
|
}
|
|
}
|