Skip to content

Commit fa902cc

Browse files
committed
Add mounts page to server admin view
1 parent 34f718a commit fa902cc

File tree

9 files changed

+151
-17
lines changed

9 files changed

+151
-17
lines changed

app/Http/Controllers/Admin/MountController.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
use Pterodactyl\Exceptions\DisplayException;
99
use Pterodactyl\Http\Controllers\Controller;
1010
use Pterodactyl\Services\Mounts\MountUpdateService;
11+
use Pterodactyl\Http\Requests\Admin\MountFormRequest;
1112
use Pterodactyl\Services\Mounts\MountCreationService;
1213
use Pterodactyl\Services\Mounts\MountDeletionService;
13-
use Pterodactyl\Http\Requests\Admin\MountFormRequest;
1414
use Pterodactyl\Repositories\Eloquent\MountRepository;
1515
use Pterodactyl\Contracts\Repository\NestRepositoryInterface;
1616
use Pterodactyl\Contracts\Repository\LocationRepositoryInterface;
@@ -22,6 +22,11 @@ class MountController extends Controller
2222
*/
2323
protected $alert;
2424

25+
/**
26+
* @var \Pterodactyl\Repositories\Eloquent\MountRepository
27+
*/
28+
protected $mountRepository;
29+
2530
/**
2631
* @var \Pterodactyl\Contracts\Repository\NestRepositoryInterface
2732
*/

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

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Illuminate\Contracts\View\Factory;
1010
use Pterodactyl\Exceptions\DisplayException;
1111
use Pterodactyl\Http\Controllers\Controller;
12+
use Pterodactyl\Repositories\Eloquent\MountRepository;
1213
use Pterodactyl\Repositories\Eloquent\NestRepository;
1314
use Pterodactyl\Repositories\Eloquent\NodeRepository;
1415
use Pterodactyl\Repositories\Eloquent\ServerRepository;
@@ -35,6 +36,11 @@ class ServerViewController extends Controller
3536
*/
3637
private $repository;
3738

39+
/**
40+
* @var \Pterodactyl\Repositories\Eloquent\MountRepository
41+
*/
42+
protected $mountRepository;
43+
3844
/**
3945
* @var \Pterodactyl\Repositories\Eloquent\NestRepository
4046
*/
@@ -53,27 +59,30 @@ class ServerViewController extends Controller
5359
/**
5460
* ServerViewController constructor.
5561
*
62+
* @param \Illuminate\Contracts\View\Factory $view
5663
* @param \Pterodactyl\Repositories\Eloquent\DatabaseHostRepository $databaseHostRepository
57-
* @param \Pterodactyl\Repositories\Eloquent\NestRepository $nestRepository
5864
* @param \Pterodactyl\Repositories\Eloquent\LocationRepository $locationRepository
65+
* @param \Pterodactyl\Repositories\Eloquent\MountRepository $mountRepository
66+
* @param \Pterodactyl\Repositories\Eloquent\NestRepository $nestRepository
5967
* @param \Pterodactyl\Repositories\Eloquent\NodeRepository $nodeRepository
6068
* @param \Pterodactyl\Repositories\Eloquent\ServerRepository $repository
61-
* @param \Illuminate\Contracts\View\Factory $view
6269
*/
6370
public function __construct(
71+
Factory $view,
6472
DatabaseHostRepository $databaseHostRepository,
65-
NestRepository $nestRepository,
6673
LocationRepository $locationRepository,
74+
MountRepository $mountRepository,
75+
NestRepository $nestRepository,
6776
NodeRepository $nodeRepository,
68-
ServerRepository $repository,
69-
Factory $view
77+
ServerRepository $repository
7078
) {
7179
$this->view = $view;
7280
$this->databaseHostRepository = $databaseHostRepository;
73-
$this->repository = $repository;
81+
$this->locationRepository = $locationRepository;
82+
$this->mountRepository = $mountRepository;
7483
$this->nestRepository = $nestRepository;
7584
$this->nodeRepository = $nodeRepository;
76-
$this->locationRepository = $locationRepository;
85+
$this->repository = $repository;
7786
}
7887

