Compare commits

...

28 Commits
v2.61 ... v2.70

Author SHA1 Message Date
pucherot
88f656ade5 tar update 2021-02-01 22:52:55 +01:00
pucherot
a23b619951 Update deviceDetails.php 2021-02-01 22:46:37 +01:00
pucherot
471b63dd83 Update pialert_update.sh 2021-02-01 22:35:49 +01:00
pucherot
1e8cf244be Update pialert_update.sh 2021-02-01 22:28:27 +01:00
pucherot
6ad34c0ace Update pialert_update.sh 2021-02-01 22:24:32 +01:00
pucherot
62b1c314d6 Update pialert_update.sh 2021-02-01 22:15:14 +01:00
pucherot
0e5c2af981 v2.70 2021-02-01 21:30:51 +01:00
pucherot
2955ac6535 Headers 2021-02-01 09:26:32 +01:00
pucherot
e694ed0a43 get Local IP 2021-01-28 13:59:34 +01:00
pucherot
933ca8d0d8 Update pialert_install.sh 2021-01-28 13:53:03 +01:00
pucherot
a86d5a6a69 tar update 2021-01-28 11:38:10 +01:00
pucherot
0d5e665c3a Update pialert_install.sh 2021-01-28 11:23:54 +01:00
pucherot
4ec1599b0e tar update 2021-01-27 17:59:51 +01:00
pucherot
31ab202744 Update pialert_update.sh 2021-01-27 17:09:25 +01:00
pucherot
42de9abfe3 tar update 2021-01-27 17:03:37 +01:00
pucherot
462c6613fc Update pialert_update.sh
bugfix #55
2021-01-27 17:02:07 +01:00
pucherot
119d648a93 tar update 2021-01-27 16:56:15 +01:00
pucherot
8eb09bd556 Update INSTALL.md 2021-01-27 13:41:39 +01:00
pucherot
2bd61aface Update INSTALL.md 2021-01-27 11:35:25 +01:00
pucherot
cf0df99bf1 Update process doc 2021-01-27 11:31:12 +01:00
pucherot
534b98feaa Create pialert_update.sh 2021-01-27 11:21:15 +01:00
pucherot
b5b51d428f Update pialert_install.sh 2021-01-26 17:25:36 +01:00
pucherot
a4eb028801 Update pialert_install.sh 2021-01-26 16:16:02 +01:00
pucherot
42b6e99ada Update pialert_install.sh 2021-01-26 15:09:52 +01:00
pucherot
4495d3f56c Update pialert_install.sh 2021-01-26 14:59:56 +01:00
pucherot
6963e98c28 Update pialert_install.sh 2021-01-26 14:54:03 +01:00
pucherot
56c97bc7af Update INSTALL.md 2021-01-26 10:13:41 +01:00
pucherot
c053aa2d01 Update pialert_install.sh 2021-01-26 10:10:12 +01:00
29 changed files with 2367 additions and 1676 deletions

View File

@@ -69,11 +69,19 @@ A web frontal that allows:
<!--- --------------------------------------------------------------------- --->
Initially designed to run on a Raspberry Pi, probably it can run on many other
Linux distributions.
- One-step Automated Install:
#### `curl -sSL https://github.com/pucherot/Pi.Alert/raw/main/install/pialert_install.sh | bash`
- [Installation Guide (step by step)](docs/INSTALL.md)
# Update
<!--- --------------------------------------------------------------------- --->
- One-step Automated Update:
#### `curl -sSL https://github.com/pucherot/Pi.Alert/raw/main/install/pialert_update.sh | bash`
## Device Management
<!--- --------------------------------------------------------------------- --->

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python
#
#-------------------------------------------------------------------------------
# Pi.Alert v2.61 / 2021-01-25
# Pi.Alert v2.70 / 2021-02-01
# Open Source Network Guard / WIFI & LAN intrusion detector
#
# pialert.py - Back module. Network scanner
@@ -398,6 +398,10 @@ def scan_network ():
print (' Updating Devices Info...')
update_devices_data_from_scan ()
# Resolve devices names
print_log (' Resolve devices names...')
update_devices_names()
# Void false connection - disconnections
print (' Voiding false (ghost) disconnections...')
void_ghost_disconnections ()
@@ -905,6 +909,78 @@ def update_devices_data_from_scan ():
print_log ('Update devices end')
#-------------------------------------------------------------------------------
# Feature #43 - Resoltion name for unknown devices
def update_devices_names ():
# Initialize variables
recordsToUpdate = []
ignored = 0
notFound = 0
# Devices without name
print (' Trying to resolve devices without name...', end='')
for device in sql.execute ("SELECT * FROM Devices WHERE dev_Name IN ('(unknown)','') ") :
# Resolve device name
newName = resolve_device_name (device['dev_MAC'], device['dev_LastIP'])
if newName == -1 :
notFound += 1
elif newName == -2 :
ignored += 1
else :
recordsToUpdate.append ([newName, device['dev_MAC']])
# progress bar
print ('.', end='')
sys.stdout.flush()
# Print log
print ('')
print (" Names updated: ", len(recordsToUpdate) )
# DEBUG - print list of record to update
# print (recordsToUpdate)
# update devices
sql.executemany ("UPDATE Devices SET dev_Name = ? WHERE dev_MAC = ? ", recordsToUpdate )
# DEBUG - print number of rows updated
# print (sql.rowcount)
#-------------------------------------------------------------------------------
def resolve_device_name (pMAC, pIP):
try :
pMACstr = str(pMAC)
# Check MAC parameter
mac = pMACstr.replace (':','')
if len(pMACstr) != 17 or len(mac) != 12 :
return -2
# Resolve name with DIG
dig_args = ['dig', '+short', '-x', pIP]
newName = subprocess.check_output (dig_args, universal_newlines=True)
# Check if Eliminate local domain
newName = newName.strip()
if len(newName) == 0 :
return -2
# Eliminate local domain
if newName.endswith('.') :
newName = newName[:-1]
if newName.endswith('.lan') :
newName = newName[:-4]
if newName.endswith('.local') :
newName = newName[:-6]
if newName.endswith('.home') :
newName = newName[:-5]
# Return newName
return newName
# not Found
except subprocess.CalledProcessError :
return -1
#-------------------------------------------------------------------------------
def void_ghost_disconnections ():
# Void connect ghost events (disconnect event exists in last X min.)

View File

@@ -3,7 +3,7 @@
# Pi.Alert
# Open Source Network Guard / WIFI & LAN intrusion detector
#
# vendors_db_update.sh - Back module. IEEE Vendors db update
# update_vendors.sh - Back module. IEEE Vendors db update
# ------------------------------------------------------------------------------
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3
# ------------------------------------------------------------------------------

View File

@@ -1,3 +1,3 @@
VERSION = '2.61'
VERSION = '2.70'
VERSION_YEAR = '2021'
VERSION_DATE = '2021-01-25'
VERSION_DATE = '2021-02-01'

Binary file not shown.

View File

@@ -14,18 +14,23 @@ Estimated time: 20'
| dnsmasq | Optional. Scan Method 3. Check devices using DHCP server |
| IEEE HW DB | Necessary to identified Device vendor |
# One-step Automated Install:
## One-step Automated Install:
<!--- --------------------------------------------------------------------- --->
### `curl -sSL https://github.com/pucherot/Pi.Alert/raw/main/install/pialert_install.sh | bash`
`curl -sSL https://github.com/pucherot/Pi.Alert/raw/main/install/pialert_install.sh | bash`
# Installation process (step by step)
## One-step Automated Update:
<!--- --------------------------------------------------------------------- --->
`curl -sSL https://github.com/pucherot/Pi.Alert/raw/main/install/pialert_update.sh | bash`
## Installation process (step by step)
<!--- --------------------------------------------------------------------- --->
## Raspberry Setup
### Raspberry Setup
<!--- --------------------------------------------------------------------- --->
1.1 - Install 'Raspberry Pi OS'
- Instructions https://www.raspberrypi.org/documentation/installation/installing-images/
- *Lite version (without Descktop) is enough for Pi.Alert*
- *Lite version (without Desktop) is enough for Pi.Alert*
1.2 - Activate ssh
- Create a empty file with name 'ssh' in the boot partition of the SD
@@ -58,7 +63,7 @@ Estimated time: 20'
```
## Pi-hole Setup (optional)
### Pi-hole Setup (optional)
<!--- --------------------------------------------------------------------- --->
2.1 - Links & Doc
- https://pi-hole.net/
@@ -83,6 +88,11 @@ Estimated time: 20'
```
hostname -I
```
or this one if have severals interfaces
```
ip -o route get 1 | sed -n 's/.*src \([0-9.]\+\).*/\1/p'
```
- http://192.168.1.x/admin/
- (*replace 192.168.1.x with your Raspberry IP*)
@@ -93,11 +103,16 @@ Estimated time: 20'
```
hostname -I
```
or this one if have severals interfaces
```
ip -o route get 1 | sed -n 's/.*src \([0-9.]\+\).*/\1/p'
```
- Pi-hole admin portal -> Local DNS -> DNS Records -> Add new domain /IP
- pi.alert 192.168.1.x
- (*replace 192.168.1.x with your Raspberry IP*)
2.8 - Deactivate your current DHCP Server (*Normaly at your router or AP*)
2.8 - Deactivate your current DHCP Server (*usually at your router or AP*)
2.9 - Renew your computer IP to unsure you are using the new DHCP and DNS server
- Windows: cmd -> ipconfig /renew
@@ -106,7 +121,7 @@ Estimated time: 20'
-> Advanced -> TCP/IP -> Renew DHCP Lease
## Lighttpd & PHP
### Lighttpd & PHP
<!--- --------------------------------------------------------------------- --->
If you have installed Pi.hole, lighttpd and PHP are already installed and this
block is not necessary
@@ -135,7 +150,7 @@ block is not necessary
```
## arp-scan & Python
### arp-scan & Python
<!--- --------------------------------------------------------------------- --->
4.1 - Install arp-scan utility and test
```
@@ -143,7 +158,12 @@ block is not necessary
sudo arp-scan -l
```
4.2 - Test Python
4.2 - Install dnsutils utility
```
sudo apt-get install dnsutils -y
```
4.3 - Test Python
New versions of 'Raspberry Pi OS' includes Python. You can check that
Python is installed with the command:
@@ -161,7 +181,7 @@ block is not necessary
python3 -V
```
4.3 - If Python is not installed in your system, you can install it with this
4.4 - If Python is not installed in your system, you can install it with this
command:
```
sudo apt-get install python
@@ -171,7 +191,7 @@ block is not necessary
sudo apt-get install python3
```
## Pi.Alert
### Pi.Alert
<!--- --------------------------------------------------------------------- --->
5.1 - Download Pi.Alert and uncompress
```
@@ -278,6 +298,10 @@ block is not necessary
```
hostname -I
```
or this one if have severals interfaces
```
ip -o route get 1 | sed -n 's/.*src \([0-9.]\+\).*/\1/p'
```
- Pi-hole admin portal -> Local DNS -> DNS Records -> Add new domain /IP
- pi.alert 192.168.1.x
- (*replace 192.168.1.x with your Raspberry IP*)
@@ -288,7 +312,7 @@ block is not necessary
- (*replace 192.168.1.x with your Raspberry IP*)
## Device Management
### Device Management
<!--- --------------------------------------------------------------------- --->
- [Device Management instructions](./DEVICE_MANAGEMENT.md)

View File

@@ -3,6 +3,8 @@
| Version | Description |
| ------- | --------------------------------------------------------------- |
| v2.70 | New features & Usability improvements in the web prontal |
| v2.61 | Bug fixing |
| v2.60 | Improved the compability of installation process (Ubuntu) |
| v2.56 | Bug fixing |
| v2.55 | Bug fixing |
@@ -11,6 +13,21 @@
| v2.50 | First public release |
## Pi.Alert v2.70
<!--- --------------------------------------------------------------------- --->
- Added Client names resolution #43
- Added Check to mark devices as "known" #16
- Remember "Show XXX entries" dropdown value #16 #26
- Remember "sorting" in devices #16
- Remember "Device panel " in device detail #16
- Added "All" option to "Show x Entries" option #16
- Added optional Location field (Door, Basement, etc.) to devices #16
- "Device updated successfully" message now is not modal #16
- Now is possible to delete Devices #16
- Added Device Type Singleboard Computer (SBC) #16
- Allowed to use " in device name #42
## Pi.Alert v2.60
<!--- --------------------------------------------------------------------- --->
- `pialert.conf` moved from `back` to `config` folder

View File

