From 09325608f85894186f964aa1f52781f16a61efd2 Mon Sep 17 00:00:00 2001 From: jokob-sk Date: Sun, 11 Jan 2026 11:24:12 +1100 Subject: [PATCH] FE: legacy code cleanup Signed-off-by: jokob-sk --- docs/DEVICES_BULK_EDITING.md | 2 +- front/js/tests.js | 28 -- front/php/server/dbHelper.php | 310 ------------------ front/php/server/devices.php | 442 -------------------------- front/php/server/init.php | 1 - front/php/server/utilNotification.php | 209 ------------ 6 files changed, 1 insertion(+), 991 deletions(-) delete mode 100755 front/php/server/dbHelper.php delete mode 100755 front/php/server/devices.php delete mode 100755 front/php/server/utilNotification.php diff --git a/docs/DEVICES_BULK_EDITING.md b/docs/DEVICES_BULK_EDITING.md index 0e14081d..a0893d13 100755 --- a/docs/DEVICES_BULK_EDITING.md +++ b/docs/DEVICES_BULK_EDITING.md @@ -26,7 +26,7 @@ The database and device structure may change with new releases. When using the C ![Maintenance > CSV Export](./img/DEVICES_BULK_EDITING/MAINTENANCE_CSV_EXPORT.png) > [!NOTE] -> The file containing a list of Devices including the Network relationships between Network Nodes and connected devices. You can also trigger this by acessing this URL: `:20211/php/server/devices.php?action=ExportCSV` or via the `CSV Backup` plugin. (💡 You can schedule this) +> The file containing a list of Devices including the Network relationships between Network Nodes and connected devices. You can also trigger this with the `CSV Backup` plugin. (💡 You can schedule this) ![Settings > CSV Backup](./img/DEVICES_BULK_EDITING/CSV_BACKUP_SETTINGS.png) diff --git a/front/js/tests.js b/front/js/tests.js index 01840fd5..87c0449a 100755 --- a/front/js/tests.js +++ b/front/js/tests.js @@ -1,31 +1,3 @@ -// -------------------------------------------------- -// Check if database is locked -function lockDatabase(delay=20) { - $.ajax({ - url: 'php/server/dbHelper.php', // Replace with the actual path to your PHP file - type: 'GET', - data: { action: 'lockDatabase', delay: delay }, - success: function(response) { - console.log('Executed'); - }, - error: function() { - console.log('Error ocurred'); - } - }); - - let times = delay; - let countdownInterval = setInterval(() => { - times--; - console.log(`Remaining time: ${times} seconds`); - - if (times <= 0) { - clearInterval(countdownInterval); - console.log('Countdown finished'); - } - }, 5000); -} - - const requiredFiles = [ 'app_state.json', 'plugins.json', diff --git a/front/php/server/dbHelper.php b/front/php/server/dbHelper.php deleted file mode 100755 index d5eff96c..00000000 --- a/front/php/server/dbHelper.php +++ /dev/null @@ -1,310 +0,0 @@ -query($sql); - - // Check if the query executed successfully - if (! $result == TRUE) { - // Output an error message if the query failed - echo "Error reading data\n\n " .$sql." \n\n". $db->lastErrorMsg(); - return; - } else - { - // Output $result - // Fetching rows from the result object and storing them in an array - $rows = array(); - while ($row = $result->fetchArray(SQLITE3_ASSOC)) { - $rows[] = $row; - } - - // Converting the array to JSON - $json = json_encode($rows); - - // Outputting the JSON - echo $json; - - return; - } -} - -//------------------------------------------------------------------------------ -// write -//------------------------------------------------------------------------------ -function write($rawSql) { - global $db; - - // Construct the SQL query to select values - $sql = $rawSql; - - // Execute the SQL query - $result = $db->query($sql); - - // Check if the query executed successfully - if (! $result == TRUE) { - // Output an error message if the query failed - echo "Error writing data\n\n " .$sql." \n\n". $db->lastErrorMsg(); - return; - } else - { - // Output - echo "OK"; - return; - } -} - - -//------------------------------------------------------------------------------ -// update -//------------------------------------------------------------------------------ -function update($columnName, $id, $defaultValue, $expireMinutes, $dbtable, $columns, $values) { - - global $db; - - // Handle one or multiple columns - if(strpos($columns, ',') !== false) { - $columnsArr = explode(",", $columns); - } else { - $columnsArr = array($columns); - } - - // Handle one or multiple values - if(strpos($values, ',') !== false) { - $valuesArr = explode(",", $values); - } else { - $valuesArr = array($values); - } - - // Handle one or multiple IDs - if(strpos($id, ',') !== false) { - $idsArr = explode(",", $id); - $idsPlaceholder = rtrim(str_repeat('?,', count($idsArr)), ','); - } else { - $idsArr = array($id); - $idsPlaceholder = '?'; - } - - // Build column-value pairs string - $columnValues = ''; - foreach($columnsArr as $column) { - $columnValues .= '"' . $column . '" = ?,'; - } - // Remove trailing comma - $columnValues = rtrim($columnValues, ','); - - // Construct the SQL query - $sql = 'UPDATE ' . $dbtable . ' SET ' . $columnValues . ' WHERE ' . $columnName . ' IN (' . $idsPlaceholder . ')'; - - // Prepare the statement - $stmt = $db->prepare($sql); - - // Check for errors - if(!$stmt) { - echo "Error preparing statement: " . $db->lastErrorMsg(); - return; - } - - // Bind the parameters - $paramTypes = str_repeat('s', count($columnsArr)); - foreach($valuesArr as $i => $value) { - $stmt->bindValue($i + 1, $value); - } - foreach($idsArr as $i => $idValue) { - $stmt->bindValue(count($valuesArr) + $i + 1, $idValue); - } - - // Execute the statement - $result = $stmt->execute(); - - $changes = $db->changes(); - if ($changes == 0) { - // Insert new value - create( $defaultValue, $expireMinutes, $dbtable, $columns, $values); - } - - // update cache - $uniqueHash = hash('ripemd160', $dbtable . $columns); - setCache($uniqueHash, $values, $expireMinutes); - - echo 'OK' ; -} - - -//------------------------------------------------------------------------------ -// create -//------------------------------------------------------------------------------ -function create( $defaultValue, $expireMinutes, $dbtable, $columns, $values) -{ - global $db; - - echo "NOT IMPLEMENTED!\n\n"; - return; - - // // Insert new value - // $sql = 'INSERT INTO '.$dbtable.' ('.$columns.') - // VALUES ("'. quotes($parameter) .'", - // "'. $values .'")'; - // $result = $db->query($sql); - - // if (! $result == TRUE) { - // echo "Error creating entry\n\n$sql \n\n". $db->lastErrorMsg(); - // return; - // } -} - -//------------------------------------------------------------------------------ -// delete -//------------------------------------------------------------------------------ -function delete($columnName, $id, $dbtable) -{ - global $db; - - // Handle one or multiple ids - if(strpos($id, ',') !== false) - { - $idsArr = explode(",", $id); - } else - { - $idsArr = array($id); - } - - // Initialize an empty string to store the comma-separated list of IDs - $idsStr = ""; - - // Iterate over each ID - foreach ($idsArr as $index => $item) - { - // Append the current ID to the string - $idsStr .= '"' . $item . '"'; - - // Add a comma if the current ID is not the last one - if ($index < count($idsArr) - 1) { - $idsStr .= ', '; - } - } - - // Construct the SQL query to delete entries based on the given IDs - $sql = 'DELETE FROM '.$dbtable.' WHERE "'.$columnName.'" IN ('. $idsStr .')'; - - // Execute the SQL query - $result = $db->query($sql); - - // Check if the query executed successfully - if (! $result == TRUE) { - // Output an error message if the query failed - echo "Error deleting entry\n\n".$sql." \n\n". $db->lastErrorMsg(); - return; - } else - { - // Output 'OK' if the deletion was successful - echo 'OK' ; - return; - } -} - - -// Simulate database locking by starting a transaction -function lockDatabase($delay) { - $db = new SQLite3($GLOBALS['DBFILE']); - $db->exec('BEGIN EXCLUSIVE;'); - sleep($delay); // Sleep for N seconds to simulate long-running transaction -} - -?> diff --git a/front/php/server/devices.php b/front/php/server/devices.php deleted file mode 100755 index 293ad190..00000000 --- a/front/php/server/devices.php +++ /dev/null @@ -1,442 +0,0 @@ -query($sql); - - // check result - if ($result == TRUE) { - echo lang('BackDevices_DBTools_DelDev_a'); - } else { - echo lang('BackDevices_DBTools_DelDevError_a')."\n\n$sql \n\n". $db->lastErrorMsg(); - } -} - -//------------------------------------------------------------------------------ -// Delete all devices with empty MAC addresses -//------------------------------------------------------------------------------ -function deleteAllWithEmptyMACs() { - global $db; - - // sql - $sql = 'DELETE FROM Devices WHERE devMac=""'; - // execute sql - $result = $db->query($sql); - - // check result - if ($result == TRUE) { - echo lang('BackDevices_DBTools_DelDev_b'); - } else { - echo lang('BackDevices_DBTools_DelDevError_b')."\n\n$sql \n\n". $db->lastErrorMsg(); - } -} - -//------------------------------------------------------------------------------ -// Delete all devices with empty MAC addresses -//------------------------------------------------------------------------------ -function deleteUnknownDevices() { - global $db; - - // sql - $sql = 'DELETE FROM Devices WHERE devName="(unknown)" OR devName="(name not found)"'; - // execute sql - $result = $db->query($sql); - - // check result - if ($result == TRUE) { - echo lang('BackDevices_DBTools_DelDev_b'); - } else { - echo lang('BackDevices_DBTools_DelDevError_b')."\n\n$sql \n\n". $db->lastErrorMsg(); - } -} - -//------------------------------------------------------------------------------ -// Delete Device Events -//------------------------------------------------------------------------------ -function deleteDeviceEvents() { - global $db; - - // sql - $sql = 'DELETE FROM Events WHERE eve_MAC="' . $_REQUEST['mac'] .'"'; - // execute sql - $result = $db->query($sql); - - // check result - if ($result == TRUE) { - echo lang('BackDevices_DBTools_DelEvents'); - } else { - echo lang('BackDevices_DBTools_DelEventsError')."\n\n$sql \n\n". $db->lastErrorMsg(); - } -} - - -//------------------------------------------------------------------------------ -// Delete all devices -//------------------------------------------------------------------------------ -function deleteAllDevices() { - global $db; - - // sql - $sql = 'DELETE FROM Devices'; - // execute sql - $result = $db->query($sql); - - // check result - if ($result == TRUE) { - echo lang('BackDevices_DBTools_DelDev_b'); - } else { - echo lang('BackDevices_DBTools_DelDevError_b')."\n\n$sql \n\n". $db->lastErrorMsg(); - } -} - -//------------------------------------------------------------------------------ -// Delete all Events -//------------------------------------------------------------------------------ -function deleteEvents() { - global $db; - // sql - $sql = 'DELETE FROM Events'; - // execute sql - $result = $db->query($sql); - - // check result - if ($result == TRUE) { - echo lang('BackDevices_DBTools_DelEvents'); - } else { - echo lang('BackDevices_DBTools_DelEventsError')."\n\n$sql \n\n". $db->lastErrorMsg(); - } -} - -//------------------------------------------------------------------------------ -// Delete all Events older than 30 days -//------------------------------------------------------------------------------ -function deleteEvents30() { - global $db; - - // sql - $sql = "DELETE FROM Events WHERE eve_DateTime <= date('now', '-30 day')"; - // execute sql - $result = $db->query($sql); - - // check result - if ($result == TRUE) { - echo lang('BackDevices_DBTools_DelEvents'); - } else { - echo lang('BackDevices_DBTools_DelEventsError')."\n\n$sql \n\n". $db->lastErrorMsg(); - } -} - -//------------------------------------------------------------------------------ -// Delete History -//------------------------------------------------------------------------------ -function deleteActHistory() { - global $db; - - // sql - $sql = 'DELETE FROM Online_History'; - // execute sql - $result = $db->query($sql); - - // check result - if ($result == TRUE) { - echo lang('BackDevices_DBTools_DelActHistory'); - } else { - echo lang('BackDevices_DBTools_DelActHistoryError')."\n\n$sql \n\n". $db->lastErrorMsg(); - } -} - -//------------------------------------------------------------------------------ -// Export CSV of devices -//------------------------------------------------------------------------------ -function ExportCSV() { - - header("Content-Type: application/octet-stream"); - header("Content-Transfer-Encoding: Binary"); - header("Content-disposition: attachment; filename=\"devices.csv\""); - - global $db; - $func_result = $db->query("SELECT * FROM Devices"); - - // prepare CSV header row - $columns = getDevicesColumns(); - - // wrap the headers with " (quotes) - $resultCSV = '"'.implode('","', $columns).'"'."\n"; - - // retrieve the devices from the DB - while ($row = $func_result->fetchArray(SQLITE3_ASSOC)) { - - // loop through columns and add values to the string - $index = 0; - foreach ($columns as $columnName) { - // Escape special chars (e.g.quotes) inside fields by replacing them with html definitions - $fieldValue = encodeSpecialChars($row[$columnName]); - - // add quotes around the value to prevent issues with commas in fields - $resultCSV .= '"'.$fieldValue.'"'; - - // detect last loop - skip as no comma needed - if ($index != count($columns) - 1) { - $resultCSV .= ','; - } - $index++; - } - - // add a new line for the next row - $resultCSV .= "\n"; - } - - //write the built CSV string - echo $resultCSV; -} - - -//------------------------------------------------------------------------------ -// Import CSV of devices -//------------------------------------------------------------------------------ -function ImportCSV() { - - global $db; - $file = '../../../config/devices.csv'; - $data = ""; - $skipped = ""; - $error = ""; - - // check if content passed in query string - if(isset ($_POST['content']) && !empty ($_POST['content'])) - { - // Decode the Base64 string - // $data = base64_decode($_POST['content']); - $data = base64_decode($_POST['content'], true); // The second parameter ensures safe decoding - - // // Ensure the decoded data is treated as UTF-8 text - // $data = mb_convert_encoding($data, 'UTF-8', 'UTF-8'); - - } else if (file_exists($file)) { // try to get the data form the file - - // Read the CSV file - $data = file_get_contents($file); - } else { - echo lang('BackDevices_DBTools_ImportCSVMissing'); - } - - if($data != "") - { - // data cleanup - new lines breaking the CSV - $data = preg_replace_callback('/"([^"]*)"/', function($matches) { - // Replace all \n within the quotes with a space - return str_replace("\n", " ", $matches[0]); // Replace with a space - }, $data); - - $lines = explode("\n", $data); - - // Get the column headers from the first line of the CSV - $header = str_getcsv(array_shift($lines)); - $header = array_map('trim', $header); - - // Delete everything form the DB table - $sql = 'DELETE FROM Devices'; - $result = $db->query($sql); - - // Build the SQL statement - $sql = "INSERT INTO Devices (" . implode(', ', $header) . ") VALUES "; - - // Parse data from CSV file line by line (max 10000 lines) - $index = 0; - foreach($lines as $row) { - $rowArray = str_getcsv($row); - - if (count($rowArray) === count($header)) { - // Make sure the number of columns matches the header - $rowArray = array_map(function ($value) { - return "'" . SQLite3::escapeString(trim($value)) . "'"; - }, $rowArray); - - $sql .= "(" . implode(', ', $rowArray) . "), "; - } else { - $skipped .= ($index + 1) . ","; - } - - $index++; - } - - // Remove the trailing comma and space from SQL - $sql = rtrim($sql, ', '); - - // Execute the SQL query - $result = $db->query($sql); - - if($error === "") { - // Import successful - echo lang('BackDevices_DBTools_ImportCSV') . " (Skipped lines: " . $skipped . ") "; - } else { - // An error occurred while writing to the DB, display the last error message - echo lang('BackDevices_DBTools_ImportCSVError') . "\n" . $error . "\n" . $sql . "\n\n" . $result; - } - } -} - - -//------------------------------------------------------------------------------ -// Determine if Random MAC -//------------------------------------------------------------------------------ - -function isRandomMAC($mac) { - $isRandom = false; - - // if detected as random, make sure it doesn't start with a prefix which teh suer doesn't want to mark as random - $setting = getSettingValue("UI_NOT_RANDOM_MAC"); - $prefixes = createArray($setting); - - $isRandom = in_array($mac[1], array("2", "6", "A", "E", "a", "e")); - - // If detected as random, make sure it doesn't start with a prefix which the user doesn't want to mark as random - if ($isRandom) { - foreach ($prefixes as $prefix) { - if (strpos($mac, $prefix) === 0) { - $isRandom = false; - break; - } - } - } - - return $isRandom; -} - -//------------------------------------------------------------------------------ -// Query the List of devices for calendar -//------------------------------------------------------------------------------ -function getDevicesListCalendar() { - global $db; - - // SQL - $condition = getDeviceCondition ($_REQUEST['status']); - $result = $db->query('SELECT * FROM Devices ' . $condition); - - // arrays of rows - $tableData = array(); - while ($row = $result -> fetchArray (SQLITE3_ASSOC)) { - if ($row['devFavorite'] == 1) { - $row['devName'] = ' '. $row['devName']; - } - - $tableData[] = array ('id' => $row['devMac'], - 'title' => $row['devName'], - 'favorite' => $row['devFavorite']); - } - - // Return json - echo (json_encode ($tableData)); -} - - -//------------------------------------------------------------------------------ -// Query Device Data -//------------------------------------------------------------------------------ - -// ---------------------------------------------------------------------------------------- -function updateNetworkLeaf() -{ - $nodeMac = $_REQUEST['value']; // parent - $leafMac = $_REQUEST['id']; // child - - if ((false === filter_var($nodeMac , FILTER_VALIDATE_MAC) && $nodeMac != "Internet" && $nodeMac != "") || false === filter_var($leafMac , FILTER_VALIDATE_MAC) ) { - throw new Exception('Invalid mac address'); - } - else - { - global $db; - // sql - $sql = 'UPDATE Devices SET "devParentMAC" = "'. $nodeMac .'" WHERE "devMac"="' . $leafMac.'"' ; - // update Data - $result = $db->query($sql); - - // check result - if ($result == TRUE) { - echo 'OK'; - } else { - echo 'KO'; - } - } - -} - - -//------------------------------------------------------------------------------ -// Status Where conditions -//------------------------------------------------------------------------------ -function getDeviceCondition ($deviceStatus) { - switch ($deviceStatus) { - case 'all': return 'WHERE devIsArchived=0'; break; - case 'my': return 'WHERE devIsArchived=0'; break; - case 'connected': return 'WHERE devIsArchived=0 AND devPresentLastScan=1'; break; - case 'favorites': return 'WHERE devIsArchived=0 AND devFavorite=1'; break; - case 'new': return 'WHERE devIsArchived=0 AND devIsNew=1'; break; - case 'down': return 'WHERE devIsArchived=0 AND devAlertDown !=0 AND devPresentLastScan=0'; break; - case 'archived': return 'WHERE devIsArchived=1'; break; - default: return 'WHERE 1=0'; break; - } -} - - -?> \ No newline at end of file diff --git a/front/php/server/init.php b/front/php/server/init.php index 2c207987..01c8576a 100755 --- a/front/php/server/init.php +++ b/front/php/server/init.php @@ -5,5 +5,4 @@ require dirname(__FILE__).'/../templates/globals.php'; require dirname(__FILE__).'/db.php'; require dirname(__FILE__).'/util.php'; require dirname(__FILE__).'/../templates/language/lang.php'; -require dirname(__FILE__).'/utilNotification.php'; ?> diff --git a/front/php/server/utilNotification.php b/front/php/server/utilNotification.php deleted file mode 100755 index ab2212a0..00000000 --- a/front/php/server/utilNotification.php +++ /dev/null @@ -1,209 +0,0 @@ -format('Y-m-d H:i:s'); - - // Escape content to prevent breaking JSON - $escaped_content = json_encode($content); - - // Prepare notification array - $notification = array( - 'timestamp' => $timestamp, - 'guid' => $guid, - 'read' => 0, - 'level'=> $level, - 'content' => $escaped_content, - ); - - // Read existing notifications - $notifications = json_decode(file_get_contents($NOTIFICATION_API_FILE), true); - - // Add new notification - $notifications[] = $notification; - - // Write notifications to file - file_put_contents($NOTIFICATION_API_FILE, json_encode($notifications)); -} - -// ---------------------------------------------------------------------------------------- -// Removes a notification based on GUID -function remove_notification($guid) { - $NOTIFICATION_API_FILE = get_notification_store_path(); - - // Read existing notifications - $notifications = json_decode(file_get_contents($NOTIFICATION_API_FILE), true); - - // Filter out the notification with the specified GUID - $filtered_notifications = array_filter($notifications, function($notification) use ($guid) { - return $notification['guid'] !== $guid; - }); - - // Write filtered notifications back to file - file_put_contents($NOTIFICATION_API_FILE, json_encode(array_values($filtered_notifications))); -} - -// ---------------------------------------------------------------------------------------- -// Deletes all notifications -function notifications_clear() { - $NOTIFICATION_API_FILE = get_notification_store_path(); - - // Clear notifications by writing an empty array to the file - file_put_contents($NOTIFICATION_API_FILE, json_encode(array())); -} - -// ---------------------------------------------------------------------------------------- -// Mark a notification read based on GUID -function mark_notification_as_read($guid) { - $NOTIFICATION_API_FILE = get_notification_store_path(); - $max_attempts = 3; - $attempts = 0; - - do { - // Check if the file exists and is readable - if (file_exists($NOTIFICATION_API_FILE) && is_readable($NOTIFICATION_API_FILE)) { - // Attempt to read existing notifications - $notifications = json_decode(file_get_contents($NOTIFICATION_API_FILE), true); - - // Check if reading was successful - if ($notifications !== null) { - // Iterate over notifications to find the one with the specified GUID - foreach ($notifications as &$notification) { - if ($notification['guid'] === $guid) { - // Mark the notification as read - $notification['read'] = 1; - break; - } elseif ($guid == null) // no guid given, mark all read - { - $notification['read'] = 1; - } - } - - // Write updated notifications back to file - file_put_contents($NOTIFICATION_API_FILE, json_encode($notifications)); - return; // Exit the function after successful operation - } - } - - // Increment the attempt count - $attempts++; - - // Sleep for a short duration before retrying - usleep(500000); // Sleep for 0.5 seconds (500,000 microseconds) before retrying - - } while ($attempts < $max_attempts); - - // If maximum attempts reached or file reading failed, handle the error - echo "Failed to read notification file after $max_attempts attempts."; -} - -// ---------------------------------------------------------------------------------------- -function notifications_mark_all_read() { - mark_notification_as_read(null); -} - -// ---------------------------------------------------------------------------------------- -function get_unread_notifications() { - $NOTIFICATION_API_FILE = get_notification_store_path(); - - // Read existing notifications - if (file_exists($NOTIFICATION_API_FILE) && is_readable($NOTIFICATION_API_FILE)) { - $notifications = json_decode(file_get_contents($NOTIFICATION_API_FILE), true); - - if ($notifications !== null) { - // Filter unread notifications - $unread_notifications = array_filter($notifications, function($notification) { - return $notification['read'] === 0; - }); - - // Return unread notifications as JSON - header('Content-Type: application/json'); - echo json_encode(array_values($unread_notifications)); - } else { - echo json_encode([]); - } - } else { - echo json_encode([]); - } -} - - -?> \ No newline at end of file