diff --git a/network.php b/network.php
index 1a21cc87..4dc66cce 100644
--- a/network.php
+++ b/network.php
@@ -25,6 +25,7 @@
+ | ID |
IP address |
Hardware address |
Interface |
@@ -33,10 +34,12 @@
Last Query |
Number of queries |
Uses Pi-hole |
+ Action |
+ | ID |
IP address |
Hardware address |
Interface |
@@ -45,6 +48,7 @@
Last Query |
Number of queries |
Uses Pi-hole |
+ Action |
diff --git a/scripts/pi-hole/js/network.js b/scripts/pi-hole/js/network.js
index 53c6bdac..f68b16b3 100644
--- a/scripts/pi-hole/js/network.js
+++ b/scripts/pi-hole/js/network.js
@@ -8,6 +8,7 @@
/* global utils:false */
var tableApi;
+var token = $("#token").text();
var API_STRING = "api_db.php?network";
@@ -59,6 +60,49 @@ function parseColor(input) {
}
}
+function deleteNetworkEntry() {
+ var tr = $(this).closest("tr");
+ var id = tr.attr("data-id");
+
+ utils.disableAll();
+ utils.showAlert("info", "", "Deleting network table entry with ID " + parseInt(id, 10), "...");
+ $.ajax({
+ url: "scripts/pi-hole/php/network.php",
+ method: "post",
+ dataType: "json",
+ data: { action: "delete_network_entry", id: id, token: token },
+ success: function (response) {
+ utils.enableAll();
+ if (response.success) {
+ utils.showAlert(
+ "success",
+ "far fa-trash-alt",
+ "Successfully deleted network table entry # ",
+ id
+ );
+ tableApi.row(tr).remove().draw(false).ajax.reload(null, false);
+ } else {
+ utils.showAlert(
+ "error",
+ "",
+ "Error while network table entry with ID " + id,
+ response.message
+ );
+ }
+ },
+ error: function (jqXHR, exception) {
+ utils.enableAll();
+ utils.showAlert(
+ "error",
+ "",
+ "Error while deleting network table entry with ID " + id,
+ jqXHR.responseText
+ );
+ console.log(exception); // eslint-disable-line no-console
+ },
+ });
+}
+
$(function () {
tableApi = $("#network-entries").DataTable({
rowCallback: function (row, data) {
@@ -170,6 +214,16 @@ $(function () {
if (data.hwaddr.startsWith("ip-")) {
$("td:eq(1)", row).text("N/A");
}
+
+ // Add delete button
+ $(row).attr("data-id", data.id);
+ var button =
+ '";
+ $("td:eq(8)", row).html(button);
},
dom:
"<'row'<'col-sm-12'f>>" +
@@ -179,8 +233,9 @@ $(function () {
ajax: { url: API_STRING, error: handleAjaxError, dataSrc: "network" },
autoWidth: false,
processing: true,
- order: [[5, "desc"]],
+ order: [[6, "desc"]],
columns: [
+ { data: "id", visible: false },
{ data: "ip", type: "ip-address", width: "10%", render: $.fn.dataTable.render.text() },
{ data: "hwaddr", width: "10%", render: $.fn.dataTable.render.text() },
{ data: "interface", width: "4%", render: $.fn.dataTable.render.text() },
@@ -209,7 +264,13 @@ $(function () {
},
{ data: "numQueries", width: "9%", render: $.fn.dataTable.render.text() },
{ data: "", width: "6%", orderable: false },
+ { data: "", width: "6%", orderable: false },
],
+ drawCallback: function () {
+ $('button[id^="deleteNetworkEntry_"]').on("click", deleteNetworkEntry);
+ // Remove visible dropdown to prevent orphaning
+ $("body > .bootstrap-select.dropdown").remove();
+ },
lengthMenu: [
[10, 25, 50, 100, -1],
[10, 25, 50, 100, "All"],
@@ -223,7 +284,7 @@ $(function () {
},
columnDefs: [
{
- targets: -1,
+ targets: [-1, -2],
data: null,
defaultContent: "",
},
diff --git a/scripts/pi-hole/php/network.php b/scripts/pi-hole/php/network.php
new file mode 100644
index 00000000..4709d283
--- /dev/null
+++ b/scripts/pi-hole/php/network.php
@@ -0,0 +1,82 @@
+
+ true, 'message' => $message));
+}
+
+function JSON_error($message = null)
+{
+ header('Content-type: application/json');
+ $response = array('success' => false, 'message' => $message);
+ if (isset($_POST['action'])) {
+ array_push($response, array('action' => $_POST['action']));
+ }
+ echo json_encode($response);
+}
+
+if ($_POST['action'] == 'delete_network_entry' && isset($_POST['id'])) {
+// Delete netwwork and network_addresses table entry identified by ID
+ try {
+
+ $stmt = $db->prepare('DELETE FROM network_addresses WHERE network_id=:id');
+ if (!$stmt) {
+ throw new Exception('While preparing message statement: ' . $db->lastErrorMsg());
+ }
+
+ if (!$stmt->bindValue(':id', intval($_POST['id']), SQLITE3_INTEGER)) {
+ throw new Exception('While binding id to message statement: ' . $db->lastErrorMsg());
+ }
+
+ if (!$stmt->execute()) {
+ throw new Exception('While executing message statement: ' . $db->lastErrorMsg());
+ }
+
+ $stmt = $db->prepare('DELETE FROM network WHERE id=:id');
+ if (!$stmt) {
+ throw new Exception('While preparing message statement: ' . $db->lastErrorMsg());
+ }
+
+ if (!$stmt->bindValue(':id', intval($_POST['id']), SQLITE3_INTEGER)) {
+ throw new Exception('While binding id to message statement: ' . $db->lastErrorMsg());
+ }
+
+ if (!$stmt->execute()) {
+ throw new Exception('While executing message statement: ' . $db->lastErrorMsg());
+ }
+
+ $reload = true;
+ JSON_success();
+ } catch (\Exception $ex) {
+ JSON_error($ex->getMessage());
+ }
+} else {
+ log_and_die('Requested action not supported!');
+}