Files
web/data.php
Jakob Ackermann 0197ca79fd use the date command for the other dates as well
trim against leading space from %k (range of ' 0' to '23') and
strtolower for AM/PM that %p outputs as uppercase, while 'a' (-> am/pm)
was used before
2016-10-09 05:54:32 +02:00

298 lines
8.9 KiB
PHP

<?php
$log = array();
$ipv6 = parse_ini_file("/etc/pihole/setupVars.conf")['piholeIPv6'] != "";
$hosts = file_exists("/etc/hosts") ? file("/etc/hosts") : array();
/******* Public Members ********/
function getSummaryData() {
global $ipv6;
$log = readInLog();
$domains_being_blocked = gravityCount() / ($ipv6 ? 2 : 1);
$dns_queries_today = count(getDnsQueries($log));
$ads_blocked_today = count(getBlockedQueries($log));
$ads_percentage_today = $dns_queries_today > 0 ? ($ads_blocked_today / $dns_queries_today * 100) : 0;
return array(
'domains_being_blocked' => $domains_being_blocked,
'dns_queries_today' => $dns_queries_today,
'ads_blocked_today' => $ads_blocked_today,
'ads_percentage_today' => $ads_percentage_today,
);
}
function getOverTimeData() {
$log = readInLog();
$dns_queries = getDnsQueries($log);
$ads_blocked = getBlockedQueries($log);
$domains_over_time = overTime($dns_queries);
$ads_over_time = overTime($ads_blocked);
alignTimeArrays($ads_over_time, $domains_over_time);
return Array(
'domains_over_time' => $domains_over_time,
'ads_over_time' => $ads_over_time,
);
}
function getTopItems() {
$log = readInLog();
$dns_queries = getDnsQueries($log);
$ads_blocked = getBlockedQueries($log);
$topAds = topItems($ads_blocked);
$topQueries = topItems($dns_queries, $topAds);
return Array(
'top_queries' => $topQueries,
'top_ads' => $topAds,
);
}
function getRecentItems($qty) {
$log = readInLog();
$dns_queries = getDnsQueries($log);
return Array(
'recent_queries' => getRecent($dns_queries, $qty)
);
}
function getIpvType() {
$log = readInLog();
$dns_queries = getDnsQueries($log);
$queryTypes = array();
foreach($dns_queries as $query) {
$info = trim(explode(": ", $query)[1]);
$queryType = explode(" ", $info)[0];
if (isset($queryTypes[$queryType])) {
$queryTypes[$queryType]++;
}
else {
$queryTypes[$queryType] = 1;
}
}
return $queryTypes;
}
function getForwardDestinations() {
$log = readInLog();
$forwards = getForwards($log);
$destinations = array();
foreach ($forwards as $forward) {
$exploded = explode(" ", trim($forward));
$dest = $exploded[count($exploded) - 1];
if (isset($destinations[$dest])) {
$destinations[$dest]++;
}
else {
$destinations[$dest] = 0;
}
}
return $destinations;
}
function getQuerySources() {
$log = readInLog();
$dns_queries = getDnsQueries($log);
$sources = array();
foreach($dns_queries as $query) {
$exploded = explode(" ", $query);
$ip = hasHostName(trim($exploded[count($exploded)-1]));
if (isset($sources[$ip])) {
$sources[$ip]++;
}
else {
$sources[$ip] = 1;
}
}
arsort($sources);
$sources = array_slice($sources, 0, 10);
return Array(
'top_sources' => $sources
);
}
function getAllQueries() {
$allQueries = array("data" => array());
$log = readInLog();
$dns_queries = getDnsQueriesAll($log);
$hostname = trim(file_get_contents("/etc/hostname"), "\x00..\x1F");
foreach ($dns_queries as $query) {
$time = exec("date --date='" . trim(substr($query, 0, 16)) . "' +'%Y-%m-%d\%Z%H:%M:%S'");
$exploded = explode(" ", trim($query));
$tmp = $exploded[count($exploded)-4];
$status = "";
if (substr($tmp, 0, 5) == "query"){
$type = substr($exploded[count($exploded)-4], 6, -1);
$domain = $exploded[count($exploded)-3];
$client = $exploded[count($exploded)-1];
}
elseif (substr($tmp, 0, 9) == "forwarded" || $exploded[count($exploded)-3] == "pi.hole" || $exploded[count($exploded)-3] == $hostname){
$status="OK";
}
elseif (substr($tmp, strlen($tmp) - 12, 12) == "gravity.list" && $exploded[count($exploded)-5] != "read"){
$status="Pi-holed";
}
if ( $status != ""){
array_push($allQueries['data'], array(
$time,
$type,
$domain,
hasHostName($client),
$status,
));
}
}
return $allQueries;
}
/******** Private Members ********/
function gravityCount() {
//returns count of domains in blocklist.
$gravity="/etc/pihole/gravity.list";
$swallowed = 0;
$NGC4889 = fopen($gravity, "r");
while ($stars = fread($NGC4889, 1024000)) {
$swallowed += substr_count($stars, "\n");
}
fclose($NGC4889);
return $swallowed;
}
function readInLog() {
global $log;
return count($log) > 1 ? $log :
file("/var/log/pihole.log");
}
function getDnsQueries($log) {
return array_filter($log, "findQueries");
}
function getDnsQueriesAll($log) {
return array_filter($log, "findQueriesAll");
}
function getBlockedQueries($log) {
return array_filter($log, "findAds");
}
function getForwards($log) {
return array_filter($log, "findForwards");
}
function topItems($queries, $exclude = array(), $qty=10) {
$splitQueries = array();
foreach ($queries as $query) {
$exploded = explode(" ", $query);
$domain = trim($exploded[count($exploded) - 3]);
if (!isset($exclude[$domain])) {
if (isset($splitQueries[$domain])) {
$splitQueries[$domain]++;
}
else {
$splitQueries[$domain] = 1;
}
}
}
arsort($splitQueries);
return array_slice($splitQueries, 0, $qty);
}
function overTime($entries) {
$byTime = array();
foreach ($entries as $entry) {
$hour = trim(exec("date --date='" . trim(substr($entry, 0, 16)) . "' +'%k'"));
if (isset($byTime[$hour])) {
$byTime[$hour]++;
}
else {
$byTime[$hour] = 1;
}
}
return $byTime;
}
function alignTimeArrays(&$times1, &$times2) {
$max = max(array(max(array_keys($times1)), max(array_keys($times2))));
$min = min(array(min(array_keys($times1)), min(array_keys($times2))));
for ($i = $min; $i <= $max; $i++) {
if (!isset($times2[$i])) {
$times2[$i] = 0;
}
if (!isset($times1[$i])) {
$times1[$i] = 0;
}
}
ksort($times1);
ksort($times2);
}
function getRecent($queries, $qty){
$recent = array();
foreach (array_slice($queries, -$qty) as $query) {
$queryArray = array();
$exploded = explode(" ", $query);
$queryArray['time'] = strtolower(exec("date --date='" . trim(substr($query, 0, 16)) . "' +'%I:%M:%S %p'"));
$queryArray['domain'] = trim($exploded[count($exploded) - 3]);
$queryArray['ip'] = trim($exploded[count($exploded)-1]);
array_push($recent, $queryArray);
}
return array_reverse($recent);
}
function findQueriesAll($var) {
return strpos($var, ": query[") || strpos($var, "gravity.list") || strpos($var, ": forwarded") !== false;
}
function findQueries($var) {
return strpos($var, ": query[") !== false;
}
function findAds($var) {
$var = preg_replace('/ {2,}/', ' ', $var);
$exploded = explode(" ", $var);
if(count($exploded) == 8) {
$tmp = $exploded[count($exploded) - 4];
$tmp2 = $exploded[count($exploded) - 5];
$tmp3 = $exploded[count($exploded) - 3];
$hostname = trim(file_get_contents("/etc/hostname"), "\x00..\x1F");
//filter out bad names and host file reloads:
return (substr($tmp, strlen($tmp) - 12, 12) == "gravity.list" && $tmp2 != "read" && $tmp3 != "pi.hole" && $tmp3 != $hostname);
}
else{
return false;
}
}
function findForwards($var) {
return strpos($var, ": forwarded") !== false;
}
function hasHostName($var){
global $hosts;
foreach ($hosts as $host){
$x = preg_split('/\s+/', $host);
if ( $var == $x[0] ){
$var = $x[1] . "($var)";
}
}
return $var;
}
?>