diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 04303614..6f277b21 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,7 +1,33 @@ -##### Expected Behaviour: +**In raising this issue, I confirm the following (please check boxes, eg [X] - no spaces) Failure to fill the template will close your issue:** + +- [] I have read and understood the [contributors guide](https://github.com/pi-hole/pi-hole/blob/master/CONTRIBUTING.md). +- [] The issue I am reporting can be *replicated* +- [] The issue I'm reporting isn't a duplicate (see [FAQs](https://github.com/pi-hole/pi-hole/wiki/FAQs), [closed issues](https://github.com/pi-hole/pi-hole/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aclosed%20), and [open issues](https://github.com/pi-hole/pi-hole/issues)). + +**How familiar are you with the codebase?:** + +_{replace this text with a number from 1 to 10, with 1 being not familiar, and 10 being very familiar}_ + +--- +**[FEATURE REQUEST | QUESTION | OTHER]:** + +Please [submit your feature request here](https://discourse.pi-hole.net/c/feature-requests), so it is votable by the community. It's also easier for us to track. + +**[BUG | ISSUE] Expected Behaviour:** -##### Actual Behaviour: +**[BUG | ISSUE] Actual Behaviour:** -##### Steps to reproduce this issue: +**[BUG | ISSUE] Steps to reproduce:** + +- +- +- +- + +**(Optional) Debug token generated by `pihole -d`:** + +`` + +_This template was created based on the work of [`udemy-dl`](https://github.com/nishad/udemy-dl/blob/master/LICENSE)._ diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 047c8b05..2c391428 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,11 +1,19 @@ -Fixes #[issue number] . +**By submitting this pull request, I confirm the following (please check boxes, eg [X] - no spaces) _Failure to fill the template will close your PR_:** -Changes proposed in this pull request: +***Please submit all pull requests against the `development` branch. Failure to do so will delay or deny your request*** -- +- [] I have read and understood the [contributors guide](https://github.com/pi-hole/pi-hole/blob/master/CONTRIBUTING.md). +- [] I have checked that [another pull request](https://github.com/pi-hole/pi-hole/pulls) for this purpose does not exist. +- [] I have considered, and confirmed that this submission will be valuable to others. +- [] I accept that this submission may not be used, and the pull request closed at the will of the maintainer. +- [] I give this submission freely, and claim no ownership to its content. -- +**How familiar are you with the codebase?:** -- +_{replace this text with a number from 1 to 10, with 1 being not familiar, and 10 being very familiar}_ -@pi-hole/dashboard +--- +_{replace this line with your pull request content}_ + + +_This template was created based on the work of [`udemy-dl`](https://github.com/nishad/udemy-dl/blob/master/LICENSE)._ diff --git a/api.php b/api.php index 150dc9e2..70dbc110 100644 --- a/api.php +++ b/api.php @@ -70,7 +70,16 @@ } elseif (isset($_GET['disable'], $_GET['token']) && $auth) { check_csrf($_GET['token']); - exec('sudo pihole disable'); + $disable = intval($_GET['disable']); + // intval returns the integer value on success, or 0 on failure + if($disable > 0) + { + exec("sudo pihole disable ".$disable."s"); + } + else + { + exec('sudo pihole disable'); + } $data = array_merge($data, Array( "status" => "disabled" )); @@ -80,6 +89,10 @@ $data = array_merge($data, getGravity()); } + if (isset($_GET['tailLog'])) { + $data = array_merge($data, tailPiholeLog($_GET['tailLog'])); + } + function filterArray(&$inArray) { $outArray = array(); foreach ($inArray as $key=>$value) { diff --git a/data.php b/data.php index 34278f18..3a76e893 100644 --- a/data.php +++ b/data.php @@ -121,13 +121,36 @@ return $queryTypes; } + function resolveIPs(&$array) { + $hostarray = []; + foreach ($array as $key => $value) + { + $hostname = gethostbyaddr($key); + // If we found a hostname for the IP, replace it + if($hostname) + { + // Generate HOST entry + $hostarray[$hostname] = $value; + } + else + { + // Generate IP entry + $hostarray[$key] = $value; + } + } + $array = $hostarray; + + // Sort new array + arsort($array); + } + function getForwardDestinations() { - global $log; + global $log, $setupVars; $forwards = getForwards($log); $destinations = array(); foreach ($forwards as $forward) { $exploded = explode(" ", trim($forward)); - $dest = hasHostName($exploded[count($exploded) - 1]); + $dest = $exploded[count($exploded) - 1]; if (isset($destinations[$dest])) { $destinations[$dest]++; } @@ -136,17 +159,36 @@ } } + if(istrue($setupVars["API_GET_UPSTREAM_DNS_HOSTNAME"])) + { + resolveIPs($destinations); + } + return $destinations; } + // Check for existance of variable + // and test it only if it exists + function istrue(&$argument) { + $ret = false; + if(isset($argument)) + { + if($argument) + { + $ret = true; + } + } + return $ret; + } + function getQuerySources() { - global $log; + global $log, $setupVars; $dns_queries = getDnsQueries($log); $sources = array(); foreach($dns_queries as $query) { $exploded = explode(" ", $query); - $ip = hasHostName(trim($exploded[count($exploded)-1])); + $ip = trim($exploded[count($exploded)-1]); if (isset($sources[$ip])) { $sources[$ip]++; } @@ -163,6 +205,12 @@ arsort($sources); $sources = array_slice($sources, 0, 10); + + if(istrue($setupVars["API_GET_CLIENT_HOSTNAME"])) + { + resolveIPs($sources); + } + return Array( 'top_sources' => $sources ); @@ -213,7 +261,7 @@ function getAllQueries($orderBy) { global $log,$showBlocked,$showPermitted,$privacyMode; $allQueries = array("data" => array()); - $dns_queries = getDnsQueriesAll($log); + $dns_queries = getDnsQueries($log); // Create empty array for gravity $gravity_domains = getGravity(); @@ -226,7 +274,8 @@ setShowBlockedPermitted(); - if (substr($tmp, 0, 5) == "query") + $status = isset($gravity_domains[$domain]) ? "Pi-holed" : "OK"; + if(($status === "Pi-holed" && $showBlocked) || ($status === "OK" && $showPermitted)) { $status = isset($gravity_domains[$domain]) ? "Pi-holed" : "OK"; // Display blocked queries if $showBlocked is set @@ -264,6 +313,33 @@ return $allQueries; } + function tailPiholeLog($param) { + // Not using SplFileObject here, since direct + // usage of f-streams will be much faster for + // files as large as the pihole.log + global $logListName; + $file = fopen($logListName,"r"); + $offset = intval($param); + if($offset > 0) + { + // Seeks on the file pointer where we want to continue reading is known + fseek($file, $offset); + $lines = []; + while (!feof($file)) { + array_push($lines,fgets($file)); + } + return ["offset" => ftell($file), "lines" => $lines]; + } + else + { + // Locate the current position of the file read/write pointer + fseek($file, -1, SEEK_END); + // Add one to skip the very last "\n" in the log file + return ["offset" => ftell($file)+1]; + } + fclose($file); + } + /******** Private Members ********/ function gravityCount() { global $gravityListName,$blackListFile; @@ -276,7 +352,7 @@ $log->rewind(); $lines = []; foreach ($log as $line) { - if(strpos($line, ": query[") !== false) { + if(strpos($line, ": query[A") !== false) { $lines[] = $line; } } @@ -285,14 +361,14 @@ function countDnsQueries() { global $logListName; - return exec("grep -c \": query\\[\" $logListName"); + return exec("grep -c \": query\\[A\" $logListName"); } function getDnsQueriesAll(\SplFileObject $log) { $log->rewind(); $lines = []; foreach ($log as $line) { - if(strpos($line, ": query[") || strpos($line, "gravity.list") || strpos($line, ": forwarded") !== false) { + if(strpos($line, ": query[A") || strpos($line, "gravity.list") || strpos($line, ": forwarded") !== false) { $lines[] = $line; } } @@ -339,16 +415,39 @@ function getBlockedQueries(\SplFileObject $log) { $log->rewind(); $lines = []; - $hostname = trim(file_get_contents("/etc/hostname"), "\x00..\x1F"); foreach ($log as $line) { - $line = preg_replace('/ {2,}/', ' ', $line); $exploded = explode(" ", $line); - if(count($exploded) == 8) { - $tmp = $exploded[count($exploded) - 4]; - $tmp2 = $exploded[count($exploded) - 5]; - $tmp3 = $exploded[count($exploded) - 3]; - //filter out bad names and host file reloads: - if(substr($tmp, strlen($tmp) - 12, 12) == "gravity.list" && $tmp2 != "read" && $tmp3 != "pi.hole" && $tmp3 != $hostname) { + if(count($exploded) == 8 || count($exploded) == 10) { + // Structure of data is currently like: + // Array + // ( + // [0] => Dec + // [1] => 19 + // [2] => 11:21:51 + // [3] => dnsmasq[2584]: + // [4] => /etc/pihole/gravity.list + // [5] => doubleclick.com + // [6] => is + // [7] => ip.of.pi.hole + // ) + // with extra logging enabled + // Array + // ( + // [0] => Dec + // [1] => 19 + // [2] => 11:21:51 + // [3] => dnsmasq[2584]: + // [4] => 1 (identifier) + // [5] => 1.2.3.4/12345 + // [6] => /etc/pihole/gravity.list + // [7] => doubleclick.com + // [8] => is + // [9] => ip.of.pi.hole + // ) + $list = $exploded[count($exploded)-4]; + $is = $exploded[count($exploded)-2]; + // Consider only gravity.list as DNS source (not e.g. hostname.list) + if(substr($list, strlen($list) - 12, 12) === "gravity.list" && $is === "is") { $lines[] = $line; }; } @@ -358,8 +457,7 @@ function countBlockedQueries() { global $logListName; - $hostname = trim(file_get_contents("/etc/hostname"), "\x00..\x1F"); - return exec("grep \"gravity.list\" $logListName | grep -v \"pi.hole\" | grep -v \" read \" | grep -v -c \"".$hostname."\""); + return exec("grep \"gravity.list\" $logListName | grep -c \" is \""); } function getForwards(\SplFileObject $log) { diff --git a/header.php b/header.php index 39146967..7470f060 100644 --- a/header.php +++ b/header.php @@ -21,7 +21,16 @@ // Test if we succeeded in getting the temperature if(is_numeric($output)) { - $celsius = intVal($output)*1e-3; + // $output could be either 4-5 digits or 2-3, and we only divide by 1000 if it's 4-5 + // ex. 39007 vs 39 + $celsius = intVal($output); + + // If celsius is greater than 1 degree and is in the 4-5 digit format + if($celsius > 1000) { + // Use multiplication to get around the division-by-zero error + $celsius *= 1e-3; + } + $kelvin = $celsius + 273.15; $fahrenheit = ($celsius*9./5)+32.0; @@ -240,7 +249,7 @@
- Pi-hole logo + Pi-hole logo

Status

@@ -257,7 +266,7 @@ // CPU Temp if ($celsius >= -273.15) { echo " 45) { + if ($celsius > 60) { echo "#FF0000"; } else @@ -314,55 +323,114 @@
+