Skip to content

Commit 4fe4881

Browse files
committed
Add delete server support as well as fix a few other bugs
Also a few JS fixes to make things work better and not clear the console every time the server is booted
1 parent 9d2d726 commit 4fe4881

File tree

7 files changed

+167
-53
lines changed

7 files changed

+167
-53
lines changed

app/Http/Controllers/Admin/ServersController.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ public function getView(Request $request, $id)
6565
->where('servers.id', $id)
6666
->first();
6767

68+
if (!$server) {
69+
return abort(404);
70+
}
71+
6872
return view('admin.servers.view', [
6973
'server' => $server,
7074
'assigned' => Models\Allocation::select('id', 'ip', 'port')->where('assigned_to', $id)->orderBy('ip', 'asc')->orderBy('port', 'asc')->get(),
@@ -289,4 +293,23 @@ public function postUpdateServerUpdateBuild(Request $request, $id)
289293
]);
290294
}
291295

296+
public function deleteServer(Request $request, $id, $force = null)
297+
{
298+
try {
299+
$server = new ServerRepository;
300+
$server->deleteServer($id, $force);
301+
Alert::success('Server was successfully deleted from the panel and the daemon.')->flash();
302+
return redirect()->route('admin.servers');
303+
} catch (\Pterodactyl\Exceptions\DisplayException $e) {
304+
Alert::danger($e->getMessage())->flash();
305+
} catch(\Exception $e) {
306+
Log::error($e);
307+
Alert::danger('An unhandled exception occured while attemping to add this server. Please try again.')->flash();
308+
}
309+
return redirect()->route('admin.servers.view', [
310+
'id' => $id,
311+
'tab' => 'tab_delete'
312+
]);
313+
}
314+
292315
}

app/Http/Routes/AdminRoutes.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public function map(Router $router) {
3333
$router->post('/view/{id}/details', [ 'uses' => 'Admin\ServersController@postUpdateServerDetails' ]);
3434
$router->post('/view/{id}/rebuild', [ 'uses' => 'Admin\ServersController@postUpdateServerToggleBuild' ]);
3535
$router->post('/view/{id}/build', [ 'uses' => 'Admin\ServersController@postUpdateServerUpdateBuild' ]);
36+
$router->delete('/view/{id}/{force?}', [ 'uses' => 'Admin\ServersController@deleteServer' ]);
3637

3738
$router->post('/new', [ 'uses' => 'Admin\ServersController@postNewServer']);
3839
$router->post('/new/get-nodes', [ 'uses' => 'Admin\ServersController@postNewServerGetNodes' ]);

app/Repositories/ServerRepository.php

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -524,4 +524,55 @@ public function changeBuild($id, array $data)
524524

525525
}
526526

527+
public function deleteServer($id, $force)
528+
{
529+
$server = Models\Server::findOrFail($id);
530+
$node = Models\Node::findOrFail($server->node);
531+
DB::beginTransaction();
532+
533+
// Delete Allocations
534+
Models\Allocation::where('assigned_to', $server->id)->update([
535+
'assigned_to' => null
536+
]);
537+
538+
// Remove Variables
539+
Models\ServerVariables::where('server_id', $server->id)->delete();
540+
541+
// Remove SubUsers
542+
Models\Subuser::where('server_id', $server->id)->delete();
543+
544+
// Remove Permissions
545+
Models\Permission::where('server_id', $server->id)->delete();
546+
547+
// Remove Downloads
548+
Models\Download::where('server', $server->uuid)->delete();
549+
550+
try {
551+
$client = Models\Node::guzzleRequest($server->node);
552+
$client->request('DELETE', '/servers', [
553+
'headers' => [
554+
'X-Access-Token' => $node->daemonSecret,
555+
'X-Access-Server' => $server->uuid
556+
]
557+
]);
558+
559+
$server->delete();
560+
DB::commit();
561+
return true;
562+
} catch (\GuzzleHttp\Exception\TransferException $ex) {
563+
if ($force === 'force') {
564+
$server->delete();
565+
DB::commit();
566+
return true;
567+
} else {
568+
DB::rollBack();
569+
Log::error($ex);
570+
throw new DisplayException('An error occured while attempting to delete the server on the daemon: ' . $ex->getMessage());
571+
}
572+
} catch (\Exception $ex) {
573+
DB::rollBack();
574+
throw $ex;
575+
}
576+
}
577+
527578
}

resources/views/admin/servers/index.blade.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@
1010
<li><a href="/admin">Admin Control</a></li>
1111
<li class="active">Servers</li>
1212
</ul>
13+
@foreach (Alert::getMessages() as $type => $messages)
14+
@foreach ($messages as $message)
15+
<div class="alert alert-{{ $type }} alert-dismissable" role="alert">
16+
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
17+
{!! $message !!}
18+
</div>
19+
@endforeach
20+
@endforeach
1321
<h3>All Servers</h3><hr />
1422
<table class="table table-bordered table-hover">
1523
<thead>

