135 lines
5.0 KiB
PHP
135 lines
5.0 KiB
PHP
<?php
|
||
|
||
namespace App\Livewire\Ui\Domain;
|
||
|
||
use App\Models\Domain;
|
||
use App\Services\DkimService;
|
||
use Illuminate\Contracts\View\View;
|
||
use Illuminate\Support\Facades\Log;
|
||
use Illuminate\Support\Facades\Process;
|
||
use Livewire\Attributes\On;
|
||
use Livewire\Component;
|
||
|
||
class DkimStatus extends Component
|
||
{
|
||
public Domain $domain;
|
||
public ?string $selector = null;
|
||
|
||
public function mount(Domain $domain, ?string $selector = null): void
|
||
{
|
||
$this->domain = $domain;
|
||
|
||
// aktiver Selector aus DB, sonst Default aus config
|
||
$this->selector = $selector
|
||
?: optional(
|
||
$domain->dkimKeys()->where('is_active', true)->latest()->first()
|
||
)->selector
|
||
?: (string) config('mailpool.defaults.dkim_selector', 'mwl1');
|
||
}
|
||
|
||
/**
|
||
* Minimalcheck: ist das Keyfile vorhanden & >0 Bytes?
|
||
* Nutzt sudo /usr/bin/test, damit www-data auch bei 0600/0750 prüfen kann.
|
||
*/
|
||
protected function isDkimReady(string $domain, string $selector): bool
|
||
{
|
||
$key = "/etc/opendkim/keys/{$domain}/{$selector}.private";
|
||
|
||
// -s => existiert und Größe > 0
|
||
$res = Process::run(['sudo','-n','/usr/bin/test','-s',$key]);
|
||
|
||
return $res->successful();
|
||
}
|
||
|
||
/** Button: (Re)generieren → Service kümmert sich um Helper & Reload */
|
||
// #[On('dkim:regenerate')]
|
||
// public function regenerate(?string $selector = null): void
|
||
// {
|
||
// $selector = $selector
|
||
// ?: ($this->selector ?: (string) config('mailpool.defaults.dkim_selector', 'mwl1'));
|
||
//
|
||
// Log::info('DKIM regenerate() CLICKED', [
|
||
// 'domain' => $this->domain->domain,
|
||
// 'selector' => $selector,
|
||
// 'user' => auth()->id(),
|
||
// ]);
|
||
//
|
||
// try {
|
||
// /** @var DkimService $svc */
|
||
// $svc = app(\App\Services\DkimService::class);
|
||
//
|
||
// Log::info('DKIM regenerate() calling service.generateForDomain');
|
||
// $svc->generateForDomain($this->domain, 2048, $selector);
|
||
// Log::info('DKIM regenerate() service call returned OK');
|
||
//
|
||
// // sicherheitshalber
|
||
// \Illuminate\Support\Facades\Process::run(['sudo','-n','/usr/bin/systemctl','reload','opendkim']);
|
||
//
|
||
// $ok = $this->isDkimReady($this->domain->domain, $selector);
|
||
// $this->dispatch('toast', type: $ok ? 'success' : 'warning',
|
||
// message: $ok ? 'DKIM ist aktiv.' : 'DKIM generiert – OpenDKIM prüfen.');
|
||
// } catch (\Throwable $e) {
|
||
// Log::error('DKIM regenerate() failed', ['ex' => $e->getMessage(), 'trace' => $e->getTraceAsString()]);
|
||
// $this->dispatch('toast', type: 'error', message: 'DKIM Fehler: '.$e->getMessage());
|
||
// }
|
||
//
|
||
// $this->selector = $selector;
|
||
// }
|
||
|
||
public function regenerate(?string $selector = null): void
|
||
{
|
||
$selector = $selector
|
||
?: ($this->selector ?: (string) config('mailpool.defaults.dkim_selector', 'mwl1'));
|
||
|
||
Log::info('DKIM regenerate() CLICKED', [
|
||
'domain' => $this->domain->domain,
|
||
'selector' => $selector,
|
||
'user' => auth()->id(),
|
||
]);
|
||
|
||
try {
|
||
/** @var \App\Services\DkimService $svc */
|
||
$svc = app(\App\Services\DkimService::class);
|
||
|
||
// 1) Keymaterial in storage erzeugen/aktualisieren
|
||
$res = $svc->generateForDomain($this->domain, 2048, $selector);
|
||
$priv = $res['priv_path']
|
||
?? storage_path("app/private/dkim/{$this->domain->domain}/{$selector}.private");
|
||
$txt = storage_path("app/private/dkim/{$this->domain->domain}/{$selector}.txt");
|
||
|
||
if (!is_readable($txt) && !empty($res['dns_txt'])) {
|
||
file_put_contents($txt, $res['dns_txt']);
|
||
}
|
||
|
||
// 2) In OpenDKIM installieren (Key kopieren + Tabellen pflegen)
|
||
$proc = Process::run([
|
||
'sudo','-n','/usr/local/sbin/mailwolt-install-dkim',
|
||
$this->domain->domain, $selector, $priv, $txt
|
||
]);
|
||
if (!$proc->successful()) {
|
||
throw new \RuntimeException("install-dkim failed: ".$proc->errorOutput());
|
||
}
|
||
|
||
// 3) OpenDKIM neu laden
|
||
Process::run(['sudo','-n','/usr/bin/systemctl','reload','opendkim']);
|
||
|
||
$ok = $this->isDkimReady($this->domain->domain, $selector);
|
||
$this->dispatch('toast', type: $ok ? 'success' : 'warning',
|
||
message: $ok ? 'DKIM ist aktiv.' : 'DKIM generiert – OpenDKIM prüfen.');
|
||
} catch (\Throwable $e) {
|
||
Log::error('DKIM regenerate() failed', ['ex'=>$e->getMessage()]);
|
||
$this->dispatch('toast', type: 'error', message: 'DKIM Fehler: '.$e->getMessage());
|
||
}
|
||
|
||
$this->selector = $selector;
|
||
}
|
||
|
||
public function render(): View
|
||
{
|
||
$sel = $this->selector ?: (string) config('mailpool.defaults.dkim_selector', 'mwl1');
|
||
$dkimOk = $this->isDkimReady($this->domain->domain, $sel);
|
||
|
||
return view('livewire.ui.domain.dkim-status', compact('dkimOk'));
|
||
}
|
||
}
|