This commit is contained in:
Andras Bacsai 2023-06-16 13:13:09 +02:00
parent 793cae1dfa
commit 0123ae97a1
8 changed files with 46 additions and 25 deletions

View File

@ -7,7 +7,6 @@
class Change extends Component class Change extends Component
{ {
public string $private_key_uuid;
public PrivateKey $private_key; public PrivateKey $private_key;
protected $rules = [ protected $rules = [
@ -20,15 +19,15 @@ class Change extends Component
'private_key.description' => 'description', 'private_key.description' => 'description',
'private_key.private_key' => 'private key' 'private_key.private_key' => 'private key'
]; ];
public function mount()
{
$this->private_key = PrivateKey::where('uuid', $this->private_key_uuid)->first();
}
public function delete() public function delete()
{ {
try {
PrivateKey::where('uuid', $this->private_key_uuid)->delete(); PrivateKey::where('uuid', $this->private_key_uuid)->delete();
session('currentTeam')->privateKeys = PrivateKey::where('team_id', session('currentTeam')->id)->get(); session('currentTeam')->privateKeys = PrivateKey::where('team_id', session('currentTeam')->id)->get();
redirect()->route('dashboard'); redirect()->route('dashboard');
} catch (\Exception $e) {
return general_error_handler(err: $e, that: $this);
}
} }
public function changePrivateKey() public function changePrivateKey()
{ {

View File

@ -5,12 +5,27 @@
use App\Models\Server; use App\Models\Server;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
use Livewire\Component; use Livewire\Component;
use Masmerise\Toaster\Toaster;
class PrivateKey extends Component class PrivateKey extends Component
{ {
public Server $server; public Server $server;
public $privateKeys; public $privateKeys;
public $parameters; public $parameters;
public function checkConnection()
{
try {
$uptime = instant_remote_process(['uptime'], $this->server, false);
if ($uptime) {
Toaster::success('Server is reachable with this private key.');
} else {
Toaster::error('Server is NOT reachable with this private key.');
}
} catch (\Exception $e) {
return general_error_handler(err: $e, that: $this);
}
}
public function setPrivateKey($private_key_id) public function setPrivateKey($private_key_id)
{ {
$this->server->update([ $this->server->update([
@ -18,8 +33,9 @@ public function setPrivateKey($private_key_id)
]); ]);
// Delete the old ssh mux file to force a new one to be created // Delete the old ssh mux file to force a new one to be created
Storage::disk('ssh-mux')->delete("{$this->server->first()->ip}_{$this->server->first()->port}_{$this->server->first()->user}"); Storage::disk('ssh-mux')->delete($this->server->muxFilename());
$this->server->refresh(); $this->server->refresh();
$this->checkConnection();
} }
public function mount() public function mount()
{ {

View File

@ -11,9 +11,6 @@ class PrivateKey extends BaseModel
'private_key', 'private_key',
'team_id', 'team_id',
]; ];
protected $hidden = [
'private_key',
];
static public function ownedByCurrentTeam(array $select = ['*']) static public function ownedByCurrentTeam(array $select = ['*'])
{ {
$selectArray = collect($select)->concat(['id']); $selectArray = collect($select)->concat(['id']);

View File

@ -74,6 +74,10 @@ public function settings()
{ {
return $this->hasOne(ServerSetting::class); return $this->hasOne(ServerSetting::class);
} }
public function muxFilename()
{
return "{$this->ip}_{$this->port}_{$this->user}";
}
static public function ownedByCurrentTeam(array $select = ['*']) static public function ownedByCurrentTeam(array $select = ['*'])
{ {
$selectArray = collect($select)->concat(['id']); $selectArray = collect($select)->concat(['id']);

View File

@ -15,7 +15,7 @@ .main {
@apply pl-24 pr-10 mx-auto max-w-screen-xl pt-4; @apply pl-24 pr-10 mx-auto max-w-screen-xl pt-4;
} }
input { input {
@apply input input-sm h-7 outline-none placeholder:text-neutral-700 text-white rounded bg-coolgray-200 w-full read-only:bg-coolgray-200/50 read-only:text-opacity-25; @apply input input-sm h-7 outline-none placeholder:text-neutral-700 text-white rounded bg-coolgray-200 w-full read-only:bg-coolgray-200/50 read-only:text-opacity-25 disabled:border-none;
} }
input && :not(input[type="checkbox"]) { input && :not(input[type="checkbox"]) {
@apply border-none; @apply border-none;
@ -25,7 +25,7 @@ input[type="checkbox"] {
} }
textarea { textarea {
@apply textarea placeholder:text-neutral-700 text-white rounded scrollbar bg-coolgray-200; @apply textarea placeholder:text-neutral-700 text-white rounded scrollbar bg-coolgray-200 leading-5 text-xs;
} }
select { select {
@apply h-7 select select-xs disabled:bg-coolgray-200 border-none disabled:opacity-50 font-normal placeholder:text-neutral-700 text-white rounded bg-coolgray-200; @apply h-7 select select-xs disabled:bg-coolgray-200 border-none disabled:opacity-50 font-normal placeholder:text-neutral-700 text-white rounded bg-coolgray-200;

View File

@ -1,20 +1,26 @@
<div> <div>
<div class="flex items-end gap-2"> <div class="flex items-end gap-2 pb-6 ">
<h1>Private Key</h1> <h1>Private Key</h1>
<a href="{{ route('private-key.new') }}"> <a href="{{ route('private-key.new') }}">
<x-forms.button>Add a new Private Key</x-forms.button> <x-forms.button>Add a new Private Key</x-forms.button>
</a> </a>
<x-forms.button wire:click.prevent='checkConnection'>
Check connection
</x-forms.button>
</div> </div>
<div class="pt-2 pb-6 ">Selected Private Key for SSH connection</div>
<div class="pb-10 "> <div class="flex flex-col gap-2 pb-6">
@if (data_get($server, 'privateKey.uuid')) @if (data_get($server, 'privateKey.uuid'))
<div>
Currently attached Private Key: Currently attached Private Key:
<a href="{{ route('private-key.show', ['private_key_uuid' => data_get($server, 'privateKey.uuid')]) }}"> <a href="{{ route('private-key.show', ['private_key_uuid' => data_get($server, 'privateKey.uuid')]) }}">
<button class="text-white btn-link">{{ data_get($server, 'privateKey.name') }}</button> <button class="text-white btn-link">{{ data_get($server, 'privateKey.name') }}</button>
</a> </a>
</div>
@else @else
<div class="">No private key attached.</div> <div class="">No private key attached.</div>
@endif @endif
</div> </div>
<h3 class="pb-4">Select a different Private Key</h3> <h3 class="pb-4">Select a different Private Key</h3>
<div class="grid gap-2"> <div class="grid gap-2">

View File

@ -1,4 +1,3 @@
<x-layout> <x-layout>
<livewire:private-key.change :private_key="$private_key" />
<livewire:private-key.change :private_key_uuid="$private_key->uuid" />
</x-layout> </x-layout>

View File

@ -99,11 +99,11 @@
Route::middleware(['auth'])->group(function () { Route::middleware(['auth'])->group(function () {
Route::get('/private-keys', fn () => view('private-key.all', [ Route::get('/private-keys', fn () => view('private-key.all', [
'privateKeys' => PrivateKey::ownedByCurrentTeam()->get() 'privateKeys' => PrivateKey::ownedByCurrentTeam(['name', 'uuid'])->get()
]))->name('private-key.all'); ]))->name('private-key.all');
Route::get('/private-key/new', fn () => view('private-key.new'))->name('private-key.new'); Route::get('/private-key/new', fn () => view('private-key.new'))->name('private-key.new');
Route::get('/private-key/{private_key_uuid}', fn () => view('private-key.show', [ Route::get('/private-key/{private_key_uuid}', fn () => view('private-key.show', [
'private_key' => PrivateKey::ownedByCurrentTeam()->whereUuid(request()->private_key_uuid)->firstOrFail() 'private_key' => PrivateKey::ownedByCurrentTeam(['name', 'description', 'private_key'])->whereUuid(request()->private_key_uuid)->firstOrFail()
]))->name('private-key.show'); ]))->name('private-key.show');
}); });