diff --git a/api_FTL.php b/api_FTL.php
index 0e0a2637..c367d153 100644
--- a/api_FTL.php
+++ b/api_FTL.php
@@ -71,7 +71,11 @@ if (isset($_GET['overTimeData10mins']))
if (isset($_GET['topItems']) && $auth)
{
- if(is_numeric($_GET['topItems']))
+ if($_GET['topItems'] === "audit")
+ {
+ sendRequestFTL("top-domains for audit");
+ }
+ else if(is_numeric($_GET['topItems']))
{
sendRequestFTL("top-domains (".$_GET['topItems'].")");
}
diff --git a/auditlog.php b/auditlog.php
new file mode 100644
index 00000000..d0ae4c44
--- /dev/null
+++ b/auditlog.php
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ | Domain |
+ Hits |
+ Action |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ | Domain |
+ Hits |
+ Action |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/scripts/pi-hole/js/auditlog.js b/scripts/pi-hole/js/auditlog.js
new file mode 100644
index 00000000..3cd2c680
--- /dev/null
+++ b/scripts/pi-hole/js/auditlog.js
@@ -0,0 +1,94 @@
+/* Pi-hole: A black hole for Internet advertisements
+* (c) 2017 Pi-hole, LLC (https://pi-hole.net)
+* Network-wide ad blocking via your own hardware.
+*
+* This file is copyright under the latest version of the EUPL.
+* Please see LICENSE file for your rights under this license. */
+// Define global variables
+var timeLineChart, queryTypeChart, forwardDestinationChart;
+
+function padNumber(num) {
+ return ("00" + num).substr(-2,2);
+}
+
+// Helper function needed for converting the Objects to Arrays
+
+function objectToArray(p){
+ var keys = Object.keys(p);
+ keys.sort(function(a, b) {
+ return a - b;
+ });
+
+ var arr = [], idx = [];
+ for (var i = 0; i < keys.length; i++) {
+ arr.push(p[keys[i]]);
+ idx.push(keys[i]);
+ }
+ return [idx,arr];
+}
+
+// Functions to update data in page
+
+var failures = 0;
+
+// Credit: http://stackoverflow.com/questions/1787322/htmlspecialchars-equivalent-in-javascript/4835406#4835406
+function escapeHtml(text) {
+ var map = {
+ "&": "&",
+ "<": "<",
+ ">": ">",
+ "\"": """,
+ "\'": "'"
+ };
+
+ return text.replace(/[&<>"']/g, function(m) { return map[m]; });
+}
+
+function updateTopLists() {
+ $.getJSON("api.php?topItems=audit", function(data) {
+
+ if("FTLnotrunning" in data)
+ {
+ return;
+ }
+
+ // Clear tables before filling them with data
+ $("#domain-frequency td").parent().remove();
+ $("#ad-frequency td").parent().remove();
+ var domaintable = $("#domain-frequency").find("tbody:last");
+ var adtable = $("#ad-frequency").find("tbody:last");
+ var url, domain, percentage;
+ for (domain in data.top_queries) {
+ if ({}.hasOwnProperty.call(data.top_queries,domain)){
+ // Sanitize domain
+ domain = escapeHtml(domain);
+ url = ""+domain+"";
+ percentage = data.top_queries[domain] / data.dns_queries_today * 100;
+ domaintable.append(" | " + url +
+ " | " + data.top_queries[domain] + " | Buttons ... |
");
+ }
+ }
+
+ for (domain in data.top_ads) {
+ if ({}.hasOwnProperty.call(data.top_ads,domain)){
+ // Sanitize domain
+ domain = escapeHtml(domain);
+ url = ""+domain+"";
+ percentage = data.top_ads[domain] / data.ads_blocked_today * 100;
+ adtable.append(" | " + url +
+ " | " + data.top_ads[domain] + " | Buttons ... |
");
+ }
+ }
+
+ $("#domain-frequency .overlay").hide();
+ $("#ad-frequency .overlay").hide();
+ // Update top lists data every 10 seconds
+ setTimeout(updateTopLists, 10000);
+ });
+}
+
+$(document).ready(function() {
+
+ // Pull in data via AJAX
+ updateTopLists();
+ });
diff --git a/scripts/pi-hole/php/header.php b/scripts/pi-hole/php/header.php
index 0c49b724..594a5be1 100644
--- a/scripts/pi-hole/php/header.php
+++ b/scripts/pi-hole/php/header.php
@@ -459,7 +459,7 @@ if($auth) {
Enable
- active">
+ active">
Tools
@@ -479,6 +479,12 @@ if($auth) {
Query adlists
+
+ class="active">
+
+ Audit log
+
+
class="active">