From ed398fa56fd54266559762c70660fffcf9385efc Mon Sep 17 00:00:00 2001 From: DL6ER Date: Sat, 16 Dec 2017 11:10:10 +0100 Subject: [PATCH 01/24] Use possible non-standard location of FTL's database Signed-off-by: DL6ER --- api_db.php | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/api_db.php b/api_db.php index 7090ed49..e624296c 100644 --- a/api_db.php +++ b/api_db.php @@ -14,16 +14,30 @@ check_cors(); $data = array(); +// Get posible non-standard location of FTL's database +$FTLsettings = parse_ini_file("/etc/pihole/pihole-FTL.conf"); +if(isset($FTLsettings["DBFILE"])) +{ + $DBFILE = $FTLsettings["DBFILE"]; +} +else +{ + $DBFILE = "/etc/pihole/pihole-FTL.db"; +} + // Needs package php5-sqlite, e.g. // sudo apt-get install php5-sqlite function SQLite3_connect($trytoreconnect) { - try { + global $DBFILE; + try + { // connect to database - return new SQLite3('/etc/pihole/pihole-FTL.db', SQLITE3_OPEN_READONLY); + return new SQLite3($DBFILE, SQLITE3_OPEN_READONLY); } - catch (Exception $exception) { + catch (Exception $exception) + { // sqlite3 throws an exception when it is unable to connect, try to reconnect after 3 seconds if($trytoreconnect) { @@ -33,8 +47,14 @@ function SQLite3_connect($trytoreconnect) } } -$db = SQLite3_connect(true); - +if(strlen($DBFILE) > 0) +{ + $db = SQLite3_connect(true); +} +else +{ + die("No database available"); +} if(!$db) { die("Error connecting to database"); From cfa9bfbbd2991c5664db5acb717f93b6ddf8a7d6 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Sun, 17 Dec 2017 21:08:58 +0100 Subject: [PATCH 02/24] :codacy: Signed-off-by: DL6ER --- scripts/pi-hole/js/queries.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts/pi-hole/js/queries.js b/scripts/pi-hole/js/queries.js index a4aa51f3..984215bc 100644 --- a/scripts/pi-hole/js/queries.js +++ b/scripts/pi-hole/js/queries.js @@ -195,22 +195,22 @@ $(document).ready(function() { // Query type IPv4 / IPv6 api.$("td:eq(1)").click( function () { if(autofilter()){ api.search( this.innerHTML ).draw(); $("#resetButton").show(); }}); api.$("td:eq(1)").hover( - function () { this.title="Click to show only "+this.innerHTML+" queries"; this.style.color="#72afd2" }, - function () { this.style.color="" } + function () { this.title="Click to show only "+this.innerHTML+" queries"; this.style.color="#72afd2"; }, + function () { this.style.color=""; } ); 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)").hover( - function () { this.title="Click to show only queries with domain "+this.innerHTML; this.style.color="#72afd2" }, - function () { this.style.color="" } + function () { this.title="Click to show only queries with domain "+this.innerHTML; this.style.color="#72afd2"; }, + function () { this.style.color=""; } ); 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)").hover( - function () { this.title="Click to show only queries made by "+this.innerHTML; this.style.color="#72afd2" }, - function () { this.style.color="" } + function () { this.title="Click to show only queries made by "+this.innerHTML; this.style.color="#72afd2"; }, + function () { this.style.color=""; } ); api.$("td:eq(3)").css("cursor","pointer"); } From bc1f6f9be631b9d2d01d94d1c43dab516c81ed8e Mon Sep 17 00:00:00 2001 From: DL6ER Date: Sat, 30 Dec 2017 18:26:49 +0100 Subject: [PATCH 03/24] Add quad9 secondary IPv4 server Signed-off-by: DL6ER --- scripts/pi-hole/php/savesettings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/pi-hole/php/savesettings.php b/scripts/pi-hole/php/savesettings.php index ad1b0eae..3d56f53b 100644 --- a/scripts/pi-hole/php/savesettings.php +++ b/scripts/pi-hole/php/savesettings.php @@ -123,7 +123,7 @@ function isinserverlist($addr) { "Norton" => ["v4_1" => "199.85.126.10", "v4_2" => "199.85.127.10"], "Comodo" => ["v4_1" => "8.26.56.26", "v4_2" => "8.20.247.20"], "DNS.WATCH" => ["v4_1" => "84.200.69.80", "v4_2" => "84.200.70.40", "v6_1" => "2001:1608:10:25:0:0:1c04:b12f", "v6_2" => "2001:1608:10:25:0:0:9249:d69b"], - "Quad9" => ["v4_1" => "9.9.9.9", "v6_1" => "2620:fe::fe"] + "Quad9" => ["v4_1" => "9.9.9.9", "v4_2" => "149.112.112.112", "v6_1" => "2620:fe::fe"] ]; $adlist = []; From 78a8aa8b31936512a9e348ddc8f4d47853c00317 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Sat, 30 Dec 2017 23:44:01 +0100 Subject: [PATCH 04/24] Check if $results is boolean and use fetchArray() only if it isn't Signed-off-by: DL6ER --- api_db.php | 95 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 61 insertions(+), 34 deletions(-) diff --git a/api_db.php b/api_db.php index e624296c..2263bade 100644 --- a/api_db.php +++ b/api_db.php @@ -62,20 +62,17 @@ if(!$db) if (isset($_GET['getAllQueries']) && $auth) { - if($_GET['getAllQueries'] === "empty") - { - $allQueries = array(); - } - else + $allQueries = array(); + if($_GET['getAllQueries'] !== "empty") { $from = intval($_GET["from"]); $until = intval($_GET["until"]); $results = $db->query('SELECT timestamp,type,domain,client,status FROM queries WHERE timestamp >= '.$from.' AND timestamp <= '.$until.' ORDER BY timestamp ASC'); - $allQueries = array(); - while ($row = $results->fetchArray()) - { - $allQueries[] = [$row[0],$row[1] == 1 ? "IPv4" : "IPv6",$row[2],$row[3],$row[4]]; - } + if(!is_bool($results)) + while ($row = $results->fetchArray()) + { + $allQueries[] = [$row[0],$row[1] == 1 ? "IPv4" : "IPv6",$row[2],$row[3],$row[4]]; + } } $result = array('data' => $allQueries); $data = array_merge($data, $result); @@ -98,12 +95,15 @@ if (isset($_GET['topClients']) && $auth) $limit = "WHERE timestamp <= ".$_GET["until"]; } $results = $db->query('SELECT client,count(client) FROM queries '.$limit.' GROUP by client order by count(client) desc limit 10'); + $clients = array(); - while ($row = $results->fetchArray()) - { - $clients[$row[0]] = intval($row[1]); - // var_dump($row); - } + + if(!is_bool($results)) + while ($row = $results->fetchArray()) + { + $clients[$row[0]] = intval($row[1]); + // var_dump($row); + } $result = array('top_sources' => $clients); $data = array_merge($data, $result); } @@ -125,11 +125,14 @@ if (isset($_GET['topDomains']) && $auth) $limit = " AND timestamp <= ".$_GET["until"]; } $results = $db->query('SELECT domain,count(domain) FROM queries WHERE (STATUS == 2 OR STATUS == 3)'.$limit.' GROUP by domain order by count(domain) desc limit 10'); + $domains = array(); - while ($row = $results->fetchArray()) - { - $domains[$row[0]] = intval($row[1]); - } + + if(!is_bool($results)) + while ($row = $results->fetchArray()) + { + $domains[$row[0]] = intval($row[1]); + } $result = array('top_domains' => $domains); $data = array_merge($data, $result); } @@ -151,11 +154,14 @@ if (isset($_GET['topAds']) && $auth) $limit = " AND timestamp <= ".$_GET["until"]; } $results = $db->query('SELECT domain,count(domain) FROM queries WHERE (STATUS == 1 OR STATUS == 4)'.$limit.' GROUP by domain order by count(domain) desc limit 10'); + $addomains = array(); - while ($row = $results->fetchArray()) - { - $addomains[$row[0]] = intval($row[1]); - } + + if(!is_bool($results)) + while ($row = $results->fetchArray()) + { + $addomains[$row[0]] = intval($row[1]); + } $result = array('top_ads' => $addomains); $data = array_merge($data, $result); } @@ -163,21 +169,36 @@ if (isset($_GET['topAds']) && $auth) if (isset($_GET['getMinTimestamp']) && $auth) { $results = $db->query('SELECT MIN(timestamp) FROM queries'); - $result = array('mintimestamp' => $results->fetchArray()[0]); + + if(!is_bool($results)) + $result = array('mintimestamp' => $results->fetchArray()[0]); + else + $result = array(); + $data = array_merge($data, $result); } if (isset($_GET['getMaxTimestamp']) && $auth) { $results = $db->query('SELECT MAX(timestamp) FROM queries'); - $result = array('maxtimestamp' => $results->fetchArray()[0]); + + if(!is_bool($results)) + $result = array('maxtimestamp' => $results->fetchArray()[0]); + else + $result = array(); + $data = array_merge($data, $result); } if (isset($_GET['getQueriesCount']) && $auth) { $results = $db->query('SELECT COUNT(timestamp) FROM queries'); - $result = array('count' => $results->fetchArray()[0]); + + if(!is_bool($results)) + $result = array('count' => $results->fetchArray()[0]); + else + $result = array(); + $data = array_merge($data, $result); } @@ -216,21 +237,27 @@ if (isset($_GET['getGraphData']) && $auth) // Count permitted queries in intervals $results = $db->query('SELECT (timestamp/'.$interval.')*'.$interval.' interval, COUNT(*) FROM queries WHERE (status == 2 OR status == 3)'.$limit.' GROUP by interval ORDER by interval'); + $domains = array(); - while ($row = $results->fetchArray()) - { - $domains[$row[0]] = intval($row[1]); - } + + if(!is_bool($results)) + while ($row = $results->fetchArray()) + { + $domains[$row[0]] = intval($row[1]); + } $result = array('domains_over_time' => $domains); $data = array_merge($data, $result); // Count blocked queries in intervals $results = $db->query('SELECT (timestamp/'.$interval.')*'.$interval.' interval, COUNT(*) FROM queries WHERE (status == 1 OR status == 4 OR status == 5)'.$limit.' GROUP by interval ORDER by interval'); + $addomains = array(); - while ($row = $results->fetchArray()) - { - $addomains[$row[0]] = intval($row[1]); - } + + if(!is_bool($results)) + while ($row = $results->fetchArray()) + { + $addomains[$row[0]] = intval($row[1]); + } $result = array('ads_over_time' => $addomains); $data = array_merge($data, $result); } From b5adf6d28a14550de5581a1e7700a6c3ca41a7d8 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Sun, 31 Dec 2017 16:41:27 +0100 Subject: [PATCH 05/24] Show DNSSEC result in Query Log (if available) Signed-off-by: DL6ER --- queries.php | 2 ++ scripts/pi-hole/js/queries.js | 36 +++++++++++++++++++++++++++-------- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/queries.php b/queries.php index f511f8d1..705a22d6 100644 --- a/queries.php +++ b/queries.php @@ -119,6 +119,7 @@ if(strlen($showing) > 0) Domain Client Status + DNSSEC Action @@ -129,6 +130,7 @@ if(strlen($showing) > 0) Domain Client Status + DNSSEC Action diff --git a/scripts/pi-hole/js/queries.js b/scripts/pi-hole/js/queries.js index 984215bc..246c20bf 100644 --- a/scripts/pi-hole/js/queries.js +++ b/scripts/pi-hole/js/queries.js @@ -135,37 +135,56 @@ $(document).ready(function() { { $(row).css("color","red"); $("td:eq(4)", row).html( "Pi-holed" ); - $("td:eq(5)", row).html( "" ); + $("td:eq(6)", row).html( "" ); } else if (data[4] === "2") { $(row).css("color","green"); $("td:eq(4)", row).html( "OK (forwarded)" ); - $("td:eq(5)", row).html( "" ); + $("td:eq(6)", row).html( "" ); } else if (data[4] === "3") { $(row).css("color","green"); $("td:eq(4)", row).html( "OK (cached)" ); - $("td:eq(5)", row).html( "" ); + $("td:eq(6)", row).html( "" ); } else if (data[4] === "4") { $(row).css("color","red"); $("td:eq(4)", row).html( "Pi-holed (wildcard)" ); - $("td:eq(5)", row).html( "" ); + $("td:eq(6)", row).html( "" ); } else if (data[4] === "5") { $(row).css("color","red"); $("td:eq(4)", row).html( "Pi-holed (blacklist)" ); - $("td:eq(5)", row).html( "" ); + $("td:eq(6)", row).html( "" ); } else { $("td:eq(4)", row).html( "Unknown" ); - $("td:eq(5)", row).html( "" ); + $("td:eq(6)", row).html( "" ); + } + if (data[5] === "1") + { + $("td:eq(5)", row).css("color","green"); + $("td:eq(5)", row).html( "SECURE" ); + } + else if (data[5] === "2") + { + $("td:eq(5)", row).css("color","orange"); + $("td:eq(5)", row).html( "INSECURE" ); + } + else if (data[5] === "5") + { + $("td:eq(5)", row).css("color","red"); + $("td:eq(5)", row).html( "BOGUS" ); + } + else + { + $("td:eq(5)", row).html( "-" ); } }, dom: "<'row'<'col-sm-12'f>>" + @@ -179,9 +198,10 @@ $(document).ready(function() { "columns": [ { "width" : "20%", "render": function (data, type, full, meta) { if(type === "display"){return moment.unix(data).format("Y-MM-DD HH:mm:ss z");}else{return data;} }}, { "width" : "10%" }, - { "width" : "40%", "render": $.fn.dataTable.render.text() }, - { "width" : "10%", "render": $.fn.dataTable.render.text() }, + { "width" : "37%", "render": $.fn.dataTable.render.text() }, + { "width" : "8%", "render": $.fn.dataTable.render.text() }, { "width" : "10%" }, + { "width" : "5%" }, { "width" : "10%" }, ], "lengthMenu": [[10, 25, 50, 100, -1], [10, 25, 50, 100, "All"]], From d9d477f7fbab001120eb61baa79d5c623df69255 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Sun, 31 Dec 2017 16:50:31 +0100 Subject: [PATCH 06/24] Add "BOGUS" and unknown ("?") Signed-off-by: DL6ER --- scripts/pi-hole/js/queries.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/scripts/pi-hole/js/queries.js b/scripts/pi-hole/js/queries.js index 246c20bf..3642248b 100644 --- a/scripts/pi-hole/js/queries.js +++ b/scripts/pi-hole/js/queries.js @@ -177,11 +177,16 @@ $(document).ready(function() { $("td:eq(5)", row).css("color","orange"); $("td:eq(5)", row).html( "INSECURE" ); } - else if (data[5] === "5") + else if (data[5] === "3") { $("td:eq(5)", row).css("color","red"); $("td:eq(5)", row).html( "BOGUS" ); } + else if (data[5] === "4") + { + $("td:eq(5)", row).css("color","red"); + $("td:eq(5)", row).html( "?" ); + } else { $("td:eq(5)", row).html( "-" ); From f5930e134cd165fb5b6a8c5e0ff77cef5aff0a1d Mon Sep 17 00:00:00 2001 From: DL6ER Date: Sun, 31 Dec 2017 17:19:21 +0100 Subject: [PATCH 07/24] Add ABANDONED result Signed-off-by: DL6ER --- scripts/pi-hole/js/queries.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/scripts/pi-hole/js/queries.js b/scripts/pi-hole/js/queries.js index 3642248b..cc9df897 100644 --- a/scripts/pi-hole/js/queries.js +++ b/scripts/pi-hole/js/queries.js @@ -183,6 +183,11 @@ $(document).ready(function() { $("td:eq(5)", row).html( "BOGUS" ); } else if (data[5] === "4") + { + $("td:eq(5)", row).css("color","red"); + $("td:eq(5)", row).html( "ABANDONED" ); + } + else if (data[5] === "5") { $("td:eq(5)", row).css("color","red"); $("td:eq(5)", row).html( "?" ); From 6500d4628967f6c077fdd06c94bd7c568846a12a Mon Sep 17 00:00:00 2001 From: DL6ER Date: Sun, 31 Dec 2017 17:20:41 +0100 Subject: [PATCH 08/24] Unspecified is no error, so make it black Signed-off-by: DL6ER --- scripts/pi-hole/js/queries.js | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/pi-hole/js/queries.js b/scripts/pi-hole/js/queries.js index cc9df897..bb83e777 100644 --- a/scripts/pi-hole/js/queries.js +++ b/scripts/pi-hole/js/queries.js @@ -194,6 +194,7 @@ $(document).ready(function() { } else { + $("td:eq(5)", row).css("color","black"); $("td:eq(5)", row).html( "-" ); } }, From f2a0b622f1f8c38bb2c4a070a62b19d589b77c1d Mon Sep 17 00:00:00 2001 From: Mark Drobnak Date: Tue, 2 Jan 2018 11:59:51 -0500 Subject: [PATCH 09/24] Fix preg_split warning Warning was: `preg_split(): Delimiter must not be alphanumeric or backslash` Signed-off-by: Mark Drobnak --- scripts/pi-hole/php/auth.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/pi-hole/php/auth.php b/scripts/pi-hole/php/auth.php index 85d38f8f..f5032488 100644 --- a/scripts/pi-hole/php/auth.php +++ b/scripts/pi-hole/php/auth.php @@ -119,7 +119,7 @@ function check_csrf($token) { function check_domain() { if(isset($_POST['domain'])){ - $domains = preg_split('\s+', $_POST['domain']); + $domains = preg_split('/\s+/', $_POST['domain']); foreach($domains as $domain) { $validDomain = is_valid_domain_name($domain); From 746df3b63fd0d94524b645a25916dd5345c9643b Mon Sep 17 00:00:00 2001 From: DL6ER Date: Fri, 5 Jan 2018 23:19:02 +0100 Subject: [PATCH 10/24] Decide whether FTL is on any custom branch by looking for "vDev" in the beginning of the version string Signed-off-by: DL6ER --- scripts/pi-hole/php/update_checker.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/pi-hole/php/update_checker.php b/scripts/pi-hole/php/update_checker.php index 9bd4ab06..d479318a 100644 --- a/scripts/pi-hole/php/update_checker.php +++ b/scripts/pi-hole/php/update_checker.php @@ -44,12 +44,12 @@ else /********** Get Pi-hole FTL (not a git repository) **********/ $FTL_branch = $branches[2]; - if($FTL_branch !== "master") { + if(substr($versions[2], 0, 4) === "vDev") { $FTL_current = "vDev"; $FTL_commit = $versions[2]; } else { - $FTL_current = explode("-",$versions[2])[0]; + $FTL_current = $versions[2]; } // Get data from GitHub From b0a56e9017c7649be6306d4312554b23d437da0e Mon Sep 17 00:00:00 2001 From: Mcat12 Date: Fri, 5 Jan 2018 17:48:53 -0500 Subject: [PATCH 11/24] Add warning to block lists tab of settings page Signed-off-by: Mcat12 --- settings.php | 1 + 1 file changed, 1 insertion(+) diff --git a/settings.php b/settings.php index a032c9ee..0af4711e 100644 --- a/settings.php +++ b/settings.php @@ -288,6 +288,7 @@ if (isset($_GET['tab']) && in_array($_GET['tab'], array("sysadmin", "blocklists" From f0f32e82a5282714a22e7154c5d9d1c3bb5c4bf2 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Sun, 7 Jan 2018 17:49:55 +0100 Subject: [PATCH 12/24] Convert all client host names to lower case when requesting api_db.php?topClients Signed-off-by: DL6ER --- api_db.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api_db.php b/api_db.php index 2263bade..161f8d87 100644 --- a/api_db.php +++ b/api_db.php @@ -94,7 +94,7 @@ if (isset($_GET['topClients']) && $auth) { $limit = "WHERE timestamp <= ".$_GET["until"]; } - $results = $db->query('SELECT client,count(client) FROM queries '.$limit.' GROUP by client order by count(client) desc limit 10'); + $results = $db->query('SELECT LOWER(client),count(LOWER(client)) FROM queries '.$limit.' GROUP by LOWER(client) order by count(LOWER(client)) desc limit 10'); $clients = array(); From 047329a4aeabbeccfefa1882dd270a852b64382d Mon Sep 17 00:00:00 2001 From: DL6ER Date: Sun, 7 Jan 2018 18:02:13 +0100 Subject: [PATCH 13/24] Reset the SQL syntax - directly doing it in PHP is obviously much faster! Signed-off-by: DL6ER --- api_db.php | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/api_db.php b/api_db.php index 161f8d87..df64176d 100644 --- a/api_db.php +++ b/api_db.php @@ -94,15 +94,25 @@ if (isset($_GET['topClients']) && $auth) { $limit = "WHERE timestamp <= ".$_GET["until"]; } - $results = $db->query('SELECT LOWER(client),count(LOWER(client)) FROM queries '.$limit.' GROUP by LOWER(client) order by count(LOWER(client)) desc limit 10'); + $results = $db->query('SELECT client,count(client) FROM queries '.$limit.' GROUP by client order by count(client) desc limit 10'); $clients = array(); if(!is_bool($results)) while ($row = $results->fetchArray()) { - $clients[$row[0]] = intval($row[1]); - // var_dump($row); + // Convert client to lower case + $c = strtolower($row[0]); + if(array_key_exists($c, $clients)) + { + // Entry already exists, add to it (might appear multiple times due to mixed capitalization in the database) + $clients[$c] += intval($row[1]); + } + else + { + // Entry does not yet exist + $clients[$c] = intval($row[1]); + } } $result = array('top_sources' => $clients); $data = array_merge($data, $result); From 9cc8062c88ce6b562ccbcd6c05a83e4fde2e524f Mon Sep 17 00:00:00 2001 From: DL6ER Date: Sun, 7 Jan 2018 18:07:39 +0100 Subject: [PATCH 14/24] Fetch up to 20 clients and limit the list to 10 results in PHP Signed-off-by: DL6ER --- api_db.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/api_db.php b/api_db.php index df64176d..ff723d43 100644 --- a/api_db.php +++ b/api_db.php @@ -94,12 +94,13 @@ if (isset($_GET['topClients']) && $auth) { $limit = "WHERE timestamp <= ".$_GET["until"]; } - $results = $db->query('SELECT client,count(client) FROM queries '.$limit.' GROUP by client order by count(client) desc limit 10'); + $results = $db->query('SELECT client,count(client) FROM queries '.$limit.' GROUP by client order by count(client) desc limit 20'); $clients = array(); + $num = 0; if(!is_bool($results)) - while ($row = $results->fetchArray()) + while (($row = $results->fetchArray()) && $num < 10) { // Convert client to lower case $c = strtolower($row[0]); @@ -112,6 +113,8 @@ if (isset($_GET['topClients']) && $auth) { // Entry does not yet exist $clients[$c] = intval($row[1]); + // Increase number of clients + $num++; } } $result = array('top_sources' => $clients); From 84012074de5952452859499a8e9c414d026d26bf Mon Sep 17 00:00:00 2001 From: DL6ER Date: Sun, 7 Jan 2018 18:15:08 +0100 Subject: [PATCH 15/24] Add the same logic for topDomains Signed-off-by: DL6ER --- api_db.php | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/api_db.php b/api_db.php index ff723d43..dd4e1ecc 100644 --- a/api_db.php +++ b/api_db.php @@ -137,14 +137,28 @@ if (isset($_GET['topDomains']) && $auth) { $limit = " AND timestamp <= ".$_GET["until"]; } - $results = $db->query('SELECT domain,count(domain) FROM queries WHERE (STATUS == 2 OR STATUS == 3)'.$limit.' GROUP by domain order by count(domain) desc limit 10'); + $results = $db->query('SELECT domain,count(domain) FROM queries WHERE (STATUS == 2 OR STATUS == 3)'.$limit.' GROUP by domain order by count(domain) desc limit 20'); $domains = array(); + $num = 0; if(!is_bool($results)) - while ($row = $results->fetchArray()) + while (($row = $results->fetchArray()) && $num < 10) { - $domains[$row[0]] = intval($row[1]); + // Convert client to lower case + $c = strtolower($row[0]); + if(array_key_exists($c, $domains)) + { + // Entry already exists, add to it (might appear multiple times due to mixed capitalization in the database) + $domains[$c] += intval($row[1]); + } + else + { + // Entry does not yet exist + $domains[$c] = intval($row[1]); + // Increase number of domains + $num++; + } } $result = array('top_domains' => $domains); $data = array_merge($data, $result); From 0fbd8608277bdd0dc5078e7a1938732215c8f8e8 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Sun, 7 Jan 2018 19:13:58 +0100 Subject: [PATCH 16/24] Process all returned data before sorting and slicing the data Signed-off-by: DL6ER --- api_db.php | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/api_db.php b/api_db.php index dd4e1ecc..04980e94 100644 --- a/api_db.php +++ b/api_db.php @@ -97,10 +97,9 @@ if (isset($_GET['topClients']) && $auth) $results = $db->query('SELECT client,count(client) FROM queries '.$limit.' GROUP by client order by count(client) desc limit 20'); $clients = array(); - $num = 0; if(!is_bool($results)) - while (($row = $results->fetchArray()) && $num < 10) + while ($row = $results->fetchArray()) { // Convert client to lower case $c = strtolower($row[0]); @@ -113,10 +112,15 @@ if (isset($_GET['topClients']) && $auth) { // Entry does not yet exist $clients[$c] = intval($row[1]); - // Increase number of clients - $num++; } } + + // Sort by number of hits + arsort($clients); + + // Extract only the first ten entries + $clients = array_slice($clients, 0, 10); + $result = array('top_sources' => $clients); $data = array_merge($data, $result); } @@ -140,10 +144,9 @@ if (isset($_GET['topDomains']) && $auth) $results = $db->query('SELECT domain,count(domain) FROM queries WHERE (STATUS == 2 OR STATUS == 3)'.$limit.' GROUP by domain order by count(domain) desc limit 20'); $domains = array(); - $num = 0; if(!is_bool($results)) - while (($row = $results->fetchArray()) && $num < 10) + while ($row = $results->fetchArray()) { // Convert client to lower case $c = strtolower($row[0]); @@ -156,10 +159,15 @@ if (isset($_GET['topDomains']) && $auth) { // Entry does not yet exist $domains[$c] = intval($row[1]); - // Increase number of domains - $num++; } } + + // Sort by number of hits + arsort($domains); + + // Extract only the first ten entries + $domains = array_slice($domains, 0, 10); + $result = array('top_domains' => $domains); $data = array_merge($data, $result); } From 081f0bb98c27f4b21414ad467e81f6f921933477 Mon Sep 17 00:00:00 2001 From: Mcat12 Date: Sun, 7 Jan 2018 14:04:38 -0500 Subject: [PATCH 17/24] Add timeout warning to database pages Signed-off-by: Mcat12 --- db_graph.php | 6 +++++- db_lists.php | 5 +++++ db_queries.php | 5 +++++ scripts/pi-hole/js/db_graph.js | 4 ++++ scripts/pi-hole/js/db_lists.js | 17 +++++++++++++++++ scripts/pi-hole/js/db_queries.js | 4 ++++ 6 files changed, 40 insertions(+), 1 deletion(-) diff --git a/db_graph.php b/db_graph.php index 9dbdba73..2642bf14 100644 --- a/db_graph.php +++ b/db_graph.php @@ -22,7 +22,6 @@ $token = $_SESSION['token'];

