Devices-Übersicht:

* Anzeige des Backupstatus (OK,älter als 48 Stunden, kein Backup vorhanden)

DeviceApicontroller:
* Update Devices hinzugefügt (nur last_config_backup update erlaubt)

Funktionsweise:
Sobald eine Config am API Server registriert wird, wird per API Richtung Tool der Timestamp der Config in der Tool-DB geupdated
Somit ist für die Übersicht keine direkte API Schnittstelle notwendig.

SmsNotification Klasse hinzugefügt.
Habs gleich wie die Emailnotification gehalten.
Ist zum puschen von SMSen an ein Absenderarray oder Einzelabsender.
Erfüllt in dem Commit noch keine Funktion.

Config Erweiterungen:
define("TT_OUTGOING_SMS_API_KEY", "key");
define("TT_OUTGOING_SMS_API_URL", "api.websms.com/rest");
This commit is contained in:
Spitzer_Daniel
2023-07-25 14:06:12 +02:00
parent d3576ecafb
commit 80ad551c50
5 changed files with 153 additions and 6 deletions

View File

@@ -4,7 +4,8 @@ $pagination_baseurl_params = ["filter" => $filter];
$pagination_entity_name = "Device";
?>
<?php include(realpath(dirname(__FILE__) . "/../../$mfLayoutPackage") . "/header.php"); ?>
<link href="<?=self::getResourcePath()?>assets/css/datatables-std.css?<?=date('U')?>" rel="stylesheet" type="text/css" />
<link href="<?= self::getResourcePath() ?>assets/css/datatables-std.css?<?= date('U') ?>" rel="stylesheet"
type="text/css"/>
<!-- start page title -->
<div class="row">
<div class="col-12">
@@ -52,6 +53,7 @@ $pagination_entity_name = "Device";
<th class="text-center">Seriennummer</th>
<th class="text-center">Preis</th>
<th class="text-center">max. Leistung</th>
<th class="text-center">Backup</th>
<th class="edit-width"></th>
</tr>
<tr id="filterrow">
@@ -65,6 +67,7 @@ $pagination_entity_name = "Device";
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
@@ -81,6 +84,20 @@ $pagination_entity_name = "Device";
} else {
$power = $device->devicetype->power;
}
if ($device->last_config_backup) {
if (time() - $device->last_config_backup <= 172800) {
$backup = '<i class="fa-regular fa-circle-check"><span style="display: none">OK</span></i>';
} else {
$backup = '<i class="fa-regular fa-circle-xmark"><span style="display: none">AGED</span></i>';
}
} else {
$backup = '<i class="fa-regular fa-ban"><span style="display: none">N/A</span></i>';
}
?>
<tr>
@@ -97,6 +114,7 @@ $pagination_entity_name = "Device";
<td class="text-center"><?= $device->serial ?></td>
<td class="text-right"><?= $price ?> €</td>
<td class="text-right"><?= $power ?> Watt</td>
<td class="text-center"><?= $backup ?></td>
<td style="text-align: left; letter-spacing: 4px; font-size: 1.1em; width: 80px">
@@ -126,13 +144,17 @@ $pagination_entity_name = "Device";
<script type="text/javascript">
var hidesearch=[9];
var columndefs={ type: 'ip-address', targets: 4 };
var hidesearch = [10];
var columndefs = {type: 'ip-address', targets: 4};
var columnfilter = [9];
$(document).ready(function () {
});
</script>
<script type="text/javascript" src="<?=self::getResourcePath()?>assets/js/datatables-std.js?<?=date('U')?>"></script>
<script type="text/javascript"
src="<?= self::getResourcePath() ?>assets/js/datatables-std.js?<?= date('U') ?>"></script>
<?php include(realpath(dirname(__FILE__) . "/../../$mfLayoutPackage") . "/footer.php"); ?>

View File