resources/views/admin/servers/new.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@
397397
$.each(data, function (i, item) {
398398
var isRequired = (item.required === 1) ? '<code>Required</code>' : '';
399399
var dataAppend = ' \
400-
<div class="form-group col-md-6">\
400+
<div class="form-group col-md-12">\
401401
<label for="var_ref_' + item.id + '" class="control-label">' + item.name + '</label> ' + isRequired + '\
402402
<div>\
403403
<input type="text" autocomplete="off" name="env_' + item.env_variable + '" class="form-control" value="' + item.default_value + '" />\

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

Lines changed: 81 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,9 @@
3333
<li class="active"><a href="#tab_about" data-toggle="tab">About</a></li>
3434
<li><a href="#tab_details" data-toggle="tab">Details</a></li>
3535
<li><a href="#tab_build" data-toggle="tab">Build Configuration</a></li>
36-
<li><a href="#tab_startup" data-toggle="tab">Startup Settings</a></li>
36+
<li><a href="#tab_startup" data-toggle="tab">Startup</a></li>
3737
<li><a href="#tab_manage" data-toggle="tab">Manage</a></li>
38+
<li><a href="#tab_delete" data-toggle="tab">Delete</a></li>
3839
</ul>
3940
<div class="tab-content">
4041
<div class="tab-pane active" id="tab_about">
@@ -251,55 +252,80 @@
251252
<div class="panel panel-default">
252253
<div class="panel-heading"></div>
253254
<div class="panel-body">
254-
<table class="table table-striped" style="margin-bottom: 0;">
255-
<tbody>
256-
<tr>
257-
<td class="text-center" style="vertical-align:middle;">
258-
<a href="/server/{{ $server->uuidShort }}/">
259-
<button type="submit" class="btn btn-sm btn-primary">Manage Server</button>
260-
</a>
261-
</td>
262-
<td>
263-
<p>This will take you to the server management page that users normally see and allow you to manage server files as well as check the console and data usage.</p>
264-
</td>
265-
</tr>
266-
<tr>
267-
<td class="text-center" style="vertical-align:middle;">
268-
<form action="/admin/servers/view/{{ $server->id }}/installed" method="POST">
269-
{!! csrf_field() !!}
270-
<button type="submit" class="btn btn-sm btn-primary">Toggle Install Status</button>
271-
</form>
272-
</td>
273-
<td>
274-
<p>This will toggle the install status for the server.</p>
275-
<div class="alert alert-warning">If you have just created this server it is ill advised to perform this action as the daemon will contact the panel when finished which could cause the install status to be wrongly set.</div>
276-
</td>
277-
</tr>
278-
<tr>
279-
<td class="text-center" style="vertical-align:middle;">
280-
<form action="/admin/servers/view/{{ $server->id }}/rebuild" method="POST">
281-
{!! csrf_field() !!}
282-
<button type="submit" class="btn btn-sm btn-primary">Rebuild Server Container</button>
283-
</form>
284-
</td>
285-
<td>
286-
<p>This will trigger a rebuild of the server container when it next starts up. This is useful if you modified the server configuration file manually, or something just didn't work out correctly. Please be aware: if you manually updated the server's configuration file, you will need to restart the daemon before doing this, or it will be overwritten.</p>
287-
<div class="alert alert-info">A rebuild will automatically occur whenever you edit build configuration settings for the server.</div>
288-
</td>
289-
</tr>
290-
<tr>
291-
<td class="text-center" style="vertical-align:middle;">
292-
<form action="/admin/servers/view/{{ $server->id }}/delete" method="POST">
293-
{!! csrf_field() !!}
294-
<button type="submit" class="btn btn-sm btn-danger">Delete Server</button>
295-
</form>
296-
</td>
297-
<td>
298-
<div class="alert alert-danger" style="margin-top:21px;">Deleting a server is an irreversible action. <strong>All data will be immediately removed relating to this server.</strong></div>
299-
</td>
300-
</tr>
301-
</tbody>
302-
</table>
255+
<div class="row">
256+
<div class="col-md-4 text-center">
257+
<a href="/server/{{ $server->uuidShort }}/" target="_blank">
258+
<button type="submit" class="btn btn-sm btn-primary">Manage Server</button>
259+
</a>
260+
</div>
261+
<div class="col-md-8">
262+
<p>This will take you to the server management page that users normally see and allow you to manage server files as well as check the console and data usage.</p>
263+
</div>
264+
</div>
265+
</div>
266+
<div class="panel-heading" style="border-top: 1px solid #ddd;"></div>
267+
<div class="panel-body">
268+
<div class="row">
269+
<div class="col-md-4 text-center">
270+
<form action="/admin/servers/view/{{ $server->id }}/installed" method="POST">
271+
{!! csrf_field() !!}
272+
<button type="submit" class="btn btn-sm btn-primary">Toggle Install Status</button>
273+
</form>
274+
</div>
275+
<div class="col-md-8">
276+
<p>This will toggle the install status for the server.</p>
277+
<div class="alert alert-warning">If you have just created this server it is ill advised to perform this action as the daemon will contact the panel when finished which could cause the install status to be wrongly set.</div>
278+
</div>
279+
</div>
280+
</div>
281+
<div class="panel-heading" style="border-top: 1px solid #ddd;"></div>
282+
<div class="panel-body">
283+
<div class="row">
284+
<div class="col-md-4 text-center">
285+
<form action="/admin/servers/view/{{ $server->id }}/rebuild" method="POST">
286+
{!! csrf_field() !!}
287+
<button type="submit" class="btn btn-sm btn-primary">Rebuild Server Container</button>
288+
</form>
289+
</div>
290+
<div class="col-md-8">
291+
<p>This will trigger a rebuild of the server container when it next starts up. This is useful if you modified the server configuration file manually, or something just didn't work out correctly. Please be aware: if you manually updated the server's configuration file, you will need to restart the daemon before doing this, or it will be overwritten.</p>
292+
<div class="alert alert-info">A rebuild will automatically occur whenever you edit build configuration settings for the server.</div>
293+
</div>
294+
</div>
295+
</div>
296+
</div>
297+
</div>
298+
<div class="tab-pane" id="tab_delete">
299+
<div class="panel panel-default">
300+
<div class="panel-heading"></div>
301+
<div class="panel-body">
302+
<div class="row">
303+
<div class="col-md-4 text-center">
304+
<form action="/admin/servers/view/{{ $server->id }}" method="POST" data-attr="deleteServer">
305+
{!! csrf_field() !!}
306+
{!! method_field('DELETE') !!}
307+
<button type="submit" class="btn btn-sm btn-danger">Delete Server</button>
308+
</form>
309+
</div>
310+
<div class="col-md-8">
311+
<div class="alert alert-danger">Deleting a server is an irreversible action. <strong>All data will be immediately removed relating to this server.</strong></div>
312+
</div>
313+
</div>
314+
</div>
315+
<div class="panel-heading" style="border-top: 1px solid #ddd;"></div>
316+
<div class="panel-body">
317+
<div class="row">
318+
<div class="col-md-4 text-center">
319+
<form action="/admin/servers/view/{{ $server->id }}/force" method="POST" data-attr="deleteServer">
320+
{!! csrf_field() !!}
321+
{!! method_field('DELETE') !!}
322+
<button type="submit" class="btn btn-sm btn-danger">Force Delete Server</button>
323+
</form>
324+
</div>
325+
<div class="col-md-8">
326+
<div class="alert alert-danger">This is the same as deleting a server, however, if an error is returned by the daemon it is ignored and the server is still removed from the panel.</strong></div>
327+
</div>
328+
</div>
303329
</div>
304330
</div>
305331
</div>
@@ -312,6 +338,11 @@
312338
$('select[name="remove_additional[]"]').find('option:disabled').prop('disabled', false);
313339
$('select[name="remove_additional[]"]').find('option[value="' + $(this).val() + '"]').prop('disabled', true).prop('selected', false);
314340
});
341+
$('form[data-attr="deleteServer"]').submit(function (event) {
342+
if (confirm('Are you sure that you want to delete this server? There is no going back, all data will immediately be removed.')) {
343+
event.submit();
344+
}
345+
});
315346
});
316347
</script>
317348
@endsection

resources/views/server/index.blade.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,6 @@
317317
318318
// New Console Data Recieved
319319
socket.on('console', function (data) {
320-
console.log(JSON.stringify(data));
321320
$('#live_console').val($('#live_console').val() + data.line);
322321
$('#live_console').scrollTop($('#live_console')[0].scrollHeight);
323322
});
@@ -445,7 +444,8 @@ function updateServerPowerControls (data) {
445444
446445
// Reset Console Data
447446
if (data === 2) {
448-
$("#live_console").val('');
447+
$('#live_console').val($('#live_console').val() + '\n --+ Server Detected as Booting + --\n');
448+
$('#live_console').scrollTop($('#live_console')[0].scrollHeight);
449449
}
450450
451451
// Server is On or Starting

0 commit comments

Comments
 (0)