'/etc/rspamd/local.d/actions.conf', '/etc/dovecot/conf.d/99-mailwolt-tls.conf' => '/etc/dovecot/conf.d/99-tls.conf', '/etc/postfix/mailwolt-tls.cf' => '/etc/postfix/tls.cf', '/etc/fail2ban/jail.d/mailwolt-whitelist.local' => '/etc/fail2ban/jail.d/whitelist.local', '/etc/fail2ban/jail.d/00-mailwolt-defaults.local'=> '/etc/fail2ban/jail.d/00-defaults.local', ]; public function handle(): int { $dry = $this->option('dry-run'); foreach ($this->renames as $old => $new) { if (!file_exists($old)) { $this->line(" übersprungen {$old} (nicht vorhanden)"); continue; } if (file_exists($new) && !is_link($new)) { $this->line(" bereits vorhanden {$new}"); continue; } if ($dry) { $this->line(" [dry-run] mv {$old} → {$new}"); continue; } // Als root direkt umbenennen; als www-data via sudo (sudo mv muss in sudoers sein) if (posix_getuid() === 0) { $ok = @rename($old, $new); $errMsg = error_get_last()['message'] ?? ''; } else { @exec('sudo -n mv ' . escapeshellarg($old) . ' ' . escapeshellarg($new) . ' 2>&1', $out, $rc); $ok = ($rc === 0); $errMsg = implode(' ', $out); } if ($ok) { $this->info(" umbenannt: {$old} → {$new}"); } else { $this->error(" FEHLER bei {$old}: {$errMsg}"); $this->line(" → manuell: mv {$old} {$new}"); } } if (!$dry) { $this->info('Fertig. Dienste ggf. neu starten: rspamd, dovecot, postfix, fail2ban'); } return self::SUCCESS; } }