From 711507fa1d0c2367cd0993b970be40df853bbd16 Mon Sep 17 00:00:00 2001
From: leiweibau <105860611+leiweibau@users.noreply.github.com>
Date: Wed, 3 Aug 2022 08:34:04 +0200
Subject: [PATCH] Maintaining
---
front/deviceDetails.php | 63 +++++++++++++++++++++++++----------
front/php/server/devices.php | 38 ++++++++++++++++++---
tar/create.sh | 2 +-
tar/pialert_latest.tar | Bin 62084608 -> 62026240 bytes
4 files changed, 81 insertions(+), 22 deletions(-)
diff --git a/front/deviceDetails.php b/front/deviceDetails.php
index 1dfd5bf8..fe57d78b 100644
--- a/front/deviceDetails.php
+++ b/front/deviceDetails.php
@@ -266,14 +266,25 @@ if ($_REQUEST['mac'] == 'Internet') { $DevDetail_Tap_temp = "Tools"; } else { $D
-
@@ -704,7 +715,6 @@ function main () {
// Read Cookies
devicesList = getCookie('devicesList');
- deleteCookie ('devicesList');
if (devicesList != '') {
devicesList = JSON.parse (devicesList);
} else {
@@ -804,10 +814,11 @@ function initializeiCheck () {
// -----------------------------------------------------------------------------
function initializeCombos () {
// Initialize combos with queries
- initializeCombo ( $('#dropdownOwner')[0], 'getOwners', 'txtOwner');
- initializeCombo ( $('#dropdownDeviceType')[0], 'getDeviceTypes', 'txtDeviceType');
- initializeCombo ( $('#dropdownGroup')[0], 'getGroups', 'txtGroup');
- initializeCombo ( $('#dropdownLocation')[0], 'getLocations', 'txtLocation');
+ initializeCombo ( $('#dropdownOwner')[0], 'getOwners', 'txtOwner');
+ initializeCombo ( $('#dropdownDeviceType')[0], 'getDeviceTypes', 'txtDeviceType');
+ initializeCombo ( $('#dropdownGroup')[0], 'getGroups', 'txtGroup');
+ initializeCombo ( $('#dropdownLocation')[0], 'getLocations', 'txtLocation');
+ initializeCombo ( $('#dropdownNetworkNodeMac')[0], 'getNetworkNodes', 'txtNetworkNodeMac');
// Initialize static combos
initializeComboSkipRepeated ();
@@ -828,10 +839,17 @@ function initializeCombo (HTMLelement, queryAction, txtDataField) {
order = item['order'];
}
+ id = item['name'];
+ // use explicitly specified id (value) if avaliable
+ if(item['id'])
+ {
+ id = item['id'];
+ }
+
// add dropdown item
HTMLelement.innerHTML +=
'
'+ item['name'] + ''
+ txtDataField +'\',\''+ id +'\')">'+ item['name'] + ''
});
});
}
@@ -1121,8 +1139,8 @@ function getDeviceData (readAllData=false) {
$('#txtGroup').val ('--');
$('#txtLocation').val ('--');
$('#txtComments').val ('--');
- $('#txtInfrastructure').val ('--');
- $('#txtInfrastructurePort').val ('--');
+ $('#txtNetworkNodeMac').val ('--');
+ $('#txtNetworkPort').val ('--');
$('#txtFirstConnection').val ('--');
$('#txtLastConnection').val ('--');
@@ -1193,6 +1211,13 @@ function getDeviceData (readAllData=false) {
mac =deviceData['dev_MAC'];
+ // update the mac parameter in the URL, this makes the selected device persistent when the page is reloaded
+ var searchParams = new URLSearchParams(window.location.search);
+ searchParams.set("mac", mac);
+ var newRelativePathQuery = window.location.pathname + '?' + searchParams.toString();
+ history.pushState(null, '', newRelativePathQuery);
+ getSessionsPresenceEvents();
+
$('#txtMAC').val (deviceData['dev_MAC']);
$('#txtName').val (deviceData['dev_Name']);
$('#txtOwner').val (deviceData['dev_Owner']);
@@ -1203,8 +1228,8 @@ function getDeviceData (readAllData=false) {
$('#txtGroup').val (deviceData['dev_Group']);
$('#txtLocation').val (deviceData['dev_Location']);
$('#txtComments').val (deviceData['dev_Comments']);
- $('#txtInfrastructure').val (deviceData['dev_Infrastructure']);
- $('#txtInfrastructurePort').val (deviceData['dev_Infrastructure_port']);
+ $('#txtNetworkNodeMac').val (deviceData['dev_Network_Node_MAC']);
+ $('#txtNetworkPort').val (deviceData['dev_Network_Node_port']);
$('#txtFirstConnection').val (deviceData['dev_FirstConnection']);
$('#txtLastConnection').val (deviceData['dev_LastConnection']);
@@ -1254,7 +1279,7 @@ function getDeviceData (readAllData=false) {
$('#btnNext').removeAttr ('disabled');
$('#btnNext').removeClass ('text-gray50');
}
-
+
// Timer for refresh data
$("body").css("cursor", "default");
newTimerRefreshData (getDeviceData);
@@ -1313,8 +1338,8 @@ function setDeviceData (refreshCallback='') {
+ '&group=' + $('#txtGroup').val()
+ '&location=' + $('#txtLocation').val()
+ '&comments=' + $('#txtComments').val()
- + '&infrastructure=' + $('#txtInfrastructure').val()
- + '&infrastructureport=' + $('#txtInfrastructurePort').val()
+ + '&networknode=' + $('#txtNetworkNodeMac').val()
+ + '&networknodeport=' + $('#txtNetworkPort').val()
+ '&staticIP=' + ($('#chkStaticIP')[0].checked * 1)
+ '&scancycle=' + $('#txtScanCycle').val().split(' ')[0]
+ '&alertevents=' + ($('#chkAlertEvents')[0].checked * 1)
@@ -1336,6 +1361,7 @@ function setDeviceData (refreshCallback='') {
}
+
// -----------------------------------------------------------------------------
function askSkipNotifications () {
// Check MAC
@@ -1422,13 +1448,16 @@ function deleteDevice () {
// -----------------------------------------------------------------------------
function getSessionsPresenceEvents () {
+ // Check MAC in url
+ var urlParams = new URLSearchParams(window.location.search);
+ mac = urlParams.get ('mac');
// Define Sessions datasource and query dada
$('#tableSessions').DataTable().ajax.url('php/server/events.php?action=getDeviceSessions&mac=' + mac +'&period='+ period).load();
// Define Presence datasource and query data
$('#calendar').fullCalendar('removeEventSources');
$('#calendar').fullCalendar('addEventSource',
- { url: 'php/server/events.php?action=getDevicePresence&mac=' + mac +'&period='+ period });
+ { url: 'php/server/events.php?action=getDevicePresence&mac=' + mac});
// Query events
getDeviceEvents();
diff --git a/front/php/server/devices.php b/front/php/server/devices.php
index aa7c4bca..cdbf97a0 100644
--- a/front/php/server/devices.php
+++ b/front/php/server/devices.php
@@ -35,6 +35,7 @@ if (strlen($pia_lang_selected) == 0) {$pia_lang_selected = 'en_us';}
case 'getDeviceData': getDeviceData(); break;
case 'setDeviceData': setDeviceData(); break;
case 'deleteDevice': deleteDevice(); break;
+ case 'getNetworkNodes': getNetworkNodes(); break;
case 'deleteAllWithEmptyMACs': deleteAllWithEmptyMACs(); break;
case 'createBackupDB': createBackupDB(); break;
case 'restoreBackupDB': restoreBackupDB(); break;
@@ -87,8 +88,8 @@ function getDeviceData() {
$deviceData = $row;
$mac = $deviceData['dev_MAC'];
- $deviceData['dev_Infrastructure'] = $row['dev_Infrastructure'];
- $deviceData['dev_Infrastructure_port'] = $row['dev_Infrastructure_port'];
+ $deviceData['dev_Network_Node_MAC'] = $row['dev_Infrastructure'];
+ $deviceData['dev_Network_Node_port'] = $row['dev_Infrastructure_port'];
$deviceData['dev_FirstConnection'] = formatDate ($row['dev_FirstConnection']); // Date formated
$deviceData['dev_LastConnection'] = formatDate ($row['dev_LastConnection']); // Date formated
@@ -156,8 +157,8 @@ function setDeviceData() {
dev_Group = "'. quotes($_REQUEST['group']) .'",
dev_Location = "'. quotes($_REQUEST['location']) .'",
dev_Comments = "'. quotes($_REQUEST['comments']) .'",
- dev_Infrastructure = "'. quotes($_REQUEST['infrastructure']).'",
- dev_Infrastructure_port = "'. quotes($_REQUEST['infrastructureport']).'",
+ dev_Infrastructure = "'. quotes($_REQUEST['networknode']).'",
+ dev_Infrastructure_port = "'. quotes($_REQUEST['networknodeport']).'",
dev_StaticIP = "'. quotes($_REQUEST['staticIP']) .'",
dev_ScanCycle = "'. quotes($_REQUEST['scancycle']) .'",
dev_AlertEvents = "'. quotes($_REQUEST['alertevents']) .'",
@@ -733,6 +734,35 @@ function getLocations() {
}
+//------------------------------------------------------------------------------
+// Query Device Data
+//------------------------------------------------------------------------------
+function getNetworkNodes() {
+ global $db;
+
+ // Device Data
+ $sql = 'SELECT * FROM network_infrastructure';
+
+ $result = $db->query($sql);
+
+ // arrays of rows
+ $tableData = array();
+ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
+ // Push row data
+ $tableData[] = array('id' => $row['device_id'],
+ 'name' => $row['net_device_name'].'/'.$row['net_device_typ'] );
+ }
+
+ // Control no rows
+ if (empty($tableData)) {
+ $tableData = [];
+ }
+
+ // Return json
+ echo (json_encode ($tableData));
+}
+
+
//------------------------------------------------------------------------------
// Status Where conditions
//------------------------------------------------------------------------------
diff --git a/tar/create.sh b/tar/create.sh
index 4c950a97..06c6e3de 100755
--- a/tar/create.sh
+++ b/tar/create.sh
@@ -19,7 +19,7 @@ tar tvf pialert/tar/pialert_latest.tar | wc -l
rm pialert/tar/pialert_*.tar
# ------------------------------------------------------------------------------
-tar cvf pialert/tar/pialert_latest.tar --exclude="pialert/tar" --exclude="pialert/.git" pialert | wc -l
+tar cvf pialert/tar/pialert_latest.tar --no-xattrs --exclude="pialert/tar" --exclude="pialert/.git" --exclude="pialert/.gitignore" pialert | wc -l
#ln -s pialert_$PIALERT_VERSION.tar pialert/package/pialert_latest.tar
#ls -l pialert/package/pialert*.tar
diff --git a/tar/pialert_latest.tar b/tar/pialert_latest.tar
index dd5a3709078f5ceb57b8a64caf02f753c1466cb3..1489940de2d32ba9f53e78620f685f09c6709ea7 100644
GIT binary patch
delta 6552
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
RwmZ30HM&Db?Nu*${vS--32*=a
delta 24379
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˔wF6G)^!HqSxj#4m
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