mirror of
https://github.com/jokob-sk/NetAlertX.git
synced 2025-12-07 09:36:05 -08:00
963 lines
33 KiB
PHP
Executable File
963 lines
33 KiB
PHP
Executable File
<?php
|
|
//------------------------------------------------------------------------------
|
|
// Pi.Alert
|
|
// Open Source Network Guard / WIFI & LAN intrusion detector
|
|
//
|
|
// devices.php - Front module. Server side. Manage Devices
|
|
//------------------------------------------------------------------------------
|
|
// Puche 2021 pi.alert.application@gmail.com GNU GPLv3
|
|
//------------------------------------------------------------------------------
|
|
// ###################################
|
|
// ## TimeZone processing start
|
|
// ###################################
|
|
|
|
$configFolderPath = "/home/pi/pialert/config/";
|
|
$config_file = "pialert.conf";
|
|
$logFolderPath = "/home/pi/pialert/front/log/";
|
|
$log_file = "pialert_front.log";
|
|
|
|
|
|
$fullConfPath = $configFolderPath.$config_file;
|
|
|
|
$config_file_lines = file($fullConfPath);
|
|
$config_file_lines_timezone = array_values(preg_grep('/^TIMEZONE\s.*/', $config_file_lines));
|
|
|
|
$timeZone = "";
|
|
|
|
foreach ($config_file_lines as $line)
|
|
{
|
|
if( preg_match('/TIMEZONE(.*?)/', $line, $match) == 1 )
|
|
{
|
|
if (preg_match('/\'(.*?)\'/', $line, $match) == 1) {
|
|
$timeZone = $match[1];
|
|
}
|
|
}
|
|
}
|
|
|
|
if($timeZone == "")
|
|
{
|
|
$timeZone = "Europe/Berlin";
|
|
}
|
|
|
|
date_default_timezone_set($timeZone);
|
|
|
|
$date = new DateTime("now", new DateTimeZone($timeZone) );
|
|
$timestamp = $date->format('Y-m-d_H-i-s');
|
|
|
|
// ###################################
|
|
// ## TimeZone processing end
|
|
// ###################################
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// External files
|
|
require 'db.php';
|
|
require 'util.php';
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Action selector
|
|
//------------------------------------------------------------------------------
|
|
// Set maximum execution time to 15 seconds
|
|
ini_set ('max_execution_time','30');
|
|
|
|
// Open DB
|
|
OpenDB();
|
|
|
|
// Action functions
|
|
if (isset ($_REQUEST['action']) && !empty ($_REQUEST['action'])) {
|
|
$action = $_REQUEST['action'];
|
|
switch ($action) {
|
|
case 'getDeviceData': getDeviceData(); break;
|
|
case 'setDeviceData': setDeviceData(); break;
|
|
case 'getNetworkNodes': getNetworkNodes(); break;
|
|
case 'deleteDevice': deleteDevice(); break;
|
|
case 'deleteAllWithEmptyMACs': deleteAllWithEmptyMACs(); break;
|
|
case 'createBackupDB': createBackupDB(); break;
|
|
|
|
case 'deleteAllDevices': deleteAllDevices(); break;
|
|
case 'runScan15min': runScan15min(); break;
|
|
case 'runScan1min': runScan1min(); break;
|
|
case 'deleteUnknownDevices': deleteUnknownDevices(); break;
|
|
case 'deleteEvents': deleteEvents(); break;
|
|
case 'deleteEvents30': deleteEvents30(); break;
|
|
case 'deleteActHistory': deleteActHistory(); break;
|
|
case 'deleteDeviceEvents': deleteDeviceEvents(); break;
|
|
case 'PiaBackupDBtoArchive': PiaBackupDBtoArchive(); break;
|
|
case 'PiaRestoreDBfromArchive': PiaRestoreDBfromArchive(); break;
|
|
case 'PiaPurgeDBBackups': PiaPurgeDBBackups(); break;
|
|
case 'PiaEnableDarkmode': PiaEnableDarkmode(); break;
|
|
case 'PiaToggleArpScan': PiaToggleArpScan(); break;
|
|
case 'ExportCSV': ExportCSV(); break;
|
|
case 'ImportCSV': ImportCSV(); break;
|
|
|
|
case 'getDevicesTotals': getDevicesTotals(); break;
|
|
case 'getDevicesList': getDevicesList(); break;
|
|
case 'getDevicesListCalendar': getDevicesListCalendar(); break;
|
|
|
|
case 'getOwners': getOwners(); break;
|
|
case 'getDeviceTypes': getDeviceTypes(); break;
|
|
case 'getGroups': getGroups(); break;
|
|
case 'getLocations': getLocations(); break;
|
|
|
|
default: logServerConsole ('Action: '. $action); break;
|
|
}
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Query Device Data
|
|
//------------------------------------------------------------------------------
|
|
function getDeviceData() {
|
|
global $db;
|
|
|
|
// Request Parameters
|
|
$periodDate = getDateFromPeriod();
|
|
$mac = $_REQUEST['mac'];
|
|
|
|
// Device Data
|
|
$sql = 'SELECT rowid, *,
|
|
CASE WHEN dev_AlertDeviceDown=1 AND dev_PresentLastScan=0 THEN "Down"
|
|
WHEN dev_PresentLastScan=1 THEN "On-line"
|
|
ELSE "Off-line" END as dev_Status
|
|
FROM Devices
|
|
WHERE dev_MAC="'. $mac .'" or cast(rowid as text)="'. $mac. '"';
|
|
$result = $db->query($sql);
|
|
$row = $result -> fetchArray (SQLITE3_ASSOC);
|
|
$deviceData = $row;
|
|
$mac = $deviceData['dev_MAC'];
|
|
|
|
$deviceData['dev_Network_Node_MAC_ADDR'] = $row['dev_Network_Node_MAC_ADDR'];
|
|
$deviceData['dev_Network_Node_port'] = $row['dev_Network_Node_port'];
|
|
$deviceData['dev_FirstConnection'] = formatDate ($row['dev_FirstConnection']); // Date formated
|
|
$deviceData['dev_LastConnection'] = formatDate ($row['dev_LastConnection']); // Date formated
|
|
|
|
$deviceData['dev_RandomMAC'] = ( in_array($mac[1], array("2","6","A","E","a","e")) ? 1 : 0);
|
|
|
|
// Count Totals
|
|
$condition = ' WHERE eve_MAC="'. $mac .'" AND eve_DateTime >= '. $periodDate;
|
|
|
|
// Connections
|
|
$sql = 'SELECT COUNT(*) FROM Sessions
|
|
WHERE ses_MAC="'. $mac .'"
|
|
AND ( ses_DateTimeConnection >= '. $periodDate .'
|
|
OR ses_DateTimeDisconnection >= '. $periodDate .'
|
|
OR ses_StillConnected = 1 )';
|
|
$result = $db->query($sql);
|
|
$row = $result -> fetchArray (SQLITE3_NUM);
|
|
$deviceData['dev_Sessions'] = $row[0];
|
|
|
|
// Events
|
|
$sql = 'SELECT COUNT(*) FROM Events '. $condition .' AND eve_EventType <> "Connected" AND eve_EventType <> "Disconnected" ';
|
|
$result = $db->query($sql);
|
|
$row = $result -> fetchArray (SQLITE3_NUM);
|
|
$deviceData['dev_Events'] = $row[0];
|
|
|
|
// Down Alerts
|
|
$sql = 'SELECT COUNT(*) FROM Events '. $condition .' AND eve_EventType = "Device Down"';
|
|
$result = $db->query($sql);
|
|
$row = $result -> fetchArray (SQLITE3_NUM);
|
|
$deviceData['dev_DownAlerts'] = $row[0];
|
|
|
|
// Get current date using php, sql datetime does not return time respective to timezone.
|
|
$currentdate = date("Y-m-d H:i:s");
|
|
// Presence hours
|
|
$sql = 'SELECT CAST(( MAX (0, SUM (julianday (IFNULL (ses_DateTimeDisconnection,"'. $currentdate .'" ))
|
|
- julianday (CASE WHEN ses_DateTimeConnection < '. $periodDate .' THEN '. $periodDate .'
|
|
ELSE ses_DateTimeConnection END)) *24 )) AS INT)
|
|
FROM Sessions
|
|
WHERE ses_MAC="'. $mac .'"
|
|
AND ses_DateTimeConnection IS NOT NULL
|
|
AND (ses_DateTimeDisconnection IS NOT NULL OR ses_StillConnected = 1 )
|
|
AND ( ses_DateTimeConnection >= '. $periodDate .'
|
|
OR ses_DateTimeDisconnection >= '. $periodDate .'
|
|
OR ses_StillConnected = 1 )';
|
|
$result = $db->query($sql);
|
|
$row = $result -> fetchArray (SQLITE3_NUM);
|
|
$deviceData['dev_PresenceHours'] = round ($row[0]);
|
|
|
|
// Return json
|
|
echo (json_encode ($deviceData));
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Update Device Data
|
|
//------------------------------------------------------------------------------
|
|
function setDeviceData() {
|
|
global $db;
|
|
global $pia_lang;
|
|
|
|
// sql
|
|
$sql = 'UPDATE Devices SET
|
|
dev_Name = "'. quotes($_REQUEST['name']) .'",
|
|
dev_Owner = "'. quotes($_REQUEST['owner']) .'",
|
|
dev_DeviceType = "'. quotes($_REQUEST['type']) .'",
|
|
dev_Vendor = "'. quotes($_REQUEST['vendor']) .'",
|
|
dev_Favorite = "'. quotes($_REQUEST['favorite']) .'",
|
|
dev_Group = "'. quotes($_REQUEST['group']) .'",
|
|
dev_Location = "'. quotes($_REQUEST['location']) .'",
|
|
dev_Comments = "'. quotes($_REQUEST['comments']) .'",
|
|
dev_Network_Node_MAC_ADDR = "'. quotes($_REQUEST['networknode']).'",
|
|
dev_Network_Node_port = "'. quotes($_REQUEST['networknodeport']).'",
|
|
dev_StaticIP = "'. quotes($_REQUEST['staticIP']) .'",
|
|
dev_ScanCycle = "'. quotes($_REQUEST['scancycle']) .'",
|
|
dev_AlertEvents = "'. quotes($_REQUEST['alertevents']) .'",
|
|
dev_AlertDeviceDown = "'. quotes($_REQUEST['alertdown']) .'",
|
|
dev_SkipRepeated = "'. quotes($_REQUEST['skiprepeated']) .'",
|
|
dev_NewDevice = "'. quotes($_REQUEST['newdevice']) .'",
|
|
dev_Archived = "'. quotes($_REQUEST['archived']) .'"
|
|
WHERE dev_MAC="' . $_REQUEST['mac'] .'"';
|
|
// update Data
|
|
$result = $db->query($sql);
|
|
|
|
// check result
|
|
if ($result == TRUE) {
|
|
echo lang('BackDevices_DBTools_UpdDev');
|
|
} else {
|
|
echo lang('BackDevices_DBTools_UpdDevError')."\n\n$sql \n\n". $db->lastErrorMsg();
|
|
}
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Delete Device
|
|
//------------------------------------------------------------------------------
|
|
function deleteDevice() {
|
|
global $db;
|
|
global $pia_lang;
|
|
|
|
// sql
|
|
$sql = 'DELETE FROM Devices WHERE dev_MAC="' . $_REQUEST['mac'] .'"';
|
|
// execute sql
|
|
$result = $db->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;
|
|
global $pia_lang;
|
|
|
|
// sql
|
|
$sql = 'DELETE FROM Devices WHERE dev_MAC=""';
|
|
// 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;
|
|
global $pia_lang;
|
|
|
|
// sql
|
|
$sql = 'DELETE FROM Devices WHERE dev_Name="(unknown)"';
|
|
// 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;
|
|
global $pia_lang;
|
|
|
|
// 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;
|
|
global $pia_lang;
|
|
|
|
// 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;
|
|
global $pia_lang;
|
|
|
|
// 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;
|
|
global $pia_lang;
|
|
|
|
// 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;
|
|
global $pia_lang;
|
|
|
|
// 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();
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Backup DB to Archiv
|
|
//------------------------------------------------------------------------------
|
|
function PiaBackupDBtoArchive() {
|
|
// prepare fast Backup
|
|
$file = '../../../db/pialert.db';
|
|
$newfile = '../../../db/pialert.db.latestbackup';
|
|
global $pia_lang;
|
|
|
|
// copy files as a fast Backup
|
|
if (!copy($file, $newfile)) {
|
|
echo lang('BackDevices_Backup_CopError');
|
|
} else {
|
|
// Create archive with actual date
|
|
$Pia_Archive_Name = 'pialertdb_'.date("Ymd_His").'.zip';
|
|
$Pia_Archive_Path = '../../../db/';
|
|
exec('zip -j '.$Pia_Archive_Path.$Pia_Archive_Name.' ../../../db/pialert.db', $output);
|
|
// chheck if archive exists
|
|
if (file_exists($Pia_Archive_Path.$Pia_Archive_Name) && filesize($Pia_Archive_Path.$Pia_Archive_Name) > 0) {
|
|
echo lang('BackDevices_Backup_okay').': ('.$Pia_Archive_Name.')';
|
|
unlink($newfile);
|
|
echo("<meta http-equiv='refresh' content='1'>");
|
|
} else {
|
|
echo lang('BackDevices_Backup_Failed').' (pialert.db.latestbackup)';
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Restore DB from Archiv
|
|
//------------------------------------------------------------------------------
|
|
function PiaRestoreDBfromArchive() {
|
|
// prepare fast Backup
|
|
$file = '../../../db/pialert.db';
|
|
$oldfile = '../../../db/pialert.db.prerestore';
|
|
global $pia_lang;
|
|
|
|
// copy files as a fast Backup
|
|
if (!copy($file, $oldfile)) {
|
|
echo lang('BackDevices_Restore_CopError');
|
|
} else {
|
|
// extract latest archive and overwrite the actual pialert.db
|
|
$Pia_Archive_Path = '../../../db/';
|
|
exec('/bin/ls -Art '.$Pia_Archive_Path.'*.zip | /bin/tail -n 1 | /usr/bin/xargs -n1 /bin/unzip -o -d ../../../db/', $output);
|
|
// check if the pialert.db exists
|
|
if (file_exists($file)) {
|
|
echo lang('BackDevices_Restore_okay');
|
|
unlink($oldfile);
|
|
echo("<meta http-equiv='refresh' content='1'>");
|
|
} else {
|
|
echo lang('BackDevices_Restore_Failed');
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Purge Backups
|
|
//------------------------------------------------------------------------------
|
|
function PiaPurgeDBBackups() {
|
|
global $pia_lang;
|
|
|
|
$Pia_Archive_Path = '../../../db';
|
|
$Pia_Backupfiles = array();
|
|
$files = array_diff(scandir($Pia_Archive_Path, SCANDIR_SORT_DESCENDING), array('.', '..', 'pialert.db', 'pialertdb-reset.zip'));
|
|
|
|
foreach ($files as &$item)
|
|
{
|
|
$item = $Pia_Archive_Path.'/'.$item;
|
|
if (stristr($item, 'setting_') == '') {array_push($Pia_Backupfiles, $item);}
|
|
}
|
|
|
|
if (sizeof($Pia_Backupfiles) > 3)
|
|
{
|
|
rsort($Pia_Backupfiles);
|
|
unset($Pia_Backupfiles[0], $Pia_Backupfiles[1], $Pia_Backupfiles[2]);
|
|
$Pia_Backupfiles_Purge = array_values($Pia_Backupfiles);
|
|
for ($i = 0; $i < sizeof($Pia_Backupfiles_Purge); $i++)
|
|
{
|
|
unlink($Pia_Backupfiles_Purge[$i]);
|
|
}
|
|
}
|
|
echo lang('BackDevices_DBTools_Purge');
|
|
echo("<meta http-equiv='refresh' content='1'>");
|
|
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// 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
|
|
// header array with column names
|
|
$columns = getDevicesColumns();
|
|
|
|
// wrap the headers with " (quotes)
|
|
$resultCSV = '"'.implode('","', $columns).'"';
|
|
|
|
//and append a new line
|
|
$resultCSV = $resultCSV."\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) {
|
|
|
|
// add quotes around the value to prevent issues with commas in fields
|
|
$resultCSV = $resultCSV.'"'.$row[$columnName].'"';
|
|
|
|
// detect last loop - skip as no comma needed
|
|
if ($index != count($columns) - 1 )
|
|
{
|
|
$resultCSV = $resultCSV.',';
|
|
}
|
|
$index++;
|
|
}
|
|
|
|
//$resultCSV = $resultCSV.implode(",", [$row["dev_MAC"], $row["dev_Name"]]);
|
|
$resultCSV = $resultCSV."\n";
|
|
}
|
|
|
|
//write the built CSV string
|
|
echo $resultCSV;
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Import CSV of devices
|
|
//------------------------------------------------------------------------------
|
|
function ImportCSV() {
|
|
|
|
|
|
$file = '../../../config/devices.csv';
|
|
|
|
if (file_exists($file)) {
|
|
|
|
global $db;
|
|
global $pia_lang;
|
|
|
|
$error = "";
|
|
|
|
// sql
|
|
$sql = 'DELETE FROM Devices';
|
|
// execute sql
|
|
$result = $db->query($sql);
|
|
|
|
// Open the CSV file with read-only mode
|
|
$csvFile = fopen($file, 'r');
|
|
|
|
// Skip the first line
|
|
fgetcsv($csvFile);
|
|
|
|
$columns = getDevicesColumns();
|
|
|
|
// Parse data from CSV file line by line (max 10000 lines)
|
|
while (($row = fgetcsv($csvFile, 10000, ",")) !== FALSE)
|
|
{
|
|
$sql = 'INSERT INTO Devices ('.implode(',', $columns).') VALUES ("' .implode('","', $row).'")';
|
|
|
|
$result = $db->query($sql);
|
|
|
|
// check result
|
|
if ($result != TRUE) {
|
|
$error = $db->lastErrorMsg();
|
|
// break the while loop on error
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Close opened CSV file
|
|
fclose($csvFile);
|
|
|
|
if($error == "")
|
|
{
|
|
// import succesful
|
|
echo lang('BackDevices_DBTools_ImportCSV');
|
|
|
|
}
|
|
else{
|
|
// an error occurred while writing to the DB, display the last error message
|
|
echo lang('BackDevices_DBTools_ImportCSVError')."\n\n$sql \n\n".$error;
|
|
}
|
|
|
|
} else {
|
|
echo lang('BackDevices_DBTools_ImportCSVMissing');
|
|
}
|
|
|
|
|
|
$db->close();
|
|
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Toggle Dark/Light Themes
|
|
//------------------------------------------------------------------------------
|
|
function PiaEnableDarkmode() {
|
|
$file = '../../../db/setting_darkmode';
|
|
global $pia_lang;
|
|
|
|
if (file_exists($file)) {
|
|
echo lang('BackDevices_darkmode_disabled');
|
|
unlink($file);
|
|
echo("<meta http-equiv='refresh' content='1'>");
|
|
} else {
|
|
echo lang('BackDevices_darkmode_enabled');
|
|
$darkmode = fopen($file, 'w');
|
|
echo("<meta http-equiv='refresh' content='1'>");
|
|
}
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Toggle on/off Arp-Scans
|
|
//------------------------------------------------------------------------------
|
|
function PiaToggleArpScan() {
|
|
$file = '../../../db/setting_stoparpscan';
|
|
global $pia_lang;
|
|
|
|
if (file_exists($file)) {
|
|
echo lang('BackDevices_Arpscan_enabled');
|
|
unlink($file);
|
|
echo("<meta http-equiv='refresh' content='1'>");
|
|
} else {
|
|
echo lang('BackDevices_Arpscan_disabled');
|
|
$startarpscan = fopen($file, 'w');
|
|
echo("<meta http-equiv='refresh' content='1'>");
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Query total numbers of Devices by status
|
|
//------------------------------------------------------------------------------
|
|
function getDevicesTotals() {
|
|
|
|
$resultJSON = "";
|
|
|
|
if(getCache("getDevicesTotals") != "")
|
|
{
|
|
$resultJSON = getCache("getDevicesTotals");
|
|
} else
|
|
{
|
|
global $db;
|
|
|
|
// combined query
|
|
$result = $db->query(
|
|
'SELECT
|
|
(SELECT COUNT(*) FROM Devices '. getDeviceCondition ('all').') as devices,
|
|
(SELECT COUNT(*) FROM Devices '. getDeviceCondition ('connected').') as connected,
|
|
(SELECT COUNT(*) FROM Devices '. getDeviceCondition ('favorites').') as favorites,
|
|
(SELECT COUNT(*) FROM Devices '. getDeviceCondition ('new').') as new,
|
|
(SELECT COUNT(*) FROM Devices '. getDeviceCondition ('down').') as down,
|
|
(SELECT COUNT(*) FROM Devices '. getDeviceCondition ('archived').') as archived
|
|
');
|
|
|
|
$row = $result -> fetchArray (SQLITE3_NUM);
|
|
$resultJSON = json_encode (array ($row[0], $row[1], $row[2], $row[3], $row[4], $row[5]));
|
|
|
|
// save to cache
|
|
setCache("getDevicesTotals", $resultJSON );
|
|
}
|
|
|
|
echo ($resultJSON);
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Query the List of devices in a determined Status
|
|
//------------------------------------------------------------------------------
|
|
function getDevicesList() {
|
|
global $db;
|
|
|
|
// SQL
|
|
$condition = getDeviceCondition ($_REQUEST['status']);
|
|
|
|
$sql = 'SELECT rowid, *, CASE
|
|
WHEN dev_AlertDeviceDown=1 AND dev_PresentLastScan=0 THEN "Down"
|
|
WHEN dev_NewDevice=1 THEN "New"
|
|
WHEN dev_PresentLastScan=1 THEN "On-line"
|
|
ELSE "Off-line"
|
|
END AS dev_Status
|
|
FROM Devices '. $condition;
|
|
$result = $db->query($sql);
|
|
|
|
// arrays of rows
|
|
$tableData = array();
|
|
while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
|
$tableData['data'][] = array ($row['dev_Name'],
|
|
$row['dev_Owner'],
|
|
$row['dev_DeviceType'],
|
|
$row['dev_Favorite'],
|
|
$row['dev_Group'],
|
|
formatDate ($row['dev_FirstConnection']),
|
|
formatDate ($row['dev_LastConnection']),
|
|
$row['dev_LastIP'],
|
|
( in_array($row['dev_MAC'][1], array("2","6","A","E","a","e")) ? 1 : 0),
|
|
$row['dev_Status'],
|
|
$row['dev_MAC'], // MAC (hidden)
|
|
formatIPlong ($row['dev_LastIP']), // IP orderable
|
|
$row['rowid'] // Rowid (hidden)
|
|
);
|
|
}
|
|
|
|
// Control no rows
|
|
if (empty($tableData['data'])) {
|
|
$tableData['data'] = '';
|
|
}
|
|
|
|
// Return json
|
|
echo (json_encode ($tableData));
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// 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['dev_Favorite'] == 1) {
|
|
$row['dev_Name'] = '<span class="text-yellow">★</span> '. $row['dev_Name'];
|
|
}
|
|
|
|
$tableData[] = array ('id' => $row['dev_MAC'],
|
|
'title' => $row['dev_Name'],
|
|
'favorite' => $row['dev_Favorite']);
|
|
}
|
|
|
|
// Return json
|
|
echo (json_encode ($tableData));
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Query the List of Owners
|
|
//------------------------------------------------------------------------------
|
|
function getOwners() {
|
|
global $db;
|
|
|
|
// SQL
|
|
$sql = 'SELECT DISTINCT 1 as dev_Order, dev_Owner
|
|
FROM Devices
|
|
WHERE dev_Owner <> "(unknown)" AND dev_Owner <> ""
|
|
AND dev_Favorite = 1
|
|
UNION
|
|
SELECT DISTINCT 2 as dev_Order, dev_Owner
|
|
FROM Devices
|
|
WHERE dev_Owner <> "(unknown)" AND dev_Owner <> ""
|
|
AND dev_Favorite = 0
|
|
AND dev_Owner NOT IN
|
|
(SELECT dev_Owner FROM Devices WHERE dev_Favorite = 1)
|
|
ORDER BY 1,2 ';
|
|
$result = $db->query($sql);
|
|
|
|
// arrays of rows
|
|
$tableData = array();
|
|
while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
|
$tableData[] = array ('order' => $row['dev_Order'],
|
|
'name' => $row['dev_Owner']);
|
|
}
|
|
|
|
// Return json
|
|
echo (json_encode ($tableData));
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Query Device Data
|
|
//------------------------------------------------------------------------------
|
|
function getNetworkNodes() {
|
|
global $db;
|
|
|
|
// Device Data
|
|
$sql = 'SELECT * FROM Devices WHERE dev_DeviceType in ( "AP", "Gateway", "Powerline", "Switch", "WLAN", "PLC", "Router","USB LAN Adapter", "USB WIFI Adapter")';
|
|
|
|
$result = $db->query($sql);
|
|
|
|
// arrays of rows
|
|
$tableData = array();
|
|
while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
|
// Push row data
|
|
$tableData[] = array('id' => $row['dev_MAC'],
|
|
'name' => $row['dev_Name'] );
|
|
}
|
|
|
|
// Control no rows
|
|
if (empty($tableData)) {
|
|
$tableData = [];
|
|
}
|
|
|
|
// Return json
|
|
echo (json_encode ($tableData));
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Query the List of types
|
|
//------------------------------------------------------------------------------
|
|
function getDeviceTypes() {
|
|
global $db;
|
|
|
|
$networkTypes = getNetworkTypes();
|
|
|
|
// SQL
|
|
$sql = 'SELECT DISTINCT 9 as dev_Order, dev_DeviceType
|
|
FROM Devices
|
|
WHERE dev_DeviceType NOT IN ("",
|
|
"Smartphone", "Tablet",
|
|
"Laptop", "Mini PC", "PC", "Printer", "Server", "Singleboard Computer (SBC)", "NAS",
|
|
"Domotic", "IP Camera", "Game Console", "SmartTV", "TV Decoder", "Virtual Assistance",
|
|
"Clock", "House Appliance", "Phone", "Radio",
|
|
"AP", "Gateway", "Powerline", "Switch", "WLAN", "PLC", "Router","USB LAN Adapter", "USB WIFI Adapter" )
|
|
|
|
UNION SELECT 1 as dev_Order, "Smartphone"
|
|
UNION SELECT 1 as dev_Order, "Tablet"
|
|
|
|
UNION SELECT 2 as dev_Order, "Laptop"
|
|
UNION SELECT 2 as dev_Order, "Mini PC"
|
|
UNION SELECT 2 as dev_Order, "PC"
|
|
UNION SELECT 2 as dev_Order, "Printer"
|
|
UNION SELECT 2 as dev_Order, "Server"
|
|
UNION SELECT 2 as dev_Order, "Singleboard Computer (SBC)"
|
|
UNION SELECT 2 as dev_Order, "NAS"
|
|
|
|
UNION SELECT 3 as dev_Order, "Domotic"
|
|
UNION SELECT 3 as dev_Order, "IP Camera"
|
|
UNION SELECT 3 as dev_Order, "Game Console"
|
|
UNION SELECT 3 as dev_Order, "SmartTV"
|
|
UNION SELECT 3 as dev_Order, "TV Decoder"
|
|
UNION SELECT 3 as dev_Order, "Virtual Assistance"
|
|
|
|
UNION SELECT 4 as dev_Order, "Clock"
|
|
UNION SELECT 4 as dev_Order, "House Appliance"
|
|
UNION SELECT 4 as dev_Order, "Phone"
|
|
UNION SELECT 4 as dev_Order, "Radio"
|
|
|
|
-- network devices
|
|
UNION SELECT 5 as dev_Order, "AP"
|
|
UNION SELECT 5 as dev_Order, "Gateway"
|
|
UNION SELECT 5 as dev_Order, "Powerline"
|
|
UNION SELECT 5 as dev_Order, "Switch"
|
|
UNION SELECT 5 as dev_Order, "WLAN"
|
|
UNION SELECT 5 as dev_Order, "PLC"
|
|
UNION SELECT 5 as dev_Order, "Router"
|
|
UNION SELECT 5 as dev_Order, "USB LAN Adapter"
|
|
UNION SELECT 5 as dev_Order, "USB WIFI Adapter"
|
|
|
|
UNION SELECT 10 as dev_Order, "Other"
|
|
|
|
ORDER BY 1,2';
|
|
|
|
|
|
$result = $db->query($sql);
|
|
|
|
// arrays of rows
|
|
$tableData = array();
|
|
while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
|
$tableData[] = array ('order' => $row['dev_Order'],
|
|
'name' => $row['dev_DeviceType']);
|
|
}
|
|
|
|
// Return json
|
|
echo (json_encode ($tableData));
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
// Query the List of groups
|
|
//------------------------------------------------------------------------------
|
|
function getGroups() {
|
|
global $db;
|
|
|
|
// SQL
|
|
$sql = 'SELECT DISTINCT 1 as dev_Order, dev_Group
|
|
FROM Devices
|
|
WHERE dev_Group NOT IN ("(unknown)", "Others") AND dev_Group <> ""
|
|
UNION SELECT 1 as dev_Order, "Always on"
|
|
UNION SELECT 1 as dev_Order, "Friends"
|
|
UNION SELECT 1 as dev_Order, "Personal"
|
|
UNION SELECT 2 as dev_Order, "Others"
|
|
ORDER BY 1,2 ';
|
|
$result = $db->query($sql);
|
|
|
|
// arrays of rows
|
|
$tableData = array();
|
|
while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
|
$tableData[] = array ('order' => $row['dev_Order'],
|
|
'name' => $row['dev_Group']);
|
|
}
|
|
|
|
// Return json
|
|
echo (json_encode ($tableData));
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Query the List of locations
|
|
//------------------------------------------------------------------------------
|
|
function getLocations() {
|
|
global $db;
|
|
|
|
// SQL
|
|
$sql = 'SELECT DISTINCT 9 as dev_Order, dev_Location
|
|
FROM Devices
|
|
WHERE dev_Location <> ""
|
|
AND dev_Location NOT IN (
|
|
"Bathroom", "Bedroom", "Dining room", "Hallway",
|
|
"Kitchen", "Laundry", "Living room", "Study",
|
|
"Attic", "Basement", "Garage",
|
|
"Back yard", "Garden", "Terrace",
|
|
"Other")
|
|
|
|
UNION SELECT 1 as dev_Order, "Bathroom"
|
|
UNION SELECT 1 as dev_Order, "Bedroom"
|
|
UNION SELECT 1 as dev_Order, "Dining room"
|
|
UNION SELECT 1 as dev_Order, "Hall"
|
|
UNION SELECT 1 as dev_Order, "Kitchen"
|
|
UNION SELECT 1 as dev_Order, "Laundry"
|
|
UNION SELECT 1 as dev_Order, "Living room"
|
|
UNION SELECT 1 as dev_Order, "Study"
|
|
|
|
UNION SELECT 2 as dev_Order, "Attic"
|
|
UNION SELECT 2 as dev_Order, "Basement"
|
|
UNION SELECT 2 as dev_Order, "Garage"
|
|
|
|
UNION SELECT 3 as dev_Order, "Back yard"
|
|
UNION SELECT 3 as dev_Order, "Garden"
|
|
UNION SELECT 3 as dev_Order, "Terrace"
|
|
|
|
UNION SELECT 10 as dev_Order, "Other"
|
|
ORDER BY 1,2 ';
|
|
|
|
|
|
|
|
$result = $db->query($sql);
|
|
|
|
// arrays of rows
|
|
$tableData = array();
|
|
while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
|
$tableData[] = array ('order' => $row['dev_Order'],
|
|
'name' => $row['dev_Location']);
|
|
}
|
|
|
|
// Return json
|
|
echo (json_encode ($tableData));
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Status Where conditions
|
|
//------------------------------------------------------------------------------
|
|
function getDeviceCondition ($deviceStatus) {
|
|
switch ($deviceStatus) {
|
|
case 'all': return 'WHERE dev_Archived=0'; break;
|
|
case 'connected': return 'WHERE dev_Archived=0 AND dev_PresentLastScan=1'; break;
|
|
case 'favorites': return 'WHERE dev_Archived=0 AND dev_Favorite=1'; break;
|
|
case 'new': return 'WHERE dev_Archived=0 AND dev_NewDevice=1'; break;
|
|
case 'down': return 'WHERE dev_Archived=0 AND dev_AlertDeviceDown=1 AND dev_PresentLastScan=0'; break;
|
|
case 'archived': return 'WHERE dev_Archived=1'; break;
|
|
default: return 'WHERE 1=0'; break;
|
|
}
|
|
}
|
|
|
|
|
|
?>
|