mirror of
				https://github.com/pelican-dev/panel.git
				synced 2025-10-31 08:26:52 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			415 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			415 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Pterodactyl - Panel
 | |
|  * Copyright (c) 2015 - 2017 Dane Everitt <dane@daneeveritt.com>.
 | |
|  *
 | |
|  * This software is licensed under the terms of the MIT license.
 | |
|  * https://opensource.org/licenses/MIT
 | |
|  */
 | |
| 
 | |
| namespace Pterodactyl\Http\Controllers\API\Admin;
 | |
| 
 | |
| use Log;
 | |
| use Fractal;
 | |
| use Illuminate\Http\Request;
 | |
| use Pterodactyl\Models\Server;
 | |
| use GuzzleHttp\Exception\TransferException;
 | |
| use Pterodactyl\Exceptions\DisplayException;
 | |
| use Pterodactyl\Http\Controllers\Controller;
 | |
| use Pterodactyl\Repositories\ServerRepository;
 | |
| use Pterodactyl\Transformers\Admin\ServerTransformer;
 | |
| use Pterodactyl\Exceptions\DisplayValidationException;
 | |
| use League\Fractal\Pagination\IlluminatePaginatorAdapter;
 | |
| 
 | |
| class ServerController extends Controller
 | |
| {
 | |
|     /**
 | |
|      * Controller to handle returning all servers on the system.
 | |
|      *
 | |
|      * @param \Illuminate\Http\Request $request
 | |
|      * @return array
 | |
|      */
 | |
|     public function index(Request $request)
 | |
|     {
 | |
|         $this->authorize('server-list', $request->apiKey());
 | |
| 
 | |
|         $servers = Server::paginate(config('pterodactyl.paginate.api.servers'));
 | |
|         $fractal = Fractal::create()->collection($servers)
 | |
|             ->transformWith(new ServerTransformer($request))
 | |
|             ->withResourceName('user')
 | |
|             ->paginateWith(new IlluminatePaginatorAdapter($servers));
 | |
| 
 | |
|         if (config('pterodactyl.api.include_on_list') && $request->input('include')) {
 | |
|             $fractal->parseIncludes(explode(',', $request->input('include')));
 | |
|         }
 | |
| 
 | |
|         return $fractal->toArray();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Controller to handle returning information on a single server.
 | |
|      *
 | |
|      * @param \Illuminate\Http\Request $request
 | |
|      * @param int                      $id
 | |
|      * @return array
 | |
|      */
 | |
|     public function view(Request $request, $id)
 | |
|     {
 | |
|         $this->authorize('server-view', $request->apiKey());
 | |
| 
 | |
|         $server = Server::findOrFail($id);
 | |
|         $fractal = Fractal::create()->item($server);
 | |
| 
 | |
|         if ($request->input('include')) {
 | |
|             $fractal->parseIncludes(explode(',', $request->input('include')));
 | |
|         }
 | |
| 
 | |
|         return $fractal->transformWith(new ServerTransformer($request))
 | |
|             ->withResourceName('server')
 | |
|             ->toArray();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Create a new server on the system.
 | |
|      *
 | |
|      * @param \Illuminate\Http\Request $request
 | |
|      * @return \Illuminate\Http\JsonResponse|array
 | |
|      */
 | |
|     public function store(Request $request)
 | |
|     {
 | |
|         $this->authorize('server-create', $request->apiKey());
 | |
| 
 | |
|         $repo = new ServerRepository;
 | |
|         try {
 | |
|             $server = $repo->create($request->all());
 | |
| 
 | |
|             $fractal = Fractal::create()->item($server)->transformWith(new ServerTransformer($request));
 | |
|             if ($request->input('include')) {
 | |
|                 $fractal->parseIncludes(explode(',', $request->input('include')));
 | |
|             }
 | |
| 
 | |
|             return $fractal->withResourceName('server')->toArray();
 | |
|         } catch (DisplayValidationException $ex) {
 | |
|             return response()->json([
 | |
|                 'error' => json_decode($ex->getMessage()),
 | |
|             ], 400);
 | |
|         } catch (DisplayException $ex) {
 | |
|             return response()->json([
 | |
|                 'error' => $ex->getMessage(),
 | |
|             ], 400);
 | |
|         } catch (TransferException $ex) {
 | |
|             Log::warning($ex);
 | |
| 
 | |
|             return response()->json([
 | |
|                 'error' => 'A TransferException was encountered while trying to contact the daemon, please ensure it is online and accessible. This error has been logged.',
 | |
|             ], 504);
 | |
|         } catch (\Exception $ex) {
 | |
|             Log::error($ex);
 | |
| 
 | |
|             return response()->json([
 | |
|                 'error' => 'An unhandled exception occured while attemping to add this server. Please try again.',
 | |
|             ], 500);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Delete a server from the system.
 | |
|      *
 | |
|      * @param \Illuminate\Http\Request $request
 | |
|      * @param int                      $id
 | |
|      * @return \Illuminate\Http\Response|\Illuminate\Http\JsonResponse
 | |
|      */
 | |
|     public function delete(Request $request, $id)
 | |
|     {
 | |
|         $this->authorize('server-delete', $request->apiKey());
 | |
| 
 | |
|         $repo = new ServerRepository;
 | |
|         try {
 | |
|             $repo->delete($id, $request->has('force_delete'));
 | |
| 
 | |
|             return response('', 204);
 | |
|         } catch (DisplayException $ex) {
 | |
|             return response()->json([
 | |
|                 'error' => $ex->getMessage(),
 | |
|             ], 400);
 | |
|         } catch (TransferException $ex) {
 | |
|             Log::warning($ex);
 | |
| 
 | |
|             return response()->json([
 | |
|                 'error' => 'A TransferException was encountered while trying to contact the daemon, please ensure it is online and accessible. This error has been logged.',
 | |
|             ], 504);
 | |
|         } catch (\Exception $ex) {
 | |
|             Log::error($ex);
 | |
| 
 | |
|             return response()->json([
 | |
|                 'error' => 'An unhandled exception occured while attemping to add this server. Please try again.',
 | |
|             ], 500);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Update the details for a server.
 | |
|      *
 | |
|      * @param \Illuminate\Http\Request $request
 | |
|      * @param int                      $id
 | |
|      * @return \Illuminate\Http\JsonResponse|array
 | |
|      */
 | |
|     public function details(Request $request, $id)
 | |
|     {
 | |
|         $this->authorize('server-edit-details', $request->apiKey());
 | |
| 
 | |
|         $repo = new ServerRepository;
 | |
|         try {
 | |
|             $server = $repo->updateDetails($id, $request->intersect([
 | |
|                 'owner_id', 'name', 'description', 'reset_token',
 | |
|             ]));
 | |
| 
 | |
|             $fractal = Fractal::create()->item($server)->transformWith(new ServerTransformer($request));
 | |
|             if ($request->input('include')) {
 | |
|                 $fractal->parseIncludes(explode(',', $request->input('include')));
 | |
|             }
 | |
| 
 | |
|             return $fractal->withResourceName('server')->toArray();
 | |
|         } catch (DisplayValidationException $ex) {
 | |
|             return response()->json([
 | |
|                 'error' => json_decode($ex->getMessage()),
 | |
|             ], 400);
 | |
|         } catch (DisplayException $ex) {
 | |
|             return response()->json([
 | |
|                 'error' => $ex->getMessage(),
 | |
|             ], 400);
 | |
|         } catch (\Exception $ex) {
 | |
|             Log::error($ex);
 | |
| 
 | |
|             return response()->json([
 | |
|                 'error' => 'An unhandled exception occured while attemping to modify this server. Please try again.',
 | |
|             ], 500);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Set the new docker container for a server.
 | |
|      *
 | |
|      * @param \Illuminate\Http\Request $request
 | |
|      * @param int                      $id
 | |
|      * @return \Illuminate\Http\RedirectResponse|array
 | |
|      */
 | |
|     public function container(Request $request, $id)
 | |
|     {
 | |
|         $this->authorize('server-edit-container', $request->apiKey());
 | |
| 
 | |
|         $repo = new ServerRepository;
 | |
|         try {
 | |
|             $server = $repo->updateContainer($id, $request->intersect('docker_image'));
 | |
| 
 | |
|             $fractal = Fractal::create()->item($server)->transformWith(new ServerTransformer($request));
 | |
|             if ($request->input('include')) {
 | |
|                 $fractal->parseIncludes(explode(',', $request->input('include')));
 | |
|             }
 | |
| 
 | |
|             return $fractal->withResourceName('server')->toArray();
 | |
|         } catch (DisplayValidationException $ex) {
 | |
|             return response()->json([
 | |
|                 'error' => json_decode($ex->getMessage()),
 | |
|             ], 400);
 | |
|         } catch (TransferException $ex) {
 | |
|             Log::warning($ex);
 | |
| 
 | |
|             return response()->json([
 | |
|                 'error' => 'A TransferException was encountered while trying to contact the daemon, please ensure it is online and accessible. This error has been logged.',
 | |
|             ], 504);
 | |
|         } catch (\Exception $ex) {
 | |
|             Log::error($ex);
 | |
| 
 | |
|             return response()->json([
 | |
|                 'error' => 'An unhandled exception occured while attemping to modify this server container. Please try again.',
 | |
|             ], 500);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Toggles the install status for a server.
 | |
|      *
 | |
|      * @param \Illuminate\Http\Request $request
 | |
|      * @param int                      $id
 | |
|      * @return \Illuminate\Http\Response|\Illuminate\Http\JsonResponse
 | |
|      */
 | |
|     public function install(Request $request, $id)
 | |
|     {
 | |
|         $this->authorize('server-install', $request->apiKey());
 | |
| 
 | |
|         $repo = new ServerRepository;
 | |
|         try {
 | |
|             $repo->toggleInstall($id);
 | |
| 
 | |
|             return response('', 204);
 | |
|         } catch (DisplayException $ex) {
 | |
|             return response()->json([
 | |
|                 'error' => $ex->getMessage(),
 | |
|             ], 400);
 | |
|         } catch (\Exception $ex) {
 | |
|             Log::error($ex);
 | |
| 
 | |
|             return response()->json([
 | |
|                 'error' => 'An unhandled exception occured while attemping to toggle the install status for this server. Please try again.',
 | |
|             ], 500);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Setup a server to have a container rebuild.
 | |
|      *
 | |
|      * @param \Illuminate\Http\Request $request
 | |
|      * @param int                      $id
 | |
|      * @return \Illuminate\Http\Response|\Illuminate\Http\JsonResponse
 | |
|      */
 | |
|     public function rebuild(Request $request, $id)
 | |
|     {
 | |
|         $this->authorize('server-rebuild', $request->apiKey());
 | |
|         $server = Server::with('node')->findOrFail($id);
 | |
| 
 | |
|         try {
 | |
|             $server->node->guzzleClient([
 | |
|                 'X-Access-Server' => $server->uuid,
 | |
|                 'X-Access-Token' => $server->node->daemonSecret,
 | |
|             ])->request('POST', '/server/rebuild');
 | |
| 
 | |
|             return response('', 204);
 | |
|         } catch (TransferException $ex) {
 | |
|             Log::warning($ex);
 | |
| 
 | |
|             return response()->json([
 | |
|                 'error' => 'A TransferException was encountered while trying to contact the daemon, please ensure it is online and accessible. This error has been logged.',
 | |
|             ], 504);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Manage the suspension status for a server.
 | |
|      *
 | |
|      * @param \Illuminate\Http\Request $request
 | |
|      * @param int                      $id
 | |
|      * @return \Illuminate\Http\Response|\Illuminate\Http\JsonResponse
 | |
|      */
 | |
|     public function suspend(Request $request, $id)
 | |
|     {
 | |
|         $this->authorize('server-suspend', $request->apiKey());
 | |
| 
 | |
|         $repo = new ServerRepository;
 | |
|         $action = $request->input('action');
 | |
|         if (! in_array($action, ['suspend', 'unsuspend'])) {
 | |
|             return response()->json([
 | |
|                 'error' => 'The action provided was invalid. Action should be one of: suspend, unsuspend.',
 | |
|             ], 400);
 | |
|         }
 | |
| 
 | |
|         try {
 | |
|             $repo->toggleAccess($id, ($action === 'unsuspend'));
 | |
| 
 | |
|             return response('', 204);
 | |
|         } catch (DisplayException $ex) {
 | |
|             return response()->json([
 | |
|                 'error' => $ex->getMessage(),
 | |
|             ], 400);
 | |
|         } catch (TransferException $ex) {
 | |
|             Log::warning($ex);
 | |
| 
 | |
|             return response()->json([
 | |
|                 'error' => 'A TransferException was encountered while trying to contact the daemon, please ensure it is online and accessible. This error has been logged.',
 | |
|             ], 504);
 | |
|         } catch (\Exception $ex) {
 | |
|             Log::error($ex);
 | |
| 
 | |
|             return response()->json([
 | |
|                 'error' => 'An unhandled exception occured while attemping to ' . $action . ' this server. Please try again.',
 | |
|             ], 500);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Update the build configuration for a server.
 | |
|      *
 | |
|      * @param \Illuminate\Http\Request $request
 | |
|      * @param int                      $id
 | |
|      * @return \Illuminate\Http\JsonResponse|array
 | |
|      */
 | |
|     public function build(Request $request, $id)
 | |
|     {
 | |
|         $this->authorize('server-edit-build', $request->apiKey());
 | |
| 
 | |
|         $repo = new ServerRepository;
 | |
|         try {
 | |
|             $server = $repo->changeBuild($id, $request->intersect([
 | |
|                 'allocation_id', 'add_allocations', 'remove_allocations',
 | |
|                 'memory', 'swap', 'io', 'cpu',
 | |
|             ]));
 | |
| 
 | |
|             $fractal = Fractal::create()->item($server)->transformWith(new ServerTransformer($request));
 | |
|             if ($request->input('include')) {
 | |
|                 $fractal->parseIncludes(explode(',', $request->input('include')));
 | |
|             }
 | |
| 
 | |
|             return $fractal->withResourceName('server')->toArray();
 | |
|         } catch (DisplayValidationException $ex) {
 | |
|             return response()->json([
 | |
|                 'error' => json_decode($ex->getMessage()),
 | |
|             ], 400);
 | |
|         } catch (DisplayException $ex) {
 | |
|             return response()->json([
 | |
|                 'error' => $ex->getMessage(),
 | |
|             ], 400);
 | |
|         } catch (TransferException $ex) {
 | |
|             Log::warning($ex);
 | |
| 
 | |
|             return response()->json([
 | |
|                 'error' => 'A TransferException was encountered while trying to contact the daemon, please ensure it is online and accessible. This error has been logged.',
 | |
|             ], 504);
 | |
|         } catch (\Exception $ex) {
 | |
|             Log::error($ex);
 | |
| 
 | |
|             return response()->json([
 | |
|                 'error' => 'An unhandled exception occured while attemping to modify the build settings for this server. Please try again.',
 | |
|             ], 500);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Update the startup command as well as variables.
 | |
|      *
 | |
|      * @param \Illuminate\Http\Request $request
 | |
|      * @param int                      $id
 | |
|      * @return \Illuminate\Http\Response|\Illuminate\Http\JsonResponse
 | |
|      */
 | |
|     public function startup(Request $request, $id)
 | |
|     {
 | |
|         $this->authorize('server-edit-startup', $request->apiKey());
 | |
| 
 | |
|         $repo = new ServerRepository;
 | |
|         try {
 | |
|             $repo->updateStartup($id, $request->all(), true);
 | |
| 
 | |
|             return response('', 204);
 | |
|         } catch (DisplayValidationException $ex) {
 | |
|             return response()->json([
 | |
|                 'error' => json_decode($ex->getMessage()),
 | |
|             ], 400);
 | |
|         } catch (DisplayException $ex) {
 | |
|             return response()->json([
 | |
|                 'error' => $ex->getMessage(),
 | |
|             ], 400);
 | |
|         } catch (TransferException $ex) {
 | |
|             Log::warning($ex);
 | |
| 
 | |
|             return response()->json([
 | |
|                 'error' => 'A TransferException was encountered while trying to contact the daemon, please ensure it is online and accessible. This error has been logged.',
 | |
|             ], 504);
 | |
|         } catch (\Exception $ex) {
 | |
|             Log::error($ex);
 | |
| 
 | |
|             return response()->json([
 | |
|                 'error' => 'An unhandled exception occured while attemping to modify the startup settings for this server. Please try again.',
 | |
|             ], 500);
 | |
|         }
 | |
|     }
 | |
| }
 | 
