Page MenuHomePhorge

No OneTemporary

diff --git a/src/app/Console/Commands/Status/Health.php b/src/app/Console/Commands/Status/Health.php
index e40e561a..7a63f63a 100644
--- a/src/app/Console/Commands/Status/Health.php
+++ b/src/app/Console/Commands/Status/Health.php
@@ -1,207 +1,182 @@
<?php
namespace App\Console\Commands\Status;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redis;
use App\Backends\LDAP;
use App\Backends\IMAP;
use App\Backends\Roundcube;
use App\Backends\OpenExchangeRates;
use App\Providers\Payment\Mollie;
//TODO stripe
//TODO firebase
class Health extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'status:health';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Check health of backends';
private function checkDB()
{
try {
$result = DB::select("SELECT 1");
return true;
} catch (\Exception $exception) {
$this->line($exception);
return false;
}
}
private function checkOpenExchangeRates()
{
try {
OpenExchangeRates::healthcheck();
return true;
} catch (\Exception $exception) {
$this->line($exception);
return false;
}
}
private function checkMollie()
{
try {
return Mollie::healthcheck();
} catch (\Exception $exception) {
$this->line($exception);
return false;
}
}
private function checkLDAP()
{
try {
LDAP::healthcheck();
return true;
} catch (\Exception $exception) {
$this->line($exception);
return false;
}
}
private function checkIMAP()
{
try {
IMAP::healthcheck();
return true;
} catch (\Exception $exception) {
$this->line($exception);
return false;
}
}
private function checkRoundcube()
{
try {
//TODO maybe run a select?
Roundcube::dbh();
return true;
} catch (\Exception $exception) {
$this->line($exception);
return false;
}
}
private function checkRedis()
{
try {
Redis::connection();
return true;
} catch (\Exception $exception) {
$this->line($exception);
return false;
}
}
private function checkMeet()
{
try {
$urls = \config('meet.api_urls');
foreach ($urls as $url) {
$this->line("Checking $url");
$client = new \GuzzleHttp\Client(
[
'http_errors' => false, // No exceptions from Guzzle
'base_uri' => $url,
'verify' => \config('meet.api_verify_tls'),
'headers' => [
'X-Auth-Token' => \config('meet.api_token'),
],
'connect_timeout' => 10,
'timeout' => 10,
'on_stats' => function (\GuzzleHttp\TransferStats $stats) {
$threshold = \config('logging.slow_log');
if ($threshold && ($sec = $stats->getTransferTime()) > $threshold) {
$url = $stats->getEffectiveUri();
$method = $stats->getRequest()->getMethod();
\Log::warning(sprintf("[STATS] %s %s: %.4f sec.", $method, $url, $sec));
}
},
]
);
$response = $client->request('GET', "ping");
if ($response->getStatusCode() != 200) {
$this->line("Backend not available: " . var_export($response, true));
return false;
}
}
return true;
} catch (\Exception $exception) {
$this->line($exception);
return false;
}
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
- $this->line("Checking DB...");
- if ($this->checkDB()) {
- $this->info("OK");
- } else {
- $this->error("Not found");
- }
- $this->line("Checking Redis...");
- if ($this->checkRedis()) {
- $this->info("OK");
- } else {
- $this->error("Not found");
- }
- $this->line("Checking LDAP...");
- if ($this->checkLDAP()) {
- $this->info("OK");
- } else {
- $this->error("Not found");
- }
- $this->line("Checking IMAP...");
- if ($this->checkIMAP()) {
- $this->info("OK");
- } else {
- $this->error("Not found");
- }
- $this->line("Checking Roundcube...");
- if ($this->checkRoundcube()) {
- $this->info("OK");
- } else {
- $this->error("Not found");
- }
- $this->line("Checking Meet...");
- if ($this->checkMeet()) {
- $this->info("OK");
- } else {
- $this->error("Not found");
- }
- $this->line("Checking OpenExchangeRates...");
- if ($this->checkOpenExchangeRates()) {
- $this->info("OK");
- } else {
- $this->error("Not found");
+ $result = 0;
+ $steps = [
+ 'DB', 'Redis', 'IMAP', 'Roundcube', 'Meet', 'Mollie', 'OpenExchangeRates',
+ ];
+
+ if (\config('app.with_ldap')) {
+ array_unshift($steps, 'LDAP');
}
- $this->line("Checking Mollie...");
- if ($this->checkMollie()) {
- $this->info("OK");
- } else {
- $this->error("Not found");
+
+ foreach ($steps as $step) {
+ $func = "check{$step}";
+
+ $this->line("Checking {$step}...");
+
+ if ($this->{$func}()) {
+ $this->info("OK");
+ } else {
+ $this->error("Not found");
+ $result = 1;
+ }
}
+
+ return $result;
}
}
diff --git a/src/tests/Feature/Console/Status/HealthTest.php b/src/tests/Feature/Console/Status/HealthTest.php
new file mode 100644
index 00000000..a6a3f2d9
--- /dev/null
+++ b/src/tests/Feature/Console/Status/HealthTest.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Tests\Feature\Console\Status\Health;
+
+use Tests\TestCase;
+
+class HealthTest extends TestCase
+{
+ /**
+ * Test the command
+ *
+ * @group ldap
+ * @group imap
+ * @group meet
+ * @group mollie
+ */
+ public function testHandle(): void
+ {
+ $code = \Artisan::call("status:health");
+ $output = trim(\Artisan::output());
+
+ $this->assertSame(0, $code);
+ }
+}

File Metadata

Mime Type
text/x-diff
Expires
Fri, Jun 27, 7:11 PM (1 h, 17 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
201398
Default Alt Text
(7 KB)

Event Timeline