From 4cf7a827137be494678913afc78f6932fabe3c56 Mon Sep 17 00:00:00 2001
From: DL6ER
- -
- ## Long-term statistics to view data over user defined time rangesdiff --git a/api.php b/api.php deleted file mode 100644 index 4caecfecd..000000000 --- a/api.php +++ /dev/null @@ -1,197 +0,0 @@ - 'enabled')); - if (file_exists('../custom_disable_timer')) { - unlink('../custom_disable_timer'); - } -} elseif (isset($_GET['disable']) && $auth) { - if (isset($_GET['auth'])) { - if ($_GET['auth'] !== $pwhash) { - exit('Not authorized!'); - } - } else { - // Skip token validation if explicit auth string is given - check_csrf($_GET['token']); - } - $disable = intval($_GET['disable']); - // intval returns the integer value on success, or 0 on failure - if ($disable > 0) { - $timestamp = time(); - pihole_execute('disable '.$disable.'s'); - file_put_contents('../custom_disable_timer', ($timestamp + $disable) * 1000); - } else { - pihole_execute('disable'); - if (file_exists('../custom_disable_timer')) { - unlink('../custom_disable_timer'); - } - } - $data = array_merge($data, array('status' => 'disabled')); -} elseif (isset($_GET['versions'])) { - // Determine if updates are available for Pi-hole - // using the same script that we use for the footer - // on the dashboard (update notifications are - // suppressed if on development branches) - require 'scripts/pi-hole/php/update_checker.php'; - $updates = array('core_update' => $core_update, - 'web_update' => $web_update, - 'FTL_update' => $FTL_update, ); - $current = array('core_current' => $core_current, - 'web_current' => $web_current, - 'FTL_current' => $FTL_current, ); - $latest = array('core_latest' => $core_latest, - 'web_latest' => $web_latest, - 'FTL_latest' => $FTL_latest, ); - $branches = array('core_branch' => $core_branch, - 'web_branch' => $web_branch, - 'FTL_branch' => $FTL_branch, ); - $data = array_merge($data, $updates); - $data = array_merge($data, $current); - $data = array_merge($data, $latest); - $data = array_merge($data, $branches); -} elseif (isset($_GET['list'])) { - if (!$auth) { - exit('Not authorized!'); - } - - if (!isset($_GET['list'])) { - exit('List has not been specified.'); - } - - switch ($_GET['list']) { - case 'black': - $_POST['type'] = LISTTYPE_BLACKLIST; - - break; - - case 'regex_black': - $_POST['type'] = LISTTYPE_REGEX_BLACKLIST; - - break; - - case 'white': - $_POST['type'] = LISTTYPE_WHITELIST; - - break; - - case 'regex_white': - $_POST['type'] = LISTTYPE_REGEX_WHITELIST; - - break; - - default: - exit('Invalid list [supported: black, regex_black, white, regex_white]'); - } - - if (isset($_GET['add'])) { - // Set POST parameters and invoke script to add domain to list - $_POST['domain'] = $_GET['add']; - $_POST['action'] = 'add_domain'; - require 'scripts/pi-hole/php/groups.php'; - } elseif (isset($_GET['sub'])) { - // Set POST parameters and invoke script to remove domain from list - $_POST['domain'] = $_GET['sub']; - $_POST['action'] = 'delete_domain_string'; - require 'scripts/pi-hole/php/groups.php'; - } else { - // Set POST parameters and invoke script to get all domains - $_POST['action'] = 'get_domains'; - require 'scripts/pi-hole/php/groups.php'; - } - - return; -} elseif (isset($_GET['customdns']) && $auth) { - if (isset($_GET['auth'])) { - if ($_GET['auth'] !== $pwhash) { - exit('Not authorized!'); - } - } else { - // Skip token validation if explicit auth string is given - check_csrf($_GET['token']); - } - - switch ($_GET['action']) { - case 'get': - $data = echoCustomDNSEntries(); - - break; - - case 'add': - $data = addCustomDNSEntry(); - - break; - - case 'delete': - $data = deleteCustomDNSEntry(); - - break; - - default: - exit('Wrong action'); - } -} elseif (isset($_GET['customcname']) && $auth) { - if (isset($_GET['auth'])) { - if ($_GET['auth'] !== $pwhash) { - exit('Not authorized!'); - } - } else { - // Skip token validation if explicit auth string is given - check_csrf($_GET['token']); - } - - switch ($_GET['action']) { - case 'get': - $data = echoCustomCNAMEEntries(); - - break; - - case 'add': - $data = addCustomCNAMEEntry(); - - break; - - case 'delete': - $data = deleteCustomCNAMEEntry(); - - break; - - default: - exit('Wrong action'); - } -} - -// Other API functions -require 'api_FTL.php'; - -header('Content-type: application/json'); -if (isset($_GET['jsonForceObject'])) { - echo json_encode($data, JSON_FORCE_OBJECT); -} else { - echo json_encode($data); -} diff --git a/api_FTL.php b/api_FTL.php deleted file mode 100644 index 7e7fb1fa2..000000000 --- a/api_FTL.php +++ /dev/null @@ -1,437 +0,0 @@ - true); - } else { - if (in_array('status enabled', $return)) { - $data = array_merge($data, array('status' => 'enabled')); - } else { - $data = array_merge($data, array('status' => 'disabled')); - } - } -} - -if ((isset($_GET['summary']) || isset($_GET['summaryRaw']) || !count($_GET)) && $auth) { - require_once 'scripts/pi-hole/php/gravity.php'; - - $return = callFTLAPI('stats'); - if (array_key_exists('FTLnotrunning', $return)) { - $data = array('FTLnotrunning' => true); - } else { - $stats = array(); - foreach ($return as $line) { - $tmp = explode(' ', $line); - - if ($tmp[0] === 'domains_being_blocked' && !is_numeric($tmp[1]) || $tmp[0] === 'status') { - // Expect string response - $stats[$tmp[0]] = $tmp[1]; - } elseif (isset($_GET['summary'])) { - // "summary" expects a formmated string response - if ($tmp[0] !== 'ads_percentage_today') { - $stats[$tmp[0]] = number_format($tmp[1]); - } else { - $stats[$tmp[0]] = number_format($tmp[1], 1, '.', ''); - } - } else { - // Expect float response - $stats[$tmp[0]] = floatval($tmp[1]); - } - } - $stats['gravity_last_updated'] = gravity_last_update(true); - $data = array_merge($data, $stats); - } -} - -if (isset($_GET['getMaxlogage']) && $auth) { - $return = callFTLAPI('maxlogage'); - if (array_key_exists('FTLnotrunning', $return)) { - $data = array('FTLnotrunning' => true); - } else { - // Convert seconds to hours and rounds to one decimal place. - $ret = round(intval($return[0]) / 3600, 1); - // Return 24h if value is 0, empty, null or non numeric. - $ret = $ret ?: 24; - - $data = array_merge($data, array('maxlogage' => $ret)); - } -} - -if (isset($_GET['overTimeData10mins']) && $auth) { - $return = callFTLAPI('overTime'); - if (array_key_exists('FTLnotrunning', $return)) { - $data = array('FTLnotrunning' => true); - } else { - $domains_over_time = array(); - $ads_over_time = array(); - foreach ($return as $line) { - $tmp = explode(' ', $line); - $domains_over_time[intval($tmp[0])] = intval($tmp[1]); - $ads_over_time[intval($tmp[0])] = intval($tmp[2]); - } - - $result = array( - 'domains_over_time' => $domains_over_time, - 'ads_over_time' => $ads_over_time, - ); - - $data = array_merge($data, $result); - } -} - -if (isset($_GET['topItems']) && $auth) { - if ($_GET['topItems'] === 'audit') { - $return = callFTLAPI('top-domains for audit'); - } elseif (is_numeric($_GET['topItems'])) { - $return = callFTLAPI('top-domains ('.$_GET['topItems'].')'); - } else { - $return = callFTLAPI('top-domains'); - } - - if (array_key_exists('FTLnotrunning', $return)) { - $data = array('FTLnotrunning' => true); - } else { - $top_queries = array(); - foreach ($return as $line) { - $tmp = explode(' ', $line); - if (count($tmp) == 2) { - $tmp[2] = ''; - } - $domain = utf8_encode($tmp[2]); - $top_queries[$domain] = intval($tmp[1]); - } - } - - if ($_GET['topItems'] === 'audit') { - $return = callFTLAPI('top-ads for audit'); - } elseif (is_numeric($_GET['topItems'])) { - $return = callFTLAPI('top-ads ('.$_GET['topItems'].')'); - } else { - $return = callFTLAPI('top-ads'); - } - - if (array_key_exists('FTLnotrunning', $return)) { - $data = array('FTLnotrunning' => true); - } else { - $top_ads = array(); - foreach ($return as $line) { - $tmp = explode(' ', $line); - $domain = utf8_encode($tmp[2]); - if (count($tmp) > 3) { - $top_ads[$domain.' ('.$tmp[3].')'] = intval($tmp[1]); - } else { - $top_ads[$domain] = intval($tmp[1]); - } - } - - $result = array( - 'top_queries' => $top_queries, - 'top_ads' => $top_ads, - ); - - $data = array_merge($data, $result); - } -} - -if ((isset($_GET['topClients']) || isset($_GET['getQuerySources'])) && $auth) { - if (isset($_GET['topClients'])) { - $number = $_GET['topClients']; - } elseif (isset($_GET['getQuerySources'])) { - $number = $_GET['getQuerySources']; - } - - if (is_numeric($number)) { - $return = callFTLAPI('top-clients ('.$number.')'); - } else { - $return = callFTLAPI('top-clients'); - } - if (array_key_exists('FTLnotrunning', $return)) { - $data = array('FTLnotrunning' => true); - } else { - $top_clients = array(); - foreach ($return as $line) { - $tmp = explode(' ', $line); - $clientip = utf8_encode($tmp[2]); - if (count($tmp) > 3 && strlen($tmp[3]) > 0) { - $clientname = utf8_encode($tmp[3]); - $top_clients[$clientname.'|'.$clientip] = intval($tmp[1]); - } else { - $top_clients[$clientip] = intval($tmp[1]); - } - } - - $result = array('top_sources' => $top_clients); - $data = array_merge($data, $result); - } -} - -if (isset($_GET['topClientsBlocked']) && $auth) { - if (isset($_GET['topClientsBlocked'])) { - $number = $_GET['topClientsBlocked']; - } - - if (is_numeric($number)) { - $return = callFTLAPI('top-clients blocked ('.$number.')'); - } else { - $return = callFTLAPI('top-clients blocked'); - } - if (array_key_exists('FTLnotrunning', $return)) { - $data = array('FTLnotrunning' => true); - } else { - $top_clients = array(); - foreach ($return as $line) { - $tmp = explode(' ', $line); - $clientip = utf8_encode($tmp[2]); - if (count($tmp) > 3 && strlen($tmp[3]) > 0) { - $clientname = utf8_encode($tmp[3]); - $top_clients[$clientname.'|'.$clientip] = intval($tmp[1]); - } else { - $top_clients[$clientip] = intval($tmp[1]); - } - } - - $result = array('top_sources_blocked' => $top_clients); - $data = array_merge($data, $result); - } -} - -if (isset($_GET['getForwardDestinations']) && $auth) { - if ($_GET['getForwardDestinations'] === 'unsorted') { - $return = callFTLAPI('forward-dest unsorted'); - } else { - $return = callFTLAPI('forward-dest'); - } - if (array_key_exists('FTLnotrunning', $return)) { - $data = array('FTLnotrunning' => true); - } else { - $forward_dest = array(); - foreach ($return as $line) { - $tmp = explode(' ', $line); - $forwardip = utf8_encode($tmp[2]); - if (count($tmp) > 3 && strlen($tmp[3]) > 0) { - $forwardname = utf8_encode($tmp[3]); - $forward_dest[$forwardname.'|'.$forwardip] = floatval($tmp[1]); - } else { - $forward_dest[$forwardip] = floatval($tmp[1]); - } - } - - $result = array('forward_destinations' => $forward_dest); - $data = array_merge($data, $result); - } -} - -if (isset($_GET['getQueryTypes']) && $auth) { - $return = callFTLAPI('querytypes'); - if (array_key_exists('FTLnotrunning', $return)) { - $data = array('FTLnotrunning' => true); - } else { - $querytypes = array(); - foreach ($return as $ret) { - $tmp = explode(': ', $ret); - // Reply cannot contain non-ASCII characters - $querytypes[$tmp[0]] = floatval($tmp[1]); - } - - $result = array('querytypes' => $querytypes); - $data = array_merge($data, $result); - } -} - -if (isset($_GET['getCacheInfo']) && $auth) { - $return = callFTLAPI('cacheinfo'); - if (array_key_exists('FTLnotrunning', $return)) { - $data = array('FTLnotrunning' => true); - } else { - $cacheinfo = array(); - foreach ($return as $ret) { - $tmp = explode(': ', $ret); - // Reply cannot contain non-ASCII characters - $cacheinfo[$tmp[0]] = floatval($tmp[1]); - } - - $result = array('cacheinfo' => $cacheinfo); - $data = array_merge($data, $result); - } -} - -if (isset($_GET['getAllQueries']) && $auth) { - if (isset($_GET['from'], $_GET['until'])) { - // Get limited time interval - $return = callFTLAPI('getallqueries-time '.$_GET['from'].' '.$_GET['until']); - } elseif (isset($_GET['domain'])) { - // Get specific domain only - $return = callFTLAPI('getallqueries-domain '.$_GET['domain']); - } elseif (isset($_GET['client']) && (isset($_GET['type']) && $_GET['type'] === 'blocked')) { - // Get specific client only - $return = callFTLAPI('getallqueries-client-blocked '.$_GET['client']); - } elseif (isset($_GET['client'])) { - // Get specific client only - $return = callFTLAPI('getallqueries-client '.$_GET['client']); - } elseif (isset($_GET['querytype'])) { - // Get specific query type only - $return = callFTLAPI('getallqueries-qtype '.$_GET['querytype']); - } elseif (isset($_GET['forwarddest'])) { - // Get specific forward destination only - $return = callFTLAPI('getallqueries-forward '.$_GET['forwarddest']); - } elseif (is_numeric($_GET['getAllQueries'])) { - $return = callFTLAPI('getallqueries ('.$_GET['getAllQueries'].')'); - } else { - // Get all queries - $return = callFTLAPI('getallqueries'); - } - - if (array_key_exists('FTLnotrunning', $return)) { - $data = array('FTLnotrunning' => true); - } else { - // Set the header - header('Content-type: application/json'); - - // Start the JSON string - echo '{"data":['; - $first = true; - - foreach ($return as $line) { - // Insert a comma before the next record (except on the first one) - if (!$first) { - echo ','; - } else { - $first = false; - } - - $row = str_getcsv($line, ' '); - // UTF-8 encode domain - $domain = utf8_encode(str_replace('~', ' ', $row[2])); - // UTF-8 encode client host name - $client = utf8_encode($row[3]); - - // Insert into array and output it in JSON format - // array: time type domain client status dnssecStatus reply response_time CNAMEDomain regexID upstream destination EDE - echo json_encode(array($row[0], $row[1], $domain, $client, $row[4], $row[5], $row[6], $row[7], $row[8], $row[9], $row[10], $row[11])); - } - // Finish the JSON string - echo ']}'; - // exit at the end - exit; - } -} - -if (isset($_GET['recentBlocked']) && $auth) { - exit(utf8_encode(callFTLAPI('recentBlocked')[0])); - unset($data); -} - -if (isset($_GET['getForwardDestinationNames']) && $auth) { - $return = callFTLAPI('forward-names'); - - if (array_key_exists('FTLnotrunning', $return)) { - $data = array('FTLnotrunning' => true); - } else { - $forward_dest = array(); - foreach ($return as $line) { - $tmp = explode(' ', $line); - $forwardip = utf8_encode($tmp[2]); - if (count($tmp) > 3) { - $forwardname = utf8_encode($tmp[3]); - $forward_dest[$forwardname.'|'.$forwardip] = floatval($tmp[1]); - } else { - $forward_dest[$forwardip] = floatval($tmp[1]); - } - } - - $result = array('forward_destinations' => $forward_dest); - $data = array_merge($data, $result); - } -} - -if (isset($_GET['overTimeDataQueryTypes']) && $auth) { - $return = callFTLAPI('QueryTypesoverTime'); - if (array_key_exists('FTLnotrunning', $return)) { - $data = array('FTLnotrunning' => true); - } else { - $over_time = array(); - foreach ($return as $line) { - $tmp = explode(' ', $line); - for ($i = 0; $i < count($tmp) - 1; ++$i) { - $over_time[intval($tmp[0])][$i] = floatval($tmp[$i + 1]); - } - } - $result = array('over_time' => $over_time); - $data = array_merge($data, $result); - } -} - -if (isset($_GET['getClientNames']) && $auth) { - $return = callFTLAPI('client-names'); - if (array_key_exists('FTLnotrunning', $return)) { - $data = array('FTLnotrunning' => true); - } else { - $client_names = array(); - foreach ($return as $line) { - $tmp = explode(' ', $line); - $client_names[] = array( - 'name' => utf8_encode($tmp[0]), - 'ip' => utf8_encode($tmp[1]), - ); - } - - $result = array('clients' => $client_names); - $data = array_merge($data, $result); - } -} - -if (isset($_GET['overTimeDataClients']) && $auth) { - $return = callFTLAPI('ClientsoverTime'); - - if (array_key_exists('FTLnotrunning', $return)) { - $data = array('FTLnotrunning' => true); - } else { - $over_time = array(); - foreach ($return as $line) { - $tmp = explode(' ', $line); - for ($i = 0; $i < count($tmp) - 1; ++$i) { - $over_time[intval($tmp[0])][$i] = floatval($tmp[$i + 1]); - } - } - $result = array('over_time' => $over_time); - $data = array_merge($data, $result); - } -} - -if (isset($_GET['delete_lease']) && $auth) { - $return = callFTLAPI('delete-lease '.$_GET['delete_lease']); - if (array_key_exists('FTLnotrunning', $return)) { - $data = array('FTLnotrunning' => true); - } else { - $data['delete_lease'] = $return[0]; - } -} - -if (isset($_GET['dns-port']) && $auth) { - $return = callFTLAPI('dns-port'); - if (array_key_exists('FTLnotrunning', $return)) { - $data = array('FTLnotrunning' => true); - } else { - $data['dns-port'] = $return[0]; - } -} diff --git a/api_db.php b/api_db.php deleted file mode 100644 index f060d47bb..000000000 --- a/api_db.php +++ /dev/null @@ -1,423 +0,0 @@ -query('SELECT * FROM network'); - - while ($results !== false && $res = $results->fetchArray(SQLITE3_ASSOC)) { - $id = intval($res['id']); - - // Get IP addresses and host names for this device - $res['ip'] = array(); - $res['name'] = array(); - $network_addresses = $db->query("SELECT ip,name FROM network_addresses WHERE network_id = {$id} ORDER BY lastSeen DESC"); - while ($network_addresses !== false && $network_address = $network_addresses->fetchArray(SQLITE3_ASSOC)) { - array_push($res['ip'], $network_address['ip']); - if ($network_address['name'] !== null) { - array_push($res['name'], utf8_encode($network_address['name'])); - } else { - array_push($res['name'], ''); - } - } - $network_addresses->finalize(); - - // UTF-8 encode vendor - $res['macVendor'] = utf8_encode($res['macVendor']); - array_push($network, $res); - } - $results->finalize(); - - $data = array_merge($data, array('network' => $network)); -} - -if (isset($_GET['getAllQueries']) && $auth) { - $allQueries = array(); - if ($_GET['getAllQueries'] !== 'empty') { - $from = intval($_GET['from']); - $until = intval($_GET['until']); - - // Use table "query_storage" - // - replace domain ID with domain - // - replace client ID with client name - // - replace forward ID with forward destination - $dbquery = 'SELECT timestamp, type,'; - $dbquery .= " CASE typeof(domain) WHEN 'integer' THEN (SELECT domain FROM domain_by_id d WHERE d.id = q.domain) ELSE domain END domain,"; - $dbquery .= " CASE typeof(client) WHEN 'integer' THEN ("; - $dbquery .= " SELECT CASE TRIM(name) WHEN '' THEN c.ip ELSE c.name END name FROM client_by_id c WHERE c.id = q.client"; - $dbquery .= ' ) ELSE client END client,'; - $dbquery .= " CASE typeof(forward) WHEN 'integer' THEN (SELECT forward FROM forward_by_id f WHERE f.id = q.forward) ELSE forward END forward,"; - $dbquery .= ' status, reply_type, reply_time, dnssec'; - $dbquery .= ' FROM query_storage q'; - $dbquery .= ' WHERE timestamp >= :from AND timestamp <= :until '; - if (isset($_GET['status'])) { - // if some query status should be excluded - $excludedStatus = $_GET['status']; - if (preg_match('/^[0-9]+(?:,[0-9]+)*$/', $excludedStatus) === 1) { - // Append selector to DB query. The used regex ensures - // that only numbers, separated by commas are accepted - // to avoid code injection and other malicious things - // We accept only valid lists like "1,2,3" - // We reject ",2,3", "1,2," and similar arguments - $dbquery .= 'AND status NOT IN ('.$excludedStatus.') '; - } else { - exit('Error. Selector status specified using an invalid format.'); - } - } - $dbquery .= 'ORDER BY timestamp ASC'; - $stmt = $db->prepare($dbquery); - $stmt->bindValue(':from', intval($from), SQLITE3_INTEGER); - $stmt->bindValue(':until', intval($until), SQLITE3_INTEGER); - $results = $stmt->execute(); - - // Start the JSON string - echo '{"data":['; - - if (!is_bool($results)) { - $first = true; - while ($row = $results->fetchArray(SQLITE3_ASSOC)) { - // Insert a comma before the next record (except on the first one) - if (!$first) { - echo ','; - } else { - $first = false; - } - - // Format, encode, transform each field (if necessary). - $time = $row['timestamp']; - $query_type = getQueryTypeStr($row['type']); // Convert query type ID to name - $domain = utf8_encode(str_replace('~', ' ', $row['domain'])); - $client = $row['client']; - $status = $row['status']; - $destination = utf8_encode($row['forward']); - $reply_type = $row['reply_type']; - $reply_time = $row['reply_time']; - $dnssec = $row['dnssec']; - - // Insert into array and output it in JSON format - echo json_encode(array($time, $query_type, $domain, $client, $status, $destination, $reply_type, $reply_time, $dnssec)); - } - } - - // Finish the JSON string - echo ']}'; - - // exit at the end - exit; - } - // only used if getAllQueries==empty - $result = array('data' => $allQueries); - $data = array_merge($data, $result); -} - -if (isset($_GET['topClients']) && $auth) { - // $from = intval($_GET["from"]); - $limit = ''; - if (isset($_GET['from'], $_GET['until'])) { - $limit = 'WHERE timestamp >= :from AND timestamp <= :until'; - } elseif (isset($_GET['from']) && !isset($_GET['until'])) { - $limit = 'WHERE timestamp >= :from'; - } elseif (!isset($_GET['from']) && isset($_GET['until'])) { - $limit = 'WHERE timestamp <= :until'; - } - $dbquery = "SELECT CASE typeof(client) WHEN 'integer' THEN ("; - $dbquery .= " SELECT CASE TRIM(name) WHEN '' THEN c.ip ELSE c.name END name FROM client_by_id c WHERE c.id = q.client)"; - $dbquery .= ' ELSE client END client, count(client) FROM query_storage q '.$limit.' GROUP BY client ORDER BY count(client) DESC LIMIT 20'; - - $stmt = $db->prepare($dbquery); - $stmt->bindValue(':from', intval($_GET['from']), SQLITE3_INTEGER); - $stmt->bindValue(':until', intval($_GET['until']), SQLITE3_INTEGER); - $results = $stmt->execute(); - - $clientnums = array(); - - if (!is_bool($results)) { - while ($row = $results->fetchArray()) { - // $row[0] is the client IP - - if (array_key_exists($row[0], $clientnums)) { - // Entry already exists, add to it (might appear multiple times due to mixed capitalization in the database) - $clientnums[$row[0]] += intval($row[1]); - } else { - // Entry does not yet exist - $clientnums[$row[0]] = intval($row[1]); - } - } - } - - // Sort by number of hits - arsort($clientnums); - - // Extract only the first ten entries - $clientnums = array_slice($clientnums, 0, 10); - - $result = array('top_sources' => $clientnums); - $data = array_merge($data, $result); -} - -if (isset($_GET['topDomains']) && $auth) { - $limit = ''; - - if (isset($_GET['from'], $_GET['until'])) { - $limit = ' AND timestamp >= :from AND timestamp <= :until'; - } elseif (isset($_GET['from']) && !isset($_GET['until'])) { - $limit = ' AND timestamp >= :from'; - } elseif (!isset($_GET['from']) && isset($_GET['until'])) { - $limit = ' AND timestamp <= :until'; - } - // Select top permitted domains only - $stmt = $db->prepare('SELECT domain,count(domain) FROM queries WHERE status IN (2,3,12,13,14,17)'.$limit.' GROUP by domain order by count(domain) desc limit 20'); - $stmt->bindValue(':from', intval($_GET['from']), SQLITE3_INTEGER); - $stmt->bindValue(':until', intval($_GET['until']), SQLITE3_INTEGER); - $results = $stmt->execute(); - - $domains = array(); - - if (!is_bool($results)) { - while ($row = $results->fetchArray()) { - // Convert domain to lower case UTF-8 - $c = utf8_encode(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]); - } - } - } - - // 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); -} - -if (isset($_GET['topAds']) && $auth) { - $limit = ''; - - if (isset($_GET['from'], $_GET['until'])) { - $limit = ' AND timestamp >= :from AND timestamp <= :until'; - } elseif (isset($_GET['from']) && !isset($_GET['until'])) { - $limit = ' AND timestamp >= :from'; - } elseif (!isset($_GET['from']) && isset($_GET['until'])) { - $limit = ' AND timestamp <= :until'; - } - $stmt = $db->prepare('SELECT domain,count(domain) FROM queries WHERE status IN (1,4,5,6,7,8,9,10,11)'.$limit.' GROUP by domain order by count(domain) desc limit 10'); - $stmt->bindValue(':from', intval($_GET['from']), SQLITE3_INTEGER); - $stmt->bindValue(':until', intval($_GET['until']), SQLITE3_INTEGER); - $results = $stmt->execute(); - - $addomains = array(); - - if (!is_bool($results)) { - while ($row = $results->fetchArray()) { - $addomains[utf8_encode($row[0])] = intval($row[1]); - } - } - $result = array('top_ads' => $addomains); - $data = array_merge($data, $result); -} - -if (isset($_GET['getMinTimestamp']) && $auth) { - $results = $db->query('SELECT MIN(timestamp) FROM queries'); - - 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'); - - 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'); - - if (!is_bool($results)) { - $result = array('count' => $results->fetchArray()[0]); - } else { - $result = array(); - } - - $data = array_merge($data, $result); -} - -if (isset($_GET['getDBfilesize']) && $auth) { - $filesize = filesize('/etc/pihole/pihole-FTL.db'); - $result = array('filesize' => $filesize); - $data = array_merge($data, $result); -} - -if (isset($_GET['getGraphData']) && $auth) { - $limit = ''; - - if (isset($_GET['from'], $_GET['until'])) { - $limit = 'timestamp >= :from AND timestamp <= :until'; - } elseif (isset($_GET['from']) && !isset($_GET['until'])) { - $limit = 'timestamp >= :from'; - } elseif (!isset($_GET['from']) && isset($_GET['until'])) { - $limit = 'timestamp <= :until'; - } - - $interval = 600; - - if (isset($_GET['interval'])) { - $q = intval($_GET['interval']); - if ($q >= 10) { - $interval = $q; - } - } - - // Round $from and $until to match the requested $interval - $from = intval((intval($_GET['from']) / $interval) * $interval); - $until = intval((intval($_GET['until']) / $interval) * $interval); - - // Count domains and blocked queries using the same intervals - $sqlcommand = " - SELECT - (timestamp / :interval) * :interval AS interval, - SUM(CASE - WHEN status !=0 THEN 1 - ELSE 0 - END) AS domains, - SUM(CASE - WHEN status IN (1,4,5,6,7,8,9,10,11,15,16) THEN 1 - ELSE 0 - END) AS blocked - FROM queries - WHERE $limit - GROUP BY interval - ORDER BY interval"; - - $stmt = $db->prepare($sqlcommand); - $stmt->bindValue(':from', $from, SQLITE3_INTEGER); - $stmt->bindValue(':until', $until, SQLITE3_INTEGER); - $stmt->bindValue(':interval', $interval, SQLITE3_INTEGER); - $results = $stmt->execute(); - - // Parse the DB result into graph data, filling in missing interval sections with zero - function parseDBData($results, $interval, $from, $until) - { - $domains = array(); - $blocked = array(); - $first_db_timestamp = -1; - - if (!is_bool($results)) { - // Read in the data - while ($row = $results->fetchArray()) { - $domains[$row['interval']] = intval($row['domains']); - $blocked[$row['interval']] = intval($row['blocked']); - if ($first_db_timestamp === -1) { - $first_db_timestamp = intval($row[0]); - } - } - } - - // It is unpredictable what the first timestamp returned by the database will be. - // This depends on live data. The bar graph can handle "gaps", but the Area graph can't. - // Hence, we filling the "missing" timeslots with 0 to avoid wrong graphic render. - // (https://github.com/pi-hole/AdminLTE/pull/2374#issuecomment-1261865428) - $aligned_from = $from + (($first_db_timestamp - $from) % $interval); - - // Fill gaps in returned data - for ($i = $aligned_from; $i < $until; $i += $interval) { - if (!array_key_exists($i, $domains)) { - $domains[$i] = 0; - $blocked[$i] = 0; - } - } - - return array('domains_over_time' => $domains, 'ads_over_time' => $blocked); - } - - $over_time = parseDBData($results, $interval, $from, $until); - $data = array_merge($data, $over_time); -} - -if (isset($_GET['status']) && $auth) { - $extra = ';'; - if (isset($_GET['ignore']) && $_GET['ignore'] === 'DNSMASQ_WARN') { - $extra = "WHERE type != 'DNSMASQ_WARN';"; - } - $results = $db->query('SELECT COUNT(*) FROM message '.$extra); - - if (!is_bool($results)) { - $result = array('message_count' => $results->fetchArray()[0]); - } else { - $result = array(); - } - - $data = array_merge($data, $result); -} - -if (isset($_GET['messages']) && $auth) { - $extra = ';'; - if (isset($_GET['ignore']) && $_GET['ignore'] === 'DNSMASQ_WARN') { - $extra = "WHERE type != 'DNSMASQ_WARN';"; - } - - $messages = array(); - $results = $db->query('SELECT * FROM message '.$extra); - - while ($results !== false && $res = $results->fetchArray(SQLITE3_ASSOC)) { - // Convert string to to UTF-8 encoding to ensure php-json can handle it. - // Furthermore, convert special characters to HTML entities to prevent XSS attacks. - foreach ($res as $key => $value) { - if (is_string($value)) { - $res[$key] = htmlspecialchars(utf8_encode($value)); - } - } - array_push($messages, $res); - } - - $data = array_merge($data, array('messages' => $messages)); -} - -if (isset($_GET['jsonForceObject'])) { - echo json_encode($data, JSON_FORCE_OBJECT); -} else { - echo json_encode($data); -} diff --git a/auditlog.php b/auditlog.php deleted file mode 100644 index 3c311ac60..000000000 --- a/auditlog.php +++ /dev/null @@ -1,86 +0,0 @@ - - - -
Domain | -Hits | -Actions | -
---|
Domain | -Hits | -Actions | -
---|