Skip to content

Commit 5007ce0

Browse files
committed
Get to the point where we can start notifying the other daemon, remove TransferJob.php, add DaemonTransferRepository.php
1 parent a2eab3c commit 5007ce0

File tree

8 files changed

+172
-115
lines changed

8 files changed

+172
-115
lines changed

app/Http/Controllers/Admin/Servers/ServerTransferController.php

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66
use Illuminate\Http\Request;
77
use Prologue\Alerts\AlertsMessageBag;
88
use Pterodactyl\Http\Controllers\Controller;
9-
use Pterodactyl\Jobs\Server\TransferJob;
109
use Pterodactyl\Models\Server;
1110
use Pterodactyl\Repositories\Eloquent\ServerRepository;
1211
use Pterodactyl\Repositories\Eloquent\LocationRepository;
1312
use Pterodactyl\Repositories\Eloquent\NodeRepository;
13+
use Pterodactyl\Services\Servers\SuspensionService;
14+
use Pterodactyl\Services\Servers\TransferService;
1415

1516
class ServerTransferController extends Controller
1617
{
@@ -39,6 +40,16 @@ class ServerTransferController extends Controller
3940
*/
4041
private $nodeRepository;
4142

43+
/**
44+
* @var \Pterodactyl\Services\Servers\SuspensionService
45+
*/
46+
private $suspensionService;
47+
48+
/**
49+
* @var \Pterodactyl\Services\Servers\TransferService
50+
*/
51+
private $transferService;
52+
4253
/**
4354
* ServerTransferController constructor.
4455
*
@@ -47,19 +58,25 @@ class ServerTransferController extends Controller
4758
* @param \Pterodactyl\Repositories\Eloquent\ServerRepository $repository
4859
* @param \Pterodactyl\Repositories\Eloquent\LocationRepository $locationRepository
4960
* @param \Pterodactyl\Repositories\Eloquent\NodeRepository $nodeRepository
61+
* @param \Pterodactyl\Services\Servers\SuspensionService $suspensionService
62+
* @param \Pterodactyl\Services\Servers\TransferService $transferService
5063
*/
5164
public function __construct(
5265
AlertsMessageBag $alert,
5366
Dispatcher $dispatcher,
5467
ServerRepository $repository,
5568
LocationRepository $locationRepository,
56-
NodeRepository $nodeRepository
69+
NodeRepository $nodeRepository,
70+
SuspensionService $suspensionService,
71+
TransferService $transferService
5772
) {
5873
$this->alert = $alert;
5974
$this->dispatcher = $dispatcher;
6075
$this->repository = $repository;
6176
$this->locationRepository = $locationRepository;
6277
$this->nodeRepository = $nodeRepository;
78+
$this->suspensionService = $suspensionService;
79+
$this->transferService = $transferService;
6380
}
6481

6582
/**
@@ -68,6 +85,8 @@ public function __construct(
6885
* @param \Illuminate\Http\Request $request
6986
* @param \Pterodactyl\Models\Server $server
7087
* @return \Illuminate\Http\RedirectResponse
88+
*
89+
* @throws \Throwable
7190
*/
7291
public function transfer(Request $request, Server $server)
7392
{
@@ -84,8 +103,9 @@ public function transfer(Request $request, Server $server)
84103
// Check if the node is viable for the transfer.
85104
$node = $this->nodeRepository->getNodeWithResourceUsage($node_id);
86105
if ($node->isViable($server->memory, $server->disk)) {
87-
// TODO: Run TransferJob.
88-
$this->dispatcher->dispatch(new TransferJob($server, $node, $allocation_id, $additional_allocations));
106+
// Suspend the server and request an archive to be created.
107+
// $this->suspensionService->toggle($server, 'suspend');
108+
$this->transferService->requestArchive($server);
89109

90110
$this->alert->success(trans('admin/server.alerts.transfer_started'))->flash();
91111
} else {
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
<?php
2+
3+
namespace Pterodactyl\Http\Controllers\Api\Remote\Servers;
4+
5+
use Cake\Chronos\Chronos;
6+
use Illuminate\Http\JsonResponse;
7+
use Illuminate\Http\Request;
8+
use Illuminate\Http\Response;
9+
use Lcobucci\JWT\Builder;
10+
use Lcobucci\JWT\Signer\Hmac\Sha256;
11+
use Lcobucci\JWT\Signer\Key;
12+
use Pterodactyl\Http\Controllers\Controller;
13+
use Pterodactyl\Models\Server;
14+
use Pterodactyl\Repositories\Eloquent\ServerRepository;
15+
use Pterodactyl\Repositories\Eloquent\NodeRepository;
16+
use Pterodactyl\Repositories\Wings\DaemonTransferRepository;
17+
18+
class ServerTransferController extends Controller
19+
{
20+
/**
21+
* @var \Pterodactyl\Repositories\Eloquent\ServerRepository
22+
*/
23+
private $repository;
24+
25+
/**
26+
* @var \Pterodactyl\Repositories\Eloquent\NodeRepository
27+
*/
28+
private $nodeRepository;
29+
30+
/**
31+
* @var \Pterodactyl\Repositories\Wings\DaemonTransferRepository
32+
*/
33+
private $daemonTransferRepository;
34+
35+
/**
36+
* ServerTransferController constructor.
37+
*
38+
* @param \Pterodactyl\Repositories\Eloquent\ServerRepository $repository
39+
* @param \Pterodactyl\Repositories\Eloquent\NodeRepository $nodeRepository
40+
* @param DaemonTransferRepository $daemonTransferRepository
41+
*/
42+
public function __construct(
43+
ServerRepository $repository,
44+
NodeRepository $nodeRepository,
45+
DaemonTransferRepository $daemonTransferRepository
46+
) {
47+
$this->repository = $repository;
48+
$this->nodeRepository = $nodeRepository;
49+
$this->daemonTransferRepository = $daemonTransferRepository;
50+
}
51+
52+
/**
53+
* The daemon notifies us about the archive status.
54+
*
55+
* @param \Illuminate\Http\Request $request
56+
* @param \Pterodactyl\Models\Server $server
57+
* @return \Illuminate\Http\JsonResponse
58+
*
59+
* @throws \Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException
60+
*/
61+
public function archive(Request $request, Server $server)
62+
{
63+
// Unsuspend the server and don't continue the transfer.
64+
if (!$request->input('successful')) {
65+
// $this->suspensionService->toggle($server, 'unsuspend');
66+
return JsonResponse::create([], Response::HTTP_NO_CONTENT);
67+
}
68+
69+
$now = Chronos::now();
70+
$signer = new Sha256;
71+
72+
$token = (new Builder)->issuedBy(config('app.url'))
73+
->permittedFor($server->node->getConnectionAddress())
74+
->identifiedBy(hash('sha256', $server->uuid), true)
75+
->issuedAt($now->getTimestamp())
76+
->canOnlyBeUsedAfter($now->getTimestamp())
77+
->expiresAt($now->addMinutes(15)->getTimestamp())
78+
->relatedTo($server->id, true)
79+
->getToken($signer, new Key($server->node->daemonSecret));
80+
81+
$this->daemonTransferRepository->notify($server, $token->__toString());
82+
83+
return JsonResponse::create([], Response::HTTP_NO_CONTENT);
84+
}
85+
}

app/Jobs/Server/TransferJob.php

Lines changed: 0 additions & 91 deletions
This file was deleted.

app/Models/Node.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ public function getYamlConfiguration()
170170
],
171171
'system' => [
172172
'data' => $this->daemonBase,
173+
'archive_directory' => $this->daemonBase . '/.archives',
173174
'username' => 'pterodactyl',
174175
'timezone_path' => '/etc/timezone',
175176
'set_permissions_on_boot' => true,

app/Repositories/Wings/DaemonServerRepository.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,4 +124,24 @@ public function suspend(bool $unsuspend = false): void
124124
throw new DaemonConnectionException($exception);
125125
}
126126
}
127+
128+
/**
129+
* Requests the daemon to create a full archive of the server.
130+
* Once the daemon is finished they will send a POST request to
131+
* "/api/remote/servers/{uuid}/archive" with a boolean.
132+
*
133+
* @throws DaemonConnectionException
134+
*/
135+
public function requestArchive(): void
136+
{
137+
Assert::isInstanceOf($this->server, Server::class);
138+
139+
try {
140+
$this->getHttpClient()->post(sprintf(
141+
'/api/servers/%s/archive', $this->server->uuid
142+
));
143+
} catch (TransferException $exception) {
144+
throw new DaemonConnectionException($exception);
145+
}
146+
}
127147
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace Pterodactyl\Repositories\Wings;
4+
5+
use Pterodactyl\Models\Server;
6+
use GuzzleHttp\Exception\TransferException;
7+
use Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException;
8+
9+
class DaemonTransferRepository extends DaemonRepository
10+
{
11+
12+
/**
13+
* @param Server $server
14+
* @param string $token
15+
*
16+
* @throws DaemonConnectionException
17+
*/
18+
public function notify(Server $server, string $token): void
19+
{
20+
try {
21+
$this->getHttpClient()->post('/api/transfer', [
22+
'json' => [
23+
'url' => $server->node->getConnectionAddress() . sprintf('/api/servers/%s/archive', $server->uuid),
24+
'token' => $token,
25+
],
26+
]);
27+
} catch (TransferException $exception) {
28+
throw new DaemonConnectionException($exception);
29+
}
30+
}
31+
}

app/Services/Servers/TransferService.php

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,6 @@
1010

1111
class TransferService
1212
{
13-
14-
/**
15-
* @var \Illuminate\Database\ConnectionInterface
16-
*/
17-
private $connection;
18-
1913
/**
2014
* @var \Pterodactyl\Contracts\Repository\ServerRepositoryInterface
2115
*/
@@ -26,33 +20,29 @@ class TransferService
2620
*/
2721
private $daemonServerRepository;
2822

29-
/**
30-
* @var \Psr\Log\LoggerInterface
31-
*/
32-
private $writer;
33-
3423
/**
3524
* TransferService constructor.
3625
*
37-
* @param \Illuminate\Database\ConnectionInterface $connection
3826
* @param \Pterodactyl\Repositories\Wings\DaemonServerRepository $daemonServerRepository
3927
* @param \Pterodactyl\Contracts\Repository\ServerRepositoryInterface $repository
40-
* @param \Psr\Log\LoggerInterface $writer
4128
*/
4229
public function __construct(
43-
ConnectionInterface $connection,
4430
DaemonServerRepository $daemonServerRepository,
45-
ServerRepositoryInterface $repository,
46-
LoggerInterface $writer
31+
ServerRepositoryInterface $repository
4732
) {
48-
$this->connection = $connection;
4933
$this->repository = $repository;
5034
$this->daemonServerRepository = $daemonServerRepository;
51-
$this->writer = $writer;
5235
}
5336

54-
public function handle(Server $server)
37+
/**
38+
* Requests an archive from the daemon.
39+
*
40+
* @param int|\Pterodactyl\Models\Server $server
41+
*
42+
* @throws \Throwable
43+
*/
44+
public function requestArchive(Server $server)
5545
{
56-
46+
$this->daemonServerRepository->setServer($server)->requestArchive();
5747
}
5848
}

routes/api-remote.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@
1111
Route::get('/', 'Servers\ServerDetailsController');
1212
Route::get('/install', 'Servers\ServerInstallController@index');
1313
Route::post('/install', 'Servers\ServerInstallController@store');
14+
Route::post('/archive', 'Servers\ServerTransferController@archive');
1415
});

0 commit comments

Comments
 (0)