New direction; removed wireguard, readme update
This commit is contained in:
26
app/Actions/Servers/SyncUfwRules.php
Normal file
26
app/Actions/Servers/SyncUfwRules.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace App\Actions\Servers;
|
||||
|
||||
use App\Models\Server;
|
||||
use Spatie\QueueableAction\QueueableAction;
|
||||
|
||||
class SyncUfwRules
|
||||
{
|
||||
use QueueableAction;
|
||||
|
||||
public function execute(
|
||||
Server $server,
|
||||
) {
|
||||
$ssh = $server->sshClient();
|
||||
$result = $ssh->execute('wg show wg0');
|
||||
|
||||
if (! $result->isSuccessful()) {
|
||||
logger()->error('Failed to retrieve WireGuard rules', [
|
||||
'server_id' => $server->id,
|
||||
'error' => $result->getErrorOutput(),
|
||||
]);
|
||||
throw new \Exception('Failed to retrieve WireGuard rules');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,58 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Actions\Servers;
|
||||
|
||||
use App\Models\Server;
|
||||
use Illuminate\Support\Str;
|
||||
use Spatie\QueueableAction\QueueableAction;
|
||||
|
||||
class SyncWireguardRules
|
||||
{
|
||||
use QueueableAction;
|
||||
|
||||
public function execute(
|
||||
Server $server,
|
||||
) {
|
||||
$ssh = $server->sshClient();
|
||||
$result = $ssh->execute('wg show wg0');
|
||||
|
||||
if (! $result->isSuccessful()) {
|
||||
logger()->error('Failed to retrieve WireGuard rules', [
|
||||
'server_id' => $server->id,
|
||||
'error' => $result->getErrorOutput(),
|
||||
]);
|
||||
throw new \Exception('Failed to retrieve WireGuard rules');
|
||||
}
|
||||
|
||||
$output = $result->getOutput();
|
||||
$commands = collect();
|
||||
|
||||
$server->organisation->servers()->where('id', '!=', $server->id)->each(function ($organisationServer) use (&$commands, $output, $server) {
|
||||
if (Str::contains($output, $organisationServer->internal_public_key)) {
|
||||
$commands->push("wg set wg0 peer {$organisationServer->internal_public_key} remove");
|
||||
}
|
||||
|
||||
if ($organisationServer->external_network_id === $server->external_network_id) {
|
||||
$commands->push("wg set wg0 peer {$organisationServer->internal_public_key} allowed-ips {$organisationServer->internal_ip}/32");
|
||||
} else {
|
||||
$commands->push("wg set wg0 peer {$organisationServer->internal_public_key} allowed-ips {$organisationServer->ipv4}/32,{$organisationServer->ipv6}/128");
|
||||
}
|
||||
});
|
||||
|
||||
$result = $ssh->execute($commands->toArray());
|
||||
|
||||
if (! $result->isSuccessful()) {
|
||||
logger()->error('Failed to sync WireGuard rules', [
|
||||
'server_id' => $server->id,
|
||||
'error' => $result->getErrorOutput(),
|
||||
]);
|
||||
throw new \Exception('Failed to sync WireGuard rules');
|
||||
}
|
||||
|
||||
logger()->info('Successfully synced WireGuard rules', [
|
||||
'server_id' => $server->id,
|
||||
'commands' => $commands->toArray(),
|
||||
'output' => $result->getOutput(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums;
|
||||
|
||||
use App\Enums\Concerns\Arrayable;
|
||||
|
||||
enum NetworkType: string
|
||||
{
|
||||
use Arrayable;
|
||||
|
||||
case EXTERNAL = 'external'; // managed by provider
|
||||
case INTERNAL = 'internal'; // managed by keystone
|
||||
}
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Actions\Servers\SyncWireguardRules;
|
||||
use App\Enums\ServerStatus;
|
||||
use App\Events\Servers\ServerProvisioned;
|
||||
use App\Models\Server;
|
||||
@@ -15,7 +14,6 @@ class ProvisionCallback extends Controller
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'server_id' => ['required', 'integer', 'exists:servers,id'],
|
||||
'internal_public_key' => ['required', 'string'],
|
||||
]);
|
||||
|
||||
$server = Server::find($validated['server_id']);
|
||||
@@ -41,11 +39,11 @@ class ProvisionCallback extends Controller
|
||||
|
||||
$server->update([
|
||||
'status' => ServerStatus::ACTIVE,
|
||||
'internal_public_key' => $validated['internal_public_key'],
|
||||
]);
|
||||
|
||||
$server->organisation->servers()->each(function ($s) {
|
||||
app(SyncWireguardRules::class)->onQueue()->execute($s);
|
||||
// app(SyncWireguardRules::class)->onQueue()->execute($s);
|
||||
// @todo change this to a sync ufw rules class
|
||||
});
|
||||
|
||||
event(new ServerProvisioned($server));
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Actions\GenerateRandomSlug;
|
||||
use App\Enums\NetworkType;
|
||||
use App\Enums\ServerStatus;
|
||||
use App\Jobs\Servers\WaitForServerToConnect;
|
||||
use App\Models\Organisation;
|
||||
@@ -93,7 +92,6 @@ class ServerController extends Controller
|
||||
$network = $provider->networks()->create([
|
||||
'organisation_id' => $provider->organisation_id,
|
||||
'external_id' => $createdNetwork->id,
|
||||
'type' => NetworkType::EXTERNAL,
|
||||
'name' => $createdNetwork->name,
|
||||
'ip_range' => $createdNetwork->ipRange,
|
||||
'network_zone' => $networkZone,
|
||||
@@ -123,7 +121,7 @@ class ServerController extends Controller
|
||||
'os' => $request->image,
|
||||
'plan' => $request->server_type,
|
||||
'user' => 'keystone',
|
||||
'external_network_id' => $network->id,
|
||||
'network_id' => $network->id,
|
||||
]);
|
||||
|
||||
dispatch(new WaitForServerToConnect(
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use App\Enums\NetworkType;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
@@ -13,19 +12,12 @@ class Network extends Model
|
||||
|
||||
protected function casts(): array
|
||||
{
|
||||
return [
|
||||
'type' => NetworkType::class,
|
||||
];
|
||||
return [];
|
||||
}
|
||||
|
||||
public function internalServers(): HasMany
|
||||
public function servers(): HasMany
|
||||
{
|
||||
return $this->hasMany(Server::class, 'internal_network_id');
|
||||
}
|
||||
|
||||
public function externalServers(): HasMany
|
||||
{
|
||||
return $this->hasMany(Server::class, 'external_network_id');
|
||||
return $this->hasMany(Server::class, 'network_id');
|
||||
}
|
||||
|
||||
public function organisation(): BelongsTo
|
||||
|
||||
@@ -27,27 +27,11 @@ class Server extends Model
|
||||
public static function boot(): void
|
||||
{
|
||||
parent::boot();
|
||||
|
||||
static::creating(function (self $server) {
|
||||
$existingServer = Server::whereOrganisationId($server->organisation_id)
|
||||
->orderByDesc('internal_ip_ending')
|
||||
->first();
|
||||
|
||||
$server->internal_ip_ending = $existingServer
|
||||
? $existingServer->internal_ip_ending + 1
|
||||
: 2;
|
||||
$server->internal_ip = config('keystone.internal_ip_base') . $server->internal_ip_ending;
|
||||
});
|
||||
}
|
||||
|
||||
public function externalNetwork(): BelongsTo
|
||||
public function network(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Network::class, 'external_network_id');
|
||||
}
|
||||
|
||||
public function internalNetwork(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Network::class, 'internal_network_id');
|
||||
return $this->belongsTo(Network::class, 'network');
|
||||
}
|
||||
|
||||
public function organisation(): BelongsTo
|
||||
|
||||
Reference in New Issue
Block a user