CluPilotCloud/app/Console/Commands/ConfigureInstanceMail.php

97 lines
3.3 KiB
PHP

<?php
namespace App\Console\Commands;
use App\Models\Instance;
use App\Models\ProvisioningRun;
use App\Provisioning\Jobs\AdvanceRunJob;
use Illuminate\Console\Command;
/**
* Traegt bestehenden Instanzen den Mailversand nach.
*
* Der Anlass: der Versand kam erst mit der Mitarbeiterverwaltung in die
* Pipeline. Jede vorher gebaute Instanz kann bis heute keine Mail verschicken
* — und die Einladung an einen Mitarbeiter geht von DORT aus, nicht von
* CluPilot. Ohne diesen Lauf bliebe die Verwaltung fuer alle Altkunden tot.
*
* Ein Befehl und kein Zeitplan, aus derselben Begruendung wie bei
* `clupilot:refresh-host-firewall`: das Loch ist endlich und schliesst sich
* endgueltig; ein naechtlicher Lauf wuerde am Tag, an dem der Schritt in der
* Pipeline still kaputtginge, fuer ihn einspringen und das Versagen
* verbergen; und eine Reparatur, die der Betreiber anstoesst, ist eine, deren
* Ausgabe er liest.
*/
class ConfigureInstanceMail extends Command
{
protected $signature = 'clupilot:configure-instance-mail
{--dry-run : auflisten, was liefe, und nichts anfassen}
{--instance= : nur diese eine Instanz, per uuid}';
protected $description = 'Traegt bestehenden Kundeninstanzen den Mailversand nach';
public function handle(): int
{
$dryRun = (bool) $this->option('dry-run');
$gestartet = 0;
/** @var array<string, int> Grund => Anzahl */
$uebersprungen = [];
$query = Instance::query()->where('status', 'active');
if ($uuid = $this->option('instance')) {
$query->where('uuid', $uuid);
}
foreach ($query->with('host')->get() as $instance) {
if ($instance->host === null) {
$this->warn("{$instance->uuid}: kein Host — uebersprungen");
$uebersprungen['kein Host'] = ($uebersprungen['kein Host'] ?? 0) + 1;
continue;
}
if (blank($instance->vmid)) {
$this->warn("{$instance->uuid}: keine VMID — uebersprungen");
$uebersprungen['keine VMID'] = ($uebersprungen['keine VMID'] ?? 0) + 1;
continue;
}
if ($dryRun) {
$this->line("{$instance->uuid}: wuerde nachgetragen");
$gestartet++;
continue;
}
$run = ProvisioningRun::create([
'pipeline' => 'instance-mail',
'subject_type' => Instance::class,
'subject_id' => $instance->id,
'status' => ProvisioningRun::STATUS_RUNNING,
'current_step' => 0,
'context' => [
'instance_id' => $instance->id,
'node' => $instance->host->node ?? 'pve',
'vmid' => (int) $instance->vmid,
],
]);
AdvanceRunJob::dispatch($run->id);
$this->info("{$instance->uuid}: Lauf {$run->id} gestartet");
$gestartet++;
}
$this->newLine();
$this->line($dryRun ? "{$gestartet} Instanz(en) waeren nachgetragen worden." : "{$gestartet} Lauf/Laeufe gestartet.");
foreach ($uebersprungen as $grund => $anzahl) {
$this->line("uebersprungen ({$grund}): {$anzahl}");
}
return self::SUCCESS;
}
}