diff --git a/Glances/Glances.php b/Glances/Glances.php
index 3dd5c1b201..e963ba71ac 100644
--- a/Glances/Glances.php
+++ b/Glances/Glances.php
@@ -2,6 +2,105 @@
namespace App\SupportedApps\Glances;
-class Glances extends \App\SupportedApps
+class Glances extends \App\SupportedApps implements \App\EnhancedApps
{
+ public $config;
+
+ public function __construct()
+ {
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url("status"));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = "inactive";
+ $details = [];
+
+ if (isset($this->config->availablestats) && is_array($this->config->availablestats)) {
+ $details = ["visiblestats" => []];
+ foreach ($this->config->availablestats as $stat) {
+ $newstat = new \stdClass();
+ $availableStats = self::getAvailableStats();
+
+ if (isset($availableStats[$stat])) {
+ $newstat->title = $availableStats[$stat];
+
+ // Fetch CpuTotal
+ if ($stat === "CpuTotal") {
+ $Response = parent::execute($this->url("cpu/total"));
+ $result = json_decode($Response->getBody());
+ if (isset($result->total)) {
+ $newstat->value = $result->total;
+ } else {
+ $newstat->value = null; // or some default value
+ }
+ }
+
+ // Fetch MemTotal
+ if ($stat === "MemTotal") {
+ $Response = parent::execute($this->url("mem/total"));
+ $result = json_decode($Response->getBody());
+ if (isset($result->total)) {
+ $newstat->value = $this->convertBytesToGigabytes($result->total);
+ } else {
+ $newstat->value = null; // or some default value
+ }
+ }
+
+ // Fetch MemAvail
+ if ($stat === "MemAvail") {
+ $Response = parent::execute($this->url("mem/available"));
+ $result = json_decode($Response->getBody());
+ if (isset($result->available)) {
+ $newstat->value = $this->convertBytesToGigabytes($result->available);
+ } else {
+ $newstat->value = null; // or some default value
+ }
+ }
+
+ // Fetch MemAvail
+ if ($stat === "MemUsage") {
+ $Response = parent::execute($this->url("mem/used"));
+ $result = json_decode($Response->getBody());
+ if (isset($result->used)) {
+ $newstat->value = $this->convertBytesToGigabytes($result->used);
+ } else {
+ $newstat->value = null; // or some default value
+ }
+ }
+
+ $details["visiblestats"][] = $newstat;
+ }
+ }
+ }
+
+ return parent::getLiveStats($status, $details);
+ }
+
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url) . "api/4/" . $endpoint;
+ return $api_url;
+ }
+
+ public static function getAvailableStats()
+ {
+ return [
+ "CpuTotal" => "CpuTotal",
+ "MemTotal" => "MemTotal",
+ "MemAvail" => "MemAvail",
+ "MemUsage" => "MemUsage",
+ ];
+ }
+
+ private function convertBytesToGigabytes($bytes)
+ {
+ $gigabytes = $bytes / (1024 ** 3); // Converts bytes to gigabytes
+ return round($gigabytes, 2) . ' GB'; // Rounds to 4 significant digits
+ }
}
diff --git a/Glances/app.json b/Glances/app.json
index b5916532a1..ac87d08170 100644
--- a/Glances/app.json
+++ b/Glances/app.json
@@ -4,7 +4,7 @@
"website": "https://nicolargo.github.io/glances",
"license": "GNU Lesser General Public License v3.0 only",
"description": "Glances is a cross-platform monitoring tool which aims to present a large amount of monitoring information through a curses or Web based interface.",
- "enhanced": false,
+ "enhanced": true,
"tile_background": "dark",
"icon": "glances.png"
}
diff --git a/Glances/config.blade.php b/Glances/config.blade.php
new file mode 100644
index 0000000000..e6d527bf2e
--- /dev/null
+++ b/Glances/config.blade.php
@@ -0,0 +1,14 @@
+
{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+
+ {!! Form::text('config[override_url]', isset($item) ? $item->getconfig()->override_url : null, ['placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control']) !!}
+
+
+
+ {!! Form::select('config[availablestats][]', App\SupportedApps\Glances\Glances::getAvailableStats(), isset($item) ? $item->getConfig()->availablestats ?? null : null, ['multiple' => 'multiple']) !!}
+
+
+
+
+
diff --git a/Glances/livestats.blade.php b/Glances/livestats.blade.php
new file mode 100644
index 0000000000..cb9431aef3
--- /dev/null
+++ b/Glances/livestats.blade.php
@@ -0,0 +1,8 @@
+
+ @foreach ($visiblestats as $stat)
+ -
+ {!! $stat->title !!}
+ {!! $stat->value !!}
+
+ @endforeach
+
diff --git a/Gotify/app.json b/Gotify/app.json
index 04c632383f..4051a80831 100644
--- a/Gotify/app.json
+++ b/Gotify/app.json
@@ -7,4 +7,4 @@
"enhanced": true,
"tile_background": "dark",
"icon": "gotify.png"
-}
+}
\ No newline at end of file
diff --git a/Mailcow/Mailcow.php b/Mailcow/Mailcow.php
index ad59477422..30138e146b 100644
--- a/Mailcow/Mailcow.php
+++ b/Mailcow/Mailcow.php
@@ -2,6 +2,80 @@
namespace App\SupportedApps\Mailcow;
-class Mailcow extends \App\SupportedApps
+class Mailcow extends \App\SupportedApps implements \App\EnhancedApps
{
+ public $config;
+
+ public function __construct()
+ {
+ }
+
+ public function test()
+ {
+ $attrs = $this->getAttrs();
+ $test = parent::appTest($this->url("status/containers"), $attrs);
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = "inactive";
+ $data = [];
+ $attrs = $this->getAttrs();
+
+ // Fetch mailboxes
+ $mailboxesResponse = parent::execute($this->url("mailbox/all"), $attrs);
+ $mailboxes = json_decode($mailboxesResponse->getBody());
+
+ // Count mailboxes
+ if ($mailboxes) {
+ $data["mailboxes"] = count($mailboxes);
+ } else {
+ $data["mailboxes"] = 0;
+ }
+
+ // Fetch clients
+ $domainsResponse = parent::execute($this->url("domain/all"), $attrs);
+ $domains = json_decode($domainsResponse->getBody());
+
+ // Count clients
+ if ($domains) {
+ $data["domains"] = count($domains);
+ } else {
+ $data["domains"] = 0;
+ }
+
+ // Fetch messages
+ $queueResponse = parent::execute($this->url("mailq/all"), $attrs);
+ $queue = json_decode($queueResponse->getBody());
+
+ // Count messages
+ if ($queue && isset($queue->messages)) {
+ $data["queue"] = count($queue->messages);
+ } else {
+ $data["queue"] = 0;
+ }
+
+ // Determine status based on data
+ if ($data["mailboxes"] > 0 || $data["domains"] > 0 || $data["queue"] >= 0) {
+ $status = "active";
+ }
+
+ return parent::getLiveStats($status, $data);
+ }
+
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url) . "api/v1/get/" . $endpoint;
+ return $api_url;
+ }
+ private function getAttrs()
+ {
+ return [
+ "headers" => [
+ "Accept" => "application/json",
+ "X-API-Key" => $this->config->apikey
+ ],
+ ];
+ }
}
diff --git a/Mailcow/app.json b/Mailcow/app.json
index 3d6ae8cfe9..68554d62f9 100644
--- a/Mailcow/app.json
+++ b/Mailcow/app.json
@@ -4,7 +4,7 @@
"website": "https://mailcow.email",
"license": "GNU General Public License v3.0 only",
"description": "Mailcow is a Docker based email server which provides an elegant web interface for managing domains, mailboxes and more.",
- "enhanced": false,
+ "enhanced": true,
"tile_background": "dark",
"icon": "mailcow.svg"
}
diff --git a/Mailcow/config.blade.php b/Mailcow/config.blade.php
new file mode 100644
index 0000000000..4a8082c945
--- /dev/null
+++ b/Mailcow/config.blade.php
@@ -0,0 +1,14 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+
+ {!! Form::text('config[override_url]', isset($item) ? $item->getconfig()->override_url : null, ['placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control']) !!}
+
+
+
+ {!! Form::text('config[apikey]', isset($item) ? $item->getconfig()->apikey : null, ['placeholder' => __('app.apps.apikey'), 'data-config' => 'apikey', 'class' => 'form-control config-item']) !!}
+
+
+
+
+
diff --git a/Mailcow/livestats.blade.php b/Mailcow/livestats.blade.php
new file mode 100644
index 0000000000..6fe23a6ff3
--- /dev/null
+++ b/Mailcow/livestats.blade.php
@@ -0,0 +1,14 @@
+
+ -
+ Mailboxes
+ {!! $mailboxes !!}
+
+ -
+ Domains
+ {!! $domains !!}
+
+ -
+ Queue
+ {!! $queue !!}
+
+