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')); } }