CluPilotCloud/app/Console/Commands/PublishTunnelNames.php

69 lines
2.5 KiB
PHP

<?php
namespace App\Console\Commands;
use App\Services\Dns\HostDnsDirectory;
use Illuminate\Console\Command;
/**
* Macht Portal, Website und Statusseite im Management-Tunnel auflösbar.
*
* Ohne das trägt der Tunnel nur `10.66.0.0/24`, und diese Namen zeigen auf die
* öffentliche Adresse des Servers — der Verkehr geht also am Tunnel vorbei, und
* die Anwendung sieht die öffentliche Adresse des Anrufers statt seiner
* `10.66.0.x`. Genau daran scheiterte „über VPN die verborgene Seite ansehen":
* die Konsole ging, weil ihr Name als einziger umgebogen war.
*
* `files.` steht bewusst NICHT in der Liste. Dort holt ein Server im
* Rettungssystem sein Bootstrap-Archiv, und der ist per Definition nicht im
* Tunnel — bögen wir den Namen um, holte er es nie.
*
* Die Datei landet in demselben Verzeichnis, das dnsmasq mit `--hostsdir`
* überwacht, und in dem RegisterHostDns schon die Host-Namen ablegt. Kein
* Neustart, kein Reload: das Erscheinen der Datei IST die Veröffentlichung.
*/
class PublishTunnelNames extends Command
{
/** Eine Datei für die ganze Gruppe — siehe HostDnsDirectory::writeMany(). */
private const KEY = 'platform';
protected $signature = 'clupilot:publish-tunnel-names';
protected $description = 'Macht Portal, Website und Statusseite im Management-Tunnel auflösbar';
public function handle(HostDnsDirectory $dns): int
{
// Ohne Tunnel gibt es keinen Gateway, der diese Namen bedienen könnte.
// Eine hosts-Datei für einen Resolver, den niemand startet, ist nur
// etwas, das beim späteren Einschalten falsch sein kann.
if ((string) config('admin_access.vpn_internal_host') === '') {
$dns->writeMany(self::KEY, [], '');
$this->info('Kein Tunnel konfiguriert — nichts veröffentlicht.');
return self::SUCCESS;
}
$names = array_values(array_unique(array_filter(array_merge(
[(string) config('admin_access.app_host')],
array_map('strval', (array) config('admin_access.site_hosts', [])),
[(string) config('admin_access.status_host')],
))));
$hub = (string) config('provisioning.wireguard.hub_address');
$dns->writeMany(self::KEY, $names, $hub);
if ($names === []) {
$this->info('Keine Hostnamen konfiguriert — nichts veröffentlicht.');
return self::SUCCESS;
}
foreach ($names as $name) {
$this->line(" {$hub} {$name}");
}
return self::SUCCESS;
}
}