@@ -1,6 +1,11 @@
/*******************************************************************************
* Pi.alert CSS
*******************************************************************************/
/* -----------------------------------------------------------------------------
# Pi.Alert
# Open Source Network Guard / WIFI & LAN intrusion detector
#
# pialert.css - Front module. CSS styles
#-------------------------------------------------------------------------------
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3
----------------------------------------------------------------------------- */
/* -----------------------------------------------------------------------------
Global Variables
@@ -371,3 +376,28 @@
z-index: 100;
}
/* -----------------------------------------------------------------------------
Notification float banner
----------------------------------------------------------------------------- */
.pa_alert_notification {
text-align: center;
font-size: large;
font-weight: bold;
color: #258744;
background-color: #d4edda;
border-color: #c3e6cb;
border-radius: 5px;
max-width: 1000px; /* 80% wrapper 1250px */
width: 80%;
z-index: 9999;
position: fixed;
top: 30px;
margin: auto;
transform: translate(0,0);
display: none;
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,12 @@
<!-- ----------------------------------------------------------------------- -->
<!-- ---------------------------------------------------------------------------
# Pi.Alert
# Open Source Network Guard / WIFI & LAN intrusion detector
#
# devices.php - Front module. Devices list page
#-------------------------------------------------------------------------------
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3
#--------------------------------------------------------------------------- -->
<?php
require 'php/templates/header.php';
?>
@@ -11,102 +19,73 @@
<h1 id="pageTitle">
Devices
</h1>
<!-- period selector -->
<span class="breadcrumb text-gray50">
New Devices period:
<select id="period" onchange="javascript: periodChanged();">
<option value="1 day">Today</option>
<option value="7 days">Last Week</option>
<option value="1 month" selected>Last Month</option>
<option value="1 year">Last Year</option>
<option value="100 years">All info</option>
</select>
</span>
</section>
<!-- Main content ---------------------------------------------------------- -->
<section class="content">
<!-- top small box 1 ------------------------------------------------------- -->
<div class="row">
<!-- top small box --------------------------------------------------------- -->
<div class="col-lg-3 col-sm-6 col-xs-6">
<a href="#" onclick="javascript: queryList('all');">
<a href="#" onclick="javascript: getDevicesList('all');">
<div class="small-box bg-aqua pa-small-box-aqua">
<div class="inner">
<div class="inner">
<h4>Total Devices</h4>
<h3 id="devicesAll"> -- </h3>
</div>
</div>
<div class="icon">
<i class="fa fa-laptop"></i>
</div>
<div class="small-box-footer">
Details <i class="fa fa-arrow-circle-right"></i>
</div>
<div class="icon"> <i class="fa fa-laptop"></i> </div>
<div class="small-box-footer"> Details <i class="fa fa-arrow-circle-right"></i> </div>
</div>
</a>
</div>
<!-- top small box --------------------------------------------------------- -->
<!-- top small box 2 ------------------------------------------------------- -->
<div class="col-lg-3 col-sm-6 col-xs-6">
<a href="#" onclick="javascript: queryList('connected');">
<a href="#" onclick="javascript: getDevicesList('connected');">
<div class="small-box bg-green pa-small-box-green">
<div class="inner">
<div class="inner">
<h4>Connected</h4>
<h3 id="devicesConnected"> -- </h3>
</div>
</div>
<div class="icon">
<i class="fa fa-plug"></i>
</div>
<div class="small-box-footer">
Details <i class="fa fa-arrow-circle-right"></i>
</div>
<div class="icon"> <i class="fa fa-plug"></i> </div>
<div class="small-box-footer"> Details <i class="fa fa-arrow-circle-right"></i> </div>
</div>
</a>
</div>
<!-- top small box --------------------------------------------------------- -->
<!-- top small box 3 ------------------------------------------------------- -->
<div class="col-lg-3 col-sm-6 col-xs-6">
<a href="#" onclick="javascript: queryList('new');">
<a href="#" onclick="javascript: getDevicesList('new');">
<div class="small-box bg-yellow pa-small-box-yellow">
<div class="inner">
<div class="inner">
<h4>New Devices</h4>
<h3 id="devicesNew"> -- </h3>
</div>
</div>
<div class="icon">
<i class="ion ion-plus-round"></i>
</div>
<div class="small-box-footer">
Details <i class="fa fa-arrow-circle-right"></i>
</div>
<div class="icon"> <i class="ion ion-plus-round"></i> </div>
<div class="small-box-footer"> Details <i class="fa fa-arrow-circle-right"></i> </div>
</div>
</a>
</div>
<!-- top small box --------------------------------------------------------- -->
<!-- top small box 4 ------------------------------------------------------- -->
<div class="col-lg-3 col-sm-6 col-xs-6">
<a href="#" onclick="javascript: queryList('down');">
<a href="#" onclick="javascript: getDevicesList('down');">
<div class="small-box bg-red pa-small-box-red">
<div class="inner">
<div class="inner">
<h4>Down Alerts</h4>
<h3 id="devicesDown"> -- </h3>
</div>
</div>
<div class="icon">
<i class="fa fa-warning"></i>
</div>
<div class="small-box-footer">
Details <i class="fa fa-arrow-circle-right"></i>
</div>
<div class="icon"> <i class="fa fa-warning"></i> </div>
<div class="small-box-footer"> Details <i class="fa fa-arrow-circle-right"></i> </div>
</div>
</a>
</div>
@@ -118,10 +97,13 @@
<div class="row">
<div class="col-xs-12">
<div id="tableDevicesBox" class="box">
<!-- box-header -->
<div class="box-header">
<h3 id="tableDevicesTitle" class="box-title text-gray">Devices</h3>
</div>
<!-- /.box-header -->
<!-- table -->
<div class="box-body table-responsive">
<table id="tableDevices" class="table table-bordered table-hover table-striped">
<thead>
@@ -142,6 +124,7 @@
</table>
</div>
<!-- /.box-body -->
</div>
<!-- /.box -->
</div>
@@ -171,45 +154,59 @@
<!-- page script ----------------------------------------------------------- -->
<script>
var deviceStatus = 'all';
var parTableRows = 'Front_Devices_Rows';
var parTableOrder = 'Front_Devices_Order';
var tableRows = 10;
var tableOrder = [[3,'desc'], [0,'asc']];
// Read parameters & Initialize components
main();
// -----------------------------------------------------------------------------
var deviceStatus = '';
var period = '';
// Initialize MAC
var urlParams = new URLSearchParams(window.location.search);
if (urlParams.has ('status') == true) {
deviceStatus = urlParams.get ('status');
} else {
deviceStatus = 'all';
function main () {
// get parameter value
$.get('php/server/parameters.php?action=get&parameter='+ parTableRows, function(data) {
var result = JSON.parse(data);
if (Number.isInteger (result) ) {
tableRows = result;
}
// Initialize components
$(function () {
// get parameter value
$.get('php/server/parameters.php?action=get&parameter='+ parTableOrder, function(data) {
var result = JSON.parse(data);
result = JSON.parse(result);
if (Array.isArray (result) ) {
tableOrder = result;
}
// Initialize components with parameters
initializeDatatable();
periodChanged();
// query data
getDevicesTotals();
getDevicesList (deviceStatus);
});
});
// -----------------------------------------------------------------------------
function periodChanged () {
// Requery totals and list
queryTotals();
queryList (deviceStatus);
}
// -----------------------------------------------------------------------------
function initializeDatatable () {
var table=
$('#tableDevices').DataTable({
'paging' : true,
'lengthChange' : true,
'lengthMenu' : [[10, 25, 50, 100, 500, -1], [10, 25, 50, 100, 500, 'All']],
'searching' : true,
'ordering' : true,
'info' : true,
'autoWidth' : false,
'order' : [[3,"desc"], [0,"asc"]],
// Parameters
'pageLength' : tableRows,
'order' : tableOrder,
// 'order' : [[3,'desc'], [0,'asc']],
'columnDefs' : [
{visible: false, targets: [9, 10] },
@@ -219,13 +216,13 @@ function initializeDatatable () {
// Device Name
{targets: [0],
"createdCell": function (td, cellData, rowData, row, col) {
$(td).html ('<b><a href="deviceDetails.php?mac='+ rowData[9]+ '&period='+ period +'" class="">'+ cellData +'</a></b>');
'createdCell': function (td, cellData, rowData, row, col) {
$(td).html ('<b><a href="deviceDetails.php?mac='+ rowData[9] +'" class="">'+ cellData +'</a></b>');
} },
// Favorite
{targets: [3],
"createdCell": function (td, cellData, rowData, row, col) {
'createdCell': function (td, cellData, rowData, row, col) {
if (cellData == 1){
$(td).html ('<i class="fa fa-star text-yellow" style="font-size:16px"></i>');
} else {
@@ -235,105 +232,87 @@ function initializeDatatable () {
// Dates
{targets: [5, 6],
"createdCell": function (td, cellData, rowData, row, col) {
'createdCell': function (td, cellData, rowData, row, col) {
$(td).html (translateHTMLcodes (cellData));
} },
// Status color
{targets: [8],
"createdCell": function (td, cellData, rowData, row, col) {
'createdCell': function (td, cellData, rowData, row, col) {
switch (cellData) {
case 'Down':
color='red'; break;
case 'New':
color='yellow'; break;
case 'On-line':
color='green'; break;
case 'Off-line':
color='gray text-white'; break;
default:
color='aqua'; break;
case 'Down': color='red'; break;
case 'New': color='yellow'; break;
case 'On-line': color='green'; break;
case 'Off-line': color='gray text-white'; break;
default: color='aqua'; break;
};
$(td).html ('<a href="deviceDetails.php?mac='+ rowData[9]+ '&period='+ period +'" class="badge bg-'+ color +'">'+ cellData +'</a>');
$(td).html ('<a href="deviceDetails.php?mac='+ rowData[9] +'" class="badge bg-'+ color +'">'+ cellData +'</a>');
} },
],
// Processing
'processing' : true,
'language' : {
processing: '<table> <td width="130px" align="middle">Loading...</td><td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw"></td> </table>',
emptyTable: 'No data'
}
});
// Save Parameters rows & order when changed
$('#tableDevices').on( 'length.dt', function ( e, settings, len ) {
setParameter (parTableRows, len);
} );
$('#tableDevices').on( 'order.dt', function () {
setParameter (parTableOrder, JSON.stringify (table.order()) );
} );
};
// -----------------------------------------------------------------------------
function queryTotals () {
// debugTimer();
function getDevicesTotals () {
// stop timer
stopTimerRefreshData();
// period
period = document.getElementById('period').value;
// get totals and put in boxes
$.get('php/server/devices.php?action=totals&period='+ period, function(data) {
$.get('php/server/devices.php?action=getDevicesTotals', function(data) {
var totalsDevices = JSON.parse(data);
$('#devicesAll').html (totalsDevices[0].toLocaleString());
$('#devicesConnected').html (totalsDevices[1].toLocaleString());
$('#devicesNew').html (totalsDevices[2].toLocaleString());
$('#devicesDown').html (totalsDevices[3].toLocaleString());
});
// Timer for refresh data
newTimerRefreshData (queryTotals);
newTimerRefreshData (getDevicesTotals);
} );
}
// -----------------------------------------------------------------------------
function queryList (status) {
// Save status and period selected
function getDevicesList (status) {
// Save status selected
deviceStatus = status;
period = document.getElementById('period').value;
// Defini color & title for the status selected
// Define color & title for the status selected
switch (deviceStatus) {
case 'all':
tableTitle = 'Total Devices';
color = 'aqua';
break;
case 'connected':
tableTitle = 'Connected Devices';
color = 'green';
break;
case 'new':
tableTitle = 'New Devices';
color = 'yellow';
break;
case 'down':
tableTitle = 'Down Alerts';
color = 'red';
break;
case 'favorites':
tableTitle = 'Favorites';
color = 'yellow';
break;
default:
tableTitle = 'Devices';
boxClass = '';
break;
case 'all': tableTitle = 'Total Devices'; color = 'aqua'; break;
case 'connected': tableTitle = 'Connected Devices'; color = 'green'; break;
case 'new': tableTitle = 'New Devices'; color = 'yellow'; break;
case 'down': tableTitle = 'Down Alerts'; color = 'red'; break;
case 'favorites': tableTitle = 'Favorites'; color = 'yellow'; break;
default: tableTitle = 'Devices'; boxClass = ''; break;
}
// Set title and color
document.getElementById('tableDevicesTitle').className = 'box-title text-' + color;
document.getElementById('tableDevicesBox').className = 'box box-' + color;
$('#tableDevicesTitle')[0].className = 'box-title text-'+ color;
$('#tableDevicesBox')[0].className = 'box box-'+ color;
$('#tableDevicesTitle').html (tableTitle);
// Define new datasource URL and reload
$('#tableDevices').DataTable().ajax.url('php/server/devices.php?action=list&status=' + deviceStatus +'&period='+ period ).load();
$('#tableDevices').DataTable().ajax.url(
'php/server/devices.php?action=getDevicesList&status=' + deviceStatus).load();
};
</script>

View File

@@ -1,4 +1,12 @@
<!-- ----------------------------------------------------------------------- -->
<!-- ---------------------------------------------------------------------------
# Pi.Alert
# Open Source Network Guard / WIFI & LAN intrusion detector
#
# events.php - Front module. Events page
#-------------------------------------------------------------------------------
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3
#--------------------------------------------------------------------------- -->
<?php
require 'php/templates/header.php';
?>
@@ -13,9 +21,8 @@
</h1>
<!-- period selector -->
<span class="breadcrumb text-gray50">
Events period:
<select id="period" onchange="javascript: periodChanged();">
<span class="breadcrumb" style="top: 0px;">
<select class="form-control" id="period" onchange="javascript: periodChanged();">
<option value="1 day">Today</option>
<option value="7 days">Last Week</option>
<option value="1 month" selected>Last Month</option>
@@ -23,126 +30,81 @@
<option value="100 years">All info</option>
</select>
</span>
</section>
<!-- Main content ---------------------------------------------------------- -->
<section class="content">
<!-- top small box --------------------------------------------------------- -->
<div class="row">
<!-- top small box --------------------------------------------------------- -->
<div class="col-lg-2 col-sm-4 col-xs-6">
<a href="#" onclick="javascript: queryList('all');">
<a href="#" onclick="javascript: getEvents('all');">
<div class="small-box bg-aqua pa-small-box-aqua pa-small-box-2">
<div class="inner">
<div class="inner"> <h3 id="eventsAll"> -- </h3> </div>
<div class="icon"> <i class="fa fa-bolt text-aqua-20"></i> </div>
<h3 id="eventsAll"> -- </h3>
</div>
<div class="icon">
<i class="fa fa-bolt text-aqua-20"></i>
</div>
<div class="small-box-footer">
All events <i class="fa fa-arrow-circle-right"></i>
</div>
<div class="small-box-footer"> All events <i class="fa fa-arrow-circle-right"></i> </div>
</div>
</a>
</div>
<!-- top small box --------------------------------------------------------- -->
<div class="col-lg-2 col-sm-4 col-xs-6">
<a href="#" onclick="javascript: queryList('sessions');">
<a href="#" onclick="javascript: getEvents('sessions');">
<div class="small-box bg-green pa-small-box-green pa-small-box-2">
<div class="inner">
<div class="inner"> <h3 id="eventsSessions"> -- </h3> </div>
<div class="icon"> <i class="fa fa-plug text-green-20"></i> </div>
<h3 id="eventsSessions"> -- </h3>
</div>
<div class="icon">
<i class="fa fa-plug text-green-20"></i>
</div>
<div class="small-box-footer">
Sessions <i class="fa fa-arrow-circle-right"></i>
</div>
<div class="small-box-footer"> Sessions <i class="fa fa-arrow-circle-right"></i> </div>
</div>
</a>
</div>
<!-- top small box --------------------------------------------------------- -->
<div class="col-lg-2 col-sm-4 col-xs-6">
<a href="#" onclick="javascript: queryList('missing');">
<a href="#" onclick="javascript: getEvents('missing');">
<div class="small-box bg-yellow pa-small-box-yellow pa-small-box-2">
<div class="inner">
<div class="inner"> <h3 id="eventsMissing"> -- </h3> </div>
<div class="icon"> <i class="fa fa-exchange text-yellow-20"></i> </div>
<h3 id="eventsMissing"> -- </h3>
</div>
<div class="icon">
<i class="fa fa-exchange text-yellow-20"></i>
</div>
<div class="small-box-footer">
Missing Sessions <i class="fa fa-arrow-circle-right"></i>
</div>
<div class="small-box-footer"> Missing Sessions <i class="fa fa-arrow-circle-right"></i> </div>
</div>
</a>
</div>
<!-- top small box --------------------------------------------------------- -->
<div class="col-lg-2 col-sm-4 col-xs-6">
<a href="#" onclick="javascript: queryList('voided');">
<a href="#" onclick="javascript: getEvents('voided');">
<div class="small-box bg-yellow pa-small-box-yellow pa-small-box-2">
<div class="inner">
<div class="inner"> <h3 id="eventsVoided"> -- </h3> </div>
<div class="icon text-aqua-20"> <i class="fa fa-exclamation-circle text-yellow-20"></i> </div>
<h3 id="eventsVoided"> -- </h3>
</div>
<div class="icon text-aqua-20">
<i class="fa fa-exclamation-circle text-yellow-20"></i>
</div>
<div class="small-box-footer">
Voided Sessions <i class="fa fa-arrow-circle-right"></i>
</div>
<div class="small-box-footer"> Voided Sessions <i class="fa fa-arrow-circle-right"></i> </div>
</div>
</a>
</div>
<!-- top small box --------------------------------------------------------- -->
<div class="col-lg-2 col-sm-4 col-xs-6">
<a href="#" onclick="javascript: queryList('new');">
<a href="#" onclick="javascript: getEvents('new');">
<div class="small-box bg-yellow pa-small-box-yellow pa-small-box-2">
<div class="inner">
<div class="inner"> <h3 id="eventsNewDevices"> -- </h3> </div>
<div class="icon"> <i class="ion ion-plus-round text-yellow-20"></i> </div>
<h3 id="eventsNewDevices"> -- </h3>
</div>
<div class="icon">
<i class="ion ion-plus-round text-yellow-20"></i>
</div>
<div class="small-box-footer">
New Devices <i class="fa fa-arrow-circle-right"></i>
</div>
<div class="small-box-footer"> New Devices <i class="fa fa-arrow-circle-right"></i> </div>
</div>
</a>
</div>
<!-- top small box --------------------------------------------------------- -->
<div class="col-lg-2 col-sm-4 col-xs-6">
<a href="#" onclick="javascript: queryList('down');">
<a href="#" onclick="javascript: getEvents('down');">
<div class="small-box bg-red pa-small-box-red pa-small-box-2">
<div class="inner">
<div class="inner"> <h3 id="eventsDown"> -- </h3> </div>
<div class="icon"> <i class="fa fa-warning text-red-20"></i> </div>
<h3 id="eventsDown"> -- </h3>
</div>
<div class="icon">
<i class="fa fa-warning text-red-20"></i>
</div>
<div class="small-box-footer">
Down Alerts <i class="fa fa-arrow-circle-right"></i>
</div>
<div class="small-box-footer"> Down Alerts <i class="fa fa-arrow-circle-right"></i> </div>
</div>
</a>
</div>
@@ -154,10 +116,13 @@
<div class="row">
<div class="col-xs-12">
<div id="tableEventsBox" class="box">
<!-- box-header -->
<div class="box-header">
<h3 id="tableEventsTitle" class="box-title text-gray">Events</h3>
</div>
<!-- /.box-header -->
<!-- table -->
<div class="box-body table-responsive">
<table id="tableEvents" class="table table-bordered table-hover table-striped ">
<thead>
@@ -179,6 +144,7 @@
</table>
</div>
<!-- /.box-body -->
</div>
<!-- /.box -->
</div>
@@ -208,31 +174,42 @@
<!-- page script ----------------------------------------------------------- -->
<script>
var parPeriod = 'Front_Events_Period';
var parTableRows = 'Front_Events_Rows';
var eventsType = 'all';
var period = '';
var tableRows = 10;
// Read parameters & Initialize components
main();
// -----------------------------------------------------------------------------
var eventsType = '';
var period = '';
function main () {
// get parameter value
$.get('php/server/parameters.php?action=get&parameter='+ parPeriod, function(data) {
var result = JSON.parse(data);
if (result) {
period = result;
$('#period').val(period);
}
// Initialize MAC
var urlParams = new URLSearchParams(window.location.search);
if (urlParams.has ('status') == true) {
eventsType = urlParams.get ('type');
} else {
eventsType = 'all';
// get parameter value
$.get('php/server/parameters.php?action=get&parameter='+ parTableRows, function(data) {
var result = JSON.parse(data);
if (Number.isInteger (result) ) {
tableRows = result;
}
// Initialize components
$(function () {
initializeDatatable();
periodChanged();
// query data
getEventsTotals();
getEvents (eventsType);
});
});
// -----------------------------------------------------------------------------
function periodChanged () {
// Requery totals and list
queryTotals();
queryList (eventsType);
}
@@ -241,13 +218,16 @@ function initializeDatatable () {
$('#tableEvents').DataTable({
'paging' : true,
'lengthChange' : true,
'lengthMenu' : [[10, 25, 50, 100, 500, -1], [10, 25, 50, 100, 500, 'All']],
'searching' : true,
'ordering' : true,
'info' : true,
'autoWidth' : false,
'order' : [[0,"desc"], [3,"desc"], [5,"desc"]],
// Parameters
'pageLength' : tableRows,
'columnDefs' : [
{visible: false, targets: [0,5,6,7,8,10] },
{className: 'text-center', targets: [] },
@@ -257,7 +237,7 @@ function initializeDatatable () {
// Device Name
{targets: [1],
"createdCell": function (td, cellData, rowData, row, col) {
$(td).html ('<b><a href="deviceDetails.php?mac='+ rowData[13]+ '&period='+ period +'" class="">'+ cellData +'</a></b>');
$(td).html ('<b><a href="deviceDetails.php?mac='+ rowData[13] +'" class="">'+ cellData +'</a></b>');
} },
// Replace HTML codes
@@ -267,27 +247,40 @@ function initializeDatatable () {
} }
],
// Processing
'processing' : true,
'language' : {
processing: '<table><td width="130px" align="middle">Loading...</td><td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw"></td></table>',
emptyTable: 'No data'
}
});
// Save Parameter rows when changed
$('#tableEvents').on( 'length.dt', function ( e, settings, len ) {
setParameter (parTableRows, len);
} );
};
// -----------------------------------------------------------------------------
function queryTotals () {
// debugTimer();
function periodChanged () {
// Save Parameter Period
period = $('#period').val();
setParameter (parPeriod, period);
// Requery totals and events
getEventsTotals();
getEvents (eventsType);
}
// -----------------------------------------------------------------------------
function getEventsTotals () {
// stop timer
stopTimerRefreshData();
// period
period = document.getElementById('period').value;
// get totals and put in boxes
$.get('php/server/events.php?action=totals&period='+ period, function(data) {
$.get('php/server/events.php?action=getEventsTotals&period='+ period, function(data) {
var totalsEvents = JSON.parse(data);
$('#eventsAll').html (totalsEvents[0].toLocaleString());
@@ -296,57 +289,32 @@ function queryTotals () {
$('#eventsVoided').html (totalsEvents[3].toLocaleString());
$('#eventsNewDevices').html (totalsEvents[4].toLocaleString());
$('#eventsDown').html (totalsEvents[5].toLocaleString());
});
// Timer for refresh data
newTimerRefreshData (queryTotals);
newTimerRefreshData (getEventsTotals);
});
}
// -----------------------------------------------------------------------------
function queryList (p_eventsType) {
// Save status and period selected
function getEvents (p_eventsType) {
// Save status selected
eventsType = p_eventsType;
period = document.getElementById('period').value;
// Define color & title for the status selected
sesionCols = false;
switch (eventsType) {
case 'all':
tableTitle = 'All Events';
color = 'aqua';
break;
case 'sessions':
tableTitle = 'Sessions';
color = 'green';
sesionCols = true;
break;
case 'missing':
tableTitle = 'Missing Events';
color = 'yellow';
sesionCols = true;
break;
case 'voided':
tableTitle = 'Voided Events';
color = 'yellow';
break;
case 'new':
tableTitle = 'New Devices Events';
color = 'yellow';
break;
case 'down':
tableTitle = 'Down Alerts';
color = 'red';
break;
default:
tableTitle = 'Events';
boxClass = '';
break;
case 'all': tableTitle = 'All Events'; color = 'aqua'; sesionCols = false; break;
case 'sessions': tableTitle = 'Sessions'; color = 'green'; sesionCols = true; break;
case 'missing': tableTitle = 'Missing Events'; color = 'yellow'; sesionCols = true; break;
case 'voided': tableTitle = 'Voided Events'; color = 'yellow'; sesionCols = false; break;
case 'new': tableTitle = 'New Devices Events'; color = 'yellow'; sesionCols = false; break;
case 'down': tableTitle = 'Down Alerts'; color = 'red'; sesionCols = false; break;
default: tableTitle = 'Events'; boxClass = ''; sesionCols = false; break;
}
// Set title and color
document.getElementById('tableEventsTitle').className = 'box-title text-' + color;
document.getElementById('tableEventsBox').className = 'box box-' + color;
$('#tableEventsTitle')[0].className = 'box-title text-' + color;
$('#tableEventsBox')[0].className = 'box box-' + color;
$('#tableEventsTitle').html (tableTitle);
// Coluumns Visibility
@@ -360,7 +328,7 @@ function queryList (p_eventsType) {
$('#tableEvents').DataTable().clear();
$('#tableEvents').DataTable().draw();
$('#tableEvents').DataTable().order ([0,"desc"], [3,"desc"], [5,"desc"]);
$('#tableEvents').DataTable().ajax.url('php/server/events.php?action=list&type=' + eventsType +'&period='+ period ).load();
$('#tableEvents').DataTable().ajax.url('php/server/events.php?action=getEvents&type=' + eventsType +'&period='+ period ).load();
};
</script>

View File

@@ -1,4 +1,12 @@
<!-- ----------------------------------------------------------------------- -->
<!-- ---------------------------------------------------------------------------
# Pi.Alert
# Open Source Network Guard / WIFI & LAN intrusion detector
#
# devices.php - Front module. Devices list page
#-------------------------------------------------------------------------------
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3
#--------------------------------------------------------------------------- -->
<?php
require 'php/templates/header.php';
?>
@@ -11,102 +19,73 @@
<h1 id="pageTitle">
Devices
</h1>
<!-- period selector -->
<span class="breadcrumb text-gray50">
New Devices period:
<select id="period" onchange="javascript: periodChanged();">
<option value="1 day">Today</option>
<option value="7 days">Last Week</option>
<option value="1 month" selected>Last Month</option>
<option value="1 year">Last Year</option>
<option value="100 years">All info</option>
</select>
</span>
</section>
<!-- Main content ---------------------------------------------------------- -->
<section class="content">
<!-- top small box 1 ------------------------------------------------------- -->
<div class="row">
<!-- top small box --------------------------------------------------------- -->
<div class="col-lg-3 col-sm-6 col-xs-6">
<a href="#" onclick="javascript: queryList('all');">
<a href="#" onclick="javascript: getDevicesList('all');">
<div class="small-box bg-aqua pa-small-box-aqua">
<div class="inner">
<div class="inner">
<h4>Total Devices</h4>
<h3 id="devicesAll"> -- </h3>
</div>
</div>
<div class="icon">
<i class="fa fa-laptop"></i>
</div>
<div class="small-box-footer">
Details <i class="fa fa-arrow-circle-right"></i>
</div>
<div class="icon"> <i class="fa fa-laptop"></i> </div>
<div class="small-box-footer"> Details <i class="fa fa-arrow-circle-right"></i> </div>
</div>
</a>
</div>
<!-- top small box --------------------------------------------------------- -->
<!-- top small box 2 ------------------------------------------------------- -->
<div class="col-lg-3 col-sm-6 col-xs-6">
<a href="#" onclick="javascript: queryList('connected');">
<a href="#" onclick="javascript: getDevicesList('connected');">
<div class="small-box bg-green pa-small-box-green">
<div class="inner">
<div class="inner">
<h4>Connected</h4>
<h3 id="devicesConnected"> -- </h3>
</div>
</div>
<div class="icon">
<i class="fa fa-plug"></i>
</div>
<div class="small-box-footer">
Details <i class="fa fa-arrow-circle-right"></i>
</div>
<div class="icon"> <i class="fa fa-plug"></i> </div>
<div class="small-box-footer"> Details <i class="fa fa-arrow-circle-right"></i> </div>
</div>
</a>
</div>
<!-- top small box --------------------------------------------------------- -->
<!-- top small box 3 ------------------------------------------------------- -->
<div class="col-lg-3 col-sm-6 col-xs-6">
<a href="#" onclick="javascript: queryList('new');">
<a href="#" onclick="javascript: getDevicesList('new');">
<div class="small-box bg-yellow pa-small-box-yellow">
<div class="inner">
<div class="inner">
<h4>New Devices</h4>
<h3 id="devicesNew"> -- </h3>
</div>
</div>
<div class="icon">
<i class="ion ion-plus-round"></i>
</div>
<div class="small-box-footer">
Details <i class="fa fa-arrow-circle-right"></i>
</div>
<div class="icon"> <i class="ion ion-plus-round"></i> </div>
<div class="small-box-footer"> Details <i class="fa fa-arrow-circle-right"></i> </div>
</div>
</a>
</div>
<!-- top small box --------------------------------------------------------- -->
<!-- top small box 4 ------------------------------------------------------- -->
<div class="col-lg-3 col-sm-6 col-xs-6">
<a href="#" onclick="javascript: queryList('down');">
<a href="#" onclick="javascript: getDevicesList('down');">
<div class="small-box bg-red pa-small-box-red">
<div class="inner">
<div class="inner">
<h4>Down Alerts</h4>
<h3 id="devicesDown"> -- </h3>
</div>
</div>
<div class="icon">
<i class="fa fa-warning"></i>
</div>
<div class="small-box-footer">
Details <i class="fa fa-arrow-circle-right"></i>
</div>
<div class="icon"> <i class="fa fa-warning"></i> </div>
<div class="small-box-footer"> Details <i class="fa fa-arrow-circle-right"></i> </div>
</div>
</a>
</div>
@@ -118,10 +97,13 @@
<div class="row">
<div class="col-xs-12">
<div id="tableDevicesBox" class="box">
<!-- box-header -->
<div class="box-header">
<h3 id="tableDevicesTitle" class="box-title text-gray">Devices</h3>
</div>
<!-- /.box-header -->
<!-- table -->
<div class="box-body table-responsive">
<table id="tableDevices" class="table table-bordered table-hover table-striped">
<thead>
@@ -142,6 +124,7 @@
</table>
</div>
<!-- /.box-body -->
</div>
<!-- /.box -->
</div>
@@ -171,45 +154,59 @@
<!-- page script ----------------------------------------------------------- -->
<script>
var deviceStatus = 'all';
var parTableRows = 'Front_Devices_Rows';
var parTableOrder = 'Front_Devices_Order';
var tableRows = 10;
var tableOrder = [[3,'desc'], [0,'asc']];
// Read parameters & Initialize components
main();
// -----------------------------------------------------------------------------
var deviceStatus = '';
var period = '';
// Initialize MAC
var urlParams = new URLSearchParams(window.location.search);
if (urlParams.has ('status') == true) {
deviceStatus = urlParams.get ('status');
} else {
deviceStatus = 'all';
function main () {
// get parameter value
$.get('php/server/parameters.php?action=get&parameter='+ parTableRows, function(data) {
var result = JSON.parse(data);
if (Number.isInteger (result) ) {
tableRows = result;
}
// Initialize components
$(function () {
// get parameter value
$.get('php/server/parameters.php?action=get&parameter='+ parTableOrder, function(data) {
var result = JSON.parse(data);
result = JSON.parse(result);
if (Array.isArray (result) ) {
tableOrder = result;
}
// Initialize components with parameters
initializeDatatable();
periodChanged();
// query data
getDevicesTotals();
getDevicesList (deviceStatus);
});
});
// -----------------------------------------------------------------------------
function periodChanged () {
// Requery totals and list
queryTotals();
queryList (deviceStatus);
}
// -----------------------------------------------------------------------------
function initializeDatatable () {
var table=
$('#tableDevices').DataTable({
'paging' : true,
'lengthChange' : true,
'lengthMenu' : [[10, 25, 50, 100, 500, -1], [10, 25, 50, 100, 500, 'All']],
'searching' : true,
'ordering' : true,
'info' : true,
'autoWidth' : false,
'order' : [[3,"desc"], [0,"asc"]],
// Parameters
'pageLength' : tableRows,
'order' : tableOrder,
// 'order' : [[3,'desc'], [0,'asc']],
'columnDefs' : [
{visible: false, targets: [9, 10] },
@@ -219,13 +216,13 @@ function initializeDatatable () {
// Device Name
{targets: [0],
"createdCell": function (td, cellData, rowData, row, col) {
$(td).html ('<b><a href="deviceDetails.php?mac='+ rowData[9]+ '&period='+ period +'" class="">'+ cellData +'</a></b>');
'createdCell': function (td, cellData, rowData, row, col) {
$(td).html ('<b><a href="deviceDetails.php?mac='+ rowData[9] +'" class="">'+ cellData +'</a></b>');
} },
// Favorite
{targets: [3],
"createdCell": function (td, cellData, rowData, row, col) {
'createdCell': function (td, cellData, rowData, row, col) {
if (cellData == 1){
$(td).html ('<i class="fa fa-star text-yellow" style="font-size:16px"></i>');
} else {
@@ -235,105 +232,87 @@ function initializeDatatable () {
// Dates
{targets: [5, 6],
"createdCell": function (td, cellData, rowData, row, col) {
'createdCell': function (td, cellData, rowData, row, col) {
$(td).html (translateHTMLcodes (cellData));
} },
// Status color
{targets: [8],
"createdCell": function (td, cellData, rowData, row, col) {
'createdCell': function (td, cellData, rowData, row, col) {
switch (cellData) {
case 'Down':
color='red'; break;
case 'New':
color='yellow'; break;
case 'On-line':
color='green'; break;
case 'Off-line':
color='gray text-white'; break;
default:
color='aqua'; break;
case 'Down': color='red'; break;
case 'New': color='yellow'; break;
case 'On-line': color='green'; break;
case 'Off-line': color='gray text-white'; break;
default: color='aqua'; break;
};
$(td).html ('<a href="deviceDetails.php?mac='+ rowData[9]+ '&period='+ period +'" class="badge bg-'+ color +'">'+ cellData +'</a>');
$(td).html ('<a href="deviceDetails.php?mac='+ rowData[9] +'" class="badge bg-'+ color +'">'+ cellData +'</a>');
} },
],
// Processing
'processing' : true,
'language' : {
processing: '<table> <td width="130px" align="middle">Loading...</td><td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw"></td> </table>',
emptyTable: 'No data'
}
});
// Save Parameters rows & order when changed
$('#tableDevices').on( 'length.dt', function ( e, settings, len ) {
setParameter (parTableRows, len);
} );
$('#tableDevices').on( 'order.dt', function () {
setParameter (parTableOrder, JSON.stringify (table.order()) );
} );
};
// -----------------------------------------------------------------------------
function queryTotals () {
// debugTimer();
function getDevicesTotals () {
// stop timer
stopTimerRefreshData();
// period
period = document.getElementById('period').value;
// get totals and put in boxes
$.get('php/server/devices.php?action=totals&period='+ period, function(data) {
$.get('php/server/devices.php?action=getDevicesTotals', function(data) {
var totalsDevices = JSON.parse(data);
$('#devicesAll').html (totalsDevices[0].toLocaleString());
$('#devicesConnected').html (totalsDevices[1].toLocaleString());
$('#devicesNew').html (totalsDevices[2].toLocaleString());
$('#devicesDown').html (totalsDevices[3].toLocaleString());
});
// Timer for refresh data
newTimerRefreshData (queryTotals);
newTimerRefreshData (getDevicesTotals);
} );
}
// -----------------------------------------------------------------------------
function queryList (status) {
// Save status and period selected
function getDevicesList (status) {
// Save status selected
deviceStatus = status;
period = document.getElementById('period').value;
// Defini color & title for the status selected
// Define color & title for the status selected
switch (deviceStatus) {
case 'all':
tableTitle = 'Total Devices';
color = 'aqua';
break;
case 'connected':
tableTitle = 'Connected Devices';
color = 'green';
break;
case 'new':
tableTitle = 'New Devices';
color = 'yellow';
break;
case 'down':
tableTitle = 'Down Alerts';
color = 'red';
break;
case 'favorites':
tableTitle = 'Favorites';
color = 'yellow';
break;
default:
tableTitle = 'Devices';
boxClass = '';
break;
case 'all': tableTitle = 'Total Devices'; color = 'aqua'; break;
case 'connected': tableTitle = 'Connected Devices'; color = 'green'; break;
case 'new': tableTitle = 'New Devices'; color = 'yellow'; break;
case 'down': tableTitle = 'Down Alerts'; color = 'red'; break;
case 'favorites': tableTitle = 'Favorites'; color = 'yellow'; break;
default: tableTitle = 'Devices'; boxClass = ''; break;
}
// Set title and color
document.getElementById('tableDevicesTitle').className = 'box-title text-' + color;
document.getElementById('tableDevicesBox').className = 'box box-' + color;
$('#tableDevicesTitle')[0].className = 'box-title text-'+ color;
$('#tableDevicesBox')[0].className = 'box box-'+ color;
$('#tableDevicesTitle').html (tableTitle);
// Define new datasource URL and reload
$('#tableDevices').DataTable().ajax.url('php/server/devices.php?action=list&status=' + deviceStatus +'&period='+ period ).load();
$('#tableDevices').DataTable().ajax.url(
'php/server/devices.php?action=getDevicesList&status=' + deviceStatus).load();
};
</script>

View File

@@ -1,9 +1,89 @@
/* -----------------------------------------------------------------------------
Pi.Alert Common Javascript functions
* Pi.Alert
* Open Source Network Guard / WIFI & LAN intrusion detector
*
* pialert_common.js - Front module. Common Javascript functions
*-------------------------------------------------------------------------------
* Puche 2021 pi.alert.application@gmail.com GNU GPLv3
----------------------------------------------------------------------------- */
// -----------------------------------------------------------------------------
var timerRefreshData = ''
var modalCallbackFunction = '';
// -----------------------------------------------------------------------------
function showModal (title, message, btnCancel, btnOK, callbackFunction) {
// set captions
$('#modal-title').html (title);
$('#modal-message').html (message);
$('#modal-cancel').html (btnCancel);
$('#modal-OK').html (btnOK);
modalCallbackFunction = callbackFunction;
// Show modal
$('#modal-warning').modal('show');
}
// -----------------------------------------------------------------------------
function modalOK () {
// Hide modal
$('#modal-warning').modal('hide');
// timer to execute function
window.setTimeout( function() {
window[modalCallbackFunction]();
}, 100);
}
// -----------------------------------------------------------------------------
function showMessage (textMessage="") {
if (textMessage.toLowerCase().includes("error") ) {
// show error
alert (textMessage);
} else {
// show temporal notification
$("#alert-message").html (textMessage);
$("#notification").fadeIn(1, function () {
window.setTimeout( function() {
$("#notification").fadeOut(500)
}, 3000);
} );
}
}
// -----------------------------------------------------------------------------
function setParameter (parameter, value) {
// Retry
$.get('php/server/parameters.php?action=set&parameter=' + parameter +
'&value='+ value,
function(data) {
if (data != "OK") {
// Retry
sleep (200);
$.get('php/server/parameters.php?action=set&parameter=' + parameter +
'&value='+ value,
function(data) {
if (data != "OK") {
// alert (data);
} else {
// alert ("OK. Second attempt");
};
} );
};
} );
}
// -----------------------------------------------------------------------------
function sleep(milliseconds) {
const date = Date.now();
let currentDate = null;
do {
currentDate = Date.now();
} while (currentDate - date < milliseconds);
}
// -----------------------------------------------------------------------------
@@ -35,5 +115,7 @@ function newTimerRefreshData (refeshFunction) {
// -----------------------------------------------------------------------------
function debugTimer () {
document.getElementById ('pageTitle').innerHTML = (new Date().getSeconds());
$('#pageTitle').html (new Date().getSeconds());
}

View File

@@ -1,11 +1,19 @@
<?php
//------------------------------------------------------------------------------
// PHP Open DB
// Pi.Alert
// Open Source Network Guard / WIFI & LAN intrusion detector
//
// db.php - Front module. Server side. DB common file
//------------------------------------------------------------------------------
// Puche 2021 pi.alert.application@gmail.com GNU GPLv3
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// DB File Path
$DBFILE = '../../../db/pialert.db';
//------------------------------------------------------------------------------
// Connect DB
//------------------------------------------------------------------------------
@@ -39,7 +47,7 @@ function OpenDB () {
if(strlen($DBFILE) == 0)
{
die ('No database available');
die ('Database no available');
}
$db = SQLite3_connect(true);

View File

@@ -1,14 +1,25 @@
<?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
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// External files
require 'db.php';
require 'util.php';
//------------------------------------------------------------------------------
// Action selector
//------------------------------------------------------------------------------
// Set maximum execution time to 1 minute
ini_set ('max_execution_time','60');
// Set maximum execution time to 15 seconds
ini_set ('max_execution_time','15');
// Open DB
OpenDB();
@@ -17,23 +28,152 @@
if (isset ($_REQUEST['action']) && !empty ($_REQUEST['action'])) {
$action = $_REQUEST['action'];
switch ($action) {
case 'totals': queryTotals(); break;
case 'list': queryList(); break;
case 'queryDeviceData': queryDeviceData(); break;
case 'updateData': updateDeviceData(); break;
case 'calendar': queryCalendarList(); break;
case 'queryOwners': queryOwners(); break;
case 'queryDeviceTypes': queryDeviceTypes(); break;
case 'queryGroups': queryGroups(); break;
case 'getDeviceData': getDeviceData(); break;
case 'setDeviceData': setDeviceData(); break;
case 'deleteDevice': deleteDevice(); 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 *,
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 .'"';
$result = $db->query($sql);
$row = $result -> fetchArray (SQLITE3_ASSOC);
$deviceData = $row;
$deviceData['dev_FirstConnection'] = formatDate ($row['dev_FirstConnection']); // Date formated
$deviceData['dev_LastConnection'] = formatDate ($row['dev_LastConnection']); // Date formated
// 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];
// Donw 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];
// Presence hours
$sql = 'SELECT SUM (julianday (IFNULL (ses_DateTimeDisconnection, DATETIME("now")))
- julianday (CASE WHEN ses_DateTimeConnection < '. $periodDate .' THEN '. $periodDate .'
ELSE ses_DateTimeConnection END)) *24
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;
// 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_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']) .'"
WHERE dev_MAC="' . $_REQUEST['mac'] .'"';
// update Data
$result = $db->query($sql);
// check result
if ($result == TRUE) {
echo "Device updated successfully";
} else {
echo "Error updating device\n\n$sql \n\n". $db->lastErrorMsg();
}
}
//------------------------------------------------------------------------------
// Delete Device
//------------------------------------------------------------------------------
function deleteDevice() {
global $db;
// sql
$sql = 'DELETE FROM Devices WHERE dev_MAC="' . $_REQUEST['mac'] .'"';
// execute sql
$result = $db->query($sql);
// check result
if ($result == TRUE) {
echo "Device deleted successfully";
} else {
echo "Error deleting device\n\n$sql \n\n". $db->lastErrorMsg();
}
}
//------------------------------------------------------------------------------
// Query total numbers of Devices by status
//------------------------------------------------------------------------------
function queryTotals() {
function getDevicesTotals() {
global $db;
// All
@@ -56,29 +196,28 @@ function queryTotals() {
$row = $result -> fetchArray (SQLITE3_NUM);
$devicesDownAlert = $row[0];
echo (json_encode (array ($devices, $connected, $newDevices, $devicesDownAlert)));
echo (json_encode (array ($devices, $connected, $newDevices,
$devicesDownAlert)));
}
//------------------------------------------------------------------------------
// Query the List of devices in a determined Status
//------------------------------------------------------------------------------
function queryList() {
function getDevicesList() {
global $db;
// Request Parameters
$periodDate = getDateFromPeriod();
// SQL
$condition = getDeviceCondition ($_REQUEST['status']);
$result = $db->query('SELECT *,
CASE WHEN dev_AlertDeviceDown=1 AND dev_PresentLastScan=0 THEN "Down"
WHEN dev_FirstConnection >= ' . $periodDate . ' THEN "New"
$sql = 'SELECT *, 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);
FROM Devices '. $condition;
$result = $db->query($sql);
// arrays of rows
$tableData = array();
@@ -106,130 +245,13 @@ function queryList() {
echo (json_encode ($tableData));
}
//------------------------------------------------------------------------------
// Query the List of Owners
//------------------------------------------------------------------------------
function queryOwners() {
global $db;
// SQL
$result = $db->query('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 ');
// 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 the List of types
//------------------------------------------------------------------------------
function queryDeviceTypes() {
global $db;
// SQL
$result = $db->query('SELECT DISTINCT 9 as dev_Order, dev_DeviceType
FROM Devices
WHERE dev_DeviceType NOT IN ("",
"Smartphone", "Tablet",
"Laptop", "Mini PC", "PC", "Printer", "Server",
"Game Console", "SmartTV", "TV Decoder", "Virtual Assistance",
"Clock", "House Appliance", "Phone", "Radio",
"AP", "NAS", "PLC", "Router")
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 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"
UNION SELECT 5 as dev_Order, "AP"
UNION SELECT 5 as dev_Order, "NAS"
UNION SELECT 5 as dev_Order, "PLC"
UNION SELECT 5 as dev_Order, "Router"
UNION SELECT 10 as dev_Order, "Other"
ORDER BY 1,2 ');
// 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 queryGroups() {
global $db;
// SQL
$result = $db->query('SELECT DISTINCT 1 as dev_Order, dev_Group
FROM Devices
WHERE dev_Group <> "(unknown)" AND dev_Group <> "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 ');
// 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 devices for calendar
//------------------------------------------------------------------------------
function queryCalendarList() {
function getDevicesListCalendar() {
global $db;
// Request Parameters
$periodDate = getDateFromPeriod();
// SQL
$condition = getDeviceCondition ($_REQUEST['status']);
$result = $db->query('SELECT * FROM Devices ' . $condition);
@@ -252,67 +274,175 @@ function queryCalendarList() {
//------------------------------------------------------------------------------
// Query Device Data
// Query the List of Owners
//------------------------------------------------------------------------------
function queryDeviceData() {
function getOwners() {
global $db;
// Request Parameters
$periodDate = getDateFromPeriod();
$mac = $_REQUEST['mac'];
// Device Data
$result = $db->query('SELECT *,
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
// SQL
$sql = 'SELECT DISTINCT 1 as dev_Order, dev_Owner
FROM Devices
WHERE dev_MAC="' . $mac .'"');
$row = $result -> fetchArray (SQLITE3_ASSOC);
$deviceData = $row;
$deviceData['dev_FirstConnection'] = formatDate ($row['dev_FirstConnection']); // Date formated
$deviceData['dev_LastConnection'] = formatDate ($row['dev_LastConnection']); // Date formated
// Count Totals
$condicion = ' WHERE eve_MAC="' . $mac .'" AND eve_DateTime >= ' . $periodDate;
// Connections
$result = $db->query('SELECT COUNT(*) FROM Sessions
WHERE ses_MAC="' . $mac .'"
AND ( ses_DateTimeConnection >= ' . $periodDate . '
OR ses_DateTimeDisconnection >= ' . $periodDate . '
OR ses_StillConnected = 1 ) ');
$row = $result -> fetchArray (SQLITE3_NUM);
$deviceData['dev_Sessions'] = $row[0];
// Events
$result = $db->query('SELECT COUNT(*) FROM Events ' . $condicion . ' AND eve_EventType <> "Connected" AND eve_EventType <> "Disconnected" ');
$row = $result -> fetchArray (SQLITE3_NUM);
$deviceData['dev_Events'] = $row[0];
// Donw Alerts
$result = $db->query('SELECT COUNT(*) FROM Events ' . $condicion . ' AND eve_EventType = "Device Down"');
$row = $result -> fetchArray (SQLITE3_NUM);
$deviceData['dev_DownAlerts'] = $row[0];
// Presence hours
$result = $db->query('SELECT SUM (julianday (IFNULL (ses_DateTimeDisconnection, DATETIME("now")))
- julianday (CASE WHEN ses_DateTimeConnection < ' . $periodDate . ' THEN ' . $periodDate . '
ELSE ses_DateTimeConnection END)) *24
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 ) ');
$row = $result -> fetchArray (SQLITE3_NUM);
$deviceData['dev_PresenceHours'] = round ($row[0]);
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 ($deviceData));
echo (json_encode ($tableData));
}
//------------------------------------------------------------------------------
// Query the List of types
//------------------------------------------------------------------------------
function getDeviceTypes() {
global $db;
// 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)",
"Game Console", "SmartTV", "TV Decoder", "Virtual Assistance",
"Clock", "House Appliance", "Phone", "Radio",
"AP", "NAS", "PLC", "Router")
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 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"
UNION SELECT 5 as dev_Order, "AP"
UNION SELECT 5 as dev_Order, "NAS"
UNION SELECT 5 as dev_Order, "PLC"
UNION SELECT 5 as dev_Order, "Router"
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));
}
@@ -320,58 +450,14 @@ function queryDeviceData() {
// Status Where conditions
//------------------------------------------------------------------------------
function getDeviceCondition ($deviceStatus) {
// Request Parameters
$periodDate = getDateFromPeriod();
switch ($deviceStatus) {
case 'all':
return '';
case 'connected':
return 'WHERE dev_PresentLastScan=1';
case 'new':
return 'WHERE dev_FirstConnection >= ' . $periodDate;
case 'down':
return 'WHERE dev_AlertDeviceDown=1 AND dev_PresentLastScan=0';
case 'favorites':
return 'WHERE dev_Favorite=1';
default:
return 'WHERE 1=0';
case 'all': return ''; break;
case 'connected': return 'WHERE dev_PresentLastScan=1'; break;
case 'new': return 'WHERE dev_NewDevice=1'; break;
case 'down': return 'WHERE dev_AlertDeviceDown=1 AND dev_PresentLastScan=0'; break;
case 'favorites': return 'WHERE dev_Favorite=1'; break;
default: return 'WHERE 1=0'; break;
}
}
//------------------------------------------------------------------------------
// Update Device Data
//------------------------------------------------------------------------------
function updateDeviceData() {
global $db;
// sql
$sql = 'UPDATE Devices SET
dev_Name = "'. $_REQUEST['name'] .'",
dev_Owner = "'. $_REQUEST['owner'] .'",
dev_DeviceType = "'. $_REQUEST['type'] .'",
dev_Vendor = "'. $_REQUEST['vendor'] .'",
dev_Favorite = "'. $_REQUEST['favorite'] .'",
dev_Group = "'. $_REQUEST['group'] .'",
dev_Comments = "'. $_REQUEST['comments'] .'",
dev_StaticIP = "'. $_REQUEST['staticIP'] .'",
dev_ScanCycle = "'. $_REQUEST['scancycle'] .'",
dev_AlertEvents = "'. $_REQUEST['alertevents'] .'",
dev_AlertDeviceDown = "'. $_REQUEST['alertdown'] .'",
dev_SkipRepeated = "'. $_REQUEST['skiprepeated'] .'"
WHERE dev_MAC="' . $_REQUEST['mac'] .'"';
// update Data
$result = $db->query($sql);
// check result
if ($result == TRUE) {
echo "Device updated successfully";
} else {
echo "Error updating device\n\n". $sql .'\n\n' . $db->lastErrorMsg();
}
}
?>

View File

@@ -1,9 +1,20 @@
<?php
//------------------------------------------------------------------------------
// Pi.Alert
// Open Source Network Guard / WIFI & LAN intrusion detector
//
// events.php - Front module. Server side. Manage Events
//------------------------------------------------------------------------------
// Puche 2021 pi.alert.application@gmail.com GNU GPLv3
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// External files
require 'db.php';
require 'util.php';
//------------------------------------------------------------------------------
// Action selector
//------------------------------------------------------------------------------
@@ -17,12 +28,12 @@
if (isset ($_REQUEST['action']) && !empty ($_REQUEST['action'])) {
$action = $_REQUEST['action'];
switch ($action) {
case 'totals': queryTotals(); break;
case 'list': queryList(); break;
case 'deviceSessions': queryDeviceSessions(); break;
case 'devicePresence': queryDevicePresence(); break;
case 'deviceEvents': queryDeviceEvents(); break;
case 'calendarPresence': queryCalendarPresence(); break;
case 'getEventsTotals': getEventsTotals(); break;
case 'getEvents': getEvents(); break;
case 'getDeviceSessions': getDeviceSessions(); break;
case 'getDevicePresence': getDevicePresence(); break;
case 'getDeviceEvents': getDeviceEvents(); break;
case 'getEventsCalendar': getEventsCalendar(); break;
default: logServerConsole ('Action: '. $action); break;
}
}
@@ -31,7 +42,7 @@
//------------------------------------------------------------------------------
// Query total numbers of Events
//------------------------------------------------------------------------------
function queryTotals() {
function getEventsTotals() {
global $db;
// Request Parameters
@@ -86,7 +97,7 @@ function queryTotals() {
//------------------------------------------------------------------------------
// Query the List of events
//------------------------------------------------------------------------------
function queryList() {
function getEvents() {
global $db;
// Request Parameters
@@ -104,30 +115,18 @@ function queryList() {
// SQL Variations for status
switch ($type) {
case 'all':
$SQL = $SQL1;
break;
case 'all': $SQL = $SQL1; break;
case 'sessions':
$SQL = $SQL2 . ' WHERE ( ses_DateTimeConnection >= '. $periodDate .'
OR ses_DateTimeDisconnection >= '. $periodDate .'
OR ses_StillConnected = 1 ) ';
$SQL = $SQL2 . ' WHERE ( ses_DateTimeConnection >= '. $periodDate .' OR ses_DateTimeDisconnection >= '. $periodDate .' OR ses_StillConnected = 1 ) ';
break;
case 'missing':
$SQL = $SQL2 . ' WHERE (ses_DateTimeConnection IS NULL AND ses_DateTimeDisconnection >= '. $periodDate .' )
OR (ses_DateTimeDisconnection IS NULL AND ses_StillConnected = 0 AND ses_DateTimeConnection >= '. $periodDate .' )';
break;
case 'voided':
$SQL = $SQL1 .' AND eve_EventType LIKE "VOIDED%" ';
break;
case 'new':
$SQL = $SQL1 .' AND eve_EventType = "New Device" ';
break;
case 'down':
$SQL = $SQL1 .' AND eve_EventType = "Device Down" ';
break;
default:
$SQL = $SQL1 .' AND 1==0 ';
break;
case 'voided': $SQL = $SQL1 .' AND eve_EventType LIKE "VOIDED%" '; break;
case 'new': $SQL = $SQL1 .' AND eve_EventType = "New Device" '; break;
case 'down': $SQL = $SQL1 .' AND eve_EventType = "Device Down" '; break;
default: $SQL = $SQL1 .' AND 1==0 '; break;
}
// Query
@@ -187,7 +186,7 @@ function queryList() {
//------------------------------------------------------------------------------
// Query Device Sessions
//------------------------------------------------------------------------------
function queryDeviceSessions() {
function getDeviceSessions() {
global $db;
// Request Parameters
@@ -195,7 +194,7 @@ function queryDeviceSessions() {
$periodDate = getDateFromPeriod();
// SQL
$result = $db->query('SELECT IFNULL (ses_DateTimeConnection, ses_DateTimeDisconnection) ses_DateTimeOrder,
$SQL = 'SELECT IFNULL (ses_DateTimeConnection, ses_DateTimeDisconnection) ses_DateTimeOrder,
ses_EventTypeConnection, ses_DateTimeConnection,
ses_EventTypeDisconnection, ses_DateTimeDisconnection, ses_StillConnected,
ses_IP, ses_AdditionalInfo
@@ -203,7 +202,8 @@ function queryDeviceSessions() {
WHERE ses_MAC="' . $mac .'"
AND ( ses_DateTimeConnection >= '. $periodDate .'
OR ses_DateTimeDisconnection >= '. $periodDate .'
OR ses_StillConnected = 1 ) ');
OR ses_StillConnected = 1 ) ';
$result = $db->query($SQL);
// arrays of rows
$tableData = array();
@@ -228,7 +228,7 @@ function queryDeviceSessions() {
if ($row['ses_EventTypeConnection'] == '<missing event>' || $row['ses_EventTypeDisconnection'] == '<missing event>') {
$dur = '...';
} elseif ($row['ses_StillConnected'] == true) {
$dur = formatDateDiff ($row['ses_DateTimeConnection'], ''); //*******************************************************************************************
$dur = formatDateDiff ($row['ses_DateTimeConnection'], ''); //***********
} else {
$dur = formatDateDiff ($row['ses_DateTimeConnection'], $row['ses_DateTimeDisconnection']);
}
@@ -256,7 +256,7 @@ function queryDeviceSessions() {
//------------------------------------------------------------------------------
// Query Device Presence Calendar
//------------------------------------------------------------------------------
function queryDevicePresence() {
function getDevicePresence() {
global $db;
// Request Parameters
@@ -266,15 +266,17 @@ function queryDevicePresence() {
$endDate = '"'. formatDateISO ($_REQUEST ['end']) .'"';
// SQL
$result = $db->query('SELECT ses_EventTypeConnection, ses_DateTimeConnection,
$SQL = 'SELECT ses_EventTypeConnection, ses_DateTimeConnection,
ses_EventTypeDisconnection, ses_DateTimeDisconnection, ses_IP, ses_AdditionalInfo,
CASE WHEN ses_EventTypeConnection = "<missing event>" THEN
CASE
WHEN ses_EventTypeConnection = "<missing event>" THEN
IFNULL ((SELECT MAX(ses_DateTimeDisconnection) FROM Sessions AS SES2 WHERE SES2.ses_MAC = SES1.ses_MAC AND SES2.ses_DateTimeDisconnection < SES1.ses_DateTimeDisconnection), DATETIME(ses_DateTimeDisconnection, "-1 hour"))
ELSE ses_DateTimeConnection
END AS ses_DateTimeConnectionCorrected,
CASE WHEN ses_EventTypeDisconnection = "<missing event>" THEN
CASE
WHEN ses_EventTypeDisconnection = "<missing event>" THEN
(SELECT MIN(ses_DateTimeConnection) FROM Sessions AS SES2 WHERE SES2.ses_MAC = SES1.ses_MAC AND SES2.ses_DateTimeConnection > SES1.ses_DateTimeConnection)
ELSE ses_DateTimeDisconnection
END AS ses_DateTimeDisconnectionCorrected
@@ -282,8 +284,8 @@ function queryDevicePresence() {
FROM Sessions AS SES1
WHERE ses_MAC="' . $mac .'"
AND (ses_DateTimeConnectionCorrected <= date('. $endDate .')
AND (ses_DateTimeDisconnectionCorrected >= date('. $startDate .') OR ses_StillConnected = 1 ))
');
AND (ses_DateTimeDisconnectionCorrected >= date('. $startDate .') OR ses_StillConnected = 1 )) ';
$result = $db->query($SQL);
// arrays of rows
while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
@@ -300,10 +302,6 @@ function queryDevicePresence() {
'IP: ' . $row['ses_IP'];
// Save row data
// 'start' => formatDateISO ($row['ses_DateTimeConnectionCorrected']),
// 'end' => formatDateISO ($row['ses_DateTimeDisconnectionCorrected']),
// 'start' => $row['ses_DateTimeConnectionCorrected'],
// 'end' => $row['ses_DateTimeDisconnectionCorrected'],
$tableData[] = array(
'title' => '',
'start' => formatDateISO ($row['ses_DateTimeConnectionCorrected']),
@@ -326,32 +324,33 @@ function queryDevicePresence() {
//------------------------------------------------------------------------------
// Query Presence Calendar for all Devices
//------------------------------------------------------------------------------
function queryCalendarPresence() {
function getEventsCalendar() {
global $db;
// Request Parameters
$periodDate = getDateFromPeriod();
$startDate = '"'. $_REQUEST ['start'] .'"';
$endDate = '"'. $_REQUEST ['end'] .'"';
// SQL
$result = $db->query('SELECT ses_MAC, ses_EventTypeConnection, ses_DateTimeConnection,
$SQL = 'SELECT ses_MAC, ses_EventTypeConnection, ses_DateTimeConnection,
ses_EventTypeDisconnection, ses_DateTimeDisconnection, ses_IP, ses_AdditionalInfo,
CASE WHEN ses_EventTypeConnection = "<missing event>" THEN
CASE
WHEN ses_EventTypeConnection = "<missing event>" THEN
IFNULL ((SELECT MAX(ses_DateTimeDisconnection) FROM Sessions AS SES2 WHERE SES2.ses_MAC = SES1.ses_MAC AND SES2.ses_DateTimeDisconnection < SES1.ses_DateTimeDisconnection), DATETIME(ses_DateTimeDisconnection, "-1 hour"))
ELSE ses_DateTimeConnection
END AS ses_DateTimeConnectionCorrected,
CASE WHEN ses_EventTypeDisconnection = "<missing event>" THEN
CASE
WHEN ses_EventTypeDisconnection = "<missing event>" THEN
(SELECT MIN(ses_DateTimeConnection) FROM Sessions AS SES2 WHERE SES2.ses_MAC = SES1.ses_MAC AND SES2.ses_DateTimeConnection > SES1.ses_DateTimeConnection)
ELSE ses_DateTimeDisconnection
END AS ses_DateTimeDisconnectionCorrected
FROM Sessions AS SES1
WHERE ( ses_DateTimeConnectionCorrected <= Date('. $endDate .')
AND (ses_DateTimeDisconnectionCorrected >= Date('. $startDate .') OR ses_StillConnected = 1 ))
');
AND (ses_DateTimeDisconnectionCorrected >= Date('. $startDate .') OR ses_StillConnected = 1 )) ';
$result = $db->query($SQL);
// arrays of rows
while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
@@ -392,7 +391,7 @@ function queryCalendarPresence() {
//------------------------------------------------------------------------------
// Query Device events
//------------------------------------------------------------------------------
function queryDeviceEvents() {
function getDeviceEvents() {
global $db;
// Request Parameters
@@ -401,13 +400,13 @@ function queryDeviceEvents() {
$hideConnections = $_REQUEST ['hideConnections'];
// SQL
$result = $db->query('SELECT eve_DateTime, eve_EventType, eve_IP, eve_AdditionalInfo
$SQL = 'SELECT eve_DateTime, eve_EventType, eve_IP, eve_AdditionalInfo
FROM Events
WHERE eve_MAC="'. $mac .'" AND eve_DateTime >= '. $periodDate .'
AND ( (eve_EventType <> "Connected" AND eve_EventType <> "Disconnected" AND
eve_EventType <> "VOIDED - Connected" AND eve_EventType <> "VOIDED - Disconnected")
OR "'. $hideConnections .'" = "false" )
');
OR "'. $hideConnections .'" = "false" ) ';
$result = $db->query($SQL);
// arrays of rows
$tableData = array();
@@ -425,5 +424,4 @@ function queryDeviceEvents() {
echo (json_encode ($tableData));
}
?>

View File

@@ -0,0 +1,88 @@
<?php
//------------------------------------------------------------------------------
// Pi.Alert
// Open Source Network Guard / WIFI & LAN intrusion detector
//
// parameters.php - Front module. Server side. Manage Parameters
//------------------------------------------------------------------------------
// Puche 2021 pi.alert.application@gmail.com GNU GPLv3
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// External files
require 'db.php';
require 'util.php';
//------------------------------------------------------------------------------
// Action selector
//------------------------------------------------------------------------------
// Set maximum execution time to 15 seconds
ini_set ('max_execution_time','15');
// Open DB
OpenDB();
// Action functions
if (isset ($_REQUEST['action']) && !empty ($_REQUEST['action'])) {
$action = $_REQUEST['action'];
switch ($action) {
case 'get': getParameter(); break;
case 'set': setParameter(); break;
default: logServerConsole ('Action: '. $action); break;
}
}
//------------------------------------------------------------------------------
// Get Parameter Value
//------------------------------------------------------------------------------
function getParameter() {
global $db;
$parameter = $_REQUEST['parameter'];
$sql = 'SELECT par_Value FROM Parameters
WHERE par_ID="'. quotes($_REQUEST['parameter']) .'"';
$result = $db->query($sql);
$row = $result -> fetchArray (SQLITE3_NUM);
$value = $row[0];
echo (json_encode ($value));
}
//------------------------------------------------------------------------------
// Set Parameter Value
//------------------------------------------------------------------------------
function setParameter() {
global $db;
// Update value
$sql = 'UPDATE Parameters SET par_Value="'. quotes ($_REQUEST['value']) .'"
WHERE par_ID="'. quotes($_REQUEST['parameter']) .'"';
$result = $db->query($sql);
if (! $result == TRUE) {
echo "Error updating parameter\n\n$sql \n\n". $db->lastErrorMsg();
return;
}
$changes = $db->changes();
if ($changes == 0) {
// Insert new value
$sql = 'INSERT INTO Parameters (par_ID, par_Value)
VALUES ("'. quotes($_REQUEST['parameter']) .'",
"'. quotes($_REQUEST['value']) .'")';
$result = $db->query($sql);
if (! $result == TRUE) {
echo "Error creating parameter\n\n$sql \n\n". $db->lastErrorMsg();
return;
}
}
echo 'OK';
}
?>

View File

@@ -1,4 +1,13 @@
<?php
//------------------------------------------------------------------------------
// Pi.Alert
// Open Source Network Guard / WIFI & LAN intrusion detector
//
// util.php - Front module. Server side. Common generic functions
//------------------------------------------------------------------------------
// Puche 2021 pi.alert.application@gmail.com GNU GPLv3
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Formatting data functions
@@ -40,6 +49,10 @@ function getDateFromPeriod () {
return '"'. date ('Y-m-d', strtotime ('+1 day -'. $period) ) .'"';
}
function quotes ($text) {
return str_replace ('"','""',$text);
}
function logServerConsole ($text) {
$x = array();
$y = $x['__________'. $text .'__________'];

View File

@@ -2,7 +2,7 @@
# Pi.Alert
# Open Source Network Guard / WIFI & LAN intrusion detector
#
# footer.php - Front module. Common footer to all the front pages
# footer.php - Front module. Common footer to all the web pages
#-------------------------------------------------------------------------------
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3
#--------------------------------------------------------------------------- -->
@@ -11,9 +11,7 @@
<footer class="main-footer">
<!-- Default to the left -->
<!--
&copy; 2020 Puche
-->
<!-- &copy; 2020 Puche -->
<?php
$conf_file = '../config/version.conf';
$conf_data = parse_ini_file($conf_file);
@@ -23,9 +21,7 @@
<!-- To the right -->
<div class="pull-right no-hidden-xs">
<!--
Pi.Alert&nbsp&nbsp2.50&nbsp&nbsp<small>(2019-12-30)</small>
-->
<!-- Pi.Alert 2.50 <small>(2019-12-30)</small> -->
<?php
$conf_file = '../config/version.conf';
$conf_data = parse_ini_file($conf_file);
@@ -34,18 +30,22 @@
</div>
</footer>
<!-- ----------------------------------------------------------------------- -->
<!-- Control Sidebar -->
<!-- DELETED -->
</div>
<!-- ./wrapper -->
<!-- ----------------------------------------------------------------------- -->
<!-- REQUIRED JS SCRIPTS -->
<!-- jQuery 3 -->
<script src="lib/AdminLTE/bower_components/jquery/dist/jquery.min.js"></script>
<!-- Bootstrap 3.3.7 -->
<script src="lib/AdminLTE/bower_components/bootstrap/dist/js/bootstrap.min.js"></script>
<!-- AdminLTE App -->
<script src="lib/AdminLTE/dist/js/adminlte.min.js"></script>
@@ -54,14 +54,12 @@
user experience. -->
<!-- SlimScroll -->
<script src="lib/AdminLTE/bower_components/jquery-slimscroll/jquery.slimscroll.min.js"></script>
<!-- <script src="lib/AdminLTE/bower_components/jquery-slimscroll/jquery.slimscroll.min.js"></script> -->
<!-- FastClick -->
<script src="lib/AdminLTE/bower_components/fastclick/lib/fastclick.js"></script>
<!-- <script src="lib/AdminLTE/bower_components/fastclick/lib/fastclick.js"></script> -->
<!-- Pi.Alert -------------------------------------------------------------- -->
<script src="js/pialert_common.js"></script>
</body>
</html>

View File

@@ -2,34 +2,40 @@
# Pi.Alert
# Open Source Network Guard / WIFI & LAN intrusion detector
#
# header.php - Front module. Common header to all the front pages
# header.php - Front module. Common header to all the web pages
#-------------------------------------------------------------------------------
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3
#--------------------------------------------------------------------------- -->
<!DOCTYPE html>
<html>
<!-- ----------------------------------------------------------------------- -->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Pi.Alert</title>
<!-- Tell the browser to be responsive to screen width -->
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
<!-- Bootstrap 3.3.7 -->
<link rel="stylesheet" href="lib/AdminLTE/bower_components/bootstrap/dist/css/bootstrap.min.css">
<!-- Font Awesome -->
<link rel="stylesheet" href="lib/AdminLTE/bower_components/font-awesome/css/font-awesome.min.css">
<!-- Ionicons -->
<link rel="stylesheet" href="lib/AdminLTE/bower_components/Ionicons/css/ionicons.min.css">
<!-- Theme style -->
<link rel="stylesheet" href="lib/AdminLTE/dist/css/AdminLTE.min.css">
<!-- AdminLTE Skins. We have chosen the skin-blue for this starter
page. However, you can choose any other skin. Make sure you
apply the skin class to the body tag so the changes take effect. -->
<link rel="stylesheet" href="lib/AdminLTE/dist/css/skins/skin-yellow-light.min.css">
<!-- Pi.Alert CSS -->
<link rel="stylesheet" href="css/pialert.css">
@@ -41,13 +47,13 @@
<![endif]-->
<!-- Google Font -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic">
<!-- Page Icon -->
<link rel="icon" type="image/png" sizes="160x160" href="img/pialertLogoGray80.png" />
</head>
<!-- ----------------------------------------------------------------------- -->
<!-- Layout Boxed Yellow -->
<body class="hold-transition skin-yellow-light layout-boxed sidebar-mini" style="background-image: url('img/background.png');">
<!-- Site wrapper -->
@@ -56,6 +62,7 @@
<!-- Main Header -->
<header class="main-header">
<!-- ----------------------------------------------------------------------- -->
<!-- Logo -->
<a href="/" class="logo">
<!-- mini logo for sidebar mini 50x50 pixels -->
@@ -64,6 +71,7 @@
<span class="logo-lg">Pi<b>.Alert</b></span>
</a>
<!-- ----------------------------------------------------------------------- -->
<!-- Header Navbar -->
<nav class="navbar navbar-static-top" role="navigation">
<!-- Sidebar toggle button-->
@@ -90,12 +98,12 @@
<!-- The user image in the menu -->
<li class="user-header">
<img src="img/pialertLogoWhite.png" class="img-circle" alt="Pi.Alert Logo" style="border-color:transparent">
<p>
Open Source Network Guard
<small>Designed for Raspberry Pi</small>
</p>
</li>
<!-- Menu Body -->
<li class="user-body">
<div class="row">
@@ -122,6 +130,8 @@
</div>
</nav>
</header>
<!-- ----------------------------------------------------------------------- -->
<!-- Left side column. contains the logo and sidebar -->
<aside class="main-sidebar">
@@ -133,117 +143,10 @@
<a href="/" class="logo">
<img src="img/pialertLogoGray80.png" class="img-responsive" alt="Pi.Alert Logo"/>
</a>
<div class="pull-left image">
<!--
<br><img src="img/pialertLogoBlack.png" class="img-responsive" alt="Pi.Alert Logo" style="display: table; table-layout: fixed;" />
-->
</div>
<div class="pull-left info" style="display: none">
<p>Status</p>
<?php
$pistatus = exec('sudo pihole status web');
$pistatus=1;
$FTL=true;
$celsius=56.7;
$temperatureunit='C';
$nproc=2;
$loaddata=array();
$loaddata[]=1.1;
$loaddata[]=1.2;
$loaddata[]=1.3;
$memory_usage=0.452;
if ($pistatus == "1") {
echo '<a id="status"><i class="fa fa-circle" style="color:#7FFF00"></i> Active</a>';
} elseif ($pistatus == "0") {
echo '<a id="status"><i class="fa fa-circle" style="color:#FF0000"></i> Offline</a>';
} elseif ($pistatus == "-1") {
echo '<a id="status"><i class="fa fa-circle" style="color:#FF0000"></i> DNS service not running</a>';
} else {
echo '<a id="status"><i class="fa fa-circle" style="color:#ff9900"></i> Unknown</a>';
}
// CPU Temp
if($FTL)
{
if ($celsius >= -273.15) {
echo "<a id=\"temperature\"><i class=\"fa fa-fire\" style=\"color:";
if ($celsius > 60) {
echo "#FF0000";
}
else
{
echo "#3366FF";
}
echo "\"></i> Temp:&nbsp;";
if($temperatureunit === "F")
{
echo round($fahrenheit,1) . "&nbsp;&deg;F";
}
elseif($temperatureunit === "K")
{
echo round($kelvin,1) . "&nbsp;K";
}
else
{
echo round($celsius,1) . "&nbsp;&deg;C";
}
echo "</a>";
}
}
else
{
echo '<a id=\"temperature\"><i class="fa fa-circle" style="color:#FF0000"></i> FTL offline</a>';
}
?>
<br/>
<?php
echo "<a title=\"Detected $nproc cores\"><i class=\"fa fa-circle\" style=\"color:";
if ($loaddata[0] > $nproc) {
echo "#FF0000";
}
else
{
echo "#7FFF00";
}
echo "\"></i> Load:&nbsp;&nbsp;" . $loaddata[0] . "&nbsp;&nbsp;" . $loaddata[1] . "&nbsp;&nbsp;". $loaddata[2] . "</a>";
?>
<br/>
<?php
echo "<a><i class=\"fa fa-circle\" style=\"color:";
if ($memory_usage > 0.75 || $memory_usage < 0.0) {
echo "#FF0000";
}
else
{
echo "#7FFF00";
}
if($memory_usage > 0.0)
{
echo "\"></i> Memory usage:&nbsp;&nbsp;" . sprintf("%.1f",100.0*$memory_usage) . "&thinsp;%</a>";
}
else
{
echo "\"></i> Memory usage:&nbsp;&nbsp; N/A</a>";
}
?>
</div>
</div>
<!-- search form (Optional) -->
<!--
<form action="#" method="get" class="sidebar-form">
<div class="input-group">
<input type="text" name="q" class="form-control" placeholder="Search...">
<span class="input-group-btn">
<button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i>
</button>
</span>
</div>
</form>
-->
<!-- /.search form -->
<!-- DELETED -->
<!-- Sidebar Menu -->
<ul class="sidebar-menu" data-widget="tree">

View File

@@ -0,0 +1,35 @@
<!-- ---------------------------------------------------------------------------
# Pi.Alert
# Open Source Network Guard / WIFI & LAN intrusion detector
#
# notificacion.php - Front module. Common notification & modal window
#-------------------------------------------------------------------------------
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3
#--------------------------------------------------------------------------- -->
<!-- Modal warning -->
<div class="modal modal-warning fade" id="modal-warning" style="display: none;">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 id="modal-title" class="modal-title"> Modal Title </h4>
</div>
<div id="modal-message" class="modal-body"> Modal message </div>
<div class="modal-footer">
<button id="modal-cancel" type="button" class="btn btn-outline pull-left" data-dismiss="modal"> Cancel </button>
<button id="modal-OK" type="button" class="btn btn-outline" onclick="modalOK()"> OK </button>
</div>
</div>
</div>
</div>
<!-- Alert float -->
<div id="notification" class="alert alert-dimissible pa_alert_notification">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<div id="alert-message"> Alert message </div>
</div>

View File

@@ -1,4 +1,12 @@
<!-- ----------------------------------------------------------------------- -->
<!-- ---------------------------------------------------------------------------
# Pi.Alert
# Open Source Network Guard / WIFI & LAN intrusion detector
#
# presence.php - Front module. Device Presence calendar page
#-------------------------------------------------------------------------------
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3
#--------------------------------------------------------------------------- -->
<?php
require 'php/templates/header.php';
?>
@@ -11,102 +19,74 @@
<h1 id="pageTitle">
Presence by Devices
</h1>
<!-- period selector -->
<span class="breadcrumb text-gray50">
New Devices period:
<select id="period" onchange="javascript: periodChanged();">
<option value="1 day">Today</option>
<option value="7 days">Last Week</option>
<option value="1 month" selected>Last Month</option>
<option value="1 year">Last Year</option>
<option value="100 years">All info</option>
</select>
</span>
</section>
<!-- Main content ---------------------------------------------------------- -->
<section class="content">
<!-- top small box 1 ------------------------------------------------------- -->
<div class="row">
<!-- top small box --------------------------------------------------------- -->
<div class="col-lg-3 col-sm-6 col-xs-6">
<a href="#" onclick="javascript: queryPresence('all');">
<a href="#" onclick="javascript: getDevicesPresence('all');">
<div class="small-box bg-aqua pa-small-box-aqua">
<div class="inner">
<div class="inner">
<h4>All Devices</h4>
<h3 id="devicesAll"> -- </h3>
</div>
</div>
<div class="icon">
<i class="fa fa-laptop"></i>
</div>
<div class="small-box-footer">
Details <i class="fa fa-arrow-circle-right"></i>
</div>
<div class="icon"> <i class="fa fa-laptop"></i> </div>
<div class="small-box-footer"> Details <i class="fa fa-arrow-circle-right"></i> </div>
</div>
</a>
</div>
<!-- top small box --------------------------------------------------------- -->
<!-- top small box 2 ------------------------------------------------------- -->
<div class="col-lg-3 col-sm-6 col-xs-6">
<a href="#" onclick="javascript: queryPresence('connected');">
<a href="#" onclick="javascript: getDevicesPresence('connected');">
<div class="small-box bg-green pa-small-box-green">
<div class="inner">
<div class="inner">
<h4>Connected</h4>
<h3 id="devicesConnected"> -- </h3>
</div>
</div>
<div class="icon">
<i class="fa fa-plug"></i>
</div>
<div class="small-box-footer">
Details <i class="fa fa-arrow-circle-right"></i>
</div>
<div class="icon"> <i class="fa fa-plug"></i> </div>
<div class="small-box-footer"> Details <i class="fa fa-arrow-circle-right"></i> </div>
</div>
</a>
</div>
<!-- top small box --------------------------------------------------------- -->
<!-- top small box 3 ------------------------------------------------------- -->
<div class="col-lg-3 col-sm-6 col-xs-6">
<a href="#" onclick="javascript: queryPresence('new');">
<a href="#" onclick="javascript: getDevicesPresence('new');">
<div class="small-box bg-yellow pa-small-box-yellow">
<div class="inner">
<div class="inner">
<h4>New Devices</h4>
<h3 id="devicesNew"> -- </h3>
</div>
</div>
<div class="icon">
<i class="ion ion-plus-round"></i>
</div>
<div class="small-box-footer">
Details <i class="fa fa-arrow-circle-right"></i>
</div>
<div class="icon"> <i class="ion ion-plus-round"></i> </div>
<div class="small-box-footer"> Details <i class="fa fa-arrow-circle-right"></i> </div>
</div>
</a>
</div>
<!-- top small box --------------------------------------------------------- -->
<!-- top small box 4 ------------------------------------------------------- -->
<div class="col-lg-3 col-sm-6 col-xs-6">
<a href="#" onclick="javascript: queryPresence('down');">
<a href="#" onclick="javascript: getDevicesPresence('down');">
<div class="small-box bg-red pa-small-box-red">
<div class="inner">
<div class="inner">
<h4>Down Alerts</h4>
<h3 id="devicesDown"> -- </h3>
</div>
</div>
<div class="icon">
<i class="fa fa-warning"></i>
</div>
<div class="small-box-footer">
Details <i class="fa fa-arrow-circle-right"></i>
</div>
<div class="icon"> <i class="fa fa-warning"></i> </div>
<div class="small-box-footer"> Details <i class="fa fa-arrow-circle-right"></i> </div>
</div>
</a>
</div>
@@ -118,20 +98,27 @@
<div class="row">
<div class="col-lg-12 col-sm-12 col-xs-12">
<div id="tableDevicesBox" class="box" style="min-height: 500px">
<!-- box-header -->
<div class="box-header">
<h3 id="tableDevicesTitle" class="box-title text-gray">Devices</h3>
</div>
<!-- box-body -->
<div class="box-body table-responsive">
<!-- spinner -->
<div id="loading" style="display: none">
<div class="pa_semitransparent-panel"></div>
<div class="panel panel-default pa_spinner">
<table><td width="130px" align="middle">Loading...</td><td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw"></td></table>
<table>
<td width="130px" align="middle">Loading...</td>
<td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw"></td>
</table>
</div>
</div>
<!-- Calendar -->
<div id="calendar"></div>
</div>
@@ -156,15 +143,6 @@
<!-- ----------------------------------------------------------------------- -->
<!-- iCkeck -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/iCheck/all.css">
<script src="lib/AdminLTE/plugins/iCheck/icheck.min.js"></script>
<!-- Datatable -->
<link rel="stylesheet" href="lib/AdminLTE/bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css">
<script src="lib/AdminLTE/bower_components/datatables.net/js/jquery.dataTables.min.js"></script>
<script src="lib/AdminLTE/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js"></script>
<!-- fullCalendar -->
<link rel="stylesheet" href="lib/AdminLTE/bower_components/fullcalendar/dist/fullcalendar.min.css">
<link rel="stylesheet" href="lib/AdminLTE/bower_components/fullcalendar/dist/fullcalendar.print.min.css" media="print">
@@ -178,23 +156,19 @@
<!-- page script ----------------------------------------------------------- -->
<script>
var deviceStatus = 'all';
// Read parameters & Initialize components
main();
// -----------------------------------------------------------------------------
var deviceStatus = '';
var period = '';
// Initialize MAC
var urlParams = new URLSearchParams(window.location.search);
if (urlParams.has ('status') == true) {
deviceStatus = urlParams.get ('status');
} else {
deviceStatus = 'all';
}
function main () {
// Initialize components
$(function () {
initializeiCheck();
initializeCalendar();
periodChanged();
getDevicesTotals();
getDevicesPresence(deviceStatus);
});
// Force re-render calendar on tab change (bugfix for render error at left panel)
@@ -203,38 +177,12 @@
$('#calendar').fullCalendar('rerenderEvents');
}
});
// -----------------------------------------------------------------------------
function periodChanged () {
// Requery totals and list
queryTotals();
queryPresence(deviceStatus);
}
// -----------------------------------------------------------------------------
function initializeiCheck () {
// Default
$('input').iCheck({
checkboxClass: 'icheckbox_flat-blue',
radioClass: 'iradio_flat-blue',
increaseArea: '20%'
});
// readonly
$('#readonlyblock input').iCheck({
checkboxClass: 'icheckbox_flat-blue',
radioClass: 'iradio_flat-blue',
increaseArea: '-100%'
});
}
// -----------------------------------------------------------------------------
function initializeCalendar () {
$('#calendar').fullCalendar({
header: {
left : 'prev,next today',
center : 'title',
@@ -253,8 +201,8 @@ function initializeCalendar () {
resourceOrder : '-favorite,title',
schedulerLicenseKey: 'CC-Attribution-NonCommercial-NoDerivatives',
// schedulerLicenseKey: 'GPL-My-Project-Is-Open-Source',
//schedulerLicenseKey: 'CC-Attribution-NonCommercial-NoDerivatives',
schedulerLicenseKey: 'GPL-My-Project-Is-Open-Source',
views: {
timelineYear: {
@@ -299,7 +247,7 @@ function initializeCalendar () {
cell.removeClass('fc-sat');
cell.removeClass('fc-sun');
return;
}
};
if (date.day() == 0) {
cell.addClass('fc-sun'); };
@@ -312,7 +260,8 @@ function initializeCalendar () {
},
resourceRender: function (resourceObj, labelTds, bodyTds) {
labelTds.find('span.fc-cell-text').html ('<b><a href="deviceDetails.php?mac='+ resourceObj.id+ '&period='+ period +'" class="">'+ resourceObj.title +'</a></b>');
labelTds.find('span.fc-cell-text').html (
'<b><a href="deviceDetails.php?mac='+ resourceObj.id+ '" class="">'+ resourceObj.title +'</a></b>');
// Resize heihgt
// $(".fc-content table tbody tr .fc-widget-content div").addClass('fc-resized-row');
@@ -336,78 +285,51 @@ function initializeCalendar () {
// -----------------------------------------------------------------------------
function queryTotals () {
// debugTimer();
function getDevicesTotals () {
// stop timer
stopTimerRefreshData();
// period
period = document.getElementById('period').value;
// get totals and put in boxes
$.get('php/server/devices.php?action=totals&period='+ period, function(data) {
$.get('php/server/devices.php?action=getDevicesTotals', function(data) {
var totalsDevices = JSON.parse(data);
$('#devicesAll').html (totalsDevices[0].toLocaleString());
$('#devicesConnected').html (totalsDevices[1].toLocaleString());
$('#devicesNew').html (totalsDevices[2].toLocaleString());
$('#devicesDown').html (totalsDevices[3].toLocaleString());
});
// Timer for refresh data
newTimerRefreshData (queryTotals);
newTimerRefreshData (getDevicesTotals);
} );
}
// -----------------------------------------------------------------------------
function queryPresence (status) {
// Save status and period selected
function getDevicesPresence (status) {
// Save status selected
deviceStatus = status;
period = document.getElementById('period').value;
// Defini color & title for the status selected
switch (deviceStatus) {
case 'all':
tableTitle = 'Total Devices';
color = 'aqua';
break;
case 'connected':
tableTitle = 'Connected Devices';
color = 'green';
break;
case 'new':
tableTitle = 'New Devices';
color = 'yellow';
break;
case 'down':
tableTitle = 'Down Alerts';
color = 'red';
break;
case 'favorites':
tableTitle = 'Favorites';
color = 'yellow';
break;
default:
tableTitle = 'Devices';
boxClass = '';
break;
case 'all': tableTitle = 'Total Devices'; color = 'aqua'; break;
case 'connected': tableTitle = 'Connected Devices'; color = 'green'; break;
case 'new': tableTitle = 'New Devices'; color = 'yellow'; break;
case 'down': tableTitle = 'Down Alerts'; color = 'red'; break;
case 'favorites': tableTitle = 'Favorites'; color = 'yellow'; break;
default: tableTitle = 'Devices'; boxClass = ''; break;
}
// Set title and color
document.getElementById('tableDevicesTitle').className = 'box-title text-' + color;
document.getElementById('tableDevicesBox').className = 'box box-' + color;
$('#tableDevicesTitle')[0].className = 'box-title text-'+ color;
$('#tableDevicesBox')[0].className = 'box box-'+ color;
$('#tableDevicesTitle').html (tableTitle);
$('#calendar').fullCalendar ('option', 'resources', 'php/server/devices.php?action=calendar&status='+ deviceStatus +'&period='+ period);
// Define new datasource URL and reload
$('#calendar').fullCalendar ('option', 'resources', 'php/server/devices.php?action=getDevicesListCalendar&status='+ deviceStatus);
$('#calendar').fullCalendar ('refetchResources');
// Query calendar
// resources : 'https://fullcalendar.io/demo-resources.json',
// events : 'https://fullcalendar.io/demo-events.json?with-resources',
$('#calendar').fullCalendar('removeEventSources');
$('#calendar').fullCalendar('addEventSource', { url: 'php/server/events.php?action=calendarPresence&period='+ period });
$('#calendar').fullCalendar('addEventSource', { url: 'php/server/events.php?action=getEventsCalendar' });
};
</script>

View File

@@ -2,7 +2,7 @@
# Pi.Alert
# Open Source Network Guard / WIFI & LAN intrusion detector
#
# index.html - Redirect file to pialert subdirectory
# index.html - Redirect default page to pialert web admin portal
#-------------------------------------------------------------------------------
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3
#--------------------------------------------------------------------------- -->

View File

@@ -2,7 +2,7 @@
# Pi.Alert
# Open Source Network Guard / WIFI & LAN intrusion detector
#
# index.html - Redirect file to pialert subdirectory
# pialert_front.conf - lighttpd domain redirection
# ------------------------------------------------------------------------------
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3
# ------------------------------------------------------------------------------

View File

@@ -8,9 +8,6 @@
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3
# ------------------------------------------------------------------------------
# stop on errors
set -e
# ------------------------------------------------------------------------------
# Variables
# ------------------------------------------------------------------------------
@@ -26,6 +23,8 @@ PIALERT_DEFAULT_PAGE=false
LOG="pialert_install_`date +"%Y-%m-%d_%H-%M"`.log"
MAIN_IP=`ip -o route get 1 | sed -n 's/.*src \([0-9.]\+\).*/\1/p'`
PIHOLE_INSTALL=false
PIHOLE_ACTIVE=false
DHCP_ACTIVATE=false
@@ -63,20 +62,9 @@ main() {
log "Logfile: $LOG"
check_pialert_home
print_msg "Use: - http://pi.alert/"
ask_yesno "This script will install Pi.Alert in this system using this path:\n$PIALERT_HOME" \
"Do you want to continue ?"
if ! $ANSWER ; then
exit 1
fi
ask_config
msgbox "Configuration finished. To updete the configuration, edit file:" \
"$PIALERT_HOME/config/pialert.conf"
msgbox "" "The installation will start now"
set -e
install_pihole
activate_DHCP
@@ -88,17 +76,25 @@ main() {
print_header "Installation process finished"
print_msg "Use: - http://pi.alert/"
print_msg " - http://`hostname -I | tr -d ' '`/pialert/"
print_msg " - http://$MAIN_IP/pialert/"
print_msg "To access Pi.Alert web"
print_msg ""
move_logfile
}
# ------------------------------------------------------------------------------
# Ask config questions
# ------------------------------------------------------------------------------
ask_config() {
# Ask installation
ask_yesno "This script will install Pi.Alert in this system using this path:\n$PIALERT_HOME" \
"Do you want to continue ?"
if ! $ANSWER ; then
exit 1
fi
# Ask Pi-hole Installation
PIHOLE_ACTIVE=false
if [ -e /usr/local/bin/pihole ] || [ -e /etc/pihole ]; then
@@ -123,8 +119,8 @@ ask_config() {
DHCP_ACTIVE=false
DHCP_ACTIVATE=false
if $PIHOLE_ACTIVE ; then
DHCP_ACTIVE=`sudo grep DHCP_ACTIVE /etc/pihole/setupVars.conf |
awk -F= '/./{print $2}'`
DHCP_ACTIVE=`sudo grep DHCP_ACTIVE /etc/pihole/setupVars.conf | awk -F= '/./{print $2}'`
if [ "$DHCP_ACTIVE" = "" ] ; then DHCP_ACTIVE=false; fi
if ! $DHCP_ACTIVE ; then
ask_yesno "Pi-hole DHCP server is not active." \
@@ -218,8 +214,15 @@ ask_config() {
ask_input "" "URL to update DDNS IP:" "https://api.dynu.com/nic/update?"
DDNS_UPDATE_URL=$ANSWER
fi
# Final config message
msgbox "Configuration finished. To updete the configuration, edit file:" \
"$PIALERT_HOME/config/pialert.conf"
msgbox "" "The installation will start now"
}
# ------------------------------------------------------------------------------
# Install Pi-hole
# ------------------------------------------------------------------------------
@@ -247,6 +250,7 @@ install_pihole() {
PIHOLE_ACTIVE=true
}
# ------------------------------------------------------------------------------
# Activate DHCP
# ------------------------------------------------------------------------------
@@ -261,8 +265,7 @@ activate_DHCP() {
print_msg "- Checking if DHCP is active..."
if [ -e /etc/pihole ]; then
DHCP_ACTIVE= \
`grep DHCP_ACTIVE /etc/pihole/setupVars.conf | awk -F= '/./{print $2}'`
DHCP_ACTIVE= `grep DHCP_ACTIVE /etc/pihole/setupVars.conf | awk -F= '/./{print $2}'`
fi
if $DHCP_ACTIVE ; then
@@ -270,11 +273,11 @@ activate_DHCP() {
fi
print_msg "- Activating DHCP..."
sudo pihole -a enabledhcp "$DHCP_RANGE_START" "$DHCP_RANGE_END" \
"$DHCP_ROUTER" "$DHCP_LEASE" "$DHCP_DOMAIN" 2>&1 >> "$LOG"
sudo pihole -a enabledhcp "$DHCP_RANGE_START" "$DHCP_RANGE_END" "$DHCP_ROUTER" "$DHCP_LEASE" "$DHCP_DOMAIN" 2>&1 >> "$LOG"
DHCP_ACTIVE=true
}
# ------------------------------------------------------------------------------
# Add Pi.Alert DNS
# ------------------------------------------------------------------------------
@@ -290,8 +293,7 @@ add_pialert_DNS() {
fi
print_msg "- Adding 'pi.alert' to Local DNS..."
sudo sh -c "echo `hostname -I` pi.alert >> /etc/pihole/custom.list" \
2>&1 >> "$LOG"
sudo sh -c "echo $MAIN_IP pi.alert >> /etc/pihole/custom.list" 2>&1 >> "$LOG"
sudo pihole restartdns 2>&1 >> "$LOG"
}
@@ -309,9 +311,10 @@ install_lighttpd() {
sudo apt-get install php php-cgi php-fpm php-sqlite3 -y 2>&1 >> "$LOG"
print_msg "- Activating PHP..."
ERRNO=0
sudo lighttpd-enable-mod fastcgi-php 2>&1 >>"$LOG" || ERRNO=$?
log_no_screen "-- Command error code: $ERRNO"
if [ $ERRNO -eq 1 ] ; then
if [ "$ERRNO" = "1" ] ; then
process_error "Error activating PHP"
fi
@@ -319,17 +322,21 @@ install_lighttpd() {
sudo /etc/init.d/lighttpd restart 2>&1 >> "$LOG"
}
# ------------------------------------------------------------------------------
# Install arp-scan
# Install arp-scan & dnsutils
# ------------------------------------------------------------------------------
install_arpscan() {
print_header "arp-scan"
print_header "arp-scan & dnsutils"
print_msg "- Installing arp-scan..."
sudo apt-get install arp-scan -y 2>&1 >> "$LOG"
print_msg "- Testing arp-scan..."
sudo arp-scan -l | head -n -3 | tail +3 | tee -a "$LOG"
print_msg "- Installing dnsutils..."
sudo apt-get install dnsutils -y 2>&1 >> "$LOG"
}
@@ -378,6 +385,7 @@ install_python() {
fi
}
# ------------------------------------------------------------------------------
# Check Python versions available
# ------------------------------------------------------------------------------
@@ -420,6 +428,7 @@ install_pialert() {
set_pialert_default_page
}
# ------------------------------------------------------------------------------
# Download and uncompress Pi.Alert
# ------------------------------------------------------------------------------
@@ -430,19 +439,18 @@ download_pialert() {
fi
print_msg "- Downloading installation tar file..."
curl -Lo "$INSTALL_DIR/pialert_latest.tar" \
https://github.com/pucherot/Pi.Alert/raw/main/tar/pialert_latest.tar
curl -Lo "$INSTALL_DIR/pialert_latest.tar" https://github.com/pucherot/Pi.Alert/raw/main/tar/pialert_latest.tar
echo ""
print_msg "- Uncompressing tar file"
tar xf "$INSTALL_DIR/pialert_latest.tar" -C "$INSTALL_DIR" \
--checkpoint=100 --checkpoint-action="ttyout=." 2>&1 >> "$LOG"
tar xf "$INSTALL_DIR/pialert_latest.tar" -C "$INSTALL_DIR" --checkpoint=100 --checkpoint-action="ttyout=." 2>&1 >> "$LOG"
echo ""
print_msg "- Deleting downloaded tar file..."
rm -r "$INSTALL_DIR/pialert_latest.tar"
}
# ------------------------------------------------------------------------------
# Configure Pi.Alert parameters
# ------------------------------------------------------------------------------
@@ -468,6 +476,7 @@ configure_pialert() {
set_pialert_parameter DHCP_ACTIVE "$DHCP_ACTIVE"
}
# ------------------------------------------------------------------------------
# Set Pi.Alert parameter
# ------------------------------------------------------------------------------
@@ -480,8 +489,7 @@ set_pialert_parameter() {
VALUE="$2"
fi
sed -i "/^$1.*=/s|=.*|= $VALUE|" $PIALERT_HOME/config/pialert.conf \
2>&1 >> "$LOG"
sed -i "/^$1.*=/s|=.*|= $VALUE|" $PIALERT_HOME/config/pialert.conf 2>&1 >> "$LOG"
}
@@ -491,20 +499,16 @@ set_pialert_parameter() {
test_pialert() {
print_msg "- Testing Pi.Alert HW vendors database update process..."
print_msg "*** PLEASE WAIT A COUPLE OF MINUTES..."
stdbuf -i0 -o0 -e0 \
$PYTHON_BIN $PIALERT_HOME/back/pialert.py update_vendors_silent 2>&1 \
| tee -ai "$LOG"
stdbuf -i0 -o0 -e0 $PYTHON_BIN $PIALERT_HOME/back/pialert.py update_vendors_silent 2>&1 | tee -ai "$LOG"
echo ""
print_msg "- Testing Pi.Alert Internet IP Lookup..."
stdbuf -i0 -o0 -e0 \
$PYTHON_BIN $PIALERT_HOME/back/pialert.py internet_IP 2>&1 | tee -ai "$LOG"
stdbuf -i0 -o0 -e0 $PYTHON_BIN $PIALERT_HOME/back/pialert.py internet_IP 2>&1 | tee -ai "$LOG"
echo ""
print_msg "- Testing Pi.Alert Network scan..."
print_msg "*** PLEASE WAIT A COUPLE OF MINUTES..."
stdbuf -i0 -o0 -e0 \
$PYTHON_BIN $PIALERT_HOME/back/pialert.py 1 2>&1 | tee -ai "$LOG"
stdbuf -i0 -o0 -e0 $PYTHON_BIN $PIALERT_HOME/back/pialert.py 1 2>&1 | tee -ai "$LOG"
}
# ------------------------------------------------------------------------------
@@ -522,8 +526,7 @@ add_jobs_to_crontab() {
sed -i "s/\<python\>/$PYTHON_BIN/g" $PIALERT_HOME/install/pialert.cron
fi
(crontab -l 2>/dev/null || : ; cat $PIALERT_HOME/install/pialert.cron) | \
crontab -
(crontab -l 2>/dev/null || : ; cat $PIALERT_HOME/install/pialert.cron) | crontab -
}
# ------------------------------------------------------------------------------
@@ -537,27 +540,24 @@ publish_pialert() {
print_msg "- Setting permissions..."
sudo chgrp -R www-data $PIALERT_HOME/db 2>&1 >> "$LOG"
chmod -R 770 $PIALERT_HOME/db 2>&1 >> "$LOG"
chmod -R g+rwx $PIALERT_HOME/db 2>&1 >> "$LOG"
chmod go+x $INSTALL_DIR 2>&1 >> "$LOG"
print_msg "- Publishing Pi.Alert web..."
sudo ln -s "$PIALERT_HOME/front" "$WEBROOT/pialert" 2>&1 >> "$LOG"
print_msg "- Configuring http://pi.alert/ redirection..."
if [ -e "$LIGHTTPD_CONF_DIR/conf-available/pialert_front.conf" ] ; then
sudo rm -r "$LIGHTTPD_CONF_DIR/conf-available/pialert_front.conf" \
2>&1 >> "$LOG"
sudo rm -r "$LIGHTTPD_CONF_DIR/conf-available/pialert_front.conf" 2>&1 >> "$LOG"
fi
sudo cp "$PIALERT_HOME/install/pialert_front.conf" \
"$LIGHTTPD_CONF_DIR/conf-available" 2>&1 >> "$LOG"
sudo cp "$PIALERT_HOME/install/pialert_front.conf" "$LIGHTTPD_CONF_DIR/conf-available" 2>&1 >> "$LOG"
if [ -e "$LIGHTTPD_CONF_DIR/conf-enabled/pialert_front.conf" ] || \
[ -L "$LIGHTTPD_CONF_DIR/conf-enabled/pialert_front.conf" ] ; then
sudo rm -r "$LIGHTTPD_CONF_DIR/conf-enabled/pialert_front.conf" \
2>&1 >> "$LOG"
sudo rm -r "$LIGHTTPD_CONF_DIR/conf-enabled/pialert_front.conf" 2>&1 >> "$LOG"
fi
sudo ln -s ../conf-available/pialert_front.conf \
"$LIGHTTPD_CONF_DIR/conf-enabled/pialert_front.conf" 2>&1 >> "$LOG"
sudo ln -s ../conf-available/pialert_front.conf "$LIGHTTPD_CONF_DIR/conf-enabled/pialert_front.conf" 2>&1 >> "$LOG"
print_msg "- Restarting lighttpd..."
sudo /etc/init.d/lighttpd restart 2>&1 >> "$LOG"
@@ -577,8 +577,7 @@ set_pialert_default_page() {
if [ -e "$WEBROOT/index.lighttpd.html.orig" ] ; then
sudo rm "$WEBROOT/index.lighttpd.html" 2>&1 >> "$LOG"
else
sudo mv "$WEBROOT/index.lighttpd.html" \
"$WEBROOT/index.lighttpd.html.orig" 2>&1 >> "$LOG"
sudo mv "$WEBROOT/index.lighttpd.html" "$WEBROOT/index.lighttpd.html.orig" 2>&1 >> "$LOG"
fi
fi
@@ -629,8 +628,13 @@ msgbox() {
LINE1=$(printf "%*s" $(((${#1}+$COLS-5)/2)) "$1")
LINE2=$(printf "%*s" $(((${#2}+$COLS-5)/2)) "$2")
whiptail --title "Pi.Alert Installation" --msgbox "$LINE1\\n\\n$LINE2" \
$ROWS $COLS
END_DIALOG=false
while ! $END_DIALOG ; do
whiptail --title "Pi.Alert Installation" --msgbox "$LINE1\\n\\n$LINE2" $ROWS $COLS
BUTTON=$?
ask_cancel
ANSWER=true
done
}
ask_yesno() {
@@ -643,8 +647,14 @@ ask_yesno() {
DEF_BUTTON="--defaultno"
fi
if whiptail --title "Pi.Alert Installation" --yesno $DEF_BUTTON \
"$LINE1\\n\\n$LINE2" $ROWS $COLS; then
END_DIALOG=false
while ! $END_DIALOG ; do
whiptail --title "Pi.Alert Installation" --yesno $DEF_BUTTON "$LINE1\\n\\n$LINE2" $ROWS $COLS
BUTTON=$?
ask_cancel
done
if [ "$BUTTON" = "0" ] ; then
ANSWER=true
else
ANSWER=false
@@ -655,22 +665,47 @@ ask_option() {
MENU_ARGS=("$@")
MENU_ARGS=("${MENU_ARGS[@]:1}")
ANSWER=$(whiptail --title "Pi.Alert Installation" --menu "$1" $ROWS $COLS \
"${MENU_ARGS[@]}" 3>&2 2>&1 1>&3 || : )
END_DIALOG=false
while ! $END_DIALOG ; do
ANSWER=$(whiptail --title "Pi.Alert Installation" --menu "$1" $ROWS $COLS "${MENU_ARGS[@]}" 3>&2 2>&1 1>&3 )
BUTTON=$?
ask_cancel CANCEL
done
}
ask_input() {
LINE1=$(printf "%*s" $(((${#1}+$COLS-5)/2)) "$1")
LINE2=$(printf "%*s" $(((${#2}+$COLS-5)/2)) "$2")
ANSWER=$(whiptail --title "Pi.Alert Installation" --inputbox \
"$LINE1\\n\\n$LINE2" $ROWS $COLS $3 3>&2 2>&1 1>&3 || : )
END_DIALOG=false
while ! $END_DIALOG ; do
ANSWER=$(whiptail --title "Pi.Alert Installation" --inputbox "$LINE1\\n\\n$LINE2" $ROWS $COLS "$3" 3>&2 2>&1 1>&3 )
BUTTON=$?
ask_cancel CANCEL
if [ "$ANSWER" = "" ] ; then
ANSWER=$3
if $END_DIALOG && [ "$ANSWER" = "" ] ; then
msgbox "" "You must enter a value"
END_DIALOG=false
fi
done
}
ask_cancel() {
LINE0="Do you want to cancel the installation process"
LINE0=$(printf "\n\n%*s" $(((${#LINE0}+$COLS-5)/2)) "$LINE0")
if [ "$BUTTON" = "1" ] && [ "$1" = "CANCEL" ] ; then BUTTON="255"; fi
if [ "$BUTTON" = "255" ] ; then
whiptail --title "Pi.Alert Installation" --yesno --defaultno "$LINE0" $ROWS $COLS
if [ "$?" = "0" ] ; then
process_error "Installation Aborted by User"
fi
else
END_DIALOG=true
fi
}
# ------------------------------------------------------------------------------
# Log
@@ -707,7 +742,7 @@ print_header() {
}
process_error() {
log "\n"
log ""
log "************************************************************"
log "************************************************************"
log "** ERROR INSTALLING PI.ALERT **"
@@ -719,7 +754,7 @@ process_error() {
log "Use 'cat $LOG' to view installation log"
log ""
msgbox "****** ERROR INSTALLING Pi.ALERT ******" "$1"
# msgbox "****** ERROR INSTALLING Pi.ALERT ******" "$1"
exit 1
}

271
install/pialert_update.sh Normal file
View File

@@ -0,0 +1,271 @@
#!/bin/bash
# ------------------------------------------------------------------------------
# Pi.Alert
# Open Source Network Guard / WIFI & LAN intrusion detector
#
# pialert_update.sh - Update script
# ------------------------------------------------------------------------------
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
# Variables
# ------------------------------------------------------------------------------
INSTALL_DIR=~
PIALERT_HOME="$INSTALL_DIR/pialert"
LOG="pialert_update_`date +"%Y-%m-%d_%H-%M"`.log"
PYTHON_BIN=python
# ------------------------------------------------------------------------------
# Main
# ------------------------------------------------------------------------------
main() {
print_superheader "Pi.Alert Update"
log "`date`"
log "Logfile: $LOG"
log ""
set -e
check_pialert_home
check_python_version
create_backup
move_files
clean_files
download_pialert
update_config
update_db
test_pialert
print_header "Update process finished"
print_msg ""
move_logfile
}
# ------------------------------------------------------------------------------
# Create backup
# ------------------------------------------------------------------------------
create_backup() {
print_msg "- Deleting previous Pi.Alert backups..."
rm "$INSTALL_DIR/"pialert_update_backup_*.tar 2>/dev/null || :
print_msg "- Creating new Pi.Alert backup..."
cd "$INSTALL_DIR"
tar cvf "$INSTALL_DIR"/pialert_update_backup_`date +"%Y-%m-%d_%H-%M"`.tar pialert --checkpoint=100 --checkpoint-action="ttyout=." 2>&1 >> "$LOG"
echo ""
}
# ------------------------------------------------------------------------------
# Move files to the new directory
# ------------------------------------------------------------------------------
move_files() {
if [ -e "$PIALERT_HOME/back/pialert.conf" ] ; then
print_msg "- Moving pialert.conf to the new directory..."
mkdir -p "$PIALERT_HOME/config"
mv "$PIALERT_HOME/back/pialert.conf" "$PIALERT_HOME/config"
fi
}
# ------------------------------------------------------------------------------
# Move files to the new directory
# ------------------------------------------------------------------------------
clean_files() {
print_msg "- Cleaning previous version..."
rm -r "$PIALERT_HOME/back" 2>/dev/null || :
rm -r "$PIALERT_HOME/doc" 2>/dev/null || :
rm -r "$PIALERT_HOME/docs" 2>/dev/null || :
rm -r "$PIALERT_HOME/front" 2>/dev/null || :
rm -r "$PIALERT_HOME/install" 2>/dev/null || :
rm -r "$PIALERT_HOME/"*.txt 2>/dev/null || :
rm -r "$PIALERT_HOME/"*.md 2>/dev/null || :
}
# ------------------------------------------------------------------------------
# Download and uncompress Pi.Alert
# ------------------------------------------------------------------------------
download_pialert() {
if [ -f "$INSTALL_DIR/pialert_latest.tar" ] ; then
print_msg "- Deleting previous downloaded tar file"
rm -r "$INSTALL_DIR/pialert_latest.tar"
fi
print_msg "- Downloading update file..."
curl -Lo "$INSTALL_DIR/pialert_latest.tar" https://github.com/pucherot/Pi.Alert/raw/main/tar/pialert_latest.tar
echo ""
print_msg "- Uncompressing tar file"
tar xf "$INSTALL_DIR/pialert_latest.tar" -C "$INSTALL_DIR" \
--exclude='pialert/config/pialert.conf' \
--exclude='pialert/db/pialert.db' \
--exclude='pialert/log/*' \
--checkpoint=100 --checkpoint-action="ttyout=." 2>&1 >> "$LOG"
echo ""
print_msg "- Deleting downloaded tar file..."
rm -r "$INSTALL_DIR/pialert_latest.tar"
}
# ------------------------------------------------------------------------------
# Update conf file
# ------------------------------------------------------------------------------
update_config() {
print_msg "- Config backup..."
cp "$PIALERT_HOME/config/pialert.conf" "$PIALERT_HOME/config/pialert.conf.back" 2>&1 >> "$LOG"
print_msg "- Updating config file..."
sed -i '/VERSION/d' "$PIALERT_HOME/config/pialert.conf" 2>&1 >> "$LOG"
sed -i 's/PA_FRONT_URL/REPORT_DEVICE_URL/g' "$PIALERT_HOME/config/pialert.conf" 2>&1 >> "$LOG"
if ! grep -Fq PIALERT_PATH "$PIALERT_HOME/config/pialert.conf" ; then
echo "PIALERT_PATH = '$PIALERT_HOME'" >> "$PIALERT_HOME/config/pialert.conf"
fi
if ! grep -Fq QUERY_MYIP_SERVER "$PIALERT_HOME/config/pialert.conf" ; then
echo "QUERY_MYIP_SERVER = 'http://ipv4.icanhazip.com'" >> "$PIALERT_HOME/config/pialert.conf"
fi
}
# ------------------------------------------------------------------------------
# DB DDL
# ------------------------------------------------------------------------------
update_db() {
print_msg "- Updating DB permissions..."
sudo chgrp -R www-data $PIALERT_HOME/db 2>&1 >> "$LOG"
chmod -R 770 $PIALERT_HOME/db 2>&1 >> "$LOG"
print_msg "- Checking 'Parameters' table..."
TAB=`sqlite3 $PIALERT_HOME/db/pialert.db "SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='Parameters' COLLATE NOCASE;"` 2>&1 >> "$LOG"
if [ "$TAB" == "0" ] ; then
print_msg " - Creating 'Parameters' table..."
sqlite3 $PIALERT_HOME/db/pialert.db "CREATE TABLE Parameters (par_ID STRING (50) PRIMARY KEY NOT NULL COLLATE NOCASE, par_Value STRING (250) );" 2>&1 >> "$LOG"
sqlite3 $PIALERT_HOME/db/pialert.db "CREATE INDEX IDX_par_ID ON Parameters (par_ID COLLATE NOCASE);" 2>&1 >> "$LOG"
fi
print_msg "- Checking Devices new columns..."
COL=`sqlite3 $PIALERT_HOME/db/pialert.db "SELECT COUNT(*) FROM PRAGMA_TABLE_INFO ('Devices') WHERE name='dev_NewDevice' COLLATE NOCASE";` 2>&1 >> "$LOG"
if [ "$COL" == "0" ] ; then
print_msg " - Adding column 'NewDevice' to 'Devices'..."
sqlite3 $PIALERT_HOME/db/pialert.db "ALTER TABLE Devices ADD COLUMN dev_NewDevice BOOLEAN NOT NULL DEFAULT (1) CHECK (dev_NewDevice IN (0, 1) );" 2>&1 >> "$LOG"
sqlite3 $PIALERT_HOME/db/pialert.db "CREATE INDEX IDX_dev_NewDevice ON Devices (dev_NewDevice);"
fi
COL=`sqlite3 $PIALERT_HOME/db/pialert.db "SELECT COUNT(*) FROM PRAGMA_TABLE_INFO ('Devices') WHERE name='dev_Location' COLLATE NOCASE";` 2>&1 >> "$LOG"
if [ "$COL" == "0" ] ; then
print_msg " - Adding column 'Location' to 'Devices'..."
sqlite3 $PIALERT_HOME/db/pialert.db "ALTER TABLE Devices ADD COLUMN dev_Location STRING(250) COLLATE NOCASE;" 2>&1 >> "$LOG"
fi
}
# ------------------------------------------------------------------------------
# Test Pi.Alert
# ------------------------------------------------------------------------------
test_pialert() {
print_msg "- Testing Pi.Alert HW vendors database update process..."
print_msg "*** PLEASE WAIT A COUPLE OF MINUTES..."
stdbuf -i0 -o0 -e0 $PYTHON_BIN $PIALERT_HOME/back/pialert.py update_vendors_silent 2>&1 | tee -ai "$LOG"
echo ""
print_msg "- Testing Pi.Alert Internet IP Lookup..."
stdbuf -i0 -o0 -e0 $PYTHON_BIN $PIALERT_HOME/back/pialert.py internet_IP 2>&1 | tee -ai "$LOG"
echo ""
print_msg "- Testing Pi.Alert Network scan..."
print_msg "*** PLEASE WAIT A COUPLE OF MINUTES..."
stdbuf -i0 -o0 -e0 $PYTHON_BIN $PIALERT_HOME/back/pialert.py 1 2>&1 | tee -ai "$LOG"
}
# ------------------------------------------------------------------------------
# Check Pi.Alert Installation Path
# ------------------------------------------------------------------------------
check_pialert_home() {
if [ ! -e "$PIALERT_HOME" ] ; then
process_error "Pi.Alert directory dosn't exists: $PIALERT_HOME"
fi
}
# ------------------------------------------------------------------------------
# Check Python versions available
# ------------------------------------------------------------------------------
check_python_version() {
print_msg "- Checking Python..."
if [ -f /usr/bin/python ] ; then
PYTHON_BIN="python"
elif [ -f /usr/bin/python3 ] ; then
PYTHON_BIN="python3"
else
process_error "Python NOT installed"
fi
}
# ------------------------------------------------------------------------------
# Move Logfile
# ------------------------------------------------------------------------------
move_logfile() {
NEWLOG="$PIALERT_HOME/log/$LOG"
mkdir -p "$PIALERT_HOME/log"
mv $LOG $NEWLOG
LOG="$NEWLOG"
NEWLOG=""
}
# ------------------------------------------------------------------------------
# Log
# ------------------------------------------------------------------------------
log() {
echo "$1" | tee -a "$LOG"
}
log_no_screen () {
echo "$1" >> "$LOG"
}
log_only_screen () {
echo "$1"
}
print_msg() {
log_no_screen ""
log "$1"
}
print_superheader() {
log ""
log "############################################################"
log " $1"
log "############################################################"
}
print_header() {
log ""
log "------------------------------------------------------------"
log " $1"
log "------------------------------------------------------------"
}
process_error() {
log ""
log "************************************************************"
log "************************************************************"
log "** ERROR UPDATING PI.ALERT **"
log "************************************************************"
log "************************************************************"
log ""
log "$1"
log ""
log "Use 'cat $LOG' to view update log"
log ""
exit 1
}
# ------------------------------------------------------------------------------
main
exit 0

View File

@@ -3,7 +3,7 @@
# Pi.Alert
# Open Source Network Guard / WIFI & LAN intrusion detector
#
# create_tar.sh - Create the installation file
# create_tar.sh - Create the tar file for installation
# ------------------------------------------------------------------------------
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3
# ------------------------------------------------------------------------------
@@ -25,4 +25,3 @@ tar cvf pialert/tar/pialert_$PIALERT_VERSION.tar --exclude="pialert/tar" --exclu
ln -s pialert_$PIALERT_VERSION.tar pialert/tar/pialert_latest.tar
ls -l pialert/tar/pialert*.tar

Binary file not shown.