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 zcmeI433yc1`Tw0eEFtWO0s;~Vl_i+meeM8JW=S$L$z&#zNivCAnPeuDNis_&Gud2N z1hH-rP{s|$t<{QE!6n*S$E~evT}o|ht+lOHTWv*aTUxFD-)|CNCXkTChyRn`^T_jj zKIV~x%sKbG@45G!_uLKdKEH6oy)Q4k_Uaj|pkX;Vi{(U#)0~vW#@)ZI^E{|heZ|bM zyE{x?x5pdF3;W&8-bh^cDS&-Y|jz%N7b)i76I~;EI<_6q# z&G~wrQEzJRtnt~SroxD~%3@Lq8}htby-pwMh?dsoML4^?xJ@i}SHq#hWP#Pl zEYD^UEGrM%VH!zRsCRQ^Q4$0#FL9ZQG*o{T`h#?#%)$ClzS*Gj^`X}l4ASua|DCB} zk2HUA`V~m|7qj~RtW9kD+X2;_-VW)Z4l$^FgDx0^M&kbcTF>@vNDeZNqojSRY`xNS++kqc$w!VG@6&C zv_{L?p)O~$yEPhX^?E$+s5jeQo-YI=;c8#+RV%G7sw?ihewmW?$mL7FdISG~x4ZsQ zdlLPby3Uu0|Ms}qsT);jM$a^lDt6v!JSX-=G<{Nml?4n?jfOsRUq(o(5}k}n70*tn zEQt+2U8^3SU>|d<$0aV9u~%K(bL-Qpe<*R=SE{q8(-@4!rAfA zyQ+op4YTH)zVnN53*!f>)ysB-bs6!G=QF3oU;a|{OZ=_T_-p=GX7`jk8O!AOy%#W!_|$bwRlIc_ zeYJlblilNXGaM6N;$d!_9Q6jyT^e);yi3pTdBVe#E*|h9mM+h2bH`_HVdl+`c0`Z< zfW3d;+*7%gIc0LsS^iU6nAf7=EO_l%&hpo8`aa|uie1Ro|XPBXlPt@IrTzm zoSA`dJEiBPII}P_p6pR&_sqDR`D(n^pVp)KOS5vamMmMEebk5Q`#{TKdHj`!RTJWy9${w3cRkF^ zR%P|Trv}*hvzgjpJ+5Zh54b;v*URcjh<(oQJvB=XN~%E z>wsjjd_b}|oFq97OIdc1S>;HQR3t&6yfS8!#jKuLSEwgdre=$UZ>i7eYju2!c;<`@ zUXbPV`Cx=8!tAv6r3fP%@GI3LP7!ZyeyKM_e0Edb+_V%if9w2r)OXE)XWZKZu3FYH zu9}Q&CkWi&_X4{T6 zSwp0Y{(+|m5+}-IvzvD=$zQp3W#$SZhrrio^{mXy&2$Xth4F**0!`mM-O3-Q7dWk! z*9ej_c6&kIDxa52JJHc2pVz6rHf@9?YU#lvdoJDM zAAayakO-W>rspDFd*n&&aCT-Tfu8R)Cq71^XQVy(4dc1PsM`7L722)Zk2;Ai;zHsg z;$q?wVm+~e*hp+5E+sY-TZqeut;FTTcZe&9D~YR!tBGrfZsJ;E8?l|(L0m^%-=qC# zr@Az?mlqEfgd9B^4BM*QXddtSQqijT)|IPnAZ{dX>RGw!<|#8$yC6H^ zrh&F3?FqMUpmE|*PkQ~g0jwbLyp|uMPq@?tLj3-R$B*BtSZ?l7EVq2IEv@a_vL+5T z0_Z*{{e~`eMdWataaw_H54f?KhF{+$ZWZ6Uh1f;xCKAN0#BIdw#2v()#CM7B5qA-H z6W=H9A@&gW5h=++sh#ulm;xXcf#E*!_i60YB5J}=m;wj>3 z;u+#u;wQvUiJuYA5ziAZ5HAuh5ib)z?-Ad6W!9akS8(oNmrrEH;|DN3By+r$W%;oh zz;CXKul;1)l&ysuUL{^5UMGG*?C&Yu@XLdHQu|`C8+ts_4WlnO4I)`HMsHt{%;MdJ z%(R_F%($MjSH7WsGPUgs2O9?zp2NsuoS^Wur1$?}z8qa5e^VEyA#nP(tnqQrf!ak| zFa78Z;#b74iQf=!62B$hB7R4_P5hpChxh~WN8(S!yTqS~_lWn24~V}IeA}`@h{@v#6jXe#D9s;i7$x%5nmEtU3uw8s%`>eAT=}&8V^l? zCPEp|Bq$S_3{8QiLerq>&z zL)p+0=v&a4&{Aj_v>aLi;voSNAqkQp4WvL?Xce>?S_9=nXG7;e zYatz^hYXMrDu4>1BFF@pAq!Ltl|WXg6tY2fs0?yI<&YDqfGVLX$OTnHHPE@xdC>XL zx1kH5b&wmXh3X&=hx*pmI z#i1LZ8=;$^o1t4&$xA=lrF!7~)Wk)53>kyvE?RgVdikvHd03JKQ5dVw!@Fy5QwiO| z{@p540=gBt4Z0n=1G*FXF7!RKiJcj#m20Q3p;DfAEMGw7etzo36Z2ciE!|Ajt>zJUG*eF=S~x>DHB&=)F* zfz;4AXgo9lnh0e;lb}p!GBgF63QdEiLo=Y6&@AX=Xf|{TbSg9lnhVW?PJ`w{3!sJ2 z>Chr53pxW@3}r)0pl?BELQ9#Xuzwjd?z6N&O|08+g(~|rmQURa?0ZsT#pAEo@I1$A zSaz)L1=9W1S@E?8#$|SEo?Fh4RzNw>O6V*o7s`WJh=X`YfJ8`wWJm)kkQQ16t%lY> z`Ow+WInY{2$0Rk+>6tGyY5hJ_g5)&EPmr8e)CdA?<&Djo{M|t-BU~*Qn5zXNQ9u+D zMTChk6BeSFC?TvwDPbe*L>b{A$_Xb?K~xe|go~&qYKU`*^N90_Zxa^~>j*bdOVkk_ z!b{W>KB9r}6OBX@(M$x0AQ2+ML<V&S^EAq=?cO zeazln)5XZ$@>OjNsU7NoI-xEmDPMIVGd=BTW!_*jz90+3SOMpGMbz;8SluvteOGQG z>#~i^obCcDq99!iT>`C#Hb5JpP0*##W@rm^8MKv27L;7he4-xqFro+fMgV00J!_Xs8 z5A-PX7{!VGhs=~WQ?K}fLF0tykDvH?mWogWUKp!eluO=}6S)T;XQuQ%+xOmHEbiX4 z;ztbWap=d;6Ht;#Zd&mq^P}R_-Z^8i-l3(8VFUvejcEjmhA|op*FMeUcjvb~$&j9c zo`#-*o`rq_{S^8c^c?g&^aAuE^b+(k^mFJH=vC-7=ym89(0=Hb&>PUNpkG73f!<`2 z`E9>t-g_;z@9DAam`jf+4HGp3N&${uITmv{MI+Pq$zwGa(Qa{eced#*hV(n=ZRq#V zJJ27XKSFY3Un$o z2bv4bgHD6yLkpmV(CN@3C<{6RS`1}FOQ3H-XF^M%WzceH1(XA=gwBF;p*)C%IEaS? zNQ5LvhBS}@X`xlnYG@6V51kF21FeO0kRCEXMyLQPgo+>&WQHtIF;oIsp;E{O*`YGX z0hL2er~;~lsvs9s4b?#BLgzu}L*IrjP$ySxUZ?)xoJofZ785g{U8gqphm#=pZ4z@- zl*;iGPE>q4s+9kTwn%n5Arn_g3N3Hf?%42X2Pn#?v^j@RxY2i9G$pd+zddLSgKz^tZYJ!@f02G8mP#9`~B2X(7 zg`oK4;vdHmFj{6%$kSo7A?1 z=bbVtW#@#x>SkKU5;dr9V<{P=Jv*fakyezcz(JdI$lNp6u)RUSA4AvFt zgH@6!LrX~KoHWEHrou~fn1N1bXlY46q2kRkJXrTps~4wCVl(z{QCs4kH62;=1hMak z1+|*WN;zt^NQYYn9hYdeR?y^XG}ynVom&k*R7rkI%pGwDqyC^b-)hu}*2Y%e8Ytsy z8qI>$87->|RPyesO2O8iDW@E&NUzG*r2Hc+tMIF3-Xqsj7_GKPsD|C!zB-fB%13{S z#E0TOwY)xGiB?y!9{O$WhJZQbGDJjeEYjiXsA?!EEatpwQcsb6{XcGjTq?2RC zyisW?WnH4BwA!4>$vho2n4EG>rtcG}@)NJWwnbfiY9>eLfsQ)Plla-ITh!T>{OX{- z)$J-}tww|INN5)5k3{D&˔wF6G)^!HqSxj#4m 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