From 2487dde69e127918dcb5e009e24684f92d204b77 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Wed, 26 Apr 2023 15:38:50 +0200 Subject: [PATCH] add new server add new private key check server connection --- app/Http/Livewire/Server/Form.php | 5 ++ app/Http/Livewire/Server/New/ByIp.php | 55 +++++++++++++++++++ app/Models/PrivateKey.php | 6 ++ app/Models/Server.php | 8 +++ app/Models/ServerSetting.php | 3 + app/Models/Team.php | 9 ++- app/Models/User.php | 3 +- ...03_24_140853_create_private_keys_table.php | 1 + database/seeders/PrivateKeySeeder.php | 9 ++- database/seeders/ServerSeeder.php | 3 - .../views/components/form-input.blade.php | 13 ++++- resources/views/dashboard.blade.php | 4 +- .../views/livewire/server/form.blade.php | 13 ++++- .../views/livewire/server/new/by-ip.blade.php | 24 ++++++++ resources/views/server/new.blade.php | 4 ++ .../{dashboard.blade.php => show.blade.php} | 0 routes/web.php | 5 +- 17 files changed, 145 insertions(+), 20 deletions(-) create mode 100644 app/Http/Livewire/Server/New/ByIp.php create mode 100644 resources/views/livewire/server/new/by-ip.blade.php create mode 100644 resources/views/server/new.blade.php rename resources/views/server/{dashboard.blade.php => show.blade.php} (100%) diff --git a/app/Http/Livewire/Server/Form.php b/app/Http/Livewire/Server/Form.php index 935ad5c79..2d9a6cf60 100644 --- a/app/Http/Livewire/Server/Form.php +++ b/app/Http/Livewire/Server/Form.php @@ -10,6 +10,7 @@ class Form extends Component { public $server_id; public Server $server; + public $uptime; protected $rules = [ 'server.name' => 'required|min:6', @@ -22,6 +23,10 @@ class Form extends Component { $this->server = Server::find($this->server_id); } + public function checkConnection() + { + $this->uptime = runRemoteCommandSync($this->server, ['uptime']); + } public function submit() { $this->validate(); diff --git a/app/Http/Livewire/Server/New/ByIp.php b/app/Http/Livewire/Server/New/ByIp.php new file mode 100644 index 000000000..016ab2c13 --- /dev/null +++ b/app/Http/Livewire/Server/New/ByIp.php @@ -0,0 +1,55 @@ +private_keys = PrivateKey::where('team_id', session('currentTeam')->id)->get(); + } + public function setPrivateKey($private_key_id) + { + $this->private_key_id = $private_key_id; + } + public function addPrivateKey() + { + $this->new_private_key_value = trim($this->new_private_key_value); + if (!str_ends_with($this->new_private_key_value, "\n")) { + $this->new_private_key_value .= "\n"; + } + PrivateKey::create([ + 'name' => $this->new_private_key_name, + 'description' => $this->new_private_key_description, + 'private_key' => $this->new_private_key_value, + 'team_id' => session('currentTeam')->id + ]); + session('currentTeam')->privateKeys = $this->private_keys = PrivateKey::where('team_id', session('currentTeam')->id)->get(); + } + public function submit() + { + $server = Server::create([ + 'name' => fake()->company, + 'ip' => $this->ip, + 'user' => $this->user, + 'port' => $this->port, + 'team_id' => session('currentTeam')->id, + 'private_key_id' => $this->private_key_id + ]); + return redirect()->route('server.show', $server->uuid); + } +} diff --git a/app/Models/PrivateKey.php b/app/Models/PrivateKey.php index 45f69cb2a..fc7407ca4 100644 --- a/app/Models/PrivateKey.php +++ b/app/Models/PrivateKey.php @@ -4,6 +4,12 @@ namespace App\Models; class PrivateKey extends BaseModel { + protected $fillable = [ + 'name', + 'description', + 'private_key', + 'team_id', + ]; public function servers() { return $this->hasMany(Server::class); diff --git a/app/Models/Server.php b/app/Models/Server.php index e06dc67e3..42739ce23 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -12,6 +12,14 @@ class Server extends BaseModel ]); }); } + protected $fillable = [ + 'name', + 'ip', + 'user', + 'port', + 'team_id', + 'private_key_id', + ]; public function destinations() { return $this->hasMany(PrivateKey::class); diff --git a/app/Models/ServerSetting.php b/app/Models/ServerSetting.php index 7b76e829c..03faf3067 100644 --- a/app/Models/ServerSetting.php +++ b/app/Models/ServerSetting.php @@ -4,6 +4,9 @@ namespace App\Models; class ServerSetting extends BaseModel { + protected $fillable = [ + 'server_id' + ]; public function server() { return $this->belongsTo(Server::class); diff --git a/app/Models/Team.php b/app/Models/Team.php index e08ea7ad5..4c9938c5b 100644 --- a/app/Models/Team.php +++ b/app/Models/Team.php @@ -12,13 +12,16 @@ class Team extends BaseModel 'name', 'personal_team' ]; - public function projects() { + public function projects() + { return $this->hasMany(Project::class); } - public function servers() { + public function servers() + { return $this->hasMany(Server::class); } - public function applications() { + public function applications() + { return $this->hasManyThrough(Application::class, Project::class); } } diff --git a/app/Models/User.php b/app/Models/User.php index 877ad2c0b..3b65fa8bb 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -52,7 +52,8 @@ class User extends Authenticatable $model->uuid = (string) new Cuid2(7); }); } - public function isRoot() { + public function isRoot() + { return $this->id == 0; } public function teams() diff --git a/database/migrations/2023_03_24_140853_create_private_keys_table.php b/database/migrations/2023_03_24_140853_create_private_keys_table.php index be0c5211f..2795f6b0e 100644 --- a/database/migrations/2023_03_24_140853_create_private_keys_table.php +++ b/database/migrations/2023_03_24_140853_create_private_keys_table.php @@ -17,6 +17,7 @@ return new class extends Migration $table->string('name'); $table->string('description')->nullable(); $table->longText('private_key'); + $table->foreignId('team_id'); $table->timestamps(); }); } diff --git a/database/seeders/PrivateKeySeeder.php b/database/seeders/PrivateKeySeeder.php index b54a07f6b..25561053d 100644 --- a/database/seeders/PrivateKeySeeder.php +++ b/database/seeders/PrivateKeySeeder.php @@ -4,6 +4,7 @@ namespace Database\Seeders; use App\Models\PrivateKey; use App\Models\Server; +use App\Models\Team; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; @@ -14,8 +15,9 @@ class PrivateKeySeeder extends Seeder */ public function run(): void { + $team_1 = Team::find(0); PrivateKey::create([ - "id" => 1, + "team_id" => $team_1->id, "name" => "Testing-host", "description" => "This is a test docker container", "private_key" => "-----BEGIN OPENSSH PRIVATE KEY----- @@ -26,9 +28,10 @@ AAAECBQw4jg1WRT2IGHMncCiZhURCts2s24HoDS0thHnnRKVuGmoeGq/pojrsyP1pszcNV uZx9iFkCELtxrh31QJ68AAAAEXNhaWxANzZmZjY2ZDJlMmRkAQIDBA== -----END OPENSSH PRIVATE KEY----- " + ]); PrivateKey::create([ - "id" => 2, + "team_id" => $team_1->id, "name" => "development-github-app", "description" => "This is the key for using the development GitHub app", "private_key" => "-----BEGIN RSA PRIVATE KEY----- @@ -60,7 +63,7 @@ a1C8EDKapCw5hAhizEFOUQKOygL8Ipn+tmEUkORYdZ8Q8cWFCv9nIw== -----END RSA PRIVATE KEY-----" ]); PrivateKey::create([ - "id" => 3, + "team_id" => $team_1->id, "name" => "development-gitlab-app", "description" => "This is the key for using the development Gitlab app", "private_key" => "asdf" diff --git a/database/seeders/ServerSeeder.php b/database/seeders/ServerSeeder.php index 32fc46613..67b91d825 100644 --- a/database/seeders/ServerSeeder.php +++ b/database/seeders/ServerSeeder.php @@ -17,7 +17,6 @@ class ServerSeeder extends Seeder $root_team = Team::find(0); $private_key_1 = PrivateKey::find(1); Server::create([ - 'id' => 1, 'name' => "testing-local-docker-container", 'description' => "This is a test docker container", 'ip' => "coolify-testing-host", @@ -25,13 +24,11 @@ class ServerSeeder extends Seeder 'private_key_id' => $private_key_1->id, ]); Server::create([ - 'id' => 2, 'name' => "testing-local-docker-container-2", 'description' => "This is a test docker container", 'ip' => "coolify-testing-host-2", 'team_id' => $root_team->id, 'private_key_id' => $private_key_1->id, ]); - } } diff --git a/resources/views/components/form-input.blade.php b/resources/views/components/form-input.blade.php index 9fb1a030c..d4dd79631 100644 --- a/resources/views/components/form-input.blade.php +++ b/resources/views/components/form-input.blade.php @@ -25,9 +25,16 @@ * @endif - + @if ($type === 'textarea') + + @else + + @endif + @error($id)
{{ $message }}
@enderror diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php index bce2b8efe..1dfe9afa3 100644 --- a/resources/views/dashboard.blade.php +++ b/resources/views/dashboard.blade.php @@ -5,9 +5,9 @@ @empty

No projects found.

@endforelse -

Servers

+

Servers

@forelse ($servers as $server) - {{ data_get($server, 'name') }} + {{ data_get($server, 'name') }} @empty

No servers found.

@endforelse diff --git a/resources/views/livewire/server/form.blade.php b/resources/views/livewire/server/form.blade.php index 38e33833f..d2bf5856b 100644 --- a/resources/views/livewire/server/form.blade.php +++ b/resources/views/livewire/server/form.blade.php @@ -11,8 +11,15 @@ - +
+ + +
+ @isset($uptime) +

Connection OK

+

Uptime: {{ $uptime }}

+ @endisset diff --git a/resources/views/livewire/server/new/by-ip.blade.php b/resources/views/livewire/server/new/by-ip.blade.php new file mode 100644 index 000000000..733dff9dc --- /dev/null +++ b/resources/views/livewire/server/new/by-ip.blade.php @@ -0,0 +1,24 @@ +
+
+ + + + + +
Select a private key:
+ @foreach ($private_keys as $key) + + @endforeach +
Add a new One:
+
+ + + + + +
diff --git a/resources/views/server/new.blade.php b/resources/views/server/new.blade.php new file mode 100644 index 000000000..e5a65deca --- /dev/null +++ b/resources/views/server/new.blade.php @@ -0,0 +1,4 @@ + +

New Server

+ +
diff --git a/resources/views/server/dashboard.blade.php b/resources/views/server/show.blade.php similarity index 100% rename from resources/views/server/dashboard.blade.php rename to resources/views/server/show.blade.php diff --git a/routes/web.php b/routes/web.php index ffdb7ed13..f469a0394 100644 --- a/routes/web.php +++ b/routes/web.php @@ -55,15 +55,16 @@ Route::middleware(['auth'])->group(function () { }); Route::middleware(['auth'])->group(function () { + Route::get('/server/new', fn () => view('server.new'))->name('server.new'); Route::get('/server/{server_uuid}', function () { $server = session('currentTeam')->load(['servers'])->servers->firstWhere('uuid', request()->server_uuid); if (!$server) { abort(404); } - return view('server.dashboard', [ + return view('server.show', [ 'server_id' => $server->id, ]); - })->name('server.dashboard'); + })->name('server.show'); }); Route::middleware(['auth'])->group(function () {