forked from Alex/Pterodactyl-Panel
Merge pull request #259 from Pterodactyl/feature/new-theme
Implement new AdminLTE theme for front-end of panel.
This commit is contained in:
commit
a52290dd76
@ -9,18 +9,18 @@ phraseapp:
|
||||
- file: ./resources/lang/<locale_code>/auth.php
|
||||
params:
|
||||
tag: "auth"
|
||||
- file: ./resources/lang/<locale_code>/base.php
|
||||
params:
|
||||
tag: "base"
|
||||
# - file: ./resources/lang/<locale_code>/base.php
|
||||
# params:
|
||||
# tag: "base"
|
||||
- file: ./resources/lang/<locale_code>/pagination.php
|
||||
params:
|
||||
tag: "pagination"
|
||||
- file: ./resources/lang/<locale_code>/passwords.php
|
||||
params:
|
||||
tag: "passwords"
|
||||
- file: ./resources/lang/<locale_code>/server.php
|
||||
params:
|
||||
tag: "server"
|
||||
# - file: ./resources/lang/<locale_code>/server.php
|
||||
# params:
|
||||
# tag: "server"
|
||||
- file: ./resources/lang/<locale_code>/strings.php
|
||||
params:
|
||||
tag: "strings"
|
||||
|
@ -9,6 +9,7 @@ This project follows [Semantic Versioning](http://semver.org) guidelines.
|
||||
* Basic service pack implementation to allow assignment of modpacks or software to a server to pre-install applications and allow users to update.
|
||||
* Users can now have a username as well as client name assigned to their account.
|
||||
* Ability to create a node through the CLI using `pterodactyl:node` as well as locations via `pterodactyl:location`.
|
||||
* New theme (AdminLTE) for front-end with tweaks to backend files to work properly with it.
|
||||
|
||||
### Fixed
|
||||
* Bug causing error logs to be spammed if someone timed out on an ajax based page.
|
||||
|
@ -33,6 +33,8 @@ A huge thanks to [PhraseApp](https://phraseapp.com) who provide us the software
|
||||
|
||||
Ace Editor - [license](https://github.com/ajaxorg/ace/blob/master/LICENSE) - [homepage](https://ace.c9.io)
|
||||
|
||||
AdminLTE - [license](https://github.com/almasaeed2010/AdminLTE/blob/master/LICENSE) - [homepage](https://almsaeedstudio.com)
|
||||
|
||||
Animate.css - [license](https://github.com/daneden/animate.css/blob/master/LICENSE) - [homepage](http://daneden.github.io/animate.css/)
|
||||
|
||||
Async.js - [license](https://github.com/caolan/async/blob/master/LICENSE) - [homepage](https://github.com/caolan/async/)
|
||||
@ -57,8 +59,12 @@ jQuery Terminal - [license](https://github.com/jcubic/jquery.terminal/blob/maste
|
||||
|
||||
Lodash - [license](https://github.com/lodash/lodash/blob/master/LICENSE) - [homepage](https://lodash.com/)
|
||||
|
||||
Select2 - [license](https://github.com/select2/select2/blob/master/LICENSE.md) - [homepage](https://select2.github.io)
|
||||
|
||||
Socket.io - [license](https://github.com/socketio/socket.io/blob/master/LICENSE) - [homepage](http://socket.io)
|
||||
|
||||
Socket.io File Upload - [license](https://github.com/vote539/socketio-file-upload/blob/master/server.js#L1-L27) - [homepage](https://github.com/vote539/socketio-file-upload)
|
||||
|
||||
SweetAlert - [license](https://github.com/t4t5/sweetalert/blob/master/LICENSE) - [homepage](http://t4t5.github.io/sweetalert/)
|
||||
|
||||
Typeahead — [license](https://github.com/bassjobsen/Bootstrap-3-Typeahead/blob/master/bootstrap3-typeahead.js) — [homepage](https://github.com/bassjobsen/Bootstrap-3-Typeahead)
|
||||
|
@ -49,7 +49,7 @@ class Handler extends ExceptionHandler
|
||||
if ($request->expectsJson()) {
|
||||
$response = response()->json([
|
||||
'error' => ($exception instanceof DisplayException) ? $exception->getMessage() : 'An unhandled error occured while attempting to process this request.',
|
||||
], ($this->isHttpException($exception)) ? $e->getStatusCode() : 500);
|
||||
], ($this->isHttpException($exception)) ? $exception->getStatusCode() : 500);
|
||||
|
||||
parent::report($exception);
|
||||
}
|
||||
|
@ -79,7 +79,9 @@ class SecurityController extends Controller
|
||||
public function setTotp(Request $request)
|
||||
{
|
||||
if (! $request->has('token')) {
|
||||
return response(null, 500);
|
||||
return response()->json([
|
||||
'error' => 'Request is missing token parameter.',
|
||||
], 500);
|
||||
}
|
||||
|
||||
$user = $request->user();
|
||||
@ -101,7 +103,7 @@ class SecurityController extends Controller
|
||||
if (! $request->has('token')) {
|
||||
Alert::danger('Missing required `token` field in request.')->flash();
|
||||
|
||||
return redirect()->route('account.totp');
|
||||
return redirect()->route('account.security');
|
||||
}
|
||||
|
||||
$user = $request->user();
|
||||
|
@ -58,8 +58,11 @@ class ServerController extends Controller
|
||||
public function getIndex(Request $request)
|
||||
{
|
||||
$server = Models\Server::getByUUID($request->route()->server);
|
||||
$node = Models\Node::find($server->node);
|
||||
|
||||
Javascript::put([
|
||||
'server' => collect($server->makeVisible('daemonSecret'))->only(['uuid', 'daemonSecret', 'username']),
|
||||
'node' => collect($node)->only('fqdn', 'scheme', 'daemonListen'),
|
||||
'meta' => [
|
||||
'saveFile' => route('server.files.save', $server->uuidShort),
|
||||
'csrfToken' => csrf_token(),
|
||||
@ -68,8 +71,7 @@ class ServerController extends Controller
|
||||
|
||||
return view('server.index', [
|
||||
'server' => $server,
|
||||
'allocations' => Models\Allocation::where('assigned_to', $server->id)->orderBy('ip', 'asc')->orderBy('port', 'asc')->get(),
|
||||
'node' => Models\Node::find($server->node),
|
||||
'node' => $node,
|
||||
]);
|
||||
}
|
||||
|
||||
@ -120,10 +122,16 @@ class ServerController extends Controller
|
||||
{
|
||||
$server = Models\Server::getByUUID($uuid);
|
||||
$this->authorize('add-files', $server);
|
||||
$node = Models\Node::find($server->node);
|
||||
|
||||
Javascript::put([
|
||||
'server' => collect($server->makeVisible('daemonSecret'))->only(['uuid', 'uuidShort', 'daemonSecret', 'username']),
|
||||
'node' => collect($node)->only('fqdn', 'scheme', 'daemonListen'),
|
||||
]);
|
||||
|
||||
return view('server.files.add', [
|
||||
'server' => $server,
|
||||
'node' => Models\Node::find($server->node),
|
||||
'node' => $node,
|
||||
'directory' => (in_array($request->get('dir'), [null, '/', ''])) ? '' : trim($request->get('dir'), '/') . '/',
|
||||
]);
|
||||
}
|
||||
@ -140,6 +148,7 @@ class ServerController extends Controller
|
||||
{
|
||||
$server = Models\Server::getByUUID($uuid);
|
||||
$this->authorize('edit-files', $server);
|
||||
$node = Models\Node::find($server->node);
|
||||
|
||||
$fileInfo = (object) pathinfo($file);
|
||||
$controller = new FileRepository($uuid);
|
||||
@ -157,9 +166,15 @@ class ServerController extends Controller
|
||||
return redirect()->route('server.files.index', $uuid);
|
||||
}
|
||||
|
||||
Javascript::put([
|
||||
'server' => collect($server->makeVisible('daemonSecret'))->only(['uuid', 'uuidShort', 'daemonSecret', 'username']),
|
||||
'node' => collect($node)->only('fqdn', 'scheme', 'daemonListen'),
|
||||
'stat' => $fileContent['stat'],
|
||||
]);
|
||||
|
||||
return view('server.files.edit', [
|
||||
'server' => $server,
|
||||
'node' => Models\Node::find($server->node),
|
||||
'node' => $node,
|
||||
'file' => $file,
|
||||
'stat' => $fileContent['stat'],
|
||||
'contents' => $fileContent['file']->content,
|
||||
@ -193,17 +208,36 @@ class ServerController extends Controller
|
||||
return redirect($node->scheme . '://' . $node->fqdn . ':' . $node->daemonListen . '/server/file/download/' . $download->token);
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders server settings page.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Contracts\View\View
|
||||
*/
|
||||
public function getSettings(Request $request, $uuid)
|
||||
public function getAllocation(Request $request, $uuid)
|
||||
{
|
||||
$server = Models\Server::getByUUID($uuid);
|
||||
$this->authorize('view-allocation', $server);
|
||||
$node = Models\Node::find($server->node);
|
||||
|
||||
Javascript::put([
|
||||
'server' => collect($server->makeVisible('daemonSecret'))->only(['uuid', 'uuidShort', 'daemonSecret', 'username']),
|
||||
'node' => collect($node)->only('fqdn', 'scheme', 'daemonListen'),
|
||||
]);
|
||||
|
||||
return view('server.settings.allocation', [
|
||||
'server' => $server,
|
||||
'allocations' => Models\Allocation::where('assigned_to', $server->id)->orderBy('ip', 'asc')->orderBy('port', 'asc')->get(),
|
||||
'node' => $node,
|
||||
]);
|
||||
}
|
||||
|
||||
public function getStartup(Request $request, $uuid)
|
||||
{
|
||||
$server = Models\Server::getByUUID($uuid);
|
||||
$this->authorize('view-startup', $server);
|
||||
$node = Models\Node::find($server->node);
|
||||
$allocation = Models\Allocation::findOrFail($server->allocation);
|
||||
|
||||
Javascript::put([
|
||||
'server' => collect($server->makeVisible('daemonSecret'))->only(['uuid', 'uuidShort', 'daemonSecret', 'username']),
|
||||
'node' => collect($node)->only('fqdn', 'scheme', 'daemonListen'),
|
||||
]);
|
||||
|
||||
$variables = Models\ServiceVariables::select(
|
||||
'service_variables.*',
|
||||
DB::raw('COALESCE(server_variables.variable_value, service_variables.default_value) as a_serverValue')
|
||||
@ -231,12 +265,8 @@ class ServerController extends Controller
|
||||
$processed = str_replace('{{' . $variable->env_variable . '}}', $replace, $processed);
|
||||
}
|
||||
|
||||
return view('server.settings', [
|
||||
return view('server.settings.startup', [
|
||||
'server' => $server,
|
||||
'databases' => Models\Database::select('databases.*', 'database_servers.host as a_host', 'database_servers.port as a_port')
|
||||
->where('server_id', $server->id)
|
||||
->join('database_servers', 'database_servers.id', '=', 'databases.db_server')
|
||||
->get(),
|
||||
'node' => Models\Node::find($server->node),
|
||||
'variables' => $variables->where('user_viewable', 1),
|
||||
'service' => $service,
|
||||
@ -244,6 +274,44 @@ class ServerController extends Controller
|
||||
]);
|
||||
}
|
||||
|
||||
public function getDatabases(Request $request, $uuid)
|
||||
{
|
||||
$server = Models\Server::getByUUID($uuid);
|
||||
$this->authorize('view-databases', $server);
|
||||
$node = Models\Node::find($server->node);
|
||||
|
||||
Javascript::put([
|
||||
'server' => collect($server->makeVisible('daemonSecret'))->only(['uuid', 'uuidShort', 'daemonSecret', 'username']),
|
||||
'node' => collect($node)->only('fqdn', 'scheme', 'daemonListen'),
|
||||
]);
|
||||
|
||||
return view('server.settings.databases', [
|
||||
'server' => $server,
|
||||
'node' => $node,
|
||||
'databases' => Models\Database::select('databases.*', 'database_servers.host as a_host', 'database_servers.port as a_port')
|
||||
->where('server_id', $server->id)
|
||||
->join('database_servers', 'database_servers.id', '=', 'databases.db_server')
|
||||
->get(),
|
||||
]);
|
||||
}
|
||||
|
||||
public function getSFTP(Request $request, $uuid)
|
||||
{
|
||||
$server = Models\Server::getByUUID($uuid);
|
||||
$this->authorize('view-sftp', $server);
|
||||
$node = Models\Node::find($server->node);
|
||||
|
||||
Javascript::put([
|
||||
'server' => collect($server->makeVisible('daemonSecret'))->only(['uuid', 'daemonSecret', 'username']),
|
||||
'node' => collect($node)->only('fqdn', 'scheme', 'daemonListen'),
|
||||
]);
|
||||
|
||||
return view('server.settings.sftp', [
|
||||
'server' => $server,
|
||||
'node' => $node,
|
||||
]);
|
||||
}
|
||||
|
||||
public function postSettingsSFTP(Request $request, $uuid)
|
||||
{
|
||||
$server = Models\Server::getByUUID($uuid);
|
||||
@ -254,7 +322,7 @@ class ServerController extends Controller
|
||||
$repo->updateSFTPPassword($server->id, $request->input('sftp_pass'));
|
||||
Alert::success('Successfully updated this servers SFTP password.')->flash();
|
||||
} catch (DisplayValidationException $ex) {
|
||||
return redirect()->route('server.settings', $uuid)->withErrors(json_decode($ex->getMessage()));
|
||||
return redirect()->route('server.settings.sftp', $uuid)->withErrors(json_decode($ex->getMessage()));
|
||||
} catch (DisplayException $ex) {
|
||||
Alert::danger($ex->getMessage())->flash();
|
||||
} catch (\Exception $ex) {
|
||||
@ -262,7 +330,7 @@ class ServerController extends Controller
|
||||
Alert::danger('An unknown error occured while attempting to update this server\'s SFTP settings.')->flash();
|
||||
}
|
||||
|
||||
return redirect()->route('server.settings', $uuid);
|
||||
return redirect()->route('server.settings.sftp', $uuid);
|
||||
}
|
||||
|
||||
public function postSettingsStartup(Request $request, $uuid)
|
||||
|
@ -28,6 +28,7 @@ use DB;
|
||||
use Log;
|
||||
use Auth;
|
||||
use Alert;
|
||||
use Javascript;
|
||||
use Pterodactyl\Models;
|
||||
use Illuminate\Http\Request;
|
||||
use Pterodactyl\Exceptions\DisplayException;
|
||||
@ -51,11 +52,17 @@ class SubuserController extends Controller
|
||||
{
|
||||
$server = Models\Server::getByUUID($uuid);
|
||||
$this->authorize('list-subusers', $server);
|
||||
$node = Models\Node::find($server->node);
|
||||
|
||||
Javascript::put([
|
||||
'server' => collect($server->makeVisible('daemonSecret'))->only(['uuid', 'uuidShort', 'daemonSecret', 'username']),
|
||||
'node' => collect($node)->only('fqdn', 'scheme', 'daemonListen'),
|
||||
]);
|
||||
|
||||
return view('server.users.index', [
|
||||
'server' => $server,
|
||||
'node' => Models\Node::find($server->node),
|
||||
'subusers' => Models\Subuser::select('subusers.*', 'users.email as a_userEmail')
|
||||
'node' => $node,
|
||||
'subusers' => Models\Subuser::select('subusers.*', 'users.email', 'users.username')
|
||||
->join('users', 'users.id', '=', 'subusers.user_id')
|
||||
->where('server_id', $server->id)
|
||||
->get(),
|
||||
@ -66,6 +73,12 @@ class SubuserController extends Controller
|
||||
{
|
||||
$server = Models\Server::getByUUID($uuid);
|
||||
$this->authorize('view-subuser', $server);
|
||||
$node = Models\Node::find($server->node);
|
||||
|
||||
Javascript::put([
|
||||
'server' => collect($server->makeVisible('daemonSecret'))->only(['uuid', 'uuidShort', 'daemonSecret', 'username']),
|
||||
'node' => collect($node)->only('fqdn', 'scheme', 'daemonListen'),
|
||||
]);
|
||||
|
||||
$subuser = Models\Subuser::select('subusers.*', 'users.email as a_userEmail')
|
||||
->join('users', 'users.id', '=', 'subusers.user_id')
|
||||
@ -87,7 +100,7 @@ class SubuserController extends Controller
|
||||
|
||||
return view('server.users.view', [
|
||||
'server' => $server,
|
||||
'node' => Models\Node::find($server->node),
|
||||
'node' => $node,
|
||||
'subuser' => $subuser,
|
||||
'permissions' => $permissions,
|
||||
]);
|
||||
@ -137,10 +150,16 @@ class SubuserController extends Controller
|
||||
{
|
||||
$server = Models\Server::getByUUID($uuid);
|
||||
$this->authorize('create-subuser', $server);
|
||||
$node = Models\Node::find($server->node);
|
||||
|
||||
Javascript::put([
|
||||
'server' => collect($server->makeVisible('daemonSecret'))->only(['uuid', 'uuidShort', 'daemonSecret', 'username']),
|
||||
'node' => collect($node)->only('fqdn', 'scheme', 'daemonListen'),
|
||||
]);
|
||||
|
||||
return view('server.users.new', [
|
||||
'server' => $server,
|
||||
'node' => Models\Node::find($server->node),
|
||||
'node' => $node,
|
||||
]);
|
||||
}
|
||||
|
||||
|
@ -26,6 +26,7 @@ namespace Pterodactyl\Http\Controllers\Server;
|
||||
|
||||
use Log;
|
||||
use Alert;
|
||||
use Javascript;
|
||||
use Pterodactyl\Models;
|
||||
use Illuminate\Http\Request;
|
||||
use Pterodactyl\Repositories;
|
||||
@ -44,14 +45,20 @@ class TaskController extends Controller
|
||||
{
|
||||
$server = Models\Server::getByUUID($uuid);
|
||||
$this->authorize('list-tasks', $server);
|
||||
$node = Models\Node::find($server->node);
|
||||
|
||||
Javascript::put([
|
||||
'server' => collect($server->makeVisible('daemonSecret'))->only(['uuid', 'uuidShort', 'daemonSecret', 'username']),
|
||||
'node' => collect($node)->only('fqdn', 'scheme', 'daemonListen'),
|
||||
]);
|
||||
|
||||
return view('server.tasks.index', [
|
||||
'server' => $server,
|
||||
'node' => Models\Node::findOrFail($server->node),
|
||||
'node' => $node,
|
||||
'tasks' => Models\Task::where('server', $server->id)->get(),
|
||||
'actions' => [
|
||||
'command' => 'Send Command',
|
||||
'power' => 'Set Power Status',
|
||||
'command' => trans('server.tasks.actions.command'),
|
||||
'power' => trans('server.tasks.actions.power'),
|
||||
],
|
||||
]);
|
||||
}
|
||||
@ -60,10 +67,16 @@ class TaskController extends Controller
|
||||
{
|
||||
$server = Models\Server::getByUUID($uuid);
|
||||
$this->authorize('create-task', $server);
|
||||
$node = Models\Node::find($server->node);
|
||||
|
||||
Javascript::put([
|
||||
'server' => collect($server->makeVisible('daemonSecret'))->only(['uuid', 'uuidShort', 'daemonSecret', 'username']),
|
||||
'node' => collect($node)->only('fqdn', 'scheme', 'daemonListen'),
|
||||
]);
|
||||
|
||||
return view('server.tasks.new', [
|
||||
'server' => $server,
|
||||
'node' => Models\Node::findOrFail($server->node),
|
||||
'node' => $node,
|
||||
]);
|
||||
}
|
||||
|
||||
@ -77,8 +90,10 @@ class TaskController extends Controller
|
||||
$repo->create($server->id, $request->except([
|
||||
'_token',
|
||||
]));
|
||||
|
||||
return redirect()->route('server.tasks', $uuid);
|
||||
} catch (DisplayValidationException $ex) {
|
||||
return redirect()->route('server.tasks', $uuid)->withErrors(json_decode($ex->getMessage()))->withInput();
|
||||
return redirect()->route('server.tasks.new', $uuid)->withErrors(json_decode($ex->getMessage()))->withInput();
|
||||
} catch (DisplayException $ex) {
|
||||
Alert::danger($ex->getMessage())->flash();
|
||||
} catch (\Exception $ex) {
|
||||
@ -86,19 +101,7 @@ class TaskController extends Controller
|
||||
Alert::danger('An unknown error occured while attempting to create this task.')->flash();
|
||||
}
|
||||
|
||||
return redirect()->route('server.tasks', $uuid);
|
||||
}
|
||||
|
||||
public function getView(Request $request, $uuid, $id)
|
||||
{
|
||||
$server = Models\Server::getByUUID($uuid);
|
||||
$this->authorize('view-task', $server);
|
||||
|
||||
return view('server.tasks.view', [
|
||||
'server' => $server,
|
||||
'node' => Models\Node::findOrFail($server->node),
|
||||
'task' => Models\Task::where('id', $id)->where('server', $server->id)->firstOrFail(),
|
||||
]);
|
||||
return redirect()->route('server.tasks.new', $uuid);
|
||||
}
|
||||
|
||||
public function deleteTask(Request $request, $uuid, $id)
|
||||
|
@ -24,6 +24,7 @@
|
||||
|
||||
namespace Pterodactyl\Http\Middleware;
|
||||
|
||||
use Theme;
|
||||
use Closure;
|
||||
use Illuminate\Contracts\Auth\Guard;
|
||||
|
||||
@ -68,6 +69,9 @@ class AdminAuthenticate
|
||||
return abort(403);
|
||||
}
|
||||
|
||||
// @TODO: eventually update admin themes
|
||||
Theme::set('default');
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
|
@ -75,6 +75,7 @@ class AuthRoutes
|
||||
|
||||
// Handle Verification
|
||||
$router->post('password/reset', [
|
||||
'as' => 'auth.reset.post',
|
||||
'uses' => 'Auth\ResetPasswordController@reset',
|
||||
]);
|
||||
});
|
||||
|
@ -64,9 +64,11 @@ class BaseRoutes
|
||||
'uses' => 'Base\AccountController@index',
|
||||
]);
|
||||
$router->post('/password', [
|
||||
'as' => 'account.password',
|
||||
'uses' => 'Base\AccountController@password',
|
||||
]);
|
||||
$router->post('/email', [
|
||||
'as' => 'account.email',
|
||||
'uses' => 'Base\AccountController@email',
|
||||
]);
|
||||
});
|
||||
@ -113,6 +115,7 @@ class BaseRoutes
|
||||
'uses' => 'Base\SecurityController@revoke',
|
||||
]);
|
||||
$router->put('/totp', [
|
||||
'as' => 'account.security.totp',
|
||||
'uses' => 'Base\SecurityController@generateTotp',
|
||||
]);
|
||||
$router->post('/totp', [
|
||||
|
@ -51,16 +51,34 @@ class ServerRoutes
|
||||
'uses' => 'Server\ServerController@getSettings',
|
||||
]);
|
||||
|
||||
$router->post('/settings/sftp', [
|
||||
$router->get('/settings/databases', [
|
||||
'as' => 'server.settings.databases',
|
||||
'uses' => 'Server\ServerController@getDatabases',
|
||||
]);
|
||||
|
||||
$router->get('/settings/sftp', [
|
||||
'as' => 'server.settings.sftp',
|
||||
'uses' => 'Server\ServerController@getSFTP',
|
||||
]);
|
||||
|
||||
$router->post('/settings/sftp', [
|
||||
'uses' => 'Server\ServerController@postSettingsSFTP',
|
||||
]);
|
||||
|
||||
$router->post('/settings/startup', [
|
||||
$router->get('/settings/startup', [
|
||||
'as' => 'server.settings.startup',
|
||||
'uses' => 'Server\ServerController@getStartup',
|
||||
]);
|
||||
|
||||
$router->post('/settings/startup', [
|
||||
'uses' => 'Server\ServerController@postSettingsStartup',
|
||||
]);
|
||||
|
||||
$router->get('/settings/allocation', [
|
||||
'as' => 'server.settings.allocation',
|
||||
'uses' => 'Server\ServerController@getAllocation',
|
||||
]);
|
||||
|
||||
// File Manager Routes
|
||||
$router->get('/files', [
|
||||
'as' => 'server.files.index',
|
||||
@ -153,6 +171,7 @@ class ServerRoutes
|
||||
$router->group(['prefix' => 'ajax'], function ($server) use ($router) {
|
||||
// Returns Server Status
|
||||
$router->get('status', [
|
||||
'as' => 'server.ajax.status',
|
||||
'uses' => 'Server\AjaxController@getStatus',
|
||||
]);
|
||||
|
||||
|
@ -146,4 +146,14 @@ class User extends Model implements AuthenticatableContract, AuthorizableContrac
|
||||
{
|
||||
$this->notify(new ResetPasswordNotification($token));
|
||||
}
|
||||
|
||||
/**
|
||||
* Return true or false depending on wether the user is root admin or not.
|
||||
*
|
||||
* @return bool the user is root admin
|
||||
*/
|
||||
public function isRootAdmin()
|
||||
{
|
||||
return $this->root_admin === 1;
|
||||
}
|
||||
}
|
||||
|
@ -498,6 +498,30 @@ class ServerPolicy
|
||||
return $this->checkPermission($user, $server, 'create-task');
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if user has permission to view server allocations.
|
||||
*
|
||||
* @param \Pterodactyl\Models\User $user
|
||||
* @param \Pterodactyl\Models\Server $server
|
||||
* @return bool
|
||||
*/
|
||||
public function viewAllocation(User $user, Server $server)
|
||||
{
|
||||
return $this->checkPermission($user, $server, 'view-allocation');
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if user has permission to set the default allocation.
|
||||
*
|
||||
* @param \Pterodactyl\Models\User $user
|
||||
* @param \Pterodactyl\Models\Server $server
|
||||
* @return bool
|
||||
*/
|
||||
public function setAllocation(User $user, Server $server)
|
||||
{
|
||||
return $this->checkPermission($user, $server, 'set-allocation');
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the user has the given permission on/for the server.
|
||||
*
|
||||
|
@ -133,10 +133,15 @@ class SubuserRepository
|
||||
// Determine if this user exists or if we need to make them an account.
|
||||
$user = Models\User::where('email', $data['email'])->first();
|
||||
if (! $user) {
|
||||
$password = str_random(16);
|
||||
try {
|
||||
$repo = new UserRepository;
|
||||
$uid = $repo->create($data['email'], $password);
|
||||
$uid = $repo->create([
|
||||
'email' => $data['email'],
|
||||
'username' => substr(str_replace('@', '', $data['email']), 0, 8),
|
||||
'name_first' => 'John',
|
||||
'name_last' => 'Doe',
|
||||
'root_admin' => false,
|
||||
]);
|
||||
$user = Models\User::findOrFail($uid);
|
||||
} catch (\Exception $ex) {
|
||||
throw $ex;
|
||||
|
@ -27,7 +27,8 @@
|
||||
"dingo/api": "1.0.0-beta6",
|
||||
"aws/aws-sdk-php": "3.19.20",
|
||||
"predis/predis": "1.1.1",
|
||||
"laracasts/utilities": "2.1.0"
|
||||
"laracasts/utilities": "2.1.0",
|
||||
"lord/laroute": "2.3.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"fzaninotto/faker": "~1.4",
|
||||
|
@ -159,6 +159,7 @@ return [
|
||||
Prologue\Alerts\AlertsServiceProvider::class,
|
||||
Krucas\Settings\Providers\SettingsServiceProvider::class,
|
||||
Laracasts\Utilities\JavaScript\JavaScriptServiceProvider::class,
|
||||
Lord\Laroute\LarouteServiceProvider::class,
|
||||
|
||||
],
|
||||
|
||||
|
58
config/laroute.php
Normal file
58
config/laroute.php
Normal file
@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
* The destination path for the javascript file.
|
||||
*/
|
||||
'path' => 'public/js',
|
||||
|
||||
/*
|
||||
* The destination filename for the javascript file.
|
||||
*/
|
||||
'filename' => 'laroute',
|
||||
|
||||
/*
|
||||
* The namespace for the helper functions. By default this will bind them to
|
||||
* `window.laroute`.
|
||||
*/
|
||||
'namespace' => 'Router',
|
||||
|
||||
/*
|
||||
* Generate absolute URLs
|
||||
*
|
||||
* Set the Application URL in config/app.php
|
||||
*/
|
||||
'absolute' => false,
|
||||
|
||||
/*
|
||||
* The Filter Method
|
||||
*
|
||||
* 'all' => All routes except "'laroute' => false"
|
||||
* 'only' => Only "'laroute' => true" routes
|
||||
* 'force' => All routes, ignored "laroute" route parameter
|
||||
*/
|
||||
'filter' => 'all',
|
||||
|
||||
/*
|
||||
* Controller Namespace
|
||||
*
|
||||
* Set here your controller namespace (see RouteServiceProvider -> $namespace) for cleaner action calls
|
||||
* e.g. 'App\Http\Controllers'
|
||||
*/
|
||||
'action_namespace' => '',
|
||||
|
||||
/*
|
||||
* The path to the template `laroute.js` file. This is the file that contains
|
||||
* the ported helper Laravel url/route functions and the route data to go
|
||||
* with them.
|
||||
*/
|
||||
'template' => 'vendor/lord/laroute/src/templates/laroute.js',
|
||||
|
||||
/*
|
||||
* Appends a prefix to URLs. By default the prefix is an empty string.
|
||||
*
|
||||
*/
|
||||
'prefix' => '',
|
||||
|
||||
];
|
@ -12,5 +12,10 @@ return [
|
||||
'views-path' => 'default',
|
||||
'asset-path' => 'themes/default',
|
||||
],
|
||||
'pterodactyl' => [
|
||||
'extends' => null,
|
||||
'views-path' => 'pterodactyl',
|
||||
'asset-path' => 'themes/pterodactyl',
|
||||
],
|
||||
],
|
||||
];
|
||||
|
@ -6,6 +6,6 @@
|
||||
"babel-preset-es2015": "6.18.0"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "./node_modules/babel-cli/bin/babel.js public/js/files --source-maps --out-file public/js/filemanager.min.js"
|
||||
"build": "./node_modules/babel-cli/bin/babel.js public/themes/pterodactyl/js/frontend/files/src --source-maps --out-file public/themes/pterodactyl/js/frontend/files/filemanager.min.js"
|
||||
}
|
||||
}
|
||||
|
186
public/js/laroute.js
Normal file
186
public/js/laroute.js
Normal file
File diff suppressed because one or more lines are too long
@ -18,7 +18,7 @@
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
$(window).load(function () {
|
||||
socket.on('console', function (data) {
|
||||
Socket.on('console', function (data) {
|
||||
if (data.line.indexOf('You need to agree to the EULA in order to run the server') > -1) {
|
||||
swal({
|
||||
title: 'EULA Acceptance',
|
||||
|
123
public/themes/pterodactyl/css/pterodactyl.css
Normal file
123
public/themes/pterodactyl/css/pterodactyl.css
Normal file
@ -0,0 +1,123 @@
|
||||
/**
|
||||
* Pterodactyl - Panel
|
||||
* Copyright (c) 2015 - 2017 Dane Everitt <dane@daneeveritt.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
.login-box, .register-box {
|
||||
width: 460px;
|
||||
}
|
||||
|
||||
.weight-100 {
|
||||
font-weight: 100;
|
||||
}
|
||||
|
||||
.weight-300 {
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.btn-clear {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.user-panel > .info {
|
||||
position: relative;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
code {
|
||||
font-size: 85%;
|
||||
}
|
||||
|
||||
.control-sidebar-dark .control-sidebar-menu > li > a.active {
|
||||
background: #1e282c;
|
||||
}
|
||||
|
||||
.callout-nomargin {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.table {
|
||||
font-size: 14px !important;
|
||||
}
|
||||
|
||||
.middle {
|
||||
vertical-align: middle !important;
|
||||
}
|
||||
|
||||
#fileOptionMenu.dropdown-menu > li > a {
|
||||
padding:3px 6px;
|
||||
}
|
||||
|
||||
.hasFileHover {
|
||||
border: 2px dashed #0087F7;
|
||||
border-top: 0 !important;
|
||||
border-radius: 5px;
|
||||
margin: 0;
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.hasFileHover * {
|
||||
pointer-events: none !important;
|
||||
}
|
||||
|
||||
td.has-progress {
|
||||
padding: 0px !important;
|
||||
border-top: 0px !important;
|
||||
}
|
||||
|
||||
.progress.progress-table-bottom {
|
||||
margin: 0 !important;
|
||||
height:5px !important;
|
||||
padding:0;
|
||||
border:0;
|
||||
}
|
||||
|
||||
.muted {
|
||||
filter: alpha(opacity=20);
|
||||
opacity: 0.2;
|
||||
}
|
||||
|
||||
.muted-hover:hover {
|
||||
filter: alpha(opacity=100);
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.use-pointer {
|
||||
cursor: pointer !important;
|
||||
}
|
||||
|
||||
.input-loader {
|
||||
display: none;
|
||||
position:relative;
|
||||
top: -23px;
|
||||
float: right;
|
||||
right: 5px;
|
||||
color: #cccccc;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.box-header > .form-group {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.box-header > .form-group > div > p.small {
|
||||
margin: 0;
|
||||
}
|
76
public/themes/pterodactyl/js/frontend/2fa-modal.js
Normal file
76
public/themes/pterodactyl/js/frontend/2fa-modal.js
Normal file
@ -0,0 +1,76 @@
|
||||
// Copyright (c) 2015 - 2016 Dane Everitt <dane@daneeveritt.com>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
$(document).ready(function () {
|
||||
$('#close_reload').click(function () {
|
||||
location.reload();
|
||||
});
|
||||
$('#do_2fa').submit(function (event) {
|
||||
event.preventDefault();
|
||||
|
||||
$.ajax({
|
||||
type: 'PUT',
|
||||
url: Router.route('account.security.totp'),
|
||||
headers: {
|
||||
'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content'),
|
||||
}
|
||||
}).done(function (data) {
|
||||
var image = new Image();
|
||||
image.src = data.qrImage;
|
||||
$(image).load(function () {
|
||||
$('#hide_img_load').slideUp(function () {
|
||||
$('#qr_image_insert').attr('src', image.src).slideDown();
|
||||
});
|
||||
});
|
||||
$('#2fa_secret_insert').html(data.secret);
|
||||
$('#open2fa').modal('show');
|
||||
}).fail(function (jqXHR) {
|
||||
alert('An error occured while attempting to load the 2FA setup modal. Please try again.');
|
||||
console.error(jqXHR);
|
||||
});
|
||||
|
||||
});
|
||||
$('#2fa_token_verify').submit(function (event) {
|
||||
event.preventDefault();
|
||||
$('#submit_action').html('<i class="fa fa-spinner fa-spin"></i> Submit').addClass('disabled');
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: Router.route('account.security.totp'),
|
||||
headers: {
|
||||
'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content'),
|
||||
},
|
||||
data: {
|
||||
token: $('#2fa_token').val()
|
||||
}
|
||||
}).done(function (data) {
|
||||
$('#notice_box_2fa').hide();
|
||||
if (data === 'true') {
|
||||
$('#notice_box_2fa').html('<div class="alert alert-success">2-Factor Authentication has been enabled on your account. Press \'Close\' below to reload the page.</div>').slideDown();
|
||||
} else {
|
||||
$('#notice_box_2fa').html('<div class="alert alert-danger">The token provided was invalid.</div>').slideDown();
|
||||
}
|
||||
}).fail(function (jqXHR) {
|
||||
$('#notice_box_2fa').html('<div class="alert alert-danger">There was an error while attempting to enable 2-Factor Authentication on this account.</div>').slideDown();
|
||||
console.error(jqXHR);
|
||||
}).always(function () {
|
||||
$('#submit_action').html('Submit').removeClass('disabled');
|
||||
});
|
||||
});
|
||||
});
|
203
public/themes/pterodactyl/js/frontend/console.js
Normal file
203
public/themes/pterodactyl/js/frontend/console.js
Normal file
@ -0,0 +1,203 @@
|
||||
// Copyright (c) 2015 - 2016 Dane Everitt <dane@daneeveritt.com>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
var CONSOLE_PUSH_COUNT = 50;
|
||||
var CONSOLE_PUSH_FREQ = 200;
|
||||
|
||||
(function initConsole() {
|
||||
window.TerminalQueue = [];
|
||||
window.Terminal = $('#terminal').terminal(function (command, term) {
|
||||
Socket.emit('send command', command);
|
||||
}, {
|
||||
greetings: '',
|
||||
name: Pterodactyl.server.uuid,
|
||||
height: 450,
|
||||
exit: false,
|
||||
prompt: Pterodactyl.server.username + ':~$ ',
|
||||
scrollOnEcho: false,
|
||||
scrollBottomOffset: 5,
|
||||
onBlur: function (terminal) {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
Socket.on('initial status', function (data) {
|
||||
Terminal.clear();
|
||||
if (data.status === 1 || data.status === 2) {
|
||||
Socket.emit('send server log');
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
||||
(function pushOutputQueue() {
|
||||
if (TerminalQueue.length > CONSOLE_PUSH_COUNT) {
|
||||
// console throttled warning show
|
||||
}
|
||||
|
||||
if (TerminalQueue.length > 0) {
|
||||
for (var i = 0; i < CONSOLE_PUSH_COUNT && TerminalQueue.length > 0; i++) {
|
||||
Terminal.echo(TerminalQueue[0]);
|
||||
TerminalQueue.shift();
|
||||
}
|
||||
}
|
||||
|
||||
window.setTimeout(pushOutputQueue, CONSOLE_PUSH_FREQ);
|
||||
})();
|
||||
|
||||
$(document).ready(function () {
|
||||
$('[data-attr="power"]').click(function (event) {
|
||||
Socket.emit('set status', $(this).data('action'));
|
||||
});
|
||||
var ctc = $('#chart_cpu');
|
||||
var timeLabels = [];
|
||||
var cpuData = [];
|
||||
var CPUChart = new Chart(ctc, {
|
||||
type: 'line',
|
||||
data: {
|
||||
labels: timeLabels,
|
||||
datasets: [
|
||||
{
|
||||
label: "Percent Use",
|
||||
fill: false,
|
||||
lineTension: 0.03,
|
||||
backgroundColor: "#00A1CB",
|
||||
borderColor: "#00A1CB",
|
||||
borderCapStyle: 'butt',
|
||||
borderDash: [],
|
||||
borderDashOffset: 0.0,
|
||||
borderJoinStyle: 'miter',
|
||||
pointBorderColor: "rgba(75,192,192,1)",
|
||||
pointBackgroundColor: "#fff",
|
||||
pointBorderWidth: 1,
|
||||
pointHoverRadius: 5,
|
||||
pointHoverBackgroundColor: "rgba(75,192,192,1)",
|
||||
pointHoverBorderColor: "rgba(220,220,220,1)",
|
||||
pointHoverBorderWidth: 2,
|
||||
pointRadius: 1,
|
||||
pointHitRadius: 10,
|
||||
data: cpuData,
|
||||
spanGaps: false,
|
||||
}
|
||||
]
|
||||
},
|
||||
options: {
|
||||
title: {
|
||||
display: true,
|
||||
text: 'CPU Usage (as Percent Total)'
|
||||
},
|
||||
legend: {
|
||||
display: false,
|
||||
},
|
||||
animation: {
|
||||
duration: 1,
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var ctm = $('#chart_memory');
|
||||
var memoryData = [];
|
||||
var MemoryChart = new Chart(ctm, {
|
||||
type: 'line',
|
||||
data: {
|
||||
labels: timeLabels,
|
||||
datasets: [
|
||||
{
|
||||
label: "Memory Use",
|
||||
fill: false,
|
||||
lineTension: 0.03,
|
||||
backgroundColor: "#01A4A4",
|
||||
borderColor: "#01A4A4",
|
||||
borderCapStyle: 'butt',
|
||||
borderDash: [],
|
||||
borderDashOffset: 0.0,
|
||||
borderJoinStyle: 'miter',
|
||||
pointBorderColor: "rgba(75,192,192,1)",
|
||||
pointBackgroundColor: "#fff",
|
||||
pointBorderWidth: 1,
|
||||
pointHoverRadius: 5,
|
||||
pointHoverBackgroundColor: "rgba(75,192,192,1)",
|
||||
pointHoverBorderColor: "rgba(220,220,220,1)",
|
||||
pointHoverBorderWidth: 2,
|
||||
pointRadius: 1,
|
||||
pointHitRadius: 10,
|
||||
data: memoryData,
|
||||
spanGaps: false,
|
||||
}
|
||||
]
|
||||
},
|
||||
options: {
|
||||
title: {
|
||||
display: true,
|
||||
text: 'Memory Usage (in Megabytes)'
|
||||
},
|
||||
legend: {
|
||||
display: false,
|
||||
},
|
||||
animation: {
|
||||
duration: 1,
|
||||
}
|
||||
}
|
||||
});
|
||||
Socket.on('proc', function (proc) {
|
||||
if (cpuData.length > 10) {
|
||||
cpuData.shift();
|
||||
memoryData.shift();
|
||||
timeLabels.shift();
|
||||
}
|
||||
|
||||
var cpuUse = (Pterodactyl.server.cpu > 0) ? parseFloat(((proc.data.cpu.total / Pterodactyl.server.cpu) * 100).toFixed(3).toString()) : proc.data.cpu.total;
|
||||
cpuData.push(cpuUse);
|
||||
memoryData.push(parseInt(proc.data.memory.total / (1024 * 1024)));
|
||||
|
||||
var m = new Date();
|
||||
timeLabels.push($.format.date(new Date(), 'HH:mm:ss'));
|
||||
|
||||
CPUChart.update();
|
||||
MemoryChart.update();
|
||||
});
|
||||
|
||||
// Update Listings on Initial Status
|
||||
Socket.on('initial status', function (data) {
|
||||
updateServerPowerControls(data.status);
|
||||
});
|
||||
|
||||
// Update Listings on Status
|
||||
Socket.on('status', function (data) {
|
||||
updateServerPowerControls(data.status);
|
||||
});
|
||||
|
||||
function updateServerPowerControls (data) {
|
||||
// Server is On or Starting
|
||||
if(data == 1 || data == 2) {
|
||||
$('[data-attr="power"][data-action="start"]').addClass('disabled');
|
||||
$('[data-attr="power"][data-action="stop"], [data-attr="power"][data-action="restart"]').removeClass('disabled');
|
||||
} else {
|
||||
if (data == 0) {
|
||||
$('[data-attr="power"][data-action="start"]').removeClass('disabled');
|
||||
}
|
||||
$('[data-attr="power"][data-action="stop"], [data-attr="power"][data-action="restart"]').addClass('disabled');
|
||||
}
|
||||
|
||||
if(data !== 0) {
|
||||
$('[data-attr="power"][data-action="kill"]').removeClass('disabled');
|
||||
} else {
|
||||
$('[data-attr="power"][data-action="kill"]').addClass('disabled');
|
||||
}
|
||||
}
|
||||
});
|
124
public/themes/pterodactyl/js/frontend/files/editor.js
Normal file
124
public/themes/pterodactyl/js/frontend/files/editor.js
Normal file
@ -0,0 +1,124 @@
|
||||
// Copyright (c) 2015 - 2016 Dane Everitt <dane@daneeveritt.com>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
$(document).ready(function () {
|
||||
const Editor = ace.edit('editor');
|
||||
const Modelist = ace.require('ace/ext/modelist')
|
||||
|
||||
Editor.setTheme('ace/theme/chrome');
|
||||
Editor.getSession().setUseWrapMode(true);
|
||||
Editor.setShowPrintMargin(false);
|
||||
|
||||
if (typeof Pterodactyl !== 'undefined' && typeof Pterodactyl.stat !== 'undefined') {
|
||||
Editor.getSession().setMode(Modelist.getModeForPath(Pterodactyl.stat.name).mode);
|
||||
}
|
||||
|
||||
Editor.commands.addCommand({
|
||||
name: 'save',
|
||||
bindKey: {win: 'Ctrl-S', mac: 'Command-S'},
|
||||
exec: function(editor) {
|
||||
if ($('#save_file').length) {
|
||||
save();
|
||||
} else if ($('#create_file').length) {
|
||||
create();
|
||||
}
|
||||
},
|
||||
readOnly: false
|
||||
});
|
||||
|
||||
$('#save_file').on('click', function (e) {
|
||||
e.preventDefault();
|
||||
save();
|
||||
});
|
||||
|
||||
$('#create_file').on('click', function (e) {
|
||||
e.preventDefault();
|
||||
create();
|
||||
});
|
||||
|
||||
$('#aceMode').on('change', event => {
|
||||
Editor.getSession().setMode('ace/mode/' + $('#aceMode').val());
|
||||
});
|
||||
|
||||
function create() {
|
||||
if (_.isEmpty($('#file_name').val())) {
|
||||
$.notify({
|
||||
message: 'No filename was passed.'
|
||||
}, {
|
||||
type: 'danger'
|
||||
});
|
||||
return;
|
||||
}
|
||||
$('#create_file').html('<i class="fa fa-spinner fa fa-spin"></i> Creating File').addClass('disabled');
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: Router.route('server.files.save', { server: Pterodactyl.server.uuidShort }),
|
||||
headers: {
|
||||
'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content'),
|
||||
},
|
||||
data: {
|
||||
file: $('#file_name').val(),
|
||||
contents: Editor.getValue()
|
||||
}
|
||||
}).done(function (data) {
|
||||
window.location.replace(Router.route('server.files.edit', {
|
||||
server: Pterodactyl.server.uuidShort,
|
||||
file: $('#file_name').val(),
|
||||
}));
|
||||
}).fail(function (jqXHR) {
|
||||
$.notify({
|
||||
message: jqXHR.responseText
|
||||
}, {
|
||||
type: 'danger'
|
||||
});
|
||||
}).always(function () {
|
||||
$('#create_file').html('Create File').removeClass('disabled');
|
||||
});
|
||||
}
|
||||
|
||||
function save() {
|
||||
var fileName = $('input[name="file"]').val();
|
||||
$('#save_file').html('<i class="fa fw-fw fa-spinner fa-spin"></i> Saving File').addClass('disabled');
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: Router.route('server.files.save', { server: Pterodactyl.server.uuidShort }),
|
||||
headers: {
|
||||
'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content'),
|
||||
},
|
||||
data: {
|
||||
file: fileName,
|
||||
contents: Editor.getValue()
|
||||
}
|
||||
}).done(function (data) {
|
||||
$.notify({
|
||||
message: 'File was successfully saved.'
|
||||
}, {
|
||||
type: 'success'
|
||||
});
|
||||
}).fail(function (jqXHR) {
|
||||
$.notify({
|
||||
message: jqXHR.responseText
|
||||
}, {
|
||||
type: 'danger'
|
||||
});
|
||||
}).always(function () {
|
||||
$('#save_file').html('<i class="fa fa-fw fa-save"></i> Save File').removeClass('disabled');
|
||||
});
|
||||
}
|
||||
});
|
2
public/themes/pterodactyl/js/frontend/files/filemanager.min.js
vendored
Normal file
2
public/themes/pterodactyl/js/frontend/files/filemanager.min.js
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
|
||||
//# sourceMappingURL=filemanager.min.js.map
|
@ -0,0 +1 @@
|
||||
{"version":3,"sources":[],"names":[],"mappings":"","file":"filemanager.min.js"}
|
394
public/themes/pterodactyl/js/frontend/files/src/actions.js
Normal file
394
public/themes/pterodactyl/js/frontend/files/src/actions.js
Normal file
@ -0,0 +1,394 @@
|
||||
"use strict";
|
||||
|
||||
// Copyright (c) 2015 - 2016 Dane Everitt <dane@daneeveritt.com>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
class ActionsClass {
|
||||
constructor(element, menu) {
|
||||
this.element = element;
|
||||
this.menu = menu;
|
||||
}
|
||||
|
||||
destroy() {
|
||||
this.element = undefined;
|
||||
}
|
||||
|
||||
folder() {
|
||||
const nameBlock = $(this.element).find('td[data-identifier="name"]');
|
||||
const currentName = decodeURIComponent(nameBlock.attr('data-name'));
|
||||
const currentPath = decodeURIComponent(nameBlock.data('path'));
|
||||
|
||||
let inputValue = `${currentPath}${currentName}/`;
|
||||
if ($(this.element).data('type') === 'file') {
|
||||
inputValue = currentPath;
|
||||
}
|
||||
swal({
|
||||
type: 'input',
|
||||
title: 'Create Folder',
|
||||
text: 'Please enter the path and folder name below.',
|
||||
showCancelButton: true,
|
||||
showConfirmButton: true,
|
||||
closeOnConfirm: false,
|
||||
showLoaderOnConfirm: true,
|
||||
inputValue: inputValue
|
||||
}, (val) => {
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
headers: {
|
||||
'X-Access-Token': Pterodactyl.server.daemonSecret,
|
||||
'X-Access-Server': Pterodactyl.server.uuid,
|
||||
},
|
||||
contentType: 'application/json; charset=utf-8',
|
||||
url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/server/file/folder`,
|
||||
timeout: 10000,
|
||||
data: JSON.stringify({
|
||||
path: val,
|
||||
}),
|
||||
}).done(data => {
|
||||
swal.close();
|
||||
Files.list();
|
||||
}).fail(jqXHR => {
|
||||
console.error(jqXHR);
|
||||
var error = 'An error occured while trying to process this request.';
|
||||
if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {
|
||||
error = jqXHR.responseJSON.error;
|
||||
}
|
||||
swal({
|
||||
type: 'error',
|
||||
title: '',
|
||||
text: error,
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
move() {
|
||||
const nameBlock = $(this.element).find('td[data-identifier="name"]');
|
||||
const currentName = decodeURIComponent(nameBlock.attr('data-name'));
|
||||
const currentPath = decodeURIComponent(nameBlock.data('path'));
|
||||
|
||||
swal({
|
||||
type: 'input',
|
||||
title: 'Move File',
|
||||
text: 'Please enter the new path for the file below.',
|
||||
showCancelButton: true,
|
||||
showConfirmButton: true,
|
||||
closeOnConfirm: false,
|
||||
showLoaderOnConfirm: true,
|
||||
inputValue: `${currentPath}${currentName}`,
|
||||
}, (val) => {
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
headers: {
|
||||
'X-Access-Token': Pterodactyl.server.daemonSecret,
|
||||
'X-Access-Server': Pterodactyl.server.uuid,
|
||||
},
|
||||
contentType: 'application/json; charset=utf-8',
|
||||
url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/server/file/move`,
|
||||
timeout: 10000,
|
||||
data: JSON.stringify({
|
||||
from: `${currentPath}${currentName}`,
|
||||
to: `${val}`,
|
||||
}),
|
||||
}).done(data => {
|
||||
nameBlock.parent().addClass('warning').delay(200).fadeOut();
|
||||
swal.close();
|
||||
}).fail(jqXHR => {
|
||||
console.error(jqXHR);
|
||||
var error = 'An error occured while trying to process this request.';
|
||||
if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {
|
||||
error = jqXHR.responseJSON.error;
|
||||
}
|
||||
swal({
|
||||
type: 'error',
|
||||
title: '',
|
||||
text: error,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
rename() {
|
||||
const nameBlock = $(this.element).find('td[data-identifier="name"]');
|
||||
const currentLink = nameBlock.find('a');
|
||||
const currentName = decodeURIComponent(nameBlock.attr('data-name'));
|
||||
const attachEditor = `
|
||||
<input class="form-control input-sm" type="text" value="${currentName}" />
|
||||
<span class="input-loader"><i class="fa fa-refresh fa-spin fa-fw"></i></span>
|
||||
`;
|
||||
|
||||
nameBlock.html(attachEditor);
|
||||
const inputField = nameBlock.find('input');
|
||||
const inputLoader = nameBlock.find('.input-loader');
|
||||
|
||||
inputField.focus();
|
||||
inputField.on('blur keydown', e => {
|
||||
// Save Field
|
||||
if (
|
||||
(e.type === 'keydown' && e.which === 27)
|
||||
|| e.type === 'blur'
|
||||
|| (e.type === 'keydown' && e.which === 13 && currentName === inputField.val())
|
||||
) {
|
||||
if (!_.isEmpty(currentLink)) {
|
||||
nameBlock.html(currentLink);
|
||||
} else {
|
||||
nameBlock.html(currentName);
|
||||
}
|
||||
inputField.remove();
|
||||
ContextMenu.unbind().run();
|
||||
return;
|
||||
}
|
||||
|
||||
if (e.type === 'keydown' && e.which !== 13) return;
|
||||
|
||||
inputLoader.show();
|
||||
const currentPath = decodeURIComponent(nameBlock.data('path'));
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
headers: {
|
||||
'X-Access-Token': Pterodactyl.server.daemonSecret,
|
||||
'X-Access-Server': Pterodactyl.server.uuid,
|
||||
},
|
||||
contentType: 'application/json; charset=utf-8',
|
||||
url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/server/file/rename`,
|
||||
timeout: 10000,
|
||||
data: JSON.stringify({
|
||||
from: `${currentPath}${currentName}`,
|
||||
to: `${currentPath}${inputField.val()}`,
|
||||
}),
|
||||
}).done(data => {
|
||||
nameBlock.attr('data-name', inputField.val());
|
||||
if (!_.isEmpty(currentLink)) {
|
||||
let newLink = currentLink.attr('href');
|
||||
if (nameBlock.parent().data('type') !== 'folder') {
|
||||
newLink = newLink.substr(0, newLink.lastIndexOf('/')) + '/' + inputField.val();
|
||||
}
|
||||
currentLink.attr('href', newLink);
|
||||
nameBlock.html(
|
||||
currentLink.html(inputField.val())
|
||||
);
|
||||
} else {
|
||||
nameBlock.html(inputField.val());
|
||||
}
|
||||
inputField.remove();
|
||||
}).fail(jqXHR => {
|
||||
console.error(jqXHR);
|
||||
var error = 'An error occured while trying to process this request.';
|
||||
if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {
|
||||
error = jqXHR.responseJSON.error;
|
||||
}
|
||||
nameBlock.addClass('has-error').delay(2000).queue(() => {
|
||||
nameBlock.removeClass('has-error').dequeue();
|
||||
});
|
||||
inputField.popover({
|
||||
animation: true,
|
||||
placement: 'top',
|
||||
content: error,
|
||||
title: 'Save Error'
|
||||
}).popover('show');
|
||||
}).always(() => {
|
||||
inputLoader.remove();
|
||||
ContextMenu.unbind().run();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
copy() {
|
||||
const nameBlock = $(this.element).find('td[data-identifier="name"]');
|
||||
const currentName = decodeURIComponent(nameBlock.attr('data-name'));
|
||||
const currentPath = decodeURIComponent(nameBlock.data('path'));
|
||||
|
||||
swal({
|
||||
type: 'input',
|
||||
title: 'Copy File',
|
||||
text: 'Please enter the new path for the copied file below.',
|
||||
showCancelButton: true,
|
||||
showConfirmButton: true,
|
||||
closeOnConfirm: false,
|
||||
showLoaderOnConfirm: true,
|
||||
inputValue: `${currentPath}${currentName}`,
|
||||
}, (val) => {
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
headers: {
|
||||
'X-Access-Token': Pterodactyl.server.daemonSecret,
|
||||
'X-Access-Server': Pterodactyl.server.uuid,
|
||||
},
|
||||
contentType: 'application/json; charset=utf-8',
|
||||
url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/server/file/copy`,
|
||||
timeout: 10000,
|
||||
data: JSON.stringify({
|
||||
from: `${currentPath}${currentName}`,
|
||||
to: `${val}`,
|
||||
}),
|
||||
}).done(data => {
|
||||
swal({
|
||||
type: 'success',
|
||||
title: '',
|
||||
text: 'File successfully copied.'
|
||||
});
|
||||
Files.list();
|
||||
}).fail(jqXHR => {
|
||||
console.error(jqXHR);
|
||||
var error = 'An error occured while trying to process this request.';
|
||||
if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {
|
||||
error = jqXHR.responseJSON.error;
|
||||
}
|
||||
swal({
|
||||
type: 'error',
|
||||
title: '',
|
||||
text: error,
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
download() {
|
||||
const nameBlock = $(this.element).find('td[data-identifier="name"]');
|
||||
const fileName = decodeURIComponent(nameBlock.attr('data-name'));
|
||||
const filePath = decodeURIComponent(nameBlock.data('path'));
|
||||
|
||||
window.location = `/server/${Pterodactyl.server.uuidShort}/files/download/${filePath}${fileName}`;
|
||||
}
|
||||
|
||||
delete() {
|
||||
const nameBlock = $(this.element).find('td[data-identifier="name"]');
|
||||
const delPath = decodeURIComponent(nameBlock.data('path'));
|
||||
const delName = decodeURIComponent(nameBlock.data('name'));
|
||||
|
||||
swal({
|
||||
type: 'warning',
|
||||
title: '',
|
||||
text: 'Are you sure you want to delete <code>' + delName + '</code>? There is <strong>no</strong> reversing this action.',
|
||||
html: true,
|
||||
showCancelButton: true,
|
||||
showConfirmButton: true,
|
||||
closeOnConfirm: false,
|
||||
showLoaderOnConfirm: true
|
||||
}, () => {
|
||||
$.ajax({
|
||||
type: 'DELETE',
|
||||
url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/server/file/f/${delPath}${delName}`,
|
||||
headers: {
|
||||
'X-Access-Token': Pterodactyl.server.daemonSecret,
|
||||
'X-Access-Server': Pterodactyl.server.uuid,
|
||||
}
|
||||
}).done(data => {
|
||||
nameBlock.parent().addClass('warning').delay(200).fadeOut();
|
||||
swal({
|
||||
type: 'success',
|
||||
title: 'File Deleted'
|
||||
});
|
||||
}).fail(jqXHR => {
|
||||
console.error(jqXHR);
|
||||
swal({
|
||||
type: 'error',
|
||||
title: 'Whoops!',
|
||||
html: true,
|
||||
text: 'An error occured while attempting to delete this file. Please try again.',
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
decompress() {
|
||||
const nameBlock = $(this.element).find('td[data-identifier="name"]');
|
||||
const compPath = decodeURIComponent(nameBlock.data('path'));
|
||||
const compName = decodeURIComponent(nameBlock.data('name'));
|
||||
|
||||
swal({
|
||||
title: '<i class="fa fa-refresh fa-spin"></i> Decompressing...',
|
||||
text: 'This might take a few seconds to complete.',
|
||||
html: true,
|
||||
allowOutsideClick: false,
|
||||
allowEscapeKey: false,
|
||||
showConfirmButton: false,
|
||||
});
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/server/file/decompress`,
|
||||
headers: {
|
||||
'X-Access-Token': Pterodactyl.server.daemonSecret,
|
||||
'X-Access-Server': Pterodactyl.server.uuid,
|
||||
},
|
||||
contentType: 'application/json; charset=utf-8',
|
||||
data: JSON.stringify({
|
||||
files: `${compPath}${compName}`
|
||||
})
|
||||
}).done(data => {
|
||||
swal.close();
|
||||
Files.list(compPath);
|
||||
}).fail(jqXHR => {
|
||||
console.error(jqXHR);
|
||||
var error = 'An error occured while trying to process this request.';
|
||||
if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {
|
||||
error = jqXHR.responseJSON.error;
|
||||
}
|
||||
swal({
|
||||
type: 'error',
|
||||
title: 'Whoops!',
|
||||
html: true,
|
||||
text: error
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
compress() {
|
||||
const nameBlock = $(this.element).find('td[data-identifier="name"]');
|
||||
const compPath = decodeURIComponent(nameBlock.data('path'));
|
||||
const compName = decodeURIComponent(nameBlock.data('name'));
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/server/file/compress`,
|
||||
headers: {
|
||||
'X-Access-Token': Pterodactyl.server.daemonSecret,
|
||||
'X-Access-Server': Pterodactyl.server.uuid,
|
||||
},
|
||||
contentType: 'application/json; charset=utf-8',
|
||||
data: JSON.stringify({
|
||||
files: `${compPath}${compName}`,
|
||||
to: compPath.toString()
|
||||
})
|
||||
}).done(data => {
|
||||
Files.list(compPath, err => {
|
||||
if (err) return;
|
||||
const fileListing = $('#file_listing').find(`[data-name="${data.saved_as}"]`).parent();
|
||||
fileListing.addClass('success pulsate').delay(3000).queue(() => {
|
||||
fileListing.removeClass('success pulsate').dequeue();
|
||||
});
|
||||
});
|
||||
}).fail(jqXHR => {
|
||||
console.error(jqXHR);
|
||||
var error = 'An error occured while trying to process this request.';
|
||||
if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {
|
||||
error = jqXHR.responseJSON.error;
|
||||
}
|
||||
swal({
|
||||
type: 'error',
|
||||
title: 'Whoops!',
|
||||
html: true,
|
||||
text: error
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
199
public/themes/pterodactyl/js/frontend/files/src/contextmenu.js
Normal file
199
public/themes/pterodactyl/js/frontend/files/src/contextmenu.js
Normal file
@ -0,0 +1,199 @@
|
||||
"use strict";
|
||||
|
||||
// Copyright (c) 2015 - 2016 Dane Everitt <dane@daneeveritt.com>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
class ContextMenuClass {
|
||||
constructor() {
|
||||
this.activeLine = null;
|
||||
}
|
||||
|
||||
run() {
|
||||
this.directoryClick();
|
||||
this.rightClick();
|
||||
}
|
||||
|
||||
makeMenu(parent) {
|
||||
$(document).find('#fileOptionMenu').remove();
|
||||
if (!_.isNull(this.activeLine)) this.activeLine.removeClass('active');
|
||||
|
||||
let newFilePath = $('#headerTableRow').attr('data-currentDir');
|
||||
if (parent.data('type') === 'folder') {
|
||||
const nameBlock = parent.find('td[data-identifier="name"]');
|
||||
const currentName = decodeURIComponent(nameBlock.attr('data-name'));
|
||||
const currentPath = decodeURIComponent(nameBlock.data('path'));
|
||||
newFilePath = `${currentPath}${currentName}`;
|
||||
}
|
||||
|
||||
let buildMenu = '<ul id="fileOptionMenu" class="dropdown-menu" role="menu" style="display:none" >';
|
||||
|
||||
if (Pterodactyl.permissions.moveFiles) {
|
||||
buildMenu += '<li data-action="rename"><a tabindex="-1" href="#"><i class="fa fa-fw fa-pencil-square-o"></i> Rename</a></li> \
|
||||
<li data-action="move"><a tabindex="-1" href="#"><i class="fa fa-fw fa-arrow-right"></i> Move</a></li>';
|
||||
}
|
||||
|
||||
if (Pterodactyl.permissions.copyFiles) {
|
||||
buildMenu += '<li data-action="copy"><a tabindex="-1" href="#"><i class="fa fa-fw fa-clone"></i> Copy</a></li>';
|
||||
}
|
||||
|
||||
if (Pterodactyl.permissions.compressFiles) {
|
||||
buildMenu += '<li data-action="compress" class="hidden"><a tabindex="-1" href="#"><i class="fa fa-fw fa-file-archive-o"></i> Compress</a></li>';
|
||||
}
|
||||
|
||||
if (Pterodactyl.permissions.decompressFiles) {
|
||||
buildMenu += '<li data-action="decompress" class="hidden"><a tabindex="-1" href="#"><i class="fa fa-fw fa-expand"></i> Decompress</a></li>';
|
||||
}
|
||||
|
||||
if (Pterodactyl.permissions.createFiles) {
|
||||
buildMenu += '<li class="divider"></li> \
|
||||
<li data-action="file"><a href="/server/'+ Pterodactyl.server.uuidShort +'/files/add/?dir=' + newFilePath + '" class="text-muted"><i class="fa fa-fw fa-plus"></i> New File</a></li> \
|
||||
<li data-action="folder"><a tabindex="-1" href="#"><i class="fa fa-fw fa-folder"></i> New Folder</a></li>';
|
||||
}
|
||||
|
||||
if (Pterodactyl.permissions.downloadFiles || Pterodactyl.permissions.deleteFiles) {
|
||||
buildMenu += '<li class="divider"></li>';
|
||||
}
|
||||
|
||||
if (Pterodactyl.permissions.downloadFiles) {
|
||||
buildMenu += '<li data-action="download" class="hidden"><a tabindex="-1" href="#"><i class="fa fa-fw fa-download"></i> Download</a></li>';
|
||||
}
|
||||
|
||||
if (Pterodactyl.permissions.deleteFiles) {
|
||||
buildMenu += '<li data-action="delete" class="bg-danger"><a tabindex="-1" href="#"><i class="fa fa-fw fa-trash-o"></i> Delete</a></li>';
|
||||
}
|
||||
|
||||
buildMenu += '</ul>';
|
||||
return buildMenu;
|
||||
}
|
||||
|
||||
rightClick() {
|
||||
$('[data-action="toggleMenu"]').on('mousedown', event => {
|
||||
event.preventDefault();
|
||||
this.showMenu(event);
|
||||
});
|
||||
$('#file_listing > tbody td').on('contextmenu', event => {
|
||||
this.showMenu(event);
|
||||
});
|
||||
}
|
||||
|
||||
showMenu(event) {
|
||||
const parent = $(event.target).closest('tr');
|
||||
const menu = $(this.makeMenu(parent));
|
||||
|
||||
if (parent.data('type') === 'disabled') return;
|
||||
event.preventDefault();
|
||||
|
||||
$(menu).appendTo('body');
|
||||
$(menu).data('invokedOn', $(event.target)).show().css({
|
||||
position: 'absolute',
|
||||
left: event.pageX - 150,
|
||||
top: event.pageY,
|
||||
});
|
||||
|
||||
this.activeLine = parent;
|
||||
this.activeLine.addClass('active');
|
||||
|
||||
// Handle Events
|
||||
const Actions = new ActionsClass(parent, menu);
|
||||
if (Pterodactyl.permissions.moveFiles) {
|
||||
$(menu).find('li[data-action="move"]').unbind().on('click', e => {
|
||||
e.preventDefault();
|
||||
Actions.move();
|
||||
});
|
||||
$(menu).find('li[data-action="rename"]').unbind().on('click', e => {
|
||||
e.preventDefault();
|
||||
Actions.rename();
|
||||
});
|
||||
}
|
||||
|
||||
if (Pterodactyl.permissions.copyFiles) {
|
||||
$(menu).find('li[data-action="copy"]').unbind().on('click', e => {
|
||||
e.preventDefault();
|
||||
Actions.copy();
|
||||
});
|
||||
}
|
||||
|
||||
if (Pterodactyl.permissions.compressFiles) {
|
||||
if (parent.data('type') === 'folder') {
|
||||
$(menu).find('li[data-action="compress"]').removeClass('hidden');
|
||||
}
|
||||
$(menu).find('li[data-action="compress"]').unbind().on('click', e => {
|
||||
e.preventDefault();
|
||||
Actions.compress();
|
||||
});
|
||||
}
|
||||
|
||||
if (Pterodactyl.permissions.decompressFiles) {
|
||||
if (_.without(['application/zip', 'application/gzip', 'application/x-gzip'], parent.data('mime')).length < 3) {
|
||||
$(menu).find('li[data-action="decompress"]').removeClass('hidden');
|
||||
}
|
||||
$(menu).find('li[data-action="decompress"]').unbind().on('click', e => {
|
||||
e.preventDefault();
|
||||
Actions.decompress();
|
||||
});
|
||||
}
|
||||
|
||||
if (Pterodactyl.permissions.createFiles) {
|
||||
$(menu).find('li[data-action="folder"]').unbind().on('click', e => {
|
||||
e.preventDefault();
|
||||
Actions.folder();
|
||||
});
|
||||
}
|
||||
|
||||
if (Pterodactyl.permissions.downloadFiles) {
|
||||
if (parent.data('type') === 'file') {
|
||||
$(menu).find('li[data-action="download"]').removeClass('hidden');
|
||||
}
|
||||
$(menu).find('li[data-action="download"]').unbind().on('click', e => {
|
||||
e.preventDefault();
|
||||
Actions.download();
|
||||
});
|
||||
}
|
||||
|
||||
if (Pterodactyl.permissions.deleteFiles) {
|
||||
$(menu).find('li[data-action="delete"]').unbind().on('click', e => {
|
||||
e.preventDefault();
|
||||
Actions.delete();
|
||||
});
|
||||
}
|
||||
|
||||
$(window).unbind().on('click', event => {
|
||||
if($(event.target).is('.disable-menu-hide')) {
|
||||
event.preventDefault();
|
||||
return;
|
||||
}
|
||||
$(menu).unbind().remove();
|
||||
if(!_.isNull(this.activeLine)) this.activeLine.removeClass('active');
|
||||
});
|
||||
}
|
||||
|
||||
directoryClick() {
|
||||
$('a[data-action="directory-view"]').on('click', function (event) {
|
||||
event.preventDefault();
|
||||
|
||||
const path = $(this).parent().data('path') || '';
|
||||
const name = $(this).parent().data('name') || '';
|
||||
|
||||
window.location.hash = encodeURIComponent(path + name);
|
||||
Files.list();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
window.ContextMenu = new ContextMenuClass;
|
91
public/themes/pterodactyl/js/frontend/files/src/index.js
Normal file
91
public/themes/pterodactyl/js/frontend/files/src/index.js
Normal file
@ -0,0 +1,91 @@
|
||||
"use strict";
|
||||
|
||||
// Copyright (c) 2015 - 2016 Dane Everitt <dane@daneeveritt.com>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
class FileManager {
|
||||
constructor() {
|
||||
this.list(this.decodeHash());
|
||||
}
|
||||
|
||||
list(path, next) {
|
||||
if (_.isUndefined(path)) {
|
||||
path = this.decodeHash();
|
||||
}
|
||||
|
||||
this.loader(true);
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: Pterodactyl.meta.directoryList,
|
||||
headers: {
|
||||
'X-CSRF-Token': Pterodactyl.meta.csrftoken,
|
||||
},
|
||||
data: {
|
||||
directory: path,
|
||||
},
|
||||
}).done(data => {
|
||||
this.loader(false);
|
||||
$('#load_files').slideUp(10).html(data).slideDown(10, () => {
|
||||
ContextMenu.run();
|
||||
this.reloadFilesButton();
|
||||
if (_.isFunction(next)) {
|
||||
return next();
|
||||
}
|
||||
});
|
||||
$('#internal_alert').slideUp();
|
||||
|
||||
if (typeof Siofu === 'object') {
|
||||
Siofu.listenOnInput(document.getElementById("files_touch_target"));
|
||||
}
|
||||
}).fail(jqXHR => {
|
||||
this.loader(false);
|
||||
if (_.isFunction(next)) {
|
||||
return next(new Error('Failed to load file listing.'));
|
||||
}
|
||||
swal({
|
||||
type: 'error',
|
||||
title: 'File Error',
|
||||
text: 'An error occured while attempting to process this request. Please try again.',
|
||||
});
|
||||
console.error(jqXHR);
|
||||
});
|
||||
}
|
||||
|
||||
loader(show) {
|
||||
if (show){
|
||||
$('.file-overlay').fadeIn(100);
|
||||
} else {
|
||||
$('.file-overlay').fadeOut(100);
|
||||
}
|
||||
}
|
||||
|
||||
reloadFilesButton() {
|
||||
$('i[data-action="reload-files"]').unbind().on('click', () => {
|
||||
$('i[data-action="reload-files"]').addClass('fa-spin');
|
||||
this.list();
|
||||
});
|
||||
}
|
||||
|
||||
decodeHash() {
|
||||
return decodeURIComponent(window.location.hash.substring(1));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
window.Files = new FileManager;
|
141
public/themes/pterodactyl/js/frontend/files/upload.js
Normal file
141
public/themes/pterodactyl/js/frontend/files/upload.js
Normal file
@ -0,0 +1,141 @@
|
||||
// Copyright (c) 2015 - 2016 Dane Everitt <dane@daneeveritt.com>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
(function initUploader() {
|
||||
var notifyUploadSocketError = false;
|
||||
uploadSocket = io(Pterodactyl.node.scheme + '://' + Pterodactyl.node.fqdn + ':' + Pterodactyl.node.daemonListen + '/upload/' + Pterodactyl.server.uuid, {
|
||||
'query': 'token=' + Pterodactyl.server.daemonSecret,
|
||||
});
|
||||
|
||||
uploadSocket.io.on('connect_error', function (err) {
|
||||
if(typeof notifyUploadSocketError !== 'object') {
|
||||
notifyUploadSocketError = $.notify({
|
||||
message: 'There was an error attempting to establish a connection to the uploader endpoint.<br /><br />' + err,
|
||||
}, {
|
||||
type: 'danger',
|
||||
delay: 0
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
uploadSocket.on('error', err => {
|
||||
Siofu.destroy();
|
||||
console.error(err);
|
||||
});
|
||||
|
||||
uploadSocket.on('connect', function () {
|
||||
if (notifyUploadSocketError !== false) {
|
||||
notifyUploadSocketError.close();
|
||||
notifyUploadSocketError = false;
|
||||
}
|
||||
});
|
||||
|
||||
window.Siofu = new SocketIOFileUpload(uploadSocket);
|
||||
Siofu.listenOnDrop(document.getElementById("load_files"));
|
||||
|
||||
if (document.getElementById("files_touch_target")) {
|
||||
Siofu.listenOnInput(document.getElementById("files_touch_target"));
|
||||
}
|
||||
|
||||
window.addEventListener('dragover', function (event) {
|
||||
event.preventDefault();
|
||||
}, false);
|
||||
|
||||
window.addEventListener('drop', function (event) {
|
||||
event.preventDefault();
|
||||
}, false);
|
||||
|
||||
var dropCounter = 0;
|
||||
$('#load_files').bind({
|
||||
dragenter: function (event) {
|
||||
event.preventDefault();
|
||||
dropCounter++;
|
||||
$(this).addClass('hasFileHover');
|
||||
},
|
||||
dragleave: function (event) {
|
||||
dropCounter--;
|
||||
if (dropCounter === 0) {
|
||||
$(this).removeClass('hasFileHover');
|
||||
}
|
||||
},
|
||||
drop: function (event) {
|
||||
dropCounter = 0;
|
||||
$(this).removeClass('hasFileHover');
|
||||
}
|
||||
});
|
||||
|
||||
Siofu.addEventListener('start', function (event) {
|
||||
window.onbeforeunload = function () {
|
||||
return 'A file upload in in progress, are you sure you want to continue?';
|
||||
};
|
||||
event.file.meta.path = $('#headerTableRow').attr('data-currentdir');
|
||||
event.file.meta.identifier = Math.random().toString(36).slice(2);
|
||||
|
||||
$('#append_files_to').append('<tr id="file-upload-' + event.file.meta.identifier +'"> \
|
||||
<td><i class="fa fa-file-text-o" style="margin-left: 2px;"></i></td> \
|
||||
<td>' + event.file.name + '</td> \
|
||||
<td colspan=2"> </td> \
|
||||
</tr><tr> \
|
||||
<td colspan="5" class="has-progress"> \
|
||||
<div class="progress progress-table-bottom active"> \
|
||||
<div class="progress-bar progress-bar-info prog-bar-' + event.file.meta.identifier +'" style="width: 0%"></div> \
|
||||
</div> \
|
||||
</td> \
|
||||
</tr>\
|
||||
');
|
||||
});
|
||||
|
||||
Siofu.addEventListener('progress', function(event) {
|
||||
window.onbeforeunload = function () {
|
||||
return 'A file upload in in progress, are you sure you want to continue?';
|
||||
};
|
||||
var percent = event.bytesLoaded / event.file.size * 100;
|
||||
if (percent >= 100) {
|
||||
$('.prog-bar-' + event.file.meta.identifier).css('width', '100%').removeClass('progress-bar-info').addClass('progress-bar-success').parent().removeClass('active');
|
||||
} else {
|
||||
$('.prog-bar-' + event.file.meta.identifier).css('width', percent + '%');
|
||||
}
|
||||
});
|
||||
|
||||
// Do something when a file is uploaded:
|
||||
Siofu.addEventListener('complete', function(event) {
|
||||
window.onbeforeunload = function () {};
|
||||
if (!event.success) {
|
||||
$('.prog-bar-' + event.file.meta.identifier).css('width', '100%').removeClass('progress-bar-info').addClass('progress-bar-danger');
|
||||
$.notify({
|
||||
message: 'An error was encountered while attempting to upload this file.'
|
||||
}, {
|
||||
type: 'danger',
|
||||
delay: 5000
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
Siofu.addEventListener('error', function(event) {
|
||||
window.onbeforeunload = function () {};
|
||||
console.error(event);
|
||||
$('.prog-bar-' + event.file.meta.identifier).css('width', '100%').removeClass('progress-bar-info').addClass('progress-bar-danger');
|
||||
$.notify({
|
||||
message: 'An error was encountered while attempting to upload this file: <strong>' + event.message + '.</strong>',
|
||||
}, {
|
||||
type: 'danger',
|
||||
delay: 8000
|
||||
});
|
||||
});
|
||||
})();
|
99
public/themes/pterodactyl/js/frontend/server.socket.js
Normal file
99
public/themes/pterodactyl/js/frontend/server.socket.js
Normal file
@ -0,0 +1,99 @@
|
||||
// Copyright (c) 2015 - 2016 Dane Everitt <dane@daneeveritt.com>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
(function initSocket() {
|
||||
if (typeof $.notifyDefaults !== 'function') {
|
||||
console.error('Notify does not appear to be loaded.');
|
||||
return;
|
||||
}
|
||||
|
||||
if (typeof io !== 'function') {
|
||||
console.error('Socket.io is reqired to use this panel.');
|
||||
return;
|
||||
}
|
||||
|
||||
$.notifyDefaults({
|
||||
placement: {
|
||||
from: 'bottom',
|
||||
align: 'right'
|
||||
},
|
||||
newest_on_top: true,
|
||||
delay: 2000,
|
||||
animate: {
|
||||
enter: 'animated zoomInDown',
|
||||
exit: 'animated zoomOutDown'
|
||||
}
|
||||
});
|
||||
|
||||
var notifySocketError = false;
|
||||
|
||||
window.Socket = io(Pterodactyl.node.scheme + '://' + Pterodactyl.node.fqdn + ':' + Pterodactyl.node.daemonListen + '/ws/' + Pterodactyl.server.uuid, {
|
||||
'query': 'token=' + Pterodactyl.server.daemonSecret,
|
||||
});
|
||||
|
||||
Socket.io.on('connect_error', function (err) {
|
||||
if(typeof notifySocketError !== 'object') {
|
||||
notifySocketError = $.notify({
|
||||
message: 'There was an error attempting to establish a WebSocket connection to the Daemon. This panel will not work as expected.<br /><br />' + err,
|
||||
}, {
|
||||
type: 'danger',
|
||||
delay: 0
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Connected to Socket Successfully
|
||||
Socket.on('connect', function () {
|
||||
if (notifySocketError !== false) {
|
||||
notifySocketError.close();
|
||||
notifySocketError = false;
|
||||
}
|
||||
});
|
||||
|
||||
Socket.on('initial status', function (data) {
|
||||
setStatusIcon(data.status);
|
||||
});
|
||||
|
||||
Socket.on('status', function (data) {
|
||||
setStatusIcon(data.status);
|
||||
});
|
||||
|
||||
Socket.on('console', function (data) {
|
||||
TerminalQueue.push(data.line);
|
||||
});
|
||||
})();
|
||||
|
||||
function setStatusIcon(status) {
|
||||
switch (status) {
|
||||
case 0:
|
||||
$('#server_status_icon').html('<i class="fa fa-circle text-danger"></i> Offline');
|
||||
break;
|
||||
case 1:
|
||||
$('#server_status_icon').html('<i class="fa fa-circle text-success"></i> Online');
|
||||
break;
|
||||
case 2:
|
||||
$('#server_status_icon').html('<i class="fa fa-circle text-warning"></i> Starting');
|
||||
break;
|
||||
case 3:
|
||||
$('#server_status_icon').html('<i class="fa fa-circle text-warning"></i> Stopping');
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
75
public/themes/pterodactyl/js/frontend/serverlist.js
Normal file
75
public/themes/pterodactyl/js/frontend/serverlist.js
Normal file
@ -0,0 +1,75 @@
|
||||
// Copyright (c) 2015 - 2016 Dane Everitt <dane@daneeveritt.com>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
var Status = {
|
||||
0: 'Offline',
|
||||
1: 'Online',
|
||||
2: 'Starting',
|
||||
3: 'Stopping'
|
||||
};
|
||||
|
||||
(function updateServerStatus () {
|
||||
$('.dynamic-update').each(function (index, data) {
|
||||
var element = $(this);
|
||||
var serverShortUUID = $(this).data('server');
|
||||
$.ajax({
|
||||
type: 'GET',
|
||||
url: Router.route('server.ajax.status', { server: serverShortUUID }),
|
||||
timeout: 5000,
|
||||
headers: {
|
||||
'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content'),
|
||||
}
|
||||
}).done(function (data) {
|
||||
if (typeof data.status === 'undefined') {
|
||||
element.find('[data-action="status"]').html('<span class="label label-default">Error</span>');
|
||||
return;
|
||||
}
|
||||
switch (data.status) {
|
||||
case 0:
|
||||
element.find('[data-action="status"]').html('<span class="label label-danger">Offline</span>');
|
||||
break;
|
||||
case 1:
|
||||
element.find('[data-action="status"]').html('<span class="label label-success">Online</span>');
|
||||
break;
|
||||
case 2:
|
||||
element.find('[data-action="status"]').html('<span class="label label-info">Starting</span>');
|
||||
break;
|
||||
case 3:
|
||||
element.find('[data-action="status"]').html('<span class="label label-info">Stopping</span>');
|
||||
break;
|
||||
}
|
||||
if (data.status !== 0) {
|
||||
var cpuMax = element.find('[data-action="cpu"]').data('cpumax');
|
||||
var currentCpu = data.proc.cpu.total;
|
||||
if (cpuMax !== 0) {
|
||||
currentCpu = parseFloat(((data.proc.cpu.total / cpuMax) * 100).toFixed(2).toString());
|
||||
}
|
||||
element.find('[data-action="memory"]').html(parseInt(data.proc.memory.total / (1024 * 1024)));
|
||||
element.find('[data-action="cpu"]').html(currentCpu);
|
||||
} else {
|
||||
element.find('[data-action="memory"]').html('--');
|
||||
element.find('[data-action="cpu"]').html('--');
|
||||
}
|
||||
}).fail(function (jqXHR) {
|
||||
console.error(jqXHR);
|
||||
element.find('[data-action="status"]').html('<span class="label label-default">Error</span>');
|
||||
});
|
||||
});
|
||||
setTimeout(updateServerStatus, 10000);
|
||||
})();
|
102
public/themes/pterodactyl/js/frontend/tasks.js
Normal file
102
public/themes/pterodactyl/js/frontend/tasks.js
Normal file
@ -0,0 +1,102 @@
|
||||
// Copyright (c) 2015 - 2016 Dane Everitt <dane@daneeveritt.com>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
(function initTaskFunctions() {
|
||||
$('[data-action="delete-task"]').click(function (event) {
|
||||
var self = $(this);
|
||||
swal({
|
||||
type: 'error',
|
||||
title: 'Delete Task?',
|
||||
text: 'Are you sure you want to delete this task? There is no undo.',
|
||||
showCancelButton: true,
|
||||
allowOutsideClick: true,
|
||||
closeOnConfirm: false,
|
||||
confirmButtonText: 'Delete Task',
|
||||
confirmButtonColor: '#d9534f',
|
||||
showLoaderOnConfirm: true
|
||||
}, function () {
|
||||
$.ajax({
|
||||
method: 'DELETE',
|
||||
url: Router.route('server.tasks.delete', {
|
||||
server: Pterodactyl.server.uuidShort,
|
||||
id: self.data('id'),
|
||||
}),
|
||||
headers: {
|
||||
'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content'),
|
||||
}
|
||||
}).done(function (data) {
|
||||
swal({
|
||||
type: 'success',
|
||||
title: '',
|
||||
text: 'Task has been deleted.'
|
||||
});
|
||||
self.parent().parent().slideUp();
|
||||
}).fail(function (jqXHR) {
|
||||
console.error(jqXHR);
|
||||
swal({
|
||||
type: 'error',
|
||||
title: 'Whoops!',
|
||||
text: 'An error occured while attempting to delete this task.'
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
$('[data-action="toggle-task"]').click(function (event) {
|
||||
var self = $(this);
|
||||
swal({
|
||||
type: 'info',
|
||||
title: 'Toggle Task',
|
||||
text: 'This will toggle the selected task.',
|
||||
showCancelButton: true,
|
||||
allowOutsideClick: true,
|
||||
closeOnConfirm: false,
|
||||
confirmButtonText: 'Continue',
|
||||
showLoaderOnConfirm: true
|
||||
}, function () {
|
||||
$.ajax({
|
||||
method: 'POST',
|
||||
url: Router.route('server.tasks.toggle', {
|
||||
server: Pterodactyl.server.uuidShort,
|
||||
id: self.data('id'),
|
||||
}),
|
||||
headers: {
|
||||
'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content'),
|
||||
}
|
||||
}).done(function (data) {
|
||||
swal({
|
||||
type: 'success',
|
||||
title: '',
|
||||
text: 'Task has been toggled.'
|
||||
});
|
||||
if (data.status !== 1) {
|
||||
self.parent().parent().addClass('muted muted-hover');
|
||||
} else {
|
||||
self.parent().parent().removeClass('muted muted-hover');
|
||||
}
|
||||
}).fail(function (jqXHR) {
|
||||
console.error(jqXHR);
|
||||
swal({
|
||||
type: 'error',
|
||||
title: 'Whoops!',
|
||||
text: 'An error occured while attempting to toggle this task.'
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
})();
|
7
public/themes/pterodactyl/vendor/adminlte/admin.min.css
vendored
Executable file
7
public/themes/pterodactyl/vendor/adminlte/admin.min.css
vendored
Executable file
File diff suppressed because one or more lines are too long
13
public/themes/pterodactyl/vendor/adminlte/app.min.js
vendored
Executable file
13
public/themes/pterodactyl/vendor/adminlte/app.min.js
vendored
Executable file
File diff suppressed because one or more lines are too long
1
public/themes/pterodactyl/vendor/adminlte/colors/skin-blue-light.min.css
vendored
Executable file
1
public/themes/pterodactyl/vendor/adminlte/colors/skin-blue-light.min.css
vendored
Executable file
@ -0,0 +1 @@
|
||||
.skin-blue-light .main-header .navbar{background-color:#3c8dbc}.skin-blue-light .main-header .navbar .nav>li>a{color:#fff}.skin-blue-light .main-header .navbar .nav>li>a:hover,.skin-blue-light .main-header .navbar .nav>li>a:active,.skin-blue-light .main-header .navbar .nav>li>a:focus,.skin-blue-light .main-header .navbar .nav .open>a,.skin-blue-light .main-header .navbar .nav .open>a:hover,.skin-blue-light .main-header .navbar .nav .open>a:focus,.skin-blue-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue-light .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue-light .main-header .logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue-light .main-header .logo:hover{background-color:#3b8ab8}.skin-blue-light .main-header li.user-header{background-color:#3c8dbc}.skin-blue-light .content-header{background:transparent}.skin-blue-light .wrapper,.skin-blue-light .main-sidebar,.skin-blue-light .left-side{background-color:#f9fafc}.skin-blue-light .content-wrapper,.skin-blue-light .main-footer{border-left:1px solid #d2d6de}.skin-blue-light .user-panel>.info,.skin-blue-light .user-panel>.info>a{color:#444}.skin-blue-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-blue-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-blue-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-blue-light .sidebar-menu>li:hover>a,.skin-blue-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-blue-light .sidebar-menu>li.active{border-left-color:#3c8dbc}.skin-blue-light .sidebar-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-blue-light .sidebar a{color:#444}.skin-blue-light .sidebar a:hover{text-decoration:none}.skin-blue-light .treeview-menu>li>a{color:#777}.skin-blue-light .treeview-menu>li.active>a,.skin-blue-light .treeview-menu>li>a:hover{color:#000}.skin-blue-light .treeview-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-blue-light .sidebar-form input[type="text"],.skin-blue-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-blue-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue-light .sidebar-form input[type="text"]:focus,.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-blue-light .main-footer{border-top-color:#d2d6de}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8}
|
1
public/themes/pterodactyl/vendor/adminlte/colors/skin-blue.min.css
vendored
Executable file
1
public/themes/pterodactyl/vendor/adminlte/colors/skin-blue.min.css
vendored
Executable file
@ -0,0 +1 @@
|
||||
.skin-blue .main-header .navbar{background-color:#3c8dbc}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav>li>a:hover,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue .main-header .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent}.skin-blue .main-header .logo:hover{background-color:#357ca5}.skin-blue .main-header li.user-header{background-color:#3c8dbc}.skin-blue .content-header{background:transparent}.skin-blue .wrapper,.skin-blue .main-sidebar,.skin-blue .left-side{background-color:#222d32}.skin-blue .user-panel>.info,.skin-blue .user-panel>.info>a{color:#fff}.skin-blue .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-blue .sidebar-menu>li>a{border-left:3px solid transparent}.skin-blue .sidebar-menu>li:hover>a,.skin-blue .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#3c8dbc}.skin-blue .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-blue .sidebar a{color:#b8c7ce}.skin-blue .sidebar a:hover{text-decoration:none}.skin-blue .treeview-menu>li>a{color:#8aa4af}.skin-blue .treeview-menu>li.active>a,.skin-blue .treeview-menu>li>a:hover{color:#fff}.skin-blue .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-blue .sidebar-form input[type="text"],.skin-blue .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-blue .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue .sidebar-form input[type="text"]:focus,.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8}
|
7
public/themes/pterodactyl/vendor/animate/animate.min.css
vendored
Normal file
7
public/themes/pterodactyl/vendor/animate/animate.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
2
public/themes/pterodactyl/vendor/bootstrap-notify/bootstrap-notify.min.js
vendored
Normal file
2
public/themes/pterodactyl/vendor/bootstrap-notify/bootstrap-notify.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
6
public/themes/pterodactyl/vendor/bootstrap/bootstrap-theme.min.css
vendored
Executable file
6
public/themes/pterodactyl/vendor/bootstrap/bootstrap-theme.min.css
vendored
Executable file
File diff suppressed because one or more lines are too long
1
public/themes/pterodactyl/vendor/bootstrap/bootstrap-theme.min.css.map
vendored
Executable file
1
public/themes/pterodactyl/vendor/bootstrap/bootstrap-theme.min.css.map
vendored
Executable file
File diff suppressed because one or more lines are too long
6
public/themes/pterodactyl/vendor/bootstrap/bootstrap.min.css
vendored
Executable file
6
public/themes/pterodactyl/vendor/bootstrap/bootstrap.min.css
vendored
Executable file
File diff suppressed because one or more lines are too long
1
public/themes/pterodactyl/vendor/bootstrap/bootstrap.min.css.map
vendored
Executable file
1
public/themes/pterodactyl/vendor/bootstrap/bootstrap.min.css.map
vendored
Executable file
File diff suppressed because one or more lines are too long
7
public/themes/pterodactyl/vendor/bootstrap/bootstrap.min.js
vendored
Executable file
7
public/themes/pterodactyl/vendor/bootstrap/bootstrap.min.js
vendored
Executable file
File diff suppressed because one or more lines are too long
3
public/themes/pterodactyl/vendor/select2/select2.full.min.js
vendored
Executable file
3
public/themes/pterodactyl/vendor/select2/select2.full.min.js
vendored
Executable file
File diff suppressed because one or more lines are too long
1
public/themes/pterodactyl/vendor/select2/select2.min.css
vendored
Executable file
1
public/themes/pterodactyl/vendor/select2/select2.min.css
vendored
Executable file
File diff suppressed because one or more lines are too long
15
public/themes/pterodactyl/vendor/siofu/client.min.js
vendored
Executable file
15
public/themes/pterodactyl/vendor/siofu/client.min.js
vendored
Executable file
@ -0,0 +1,15 @@
|
||||
/* Socket IO File Upload Client-Side Library
|
||||
* Copyright (C) 2015 Shane Carr and others
|
||||
* Released under the X11 License
|
||||
* For more information, visit: https://github.com/vote539/socketio-file-upload
|
||||
*/
|
||||
(function(g,d,f){"function"===typeof define&&define.amd?define([],f):"object"===typeof module&&module.exports?module.exports=f():g[d]=f()})(this,"SocketIOFileUpload",function(){return function(g){var d=this;if(!window.File||!window.FileReader)throw Error("Socket.IO File Upload: Browser Not Supported");window.siofu_global||(window.siofu_global={instances:0,downloads:0});var f={},p={},y={},q={},h={};d.fileInputElementId="siofu_input_"+siofu_global.instances++;d.resetFileInputs=!0;d.useText=!1;d.serializedOctets=
|
||||
!1;d.useBuffer=!0;d.chunkSize=102400;var t=function(a,b){var c=document.createEvent("Event");c.initEvent(a,!1,!1);for(var v in b)b.hasOwnProperty(v)&&(c[v]=b[v]);return d.dispatchEvent(c)},r=[],e=function(a,b,c,d){a.addEventListener(b,c,d);r.push(arguments)},z=function(a,b,c,d){a.removeEventListener&&a.removeEventListener(b,c,d)},B=function(){for(var a=r.length-1;0<=a;a--)z.apply(this,r[a]);r=[]},C=function(a){if(null!==d.maxFileSize&&a.size>d.maxFileSize)t("error",{file:a,message:"Attempt by client to upload file exceeding the maximum file size",
|
||||
code:1});else if(t("start",{file:a})){var b=new FileReader,c=siofu_global.downloads++,f=!1,h=d.useText,w=0,r;b._realReader&&(b=b._realReader);p[c]=a;var u={id:c},x=d.chunkSize;if(x>=a.size||0>=x)x=a.size;var n=function(){if(!u.abort){var c=a.slice(w,Math.min(w+x,a.size));h?b.readAsText(c):b.readAsArrayBuffer(c)}},A=function(e){if(!u.abort){var v=Math.min(w+x,a.size);a:{var p=w;e=e.target.result;var n=!1;if(!h)try{var l=new Uint8Array(e);if(d.serializedOctets)e=l;else if(d.useBuffer)e=l.buffer;else{var n=
|
||||
!0,m,q=l.buffer.byteLength,k="";for(m=0;m<q;m+=3)k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[l[m]>>2],k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(l[m]&3)<<4|l[m+1]>>4],k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(l[m+1]&15)<<2|l[m+2]>>6],k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[l[m+2]&63];2===q%3?k=k.substring(0,k.length-1)+"=":1===q%3&&(k=k.substring(0,k.length-2)+"==");e=k}}catch(E){g.emit("siofu_done",
|
||||
{id:c,interrupt:!0});break a}g.emit("siofu_progress",{id:c,size:a.size,start:p,end:v,content:e,base64:n})}t("progress",{file:a,bytesLoaded:v,name:r});w+=x;w>=a.size&&(g.emit("siofu_done",{id:c}),t("load",{file:a,reader:b,name:r}),f=!0)}};e(b,"load",A);e(b,"error",function(){g.emit("siofu_done",{id:c,interrupt:!0});z(b,"load",A)});e(b,"abort",function(){g.emit("siofu_done",{id:c,interrupt:!0});z(b,"load",A)});g.emit("siofu_start",{name:a.name,mtime:a.lastModified,meta:a.meta,size:a.size,encoding:h?
|
||||
"text":"octet",id:c});q[c]=function(a){r=a;n()};y[c]=function(){f||n()};return u}},u=function(a){if(0!==a.length){for(var b=0;b<a.length;b++)a[b].meta||(a[b].meta={});if(t("choose",{files:a}))for(b=0;b<a.length;b++){var c=C(a[b]);h[c.id]=c}}},n=function(a){var b=a.target.files||a.dataTransfer.files;a.preventDefault();u(b);if(d.resetFileInputs){try{a.target.value=""}catch(D){}if(a.target.value){var b=document.createElement("form"),c=a.target.parentNode,e=a.target.nextSibling;b.appendChild(a.target);
|
||||
b.reset();c.insertBefore(a.target,e)}}};this.submitFiles=function(a){a&&u(a)};this.listenOnSubmit=function(a,b){b.files&&e(a,"click",function(){u(b.files)},!1)};this.listenOnArraySubmit=function(a,b){for(var c in b)this.listenOnSubmit(a,b[c])};this.listenOnInput=function(a){a.files&&e(a,"change",n,!1)};this.listenOnDrop=function(a){e(a,"dragover",function(a){a.preventDefault()},!1);e(a,"drop",n)};this.prompt=function(){var a;a=document.getElementById(d.fileInputElementId);a||(a=document.createElement("input"),
|
||||
a.setAttribute("type","file"),a.setAttribute("id",d.fileInputElementId),a.style.display="none",document.body.appendChild(a));e(a,"change",n,!1);var b=document.createEvent("MouseEvents");b.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null);a.dispatchEvent(b)};this.destroy=function(){B();var a=document.getElementById(d.fileInputElementId);a&&a.parentNode.removeChild(a);for(var b in h)h.hasOwnProperty(b)&&(h[b].abort=!0);h=q=p=f=null};this.addEventListener=function(a,b){f[a]||(f[a]=[]);
|
||||
f[a].push(b)};this.removeEventListener=function(a,b){if(!f[a])return!1;for(var c=0;c<f[a].length;c++)if(f[a][c]===b)return f[a].splice(c,1),!0;return!1};this.dispatchEvent=function(a){var b=f[a.type];if(!b)return!0;for(var c=!0,d=0;d<b.length;d++)!1===b[d](a)&&(c=!1);return c};e(g,"siofu_chunk",function(a){if(y[a.id])y[a.id]()});e(g,"siofu_ready",function(a){if(q[a.id])q[a.id](a.name)});e(g,"siofu_complete",function(a){p[a.id]&&t("complete",{file:p[a.id],detail:a.detail,success:a.success})});e(g,
|
||||
"siofu_error",function(a){p[a.id]&&(t("error",{file:p[a.id],message:a.message,code:0}),h&&(h[a.id].abort=!0))})}});
|
16
public/themes/pterodactyl/vendor/slimscroll/jquery.slimscroll.min.js
vendored
Executable file
16
public/themes/pterodactyl/vendor/slimscroll/jquery.slimscroll.min.js
vendored
Executable file
@ -0,0 +1,16 @@
|
||||
/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la)
|
||||
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
|
||||
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
|
||||
*
|
||||
* Version: 1.3.8
|
||||
*
|
||||
*/
|
||||
(function(e){e.fn.extend({slimScroll:function(f){var a=e.extend({width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:.2,railDraggable:!0,railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,wheelStep:20,touchScrollStep:200,borderRadius:"7px",railBorderRadius:"7px"},f);this.each(function(){function v(d){if(r){d=d||window.event;
|
||||
var c=0;d.wheelDelta&&(c=-d.wheelDelta/120);d.detail&&(c=d.detail/3);e(d.target||d.srcTarget||d.srcElement).closest("."+a.wrapperClass).is(b.parent())&&n(c,!0);d.preventDefault&&!k&&d.preventDefault();k||(d.returnValue=!1)}}function n(d,g,e){k=!1;var f=b.outerHeight()-c.outerHeight();g&&(g=parseInt(c.css("top"))+d*parseInt(a.wheelStep)/100*c.outerHeight(),g=Math.min(Math.max(g,0),f),g=0<d?Math.ceil(g):Math.floor(g),c.css({top:g+"px"}));l=parseInt(c.css("top"))/(b.outerHeight()-c.outerHeight());g=
|
||||
l*(b[0].scrollHeight-b.outerHeight());e&&(g=d,d=g/b[0].scrollHeight*b.outerHeight(),d=Math.min(Math.max(d,0),f),c.css({top:d+"px"}));b.scrollTop(g);b.trigger("slimscrolling",~~g);w();p()}function x(){u=Math.max(b.outerHeight()/b[0].scrollHeight*b.outerHeight(),30);c.css({height:u+"px"});var a=u==b.outerHeight()?"none":"block";c.css({display:a})}function w(){x();clearTimeout(B);l==~~l?(k=a.allowPageScroll,C!=l&&b.trigger("slimscroll",0==~~l?"top":"bottom")):k=!1;C=l;u>=b.outerHeight()?k=!0:(c.stop(!0,
|
||||
!0).fadeIn("fast"),a.railVisible&&m.stop(!0,!0).fadeIn("fast"))}function p(){a.alwaysVisible||(B=setTimeout(function(){a.disableFadeOut&&r||y||z||(c.fadeOut("slow"),m.fadeOut("slow"))},1E3))}var r,y,z,B,A,u,l,C,k=!1,b=e(this);if(b.parent().hasClass(a.wrapperClass)){var q=b.scrollTop(),c=b.siblings("."+a.barClass),m=b.siblings("."+a.railClass);x();if(e.isPlainObject(f)){if("height"in f&&"auto"==f.height){b.parent().css("height","auto");b.css("height","auto");var h=b.parent().parent().height();b.parent().css("height",
|
||||
h);b.css("height",h)}else"height"in f&&(h=f.height,b.parent().css("height",h),b.css("height",h));if("scrollTo"in f)q=parseInt(a.scrollTo);else if("scrollBy"in f)q+=parseInt(a.scrollBy);else if("destroy"in f){c.remove();m.remove();b.unwrap();return}n(q,!1,!0)}}else if(!(e.isPlainObject(f)&&"destroy"in f)){a.height="auto"==a.height?b.parent().height():a.height;q=e("<div></div>").addClass(a.wrapperClass).css({position:"relative",overflow:"hidden",width:a.width,height:a.height});b.css({overflow:"hidden",
|
||||
width:a.width,height:a.height});var m=e("<div></div>").addClass(a.railClass).css({width:a.size,height:"100%",position:"absolute",top:0,display:a.alwaysVisible&&a.railVisible?"block":"none","border-radius":a.railBorderRadius,background:a.railColor,opacity:a.railOpacity,zIndex:90}),c=e("<div></div>").addClass(a.barClass).css({background:a.color,width:a.size,position:"absolute",top:0,opacity:a.opacity,display:a.alwaysVisible?"block":"none","border-radius":a.borderRadius,BorderRadius:a.borderRadius,MozBorderRadius:a.borderRadius,
|
||||
WebkitBorderRadius:a.borderRadius,zIndex:99}),h="right"==a.position?{right:a.distance}:{left:a.distance};m.css(h);c.css(h);b.wrap(q);b.parent().append(c);b.parent().append(m);a.railDraggable&&c.bind("mousedown",function(a){var b=e(document);z=!0;t=parseFloat(c.css("top"));pageY=a.pageY;b.bind("mousemove.slimscroll",function(a){currTop=t+a.pageY-pageY;c.css("top",currTop);n(0,c.position().top,!1)});b.bind("mouseup.slimscroll",function(a){z=!1;p();b.unbind(".slimscroll")});return!1}).bind("selectstart.slimscroll",
|
||||
function(a){a.stopPropagation();a.preventDefault();return!1});m.hover(function(){w()},function(){p()});c.hover(function(){y=!0},function(){y=!1});b.hover(function(){r=!0;w();p()},function(){r=!1;p()});b.bind("touchstart",function(a,b){a.originalEvent.touches.length&&(A=a.originalEvent.touches[0].pageY)});b.bind("touchmove",function(b){k||b.originalEvent.preventDefault();b.originalEvent.touches.length&&(n((A-b.originalEvent.touches[0].pageY)/a.touchScrollStep,!0),A=b.originalEvent.touches[0].pageY)});
|
||||
x();"bottom"===a.start?(c.css({top:b.outerHeight()-c.outerHeight()}),n(0,!0)):"top"!==a.start&&(n(e(a.start).position().top,null,!0),a.alwaysVisible||c.hide());window.addEventListener?(this.addEventListener("DOMMouseScroll",v,!1),this.addEventListener("mousewheel",v,!1)):document.attachEvent("onmousewheel",v)}});return this}});e.fn.extend({slimscroll:e.fn.slimScroll})})(jQuery);
|
25
public/themes/pterodactyl/vendor/sweetalert/sweetalert.min.css
vendored
Normal file
25
public/themes/pterodactyl/vendor/sweetalert/sweetalert.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
21
public/themes/pterodactyl/vendor/sweetalert/sweetalert.min.js
vendored
Normal file
21
public/themes/pterodactyl/vendor/sweetalert/sweetalert.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -1,13 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'confirmpassword' => 'Passwort bestätigen',
|
||||
'emailsent' => 'Die E-Mail mit dem Rücksetzungslink ist unterwegs.',
|
||||
'errorencountered' => 'Während der Anfrage ist ein Fehler aufgetreten.',
|
||||
'failed' => 'Die Zugangsdaten sind ungültig.',
|
||||
'remeberme' => 'Angemeldet bleiben',
|
||||
'resetpassword' => 'Passwort zurücksetzen',
|
||||
'sendlink' => 'Passwort Rücksetzungslink anfordern.',
|
||||
'throttle' => 'Zu viele Loginversuche. Bitte in :seconds Sekunden erneut versuchen.',
|
||||
'totp_failed' => 'Das TOTP Token ist ungültig. Bitte stelle sicher dass das generierte Token gültig ist.',
|
||||
];
|
@ -1,31 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'account' => [
|
||||
'delete_user' => 'Benutzer löschen',
|
||||
'email_password' => 'Email Passwort',
|
||||
'new_email' => 'Neue Email',
|
||||
'new_password' => 'Neues Passwort',
|
||||
'totp_apps' => 'Du benötigst eine TOTP unterstützende App (z.B. Google Authenticator, DUO Mobile, Authy, Enpass) um diese Option zu nutzen.',
|
||||
'totp_checkpoint_help' => 'Bitte verifiziere deine TOTP Einstellungen indem du den QR Code mit einer App auf deinem Smartphone scannst und gebe die 6 Stellige Nummer im Eingabefeld unten ein. Drücke die Eingabetaste wenn du fertig bist.',
|
||||
'totp_disable' => 'Deaktiviere Zwei-Faktor Authentifizierung',
|
||||
'totp_disable_help' => 'Um Zwei-Faktor Authentifizierung zu deaktiveren musst du ein gültiges TOTP Token eingeben. Danach wird Zwei-Faktor Authentifizierung deaktivert.',
|
||||
'totp_enable' => 'Aktiviere Zwei-Faktor Authentifizierung',
|
||||
'totp_enabled' => 'Zwei-Faktor Authentifizierung wurde erfolgreich aktiviert. Bitte schließe dieses Popup um den Vorgang abzuschließen.',
|
||||
'totp_enabled_error' => 'Das angegebene TOTP Token konnte nicht verifiziert werden. Bitte versuche es noch einmal.',
|
||||
'totp_enable_help' => 'Anscheinend hast du Zwei-Faktor Authentifizierung deaktiviert. Diese Authentifizierungsmethode schützt dein Konto zusätzlich vor unauthorisierten Zugriffen. Wenn du es aktivierst wirst du bei jedem Login dazu aufgefordert ein TOTP Token einzugeben bevor du dich einloggen kannst. Dieses Token kann mit einem Smartphone oder anderen TOTP unterstützenden Gerät erzeugt werden.',
|
||||
'totp_header' => 'Zwei-Faktor Authentifizierung',
|
||||
'totp_qr' => 'TOTP QR Code',
|
||||
'totp_token' => 'TOTP Token',
|
||||
'update_email' => 'Email aktualisieren',
|
||||
'update_pass' => 'Passwort aktualisieren',
|
||||
'update_user' => 'Benutzer aktualisieren',
|
||||
],
|
||||
'confirm' => 'Bist du sicher?',
|
||||
'form_error' => 'Folgende Fehler wurden beim Verarbeiten der Anfrage festgestellt.',
|
||||
'no_servers' => 'Aktuell hast du keinen Zugriff auf irgendwelche server.',
|
||||
'password_req' => 'Passwörter müssen folgende Anforderungen erfüllen: mindestens ein Klein- und Großbuchstabe, eine Ziffer und eine Länge von mindestens 8 Zeichen.',
|
||||
'server_name' => 'Server Name',
|
||||
'validation_error' => 'Beim validieren der Daten ist ein Fehler aufgetreten:',
|
||||
'view_as_admin' => 'Du siehst die Serverliste als Administrator. Daher werden alle registrierten Server angezeigt. Server deren Eigentümer du bist sind mit einem blauen Punkt links neben dem Namen markiert.',
|
||||
];
|
@ -1,17 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'next' => 'Nächste »',
|
||||
'previous' => '« Vorherige',
|
||||
'sidebar' => [
|
||||
'account_controls' => 'Account Verwaltung',
|
||||
'account_security' => 'Account Sicherheit',
|
||||
'account_settings' => 'Account Einstellungen',
|
||||
'files' => 'Datei Manager',
|
||||
'manage' => 'Server verwalten',
|
||||
'overview' => 'Server Übersicht',
|
||||
'servers' => 'Deine Server',
|
||||
'server_controls' => 'Server Verwaltung',
|
||||
'subusers' => 'Sub-Benutzer verwalten',
|
||||
],
|
||||
];
|
@ -1,9 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'password' => 'Dein Passwort muss länger als 6 Zeichen sein und mit der Wiederolung übereinstimmen.',
|
||||
'reset' => 'Dein Passwort wurde zurückgesetzt!',
|
||||
'sent' => 'Du erhältst eine E-Mail mit dem Zurücksetzungslink!',
|
||||
'token' => 'Dieses Paswortrücksetzungstoken ist ungültig.',
|
||||
'user' => 'Wir können keinen Nutzer mit dieser Email Adresse finden.',
|
||||
];
|
@ -1,29 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'ajax' => [
|
||||
'socket_error' => 'Wir konnten uns nicht zum Socket.IO server verbinden. Möglicherweise bestehen Netzwerkprobleme. Das Panel funktioniert unter Umständen nicht wie erwartet.',
|
||||
'socket_status' => 'Der status dieses Servers hat sich geändert zu:',
|
||||
'socket_status_crashed' => 'Dieser Server wurde als ABGESTÜRZT erkannt.',
|
||||
],
|
||||
'files' => [
|
||||
'back' => 'Zurück zum Dateimanager',
|
||||
'loading' => 'Lade Dateibaum, das könnte ein paar Sekunden dauern...',
|
||||
'saved' => 'Datei erfolgreich gespeichert.',
|
||||
'yaml_notice' => 'Du bearbeitest gearde eine YAML Datei. Diese Dateien benötigen Leerzeichen. Wir haben dafür gesorgt dass Tabs automatisch durch :dropdown Leerzeichen ersetzt werden.',
|
||||
],
|
||||
'index' => [
|
||||
'add_new' => 'Neuen Server hinzufügen',
|
||||
'allocation' => 'Zuweisung',
|
||||
'command' => 'Konsolenbefehl eingeben',
|
||||
'connection' => 'Standardverbindung',
|
||||
'control' => 'Systemsteuerung',
|
||||
'cpu_use' => 'CPU Verbrauch',
|
||||
'disk_space' => 'Festplattenspeicher',
|
||||
'memory_use' => 'Speicherverbrauch',
|
||||
'mem_limit' => 'Speichergrenze',
|
||||
'server_info' => 'Server Information',
|
||||
'usage' => 'Verbrauch',
|
||||
'xaxis' => 'Zeit (2s Abstand)',
|
||||
],
|
||||
];
|
@ -1,30 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'again' => 'wiederholen',
|
||||
'close' => 'Schließen',
|
||||
'connection' => 'Verbindung',
|
||||
'cpu' => 'CPU',
|
||||
'current_password' => 'Aktuelles Passwort',
|
||||
'disabled' => 'Deaktiviert',
|
||||
'email' => 'Email',
|
||||
'enabled' => 'Aktiviert',
|
||||
'language' => 'Sprache',
|
||||
'location' => 'Ort',
|
||||
'login' => 'Login',
|
||||
'memory' => 'Arbeitsspeicher',
|
||||
'no' => 'Nein',
|
||||
'node' => 'Node',
|
||||
'players' => 'Spieler',
|
||||
'registered' => 'Registriert',
|
||||
'restart' => 'Neustart',
|
||||
'root_administrator' => 'Root Administrator',
|
||||
'save' => 'Speichern',
|
||||
'start' => 'Start',
|
||||
'status' => 'Status',
|
||||
'stop' => 'Stop',
|
||||
'submit' => 'Absenden',
|
||||
'success' => 'Erfolgreich',
|
||||
'whoops' => 'Uuups',
|
||||
'yes' => 'Ja',
|
||||
];
|
@ -1,71 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'accepted' => ':attribute muss akzeptiert werden.',
|
||||
'active_url' => ':attribute ist keine gültige URL.',
|
||||
'after' => ':attribute muss ein Datum in diesem Format sein: :date',
|
||||
'alpha' => ':attribute darf nur Buchstaben enthalten.',
|
||||
'alpha_dash' => ':attribute darf nur Buchstaben, Ziffern und Bindestriche enthalten.',
|
||||
'alpha_num' => ':attribute darf nur Zahlen und Buchstaben enthalten.',
|
||||
'array' => ':attribute muss ein Array sein.',
|
||||
'before' => ':attribute muss ein Datum in diesem Format sein: :date',
|
||||
'between' => [
|
||||
'array' => ':attribute muss aus :min bis :max Elemente bestehen.',
|
||||
'file' => ':attribute muss zwischen :min und :max Kilobyte liegen.',
|
||||
'numeric' => ':attribute muss zwischen :min und :max liegen.',
|
||||
'string' => ':attribute muss aus :min bis :max Zeichen bestehen.',
|
||||
],
|
||||
'boolean' => ':attribute muss wahr oder falsch sein.',
|
||||
'confirmed' => ':attribute wiederholung stimmt nicht überein.',
|
||||
'custom' => [
|
||||
'attribute-name' => [
|
||||
'rule-name' => 'custom-message',
|
||||
],
|
||||
],
|
||||
'date' => ':attribute ist kein gültiges Datum.',
|
||||
'date_format' => ':attribute entspricht nicht dem Format: :format',
|
||||
'different' => ':attribute und :other muss verschieden sein.',
|
||||
'digits' => ':attribute muss aus :digits Ziffern bestehen.',
|
||||
'digits_between' => ':attribute muss aus :min bis :max Ziffern bestehen.',
|
||||
'exists' => 'das ausgewählte Attribut :attribute ist ungültig.',
|
||||
'filled' => ':attribute ist erforderlich.',
|
||||
'image' => ':attribute muss ein Bild sein.',
|
||||
'in' => 'Das ausgewählte Attribut :attribute ist ungültig.',
|
||||
'integer' => ':attribute muss eine Zahl sein.',
|
||||
'ip' => ':attribute muss eine gültige IP Adresse sein.',
|
||||
'json' => ':attribute muss ein gültiger JSON String sein.',
|
||||
'max' => [
|
||||
'array' => ':attribute darf nicht aus mehr als :max Elementen bestehen.',
|
||||
'file' => ':attribute darf nicht größer als :max Kilobytes sein.',
|
||||
'numeric' => ':attribute darf nicht größer als :max sein.',
|
||||
'string' => ':attribute darf nicht mehr als :max Zeichen lang sein.',
|
||||
],
|
||||
'mimes' => ':attribute muss eine Datei des Typs :values sein.',
|
||||
'min' => [
|
||||
'array' => ':attribute muss aus mindestens :min Elementen bestehen.',
|
||||
'file' => ':attribute muss mindestens :min Kilobytes sein.',
|
||||
'numeric' => ':attribute muss mindestens :min sein.',
|
||||
'string' => ':attribute muss mindestens :min Zeichen lang sein.',
|
||||
],
|
||||
'not_in' => 'Das ausgewählte Attribut :attribute ist ungültig.',
|
||||
'numeric' => ':attribute muss eine Zahl sein.',
|
||||
'regex' => ':attribute Format ungültig.',
|
||||
'required' => ':attribute ist erforderlich.',
|
||||
'required_if' => ':attribute ist erforderlich wenn :other gleich :value ist.',
|
||||
'required_with' => ':attribute ist erforderlich wenn eines von :values gesetzt ist.',
|
||||
'required_without' => ':attribute ist erforderlich wenn :values nicht gesetzt ist.',
|
||||
'required_without_all' => ':attribute ist erforderlich wenn keines von :values gesetzt ist.',
|
||||
'required_with_all' => ':attribute ist erforderlich wenn :values gesetzt ist.',
|
||||
'same' => ':attribute und :other müssen übereinstimmen.',
|
||||
'size' => [
|
||||
'array' => ':attribute muss mindestens :size Elemente enthalten.',
|
||||
'file' => ':attribute muss :size Kilobytes groß sein.',
|
||||
'numeric' => ':attribute muss :size groß sein.',
|
||||
'string' => ':attribute muss :size Zeichen lang sein.',
|
||||
],
|
||||
'string' => ':attribute muss eine Zeichenkette sein.',
|
||||
'timezone' => ':attribute muss eine gültige Zeitzone sein.',
|
||||
'totp' => 'totp Token ist ungültig. Ist es abgelaufen?',
|
||||
'unique' => ':attribute wurde bereits verwendet.',
|
||||
'url' => ':attribute Format ungültig.',
|
||||
];
|
@ -1,5 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'resetpassword' => 'Reset Password',
|
||||
];
|
@ -1,4 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
];
|
@ -1,4 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
];
|
@ -1,4 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
];
|
@ -1,4 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
];
|
@ -1,4 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
];
|
@ -1,4 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
];
|
@ -1,13 +1,18 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'confirmpassword' => 'Confirm Password',
|
||||
'emailsent' => 'Your password reset email is on its way.',
|
||||
'errorencountered' => 'There was an error encountered while attempting to process this request.',
|
||||
'not_authorized' => 'You are not authorized to perform this action.',
|
||||
'auth_error' => 'There was an error while attempting to login.',
|
||||
'authentication_required' => 'Authentication is required in order to continue.',
|
||||
'remember_me' => 'Remember Me',
|
||||
'sign_in' => 'Sign In',
|
||||
'forgot_password' => 'I\'ve forgotten my password!',
|
||||
'request_reset_text' => 'Forgotten your account password? It is not the end of the world, just provide your email below.',
|
||||
'reset_password_text' => 'Reset your account password.',
|
||||
'reset_password' => 'Reset Account Password',
|
||||
'email_sent' => 'An email has been sent to you with further instructions for resetting your password.',
|
||||
'failed' => 'These credentials do not match our records.',
|
||||
'remeberme' => 'Remember Me',
|
||||
'resetpassword' => 'Reset Password',
|
||||
'sendlink' => 'Send Password Reset Link',
|
||||
'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
|
||||
'totp_failed' => 'The TOTP token provided was invalid. Please ensure that the token generated by your device was valid.',
|
||||
'password_requirements' => 'Passwords must contain at least one uppercase, lowecase, and numeric character and must be at least 8 characters in length.',
|
||||
'request_reset' => 'Locate Account',
|
||||
];
|
||||
|
@ -1,31 +1,180 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'account' => [
|
||||
'delete_user' => 'Delete User',
|
||||
'email_password' => 'Email Password',
|
||||
'new_email' => 'New Email',
|
||||
'new_password' => 'New Password',
|
||||
'totp_apps' => 'You must have a TOTP supporting application (e.g Google Authenticator, DUO Mobile, Authy, Enpass) to use this option.',
|
||||
'totp_checkpoint_help' => "Please verify your TOTP settings by scanning the QR Code to the right with your phone's authenticator application, and then enter the 6 number code generated by the application in the box below. Press the enter key when finished.",
|
||||
'totp_disable' => 'Disable Two-Factor Authentication',
|
||||
'totp_disable_help' => 'In order to disable TOTP on this account you will need to provide a valid TOTP token. Once validated TOTP protection on this account will be disabled.',
|
||||
'totp_enable' => 'Enable Two-Factor Authentication',
|
||||
'totp_enabled' => 'Your account has been enabled with TOTP verification. Please click the close button on this box to finish.',
|
||||
'totp_enabled_error' => 'The TOTP token provided was unable to be verified. Please try again.',
|
||||
'totp_enable_help' => 'It appears that you do not have Two-Factor authentication enabled. This method of authentication adds an additional barrier preventing unauthorized entry to your account. If you enable it you will be required to input a code generated on your phone or other TOTP supporting device before finishing your login.',
|
||||
'totp_header' => 'Two-Factor Authentication',
|
||||
'totp_qr' => 'TOTP QR Code',
|
||||
'totp_token' => 'TOTP Token',
|
||||
'update_email' => 'Update Email',
|
||||
'update_pass' => 'Update Password',
|
||||
'update_user' => 'Update User',
|
||||
'validation_error' => 'There was an error with one or more fields in the request.',
|
||||
'errors' => [
|
||||
'return' => 'Return to Previous Page',
|
||||
'home' => 'Go Home',
|
||||
'403' => [
|
||||
'header' => 'Forbidden',
|
||||
'desc' => 'You do not have permission to access this resource on this server.',
|
||||
],
|
||||
'404' => [
|
||||
'header' => 'File Not Found',
|
||||
'desc' => 'We were unable to locate the requested resource on the server.',
|
||||
],
|
||||
],
|
||||
'index' => [
|
||||
'header' => 'Your Servers',
|
||||
'header_sub' => 'Servers you own and have access to.',
|
||||
'list' => 'Server List',
|
||||
],
|
||||
'api' => [
|
||||
'index' => [
|
||||
'header' => 'API Access',
|
||||
'header_sub' => 'Manage your API access keys.',
|
||||
'list' => 'API Keys',
|
||||
'create_new' => 'Create New API key',
|
||||
],
|
||||
'new' => [
|
||||
'header' => 'New API Key',
|
||||
'header_sub' => 'Create a new API access key',
|
||||
'form_title' => 'Details',
|
||||
'descriptive_memo' => [
|
||||
'title' => 'Descriptive Memo',
|
||||
'description' => 'Enter a brief description of what this API key will be used for.',
|
||||
],
|
||||
'allowed_ips' => [
|
||||
'title' => 'Allowed IPs',
|
||||
'description' => 'Enter a line delimitated list of IPs that are allowed to access the API using this key. CIDR notation is allowed. Leave blank to allow any IP.',
|
||||
],
|
||||
'base' => [
|
||||
'title' => 'Base Information',
|
||||
'information' => [
|
||||
'title' => 'Base Information',
|
||||
'description' => 'Returns a listing of all servers that this account has access to.',
|
||||
],
|
||||
],
|
||||
'user_management' => [
|
||||
'title' => 'User Management',
|
||||
'list' => [
|
||||
'title' => 'List Users',
|
||||
'description' => 'Allows listing of all users currently on the system.',
|
||||
],
|
||||
'create' => [
|
||||
'title' => 'Create User',
|
||||
'description' => 'Allows creating a new user on the system.',
|
||||
],
|
||||
'view' => [
|
||||
'title' => 'List Single User',
|
||||
'description' => 'Allows viewing details about a specific user including active services.',
|
||||
],
|
||||
'update' => [
|
||||
'title' => 'Update User',
|
||||
'description' => 'Allows modifying user details (email, password, TOTP information).',
|
||||
],
|
||||
'delete' => [
|
||||
'title' => 'Delete User',
|
||||
'description' => 'Allows deleting a user.',
|
||||
],
|
||||
],
|
||||
'node_management' => [
|
||||
'title' => 'Node Management',
|
||||
'list' => [
|
||||
'title' => 'List Nodes',
|
||||
'description' => 'Allows listing of all nodes currently on the system.',
|
||||
],
|
||||
'create' => [
|
||||
'title' => 'Create Node',
|
||||
'description' => 'Allows creating a new node on the system.',
|
||||
],
|
||||
'view' => [
|
||||
'title' => 'List Single Node',
|
||||
'description' => 'Allows viewing details about a specific node including active services.',
|
||||
],
|
||||
'allocations' => [
|
||||
'title' => 'List Allocations',
|
||||
'description' => 'Allows viewing all allocations on the panel for all nodes.',
|
||||
],
|
||||
'delete' => [
|
||||
'title' => 'Delete Node',
|
||||
'description' => 'Allows deleting a node.',
|
||||
],
|
||||
],
|
||||
'server_management' => [
|
||||
'title' => 'Server Management',
|
||||
'server' => [
|
||||
'title' => 'Server Info',
|
||||
'description' => 'Allows access to viewing information about a single server including current stats and allocations.',
|
||||
],
|
||||
'power' => [
|
||||
'title' => 'Server Power',
|
||||
'description' => 'Allows access to control server power status.',
|
||||
],
|
||||
'view' => [
|
||||
'title' => 'Show Single Server',
|
||||
'description' => 'Allows viewing details about a specific server including the daemon_token as well as current process information.',
|
||||
],
|
||||
'list' => [
|
||||
'title' => 'List Servers',
|
||||
'description' => 'Allows listing of all servers currently on the system.',
|
||||
],
|
||||
'create' => [
|
||||
'title' => 'Create Server',
|
||||
'description' => 'Allows creating a new server on the system.',
|
||||
],
|
||||
'config' => [
|
||||
'title' => 'Update Configuration',
|
||||
'description' => 'Allows modifying server config (name, owner, and access token).',
|
||||
],
|
||||
'build' => [
|
||||
'title' => 'Update Build',
|
||||
'description' => 'Allows modifying a server\'s build parameters such as memory, CPU, and disk space along with assigned and default IPs.',
|
||||
],
|
||||
'suspend' => [
|
||||
'title' => 'Suspend Server',
|
||||
'description' => 'Allows suspending a server instance.',
|
||||
],
|
||||
'unsuspend' => [
|
||||
'title' => 'Unsuspend Server',
|
||||
'description' => 'Allows unsuspending a server instance.',
|
||||
],
|
||||
'delete' => [
|
||||
'title' => 'Delete Server',
|
||||
'description' => 'Allows deleting a server.',
|
||||
],
|
||||
],
|
||||
'service_management' => [
|
||||
'title' => 'Service Management',
|
||||
'list' => [
|
||||
'title' => 'List Services',
|
||||
'description' => 'Allows listing of all services configured on the system.',
|
||||
],
|
||||
'view' => [
|
||||
'title' => 'List Single Service',
|
||||
'description' => 'Allows listing details about each service on the system including service options and variables.',
|
||||
],
|
||||
],
|
||||
'location_management' => [
|
||||
'title' => 'Location Management',
|
||||
'list' => [
|
||||
'title' => 'List Locations',
|
||||
'description' => 'Allows listing all locations and thier associated nodes.',
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
'account' => [
|
||||
'header' => 'Your Account',
|
||||
'header_sub' => 'Manage your account details.',
|
||||
'update_pass' => 'Update Password',
|
||||
'update_email' => 'Update Email Address',
|
||||
'current_password' => 'Current Password',
|
||||
'new_password' => 'New Password',
|
||||
'new_password_again' => 'Repeat New Password',
|
||||
'new_email' => 'New Email Address',
|
||||
],
|
||||
'security' => [
|
||||
'header' => 'Account Security',
|
||||
'header_sub' => 'Control active sessions and 2-Factor Authentication.',
|
||||
'sessions' => 'Active Sessions',
|
||||
'2fa_header' => '2-Factor Authentication',
|
||||
'2fa_token_help' => 'Enter the 2FA Token generated by your app (Google Authenticatior, Authy, etc.).',
|
||||
'disable_2fa' => 'Disable 2-Factor Authentication',
|
||||
'2fa_enabled' => '2-Factor Authentication is enabled on this account and will be required in order to login to the panel. If you would like to disable 2FA, simply enter a valid token below and submit the form.',
|
||||
'2fa_disabled' => '2-Factor Authentication is disabled on your account! You should enable 2FA in order to add an extra level of protection on your account.',
|
||||
'enable_2fa' => 'Enable 2-Factor Authentication',
|
||||
'2fa_qr' => 'Confgure 2FA on Your Device',
|
||||
'2fa_checkpoint_help' => 'Use the 2FA application on your phone to take a picture of the QR code to the left, or manually enter the code under it. Once you have done so, generate a token and enter it below.',
|
||||
],
|
||||
'confirm' => 'Are you sure?',
|
||||
'form_error' => 'The following errors were encountered while trying to process this request.',
|
||||
'no_servers' => 'You do not currently have any servers listed on your account.',
|
||||
'password_req' => 'Passwords must meet the following requirements: at least one uppercase character, one lowercase character, one digit, and be at least 8 characters in length.',
|
||||
'server_name' => 'Server Name',
|
||||
'validation_error' => 'An error occured while validating the data you submitted:',
|
||||
'view_as_admin' => 'You are viewing this server listing as an admin. As such, all servers installed on the system are displayed. Any servers that you are set as the owner of are marked with a blue dot to the left of their name.',
|
||||
];
|
||||
|
28
resources/lang/en/navigation.php
Normal file
28
resources/lang/en/navigation.php
Normal file
@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'home' => 'Home',
|
||||
'account' => [
|
||||
'header' => 'ACCOUNT MANAGEMENT',
|
||||
'my_account' => 'My Account',
|
||||
'security_controls' => 'Security Controls',
|
||||
'api_access' => 'API Access',
|
||||
'my_servers' => 'My Servers',
|
||||
],
|
||||
'server' => [
|
||||
'header' => 'SERVER MANAGEMENT',
|
||||
'console' => 'Console',
|
||||
'file_management' => 'File Management',
|
||||
'file_browser' => 'File Browser',
|
||||
'create_file' => 'Create File',
|
||||
'upload_files' => 'Upload Files',
|
||||
'subusers' => 'Subusers',
|
||||
'task_management' => 'Task Management',
|
||||
'configuration' => 'Configuration',
|
||||
'port_allocations' => 'Port Allocations',
|
||||
'sftp_settings' => 'SFTP Settings',
|
||||
'startup_parameters' => 'Startup Parameters',
|
||||
'databases' => 'Databases',
|
||||
'edit_file' => 'Edit File',
|
||||
],
|
||||
];
|
@ -1,17 +1,19 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'next' => 'Next »',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Pagination Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are used by the paginator library to build
|
||||
| the simple pagination links. You are free to change them to anything
|
||||
| you want to customize your views to better match your application.
|
||||
|
|
||||
*/
|
||||
|
||||
'previous' => '« Previous',
|
||||
'sidebar' => [
|
||||
'account_controls' => 'Account Controls',
|
||||
'account_security' => 'Account Security',
|
||||
'account_settings' => 'Account Settings',
|
||||
'files' => 'File Manager',
|
||||
'manage' => 'Manage Server',
|
||||
'overview' => 'Server Overview',
|
||||
'servers' => 'Your Servers',
|
||||
'server_controls' => 'Server Controls',
|
||||
'subusers' => 'Manage Sub-Users',
|
||||
],
|
||||
'next' => 'Next »',
|
||||
|
||||
];
|
||||
|
@ -1,6 +1,16 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Password Reset Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are the default lines which match reasons
|
||||
| that are given by the password broker for a password update attempt
|
||||
| has failed, such as for an invalid token or invalid new password.
|
||||
|
|
||||
*/
|
||||
'password' => 'Passwords must be at least six characters and match the confirmation.',
|
||||
'reset' => 'Your password has been reset!',
|
||||
'sent' => 'We have e-mailed your password reset link!',
|
||||
|
@ -1,29 +1,261 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'ajax' => [
|
||||
'socket_error' => 'We were unable to connect to the main Socket.IO server, there may be network issues currently. The panel may not work as expected.',
|
||||
'socket_status' => "This server's power status has changed to",
|
||||
'socket_status_crashed' => 'This server has been detected as CRASHED.',
|
||||
'index' => [
|
||||
'title' => 'Viewing Server :name',
|
||||
'header' => 'Server Console',
|
||||
'header_sub' => 'Control your server in real time.',
|
||||
],
|
||||
'tasks' => [
|
||||
'header' => 'Scheduled Tasks',
|
||||
'header_sub' => 'Automate your server.',
|
||||
'current' => 'Current Scheduled Tasks',
|
||||
'actions' => [
|
||||
'command' => 'Send Command',
|
||||
'power' => 'Send Power Toggle',
|
||||
],
|
||||
'new_task' => 'Add New Task',
|
||||
'toggle' => 'Toggle Status',
|
||||
'new' => [
|
||||
'header' => 'New Task',
|
||||
'header_sub' => 'Create a new scheduled task for this server.',
|
||||
'day_of_week' => 'Day of Week',
|
||||
'custom' => 'Custom Value',
|
||||
'day_of_month' => 'Day of Month',
|
||||
'hour' => 'Hour',
|
||||
'minute' => 'Minute',
|
||||
'sun' => 'Sunday',
|
||||
'mon' => 'Monday',
|
||||
'tues' => 'Tuesday',
|
||||
'wed' => 'Wednesday',
|
||||
'thurs' => 'Thursday',
|
||||
'fri' => 'Friday',
|
||||
'sat' => 'Saturday',
|
||||
'submit' => 'Create Task',
|
||||
'type' => 'Task Type',
|
||||
'payload' => 'Task Payload',
|
||||
'payload_help' => 'For example, if you selected <code>Send Command</code> enter the command here. If you selected <code>Send Power Option</code> put the power action here (e.g. <code>restart</code>).',
|
||||
],
|
||||
],
|
||||
'users' => [
|
||||
'header' => 'Manage Users',
|
||||
'header_sub' => 'Control who can access your server.',
|
||||
'configure' => 'Configure Permissions',
|
||||
'list' => 'Accounts with Access',
|
||||
'add' => 'Add New Subuser',
|
||||
'update' => 'Update Subuser',
|
||||
'edit' => [
|
||||
'header' => 'Edit Subuser',
|
||||
'header_sub' => 'Modify user\'s access to server.',
|
||||
],
|
||||
'new' => [
|
||||
'header' => 'Add New User',
|
||||
'header_sub' => 'Add a new user with permissions to this server.',
|
||||
'email' => 'Email Address',
|
||||
'email_help' => 'Enter the email address for the user you wish to invite to manage this server.',
|
||||
'power_header' => 'Power Management',
|
||||
'file_header' => 'File Management',
|
||||
'subuser_header' => 'Subuser Management',
|
||||
'server_header' => 'Server Management',
|
||||
'task_header' => 'Task Management',
|
||||
'sftp_header' => 'SFTP Management',
|
||||
'db_header' => 'Database Management',
|
||||
'start' => [
|
||||
'title' => 'Start Server',
|
||||
'description' => 'Allows user to start the server.',
|
||||
],
|
||||
'stop' => [
|
||||
'title' => 'Stop Server',
|
||||
'description' => 'Allows user to stop the server.',
|
||||
],
|
||||
'restart' => [
|
||||
'title' => 'Restart Server',
|
||||
'description' => 'Allows user to restart the server.',
|
||||
],
|
||||
'kill' => [
|
||||
'title' => 'Kill Server',
|
||||
'description' => 'Allows user to kill the server process.',
|
||||
],
|
||||
'command' => [
|
||||
'title' => 'Send Console Command',
|
||||
'description' => 'Allows sending a command from the console. If the user does not have stop or restart permissions they cannot send the application\'s stop command.',
|
||||
],
|
||||
'list_files' => [
|
||||
'title' => 'List Files',
|
||||
'description' => 'Allows user to list all files and folders on the server but not view file contents.',
|
||||
],
|
||||
'edit_files' => [
|
||||
'title' => 'Edit Files',
|
||||
'description' => 'Allows user to open a file for viewing only.',
|
||||
],
|
||||
'save_files' => [
|
||||
'title' => 'Save Files',
|
||||
'description' => 'Allows user to save modified file contents.',
|
||||
],
|
||||
'move_files' => [
|
||||
'title' => 'Rename & Move Files',
|
||||
'description' => 'Allows user to move and rename files and folders on the filesystem.',
|
||||
],
|
||||
'copy_files' => [
|
||||
'title' => 'Copy Files',
|
||||
'description' => 'Allows user to copy files and folders on the filesystem.',
|
||||
],
|
||||
'compress_files' => [
|
||||
'title' => 'Compress Files',
|
||||
'description' => 'Allows user to make archives of files and folders on the system.',
|
||||
],
|
||||
'decompress_files' => [
|
||||
'title' => 'Decompress Files',
|
||||
'description' => 'Allows user to decompress .zip and .tar(.gz) archives.',
|
||||
],
|
||||
'create_files' => [
|
||||
'title' => 'Create Files',
|
||||
'description' => 'Allows user to create a new file within the panel.',
|
||||
],
|
||||
'upload_files' => [
|
||||
'title' => 'Upload Files',
|
||||
'description' => 'Allows user to upload files through the file manager.',
|
||||
],
|
||||
'delete_files' => [
|
||||
'title' => 'Delete Files',
|
||||
'description' => 'Allows user to delete files from the system.',
|
||||
],
|
||||
'download_files' => [
|
||||
'title' => 'Download Files',
|
||||
'description' => 'Allows user to download files. If a user is given this permission they can download and view file contents even if that permission is not assigned on the panel.',
|
||||
],
|
||||
'list_subusers' => [
|
||||
'title' => 'List Subusers',
|
||||
'description' => 'Allows user to view a listing of all subusers assigned to the server.',
|
||||
],
|
||||
'view_subuser' => [
|
||||
'title' => 'View Subuser',
|
||||
'description' => 'Allows user to view permissions assigned to subusers.',
|
||||
],
|
||||
'edit_subuser' => [
|
||||
'title' => 'Edit Subuser',
|
||||
'description' => 'Allows a user to edit permissions assigned to other subusers.',
|
||||
],
|
||||
'create_subuser' => [
|
||||
'title' => 'Create Subuser',
|
||||
'description' => 'Allows user to create additional subusers on the server.',
|
||||
],
|
||||
'delete_subuser' => [
|
||||
'title' => 'Delete Subuser',
|
||||
'description' => 'Allows a user to delete other subusers on the server.',
|
||||
],
|
||||
'set_connection' => [
|
||||
'title' => 'Set Default Connection',
|
||||
'description' => 'Allows user to set the default connection used for a server as well as view avaliable ports.',
|
||||
],
|
||||
'view_startup' => [
|
||||
'title' => 'View Startup Command',
|
||||
'description' => 'Allows user to view the startup command and associated variables for a server.',
|
||||
],
|
||||
'edit_startup' => [
|
||||
'title' => 'Edit Startup Command',
|
||||
'description' => 'Allows a user to modify startup variables for a server.',
|
||||
],
|
||||
'list_tasks' => [
|
||||
'title' => 'List Tasks',
|
||||
'description' => 'Allows a user to list all tasks (enabled and disabled) on a server.',
|
||||
],
|
||||
'view_task' => [
|
||||
'title' => 'View Task',
|
||||
'description' => 'Allows a user to view a specific task\'s details.',
|
||||
],
|
||||
'toggle_task' => [
|
||||
'title' => 'Toggle Task',
|
||||
'description' => 'Allows a user to toggle a task on or off.',
|
||||
],
|
||||
'queue_task' => [
|
||||
'title' => 'Queue Task',
|
||||
'description' => 'Allows a user to queue a task to run on next cycle.',
|
||||
],
|
||||
'create_task' => [
|
||||
'title' => 'Create Task',
|
||||
'description' => 'Allows a user to create new tasks.',
|
||||
],
|
||||
'delete_task' => [
|
||||
'title' => 'Delete Task',
|
||||
'description' => 'Allows a user to delete a task.',
|
||||
],
|
||||
'view_sftp' => [
|
||||
'title' => 'View SFTP Details',
|
||||
'description' => 'Allows user to view the server\'s SFTP information but not the password.',
|
||||
],
|
||||
'view_sftp_password' => [
|
||||
'title' => 'View SFTP Password',
|
||||
'description' => 'Allows user to view the SFTP password for the server.',
|
||||
],
|
||||
'reset_sftp' => [
|
||||
'title' => 'Reset SFTP Password',
|
||||
'description' => 'Allows user to change the SFTP password for the server.',
|
||||
],
|
||||
'view_databases' => [
|
||||
'title' => 'View Database Details',
|
||||
'description' => 'Allows user to view all databases associated with this server including the usernames and passwords for the databases.',
|
||||
],
|
||||
'reset_db_password' => [
|
||||
'title' => 'Reset Database Password',
|
||||
'description' => 'Allows a user to reset passwords for databases.',
|
||||
],
|
||||
],
|
||||
],
|
||||
'files' => [
|
||||
'back' => 'Back to File Manager',
|
||||
'loading' => 'Loading file listing, this might take a few seconds...',
|
||||
'saved' => 'File has successfully been saved.',
|
||||
'yaml_notice' => "You are currently editing a YAML file. These files do not accept tabs, they must use spaces. We've gone ahead and made it so that hitting tab will insert :dropdown spaces.",
|
||||
'header' => 'File Manager',
|
||||
'header_sub' => 'Manage all of your files directly from the web.',
|
||||
'loading' => 'Loading initial file structure, this could take a few seconds.',
|
||||
'path' => 'When configuring any file paths in your server plugins or settings you should use :path as your base path. The maximum size for web-based file uploads to this node is :size.',
|
||||
'seconds_ago' => 'seconds ago',
|
||||
'file_name' => 'File Name',
|
||||
'size' => 'Size',
|
||||
'last_modified' => 'Last Modified',
|
||||
'add_new' => 'Add New File',
|
||||
'edit' => [
|
||||
'header' => 'Edit File',
|
||||
'header_sub' => 'Make modifications to a file from the web.',
|
||||
'save' => 'Save File',
|
||||
'return' => 'Return to File Manager',
|
||||
],
|
||||
'add' => [
|
||||
'header' => 'New File',
|
||||
'header_sub' => 'Create a new file on your server.',
|
||||
'name' => 'File Name',
|
||||
'create' => 'Create File',
|
||||
],
|
||||
],
|
||||
'index' => [
|
||||
'add_new' => 'Add New Server',
|
||||
'allocation' => 'Allocation',
|
||||
'command' => 'Enter Console Command',
|
||||
'connection' => 'Default Connection',
|
||||
'control' => 'Control Server',
|
||||
'cpu_use' => 'CPU Usage',
|
||||
'disk_space' => 'Disk Space',
|
||||
'memory_use' => 'Memory Usage',
|
||||
'mem_limit' => 'Memory Limit',
|
||||
'server_info' => 'Server Information',
|
||||
'usage' => 'Usage',
|
||||
'xaxis' => 'Time (2s Increments)',
|
||||
'config' => [
|
||||
'startup' => [
|
||||
'header' => 'Start Configuration',
|
||||
'header_sub' => 'Control server startup arguments.',
|
||||
'command' => 'Startup Command',
|
||||
'edit_params' => 'Edit Parameters',
|
||||
'update' => 'Update Startup Parameters',
|
||||
],
|
||||
'sftp' => [
|
||||
'header' => 'SFTP Configuration',
|
||||
'header_sub' => 'Account details for SFTP connections.',
|
||||
'change_pass' => 'Change SFTP Password',
|
||||
'details' => 'SFTP Details',
|
||||
'conn_addr' => 'Connection Address',
|
||||
'warning' => 'Ensure that your client is set to use SFTP and not FTP or FTPS for connections, there is a difference between the protocols.',
|
||||
],
|
||||
'database' => [
|
||||
'header' => 'Databases',
|
||||
'header_sub' => 'All databases available for this server.',
|
||||
'your_dbs' => 'Your Databases',
|
||||
'host' => 'MySQL Host',
|
||||
'reset_password' => 'Reset Password',
|
||||
'no_dbs' => 'There are no databases listed for this server.',
|
||||
'add_db' => 'Add a new database.',
|
||||
],
|
||||
'allocation' => [
|
||||
'header' => 'Server Allocations',
|
||||
'header_sub' => 'Control the IPs and ports available on this server.',
|
||||
'available' => 'Available Allocations',
|
||||
'help' => 'Allocation Help',
|
||||
'help_text' => 'The list to the left includes all available IPs and ports that are open for your server to use for incoming connections.',
|
||||
],
|
||||
],
|
||||
];
|
||||
|
@ -1,31 +1,62 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'again' => 'Again',
|
||||
'close' => 'Close',
|
||||
'connection' => 'Connection',
|
||||
'cpu' => 'CPU',
|
||||
'current_password' => 'Current Password',
|
||||
'disabled' => 'Disabled',
|
||||
'email' => 'Email',
|
||||
'enabled' => 'Enabled',
|
||||
'language' => 'Language',
|
||||
'location' => 'Location',
|
||||
'login' => 'Login',
|
||||
'memory' => 'Memory',
|
||||
'no' => 'No',
|
||||
'node' => 'Node',
|
||||
'password' => 'Password',
|
||||
'players' => 'Players',
|
||||
'registered' => 'Registered',
|
||||
'restart' => 'Restart',
|
||||
'root_administrator' => 'Root Administrator',
|
||||
'save' => 'Save',
|
||||
'start' => 'Start',
|
||||
'confirm_password' => 'Confirm Password',
|
||||
'login' => 'Login',
|
||||
'home' => 'Home',
|
||||
'servers' => 'Servers',
|
||||
'id' => 'ID',
|
||||
'name' => 'Name',
|
||||
'node' => 'Node',
|
||||
'connection' => 'Connection',
|
||||
'memory' => 'Memory',
|
||||
'cpu' => 'CPU',
|
||||
'status' => 'Status',
|
||||
'stop' => 'Stop',
|
||||
'search' => 'Search',
|
||||
'suspended' => 'Suspended',
|
||||
'account' => 'Account',
|
||||
'security' => 'Security',
|
||||
'ip' => 'IP Address',
|
||||
'last_activity' => 'Last Activitiy',
|
||||
'revoke' => 'Revoke',
|
||||
'2fa_token' => 'Authentication Token',
|
||||
'submit' => 'Submit',
|
||||
'success' => 'Success',
|
||||
'whoops' => 'Whoops',
|
||||
'close' => 'Close',
|
||||
'settings' => 'Settings',
|
||||
'configuration' => 'Configuration',
|
||||
'sftp' => 'SFTP',
|
||||
'databases' => 'Databases',
|
||||
'memo' => 'Memo',
|
||||
'created' => 'Created',
|
||||
'expires' => 'Expires',
|
||||
'public_key' => 'Public key',
|
||||
'api_access' => 'Api Access',
|
||||
'never' => 'never',
|
||||
'sign_out' => 'Sign out',
|
||||
'admin_control' => 'Admin Control',
|
||||
'required' => 'Required',
|
||||
'port' => 'Port',
|
||||
'username' => 'Username',
|
||||
'database' => 'Database',
|
||||
'new' => 'New',
|
||||
'danger' => 'Danger',
|
||||
'create' => 'Create',
|
||||
'select_all' => 'Select All',
|
||||
'select_none' => 'Select None',
|
||||
'alias' => 'Alias',
|
||||
'primary' => 'Primary',
|
||||
'make_primary' => 'Make Primary',
|
||||
'none' => 'None',
|
||||
'cancel' => 'Cancel',
|
||||
'created_at' => 'Created At',
|
||||
'action' => 'Action',
|
||||
'data' => 'Data',
|
||||
'queued' => 'Queued',
|
||||
'last_run' => 'Last Run',
|
||||
'next_run' => 'Next Run',
|
||||
'yes' => 'Yes',
|
||||
'no' => 'No',
|
||||
'delete' => 'Delete',
|
||||
];
|
||||
|
@ -1,71 +1,119 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'accepted' => 'The :attribute must be accepted.',
|
||||
'active_url' => 'The :attribute is not a valid URL.',
|
||||
'after' => 'The :attribute must be a date after :date.',
|
||||
'alpha' => 'The :attribute may only contain letters.',
|
||||
'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
|
||||
'alpha_num' => 'The :attribute may only contain letters and numbers.',
|
||||
'array' => 'The :attribute must be an array.',
|
||||
'before' => 'The :attribute must be a date before :date.',
|
||||
'between' => [
|
||||
'array' => 'The :attribute must have between :min and :max items.',
|
||||
'file' => 'The :attribute must be between :min and :max kilobytes.',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Validation Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines contain the default error messages used by
|
||||
| the validator class. Some of these rules have multiple versions such
|
||||
| as the size rules. Feel free to tweak each of these messages here.
|
||||
|
|
||||
*/
|
||||
|
||||
'accepted' => 'The :attribute must be accepted.',
|
||||
'active_url' => 'The :attribute is not a valid URL.',
|
||||
'after' => 'The :attribute must be a date after :date.',
|
||||
'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
|
||||
'alpha' => 'The :attribute may only contain letters.',
|
||||
'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
|
||||
'alpha_num' => 'The :attribute may only contain letters and numbers.',
|
||||
'array' => 'The :attribute must be an array.',
|
||||
'before' => 'The :attribute must be a date before :date.',
|
||||
'before_or_equal' => 'The :attribute must be a date before or equal to :date.',
|
||||
'between' => [
|
||||
'numeric' => 'The :attribute must be between :min and :max.',
|
||||
'string' => 'The :attribute must be between :min and :max characters.',
|
||||
'file' => 'The :attribute must be between :min and :max kilobytes.',
|
||||
'string' => 'The :attribute must be between :min and :max characters.',
|
||||
'array' => 'The :attribute must have between :min and :max items.',
|
||||
],
|
||||
'boolean' => 'The :attribute field must be true or false.',
|
||||
'confirmed' => 'The :attribute confirmation does not match.',
|
||||
'boolean' => 'The :attribute field must be true or false.',
|
||||
'confirmed' => 'The :attribute confirmation does not match.',
|
||||
'date' => 'The :attribute is not a valid date.',
|
||||
'date_format' => 'The :attribute does not match the format :format.',
|
||||
'different' => 'The :attribute and :other must be different.',
|
||||
'digits' => 'The :attribute must be :digits digits.',
|
||||
'digits_between' => 'The :attribute must be between :min and :max digits.',
|
||||
'dimensions' => 'The :attribute has invalid image dimensions.',
|
||||
'distinct' => 'The :attribute field has a duplicate value.',
|
||||
'email' => 'The :attribute must be a valid email address.',
|
||||
'exists' => 'The selected :attribute is invalid.',
|
||||
'file' => 'The :attribute must be a file.',
|
||||
'filled' => 'The :attribute field is required.',
|
||||
'image' => 'The :attribute must be an image.',
|
||||
'in' => 'The selected :attribute is invalid.',
|
||||
'in_array' => 'The :attribute field does not exist in :other.',
|
||||
'integer' => 'The :attribute must be an integer.',
|
||||
'ip' => 'The :attribute must be a valid IP address.',
|
||||
'json' => 'The :attribute must be a valid JSON string.',
|
||||
'max' => [
|
||||
'numeric' => 'The :attribute may not be greater than :max.',
|
||||
'file' => 'The :attribute may not be greater than :max kilobytes.',
|
||||
'string' => 'The :attribute may not be greater than :max characters.',
|
||||
'array' => 'The :attribute may not have more than :max items.',
|
||||
],
|
||||
'mimes' => 'The :attribute must be a file of type: :values.',
|
||||
'mimetypes' => 'The :attribute must be a file of type: :values.',
|
||||
'min' => [
|
||||
'numeric' => 'The :attribute must be at least :min.',
|
||||
'file' => 'The :attribute must be at least :min kilobytes.',
|
||||
'string' => 'The :attribute must be at least :min characters.',
|
||||
'array' => 'The :attribute must have at least :min items.',
|
||||
],
|
||||
'not_in' => 'The selected :attribute is invalid.',
|
||||
'numeric' => 'The :attribute must be a number.',
|
||||
'present' => 'The :attribute field must be present.',
|
||||
'regex' => 'The :attribute format is invalid.',
|
||||
'required' => 'The :attribute field is required.',
|
||||
'required_if' => 'The :attribute field is required when :other is :value.',
|
||||
'required_unless' => 'The :attribute field is required unless :other is in :values.',
|
||||
'required_with' => 'The :attribute field is required when :values is present.',
|
||||
'required_with_all' => 'The :attribute field is required when :values is present.',
|
||||
'required_without' => 'The :attribute field is required when :values is not present.',
|
||||
'required_without_all' => 'The :attribute field is required when none of :values are present.',
|
||||
'same' => 'The :attribute and :other must match.',
|
||||
'size' => [
|
||||
'numeric' => 'The :attribute must be :size.',
|
||||
'file' => 'The :attribute must be :size kilobytes.',
|
||||
'string' => 'The :attribute must be :size characters.',
|
||||
'array' => 'The :attribute must contain :size items.',
|
||||
],
|
||||
'string' => 'The :attribute must be a string.',
|
||||
'timezone' => 'The :attribute must be a valid zone.',
|
||||
'unique' => 'The :attribute has already been taken.',
|
||||
'uploaded' => 'The :attribute failed to upload.',
|
||||
'url' => 'The :attribute format is invalid.',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Custom Validation Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify custom validation messages for attributes using the
|
||||
| convention "attribute.rule" to name the lines. This makes it quick to
|
||||
| specify a specific custom language line for a given attribute rule.
|
||||
|
|
||||
*/
|
||||
|
||||
'custom' => [
|
||||
'attribute-name' => [
|
||||
'rule-name' => 'custom-message',
|
||||
],
|
||||
],
|
||||
'date' => 'The :attribute is not a valid date.',
|
||||
'date_format' => 'The :attribute does not match the format :format.',
|
||||
'different' => 'The :attribute and :other must be different.',
|
||||
'digits' => 'The :attribute must be :digits digits.',
|
||||
'digits_between' => 'The :attribute must be between :min and :max digits.',
|
||||
'exists' => 'The selected :attribute is invalid.',
|
||||
'filled' => 'The :attribute field is required.',
|
||||
'image' => 'The :attribute must be an image.',
|
||||
'in' => 'The selected :attribute is invalid.',
|
||||
'integer' => 'The :attribute must be an integer.',
|
||||
'ip' => 'The :attribute must be a valid IP address.',
|
||||
'json' => 'The :attribute must be a valid JSON string.',
|
||||
'max' => [
|
||||
'array' => 'The :attribute may not have more than :max items.',
|
||||
'file' => 'The :attribute may not be greater than :max kilobytes.',
|
||||
'numeric' => 'The :attribute may not be greater than :max.',
|
||||
'string' => 'The :attribute may not be greater than :max characters.',
|
||||
],
|
||||
'mimes' => 'The :attribute must be a file of type: :values.',
|
||||
'min' => [
|
||||
'array' => 'The :attribute must have at least :min items.',
|
||||
'file' => 'The :attribute must be at least :min kilobytes.',
|
||||
'numeric' => 'The :attribute must be at least :min.',
|
||||
'string' => 'The :attribute must be at least :min characters.',
|
||||
],
|
||||
'not_in' => 'The selected :attribute is invalid.',
|
||||
'numeric' => 'The :attribute must be a number.',
|
||||
'regex' => 'The :attribute format is invalid.',
|
||||
'required' => 'The :attribute field is required.',
|
||||
'required_if' => 'The :attribute field is required when :other is :value.',
|
||||
'required_with' => 'The :attribute field is required when :values is present.',
|
||||
'required_without' => 'The :attribute field is required when :values is not present.',
|
||||
'required_without_all' => 'The :attribute field is required when none of :values are present.',
|
||||
'required_with_all' => 'The :attribute field is required when :values is present.',
|
||||
'same' => 'The :attribute and :other must match.',
|
||||
'size' => [
|
||||
'array' => 'The :attribute must contain :size items.',
|
||||
'file' => 'The :attribute must be :size kilobytes.',
|
||||
'numeric' => 'The :attribute must be :size.',
|
||||
'string' => 'The :attribute must be :size characters.',
|
||||
],
|
||||
'string' => 'The :attribute must be a string.',
|
||||
'timezone' => 'The :attribute must be a valid zone.',
|
||||
'totp' => 'The totp token is invalid. Did it expire?',
|
||||
'unique' => 'The :attribute has already been taken.',
|
||||
'url' => 'The :attribute format is invalid.',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Custom Validation Attributes
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are used to swap attribute place-holders
|
||||
| with something more reader friendly such as E-Mail Address instead
|
||||
| of "email". This simply helps us make messages a little cleaner.
|
||||
|
|
||||
*/
|
||||
|
||||
'attributes' => [],
|
||||
|
||||
];
|
||||
|
@ -1,4 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
];
|
@ -1,4 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
];
|
@ -1,4 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
];
|
@ -1,4 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
];
|
@ -1,4 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
];
|
@ -1,4 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
];
|
@ -1,4 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
];
|
@ -1,13 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'confirmpassword' => 'Kinnita salasõna',
|
||||
'emailsent' => 'Teie salasõna algväärtustus link on teel',
|
||||
'errorencountered' => 'Selle protsessi toimumisel toimus viga',
|
||||
'failed' => 'Sisestus ei klapi meie andmetega',
|
||||
'remeberme' => 'Mäleta mind',
|
||||
'resetpassword' => 'Algväärtusta salasõna',
|
||||
'sendlink' => 'Saada salasõna algväärtustamise link',
|
||||
'throttle' => 'Liiga palju sisselogimiskatseid. Palun proovi uuesti :seconds sekundi pärast',
|
||||
'totp_failed' => 'Sinu Kahe-kihilise autentimise tooken oli väär. Palun veendu, et genereeritud tooken on õige.',
|
||||
];
|
@ -1,32 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'account' => [
|
||||
'delete_user' => 'Kustuta kasutaja',
|
||||
'email_password' => 'Email Salasõna',
|
||||
'new_email' => 'Uus Email',
|
||||
'new_password' => 'Uus salasõna',
|
||||
'totp_apps' => 'Teil peab olema Kahe-kihilise autentimeerimine (Google Authenticator, DUO Mobile, Authy, Enpass) olema lubatud, et kasutada seda valikut',
|
||||
'totp_checkpoint_help' => 'Palun kinnita oma Kahe-kihilise autentiseerimise seaded üle, kas skännides QR kood või sisestades 6 numbriline kood ',
|
||||
'totp_disable' => 'Keela Kahe-kihiline autentimine',
|
||||
'totp_disable_help' => 'Selleks, et keelata Kahe-kihiline autenteerimine sellel kasutajal sisesta õige tooken. ',
|
||||
'totp_enable' => 'Luba Kahe-kihiline autentimine
|
||||
',
|
||||
'totp_enabled' => 'Teie kontol on aktiveeritud Kahe-kihiline autentimine. Palun sulge see kast, et lõpetada',
|
||||
'totp_enabled_error' => 'Sisestatud Kahe-kihilse autentimise tookenit ei olnud võimalik kinnitada. Palun proovi uuesti',
|
||||
'totp_enable_help' => 'Paistab, et Teil pole Kahe-kihiline autentimine lubatud. See autentimise meetod lisab kaitsva kihi teie konto peale võimalikude rünnakute eest. Lubamisel on teil vaja sisestada kood, enne kui saate sisselogitud',
|
||||
'totp_header' => 'Kahe-kihiline autenteerimine',
|
||||
'totp_qr' => 'Kahe-kihilse autentimissüsteemi QR kood',
|
||||
'totp_token' => 'Kahe-kihilise autentimise tooken',
|
||||
'update_email' => 'Uuenda Emaili',
|
||||
'update_pass' => 'Uuenda salasõna',
|
||||
'update_user' => 'Uuenda kasutajat',
|
||||
],
|
||||
'confirm' => 'Oled kindel?',
|
||||
'form_error' => 'Järgmised errorid tekkisid proovides täita seda protsessi',
|
||||
'no_servers' => 'Teil ei ole hetkel ühtegi serverit ühendatud kontoga.',
|
||||
'password_req' => 'Salasõna peab koosnema järgmisest: Üks suuretäht, üks väiketäht, üks number ja vähemalt 8 tähemärki pikk',
|
||||
'server_name' => 'Serveri nimi',
|
||||
'validation_error' => 'Andmete valideerimisel tekkis viga',
|
||||
'view_as_admin' => 'Te vaatate seda serverit, kui admin. Seetõttu kõik serverid, mis on installitud on nähtaval. Iga server, mida Te omate on märgitud siniselt nime kõrval.',
|
||||
];
|
@ -1,17 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'next' => 'Järgmine »',
|
||||
'previous' => '« Eelmine',
|
||||
'sidebar' => [
|
||||
'account_controls' => 'Kasutaja seaded',
|
||||
'account_security' => 'Kasutaja turvalisus',
|
||||
'account_settings' => 'Kasutaja seaded',
|
||||
'files' => 'Faili haldur',
|
||||
'manage' => 'Halda serverit',
|
||||
'overview' => 'Serveri ülevaade',
|
||||
'servers' => 'Teie serverid',
|
||||
'server_controls' => 'Serveri seaded',
|
||||
'subusers' => 'Halda kasutajaid',
|
||||
],
|
||||
];
|
@ -1,9 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'password' => 'Salasõna peab olema vähemalt 6 tähte ja peab klappima kinnitusega',
|
||||
'reset' => 'Teie salasõna on algväärtustatud',
|
||||
'sent' => 'Me oleme meilinud sulle salasõna algväärtustamise lingi',
|
||||
'token' => 'Salasõna algväärtustamise tooken on väär',
|
||||
'user' => 'Me ei leia kasutaja selle Emailiga',
|
||||
];
|
@ -1,29 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'ajax' => [
|
||||
'socket_error' => 'Me ei saanud ühendust peamise Socket.IO serveriga, selle tõttu võib olla internetiga probleeme. Paneel võib toimida valesti.',
|
||||
'socket_status' => 'Selle serveri staatus on muutunud - ',
|
||||
'socket_status_crashed' => 'Serveri staatuseks on märgitud: hävinud',
|
||||
],
|
||||
'files' => [
|
||||
'back' => 'Tagasi faili haldurisse',
|
||||
'loading' => 'Faili listi laadimine võib võtta mõned sekundid',
|
||||
'saved' => 'Fail on edukalt salvestatud',
|
||||
'yaml_notice' => 'Praegu sa muudad YAML faili. Need failid ei aksepteeri TABi, nad peavad kasutama tühikut. Seetõttu muutsime me TABi vajutamisel :dropdown tühikut',
|
||||
],
|
||||
'index' => [
|
||||
'add_new' => 'Lisa uus server',
|
||||
'allocation' => 'Jaotus',
|
||||
'command' => 'Sisesta konsooli käsk',
|
||||
'connection' => 'Vaikimisi ühendus',
|
||||
'control' => 'Kontrolli serverit',
|
||||
'cpu_use' => 'CPU kasutus',
|
||||
'disk_space' => 'Kõvaketta ruum',
|
||||
'memory_use' => 'Mälu kasutus',
|
||||
'mem_limit' => 'Mälu limiit',
|
||||
'server_info' => 'Serveri informatsioon',
|
||||
'usage' => 'Kasutus',
|
||||
'xaxis' => 'Aeg (2s vahedega)',
|
||||
],
|
||||
];
|
@ -1,30 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'again' => 'Uuesti',
|
||||
'close' => 'Sulge',
|
||||
'connection' => 'Ühendus',
|
||||
'cpu' => 'CPU',
|
||||
'current_password' => 'Praegune salasõna',
|
||||
'disabled' => 'Välja lülitatud',
|
||||
'email' => 'Email',
|
||||
'enabled' => 'Lubatud',
|
||||
'language' => 'Keel',
|
||||
'location' => 'Asukoht',
|
||||
'login' => 'Logi sisse',
|
||||
'memory' => 'Mälu',
|
||||
'no' => 'Ei',
|
||||
'node' => 'Node',
|
||||
'players' => 'Mängijad',
|
||||
'registered' => 'Registreeritud',
|
||||
'restart' => 'Taaskäivita',
|
||||
'root_administrator' => 'Juur Administraator',
|
||||
'save' => 'Salvesta',
|
||||
'start' => 'Start',
|
||||
'status' => 'Staatus',
|
||||
'stop' => 'Peata',
|
||||
'submit' => 'Sisesta',
|
||||
'success' => 'Õnnestus',
|
||||
'whoops' => 'Oihhh',
|
||||
'yes' => 'Jah',
|
||||
];
|
@ -1,71 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'accepted' => ':attribute oeab olema aksepteeritud',
|
||||
'active_url' => ':attribute ei ole õige URL',
|
||||
'after' => ':attribute peab olema kuupäev pärast :date',
|
||||
'alpha' => ':attribute tohib sisaldada ainult numbreid',
|
||||
'alpha_dash' => ':attribute tohib sisaldada ainult tähti, numbreid ja sidekriipse',
|
||||
'alpha_num' => ':attribute tohib ainult sisaldada tähti ja numbreid',
|
||||
'array' => ':attribute peab olema massiiv',
|
||||
'before' => ':attribute peab olema kuupäev enne :date',
|
||||
'between' => [
|
||||
'array' => ':attribute peab jääma :min ja :max eseme vahele',
|
||||
'file' => ':attribute peab jääma :min ja :max kilobaidi vahele',
|
||||
'numeric' => ':attribute peab olema vahemikus :min ja :max',
|
||||
'string' => ':attribute peab jääma :min ja :max vahele',
|
||||
],
|
||||
'boolean' => ':attribute peab olema kas tõene või väär',
|
||||
'confirmed' => ':attribute kinnitus ei klapi',
|
||||
'custom' => [
|
||||
'attribute-name' => [
|
||||
'rule-name' => 'Kohandatud-sõnum',
|
||||
],
|
||||
],
|
||||
'date' => ':attribute ei ole õige kuupäeva formaat',
|
||||
'date_format' => ':attribute ei klapi formaadiga :format',
|
||||
'different' => ':attribute ja :other peavad olema erinevad',
|
||||
'digits' => ':attribute peab olema :digits numbrit',
|
||||
'digits_between' => ':attribute peab olema :min ja :max numbrit',
|
||||
'exists' => 'Valitud :attribute on väär',
|
||||
'filled' => ':attribute väli on kohustuslik',
|
||||
'image' => ':attribute peab olema pilt',
|
||||
'in' => ':attribute on vale valik',
|
||||
'integer' => ':attribute peab olema täisarv',
|
||||
'ip' => ':attribute peab olema õige IP aadress',
|
||||
'json' => ':attribute peab olema lubatud JSON vektor',
|
||||
'max' => [
|
||||
'array' => ':attribute ei tohi sisaldada rohkem, kui :max eset',
|
||||
'file' => ':attribute ei tohi olla suurem, kui :max kilobaiti',
|
||||
'numeric' => ':attribute ei tohi olla suurem, kui :max',
|
||||
'string' => ':attribute ei tohi olla suurem, kui :max tähte',
|
||||
],
|
||||
'mimes' => ':attribute peab olema :values tüüpi fail',
|
||||
'min' => [
|
||||
'array' => ':attribute peab sisaldama vähemalt :min eset',
|
||||
'file' => ':attribute peab olema vähemalt :min kilobaiti',
|
||||
'numeric' => ':attribute peab olema vähemalt :min',
|
||||
'string' => ':attribute peab olema vähemalt :min tähemärgi pikkusega',
|
||||
],
|
||||
'not_in' => ':attribute on väär valik',
|
||||
'numeric' => ':attribute peab olema number',
|
||||
'regex' => ':attribute formaat on vale',
|
||||
'required' => ':attribute väli on kohustuslik',
|
||||
'required_if' => ':attribute on vajalik, kui :other on :value',
|
||||
'required_with' => ':attribute väli peab olema täidetud, kui :values on olemas',
|
||||
'required_without' => ':attribute väli peab olema täidetud, kui :values puudub',
|
||||
'required_without_all' => ':attribute on vajalik, kui ükski :values ei ole olemas',
|
||||
'required_with_all' => ':attribute väli on vajalik, kui :attribute on olemas',
|
||||
'same' => ':attribute ja :other peavad klappima',
|
||||
'size' => [
|
||||
'array' => ':attribute peab sisaldama :size esemet',
|
||||
'file' => ':attribute peab olema :size kilobaiti',
|
||||
'numeric' => ':attribute peab olema :size suurusa',
|
||||
'string' => ':attribute peab olema :size märki',
|
||||
],
|
||||
'string' => ':attribute peab olema vektor',
|
||||
'timezone' => ':attribute peab olema õige ala',
|
||||
'totp' => 'Kahe-kihilise autentimisesüsteemi tooken on väär, kas see aegus?',
|
||||
'unique' => ':attribute on juba võetud.',
|
||||
'url' => ':attribute on vale formaat',
|
||||
];
|
@ -1,4 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
];
|
@ -1,7 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'account' => [
|
||||
'totp_header' => 'Authentification à deux facteurs',
|
||||
],
|
||||
];
|
@ -1,4 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
];
|
@ -1,4 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
];
|
@ -1,4 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
];
|
@ -1,7 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'language' => 'Langage',
|
||||
'save' => 'Sauvegarder',
|
||||
'status' => 'Status',
|
||||
];
|
@ -1,6 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'before' => ':attribute doit être une date antérieur a :date.',
|
||||
'ip' => ':attribute doit être une adresse IP valide.',
|
||||
];
|
@ -1,11 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'confirmpassword' => 'Bekreft passord',
|
||||
'emailsent' => 'Din epost om å endre passord er på vei.',
|
||||
'errorencountered' => 'Det skjedde en feil under forsøket på utføre denne oppgaven.',
|
||||
'failed' => 'Denne påloggingsinformasjonen samsvarer ikke med våre opplysninger.',
|
||||
'remeberme' => 'Husk meg',
|
||||
'resetpassword' => 'Tilbakestill passord',
|
||||
'sendlink' => 'Send link for tilbakestilling av passord',
|
||||
];
|
@ -1,27 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'account' => [
|
||||
'delete_user' => 'Slett bruker',
|
||||
'email_password' => 'Epost passord',
|
||||
'new_email' => 'Ny epost',
|
||||
'new_password' => 'Nytt passord',
|
||||
'totp_apps' => 'Du må ha en TOTP støttet applikasjon (F.eks. Google Authenticator, DUO Mobile, Authy, Enpass) for å benytte dette alternativet.',
|
||||
'totp_checkpoint_help' => 'Vennligst bekreft dine TOTP instillinger ved å skanne QR-Koden til høyre med din telefons autenitseringsapplikasjon, og skriv inn den 6 sifrede koden generert av applikasjonen i boksen under. Trykk enter når du er ferdig.',
|
||||
'totp_disable' => 'Deaktiver to-faktor autentisering',
|
||||
'totp_enable' => 'Aktiver to-faktor autentisering',
|
||||
'totp_enabled' => 'Din konto har blitt aktivert med TOTP verifikasjon. Vennligst trykk på lukk knappen for å fullføre.',
|
||||
'totp_enabled_error' => 'TOTP nøkkelen kunne ikke verifiseres. Vennligst prøv igjen.',
|
||||
'totp_enable_help' => 'Det ser ut til at du ikke har slått på to-faktor autentisering. Denne autentiseringsmetoden legger til ett ekstra lag, som forhindrer uatorisert tilgang til din konto. Hvis du aktiverer dette, vil det kreves en kode generert på telefonen din, eller en annen TOTP støttet enhet før du fullfører innlogging.',
|
||||
'totp_header' => 'To-faktor autentisering',
|
||||
'totp_qr' => 'TOTP QR-Kode',
|
||||
'totp_token' => 'TOTP nøkkel',
|
||||
'update_email' => 'Oppdater epost',
|
||||
'update_pass' => 'Oppdater passord',
|
||||
'update_user' => 'Oppdater bruker',
|
||||
],
|
||||
'confirm' => 'Er du sikker?',
|
||||
'form_error' => 'Følgende feilmeldinger dukket opp da forspørselen ble behandlet.',
|
||||
'no_servers' => 'Du har for øyeblikket ingen servere registrert på din konto.',
|
||||
'server_name' => 'Servernavn',
|
||||
];
|
@ -1,17 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'next' => 'Neste »',
|
||||
'previous' => '« Forrige',
|
||||
'sidebar' => [
|
||||
'account_controls' => 'Kontokontroll',
|
||||
'account_security' => 'Kontosikkerhet',
|
||||
'account_settings' => 'Kontoinstillinger',
|
||||
'files' => 'Filbehandling',
|
||||
'manage' => 'Administrer server',
|
||||
'overview' => 'Serveroversikt',
|
||||
'servers' => 'Dine servere',
|
||||
'server_controls' => 'Serverkontroll',
|
||||
'subusers' => 'Administrer underbrukere',
|
||||
],
|
||||
];
|
@ -1,8 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'password' => 'Passordet må ha minimum 6 tegn, og matche bekreftelsen.',
|
||||
'reset' => 'Passordet ditt har blitt tilbakestilt!',
|
||||
'sent' => 'Vi har sendt deg en epost med link til å tilbakestille passord!',
|
||||
'user' => 'Vi kan ikke finne noen bruker med denne epost adressen.',
|
||||
];
|
@ -1,27 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'ajax' => [
|
||||
'socket_status' => 'Serverens strømstatus er endret til',
|
||||
'socket_status_crashed' => 'Serveren har blitt oppdaget som kræsjet.',
|
||||
],
|
||||
'files' => [
|
||||
'back' => 'Tilbake til filbehandling',
|
||||
'loading' => 'Laster filliste, dette kan ta et par sekunder...',
|
||||
'saved' => 'Filen har blitt lagret!',
|
||||
],
|
||||
'index' => [
|
||||
'add_new' => 'Legg til ny server',
|
||||
'allocation' => 'Tildeling',
|
||||
'command' => 'Skriv inn konsollkommando',
|
||||
'connection' => 'Standard tilkobling',
|
||||
'control' => 'Serverkontroll',
|
||||
'cpu_use' => 'Prosessorbruk',
|
||||
'disk_space' => 'Diskplass',
|
||||
'memory_use' => 'Minnebruk',
|
||||
'mem_limit' => 'Minnegrense',
|
||||
'server_info' => 'Serverinformasjon',
|
||||
'usage' => 'Bruk',
|
||||
'xaxis' => 'Tid (2s intervaller)',
|
||||
],
|
||||
];
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user