7988
/**
@@ -160,6 +169,21 @@ public function database(Request $request, Server $server)
160169
]);
161170
}
162171

172+
/**
173+
* Returns all of the mounts that exist for the server.
174+
*
175+
* @param \Illuminate\Http\Request $request
176+
* @param \Pterodactyl\Models\Server $server
177+
* @return \Illuminate\Contracts\View\View
178+
*/
179+
public function mounts(Request $request, Server $server)
180+
{
181+
return $this->view->make('admin.servers.view.mounts', [
182+
'mounts' => $this->mountRepository->getMountListForServer($server),
183+
'server' => $server,
184+
]);
185+
}
186+
163187
/**
164188
* Returns the base server management page, or an exception if the server
165189
* is in a state that cannot be recovered from.
@@ -169,7 +193,6 @@ public function database(Request $request, Server $server)
169193
* @return \Illuminate\Contracts\View\View
170194
*
171195
* @throws \Pterodactyl\Exceptions\DisplayException
172-
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
173196
*/
174197
public function manage(Request $request, Server $server)
175198
{

app/Http/Controllers/Admin/ServersController.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use Pterodactyl\Exceptions\DisplayException;
1717
use Pterodactyl\Http\Controllers\Controller;
1818
use Pterodactyl\Services\Servers\SuspensionService;
19+
use Pterodactyl\Repositories\Eloquent\MountRepository;
1920
use Pterodactyl\Services\Servers\ServerDeletionService;
2021
use Pterodactyl\Services\Servers\ReinstallServerService;
2122
use Pterodactyl\Services\Servers\BuildModificationService;
@@ -83,6 +84,11 @@ class ServersController extends Controller
8384
*/
8485
protected $detailsModificationService;
8586

87+
/**
88+
* @var \Pterodactyl\Repositories\Eloquent\MountRepository
89+
*/
90+
protected $mountRepository;
91+
8692
/**
8793
* @var \Pterodactyl\Contracts\Repository\NestRepositoryInterface
8894
*/
@@ -123,6 +129,7 @@ class ServersController extends Controller
123129
* @param \Pterodactyl\Services\Servers\DetailsModificationService $detailsModificationService
124130
* @param \Pterodactyl\Services\Servers\ReinstallServerService $reinstallService
125131
* @param \Pterodactyl\Contracts\Repository\ServerRepositoryInterface $repository
132+
* @param \Pterodactyl\Repositories\Eloquent\MountRepository $mountRepository
126133
* @param \Pterodactyl\Contracts\Repository\NestRepositoryInterface $nestRepository
127134
* @param \Pterodactyl\Services\Servers\StartupModificationService $startupModificationService
128135
* @param \Pterodactyl\Services\Servers\SuspensionService $suspensionService
@@ -140,6 +147,7 @@ public function __construct(
140147
DetailsModificationService $detailsModificationService,
141148
ReinstallServerService $reinstallService,
142149
ServerRepositoryInterface $repository,
150+
MountRepository $mountRepository,
143151
NestRepositoryInterface $nestRepository,
144152
StartupModificationService $startupModificationService,
145153
SuspensionService $suspensionService
@@ -157,6 +165,7 @@ public function __construct(
157165
$this->nestRepository = $nestRepository;
158166
$this->reinstallService = $reinstallService;
159167
$this->repository = $repository;
168+
$this->mountRepository = $mountRepository;
160169
$this->startupModificationService = $startupModificationService;
161170
$this->suspensionService = $suspensionService;
162171
}
@@ -168,7 +177,6 @@ public function __construct(
168177
* @param \Pterodactyl\Models\Server $server
169178
* @return \Illuminate\Http\RedirectResponse
170179
*
171-
* @throws \Pterodactyl\Exceptions\DisplayException
172180
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
173181
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
174182
*/

app/Repositories/Eloquent/MountRepository.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Pterodactyl\Models\Mount;
66
use Illuminate\Support\Collection;
7+
use Pterodactyl\Models\Server;
78
use Pterodactyl\Repositories\Concerns\Searchable;
89
use Illuminate\Database\Eloquent\ModelNotFoundException;
910
use Pterodactyl\Exceptions\Repository\RecordNotFoundException;
@@ -48,4 +49,22 @@ public function getWithRelations(string $id): Mount
4849
throw new RecordNotFoundException;
4950
}
5051
}
52+
53+
/**
54+
* Return mounts available to a server. (ignoring if they are or are not mounted)
55+
*
56+
* @param Server $server
57+
* @return \Illuminate\Support\Collection
58+
*/
59+
public function getMountListForServer(Server $server): Collection
60+
{
61+
return $this->getBuilder()
62+
->whereHas('eggs', function ($q) use ($server) {
63+
$q->where('id', '=', $server->egg_id);
64+
})
65+
->whereHas('nodes', function ($q) use ($server) {
66+
$q->where('id', '=', $server->node_id);
67+
})
68+
->get($this->getColumns());
69+
}
5170
}

