CluPilotCloud/app/Livewire/Admin/HostCreate.php

81 lines
2.9 KiB
PHP

<?php
namespace App\Livewire\Admin;
use App\Actions\StartHostOnboarding;
use App\Models\Datacenter;
use App\Support\HostEnrolment;
use App\Support\HostName;
use App\Support\HostTakeoverCommand;
use Livewire\Attributes\Layout;
use Livewire\Attributes\Validate;
use Livewire\Component;
#[Layout('layouts.admin')]
class HostCreate extends Component
{
/**
* Gesetzt, sobald der Host angelegt ist — und zugleich die Weiche der
* Ansicht zwischen Formular und Bestätigung.
*/
public ?string $createdUuid = null;
public ?string $createdName = null;
#[Validate('required|string|exists:datacenters,code,active,1')]
public string $datacenter = '';
public function mount(): void
{
$this->datacenter = (string) Datacenter::query()->active()->orderBy('name')->value('code');
}
#[Validate('required|ip|unique:hosts,public_ip')]
public string $public_ip = '';
#[Validate('required|string|min:8')]
public string $root_password = '';
public function save(StartHostOnboarding $action)
{
$this->authorize('hosts.manage');
$data = $this->validate();
$host = $action->run($data);
// Der Einmal-Code und das Schlüsselpaar entstehen weiterhin: dieselbe
// Methode legt auch die Tunneladresse und den öffentlichen Schlüssel am
// Host an, und der Code trägt den Bootstrap-Weg, der über
// Admin\ReissueTakeover erreichbar bleibt.
//
// Die BEFEHLSZEILE daraus zeigt diese Seite nicht mehr. Sie gehört zum
// Rettungssystem-Weg, und das Speichern hier startet die
// Provisionierungs-Pipeline: `EstablishSshTrust` meldet sich mit dem
// Root-Passwort an einer laufenden Debian-Maschine an, danach kommt
// Proxmox per Paket dazu. Es gibt für den Betreiber nichts zu kopieren.
HostEnrolment::issueWithKeys($host);
$this->createdUuid = $host->uuid;
$this->createdName = $host->name;
}
public function render()
{
// Ein Name, der ohne Ankündigung entsteht, ist eine Überraschung. Die
// Seite zeigt ihn, sobald ein Rechenzentrum gewählt ist — gelesen, nicht
// reserviert (siehe HostName::preview).
$preview = $this->datacenter === '' ? null : HostName::preview($this->datacenter);
return view('livewire.admin.host-create', [
'datacenters' => Datacenter::query()->active()->orderBy('name')->get(),
'previewName' => $preview,
'previewFqdn' => $preview === null ? null : HostName::fqdn($preview),
// `archiveUrl` fiel weg: er war der Hinweis, woher die Bootstrap-
// Zeile ihr Skript holt, und die Zeile zeigt diese Seite nicht mehr.
// Die fehlenden Tunnel-Einstellungen bleiben — ohne sie kommt auch
// die Pipeline nicht in den Tunnel.
'missingSettings' => HostTakeoverCommand::missingSettings(),
]);
}
}