Skip to content

Commit 7f1a971

Browse files
committed
Un-butcher task system.
1 parent 0fe9a45 commit 7f1a971

File tree

12 files changed

+154
-77
lines changed

12 files changed

+154
-77
lines changed

app/Console/Commands/RunTasks.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
namespace Pterodactyl\Console\Commands;
2626

2727
use Carbon;
28-
use Pterodactyl\Models;
28+
use Pterodactyl\Models\Task;
2929
use Illuminate\Console\Command;
3030
use Pterodactyl\Jobs\SendScheduledTask;
3131
use Illuminate\Foundation\Bus\DispatchesJobs;
@@ -65,14 +65,14 @@ public function __construct()
6565
*/
6666
public function handle()
6767
{
68-
$tasks = Models\Task::where('queued', 0)->where('active', 1)->where('next_run', '<=', Carbon::now()->toAtomString())->get();
68+
$tasks = Task::where('queued', false)->where('active', true)->where('next_run', '<=', Carbon::now()->toAtomString())->get();
6969

7070
$this->info(sprintf('Preparing to queue %d tasks.', count($tasks)));
7171
$bar = $this->output->createProgressBar(count($tasks));
7272

7373
foreach ($tasks as &$task) {
7474
$bar->advance();
75-
$this->dispatch((new SendScheduledTask(Models\Server::findOrFail($task->server), $task))->onQueue(config('pterodactyl.queues.low')));
75+
$this->dispatch((new SendScheduledTask($task))->onQueue(config('pterodactyl.queues.low')));
7676
}
7777

7878
$bar->finish();

app/Http/Controllers/API/User/ServerController.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public function power(Request $request, $uuid)
7070
$server = Server::byUuid($uuid);
7171
$request->user()->can('power-' . $request->input('action'), $server);
7272

73-
$repo = new PowerRepository($server);
73+
$repo = new PowerRepository($server, $request->user());
7474
$repo->do($request->input('action'));
7575

7676
return response('', 204)->header('Content-Type', 'application/json');
@@ -90,7 +90,7 @@ public function command(Request $request, $uuid)
9090
$server = Server::byUuid($uuid);
9191
$request->user()->can('send-command', $server);
9292

93-
$repo = new CommandRepository($server);
93+
$repo = new CommandRepository($server, $request->user());
9494
$repo->send($request->input('command'));
9595

9696
return response('', 204)->header('Content-Type', 'application/json');

app/Http/Controllers/Server/TaskController.php

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@
2626

2727
use Log;
2828
use Alert;
29-
use Pterodactyl\Models;
3029
use Illuminate\Http\Request;
31-
use Pterodactyl\Repositories;
30+
use Pterodactyl\Models\Server;
31+
use Pterodactyl\Repositories\TaskRepository;
3232
use Pterodactyl\Exceptions\DisplayException;
3333
use Pterodactyl\Http\Controllers\Controller;
3434
use Pterodactyl\Exceptions\DisplayValidationException;
@@ -44,7 +44,7 @@ class TaskController extends Controller
4444
*/
4545
public function index(Request $request, $uuid)
4646
{
47-
$server = Models\Server::byUuid($uuid)->load('tasks');
47+
$server = Server::byUuid($uuid)->load('tasks');
4848
$this->authorize('list-tasks', $server);
4949
$server->js();
5050

@@ -68,7 +68,7 @@ public function index(Request $request, $uuid)
6868
*/
6969
public function create(Request $request, $uuid)
7070
{
71-
$server = Models\Server::byUuid($uuid);
71+
$server = Server::byUuid($uuid);
7272
$this->authorize('create-task', $server);
7373
$server->js();
7474

@@ -87,12 +87,12 @@ public function create(Request $request, $uuid)
8787
*/
8888
public function store(Request $request, $uuid)
8989
{
90-
$server = Models\Server::byUuid($uuid);
90+
$server = Server::byUuid($uuid);
9191
$this->authorize('create-task', $server);
9292

93+
$repo = new TaskRepository;
9394
try {
94-
$repo = new Repositories\TaskRepository;
95-
$repo->create($server->id, $request->except([
95+
$repo->create($server->id, $request->user()->id, $request->except([
9696
'_token',
9797
]));
9898

@@ -119,7 +119,7 @@ public function store(Request $request, $uuid)
119119
*/
120120
public function delete(Request $request, $uuid, $id)
121121
{
122-
$server = Models\Server::byUuid($uuid)->load('tasks');
122+
$server = Server::byUuid($uuid)->load('tasks');
123123
$this->authorize('delete-task', $server);
124124

125125
$task = $server->tasks->where('id', $id)->first();
@@ -129,8 +129,8 @@ public function delete(Request $request, $uuid, $id)
129129
], 404);
130130
}
131131

132+
$repo = new TaskRepository;
132133
try {
133-
$repo = new Repositories\TaskRepository;
134134
$repo->delete($id);
135135

136136
return response()->json([], 204);
@@ -153,7 +153,7 @@ public function delete(Request $request, $uuid, $id)
153153
*/
154154
public function toggle(Request $request, $uuid, $id)
155155
{
156-
$server = Models\Server::byUuid($uuid)->load('tasks');
156+
$server = Server::byUuid($uuid)->load('tasks');
157157
$this->authorize('toggle-task', $server);
158158

159159
$task = $server->tasks->where('id', $id)->first();
@@ -163,8 +163,8 @@ public function toggle(Request $request, $uuid, $id)
163163
], 404);
164164
}
165165

166+
$repo = new TaskRepository;
166167
try {
167-
$repo = new Repositories\TaskRepository;
168168
$resp = $repo->toggle($id);
169169

170170
return response()->json([

app/Jobs/SendScheduledTask.php

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@
2626

2727
use Cron;
2828
use Carbon;
29-
use Pterodactyl\Models;
29+
use Pterodactyl\Models\Task;
30+
use Pterodactyl\Models\User;
31+
use Pterodactyl\Models\Server;
32+
use Pterodactyl\Models\TaskLog;
3033
use Illuminate\Queue\SerializesModels;
3134
use Illuminate\Queue\InteractsWithQueue;
3235
use Illuminate\Contracts\Queue\ShouldQueue;
@@ -37,11 +40,6 @@ class SendScheduledTask extends Job implements ShouldQueue
3740
{
3841
use InteractsWithQueue, SerializesModels;
3942

40-
/**
41-
* @var \Pterodactyl\Models\Server
42-
*/
43-
protected $server;
44-
4543
/**
4644
* @var \Pterodactyl\Models\Task
4745
*/
@@ -52,13 +50,12 @@ class SendScheduledTask extends Job implements ShouldQueue
5250
*
5351
* @return void
5452
*/
55-
public function __construct(Models\Server $server, Models\Task $task)
53+
public function __construct(Task $task)
5654
{
57-
$this->server = $server;
5855
$this->task = $task;
5956

60-
$task->queued = 1;
61-
$task->save();
57+
$this->task->queued = true;
58+
$this->task->save();
6259
}
6360

6461
/**
@@ -69,7 +66,7 @@ public function __construct(Models\Server $server, Models\Task $task)
6966
public function handle()
7067
{
7168
$time = Carbon::now();
72-
$log = new Models\TaskLog;
69+
$log = new TaskLog;
7370

7471
if ($this->attempts() >= 1) {
7572
// Just delete the job, we will attempt it again later anyways.
@@ -78,12 +75,15 @@ public function handle()
7875

7976
try {
8077
if ($this->task->action === 'command') {
81-
$repo = new CommandRepository($this->server);
78+
$repo = new CommandRepository($this->task->server, $this->task->user);
8279
$response = $repo->send($this->task->data);
83-
} elseif ($this->task->action === 'power') {
84-
$repo = new PowerRepository($this->server);
80+
} else if ($this->task->action === 'power') {
81+
$repo = new PowerRepository($this->task->server, $this->task->user);
8582
$response = $repo->do($this->task->data);
83+
} else {
84+
throw new \Exception('Task type provided was not valid.');
8685
}
86+
8787
$log->fill([
8888
'task_id' => $this->task->id,
8989
'run_time' => $time,
@@ -109,7 +109,7 @@ public function handle()
109109
$this->task->fill([
110110
'last_run' => $time,
111111
'next_run' => $cron->getNextRunDate(),
112-
'queued' => 0,
112+
'queued' => false,
113113
]);
114114
$this->task->save();
115115
$log->save();

app/Models/Server.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ public function node()
320320
*/
321321
public function tasks()
322322
{
323-
return $this->hasMany(Task::class, 'server', 'id');
323+
return $this->hasMany(Task::class);
324324
}
325325

326326
/**

app/Models/Task.php

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,10 @@ class Task extends Model
4949
*/
5050
protected $casts = [
5151
'id' => 'integer',
52-
'server' => 'integer',
53-
'queued' => 'integer',
52+
'user_id' => 'integer',
53+
'server_id' => 'integer',
54+
'queued' => 'boolean',
55+
'active' => 'boolean',
5456
];
5557

5658
/**
@@ -59,4 +61,24 @@ class Task extends Model
5961
* @var array
6062
*/
6163
protected $dates = ['last_run', 'next_run', 'created_at', 'updated_at'];
64+
65+
/**
66+
* Gets the server associated with a task.
67+
*
68+
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
69+
*/
70+
public function server()
71+
{
72+
return $this->belongsTo(Server::class);
73+
}
74+
75+
/**
76+
* Gets the user associated with a task.
77+
*
78+
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
79+
*/
80+
public function user()
81+
{
82+
return $this->belongsTo(User::class);
83+
}
6284
}

app/Repositories/Daemon/CommandRepository.php

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424

2525
namespace Pterodactyl\Repositories\Daemon;
2626

27-
use Pterodactyl\Models;
27+
use Pterodactyl\Models\User;
28+
use Pterodactyl\Models\Server;
2829
use GuzzleHttp\Exception\ConnectException;
2930
use Pterodactyl\Exceptions\DisplayException;
3031

@@ -37,15 +38,24 @@ class CommandRepository
3738
*/
3839
protected $server;
3940

41+
/**
42+
* The Eloquent Model associated with the user to run the request as.
43+
*
44+
* @var \Pterodactyl\Models\User|null
45+
*/
46+
protected $user;
47+
4048
/**
4149
* Constuctor for repository.
4250
*
43-
* @param int|\Pterodactyl\Models\Server $server
51+
* @param \Pterodactyl\Models\Server $server
52+
* @param \Pterodactyl\Models\User|null $user
4453
* @return void
4554
*/
46-
public function __construct($server)
55+
public function __construct(Server $server, User $user = null)
4756
{
48-
$this->server = ($server instanceof Models\Server) ? $server : Models\Server::findOrFail($server);
57+
$this->server = $server;
58+
$this->user = $user;
4959
}
5060

5161
/**
@@ -62,7 +72,7 @@ public function send($command)
6272
// We don't use the user's specific daemon secret here since we
6373
// are assuming that a call to this function has been validated.
6474
try {
65-
$response = $this->server->guzzleClient()->request('PUT', '/server/command', [
75+
$response = $this->server->guzzleClient($this->user)->request('POST', '/server/command', [
6676
'http_errors' => false,
6777
'json' => [
6878
'command' => $command,

app/Repositories/Daemon/PowerRepository.php

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424

2525
namespace Pterodactyl\Repositories\Daemon;
2626

27-
use Pterodactyl\Models;
27+
use Pterodactyl\Models\User;
28+
use Pterodactyl\Models\Server;
2829
use GuzzleHttp\Exception\ConnectException;
2930
use Pterodactyl\Exceptions\DisplayException;
3031

@@ -37,32 +38,39 @@ class PowerRepository
3738
*/
3839
protected $server;
3940

41+
/**
42+
* The Eloquent Model associated with the user to run the request as.
43+
*
44+
* @var \Pterodactyl\Models\User|null
45+
*/
46+
protected $user;
47+
4048
/**
4149
* Constuctor for repository.
4250
*
43-
* @param int|\Pterodactyl\Models\Server $server
51+
* @param \Pterodactyl\Models\Server $server
52+
* @param \Pterodactyl\Models\User|null $user
4453
* @return void
4554
*/
46-
public function __construct($server)
55+
public function __construct(Server $server, User $user = null)
4756
{
48-
$this->server = ($server instanceof Models\Server) ? $server : Models\Server::findOrFail($server);
57+
$this->server = $server;
58+
$this->user = $user;
4959
}
5060

5161
/**
5262
* Sends a power option to the daemon.
5363
*
54-
* @param string $action
64+
* @param string $action
5565
* @return string
5666
*
5767
* @throws \GuzzleHttp\Exception\RequestException
5868
* @throws \Pterodactyl\Exceptions\DisplayException
5969
*/
6070
public function do($action)
6171
{
62-
// We don't use the user's specific daemon secret here since we
63-
// are assuming that a call to this function has been validated.
6472
try {
65-
$response = $this->server->guzzleClient()->request('PUT', '/server/power', [
73+
$response = $this->server->guzzleClient($this->user)->request('PUT', '/server/power', [
6674
'http_errors' => false,
6775
'json' => [
6876
'action' => $action,

0 commit comments

Comments
 (0)