resources/views/admin/mounts/view.blade.php

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@
2929

3030
<form action="{{ route('admin.mounts.view', $mount->id) }}" method="POST">
3131
<div class="box-body">
32+
<div class="form-group">
33+
<label for="PUniqueID" class="form-label">Unique ID</label>
34+
<input type="text" id="PUniqueID" class="form-control" value="{{ $mount->uuid }}" disabled />
35+
</div>
36+
3237
<div class="form-group">
3338
<label for="pName" class="form-label">Name</label>
3439
<input type="text" id="pName" name="name" class="form-control" value="{{ $mount->name }}" />
@@ -117,8 +122,8 @@
117122

118123
@foreach ($mount->eggs as $egg)
119124
<tr>
120-
<td><code>{{ $egg->id }}</code></td>
121-
<td><a href="{{ route('admin.nests.egg.view', $egg->id) }}">{{ $egg->name }}</a></td>
125+
<td class="col-sm-2 middle"><code>{{ $egg->id }}</code></td>
126+
<td class="middle"><a href="{{ route('admin.nests.egg.view', $egg->id) }}">{{ $egg->name }}</a></td>
122127
<td class="col-sm-1 middle">
123128
<button data-action="detach-egg" data-id="{{ $egg->id }}" class="btn btn-sm btn-danger"><i class="fa fa-trash-o"></i></button>
124129
</td>
@@ -148,9 +153,9 @@
148153

149154
@foreach ($mount->nodes as $node)
150155
<tr>
151-
<td><code>{{ $node->id }}</code></td>
152-
<td><a href="{{ route('admin.nodes.view', $node->id) }}">{{ $node->name }}</a></td>
153-
<td><code>{{ $node->fqdn }}</code></td>
156+
<td class="col-sm-2 middle"><code>{{ $node->id }}</code></td>
157+
<td class="middle"><a href="{{ route('admin.nodes.view', $node->id) }}">{{ $node->name }}</a></td>
158+
<td class="middle"><code>{{ $node->fqdn }}</code></td>
154159
<td class="col-sm-1 middle">
155160
<button data-action="detach-node" data-id="{{ $node->id }}" class="btn btn-sm btn-danger"><i class="fa fa-trash-o"></i></button>
156161
</td>
@@ -254,7 +259,7 @@
254259
@section('footer-scripts')
255260
@parent
256261

