From 3e1a1f59aac82ef2966e08cb21e80f2ac3372efb Mon Sep 17 00:00:00 2001 From: DL6ER Date: Thu, 14 May 2020 18:32:10 +0200 Subject: [PATCH] Add support for multiple hostnames per client (hardware address). Signed-off-by: DL6ER --- api_db.php | 16 +++++++++++----- scripts/pi-hole/js/network.js | 18 ++++++++++++++++++ scripts/pi-hole/php/groups.php | 12 +++++++++--- 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/api_db.php b/api_db.php index 99358589..bcb9aa00 100644 --- a/api_db.php +++ b/api_db.php @@ -62,15 +62,21 @@ if(isset($_GET["network"]) && $auth) while($results !== false && $res = $results->fetchArray(SQLITE3_ASSOC)) { - $id = $res["id"]; - // Empty array for holding the IP addresses - $res["ip"] = array(); + $id = intval($res["id"]); + // Get IP addresses for this device + $res["ip"] = array(); $network_addresses = $db->query("SELECT ip FROM network_addresses WHERE network_id = $id ORDER BY lastSeen DESC"); while($network_addresses !== false && $ip = $network_addresses->fetchArray(SQLITE3_ASSOC)) array_push($res["ip"],$ip["ip"]); - // UTF-8 encode host name and vendor - $res["name"] = utf8_encode($res["name"]); + + // Get list of host names for this device + $res["name"] = array(); + $network_names = $db->query("SELECT name FROM network_names WHERE network_id = $id ORDER BY lastSeen DESC"); + while($network_names !== false && $ip = $network_names->fetchArray(SQLITE3_ASSOC)) + array_push($res["name"],utf8_encode($ip["name"])); + + // UTF-8 encode vendor $res["macVendor"] = utf8_encode($res["macVendor"]); array_push($network, $res); } diff --git a/scripts/pi-hole/js/network.js b/scripts/pi-hole/js/network.js index 6925733b..9eaf733b 100644 --- a/scripts/pi-hole/js/network.js +++ b/scripts/pi-hole/js/network.js @@ -108,8 +108,26 @@ $(document).ready(function () { // Set hostname to "unknown" if not available if (!data.name || data.name.length === 0) { $("td:eq(3)", row).html("unknown"); + } else { + var names = []; + var maxiter = Math.min(data.name.length, MAXIPDISPLAY); + for (var index = 0; index < maxiter; index++) { + var name = data.name[index]; + names.push('' + name + ""); + } + + if (data.name.length > MAXIPDISPLAY) { + // We hit the maximum above, add "..." to symbolize we would + // have more to show here + names.push("..."); + } + $("td:eq(3)", row).html(names.join("
")); + $("td:eq(3)", row).hover(function () { + this.title = data.name.join("\n"); + }); } + // Set number of queries to localized string (add thousand separators) $("td:eq(6)", row).html(data.numQueries.toLocaleString()); diff --git a/scripts/pi-hole/php/groups.php b/scripts/pi-hole/php/groups.php index 3e818b0c..c26e0bc3 100644 --- a/scripts/pi-hole/php/groups.php +++ b/scripts/pi-hole/php/groups.php @@ -172,7 +172,7 @@ if ($_POST['action'] == 'get_groups') { throw new Exception('Error while querying gravity\'s client_by_group table: ' . $db->lastErrorMsg()); } - $stmt = $FTLdb->prepare('SELECT name FROM network WHERE id = (SELECT network_id FROM network_addresses WHERE ip = :ip);'); + $stmt = $FTLdb->prepare('SELECT name FROM network_names WHERE network_id = (SELECT network_id FROM network_addresses WHERE ip = :ip);'); if (!$stmt) { throw new Exception('Error while preparing network table statement: ' . $db->lastErrorMsg()); } @@ -208,7 +208,7 @@ if ($_POST['action'] == 'get_groups') { $QUERYDB = getQueriesDBFilename(); $FTLdb = SQLite3_connect($QUERYDB); - $query = $FTLdb->query('SELECT DISTINCT hwaddr,name FROM network;'); + $query = $FTLdb->query('SELECT DISTINCT id,hwaddr FROM network;'); if (!$query) { throw new Exception('Error while querying FTL\'s database: ' . $db->lastErrorMsg()); } @@ -216,7 +216,13 @@ if ($_POST['action'] == 'get_groups') { // Loop over results $ips = array(); while ($res = $query->fetchArray(SQLITE3_ASSOC)) { - $ips[strtoupper($res['hwaddr'])] = $res['name'] !== null ? $res['name'] : ''; + $id = intval($res["id"]); + $query_names = $FTLdb->query("SELECT name FROM network_names WHERE network_id = $id ORDER BY lastSeen DESC;"); + $names = []; + while ($res_names = $query_names->fetchArray(SQLITE3_ASSOC)) { + array_push($names, utf8_encode($res_names["name"])); + } + $ips[strtoupper($res['hwaddr'])] = implode(",", $names); } $FTLdb->close();