60 lines
2.2 KiB
PHP
60 lines
2.2 KiB
PHP
<?php
|
|
|
|
namespace App\Providers;
|
|
|
|
use App\Provisioning\PipelineRegistry;
|
|
use App\Services\Dns\HetznerDnsClient;
|
|
use App\Services\Dns\HttpHetznerDnsClient;
|
|
use App\Services\Monitoring\HttpMonitoringClient;
|
|
use App\Services\Monitoring\MonitoringClient;
|
|
use App\Services\Proxmox\HttpProxmoxClient;
|
|
use App\Services\Proxmox\ProxmoxClient;
|
|
use App\Services\Ssh\PhpseclibRemoteShell;
|
|
use App\Services\Ssh\RemoteShell;
|
|
use App\Services\Traefik\SshTraefikWriter;
|
|
use App\Services\Traefik\TraefikWriter;
|
|
use App\Services\Wireguard\LocalWireguardHub;
|
|
use App\Services\Wireguard\WireguardHub;
|
|
use App\Models\MaintenanceNotification;
|
|
use Illuminate\Mail\Events\MessageSent;
|
|
use Illuminate\Support\Facades\Event;
|
|
use Illuminate\Support\ServiceProvider;
|
|
|
|
class AppServiceProvider extends ServiceProvider
|
|
{
|
|
/**
|
|
* Register any application services.
|
|
*/
|
|
public function register(): void
|
|
{
|
|
$this->app->singleton(PipelineRegistry::class, fn () => new PipelineRegistry(
|
|
config('provisioning.pipelines', []),
|
|
));
|
|
|
|
// Real I/O implementations; tests swap in fakes via app()->instance().
|
|
$this->app->bind(RemoteShell::class, PhpseclibRemoteShell::class);
|
|
$this->app->bind(WireguardHub::class, LocalWireguardHub::class);
|
|
$this->app->bind(ProxmoxClient::class, HttpProxmoxClient::class);
|
|
$this->app->bind(HetznerDnsClient::class, HttpHetznerDnsClient::class);
|
|
$this->app->bind(TraefikWriter::class, SshTraefikWriter::class);
|
|
$this->app->bind(MonitoringClient::class, HttpMonitoringClient::class);
|
|
}
|
|
|
|
/**
|
|
* Bootstrap any application services.
|
|
*/
|
|
public function boot(): void
|
|
{
|
|
// Stamp a maintenance-notification ledger row as delivered only once the
|
|
// mail is actually sent (the X-CP-Notification header carries the id).
|
|
// Until then sent_at stays null → the row is a retryable marker.
|
|
Event::listen(MessageSent::class, function (MessageSent $event) {
|
|
$header = $event->message->getHeaders()->get('X-CP-Notification');
|
|
if ($header === null) {
|
|
return;
|
|
}
|
|
MaintenanceNotification::query()->whereKey((int) $header->getBodyAsString())->update(['sent_at' => now()]);
|
|
});
|
|
}
|
|
}
|