257-
<script type="application/javascript">
262+
<script>
258263
$(document).ready(function() {
259264
$('#pEggs').select2({
260265
placeholder: 'Select eggs..',

resources/views/admin/servers/partials/navigation.blade.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
<li class="{{ $router->currentRouteNamed('admin.servers.view.database') ? 'active' : '' }}">
2222
<a href="{{ route('admin.servers.view.database', $server->id) }}">Database</a>
2323
</li>
24+
<li class="{{ $router->currentRouteNamed('admin.servers.view.mounts') ? 'active' : '' }}">
25+
<a href="{{ route('admin.servers.view.mounts', $server->id) }}">Mounts</a>
26+
</li>
2427
@endif
2528
<li class="{{ $router->currentRouteNamed('admin.servers.view.manage') ? 'active' : '' }}">
2629
<a href="{{ route('admin.servers.view.manage', $server->id) }}">Manage</a>

resources/views/admin/servers/view/database.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
<th>Username</th>
3838
<th>Connections From</th>
3939
<th>Host</th>
40-
<th>Max Conenctions</th>
40+
<th>Max Connections</th>
4141
<th></th>
4242
</tr>
4343
@foreach($server->databases as $database)
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
@extends('layouts.admin')
2+
3+
@section('title')
4+
Server — {{ $server->name }}: Mounts
5+
@endsection
6+
7+
@section('content-header')
8+
<h1>{{ $server->name }}<small>Manage server mounts.</small></h1>
9+
<ol class="breadcrumb">
10+
<li><a href="{{ route('admin.index') }}">Admin</a></li>
11+
<li><a href="{{ route('admin.servers') }}">Servers</a></li>
12+
<li><a href="{{ route('admin.servers.view', $server->id) }}">{{ $server->name }}</a></li>
13+
<li class="active">Mounts</li>
14+
</ol>
15+
@endsection
16+
17+
@section('content')
18+
@include('admin.servers.partials.navigation')
19+
20+
<div class="row">
21+
<div class="col-sm-12">
22+
<div class="box box-primary">
23+
<div class="box-header with-border">
24+
<h3 class="box-title">Available Mounts</h3>
25+
</div>
26+
27+
<div class="box-body table-responsible no-padding">
28+
<table class="table table-hover">
29+
<tr>
30+
<th>ID</th>
31+
<th>Name</th>
32+
<th>Source</th>
33+
<th>Target</th>
34+
<th>Status</th>
35+
<th></th>
36+
</tr>
37+
38+
@foreach ($mounts as $mount)
39+
<tr>
40+
<td class="col-sm-1 middle"><code>{{ $mount->id }}</code></td>
41+
<td class="middle"><a href="{{ route('admin.mounts.view', $mount->id) }}">{{ $mount->name }}</a></td>
42+
<td class="middle"><code>{{ $mount->source }}</code></td>
43+
<td class="col-sm-2 middle"><code>{{ $mount->target }}</code></td>
44+
<td class="col-sm-2 middle">
45+
@if ($mount->id == 2)
46+
<span class="label label-primary">Unmounted</span>
47+
@else
48+
<span class="label label-success">Mounted</span>
49+
@endif
50+
</td>
51+
52+
<td class="col-sm-1 middle">
53+
@if ($mount->id == 2)
54+
<button data-action="mount" data-id="{{ $mount->id }}" class="btn btn-xs btn-success"><i class="fa fa-plus"></i></button>
55+
@else
56+
<button data-action="unmount" data-id="{{ $mount->id }}" class="btn btn-xs btn-danger"><i class="fa fa-times"></i></button>
57+
@endif
58+
</td>
59+
</tr>
60+
@endforeach
61+
</table>
62+
</div>
63+
</div>
64+
</div>
65+
</div>
66+
@endsection
67+
68+
@section('footer-scripts')
69+
@parent
70+
@endsection

routes/admin.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@
113113
Route::get('/view/{server}/build', 'Servers\ServerViewController@build')->name('admin.servers.view.build');
114114
Route::get('/view/{server}/startup', 'Servers\ServerViewController@startup')->name('admin.servers.view.startup');
115115
Route::get('/view/{server}/database', 'Servers\ServerViewController@database')->name('admin.servers.view.database');
116+
Route::get('/view/{server}/mounts', 'Servers\ServerViewController@mounts')->name('admin.servers.view.mounts');
116117
});
117118

118119
Route::get('/view/{server}/manage', 'Servers\ServerViewController@manage')->name('admin.servers.view.manage');

0 commit comments

Comments
 (0)