diff --git a/app/Observers/DomainObserver.php b/app/Observers/DomainObserver.php index a85d379..1e06f4e 100644 --- a/app/Observers/DomainObserver.php +++ b/app/Observers/DomainObserver.php @@ -2,8 +2,10 @@ namespace App\Observers; +use App\Models\DkimKey; use App\Models\Domain; use Illuminate\Support\Facades\Log; +use Illuminate\Support\Facades\Process; class DomainObserver { @@ -41,33 +43,87 @@ class DomainObserver /** * Beim Löschen alle DKIM-Selector dieser Domain aus OpenDKIM entfernen. */ - - public function deleted(Domain $domain): void + public function deleting(Domain $domain): void { try { $svc = app(\App\Services\DkimService::class); - foreach ($domain->dkimKeys as $key) { - $svc->removeForDomain($domain, $key->selector); + // Selector VOR dem Delete einsammeln (Relation oder direkte Query) + $selectors = DkimKey::where('domain_id', $domain->id)->pluck('selector')->all(); + $selectors = $selectors ?: ['mwl1']; + + foreach ($selectors as $sel) { + $cmd = ['sudo','-n','/usr/local/sbin/mailwolt-remove-dkim', $domain->domain, $sel]; + $res = Process::timeout(30)->run($cmd); + Log::info('DKIM remove exit', [ + 'domain' => $domain->domain, + 'selector' => $sel, + 'exit' => $res->exitCode(), + 'out' => $res->output(), + 'err' => $res->errorOutput(), + ]); + if ($res->failed()) { + throw new \RuntimeException('OpenDKIM-Remove fehlgeschlagen: '.$res->errorOutput()); + } } - // Local storage wegräumen (kein Root nötig) + // lokale Backups unter storage/… löschen (App-User, kein sudo nötig) $path = storage_path("app/private/dkim/{$domain->domain}"); if (is_dir($path)) { \Illuminate\Support\Facades\File::deleteDirectory($path); } - Log::info("Domain deleted + DKIM cleaned", ['domain' => $domain->domain]); + // OpenDKIM neu laden (best effort) + Process::run(['sudo','-n','/bin/systemctl','reload','opendkim']); } catch (\Throwable $e) { - Log::error("Domain delete cleanup failed", ['domain'=>$domain->domain,'error'=>$e->getMessage()]); + Log::error('Domain deleting cleanup failed', [ + 'domain' => $domain->domain, + 'error' => $e->getMessage(), + ]); + // Optional: Exception werfen, um das Löschen vollständig abzubrechen + // throw $e; } } + /** Nur noch Info-Log NACH dem Löschen (kein Cleanup mehr hier) */ + public function deleted(Domain $domain): void + { + Log::info('Domain deleted', ['domain' => $domain->domain]); + } + + /** Für forceDelete bei SoftDeletes */ public function forceDeleted(Domain $domain): void { $this->deleted($domain); } + +// public function deleted(Domain $domain): void +// { +// try { +// $svc = app(\App\Services\DkimService::class); +// +// foreach ($domain->dkimKeys as $key) { +// $svc->removeForDomain($domain, $key->selector); +// } +// +// // Local storage wegräumen (kein Root nötig) +// $path = storage_path("app/private/dkim/{$domain->domain}"); +// if (is_dir($path)) { +// \Illuminate\Support\Facades\File::deleteDirectory($path); +// } +// +// Log::info("Domain deleted + DKIM cleaned", ['domain' => $domain->domain]); +// } catch (\Throwable $e) { +// Log::error("Domain delete cleanup failed", ['domain'=>$domain->domain,'error'=>$e->getMessage()]); +// } +// } +// +// public function forceDeleted(Domain $domain): void +// { +// $this->deleted($domain); +// } + // public function created(Domain $domain): void // { // if ($domain->is_server) {