current = $this->readCurrentVersion(); $this->latest = Cache::get('mailwolt.update_available'); $this->refreshLowLevelState(); // Starttext, falls nichts geprüft wurde if ($this->message === null) { $this->message = $this->latest && $this->hasUpdate() ? "Neue Version verfügbar: {$this->latest}" : ($this->current ? "Du bist auf dem neuesten Stand ({$this->current})" : "Status unbekannt"); $this->messagePositive = !$this->hasUpdate(); } } public function render() { return view('livewire.ui.system.update-card'); } /** * „Erneut prüfen“ – ohne Toast: * - Progress anzeigen * - Check-Command laufen lassen * - Message in der Box aktualisieren */ public function refreshState(): void { $this->state = 'running'; $this->message = 'Prüfe auf Updates …'; $this->messagePositive = null; try { // Passe den Namen hier an dein tatsächliches Command an: Artisan::call('mailwolt:check-updates'); } catch (\Throwable $e) { // weich fallen } // Daten neu einlesen $this->current = $this->readCurrentVersion(); $this->latest = Cache::get('mailwolt.update_available'); if ($this->hasUpdate()) { $this->message = "Neue Version verfügbar: {$this->latest}"; $this->messagePositive = false; // neutral } else { $cur = $this->current ?: '–'; $this->message = "Du bist auf dem neuesten Stand ({$cur})"; $this->messagePositive = true; // grün } $this->refreshLowLevelState(); $this->state = 'idle'; } /** * „Jetzt aktualisieren“ – ohne Toast: * - Hinweis sofort aus Cache entfernen (Badge weg) * - Update-Wrapper starten * - Running + Text in der Box anzeigen */ public function runUpdate(): void { Cache::forget('mailwolt.update_available'); @shell_exec('nohup sudo -n /usr/local/sbin/mw-update >/dev/null 2>&1 &'); $this->latest = null; $this->state = 'running'; $this->running = true; $this->message = 'Update läuft …'; $this->messagePositive = null; } /** --------------------- helpers --------------------- */ protected function hasUpdate(): bool { if (!$this->latest) return false; $cur = $this->current ?: '0.0.0'; return version_compare($this->latest, $cur, '>'); } protected function refreshLowLevelState(): void { $state = @trim(@file_get_contents('/var/lib/mailwolt/update/state') ?: ''); $this->running = ($state === 'running'); $rcRaw = @trim(@file_get_contents('/var/lib/mailwolt/update/rc') ?: ''); $this->rc = is_numeric($rcRaw) ? (int)$rcRaw : null; } protected function readCurrentVersion(): ?string { // bevorzugt /etc/mailwolt/build.info (wird im Installer/Updater gepflegt) $build = @file_get_contents('/etc/mailwolt/build.info'); if ($build) { foreach (preg_split('/\R+/', $build) as $line) { if (str_starts_with($line, 'version=')) { $v = trim(substr($line, 8)); if ($v !== '') return $v; } } } $v = config('app.version'); return $v !== '' ? $v : null; } } // // //namespace App\Livewire\Ui\System; // //use Livewire\Component; //use Illuminate\Support\Facades\Artisan; //use Illuminate\Support\Facades\Cache; // //class UpdateCard extends Component //{ // public ?string $current = null; // z.B. v1.0.16 (aktuell installiert) // public ?string $latest = null; // z.B. v1.0.17 (verfügbar) oder null // public string $state = 'idle'; // idle | running // // // optional: Low-level-Infos, falls du sie irgendwo anders brauchst // public bool $running = false; // Wrapper-/Updater läuft gerade (aus State-Datei) // public string $log = ''; // public ?int $rc = null; // // public function mount(): void // { // $this->current = $this->readCurrentVersion(); // $this->latest = Cache::get('mailwolt.update_available'); // $this->refreshLowLevelState(); // liest /var/lib/mailwolt/update/* // } // // public function render() // { // return view('livewire.ui.system.update-card'); // } // // /** // * „Erneut prüfen“: // * - zeigt Running-Progress // * - ruft den Checker (dein bestehendes Artisan-Command) // * - aktualisiert $latest / $current // * - dispatcht passenden Toast // */ // public function refreshState(): void // { // $this->state = 'running'; // // // Falls vorhanden: dein Command, der cache('mailwolt.update_available') setzt // // -> Namen ggf. anpassen (du hattest z.B. mailwolt:check-updates erwähnt) // try { // Artisan::call('mailwolt:check-updates'); // } catch (\Throwable $e) { // // Wenn das Command (noch) nicht existiert, nicht crashen – state einfach zurücksetzen // } // // // App-Status neu einlesen // $this->current = $this->readCurrentVersion(); // $this->latest = Cache::get('mailwolt.update_available'); // // $hasUpdate = $this->hasUpdate(); // // // Toast ausspielen // $this->dispatch('toast', // type: $hasUpdate ? 'info' : 'done', // badge: 'Update', // title: $hasUpdate ? 'Neue Version verfügbar' : 'Alles aktuell', // text: $hasUpdate // ? "Verfügbar: {$this->latest} – installiert: {$this->current}" // : "Du bist auf dem neuesten Stand ({$this->current}).", // duration: 6000 // ); // // // Low-level-State (optional) und UI-State zurücksetzen // $this->refreshLowLevelState(); // $this->state = 'idle'; // } // // /** // * „Jetzt aktualisieren“: // * - blendet die verfügbare-Version sofort aus // * - startet den Root-Wrapper im Hintergrund // * - zeigt einen Toast „Update gestartet“ // */ // public function runUpdate(): void // { // Cache::forget('mailwolt.update_available'); // Badge sofort weg // @shell_exec('nohup sudo -n /usr/local/sbin/mw-update >/dev/null 2>&1 &'); // // $this->state = 'running'; // $this->running = true; // // $this->dispatch('toast', // type: 'info', // badge: 'Update', // title: 'Update gestartet', // text: 'Das System wird aktualisiert …', // duration: 6000 // ); // } // // /** ---- Helpers ------------------------------------------------------- */ // // protected function hasUpdate(): bool // { // if (!$this->latest) return false; // $cur = $this->current ?: '0.0.0'; // return version_compare($this->latest, $cur, '>'); // } // // protected function refreshLowLevelState(): void // { // $state = @trim(@file_get_contents('/var/lib/mailwolt/update/state') ?: ''); // $this->running = ($state === 'running'); // // $rcRaw = @trim(@file_get_contents('/var/lib/mailwolt/update/rc') ?: ''); // $this->rc = is_numeric($rcRaw) ? (int)$rcRaw : null; // // // Log bewusst NICHT angezeigt, aber verfügbar, falls du es später brauchst // $this->log = @shell_exec('tail -n 200 /var/log/mailwolt-update.log 2>/dev/null') ?? ''; // } // // protected function readCurrentVersion(): ?string // { // // bevorzugt build.info, sonst config('app.version') // $build = @file_get_contents('/etc/mailwolt/build.info'); // if ($build) { // foreach (preg_split('/\R+/', $build) as $line) { // if (str_starts_with($line, 'version=')) { // $v = trim(substr($line, 8)); // if ($v !== '') return $v; // } // } // } // $v = config('app.version'); // return $v !== '' ? $v : null; // } //} //// ////namespace App\Livewire\Ui\System; //// ////use Livewire\Component; ////use Illuminate\Support\Facades\Artisan; ////use Illuminate\Support\Facades\Cache; //// ////class UpdateCard extends Component ////{ //// public ?string $current = null; //// public ?string $latest = null; //// public string $state = 'idle'; // idle|running //// //// public bool $running = false; //// public string $log = ''; //// public ?int $rc = null; //// //// public function mount(): void //// { ////// $this->refreshState(); //// $this->latest = cache('mailwolt.update_available'); //// //// } //// //// public function render() //// { //// return view('livewire.ui.system.update-card'); //// } //// //// public function refreshState(): void //// { //// $state = @trim(@file_get_contents('/var/lib/mailwolt/update/state') ?: ''); //// $this->running = ($state === 'running'); //// //// $rcRaw = @trim(@file_get_contents('/var/lib/mailwolt/update/rc') ?: ''); //// $this->rc = is_numeric($rcRaw) ? (int)$rcRaw : null; //// //// // letzte 200 Zeilen Log //// $this->log = @shell_exec('tail -n 200 /var/log/mailwolt-update.log 2>/dev/null') ?? ''; //// } //// //// public function runUpdate(): void //// { //// // Hinweis „Update verfügbar“ ausblenden //// cache()->forget('mailwolt.update_available'); //// //// // Update im Hintergrund starten //// @shell_exec('nohup sudo -n /usr/local/sbin/mw-update >/dev/null 2>&1 &'); //// //// $this->running = true; //// $this->dispatch('toast', //// type: 'info', //// badge: 'Update', //// title: 'Update gestartet', //// text: 'Das System wird aktualisiert …', //// duration: 6000 //// ); //// } ////}