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; } }