81 lines
2.9 KiB
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(),
|
|
]);
|
|
}
|
|
}
|