mirror of
https://github.com/pyrohost/pyrodactyl.git
synced 2026-04-06 04:01:58 +02:00
feat: add test database button for admin panel
This commit is contained in:
@@ -9,6 +9,12 @@ use Illuminate\Http\RedirectResponse;
|
||||
use Prologue\Alerts\AlertsMessageBag;
|
||||
use Illuminate\View\Factory as ViewFactory;
|
||||
use Pterodactyl\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
use PDO;
|
||||
use PDOException;
|
||||
use Pterodactyl\Services\Databases\Hosts\HostUpdateService;
|
||||
use Pterodactyl\Http\Requests\Admin\DatabaseHostFormRequest;
|
||||
use Pterodactyl\Services\Databases\Hosts\HostCreationService;
|
||||
@@ -31,8 +37,7 @@ class DatabaseController extends Controller
|
||||
private HostUpdateService $updateService,
|
||||
private LocationRepositoryInterface $locationRepository,
|
||||
private ViewFactory $view,
|
||||
) {
|
||||
}
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Display database host index.
|
||||
@@ -126,4 +131,70 @@ class DatabaseController extends Controller
|
||||
|
||||
return redirect()->route('admin.databases');
|
||||
}
|
||||
|
||||
/**
|
||||
* Test database connection credentials.
|
||||
*
|
||||
* @throws \Illuminate\Validation\ValidationException
|
||||
*/
|
||||
public function testConnection(Request $request): JsonResponse
|
||||
{
|
||||
$this->validate($request, [
|
||||
'host' => 'required|string',
|
||||
'port' => 'required|integer|min:1|max:65535',
|
||||
'username' => 'required|string',
|
||||
'password' => 'required|string',
|
||||
]);
|
||||
Log::error("TestConnection", [
|
||||
"\nhost" => $request->host,
|
||||
"\nport" => $request->port,
|
||||
"\nusername" => $request->username,
|
||||
"\npassword" => $request->password
|
||||
]);
|
||||
|
||||
try {
|
||||
$dsn = "mysql:host={$request->input('host')};port={$request->input('port')};charset=utf8";
|
||||
|
||||
$pdo = new PDO($dsn, $request->input('username'), $request->input('password'), [
|
||||
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
||||
PDO::ATTR_TIMEOUT => 5, // 5 second timeout
|
||||
]);
|
||||
|
||||
// Test basic query
|
||||
$version = $pdo->query('SELECT VERSION() as version')->fetchColumn();
|
||||
|
||||
// Test GRANT permissions (this is what Pterodactyl needs)
|
||||
$grants = $pdo->query('SHOW GRANTS FOR CURRENT_USER()')->fetchAll(PDO::FETCH_COLUMN);
|
||||
|
||||
$hasGrantOption = false;
|
||||
foreach ($grants as $grant) {
|
||||
if (stripos($grant, 'GRANT OPTION') !== false) {
|
||||
$hasGrantOption = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$message = "Successfully connected to MySQL server (Version: {$version}).";
|
||||
if (!$hasGrantOption) {
|
||||
$message .= " Warning: The user appears to lack GRANT OPTION permission which is required for creating databases and users.";
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => $message,
|
||||
'version' => $version,
|
||||
'has_grant_option' => $hasGrantOption
|
||||
]);
|
||||
} catch (PDOException $e) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Connection failed: ' . $e->getMessage()
|
||||
], 422);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Error: ' . $e->getMessage()
|
||||
], 422);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,36 +57,39 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal fade" id="newHostModal" tabindex="-1" role="dialog">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<form action="{{ route('admin.databases') }}" method="POST">
|
||||
<form action="{{ route('admin.databases') }}" method="POST" id="databaseHostForm">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<h4 class="modal-title">Create New Database Host</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div id="testResult" style="display: none;"></div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="pName" class="form-label">Name</label>
|
||||
<input type="text" name="name" id="pName" class="form-control" />
|
||||
<input type="text" name="name" id="pName" class="form-control" value="{{ old('name') }}" />
|
||||
<p class="text-muted small">A short identifier used to distinguish this location from others. Must be between 1 and 60 characters, for example, <code>us.nyc.lvl3</code>.</p>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<label for="pHost" class="form-label">Host</label>
|
||||
<input type="text" name="host" id="pHost" class="form-control" />
|
||||
<input type="text" name="host" id="pHost" class="form-control" value="{{ old('host') }}" />
|
||||
<p class="text-muted small">The IP address or FQDN that should be used when attempting to connect to this MySQL host <em>from the panel</em> to add new databases.</p>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label for="pPort" class="form-label">Port</label>
|
||||
<input type="text" name="port" id="pPort" class="form-control" value="3306"/>
|
||||
<input type="text" name="port" id="pPort" class="form-control" value="{{ old('port', '3306') }}"/>
|
||||
<p class="text-muted small">The port that MySQL is running on for this host.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<label for="pUsername" class="form-label">Username</label>
|
||||
<input type="text" name="username" id="pUsername" class="form-control" />
|
||||
<input type="text" name="username" id="pUsername" class="form-control" value="{{ old('username') }}" />
|
||||
<p class="text-muted small">The username of an account that has enough permissions to create new users and databases on the system.</p>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
@@ -102,7 +105,7 @@
|
||||
@foreach($locations as $location)
|
||||
<optgroup label="{{ $location->short }}">
|
||||
@foreach($location->nodes as $node)
|
||||
<option value="{{ $node->id }}">{{ $node->name }}</option>
|
||||
<option value="{{ $node->id }}" {{ old('node_id') == $node->id ? 'selected' : '' }}>{{ $node->name }}</option>
|
||||
@endforeach
|
||||
</optgroup>
|
||||
@endforeach
|
||||
@@ -114,6 +117,7 @@
|
||||
<p class="text-danger small text-left">The account defined for this database host <strong>must</strong> have the <code>WITH GRANT OPTION</code> permission. If the defined account does not have this permission requests to create databases <em>will</em> fail. <strong>Do not use the same account details for MySQL that you have defined for this panel.</strong></p>
|
||||
{!! csrf_field() !!}
|
||||
<button type="button" class="btn btn-default btn-sm pull-left" data-dismiss="modal">Cancel</button>
|
||||
<button type="button" id="testDatabaseBtn" class="btn btn-primary btn-sm">Test Database</button>
|
||||
<button type="submit" class="btn btn-success btn-sm">Create</button>
|
||||
</div>
|
||||
</form>
|
||||
@@ -126,5 +130,70 @@
|
||||
@parent
|
||||
<script>
|
||||
$('#pNodeId').select2();
|
||||
|
||||
// Test database connection
|
||||
$('#testDatabaseBtn').on('click', function() {
|
||||
const button = $(this);
|
||||
const originalText = button.text();
|
||||
const resultDiv = $('#testResult');
|
||||
|
||||
// Show loading state
|
||||
button.prop('disabled', true).text('Testing...');
|
||||
resultDiv.hide().removeClass('alert alert-danger alert-success').html('');
|
||||
|
||||
// Get form data
|
||||
const formData = {
|
||||
host: $('#pHost').val(),
|
||||
port: $('#pPort').val(),
|
||||
username: $('#pUsername').val(),
|
||||
password: $('#pPassword').val(),
|
||||
_token: '{{ csrf_token() }}'
|
||||
};
|
||||
|
||||
// Validate required fields
|
||||
if (!formData.host || !formData.port || !formData.username || !formData.password) {
|
||||
resultDiv.html('<strong>Error:</strong> Please fill in all required database connection fields.').addClass('alert alert-danger').show();
|
||||
button.prop('disabled', false).text(originalText);
|
||||
return;
|
||||
}
|
||||
|
||||
// Simple AJAX request
|
||||
$.ajax({
|
||||
url: '{{ route('admin.databases.test') }}',
|
||||
method: 'POST',
|
||||
data: formData,
|
||||
success: function(response) {
|
||||
if (response.success) {
|
||||
resultDiv.html('<strong>Success:</strong> ' + response.message).addClass('alert alert-success').show();
|
||||
} else {
|
||||
resultDiv.html('<strong>Error:</strong> ' + response.message).addClass('alert alert-danger').show();
|
||||
}
|
||||
},
|
||||
error: function(xhr) {
|
||||
let message = 'An unexpected error occurred.';
|
||||
if (xhr.responseJSON && xhr.responseJSON.message) {
|
||||
message = xhr.responseJSON.message;
|
||||
} else if (xhr.statusText) {
|
||||
message = xhr.statusText;
|
||||
}
|
||||
resultDiv.html('<strong>Error:</strong> ' + message).addClass('alert alert-danger').show();
|
||||
},
|
||||
complete: function() {
|
||||
button.prop('disabled', false).text(originalText);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Clear test results when modal is opened
|
||||
$('#newHostModal').on('show.bs.modal', function() {
|
||||
$('#testResult').hide().empty();
|
||||
});
|
||||
|
||||
// Re-open modal if there are old inputs (form was submitted but had errors)
|
||||
@if($errors->any())
|
||||
$(document).ready(function() {
|
||||
$('#newHostModal').modal('show');
|
||||
});
|
||||
@endif
|
||||
</script>
|
||||
@endsection
|
||||
|
||||
225
routes/admin.php
225
routes/admin.php
@@ -15,12 +15,12 @@ Route::get('/', [Admin\BaseController::class, 'index'])->name('admin.index');
|
||||
|
|
||||
*/
|
||||
Route::group(['prefix' => 'api'], function () {
|
||||
Route::get('/', [Admin\ApiController::class, 'index'])->name('admin.api.index');
|
||||
Route::get('/new', [Admin\ApiController::class, 'create'])->name('admin.api.new');
|
||||
Route::get('/', [Admin\ApiController::class, 'index'])->name('admin.api.index');
|
||||
Route::get('/new', [Admin\ApiController::class, 'create'])->name('admin.api.new');
|
||||
|
||||
Route::post('/new', [Admin\ApiController::class, 'store']);
|
||||
Route::post('/new', [Admin\ApiController::class, 'store']);
|
||||
|
||||
Route::delete('/revoke/{identifier}', [Admin\ApiController::class, 'delete'])->name('admin.api.delete');
|
||||
Route::delete('/revoke/{identifier}', [Admin\ApiController::class, 'delete'])->name('admin.api.delete');
|
||||
});
|
||||
|
||||
/*
|
||||
@@ -32,11 +32,11 @@ Route::group(['prefix' => 'api'], function () {
|
||||
|
|
||||
*/
|
||||
Route::group(['prefix' => 'locations'], function () {
|
||||
Route::get('/', [Admin\LocationController::class, 'index'])->name('admin.locations');
|
||||
Route::get('/view/{location:id}', [Admin\LocationController::class, 'view'])->name('admin.locations.view');
|
||||
Route::get('/', [Admin\LocationController::class, 'index'])->name('admin.locations');
|
||||
Route::get('/view/{location:id}', [Admin\LocationController::class, 'view'])->name('admin.locations.view');
|
||||
|
||||
Route::post('/', [Admin\LocationController::class, 'create']);
|
||||
Route::patch('/view/{location:id}', [Admin\LocationController::class, 'update']);
|
||||
Route::post('/', [Admin\LocationController::class, 'create']);
|
||||
Route::patch('/view/{location:id}', [Admin\LocationController::class, 'update']);
|
||||
});
|
||||
|
||||
/*
|
||||
@@ -48,12 +48,13 @@ Route::group(['prefix' => 'locations'], function () {
|
||||
|
|
||||
*/
|
||||
Route::group(['prefix' => 'databases'], function () {
|
||||
Route::get('/', [Admin\DatabaseController::class, 'index'])->name('admin.databases');
|
||||
Route::get('/view/{host:id}', [Admin\DatabaseController::class, 'view'])->name('admin.databases.view');
|
||||
Route::get('/', [Admin\DatabaseController::class, 'index'])->name('admin.databases');
|
||||
Route::get('/view/{host:id}', [Admin\DatabaseController::class, 'view'])->name('admin.databases.view');
|
||||
|
||||
Route::post('/', [Admin\DatabaseController::class, 'create']);
|
||||
Route::patch('/view/{host:id}', [Admin\DatabaseController::class, 'update']);
|
||||
Route::delete('/view/{host:id}', [Admin\DatabaseController::class, 'delete']);
|
||||
Route::post('/', [Admin\DatabaseController::class, 'create']);
|
||||
Route::post('/test', [Admin\DatabaseController::class, 'testConnection'])->name('admin.databases.test');
|
||||
Route::patch('/view/{host:id}', [Admin\DatabaseController::class, 'update']);
|
||||
Route::delete('/view/{host:id}', [Admin\DatabaseController::class, 'delete']);
|
||||
});
|
||||
|
||||
/*
|
||||
@@ -65,30 +66,30 @@ Route::group(['prefix' => 'databases'], function () {
|
||||
|
|
||||
*/
|
||||
Route::group(['prefix' => 'settings'], function () {
|
||||
Route::get('/', [Admin\Settings\IndexController::class, 'index'])->name('admin.settings');
|
||||
Route::get('/mail', [Admin\Settings\MailController::class, 'index'])->name('admin.settings.mail');
|
||||
Route::get('/advanced', [Admin\Settings\AdvancedController::class, 'index'])->name('admin.settings.advanced');
|
||||
Route::get('/captcha', [Admin\Settings\CaptchaController::class, 'index'])->name('admin.settings.captcha');
|
||||
Route::get('/', [Admin\Settings\IndexController::class, 'index'])->name('admin.settings');
|
||||
Route::get('/mail', [Admin\Settings\MailController::class, 'index'])->name('admin.settings.mail');
|
||||
Route::get('/advanced', [Admin\Settings\AdvancedController::class, 'index'])->name('admin.settings.advanced');
|
||||
Route::get('/captcha', [Admin\Settings\CaptchaController::class, 'index'])->name('admin.settings.captcha');
|
||||
|
||||
Route::group(['prefix' => 'domains'], function () {
|
||||
Route::get('/', [Admin\Settings\DomainsController::class, 'index'])->name('admin.settings.domains.index');
|
||||
Route::get('/create', [Admin\Settings\DomainsController::class, 'create'])->name('admin.settings.domains.create');
|
||||
Route::get('/{domain}/edit', [Admin\Settings\DomainsController::class, 'edit'])->name('admin.settings.domains.edit');
|
||||
Route::group(['prefix' => 'domains'], function () {
|
||||
Route::get('/', [Admin\Settings\DomainsController::class, 'index'])->name('admin.settings.domains.index');
|
||||
Route::get('/create', [Admin\Settings\DomainsController::class, 'create'])->name('admin.settings.domains.create');
|
||||
Route::get('/{domain}/edit', [Admin\Settings\DomainsController::class, 'edit'])->name('admin.settings.domains.edit');
|
||||
|
||||
Route::post('/', [Admin\Settings\DomainsController::class, 'store'])->name('admin.settings.domains.store');
|
||||
Route::patch('/{domain}', [Admin\Settings\DomainsController::class, 'update'])->name('admin.settings.domains.update');
|
||||
Route::delete('/{domain}', [Admin\Settings\DomainsController::class, 'destroy'])->name('admin.settings.domains.destroy');
|
||||
Route::post('/', [Admin\Settings\DomainsController::class, 'store'])->name('admin.settings.domains.store');
|
||||
Route::patch('/{domain}', [Admin\Settings\DomainsController::class, 'update'])->name('admin.settings.domains.update');
|
||||
Route::delete('/{domain}', [Admin\Settings\DomainsController::class, 'destroy'])->name('admin.settings.domains.destroy');
|
||||
|
||||
Route::post('/test-connection', [Admin\Settings\DomainsController::class, 'testConnection'])->name('admin.settings.domains.test-connection');
|
||||
Route::get('/provider-schema/{provider}', [Admin\Settings\DomainsController::class, 'getProviderSchema'])->name('admin.settings.domains.provider-schema');
|
||||
});
|
||||
Route::post('/test-connection', [Admin\Settings\DomainsController::class, 'testConnection'])->name('admin.settings.domains.test-connection');
|
||||
Route::get('/provider-schema/{provider}', [Admin\Settings\DomainsController::class, 'getProviderSchema'])->name('admin.settings.domains.provider-schema');
|
||||
});
|
||||
|
||||
Route::post('/mail/test', [Admin\Settings\MailController::class, 'test'])->name('admin.settings.mail.test');
|
||||
Route::post('/mail/test', [Admin\Settings\MailController::class, 'test'])->name('admin.settings.mail.test');
|
||||
|
||||
Route::patch('/', [Admin\Settings\IndexController::class, 'update']);
|
||||
Route::patch('/mail', [Admin\Settings\MailController::class, 'update']);
|
||||
Route::patch('/advanced', [Admin\Settings\AdvancedController::class, 'update']);
|
||||
Route::patch('/captcha', [Admin\Settings\CaptchaController::class, 'update']);
|
||||
Route::patch('/', [Admin\Settings\IndexController::class, 'update']);
|
||||
Route::patch('/mail', [Admin\Settings\MailController::class, 'update']);
|
||||
Route::patch('/advanced', [Admin\Settings\AdvancedController::class, 'update']);
|
||||
Route::patch('/captcha', [Admin\Settings\CaptchaController::class, 'update']);
|
||||
});
|
||||
|
||||
/*
|
||||
@@ -100,15 +101,15 @@ Route::group(['prefix' => 'settings'], function () {
|
||||
|
|
||||
*/
|
||||
Route::group(['prefix' => 'users'], function () {
|
||||
Route::get('/', [Admin\UserController::class, 'index'])->name('admin.users');
|
||||
Route::get('/accounts.json', [Admin\UserController::class, 'json'])->name('admin.users.json');
|
||||
Route::get('/new', [Admin\UserController::class, 'create'])->name('admin.users.new');
|
||||
Route::get('/view/{user:id}', [Admin\UserController::class, 'view'])->name('admin.users.view');
|
||||
Route::get('/', [Admin\UserController::class, 'index'])->name('admin.users');
|
||||
Route::get('/accounts.json', [Admin\UserController::class, 'json'])->name('admin.users.json');
|
||||
Route::get('/new', [Admin\UserController::class, 'create'])->name('admin.users.new');
|
||||
Route::get('/view/{user:id}', [Admin\UserController::class, 'view'])->name('admin.users.view');
|
||||
|
||||
Route::post('/new', [Admin\UserController::class, 'store']);
|
||||
Route::post('/new', [Admin\UserController::class, 'store']);
|
||||
|
||||
Route::patch('/view/{user:id}', [Admin\UserController::class, 'update']);
|
||||
Route::delete('/view/{user:id}', [Admin\UserController::class, 'delete']);
|
||||
Route::patch('/view/{user:id}', [Admin\UserController::class, 'update']);
|
||||
Route::delete('/view/{user:id}', [Admin\UserController::class, 'delete']);
|
||||
});
|
||||
|
||||
/*
|
||||
@@ -120,38 +121,38 @@ Route::group(['prefix' => 'users'], function () {
|
||||
|
|
||||
*/
|
||||
Route::group(['prefix' => 'servers'], function () {
|
||||
Route::get('/', [Admin\Servers\ServerController::class, 'index'])->name('admin.servers');
|
||||
Route::get('/new', [Admin\Servers\CreateServerController::class, 'index'])->name('admin.servers.new');
|
||||
Route::get('/view/{server:id}', [Admin\Servers\ServerViewController::class, 'index'])->name('admin.servers.view');
|
||||
Route::get('/', [Admin\Servers\ServerController::class, 'index'])->name('admin.servers');
|
||||
Route::get('/new', [Admin\Servers\CreateServerController::class, 'index'])->name('admin.servers.new');
|
||||
Route::get('/view/{server:id}', [Admin\Servers\ServerViewController::class, 'index'])->name('admin.servers.view');
|
||||
|
||||
Route::group(['middleware' => [ServerInstalled::class]], function () {
|
||||
Route::get('/view/{server:id}/details', [Admin\Servers\ServerViewController::class, 'details'])->name('admin.servers.view.details');
|
||||
Route::get('/view/{server:id}/build', [Admin\Servers\ServerViewController::class, 'build'])->name('admin.servers.view.build');
|
||||
Route::get('/view/{server:id}/startup', [Admin\Servers\ServerViewController::class, 'startup'])->name('admin.servers.view.startup');
|
||||
Route::get('/view/{server:id}/database', [Admin\Servers\ServerViewController::class, 'database'])->name('admin.servers.view.database');
|
||||
Route::get('/view/{server:id}/mounts', [Admin\Servers\ServerViewController::class, 'mounts'])->name('admin.servers.view.mounts');
|
||||
});
|
||||
Route::group(['middleware' => [ServerInstalled::class]], function () {
|
||||
Route::get('/view/{server:id}/details', [Admin\Servers\ServerViewController::class, 'details'])->name('admin.servers.view.details');
|
||||
Route::get('/view/{server:id}/build', [Admin\Servers\ServerViewController::class, 'build'])->name('admin.servers.view.build');
|
||||
Route::get('/view/{server:id}/startup', [Admin\Servers\ServerViewController::class, 'startup'])->name('admin.servers.view.startup');
|
||||
Route::get('/view/{server:id}/database', [Admin\Servers\ServerViewController::class, 'database'])->name('admin.servers.view.database');
|
||||
Route::get('/view/{server:id}/mounts', [Admin\Servers\ServerViewController::class, 'mounts'])->name('admin.servers.view.mounts');
|
||||
});
|
||||
|
||||
Route::get('/view/{server:id}/manage', [Admin\Servers\ServerViewController::class, 'manage'])->name('admin.servers.view.manage');
|
||||
Route::get('/view/{server:id}/delete', [Admin\Servers\ServerViewController::class, 'delete'])->name('admin.servers.view.delete');
|
||||
Route::get('/view/{server:id}/manage', [Admin\Servers\ServerViewController::class, 'manage'])->name('admin.servers.view.manage');
|
||||
Route::get('/view/{server:id}/delete', [Admin\Servers\ServerViewController::class, 'delete'])->name('admin.servers.view.delete');
|
||||
|
||||
Route::post('/new', [Admin\Servers\CreateServerController::class, 'store']);
|
||||
Route::post('/view/{server:id}/build', [Admin\ServersController::class, 'updateBuild']);
|
||||
Route::post('/view/{server:id}/startup', [Admin\ServersController::class, 'saveStartup']);
|
||||
Route::post('/view/{server:id}/database', [Admin\ServersController::class, 'newDatabase']);
|
||||
Route::post('/view/{server:id}/mounts', [Admin\ServersController::class, 'addMount'])->name('admin.servers.view.mounts.store');
|
||||
Route::post('/view/{server:id}/manage/toggle', [Admin\ServersController::class, 'toggleInstall'])->name('admin.servers.view.manage.toggle');
|
||||
Route::post('/view/{server:id}/manage/suspension', [Admin\ServersController::class, 'manageSuspension'])->name('admin.servers.view.manage.suspension');
|
||||
Route::post('/view/{server:id}/manage/reinstall', [Admin\ServersController::class, 'reinstallServer'])->name('admin.servers.view.manage.reinstall');
|
||||
Route::post('/view/{server:id}/manage/transfer', [Admin\Servers\ServerTransferController::class, 'transfer'])->name('admin.servers.view.manage.transfer');
|
||||
Route::post('/view/{server:id}/delete', [Admin\ServersController::class, 'delete']);
|
||||
Route::post('/new', [Admin\Servers\CreateServerController::class, 'store']);
|
||||
Route::post('/view/{server:id}/build', [Admin\ServersController::class, 'updateBuild']);
|
||||
Route::post('/view/{server:id}/startup', [Admin\ServersController::class, 'saveStartup']);
|
||||
Route::post('/view/{server:id}/database', [Admin\ServersController::class, 'newDatabase']);
|
||||
Route::post('/view/{server:id}/mounts', [Admin\ServersController::class, 'addMount'])->name('admin.servers.view.mounts.store');
|
||||
Route::post('/view/{server:id}/manage/toggle', [Admin\ServersController::class, 'toggleInstall'])->name('admin.servers.view.manage.toggle');
|
||||
Route::post('/view/{server:id}/manage/suspension', [Admin\ServersController::class, 'manageSuspension'])->name('admin.servers.view.manage.suspension');
|
||||
Route::post('/view/{server:id}/manage/reinstall', [Admin\ServersController::class, 'reinstallServer'])->name('admin.servers.view.manage.reinstall');
|
||||
Route::post('/view/{server:id}/manage/transfer', [Admin\Servers\ServerTransferController::class, 'transfer'])->name('admin.servers.view.manage.transfer');
|
||||
Route::post('/view/{server:id}/delete', [Admin\ServersController::class, 'delete']);
|
||||
|
||||
Route::patch('/view/{server:id}/details', [Admin\ServersController::class, 'setDetails']);
|
||||
Route::patch('/view/{server:id}/database', [Admin\ServersController::class, 'resetDatabasePassword']);
|
||||
Route::patch('/view/{server:id}/details', [Admin\ServersController::class, 'setDetails']);
|
||||
Route::patch('/view/{server:id}/database', [Admin\ServersController::class, 'resetDatabasePassword']);
|
||||
|
||||
Route::delete('/view/{server:id}/database/{database:id}/delete', [Admin\ServersController::class, 'deleteDatabase'])->name('admin.servers.view.database.delete');
|
||||
Route::delete('/view/{server:id}/mounts/{mount:id}', [Admin\ServersController::class, 'deleteMount'])
|
||||
->name('admin.servers.view.mounts.delete');
|
||||
Route::delete('/view/{server:id}/database/{database:id}/delete', [Admin\ServersController::class, 'deleteDatabase'])->name('admin.servers.view.database.delete');
|
||||
Route::delete('/view/{server:id}/mounts/{mount:id}', [Admin\ServersController::class, 'deleteMount'])
|
||||
->name('admin.servers.view.mounts.delete');
|
||||
});
|
||||
|
||||
/*
|
||||
@@ -163,26 +164,26 @@ Route::group(['prefix' => 'servers'], function () {
|
||||
|
|
||||
*/
|
||||
Route::group(['prefix' => 'nodes'], function () {
|
||||
Route::get('/', [Admin\Nodes\NodeController::class, 'index'])->name('admin.nodes');
|
||||
Route::get('/new', [Admin\NodesController::class, 'create'])->name('admin.nodes.new');
|
||||
Route::get('/view/{node:id}', [Admin\Nodes\NodeViewController::class, 'index'])->name('admin.nodes.view');
|
||||
Route::get('/view/{node:id}/settings', [Admin\Nodes\NodeViewController::class, 'settings'])->name('admin.nodes.view.settings');
|
||||
Route::get('/view/{node:id}/configuration', [Admin\Nodes\NodeViewController::class, 'configuration'])->name('admin.nodes.view.configuration');
|
||||
Route::get('/view/{node:id}/allocation', [Admin\Nodes\NodeViewController::class, 'allocations'])->name('admin.nodes.view.allocation');
|
||||
Route::get('/view/{node:id}/servers', [Admin\Nodes\NodeViewController::class, 'servers'])->name('admin.nodes.view.servers');
|
||||
Route::get('/view/{node:id}/system-information', Admin\Nodes\SystemInformationController::class);
|
||||
Route::get('/', [Admin\Nodes\NodeController::class, 'index'])->name('admin.nodes');
|
||||
Route::get('/new', [Admin\NodesController::class, 'create'])->name('admin.nodes.new');
|
||||
Route::get('/view/{node:id}', [Admin\Nodes\NodeViewController::class, 'index'])->name('admin.nodes.view');
|
||||
Route::get('/view/{node:id}/settings', [Admin\Nodes\NodeViewController::class, 'settings'])->name('admin.nodes.view.settings');
|
||||
Route::get('/view/{node:id}/configuration', [Admin\Nodes\NodeViewController::class, 'configuration'])->name('admin.nodes.view.configuration');
|
||||
Route::get('/view/{node:id}/allocation', [Admin\Nodes\NodeViewController::class, 'allocations'])->name('admin.nodes.view.allocation');
|
||||
Route::get('/view/{node:id}/servers', [Admin\Nodes\NodeViewController::class, 'servers'])->name('admin.nodes.view.servers');
|
||||
Route::get('/view/{node:id}/system-information', Admin\Nodes\SystemInformationController::class);
|
||||
|
||||
Route::post('/new', [Admin\NodesController::class, 'store']);
|
||||
Route::post('/view/{node:id}/allocation', [Admin\NodesController::class, 'createAllocation']);
|
||||
Route::post('/view/{node:id}/allocation/remove', [Admin\NodesController::class, 'allocationRemoveBlock'])->name('admin.nodes.view.allocation.removeBlock');
|
||||
Route::post('/view/{node:id}/allocation/alias', [Admin\NodesController::class, 'allocationSetAlias'])->name('admin.nodes.view.allocation.setAlias');
|
||||
Route::post('/view/{node:id}/settings/token', Admin\NodeAutoDeployController::class)->name('admin.nodes.view.configuration.token');
|
||||
Route::post('/new', [Admin\NodesController::class, 'store']);
|
||||
Route::post('/view/{node:id}/allocation', [Admin\NodesController::class, 'createAllocation']);
|
||||
Route::post('/view/{node:id}/allocation/remove', [Admin\NodesController::class, 'allocationRemoveBlock'])->name('admin.nodes.view.allocation.removeBlock');
|
||||
Route::post('/view/{node:id}/allocation/alias', [Admin\NodesController::class, 'allocationSetAlias'])->name('admin.nodes.view.allocation.setAlias');
|
||||
Route::post('/view/{node:id}/settings/token', Admin\NodeAutoDeployController::class)->name('admin.nodes.view.configuration.token');
|
||||
|
||||
Route::patch('/view/{node:id}/settings', [Admin\NodesController::class, 'updateSettings']);
|
||||
Route::patch('/view/{node:id}/settings', [Admin\NodesController::class, 'updateSettings']);
|
||||
|
||||
Route::delete('/view/{node:id}/delete', [Admin\NodesController::class, 'delete'])->name('admin.nodes.view.delete');
|
||||
Route::delete('/view/{node:id}/allocation/remove/{allocation:id}', [Admin\NodesController::class, 'allocationRemoveSingle'])->name('admin.nodes.view.allocation.removeSingle');
|
||||
Route::delete('/view/{node:id}/allocations', [Admin\NodesController::class, 'allocationRemoveMultiple'])->name('admin.nodes.view.allocation.removeMultiple');
|
||||
Route::delete('/view/{node:id}/delete', [Admin\NodesController::class, 'delete'])->name('admin.nodes.view.delete');
|
||||
Route::delete('/view/{node:id}/allocation/remove/{allocation:id}', [Admin\NodesController::class, 'allocationRemoveSingle'])->name('admin.nodes.view.allocation.removeSingle');
|
||||
Route::delete('/view/{node:id}/allocations', [Admin\NodesController::class, 'allocationRemoveMultiple'])->name('admin.nodes.view.allocation.removeMultiple');
|
||||
});
|
||||
|
||||
/*
|
||||
@@ -194,17 +195,17 @@ Route::group(['prefix' => 'nodes'], function () {
|
||||
|
|
||||
*/
|
||||
Route::group(['prefix' => 'mounts'], function () {
|
||||
Route::get('/', [Admin\MountController::class, 'index'])->name('admin.mounts');
|
||||
Route::get('/view/{mount:id}', [Admin\MountController::class, 'view'])->name('admin.mounts.view');
|
||||
Route::get('/', [Admin\MountController::class, 'index'])->name('admin.mounts');
|
||||
Route::get('/view/{mount:id}', [Admin\MountController::class, 'view'])->name('admin.mounts.view');
|
||||
|
||||
Route::post('/', [Admin\MountController::class, 'create']);
|
||||
Route::post('/{mount:id}/eggs', [Admin\MountController::class, 'addEggs'])->name('admin.mounts.eggs');
|
||||
Route::post('/{mount:id}/nodes', [Admin\MountController::class, 'addNodes'])->name('admin.mounts.nodes');
|
||||
Route::post('/', [Admin\MountController::class, 'create']);
|
||||
Route::post('/{mount:id}/eggs', [Admin\MountController::class, 'addEggs'])->name('admin.mounts.eggs');
|
||||
Route::post('/{mount:id}/nodes', [Admin\MountController::class, 'addNodes'])->name('admin.mounts.nodes');
|
||||
|
||||
Route::patch('/view/{mount:id}', [Admin\MountController::class, 'update']);
|
||||
Route::patch('/view/{mount:id}', [Admin\MountController::class, 'update']);
|
||||
|
||||
Route::delete('/{mount:id}/eggs/{egg_id}', [Admin\MountController::class, 'deleteEgg']);
|
||||
Route::delete('/{mount:id}/nodes/{node_id}', [Admin\MountController::class, 'deleteNode']);
|
||||
Route::delete('/{mount:id}/eggs/{egg_id}', [Admin\MountController::class, 'deleteEgg']);
|
||||
Route::delete('/{mount:id}/nodes/{node_id}', [Admin\MountController::class, 'deleteNode']);
|
||||
});
|
||||
|
||||
/*
|
||||
@@ -216,29 +217,29 @@ Route::group(['prefix' => 'mounts'], function () {
|
||||
|
|
||||
*/
|
||||
Route::group(['prefix' => 'nests'], function () {
|
||||
Route::get('/', [Admin\Nests\NestController::class, 'index'])->name('admin.nests');
|
||||
Route::get('/new', [Admin\Nests\NestController::class, 'create'])->name('admin.nests.new');
|
||||
Route::get('/view/{nest:id}', [Admin\Nests\NestController::class, 'view'])->name('admin.nests.view');
|
||||
Route::get('/egg/new', [Admin\Nests\EggController::class, 'create'])->name('admin.nests.egg.new');
|
||||
Route::get('/egg/{egg:id}', [Admin\Nests\EggController::class, 'view'])->name('admin.nests.egg.view');
|
||||
Route::get('/egg/{egg:id}/export', [Admin\Nests\EggShareController::class, 'export'])->name('admin.nests.egg.export');
|
||||
Route::get('/egg/{egg:id}/variables', [Admin\Nests\EggVariableController::class, 'view'])->name('admin.nests.egg.variables');
|
||||
Route::get('/egg/{egg:id}/scripts', [Admin\Nests\EggScriptController::class, 'index'])->name('admin.nests.egg.scripts');
|
||||
Route::get('/', [Admin\Nests\NestController::class, 'index'])->name('admin.nests');
|
||||
Route::get('/new', [Admin\Nests\NestController::class, 'create'])->name('admin.nests.new');
|
||||
Route::get('/view/{nest:id}', [Admin\Nests\NestController::class, 'view'])->name('admin.nests.view');
|
||||
Route::get('/egg/new', [Admin\Nests\EggController::class, 'create'])->name('admin.nests.egg.new');
|
||||
Route::get('/egg/{egg:id}', [Admin\Nests\EggController::class, 'view'])->name('admin.nests.egg.view');
|
||||
Route::get('/egg/{egg:id}/export', [Admin\Nests\EggShareController::class, 'export'])->name('admin.nests.egg.export');
|
||||
Route::get('/egg/{egg:id}/variables', [Admin\Nests\EggVariableController::class, 'view'])->name('admin.nests.egg.variables');
|
||||
Route::get('/egg/{egg:id}/scripts', [Admin\Nests\EggScriptController::class, 'index'])->name('admin.nests.egg.scripts');
|
||||
|
||||
Route::post('/new', [Admin\Nests\NestController::class, 'store']);
|
||||
Route::post('/import', [Admin\Nests\EggShareController::class, 'import'])->name('admin.nests.egg.import');
|
||||
Route::post('/importFromUrl', [Admin\Nests\EggShareController::class, 'importFromUrl'])->name('admin.nests.egg.import_url');
|
||||
Route::post('/egg/new', [Admin\Nests\EggController::class, 'store']);
|
||||
Route::post('/egg/{egg:id}/variables', [Admin\Nests\EggVariableController::class, 'store']);
|
||||
Route::post('/new', [Admin\Nests\NestController::class, 'store']);
|
||||
Route::post('/import', [Admin\Nests\EggShareController::class, 'import'])->name('admin.nests.egg.import');
|
||||
Route::post('/importFromUrl', [Admin\Nests\EggShareController::class, 'importFromUrl'])->name('admin.nests.egg.import_url');
|
||||
Route::post('/egg/new', [Admin\Nests\EggController::class, 'store']);
|
||||
Route::post('/egg/{egg:id}/variables', [Admin\Nests\EggVariableController::class, 'store']);
|
||||
|
||||
Route::put('/egg/{egg:id}', [Admin\Nests\EggShareController::class, 'update']);
|
||||
Route::put('/egg/{egg:id}', [Admin\Nests\EggShareController::class, 'update']);
|
||||
|
||||
Route::patch('/view/{nest:id}', [Admin\Nests\NestController::class, 'update']);
|
||||
Route::patch('/egg/{egg:id}', [Admin\Nests\EggController::class, 'update']);
|
||||
Route::patch('/egg/{egg:id}/scripts', [Admin\Nests\EggScriptController::class, 'update']);
|
||||
Route::patch('/egg/{egg:id}/variables/{variable:id}', [Admin\Nests\EggVariableController::class, 'update'])->name('admin.nests.egg.variables.edit');
|
||||
Route::patch('/view/{nest:id}', [Admin\Nests\NestController::class, 'update']);
|
||||
Route::patch('/egg/{egg:id}', [Admin\Nests\EggController::class, 'update']);
|
||||
Route::patch('/egg/{egg:id}/scripts', [Admin\Nests\EggScriptController::class, 'update']);
|
||||
Route::patch('/egg/{egg:id}/variables/{variable:id}', [Admin\Nests\EggVariableController::class, 'update'])->name('admin.nests.egg.variables.edit');
|
||||
|
||||
Route::delete('/view/{nest:id}', [Admin\Nests\NestController::class, 'destroy']);
|
||||
Route::delete('/egg/{egg:id}', [Admin\Nests\EggController::class, 'destroy']);
|
||||
Route::delete('/egg/{egg:id}/variables/{variable:id}', [Admin\Nests\EggVariableController::class, 'destroy']);
|
||||
Route::delete('/view/{nest:id}', [Admin\Nests\NestController::class, 'destroy']);
|
||||
Route::delete('/egg/{egg:id}', [Admin\Nests\EggController::class, 'destroy']);
|
||||
Route::delete('/egg/{egg:id}/variables/{variable:id}', [Admin\Nests\EggVariableController::class, 'destroy']);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user