mirror of
https://github.com/coollabsio/coolify.git
synced 2026-11-04 10:42:23 +00:00
118 lines
3.9 KiB
PHP
118 lines
3.9 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire\Server\DockerRegistries;
|
|
|
|
use App\Models\Server;
|
|
use App\Services\DockerRegistryLogins;
|
|
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
|
use Illuminate\View\View;
|
|
use Livewire\Attributes\Lazy;
|
|
use Livewire\Attributes\Locked;
|
|
use Livewire\Attributes\On;
|
|
use Livewire\Component;
|
|
use Throwable;
|
|
|
|
#[Lazy]
|
|
class ServerRegistries extends Component
|
|
{
|
|
use AuthorizesRequests;
|
|
|
|
#[Locked]
|
|
public Server $server;
|
|
|
|
/** @var array<int, array{registry: string, logged_in: bool, source: ?string, username: ?string, used_by: array<int, array{type: string, name: string, link: ?string}>}> */
|
|
public array $registries = [];
|
|
|
|
public ?string $error = null;
|
|
|
|
/** @var array<string, array{ok: bool, message: string}> result of the last login check, per registry */
|
|
public array $loginChecks = [];
|
|
|
|
public function mount(Server $server): void
|
|
{
|
|
$this->authorize('update', $server);
|
|
$this->server = $server;
|
|
$this->loadRegistries();
|
|
}
|
|
|
|
public function loadRegistries(): void
|
|
{
|
|
$this->authorize('update', $this->server);
|
|
$this->error = null;
|
|
$this->loginChecks = [];
|
|
|
|
$loggedIn = [];
|
|
if (! $this->server->isFunctional()) {
|
|
$this->error = 'The server is not reachable. Validate the server to read its registry logins.';
|
|
} else {
|
|
try {
|
|
$loggedIn = DockerRegistryLogins::forServer($this->server);
|
|
} catch (Throwable) {
|
|
$this->error = 'Could not read the Docker configuration on this server.';
|
|
}
|
|
}
|
|
|
|
$this->registries = DockerRegistryLogins::rows($this->server, $loggedIn);
|
|
}
|
|
|
|
#[On('registryLoginsChanged')]
|
|
public function refreshAfterLogin(int $serverId): void
|
|
{
|
|
if ($serverId === $this->server->id) {
|
|
$this->loadRegistries();
|
|
}
|
|
}
|
|
|
|
public function testLogin(string $registry): void
|
|
{
|
|
$this->authorize('update', $this->server);
|
|
$registry = DockerRegistryLogins::normalizeRegistry($registry);
|
|
$isLoggedIn = collect($this->registries)->contains(fn (array $row) => $row['registry'] === $registry && $row['logged_in']);
|
|
if (! $isLoggedIn || ! preg_match(DockerRegistryLogins::REGISTRY_PATTERN, $registry)) {
|
|
return;
|
|
}
|
|
|
|
try {
|
|
DockerRegistryLogins::checkLogin($this->server, $registry);
|
|
$this->loginChecks[$registry] = ['ok' => true, 'message' => 'The login works.'];
|
|
$this->dispatch('success', "The login for {$registry} works.");
|
|
} catch (Throwable $exception) {
|
|
$this->loginChecks[$registry] = ['ok' => false, 'message' => $exception->getMessage()];
|
|
$this->dispatch('error', "The login for {$registry} does not work.", e($exception->getMessage()));
|
|
}
|
|
}
|
|
|
|
public function logout(string $registry): void
|
|
{
|
|
$this->authorize('update', $this->server);
|
|
$registry = DockerRegistryLogins::normalizeRegistry($registry);
|
|
if (! preg_match(DockerRegistryLogins::REGISTRY_PATTERN, $registry)) {
|
|
$this->dispatch('error', 'Logout failed.', 'The registry name is not valid.');
|
|
|
|
return;
|
|
}
|
|
|
|
try {
|
|
DockerRegistryLogins::logout($this->server, $registry);
|
|
} catch (Throwable $exception) {
|
|
$this->dispatch('error', 'Logout failed.', e($exception->getMessage()));
|
|
|
|
return;
|
|
}
|
|
|
|
DockerRegistryLogins::audit($this->server, 'logout', $registry);
|
|
$this->dispatch('success', "Deleted the login for {$registry}.");
|
|
$this->loadRegistries();
|
|
}
|
|
|
|
public function placeholder(): View
|
|
{
|
|
return view('livewire.server.docker-registries.server-registries-placeholder');
|
|
}
|
|
|
|
public function render()
|
|
{
|
|
return view('livewire.server.docker-registries.server-registries');
|
|
}
|
|
}
|