@@ -6,6 +6,7 @@ class DeviceApicontroller extends mfBaseApicontroller
{
$db = $this->db(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
$this->addRoute("/device/getDevices", "getDevices", "GET");
$this->addRoute("/device/updateDevices", "updateDevices", "POST");
}
@@ -18,6 +19,7 @@ class DeviceApicontroller extends mfBaseApicontroller
$deviceReturn[$key]['ip'] = $device->ip;
$deviceReturn[$key]['snmp_version'] = $device->snmp_version;
$deviceReturn[$key]['serial'] = $device->serial;
$deviceReturn[$key]['last_config_backup'] = $device->last_config_backup;
$deviceReturn[$key]['manufactor'] = $device->devicetype->devicemanufactor->name;
}
@@ -25,4 +27,40 @@ class DeviceApicontroller extends mfBaseApicontroller
return mfResponse::Ok($deviceReturn);
}
protected function updateDevices()
{
$id = $this->post['id'];
$changeArray[] = 'last_config_backup';
if ($id) {
$device = new Device($id);
if (!$device->id) {
return mfResponse::BadRequest(['message' => "Device not found"]);
}
$data = [];
foreach ($this->post as $keychanges => $changes) {
if (in_array($keychanges, $changeArray)) {
if ($changes == "null" || empty($changes)) {
$data[$keychanges] = NULL;
} else {
$data[$keychanges] = $changes;
}
}
}
if (!empty($data)) {
$device->update($data);
$device->save();
$result['message'] = 'Device update success';
$result['updates'] = implode(",", array_keys($data));
return mfResponse::Ok($result);
} else {
return mfResponse::BadRequest(['message' => "Keine Update Felder angegeben"]);
}
} else {
return mfResponse::BadRequest(['message' => "Device id nicht angegeben"]);
}
}
}

View File

@@ -0,0 +1,56 @@
<?php
class SmsNotification
{
private $ApiKey;
private $ApiUrl;
private $body;
private $recipient;
public function __construct()
{
$this->ApiKey = TT_OUTGOING_SMS_API_KEY;
$this->ApiUrl = TT_OUTGOING_SMS_API_URL;
}
public function setBody($body)
{
$this->body = $body;
}
public function setRecipient($recipient)
{
if (is_array($recipient)) {
$this->recipient = implode(",", $recipient);
} else {
$this->recipient = $recipient;
}
}
public function send()
{
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $this->ApiUrl . '/smsmessaging/simple',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => array('messageContent' => $this->body, 'recipientAddressList' => $this->recipient),
CURLOPT_HTTPHEADER => array(
'Authorization: Bearer ' . $this->ApiKey
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
}
}

View File

@@ -87,3 +87,18 @@
.w-30 {
width: 33% !important;
}
.fa-ban
{
color: #0151e7;
font-size: 15px;
}
.fa-circle-check
{
color: #23b900;
font-size: 15px;
}
.fa-circle-xmark
{
color: #f1556c;
font-size: 15px;
}

View File

@@ -16,12 +16,19 @@ if (typeof columndefs === "undefined") {
}
if (typeof columnfilter === "undefined") {
var columnfilter;
columnfilter = "";
}
$('#filterrow th').each(function (i) {
let title = $('#datatable thead th').eq($(this).index()).text();
if (hidesearch.includes($(this).index())) {
} else if (columnfilter.includes($(this).index())) {
$(this).html('<select style="padding: 0;height: 28px;;text-align: center;" id="selectsearch" class="form-control form-control-select form-control-special" data-index="' + i + '"><option value=""></option><option value="OK">OK</option><option value="AGED">AGED</option><option value="N/A">N/A</option></select>');
} else {
$(this).html('<input type="text" placeholder="' + title + '" class="form-control" data-index="' + i + '" value="" />');
}
@@ -46,8 +53,8 @@ table = $('#datatable').DataTable({
"initComplete": function () {
$('#datatable_filter').append('<i id="clear_cookie" class="fas fa-times clear-fa" title="Filter löschen" aria-hidden="true" ></i>');
$('#clear_cookie').click(function () {
$('input').val('');
$('#filterrow input').val('');
$('#filterrow select').val('');
table.search('').columns().search('').draw();
});
},
@@ -63,6 +70,15 @@ $('#filterrow').on('keyup', 'input', function () {
.draw();
});
$('#selectsearch').change(function () {
table
.column($(this).data('index'))
.search(this.value)
.draw();
});
let state = table.state.loaded();
if (state) {