Compute graphical statistics from the Pi-hole query database

-
@@ -39,6 +38,11 @@ $token = $_SESSION['token'];
+ + +
diff --git a/db_lists.php b/db_lists.php index 0ddc9dda..c0e39408 100644 --- a/db_lists.php +++ b/db_lists.php @@ -39,6 +39,11 @@ $token = $_SESSION['token'];
+ + + + + +
diff --git a/scripts/pi-hole/js/db_graph.js b/scripts/pi-hole/js/db_graph.js index d543f16b..8da24ad6 100644 --- a/scripts/pi-hole/js/db_graph.js +++ b/scripts/pi-hole/js/db_graph.js @@ -14,6 +14,8 @@ var from = moment(start__).utc().valueOf()/1000; var end__ = moment(); var until = moment(end__).utc().valueOf()/1000; +var timeoutWarning = $("#timeoutWarning"); + $(function () { $("#querytime").daterangepicker( { @@ -80,6 +82,7 @@ function compareNumbers(a, b) { function updateQueriesOverTime() { $("#queries-over-time .overlay").show(); + timeoutWarning.show(); $.getJSON("api_db.php?getGraphData&from="+from+"&until="+until, function(data) { // convert received objects to arrays @@ -135,6 +138,7 @@ function updateQueriesOverTime() { timeLineChart.options.scales.xAxes[0].display=true; $("#queries-over-time .overlay").hide(); + timeoutWarning.hide(); timeLineChart.update(); }); } diff --git a/scripts/pi-hole/js/db_lists.js b/scripts/pi-hole/js/db_lists.js index 75a21746..89c460c1 100644 --- a/scripts/pi-hole/js/db_lists.js +++ b/scripts/pi-hole/js/db_lists.js @@ -14,6 +14,9 @@ var from = moment(start__).utc().valueOf()/1000; var end__ = moment(); var until = moment(end__).utc().valueOf()/1000; +var timeoutWarning = $("#timeoutWarning"); +var listsStillLoading = 0; + $(function () { $("#querytime").daterangepicker( { @@ -97,6 +100,10 @@ function updateTopClientsChart() { } $("#client-frequency .overlay").hide(); + + listsStillLoading--; + if(listsStillLoading == 0) + timeoutWarning.hide(); }); } @@ -135,6 +142,10 @@ function updateTopDomainsChart() { } $("#domain-frequency .overlay").hide(); + + listsStillLoading--; + if(listsStillLoading == 0) + timeoutWarning.hide(); }); } @@ -171,10 +182,16 @@ function updateTopAdsChart() { } $("#ad-frequency .overlay").hide(); + + listsStillLoading--; + if(listsStillLoading == 0) + timeoutWarning.hide(); }); } $("#querytime").on("apply.daterangepicker", function(ev, picker) { + timeoutWarning.show(); + listsStillLoading = 3; updateTopClientsChart(); updateTopDomainsChart(); updateTopAdsChart(); diff --git a/scripts/pi-hole/js/db_queries.js b/scripts/pi-hole/js/db_queries.js index 8551e9dc..459d87ce 100644 --- a/scripts/pi-hole/js/db_queries.js +++ b/scripts/pi-hole/js/db_queries.js @@ -16,6 +16,8 @@ var until = moment(end__).utc().valueOf()/1000; var instantquery = false; var daterange; +var timeoutWarning = $("#timeoutWarning"); + // Do we want to filter queries? var GETDict = {}; location.search.substr(1).split("&").forEach(function(item) {GETDict[item.split("=")[0]] = item.split("=")[1];}); @@ -141,6 +143,7 @@ function handleAjaxError( xhr, textStatus, error ) { var reloadCallback = function() { + timeoutWarning.hide(); statistics = [0,0,0,0]; var data = tableApi.rows().data(); for (var i = 0; i < data.length; i++) { @@ -171,6 +174,7 @@ var reloadCallback = function() }; function refreshTableData() { + timeoutWarning.show(); var APIstring = "api_db.php?getAllQueries&from="+from+"&until="+until; statistics = [0,0,0]; tableApi.ajax.url(APIstring).load(reloadCallback); From 322f73fcacc29a6063d2f8e0c0dba7be017221c5 Mon Sep 17 00:00:00 2001 From: Mcat12 Date: Sun, 7 Jan 2018 14:13:57 -0500 Subject: [PATCH 18/24] Use triple equals Signed-off-by: Mcat12 --- scripts/pi-hole/js/db_lists.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/pi-hole/js/db_lists.js b/scripts/pi-hole/js/db_lists.js index 89c460c1..3358cf33 100644 --- a/scripts/pi-hole/js/db_lists.js +++ b/scripts/pi-hole/js/db_lists.js @@ -102,7 +102,7 @@ function updateTopClientsChart() { $("#client-frequency .overlay").hide(); listsStillLoading--; - if(listsStillLoading == 0) + if(listsStillLoading === 0) timeoutWarning.hide(); }); } From afe2f73bef30feac6ff1335299de10ff561270f7 Mon Sep 17 00:00:00 2001 From: Mcat12 Date: Sun, 7 Jan 2018 14:20:41 -0500 Subject: [PATCH 19/24] Use triple equals in the other places too Signed-off-by: Mcat12 --- scripts/pi-hole/js/db_lists.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/pi-hole/js/db_lists.js b/scripts/pi-hole/js/db_lists.js index 3358cf33..43e569f7 100644 --- a/scripts/pi-hole/js/db_lists.js +++ b/scripts/pi-hole/js/db_lists.js @@ -144,7 +144,7 @@ function updateTopDomainsChart() { $("#domain-frequency .overlay").hide(); listsStillLoading--; - if(listsStillLoading == 0) + if(listsStillLoading === 0) timeoutWarning.hide(); }); } @@ -184,7 +184,7 @@ function updateTopAdsChart() { $("#ad-frequency .overlay").hide(); listsStillLoading--; - if(listsStillLoading == 0) + if(listsStillLoading === 0) timeoutWarning.hide(); }); } From 0fdebd070c96b4cc57c3f147051bb23ad30be24a Mon Sep 17 00:00:00 2001 From: DL6ER Date: Sun, 7 Jan 2018 20:22:38 +0100 Subject: [PATCH 20/24] Set maximum execution time to 10 minutes in api_db.php Signed-off-by: DL6ER --- api_db.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api_db.php b/api_db.php index 04980e94..45b98919 100644 --- a/api_db.php +++ b/api_db.php @@ -12,6 +12,9 @@ require("scripts/pi-hole/php/password.php"); require("scripts/pi-hole/php/auth.php"); check_cors(); +// Set maximum execution time to 10 minutes +ini_set("max_execution_time","600"); + $data = array(); // Get posible non-standard location of FTL's database From 60814298ef7270db30afdf342f3fea80d87a3e7a Mon Sep 17 00:00:00 2001 From: DL6ER Date: Sun, 7 Jan 2018 20:46:15 +0100 Subject: [PATCH 21/24] Total queries should be (all of them) not only (forwarded + cached) Signed-off-by: DL6ER --- api_db.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api_db.php b/api_db.php index 45b98919..2cd99bf8 100644 --- a/api_db.php +++ b/api_db.php @@ -274,7 +274,7 @@ if (isset($_GET['getGraphData']) && $auth) } // Count permitted queries in intervals - $results = $db->query('SELECT (timestamp/'.$interval.')*'.$interval.' interval, COUNT(*) FROM queries WHERE (status == 2 OR status == 3)'.$limit.' GROUP by interval ORDER by interval'); + $results = $db->query('SELECT (timestamp/'.$interval.')*'.$interval.' interval, COUNT(*) FROM queries WHERE (status != 0 )'.$limit.' GROUP by interval ORDER by interval'); $domains = array(); From a2d9e7c1ac7e413e26f672fba05cfb4c32c717c0 Mon Sep 17 00:00:00 2001 From: Mcat12 Date: Mon, 8 Jan 2018 22:03:27 -0500 Subject: [PATCH 22/24] Add auditlog.list to the Teleporter Signed-off-by: Mcat12 --- scripts/pi-hole/php/teleporter.php | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/pi-hole/php/teleporter.php b/scripts/pi-hole/php/teleporter.php index 0427b7c0..9efe7fd1 100644 --- a/scripts/pi-hole/php/teleporter.php +++ b/scripts/pi-hole/php/teleporter.php @@ -176,6 +176,7 @@ else archive_add_file("/etc/pihole/","blacklist.txt"); archive_add_file("/etc/pihole/","adlists.list"); archive_add_file("/etc/pihole/","setupVars.conf"); + archive_add_file("/etc/pihole/","auditlog.list"); archive_add_directory("/etc/dnsmasq.d/"); $archive["wildcardblocking.txt"] = getWildcardListContent(); From 323b3a7a8b169ed95782d87d3daddbb539762813 Mon Sep 17 00:00:00 2001 From: Mark Drobnak Date: Wed, 10 Jan 2018 15:53:16 -0500 Subject: [PATCH 23/24] Fix Top Clients filter It expected IP addresses, but only let in domains Signed-off-by: Mark Drobnak --- scripts/pi-hole/php/savesettings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/pi-hole/php/savesettings.php b/scripts/pi-hole/php/savesettings.php index 3d56f53b..a85b65ce 100644 --- a/scripts/pi-hole/php/savesettings.php +++ b/scripts/pi-hole/php/savesettings.php @@ -320,7 +320,7 @@ function readAdlists() $first = true; foreach($clients as $client) { - if(!validDomainWildcard($client)) + if(!validIP($domain)) { $error .= "Top Clients entry ".htmlspecialchars($client)." is invalid (use only IP addresses)!
"; } From 34b6c3751624d615634dec0cbf7bb019ca2cc0c3 Mon Sep 17 00:00:00 2001 From: Mark Drobnak Date: Thu, 11 Jan 2018 15:33:31 -0500 Subject: [PATCH 24/24] Fix IP check and allow host names in Top Clients filter Signed-off-by: Mark Drobnak --- scripts/pi-hole/php/savesettings.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/pi-hole/php/savesettings.php b/scripts/pi-hole/php/savesettings.php index a85b65ce..7b67ffed 100644 --- a/scripts/pi-hole/php/savesettings.php +++ b/scripts/pi-hole/php/savesettings.php @@ -320,9 +320,9 @@ function readAdlists() $first = true; foreach($clients as $client) { - if(!validIP($domain)) + if(!validDomainWildcard($client) && !validIP($client)) { - $error .= "Top Clients entry ".htmlspecialchars($client)." is invalid (use only IP addresses)!
"; + $error .= "Top Clients entry ".htmlspecialchars($client)." is invalid (use only host names and IP addresses)!
"; } if(!$first) {