📯 tRaNsFeR lOgS 📯

This commit is contained in:
Matthew Penner 2020-12-16 16:55:44 -07:00
parent e6c4a68e4a
commit 5c5e2e24f1
12 changed files with 149 additions and 65 deletions

View file

@ -8,7 +8,6 @@ use Prologue\Alerts\AlertsMessageBag;
use Pterodactyl\Models\ServerTransfer;
use Pterodactyl\Http\Controllers\Controller;
use Pterodactyl\Services\Servers\TransferService;
use Pterodactyl\Services\Servers\SuspensionService;
use Pterodactyl\Repositories\Eloquent\NodeRepository;
use Pterodactyl\Repositories\Eloquent\ServerRepository;
use Pterodactyl\Repositories\Eloquent\LocationRepository;
@ -42,11 +41,6 @@ class ServerTransferController extends Controller
*/
private $nodeRepository;
/**
* @var \Pterodactyl\Services\Servers\SuspensionService
*/
private $suspensionService;
/**
* @var \Pterodactyl\Services\Servers\TransferService
*/
@ -65,7 +59,6 @@ class ServerTransferController extends Controller
* @param \Pterodactyl\Repositories\Eloquent\ServerRepository $repository
* @param \Pterodactyl\Repositories\Eloquent\LocationRepository $locationRepository
* @param \Pterodactyl\Repositories\Eloquent\NodeRepository $nodeRepository
* @param \Pterodactyl\Services\Servers\SuspensionService $suspensionService
* @param \Pterodactyl\Services\Servers\TransferService $transferService
* @param \Pterodactyl\Repositories\Wings\DaemonConfigurationRepository $daemonConfigurationRepository
*/
@ -75,7 +68,6 @@ class ServerTransferController extends Controller
ServerRepository $repository,
LocationRepository $locationRepository,
NodeRepository $nodeRepository,
SuspensionService $suspensionService,
TransferService $transferService,
DaemonConfigurationRepository $daemonConfigurationRepository
) {
@ -84,7 +76,6 @@ class ServerTransferController extends Controller
$this->repository = $repository;
$this->locationRepository = $locationRepository;
$this->nodeRepository = $nodeRepository;
$this->suspensionService = $suspensionService;
$this->transferService = $transferService;
$this->daemonConfigurationRepository = $daemonConfigurationRepository;
}
@ -98,8 +89,7 @@ class ServerTransferController extends Controller
*
* @throws \Throwable
*/
public function transfer(Request $request, Server $server)
{
public function transfer(Request $request, Server $server) {
$validatedData = $request->validate([
'node_id' => 'required|exists:nodes,id',
'allocation_id' => 'required|bail|unique:servers|exists:allocations,id',
@ -116,9 +106,6 @@ class ServerTransferController extends Controller
// Check if the selected daemon is online.
$this->daemonConfigurationRepository->setNode($node)->getSystemInformation();
// Suspend the server and request an archive to be created.
//$this->suspensionService->toggle($server, 'suspend');
// Create a new ServerTransfer entry.
$transfer = new ServerTransfer;

View file

@ -58,16 +58,32 @@ class WebsocketController extends ClientApiController
throw new HttpException(Response::HTTP_FORBIDDEN, 'You do not have permission to connect to this server\'s websocket.');
}
$permissions = $this->permissionsService->handle($server, $user);
$node = null;
// Check if there is a transfer query param asking to connect to the target node's websocket.
if ($request->query('transfer', 'false') === 'true') {
// Check if the user has permissions to receive transfer logs.
if (! in_array('admin.websocket.transfer', $permissions)) {
throw new HttpException(Response::HTTP_FORBIDDEN, 'You do not have permission to get transfer logs');
}
$node = $server->transfer->newNode;
} else {
$node = $server->node;
}
$token = $this->jwtService
->setExpiresAt(CarbonImmutable::now()->addMinutes(10))
->setClaims([
'user_id' => $request->user()->id,
'server_uuid' => $server->uuid,
'permissions' => $this->permissionsService->handle($server, $user),
'permissions' => $permissions,
])
->handle($server->node, $user->id . $server->uuid);
->handle($node, $user->id . $server->uuid);
$socket = str_replace(['https://', 'http://'], ['wss://', 'ws://'], $server->node->getConnectionAddress());
$socket = str_replace(['https://', 'http://'], ['wss://', 'ws://'], $node->getConnectionAddress());
return new JsonResponse([
'data' => [

View file

@ -58,11 +58,6 @@ class ServerTransferController extends Controller
*/
private $configurationStructureService;
/**
* @var \Pterodactyl\Services\Servers\SuspensionService
*/
private $suspensionService;
/**
* @var \Psr\Log\LoggerInterface
*/
@ -78,7 +73,6 @@ class ServerTransferController extends Controller
* @param \Pterodactyl\Repositories\Wings\DaemonServerRepository $daemonServerRepository
* @param \Pterodactyl\Repositories\Wings\DaemonTransferRepository $daemonTransferRepository
* @param \Pterodactyl\Services\Servers\ServerConfigurationStructureService $configurationStructureService
* @param \Pterodactyl\Services\Servers\SuspensionService $suspensionService
* @param \Psr\Log\LoggerInterface $writer
*/
public function __construct(
@ -89,7 +83,6 @@ class ServerTransferController extends Controller
DaemonServerRepository $daemonServerRepository,
DaemonTransferRepository $daemonTransferRepository,
ServerConfigurationStructureService $configurationStructureService,
SuspensionService $suspensionService,
LoggerInterface $writer
) {
$this->connection = $connection;
@ -99,7 +92,6 @@ class ServerTransferController extends Controller
$this->daemonServerRepository = $daemonServerRepository;
$this->daemonTransferRepository = $daemonTransferRepository;
$this->configurationStructureService = $configurationStructureService;
$this->suspensionService = $suspensionService;
$this->writer = $writer;
}
@ -187,9 +179,6 @@ class ServerTransferController extends Controller
// Remove the new allocations.
$this->allocationRepository->updateWhereIn('id', $allocationIds, ['server_id' => null]);
// Unsuspend the server.
//$this->suspensionService->toggle($server, 'unsuspend');
return new JsonResponse([], Response::HTTP_NO_CONTENT);
}
@ -236,7 +225,6 @@ class ServerTransferController extends Controller
// Unsuspend the server
$server->load('node');
//$this->suspensionService->toggle($server, $this->suspensionService::ACTION_UNSUSPEND);
return new JsonResponse([], Response::HTTP_NO_CONTENT);
}

View file

@ -16,6 +16,8 @@ namespace Pterodactyl\Models;
* @property \Carbon\Carbon $updated_at
*
* @property \Pterodactyl\Models\Server $server
* @property \Pterodactyl\Models\Node $oldNode
* @property \Pterodactyl\Models\Node $newNode
*/
class ServerTransfer extends Model
{
@ -78,4 +80,24 @@ class ServerTransfer extends Model
{
return $this->belongsTo(Server::class);
}
/**
* Gets the source node associated with a server transfer.
*
* @return \Illuminate\Database\Eloquent\Relations\HasOne
*/
public function oldNode()
{
return $this->hasOne(Node::class, 'id', 'old_node');
}
/**
* Gets the target node associated with a server transfer.
*
* @return \Illuminate\Database\Eloquent\Relations\HasOne
*/
public function newNode()
{
return $this->hasOne(Node::class, 'id', 'new_node');
}
}

View file

@ -6,6 +6,7 @@ use Webmozart\Assert\Assert;
use Pterodactyl\Models\Server;
use Illuminate\Database\ConnectionInterface;
use Pterodactyl\Repositories\Wings\DaemonServerRepository;
use Symfony\Component\HttpKernel\Exception\ConflictHttpException;
class SuspensionService
{
@ -56,6 +57,11 @@ class SuspensionService
return;
}
// Check if the server is currently being transferred.
if ($server->transfer !== null) {
throw new ConflictHttpException('Server is currently being transferred');
}
$this->connection->transaction(function () use ($action, $server) {
$server->update([
'suspended' => $action === self::ACTION_SUSPEND,