feat(terminal): show terminal unavailable if the container does not have a shell on the global terminal UI
This commit is contained in:
@@ -9,6 +9,8 @@ use Livewire\Component;
|
|||||||
|
|
||||||
class Terminal extends Component
|
class Terminal extends Component
|
||||||
{
|
{
|
||||||
|
public bool $hasShell = true;
|
||||||
|
|
||||||
public function getListeners()
|
public function getListeners()
|
||||||
{
|
{
|
||||||
$teamId = auth()->user()->currentTeam()->id;
|
$teamId = auth()->user()->currentTeam()->id;
|
||||||
@@ -23,6 +25,21 @@ class Terminal extends Component
|
|||||||
$this->dispatch('reloadWindow');
|
$this->dispatch('reloadWindow');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function checkShellAvailability(Server $server, string $container): bool
|
||||||
|
{
|
||||||
|
$escapedContainer = escapeshellarg($container);
|
||||||
|
try {
|
||||||
|
instant_remote_process([
|
||||||
|
"docker exec {$escapedContainer} bash -c 'exit 0' 2>/dev/null || ".
|
||||||
|
"docker exec {$escapedContainer} sh -c 'exit 0' 2>/dev/null",
|
||||||
|
], $server);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} catch (\Throwable) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[On('send-terminal-command')]
|
#[On('send-terminal-command')]
|
||||||
public function sendTerminalCommand($isContainer, $identifier, $serverUuid)
|
public function sendTerminalCommand($isContainer, $identifier, $serverUuid)
|
||||||
{
|
{
|
||||||
@@ -40,6 +57,12 @@ class Terminal extends Component
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check shell availability
|
||||||
|
$this->hasShell = $this->checkShellAvailability($server, $identifier);
|
||||||
|
if (! $this->hasShell) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Escape the identifier for shell usage
|
// Escape the identifier for shell usage
|
||||||
$escapedIdentifier = escapeshellarg($identifier);
|
$escapedIdentifier = escapeshellarg($identifier);
|
||||||
$command = SshMultiplexingHelper::generateSshCommand($server, "docker exec -it {$escapedIdentifier} sh -c 'PATH=\$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin && if [ -f ~/.profile ]; then . ~/.profile; fi && if [ -n \"\$SHELL\" ]; then exec \$SHELL; else sh; fi'");
|
$command = SshMultiplexingHelper::generateSshCommand($server, "docker exec -it {$escapedIdentifier} sh -c 'PATH=\$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin && if [ -f ~/.profile ]; then . ~/.profile; fi && if [ -n \"\$SHELL\" ]; then exec \$SHELL; else sh; fi'");
|
||||||
|
|||||||
@@ -1,4 +1,19 @@
|
|||||||
<div id="terminal-container" x-data="terminalData()">
|
<div id="terminal-container" x-data="terminalData()">
|
||||||
|
@if(!$hasShell)
|
||||||
|
<div class="flex pt-4 items-center justify-center w-full py-4 mx-auto">
|
||||||
|
<div class="p-4 w-full rounded border dark:bg-coolgray-100 dark:border-coolgray-300">
|
||||||
|
<div class="flex flex-col items-center justify-center space-y-4">
|
||||||
|
<svg class="w-12 h-12 text-red-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/>
|
||||||
|
</svg>
|
||||||
|
<div class="text-center">
|
||||||
|
<h3 class="text-lg font-medium">Terminal Not Available</h3>
|
||||||
|
<p class="mt-2 text-sm text-gray-500">No shell (bash/sh) is available in this container. Please ensure either bash or sh is installed to use the terminal.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@else
|
||||||
<div x-ref="terminalWrapper"
|
<div x-ref="terminalWrapper"
|
||||||
:class="fullscreen ? 'fullscreen' : 'relative w-full h-full py-4 mx-auto max-h-[510px]'">
|
:class="fullscreen ? 'fullscreen' : 'relative w-full h-full py-4 mx-auto max-h-[510px]'">
|
||||||
<div id="terminal" wire:ignore></div>
|
<div id="terminal" wire:ignore></div>
|
||||||
@@ -18,6 +33,7 @@
|
|||||||
</g>
|
</g>
|
||||||
</svg></button>
|
</svg></button>
|
||||||
</div>
|
</div>
|
||||||
|
@endif
|
||||||
@script
|
@script
|
||||||
<script>
|
<script>
|
||||||
// expose terminal config to the terminal.js file
|
// expose terminal config to the terminal.js file
|
||||||
|
|||||||
Reference in New Issue
Block a user