From e3fd40dbf44d3dad0b2590f37358bde5bc0d35bd Mon Sep 17 00:00:00 2001 From: Philipp Kolmann Date: Sat, 7 Dec 2019 10:44:12 +0100 Subject: [PATCH 01/12] I have a different service running on FTL default port and so FTL service was not properly started. I searched quite a long time to discover why the Dashboard never loaded and finally found the reason. This patch counts empty lines and dies properly with a JSON error. This fixed my issue. Also I have pi-hole running with apache2 and so no /var/log/lighttpd/error.log exists. Fix: Try apache2 logging location and if not found then write log to a /tmp file. Signed-off-by: Philipp Kolmann --- scripts/pi-hole/php/FTL.php | 9 ++++++++- scripts/pi-hole/php/auth.php | 8 ++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/scripts/pi-hole/php/FTL.php b/scripts/pi-hole/php/FTL.php index caddd758..df356753 100644 --- a/scripts/pi-hole/php/FTL.php +++ b/scripts/pi-hole/php/FTL.php @@ -26,7 +26,7 @@ function sendRequestFTL($requestin) global $socket; $request = ">".$requestin; - fwrite($socket, $request) or die("Could not send data to server\n"); + fwrite($socket, $request) or die('{"error":"Could not send data to server"}'); } function getResponseFTL() @@ -35,9 +35,16 @@ function getResponseFTL() $response = []; + $errCount = 0; while(true) { $out = fgets($socket); + file_put_contents('/tmp/pihole.txt', $out, FILE_APPEND); + if ($out == "") $errCount++; + if ($errCount > 100) { + // Tried 100 times, but never got proper reply, fail to prevent busy loop + die('{"error":"Tried 100 times to connect to FTL server, but never got proper reply. Please check Port and logs!"}'); + } if(strrpos($out,"---EOM---") !== false) break; diff --git a/scripts/pi-hole/php/auth.php b/scripts/pi-hole/php/auth.php index 1ea6014d..56f84520 100644 --- a/scripts/pi-hole/php/auth.php +++ b/scripts/pi-hole/php/auth.php @@ -10,6 +10,14 @@ require_once('func.php'); $ERRORLOG = getenv('PHP_ERROR_LOG'); if (empty($ERRORLOG)) { $ERRORLOG = '/var/log/lighttpd/error.log'; + + if (!file_exists($ERRORLOG) || !is_writable($ERRORLOG)) { + $ERRORLOG = '/var/log/apache2/error.log'; + + if (!file_exists($ERRORLOG) || !is_writable($ERRORLOG)) { + $ERRORLOG = '/tmp/pi-hole-error.log'; + } + } } function pi_log($message) { From 87ba9740f10d0bdc4d03b606ad4f15756ccca098 Mon Sep 17 00:00:00 2001 From: Philipp Kolmann Date: Tue, 10 Dec 2019 21:14:09 +0100 Subject: [PATCH 02/12] remove debug output Signed-off-by: Philipp Kolmann --- scripts/pi-hole/php/FTL.php | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/pi-hole/php/FTL.php b/scripts/pi-hole/php/FTL.php index df356753..c33e061a 100644 --- a/scripts/pi-hole/php/FTL.php +++ b/scripts/pi-hole/php/FTL.php @@ -39,7 +39,6 @@ function getResponseFTL() while(true) { $out = fgets($socket); - file_put_contents('/tmp/pihole.txt', $out, FILE_APPEND); if ($out == "") $errCount++; if ($errCount > 100) { // Tried 100 times, but never got proper reply, fail to prevent busy loop From d91b60556358b3223a1bf1626a3ac7b0aa4f7cd4 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Tue, 10 Dec 2019 18:45:57 +0200 Subject: [PATCH 03/12] settings.js: fix object shorthand This broke IE Signed-off-by: XhmikosR --- scripts/pi-hole/js/settings.js | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/scripts/pi-hole/js/settings.js b/scripts/pi-hole/js/settings.js index ea1ee72c..8705d748 100644 --- a/scripts/pi-hole/js/settings.js +++ b/scripts/pi-hole/js/settings.js @@ -18,10 +18,10 @@ $(function () { $(".confirm-poweroff").confirm({ text: "Are you sure you want to send a poweroff command to your Pi-Hole?", title: "Confirmation required", - confirm(button) { + confirm: function(button) { $("#poweroffform").submit(); }, - cancel(button) { + cancel: function(button) { // nothing to do }, confirmButton: "Yes, poweroff", @@ -34,10 +34,10 @@ $(".confirm-poweroff").confirm({ $(".confirm-reboot").confirm({ text: "Are you sure you want to send a reboot command to your Pi-Hole?", title: "Confirmation required", - confirm(button) { + confirm: function(button) { $("#rebootform").submit(); }, - cancel(button) { + cancel: function(button) { // nothing to do }, confirmButton: "Yes, reboot", @@ -51,10 +51,10 @@ $(".confirm-reboot").confirm({ $(".confirm-restartdns").confirm({ text: "Are you sure you want to send a restart command to your DNS server?", title: "Confirmation required", - confirm(button) { + confirm: function(button) { $("#restartdnsform").submit(); }, - cancel(button) { + cancel: function(button) { // nothing to do }, confirmButton: "Yes, restart DNS", @@ -68,10 +68,10 @@ $(".confirm-restartdns").confirm({ $(".confirm-flushlogs").confirm({ text: "Are you sure you want to flush your logs?", title: "Confirmation required", - confirm(button) { + confirm: function(button) { $("#flushlogsform").submit(); }, - cancel(button) { + cancel: function(button) { // nothing to do }, confirmButton: "Yes, flush logs", @@ -85,10 +85,10 @@ $(".confirm-flushlogs").confirm({ $(".confirm-flusharp").confirm({ text: "Are you sure you want to flush your network table?", title: "Confirmation required", - confirm(button) { + confirm: function(button) { $("#flusharpform").submit(); }, - cancel(button) { + cancel: function(button) { // nothing to do }, confirmButton: "Yes, flush my network table", @@ -102,10 +102,10 @@ $(".confirm-flusharp").confirm({ $(".confirm-disablelogging-noflush").confirm({ text: "Are you sure you want to disable logging?", title: "Confirmation required", - confirm(button) { + confirm: function(button) { $("#disablelogsform-noflush").submit(); }, - cancel(button) { + cancel: function(button) { // nothing to do }, confirmButton: "Yes, disable logs", @@ -119,10 +119,10 @@ $(".confirm-disablelogging-noflush").confirm({ $(".api-token").confirm({ text: "Make sure that nobody else can scan this code around you. They will have full access to the API without having to know the password. Note that the generation of the QR code will take some time.", title: "Confirmation required", - confirm(button) { + confirm: function(button) { window.open("scripts/pi-hole/php/api_token.php"); }, - cancel(button) { + cancel: function(button) { // nothing to do }, confirmButton: "Yes, show API token", From 865469c9cb5a0c275a9db49ec8ae80a53ce365a4 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Tue, 10 Dec 2019 08:55:08 +0200 Subject: [PATCH 04/12] Delete .pullapprove.yml Signed-off-by: XhmikosR --- .pullapprove.yml | 38 -------------------------------------- 1 file changed, 38 deletions(-) delete mode 100644 .pullapprove.yml diff --git a/.pullapprove.yml b/.pullapprove.yml deleted file mode 100644 index 42d3b2fb..00000000 --- a/.pullapprove.yml +++ /dev/null @@ -1,38 +0,0 @@ -version: 2 - -always_pending: - title_regex: '(WIP|wip)' - labels: - - wip - explanation: 'This PR is a work in progress...' - -group_defaults: - reset_on_push: - enabled: true - reject_value: -2 - approve_regex: '^(Approved|:shipit:|:\+1:|Engage|:taco:)' - reject_regex: '^(Rejected|:-1:|Borg)' - author_approval: - auto: true - - -groups: - development: - approve_by_comment: - enabled: true - conditions: - branches: - - devel - required: 2 - teams: - - approvers - - master: - approve_by_comment: - enabled: true - conditions: - branches: - - master - required: 4 - teams: - - approvers From 97bc779299f363ad339a771b4f5aa9a138b6696b Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Mon, 16 Dec 2019 19:26:02 +0200 Subject: [PATCH 05/12] db_graph.js: Fix IE 11 IE doesn't support `Array.includes()` Signed-off-by: XhmikosR --- scripts/pi-hole/js/db_graph.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/pi-hole/js/db_graph.js b/scripts/pi-hole/js/db_graph.js index 246698cf..cbe7244c 100644 --- a/scripts/pi-hole/js/db_graph.js +++ b/scripts/pi-hole/js/db_graph.js @@ -107,7 +107,7 @@ function updateQueriesOverTime() { for (hour in data.ads_over_time[0]) { if ({}.hasOwnProperty.call(data.ads_over_time[0], hour)) { - if(!dates.includes(parseInt(data.ads_over_time[0][hour]))) + if(dates.indexOf(parseInt(data.ads_over_time[0][hour])) === -1) { dates.push(parseInt(data.ads_over_time[0][hour])); } From 9c1846885ac48a4c093a42fcd220441481165691 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Tue, 10 Dec 2019 10:15:20 +0200 Subject: [PATCH 06/12] Clean up JS * remove unused variables/functions * use the dot notation * use explicit coercion * remove unneeded else * use `textContent` instead of `innerHTML` * cache a few `getElementById` calls * fix a couple of undefined variables * various assorted lint tweaks Signed-off-by: XhmikosR --- scripts/pi-hole/js/auditlog.js | 17 +++-- scripts/pi-hole/js/customdns.js | 19 ++++-- scripts/pi-hole/js/db_graph.js | 35 +++------- scripts/pi-hole/js/db_lists.js | 16 ++--- scripts/pi-hole/js/db_queries.js | 40 ++++------- scripts/pi-hole/js/debug.js | 4 +- scripts/pi-hole/js/footer.js | 18 +++-- scripts/pi-hole/js/gravity.js | 3 +- scripts/pi-hole/js/index.js | 84 +++++++++++------------- scripts/pi-hole/js/ip-address-sorting.js | 16 ++--- scripts/pi-hole/js/list.js | 16 ++--- scripts/pi-hole/js/network.js | 48 ++++++-------- scripts/pi-hole/js/queries.js | 65 ++++++++---------- scripts/pi-hole/js/queryads.js | 7 +- scripts/pi-hole/js/settings.js | 37 ++++++----- scripts/pi-hole/js/taillog-FTL.js | 9 +-- scripts/pi-hole/js/taillog.js | 9 +-- 17 files changed, 199 insertions(+), 244 deletions(-) diff --git a/scripts/pi-hole/js/auditlog.js b/scripts/pi-hole/js/auditlog.js index 7c92a58d..87837691 100644 --- a/scripts/pi-hole/js/auditlog.js +++ b/scripts/pi-hole/js/auditlog.js @@ -4,8 +4,9 @@ * * 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, auditList = [], auditTimeout; +var auditList = [], auditTimeout; // Credit: http://stackoverflow.com/questions/1787322/htmlspecialchars-equivalent-in-javascript/4835406#4835406 function escapeHtml(text) { @@ -35,7 +36,7 @@ function updateTopLists() { var adtable = $("#ad-frequency").find("tbody:last"); var url, domain; for (domain in data.top_queries) { - if ({}.hasOwnProperty.call(data.top_queries,domain)){ + if (Object.prototype.hasOwnProperty.call(data.top_queries,domain)){ // Sanitize domain domain = escapeHtml(domain); url = ""+domain+""; @@ -45,7 +46,7 @@ function updateTopLists() { } for (domain in data.top_ads) { - if ({}.hasOwnProperty.call(data.top_ads,domain)){ + if (Object.prototype.hasOwnProperty.call(data.top_ads,domain)){ var input = domain.split(" "); // Sanitize domain var printdomain = escapeHtml(input[0]); @@ -71,7 +72,6 @@ function updateTopLists() { }); } - function add(domain,list) { var token = $("#token").html(); $.ajax({ @@ -87,8 +87,8 @@ $(document).ready(function() { updateTopLists(); $("#domain-frequency tbody").on( "click", "button", function () { - var url = ($(this).parents("tr"))[0].innerText.split(" ")[0]; - if($(this).context.innerText === " Blacklist") + var url = ($(this).parents("tr"))[0].textContent.split(" ")[0]; + if($(this).context.textContent === " Blacklist") { add(url,"audit"); add(url,"black"); @@ -101,8 +101,8 @@ $(document).ready(function() { }); $("#ad-frequency tbody").on( "click", "button", function () { - var url = ($(this).parents("tr"))[0].innerText.split(" ")[0].split(" ")[0]; - if($(this).context.innerText === " Whitelist") + var url = ($(this).parents("tr"))[0].textContent.split(" ")[0].split(" ")[0]; + if($(this).context.textContent === " Whitelist") { add(url,"audit"); add(url,"white"); @@ -131,7 +131,6 @@ function auditUrl(url) { }, 3000); } - $("#gravityBtn").on("click", function() { window.location.replace("gravity.php?go"); }); diff --git a/scripts/pi-hole/js/customdns.js b/scripts/pi-hole/js/customdns.js index 4ff50223..834211a6 100644 --- a/scripts/pi-hole/js/customdns.js +++ b/scripts/pi-hole/js/customdns.js @@ -1,3 +1,10 @@ +/* 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. */ + var table; function showAlert(type, message) @@ -7,10 +14,10 @@ function showAlert(type, message) switch (type) { - case 'info': alertElement = $('#alInfo'); break; - case 'success': alertElement = $('#alSuccess'); break; - case 'warning': alertElement = $('#alWarning'); messageElement = $('#warn'); break; - case 'error': alertElement = $('#alFailure'); messageElement = $('#err'); break; + case 'info': alertElement = $('#alInfo'); break; + case 'success': alertElement = $('#alSuccess'); break; + case 'warning': alertElement = $('#alWarning'); messageElement = $('#warn'); break; + case 'error': alertElement = $('#alFailure'); messageElement = $('#err'); break; default: return; } @@ -35,7 +42,7 @@ $(document).ready(function() { ""; } } ], - "drawCallback": function( settings ) { + "drawCallback": function() { $('.deleteCustomDNS').on('click', deleteCustomDNS); } }); @@ -60,7 +67,7 @@ function addCustomDNS() else showAlert('error', response.message); }, - error: function(jqXHR, exception) { + error: function() { showAlert('error', "Error while adding this custom DNS entry"); } }); diff --git a/scripts/pi-hole/js/db_graph.js b/scripts/pi-hole/js/db_graph.js index cbe7244c..422179e8 100644 --- a/scripts/pi-hole/js/db_graph.js +++ b/scripts/pi-hole/js/db_graph.js @@ -5,9 +5,7 @@ * This file is copyright under the latest version of the EUPL. * Please see LICENSE file for your rights under this license. */ -/*global - moment -*/ +/* global Chart:false, moment:false */ var start__ = moment().subtract(6, "days"); var from = moment(start__).utc().valueOf()/1000; @@ -42,22 +40,8 @@ $(function () { until = moment(endt).utc().valueOf()/1000; }); - }); -// 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 padNumber(num) { return ("00" + num).substr(-2,2); } @@ -100,13 +84,13 @@ function updateQueriesOverTime() { var dates = [], hour; for (hour in data.domains_over_time[0]) { - if ({}.hasOwnProperty.call(data.domains_over_time[0], hour)) { + if (Object.prototype.hasOwnProperty.call(data.domains_over_time[0], hour)) { dates.push(parseInt(data.domains_over_time[0][hour])); } } for (hour in data.ads_over_time[0]) { - if ({}.hasOwnProperty.call(data.ads_over_time[0], hour)) { + if (Object.prototype.hasOwnProperty.call(data.ads_over_time[0], hour)) { if(dates.indexOf(parseInt(data.ads_over_time[0][hour])) === -1) { dates.push(parseInt(data.ads_over_time[0][hour])); @@ -118,7 +102,7 @@ function updateQueriesOverTime() { // Add data for each hour that is available for (hour in dates) { - if ({}.hasOwnProperty.call(dates, hour)) { + if (Object.prototype.hasOwnProperty.call(dates, hour)) { var d, dom = 0, ads = 0; d = new Date(1000*dates[hour]); @@ -147,7 +131,6 @@ function updateQueriesOverTime() { }); } -/* global Chart */ $(document).ready(function() { var ctx = document.getElementById("queryOverTimeChart").getContext("2d"); timeLineChart = new Chart(ctx, { @@ -187,7 +170,7 @@ $(document).ready(function() { responsive: true, mode: "x-axis", callbacks: { - title: function(tooltipItem, data) { + title: function(tooltipItem) { var label = tooltipItem[0].xLabel; var time = new Date(label); var date = time.getFullYear()+"-"+padNumber(time.getMonth()+1)+"-"+padNumber(time.getDate()); @@ -209,10 +192,8 @@ $(document).ready(function() { } return data.datasets[tooltipItems.datasetIndex].label + ": " + tooltipItems.yLabel + " (" + percentage.toFixed(1) + "%)"; } - else - { - return data.datasets[tooltipItems.datasetIndex].label + ": " + tooltipItems.yLabel; - } + + return data.datasets[tooltipItems.datasetIndex].label + ": " + tooltipItems.yLabel; } } }, @@ -257,7 +238,7 @@ $("#queryOverTimeChart").click(function(evt){ if(activePoints.length > 0) { //get the internal index in the chart - var clickedElementindex = activePoints[0]["_index"]; + var clickedElementindex = activePoints[0]._index; //get specific label by index var label = timeLineChart.data.labels[clickedElementindex]; diff --git a/scripts/pi-hole/js/db_lists.js b/scripts/pi-hole/js/db_lists.js index 903384af..cbe8bcde 100644 --- a/scripts/pi-hole/js/db_lists.js +++ b/scripts/pi-hole/js/db_lists.js @@ -5,9 +5,7 @@ * This file is copyright under the latest version of the EUPL. * Please see LICENSE file for your rights under this license. */ -/*global - moment -*/ +/* global moment:false */ var start__ = moment().subtract(6, "days"); var from = moment(start__).utc().valueOf()/1000; @@ -67,14 +65,14 @@ function updateTopClientsChart() { var client, percentage, clientname, clientip; var sum = 0; for (client in data.top_sources) { - if ({}.hasOwnProperty.call(data.top_sources, client)){ + if (Object.prototype.hasOwnProperty.call(data.top_sources, client)){ sum += data.top_sources[client]; } } for (client in data.top_sources) { - if ({}.hasOwnProperty.call(data.top_sources, client)){ + if (Object.prototype.hasOwnProperty.call(data.top_sources, client)){ // Sanitize client client = escapeHtml(client); if(escapeHtml(client) !== client) @@ -121,14 +119,14 @@ function updateTopDomainsChart() { var domain, percentage; var sum = 0; for (domain in data.top_domains) { - if ({}.hasOwnProperty.call(data.top_domains, domain)){ + if (Object.prototype.hasOwnProperty.call(data.top_domains, domain)){ sum += data.top_domains[domain]; } } for (domain in data.top_domains) { - if ({}.hasOwnProperty.call(data.top_domains, domain)){ + if (Object.prototype.hasOwnProperty.call(data.top_domains, domain)){ // Sanitize domain domain = escapeHtml(domain); if(escapeHtml(domain) !== domain) @@ -163,14 +161,14 @@ function updateTopAdsChart() { var ad, percentage; var sum = 0; for (ad in data.top_ads) { - if ({}.hasOwnProperty.call(data.top_ads, ad)){ + if (Object.prototype.hasOwnProperty.call(data.top_ads, ad)){ sum += data.top_ads[ad]; } } for (ad in data.top_ads) { - if ({}.hasOwnProperty.call(data.top_ads, ad)){ + if (Object.prototype.hasOwnProperty.call(data.top_ads, ad)){ // Sanitize ad ad = escapeHtml(ad); if(escapeHtml(ad) !== ad) diff --git a/scripts/pi-hole/js/db_queries.js b/scripts/pi-hole/js/db_queries.js index 76ec1f93..a887c0ee 100644 --- a/scripts/pi-hole/js/db_queries.js +++ b/scripts/pi-hole/js/db_queries.js @@ -5,9 +5,7 @@ * This file is copyright under the latest version of the EUPL. * Please see LICENSE file for your rights under this license. */ -/*global - moment -*/ +/* global moment:false */ var start__ = moment().subtract(6, "days"); var from = moment(start__).utc().valueOf()/1000; @@ -26,8 +24,8 @@ location.search.substr(1).split("&").forEach(function(item) {GETDict[item.split( if("from" in GETDict && "until" in GETDict) { - from = parseInt(GETDict["from"]); - until = parseInt(GETDict["until"]); + from = parseInt(GETDict.from); + until = parseInt(GETDict.until); start__ = moment(1000*from); end__ = moment(1000*until); instantquery = true; @@ -60,15 +58,6 @@ $(function () { var tableApi, statistics; -function escapeRegex(text) { - var map = { - "(": "\\(", - ")": "\\)", - ".": "\\.", - }; - return text.replace(/[().]/g, function(m) { return map[m]; }); -} - function add(domain,list) { var token = $("#token").html(); var alInfo = $("#alInfo"); @@ -113,7 +102,7 @@ function add(domain,list) { alDomain.html(""); }); }, - error: function(jqXHR, exception) { + error: function() { alFailure.show(); err.html(""); alFailure.delay(1000).fadeOut(2000, function() { @@ -127,7 +116,7 @@ function add(domain,list) { } }); } -function handleAjaxError( xhr, textStatus, error ) { +function handleAjaxError( xhr, textStatus ) { if ( textStatus === "timeout" ) { alert( "The server took too long to send the data." ); @@ -223,9 +212,8 @@ function refreshTableData() { } $(document).ready(function() { - var status; - var APIstring; + if(instantquery) { APIstring = "api_db.php?getAllQueries&from="+from+"&until="+until; @@ -242,7 +230,7 @@ $(document).ready(function() { } tableApi = $("#all-queries").DataTable( { - "rowCallback": function( row, data, index ){ + "rowCallback": function( row, data ){ var blocked, fieldtext, buttontext, color; switch (data[4]) { @@ -268,31 +256,31 @@ $(document).ready(function() { blocked = true; color = "red"; fieldtext = "Blocked (regex/wildcard)"; - buttontext = "" ; + buttontext = ""; break; case 5: blocked = true; color = "red"; fieldtext = "Blocked (blacklist)"; - buttontext = "" ; + buttontext = ""; break; case 6: blocked = true; color = "red"; fieldtext = "Blocked (external, IP)"; - buttontext = "" ; + buttontext = ""; break; case 7: blocked = true; color = "red"; fieldtext = "Blocked (external, NULL)"; - buttontext = "" ; + buttontext = ""; break; case 8: blocked = true; color = "red"; fieldtext = "Blocked (external, NXRA)"; - buttontext = "" ; + buttontext = ""; break; default: blocked = false; @@ -325,12 +313,12 @@ $(document).ready(function() { "deferRender": true, "order" : [[0, "desc"]], "columns": [ - { "width" : "15%", "render": function (data, type, full, meta) { if(type === "display"){return moment.unix(Math.floor(data/1e6)).format("Y-MM-DD []HH:mm:ss z");}else{return data;} }}, + { "width" : "15%", "render": function (data, type) { if(type === "display"){return moment.unix(Math.floor(data/1e6)).format("Y-MM-DD []HH:mm:ss z");}return data; }}, { "width" : "10%" }, { "width" : "40%" }, { "width" : "20%" }, { "width" : "10%" }, - { "width" : "5%" }, + { "width" : "5%" } ], "lengthMenu": [[10, 25, 50, 100, -1], [10, 25, 50, 100, "All"]], "columnDefs": [ { diff --git a/scripts/pi-hole/js/debug.js b/scripts/pi-hole/js/debug.js index 4f5daf6c..a000ba32 100644 --- a/scripts/pi-hole/js/debug.js +++ b/scripts/pi-hole/js/debug.js @@ -1,3 +1,5 @@ +/* global ActiveXObject: false */ + // Credit: http://stackoverflow.com/a/10642418/2087442 function httpGet(ta,theUrl) { @@ -53,7 +55,7 @@ function eventsource() { }, false); // Will be called when script has finished - source.addEventListener("error", function(e) { + source.addEventListener("error", function() { source.close(); }, false); } diff --git a/scripts/pi-hole/js/footer.js b/scripts/pi-hole/js/footer.js index ccdf67a8..4205c147 100644 --- a/scripts/pi-hole/js/footer.js +++ b/scripts/pi-hole/js/footer.js @@ -4,6 +4,7 @@ * * This file is copyright under the latest version of the EUPL. * Please see LICENSE file for your rights under this license. */ + //The following functions allow us to display time until pi-hole is enabled after disabling. //Works between all pages @@ -132,12 +133,13 @@ $("#pihole-disable-custom").on("click", function(e){ }); // Session timer -var sessionvalidity = parseInt(document.getElementById("sessiontimercounter").textContent); -var start = new Date; +var sessionTimerCounter = document.getElementById("sessiontimercounter"); +var sessionvalidity = parseInt(sessionTimerCounter.textContent); +var start = new Date(); function updateSessionTimer() { - start = new Date; + start = new Date(); start.setSeconds(start.getSeconds() + sessionvalidity); } @@ -147,12 +149,8 @@ if(sessionvalidity > 0) updateSessionTimer(); setInterval(function() { - var current = new Date; + var current = new Date(); var totalseconds = (start - current) / 1000; - - // var hours = Math.floor(totalseconds / 3600); - // totalseconds = totalseconds % 3600; - var minutes = Math.floor(totalseconds / 60); if(minutes < 10){ minutes = "0" + minutes; } @@ -161,11 +159,11 @@ if(sessionvalidity > 0) if(totalseconds > 0) { - document.getElementById("sessiontimercounter").textContent = minutes + ":" + seconds; + sessionTimerCounter.textContent = minutes + ":" + seconds; } else { - document.getElementById("sessiontimercounter").textContent = "-- : --"; + sessionTimerCounter.textContent = "-- : --"; } }, 1000); diff --git a/scripts/pi-hole/js/gravity.js b/scripts/pi-hole/js/gravity.js index bf31254b..34aa1477 100644 --- a/scripts/pi-hole/js/gravity.js +++ b/scripts/pi-hole/js/gravity.js @@ -4,6 +4,7 @@ * * This file is copyright under the latest version of the EUPL. * Please see LICENSE file for your rights under this license. */ + function eventsource() { var alInfo = $("#alInfo"); var alSuccess = $("#alSuccess"); @@ -43,7 +44,7 @@ function eventsource() { }, false); // Will be called when script has finished - source.addEventListener("error", function(e) { + source.addEventListener("error", function() { alInfo.delay(1000).fadeOut(2000, function() { alInfo.hide(); }); source.close(); $("#gravityBtn").removeAttr("disabled"); diff --git a/scripts/pi-hole/js/index.js b/scripts/pi-hole/js/index.js index 93d92a1d..cd9ffa21 100644 --- a/scripts/pi-hole/js/index.js +++ b/scripts/pi-hole/js/index.js @@ -4,9 +4,10 @@ * * This file is copyright under the latest version of the EUPL. * Please see LICENSE file for your rights under this license. */ + // Define global variables -/* global Chart */ -var timeLineChart, queryTypeChart, forwardDestinationChart; +/* global Chart:false, updateSessionTimer:false */ +var timeLineChart, forwardDestinationChart; var queryTypePieChart, forwardDestinationPieChart, clientsChart; function padNumber(num) { @@ -149,7 +150,7 @@ function updateQueriesOverTime() { // Add data for each hour that is available for (var hour in data.ads_over_time[0]) { - if ({}.hasOwnProperty.call(data.ads_over_time[0], hour)) + if (Object.prototype.hasOwnProperty.call(data.ads_over_time[0], hour)) { var d,h; h = parseInt(data.domains_over_time[0][hour]); @@ -199,7 +200,7 @@ function updateQueryTypesPie() { $.each($.AdminLTE.options.colors, function(key, value) { colors.push(value); }); var v = [], c = [], k = [], iter; // Collect values and colors, and labels - if(data.hasOwnProperty("querytypes")) + if(Object.prototype.hasOwnProperty.call(data, "querytypes")) { iter = data.querytypes; } @@ -234,7 +235,7 @@ function updateQueryTypesPie() { var meta = ci.data.datasets[0]._meta; for(let i in meta) { - if ({}.hasOwnProperty.call(meta, i)) + if (Object.prototype.hasOwnProperty.call(meta, i)) { var curr = meta[i].data[index]; curr.hidden = !curr.hidden; @@ -274,12 +275,12 @@ function updateClientsOverTime() { // remove last data point since it not representative data.over_time[0].splice(-1,1); var timestamps = data.over_time[0]; - var plotdata = data.over_time[1]; + var plotdata = data.over_time[1]; var labels = []; var key, i, j; for (key in data.clients) { - if (!{}.hasOwnProperty.call(data.clients, key)) + if (!Object.prototype.hasOwnProperty.call(data.clients, key)) { continue; } @@ -318,9 +319,9 @@ function updateClientsOverTime() { clientsChart.data.datasets.push({ data: [], // If we ran out of colors, make a random one - backgroundColor: i < colors.length - ? colors[i] - : "#" + parseInt("" + Math.random() * 0xffffff, 10).toString(16).padStart(6, "0"), + backgroundColor: i < colors.length ? + colors[i] : + "#" + parseInt(String(Math.random() * 0xFFFFFF), 10).toString(16).padStart(6, "0"), pointRadius: 0, pointHitRadius: 5, pointHoverRadius: 5, @@ -332,13 +333,13 @@ function updateClientsOverTime() { // Add data for each dataset that is available for (j in timestamps) { - if (!{}.hasOwnProperty.call(timestamps, j)) + if (!Object.prototype.hasOwnProperty.call(timestamps, j)) { continue; } for (key in plotdata[j]) { - if (!{}.hasOwnProperty.call(plotdata[j], key)) + if (!Object.prototype.hasOwnProperty.call(plotdata[j], key)) { continue; } @@ -417,7 +418,7 @@ function updateForwardDestinationsPie() { var meta = ci.data.datasets[0]._meta; for(let i in meta) { - if ({}.hasOwnProperty.call(meta, i)) + if (Object.prototype.hasOwnProperty.call(meta, i)) { var curr = meta[i].data[index]; curr.hidden = !curr.hidden; @@ -427,7 +428,7 @@ function updateForwardDestinationsPie() { } else if(e.which === 1) // which == 1 is left mouse button { - var obj = encodeURIComponent(e.target.innerText); + var obj = encodeURIComponent(e.target.textContent); window.open("queries.php?forwarddest="+obj, "_self"); } }); @@ -464,7 +465,7 @@ function updateTopClientsChart() { var client, percentage, clientname, clientip, idx, url; for (client in data.top_sources) { - if ({}.hasOwnProperty.call(data.top_sources, client)){ + if (Object.prototype.hasOwnProperty.call(data.top_sources, client)){ // Sanitize client if(escapeHtml(client) !== client) { @@ -498,7 +499,7 @@ function updateTopClientsChart() { for (client in data.top_sources_blocked) { - if ({}.hasOwnProperty.call(data.top_sources_blocked, client)){ + if (Object.prototype.hasOwnProperty.call(data.top_sources_blocked, client)){ // Sanitize client if(escapeHtml(client) !== client) { @@ -561,7 +562,7 @@ function updateTopLists() { var url, domain, percentage; for (domain in data.top_queries) { - if ({}.hasOwnProperty.call(data.top_queries,domain)){ + if (Object.prototype.hasOwnProperty.call(data.top_queries,domain)){ // Sanitize domain if(escapeHtml(domain) !== domain) { @@ -585,7 +586,7 @@ function updateTopLists() { for (domain in data.top_ads) { - if ({}.hasOwnProperty.call(data.top_ads,domain)){ + if (Object.prototype.hasOwnProperty.call(data.top_ads,domain)){ // Sanitize domain if(escapeHtml(domain) !== domain) { @@ -622,16 +623,15 @@ function updateSummaryData(runOnce) { setTimeout(updateSummaryData, timeInSeconds * 1000); } }; - $.getJSON("api.php?summary", function LoadSummaryData(data) { - + $.getJSON("api.php?summary", function(data) { updateSessionTimer(); if("FTLnotrunning" in data) { - data["dns_queries_today"] = "Lost"; - data["ads_blocked_today"] = "connection"; - data["ads_percentage_today"] = "to"; - data["domains_being_blocked"] = "API"; + data.dns_queries_today = "Lost"; + data.ads_blocked_today = "connection"; + data.ads_percentage_today = "to"; + data.domains_being_blocked = "API"; // Adjust text $("#temperature").html(" FTL offline"); // Show spinner @@ -661,9 +661,9 @@ function updateSummaryData(runOnce) { $("span#" + today).addClass("glow"); }); - if(data.hasOwnProperty("dns_queries_all_types")) + if(Object.prototype.hasOwnProperty.call(data, "dns_queries_all_types")) { - $("#total_queries").prop("title", "only A + AAAA queries (" + data["dns_queries_all_types"] + " in total)"); + $("#total_queries").prop("title", "only A + AAAA queries (" + data.dns_queries_all_types + " in total)"); } window.setTimeout(function() { @@ -749,7 +749,7 @@ $(document).ready(function() { enabled: true, mode: "x-axis", callbacks: { - title: function(tooltipItem, data) { + title: function(tooltipItem) { var label = tooltipItem[0].xLabel; var time = label.match(/(\d?\d):?(\d?\d?)/); var h = parseInt(time[1], 10); @@ -770,10 +770,8 @@ $(document).ready(function() { } return data.datasets[tooltipItems.datasetIndex].label + ": " + tooltipItems.yLabel + " (" + percentage.toFixed(1) + "%)"; } - else - { - return data.datasets[tooltipItems.datasetIndex].label + ": " + tooltipItems.yLabel; - } + + return data.datasets[tooltipItems.datasetIndex].label + ": " + tooltipItems.yLabel; } } }, @@ -820,7 +818,7 @@ $(document).ready(function() { enabled: true, mode: "x-axis", callbacks: { - title: function(tooltipItem, data) { + title: function(tooltipItem) { var label = tooltipItem[0].xLabel; var time = label.match(/(\d?\d):?(\d?\d?)/); var h = parseInt(time[1], 10); @@ -853,7 +851,7 @@ $(document).ready(function() { mix: 0.0, max: 1.0, beginAtZero: true, - callback: function(value, index, values) { + callback: function(value) { return Math.round(value*100) + " %"; } }, @@ -863,15 +861,13 @@ $(document).ready(function() { maintainAspectRatio: true } }); - - // Pull in data via AJAX - updateForwardedOverTime(); } // Create / load "Top Clients over Time" only if authorized - if(document.getElementById("clientsChart")) + var clientsChartEl = document.getElementById("clientsChart"); + if(clientsChartEl) { - ctx = document.getElementById("clientsChart").getContext("2d"); + ctx = clientsChartEl.getContext("2d"); clientsChart = new Chart(ctx, { type: "line", data: { @@ -887,7 +883,7 @@ $(document).ready(function() { return b.yLabel - a.yLabel; }, callbacks: { - title: function(tooltipItem, data) { + title: function(tooltipItem) { var label = tooltipItem[0].xLabel; var time = label.match(/(\d?\d):?(\d?\d?)/); var h = parseInt(time[1], 10); @@ -931,8 +927,8 @@ $(document).ready(function() { } // Create / load "Top Domains" and "Top Advertisers" only if authorized - if(document.getElementById("domain-frequency") - && document.getElementById("ad-frequency")) + if(document.getElementById("domain-frequency") && + document.getElementById("ad-frequency")) { updateTopLists(); } @@ -948,7 +944,7 @@ $(document).ready(function() { if(activePoints.length > 0) { //get the internal index of slice in pie chart - var clickedElementindex = activePoints[0]["_index"]; + var clickedElementindex = activePoints[0]._index; //get specific label by index var label = timeLineChart.data.labels[clickedElementindex]; @@ -978,7 +974,7 @@ $(document).ready(function() { enabled: false, custom: customTooltips, callbacks: { - title: function(tooltipItem, data) { + title: function() { return "Query types"; }, label: function(tooltipItems, data) { @@ -1016,7 +1012,7 @@ $(document).ready(function() { enabled: false, custom: customTooltips, callbacks: { - title: function(tooltipItem, data) { + title: function() { return "Forward destinations"; }, label: function(tooltipItems, data) { diff --git a/scripts/pi-hole/js/ip-address-sorting.js b/scripts/pi-hole/js/ip-address-sorting.js index 6ef1fd3d..13bf1933 100644 --- a/scripts/pi-hole/js/ip-address-sorting.js +++ b/scripts/pi-hole/js/ip-address-sorting.js @@ -11,24 +11,24 @@ jQuery.extend( jQuery.fn.dataTableExt.oSort, { "ip-address-pre": function ( a ) { - if (!a) { return 0 } + if (!a) { return 0; } var i, item; var m = a.split("."), n = a.split(":"), x = "", xa = ""; - if (m.length == 4) + if (m.length === 4) { // IPV4 for(i = 0; i < m.length; i++) { item = m[i]; - if(item.length == 1) + if(item.length === 1) { x += "00" + item; } - else if(item.length == 2) + else if(item.length === 2) { x += "0" + item; } @@ -55,17 +55,17 @@ jQuery.extend( jQuery.fn.dataTableExt.oSort, { count += 0; } - else if(item.length == 1) + else if(item.length === 1) { xa += "000" + item; count += 4; } - else if(item.length == 2) + else if(item.length === 2) { xa += "00" + item; count += 4; } - else if(item.length == 3) + else if(item.length === 3) { xa += "0" + item; count += 4; @@ -86,7 +86,7 @@ jQuery.extend( jQuery.fn.dataTableExt.oSort, item = n[i]; if (item.length === 0 && paddDone === 0) { - for(var padding = 0 ; padding < (32-count) ; padding++) + for(var padding = 0; padding < (32-count); padding++) { x += "0"; paddDone = 1; diff --git a/scripts/pi-hole/js/list.js b/scripts/pi-hole/js/list.js index d28350da..5ef7b491 100644 --- a/scripts/pi-hole/js/list.js +++ b/scripts/pi-hole/js/list.js @@ -4,6 +4,7 @@ * * This file is copyright under the latest version of the EUPL. * Please see LICENSE file for your rights under this license. */ + // IE likes to cache too much :P $.ajaxSetup({cache: false}); @@ -69,6 +70,7 @@ function refresh(fade) { } else { + var data, data2; if(listType === "white") { data = response.whitelist.sort(); @@ -101,13 +103,13 @@ function refresh(fade) { list.fadeIn(100); listw.fadeIn(100); }, - error: function(jqXHR, exception) { + error: function() { $("#alFailure").show(); } }); } -window.onload = refresh(false); +window.addEventListener('load', refresh(false)); function sub(index, entry, arg) { var list = "#list"; @@ -122,12 +124,9 @@ function sub(index, entry, arg) { var alInfo = $("#alInfo"); var alSuccess = $("#alSuccess"); var alFailure = $("#alFailure"); - var alWarning = $("#alWarning"); var err = $("#err"); - var warn = $("#warn"); var msg = $("#success-message"); - var domain = $(list+" #"+index); domain.hide("highlight"); $.ajax({ @@ -160,7 +159,7 @@ function sub(index, entry, arg) { } } }, - error: function(jqXHR, exception) { + error: function() { alert("Failed to remove the domain!"); domain.show({queue:true}); } @@ -180,7 +179,6 @@ function add(type) { var alFailure = $("#alFailure"); var alWarning = $("#alWarning"); var err = $("#err"); - var warn = $("#warn"); var msg = $("#success-message"); alInfo.show(); alSuccess.hide(); @@ -214,7 +212,7 @@ function add(type) { refresh(true); } }, - error: function(jqXHR, exception) { + error: function() { alFailure.show(); err.html(""); alFailure.delay(1000).fadeOut(2000, function() { @@ -227,8 +225,6 @@ function add(type) { }); } - - // Handle enter button for adding domains $(document).keypress(function(e) { if(e.which === 13 && $("#domain,#comment").is(":focus")) { diff --git a/scripts/pi-hole/js/network.js b/scripts/pi-hole/js/network.js index d1b05c5d..3d82fa11 100644 --- a/scripts/pi-hole/js/network.js +++ b/scripts/pi-hole/js/network.js @@ -4,6 +4,9 @@ * * This file is copyright under the latest version of the EUPL. * Please see LICENSE file for your rights under this license. */ + +/* global moment:false */ + var tableApi; var APIstring = "api_db.php?network"; @@ -11,16 +14,7 @@ var APIstring = "api_db.php?network"; // How many IPs do we show at most per device? var MAXIPDISPLAY = 3; -function refreshData() { - tableApi.ajax.url(APIstring).load(); -} - -function openInNewTab(url) { - var win = window.open(url, "_blank"); - win.focus(); -} - -function handleAjaxError( xhr, textStatus, error ) { +function handleAjaxError(xhr, textStatus) { if ( textStatus === "timeout" ) { alert( "The server took too long to send the data." ); @@ -52,9 +46,9 @@ function valueToHex(c) { } function rgbToHex(values) { - return "#" + valueToHex(values[0]) - + valueToHex(values[1]) - + valueToHex(values[2]); + return "#" + valueToHex(values[0]) + + valueToHex(values[1]) + + valueToHex(values[2]); } function mixColors(ratio, rgb1, rgb2) @@ -66,9 +60,9 @@ function mixColors(ratio, rgb1, rgb2) $(document).ready(function() { tableApi = $("#network-entries").DataTable( { - "rowCallback": function( row, data, index ) + "rowCallback": function( row, data ) { - var color, mark, lastQuery = parseInt(data["lastQuery"]); + var color, mark, lastQuery = parseInt(data.lastQuery); if(lastQuery > 0) { var diff = getTimestamp()-lastQuery; @@ -76,7 +70,7 @@ $(document).ready(function() { { // Last query came in within the last 24 hours (24*60*60 = 86400) // Color: light-green to light-yellow - var ratio = 1e0*diff/86400; + var ratio = Number(diff)/86400; var lightgreen = [0xE7, 0xFF, 0xDE]; var lightyellow = [0xFF, 0xFF, 0xDF]; color = rgbToHex(mixColors(ratio, lightgreen, lightyellow)); @@ -102,21 +96,21 @@ $(document).ready(function() { // Insert "Never" into Last Query field when we have // never seen a query from this device - if(data["lastQuery"] === 0) + if(data.lastQuery === 0) { $("td:eq(5)", row).html("Never"); } // Set hostname to "N/A" if not available - if(!data["name"] || data["name"].length < 1) + if(!data.name || data.name.length < 1) { $("td:eq(3)", row).html("N/A"); } // Set number of queries to localized string (add thousand separators) - $("td:eq(6)", row).html(data["numQueries"].toLocaleString()); + $("td:eq(6)", row).html(data.numQueries.toLocaleString()); - var ips = data["ip"]; + var ips = data.ip; var shortips = ips; if(ips.length > MAXIPDISPLAY) { @@ -127,9 +121,9 @@ $(document).ready(function() { $("td:eq(0)", row).hover(function () { this.title=ips.join("\n");}); // MAC + Vendor field if available - if(data["macVendor"] && data["macVendor"].length > 0) + if(data.macVendor && data.macVendor.length > 0) { - $("td:eq(1)", row).html(data["hwaddr"]+"
"+data["macVendor"]); + $("td:eq(1)", row).html(data.hwaddr+"
"+data.macVendor); } }, @@ -146,8 +140,8 @@ $(document).ready(function() { {data: "hwaddr", "width" : "10%", "render": $.fn.dataTable.render.text() }, {data: "interface", "width" : "4%", "render": $.fn.dataTable.render.text() }, {data: "name", "width" : "15%", "render": $.fn.dataTable.render.text() }, - {data: "firstSeen", "width" : "8%", "render": function (data, type, full, meta) { if(type === "display"){return moment.unix(data).format("Y-MM-DD []HH:mm:ss z");}else{return data;} }}, - {data: "lastQuery", "width" : "8%", "render": function (data, type, full, meta) { if(type === "display"){return moment.unix(data).format("Y-MM-DD []HH:mm:ss z");}else{return data;} }}, + {data: "firstSeen", "width" : "8%", "render": function (data, type) { if(type === "display"){return moment.unix(data).format("Y-MM-DD []HH:mm:ss z");}return data; }}, + {data: "lastQuery", "width" : "8%", "render": function (data, type) { if(type === "display"){return moment.unix(data).format("Y-MM-DD []HH:mm:ss z");}return data; }}, {data: "numQueries", "width" : "9%", "render": $.fn.dataTable.render.text() }, {data: "", "width" : "6%", "orderable" : false } ], @@ -157,16 +151,16 @@ $(document).ready(function() { // Store current state in client's local storage area localStorage.setItem("network_table", JSON.stringify(data)); }, - stateLoadCallback: function(settings) { + stateLoadCallback: function() { // Receive previous state from client's local storage area var data = localStorage.getItem("network_table"); // Return if not available if(data === null){ return null; } data = JSON.parse(data); // Always start on the first page - data["start"] = 0; + data.start = 0; // Always start with empty search field - data["search"]["search"] = ""; + data.search.search = ""; // Apply loaded state to table return data; }, diff --git a/scripts/pi-hole/js/queries.js b/scripts/pi-hole/js/queries.js index 5ab26bd1..a877dc7d 100644 --- a/scripts/pi-hole/js/queries.js +++ b/scripts/pi-hole/js/queries.js @@ -4,22 +4,11 @@ * * This file is copyright under the latest version of the EUPL. * Please see LICENSE file for your rights under this license. */ + +/* global moment:false */ + var tableApi; -function escapeRegex(text) { - var map = { - "(": "\\(", - ")": "\\)", - ".": "\\.", - }; - return text.replace(/[().]/g, function(m) { return map[m]; }); -} - -function refreshData() { - tableApi.ajax.url("api.php?getAllQueries").load(); -// updateSessionTimer(); -} - function add(domain,list) { var token = $("#token").html(); var alertModal = $("#alertModal"); @@ -73,7 +62,7 @@ function add(domain,list) { setTimeout(function() { alertModal.modal("hide"); }, 2000); } }, - error: function(jqXHR, exception) { + error: function() { // Network Error alProcessing.hide(); alNetworkErr.show(); @@ -92,7 +81,7 @@ function add(domain,list) { }); } -function handleAjaxError( xhr, textStatus, error ) { +function handleAjaxError( xhr, textStatus ) { if ( textStatus === "timeout" ) { alert( "The server took too long to send the data." ); @@ -123,24 +112,24 @@ $(document).ready(function() { if("from" in GETDict && "until" in GETDict) { - APIstring += "&from="+GETDict["from"]; - APIstring += "&until="+GETDict["until"]; + APIstring += "&from="+GETDict.from; + APIstring += "&until="+GETDict.until; } else if("client" in GETDict) { - APIstring += "&client="+GETDict["client"]; + APIstring += "&client="+GETDict.client; } else if("domain" in GETDict) { - APIstring += "&domain="+GETDict["domain"]; + APIstring += "&domain="+GETDict.domain; } else if("querytype" in GETDict) { - APIstring += "&querytype="+GETDict["querytype"]; + APIstring += "&querytype="+GETDict.querytype; } else if("forwarddest" in GETDict) { - APIstring += "&forwarddest="+GETDict["forwarddest"]; + APIstring += "&forwarddest="+GETDict.forwarddest; } // If we don't ask filtering and also not for all queries, just request the most recent 100 queries else if(!("all" in GETDict)) @@ -149,7 +138,7 @@ $(document).ready(function() { } tableApi = $("#all-queries").DataTable( { - "rowCallback": function( row, data, index ){ + "rowCallback": function( row, data ){ // DNSSEC status var dnssec_status; switch (data[5]) @@ -199,31 +188,31 @@ $(document).ready(function() { blocked = true; colorClass = "text-red"; fieldtext = "Blocked (regex/wildcard)"; - buttontext = "" ; + buttontext = ""; break; case "5": blocked = true; colorClass = "text-red"; fieldtext = "Blocked (blacklist)"; - buttontext = "" ; + buttontext = ""; break; case "6": blocked = true; colorClass = "text-red"; fieldtext = "Blocked (external, IP)"; - buttontext = "" ; + buttontext = ""; break; case "7": blocked = true; colorClass = "text-red"; fieldtext = "Blocked (external, NULL)"; - buttontext = "" ; + buttontext = ""; break; case "8": blocked = true; colorClass = "text-red"; fieldtext = "Blocked (external, NXRA)"; - buttontext = "" ; + buttontext = ""; break; default: blocked = false; @@ -311,7 +300,7 @@ $(document).ready(function() { "processing": true, "order" : [[0, "desc"]], "columns": [ - { "width" : "15%", "render": function (data, type, full, meta) { if(type === "display"){return moment.unix(Math.floor(data/1e6)).format("Y-MM-DD []HH:mm:ss z");}else{return data;} }}, + { "width" : "15%", "render": function (data, type) { if(type === "display"){return moment.unix(Math.floor(data/1e6)).format("Y-MM-DD []HH:mm:ss z");}return data; }}, { "width" : "4%" }, { "width" : "36%", "render": $.fn.dataTable.render.text() }, { "width" : "8%", "render": $.fn.dataTable.render.text() }, @@ -325,16 +314,16 @@ $(document).ready(function() { // Store current state in client's local storage area localStorage.setItem("query_log_table", JSON.stringify(data)); }, - stateLoadCallback: function(settings) { + stateLoadCallback: function() { // Receive previous state from client's local storage area var data = localStorage.getItem("query_log_table"); // Return if not available if(data === null){ return null; } data = JSON.parse(data); // Always start on the first page to show most recent queries - data["start"] = 0; + data.start = 0; // Always start with empty search field - data["search"]["search"] = ""; + data.search.search = ""; // Apply loaded state to table return data; }, @@ -346,11 +335,11 @@ $(document).ready(function() { "initComplete": function () { var api = this.api(); // Query type IPv4 / IPv6 - api.$("td:eq(1)").click( function () { if(autofilter()){ api.search( this.innerHTML ).draw(); $("#resetButton").show(); }}); + api.$("td:eq(1)").click( function () { if(autofilter()){ api.search( this.textContent ).draw(); $("#resetButton").show(); }}); api.$("td:eq(1)").hover( function () { if(autofilter()) { - this.title = "Click to show only " + this.innerHTML + " queries"; + this.title = "Click to show only " + this.textContent + " queries"; this.style.color = "#72afd2"; } else { this.title = ""; @@ -361,11 +350,11 @@ $(document).ready(function() { ); api.$("td:eq(1)").css("cursor","pointer"); // Domain - api.$("td:eq(2)").click( function () { if(autofilter()){ api.search( this.innerHTML ).draw(); $("#resetButton").show(); }}); + api.$("td:eq(2)").click( function () { if(autofilter()){ api.search( this.textContent ).draw(); $("#resetButton").show(); }}); api.$("td:eq(2)").hover( function () { if(autofilter()) { - this.title = "Click to show only queries with domain " + this.innerHTML; + this.title = "Click to show only queries with domain " + this.textContent; this.style.color = "#72afd2"; } else { this.title = ""; @@ -376,11 +365,11 @@ $(document).ready(function() { ); api.$("td:eq(2)").css("cursor","pointer"); // Client - api.$("td:eq(3)").click( function () { if(autofilter()){ api.search( this.innerHTML ).draw(); $("#resetButton").show(); }}); + api.$("td:eq(3)").click( function () { if(autofilter()){ api.search( this.textContent ).draw(); $("#resetButton").show(); }}); api.$("td:eq(3)").hover( function () { if(autofilter()) { - this.title = "Click to show only queries made by " + this.innerHTML; + this.title = "Click to show only queries made by " + this.textContent; this.style.color = "#72afd2"; } else { this.title = ""; diff --git a/scripts/pi-hole/js/queryads.js b/scripts/pi-hole/js/queryads.js index 45a408b1..5eb18dbe 100644 --- a/scripts/pi-hole/js/queryads.js +++ b/scripts/pi-hole/js/queryads.js @@ -4,12 +4,15 @@ * * This file is copyright under the latest version of the EUPL. * Please see LICENSE file for your rights under this license. */ + +/* global ActiveXObject: false */ + var exact = ""; function quietfilter(ta,data) { var lines = data.split("\n"); - for(var i = 0;i 0) { @@ -192,7 +193,7 @@ $(document).ready(function() { }); } //call draw() on each table... they don't render properly with scrollX and scrollY set... ¯\_(ツ)_/¯ - $("a[data-toggle=\"tab\"]").on("shown.bs.tab", function (e) { + $("a[data-toggle=\"tab\"]").on("shown.bs.tab", function () { leasetable.draw(); staticleasetable.draw(); }); diff --git a/scripts/pi-hole/js/taillog-FTL.js b/scripts/pi-hole/js/taillog-FTL.js index 2645badf..be81a7b3 100644 --- a/scripts/pi-hole/js/taillog-FTL.js +++ b/scripts/pi-hole/js/taillog-FTL.js @@ -4,6 +4,7 @@ * * This file is copyright under the latest version of the EUPL. * Please see LICENSE file for your rights under this license. */ + var offset, timer, pre, scrolling = true; // Check every 200msec for fresh data @@ -14,13 +15,13 @@ function reloadData(){ clearTimeout(timer); $.getJSON("scripts/pi-hole/php/tailLog.php?FTL&offset="+offset, function (data) { - pre.append(data["lines"]); + pre.append(data.lines); - if(scrolling && offset !== data["offset"]) { + if(scrolling && offset !== data.offset) { pre.scrollTop(pre[0].scrollHeight); } - offset = data["offset"]; + offset = data.offset; }); timer = setTimeout(reloadData, interval); @@ -30,7 +31,7 @@ $(function(){ // Get offset at first loading of page $.getJSON("scripts/pi-hole/php/tailLog.php?FTL", function (data) { - offset = data["offset"]; + offset = data.offset; }); pre = $("#output"); // Trigger function that looks for new data diff --git a/scripts/pi-hole/js/taillog.js b/scripts/pi-hole/js/taillog.js index 153bd18d..1363a0ee 100644 --- a/scripts/pi-hole/js/taillog.js +++ b/scripts/pi-hole/js/taillog.js @@ -4,6 +4,7 @@ * * This file is copyright under the latest version of the EUPL. * Please see LICENSE file for your rights under this license. */ + var offset, timer, pre, scrolling = true; // Check every 200msec for fresh data @@ -14,13 +15,13 @@ function reloadData(){ clearTimeout(timer); $.getJSON("scripts/pi-hole/php/tailLog.php?offset="+offset, function (data) { - pre.append(data["lines"]); + pre.append(data.lines); - if(scrolling && offset !== data["offset"]) { + if(scrolling && offset !== data.offset) { pre.scrollTop(pre[0].scrollHeight); } - offset = data["offset"]; + offset = data.offset; }); timer = setTimeout(reloadData, interval); @@ -30,7 +31,7 @@ $(function(){ // Get offset at first loading of page $.getJSON("scripts/pi-hole/php/tailLog.php", function (data) { - offset = data["offset"]; + offset = data.offset; }); pre = $("#output"); // Trigger function that looks for new data From 4b06680ba8ec19dd6da5198dd2417dac5b7fe2f9 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Mon, 16 Dec 2019 21:13:22 +0200 Subject: [PATCH 07/12] header: hide `hostname` on small devices Signed-off-by: XhmikosR --- scripts/pi-hole/php/header.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/scripts/pi-hole/php/header.php b/scripts/pi-hole/php/header.php index b174fedd..8e594b47 100644 --- a/scripts/pi-hole/php/header.php +++ b/scripts/pi-hole/php/header.php @@ -259,7 +259,12 @@ if($auth) {