2016-01-05 04:59:45 +00:00
< ? php
2016-01-20 00:10:39 +00:00
/**
2016-01-20 21:05:16 +00:00
* Pterodactyl - Panel
2016-01-20 00:10:39 +00:00
* Copyright ( c ) 2015 - 2016 Dane Everitt < dane @ daneeveritt . com >
*
2016-01-20 20:56:40 +00:00
* 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 :
2016-01-20 00:10:39 +00:00
*
2016-01-20 20:56:40 +00:00
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software .
2016-01-20 00:10:39 +00:00
*
2016-01-20 20:56:40 +00:00
* 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 .
2016-01-20 00:10:39 +00:00
*/
2016-01-05 04:59:45 +00:00
namespace Pterodactyl\Http\Controllers\Admin ;
use Alert ;
use Debugbar ;
use Log ;
use DB ;
use Pterodactyl\Models ;
use Pterodactyl\Repositories\NodeRepository ;
2016-09-07 20:12:06 +00:00
use Pterodactyl\Exceptions\DisplayException ;
use Pterodactyl\Exceptions\DisplayValidationException ;
2016-01-05 04:59:45 +00:00
use Pterodactyl\Http\Controllers\Controller ;
use Illuminate\Http\Request ;
class NodesController extends Controller
{
/**
* Controller Constructor
*/
public function __construct ()
{
//
}
2016-02-06 04:41:16 +00:00
public function getScript ( Request $request , $id )
{
return response () -> view ( 'admin.nodes.remote.deploy' , [ 'node' => Models\Node :: findOrFail ( $id ) ]) -> header ( 'Content-Type' , 'text/plain' );
}
2016-01-05 04:59:45 +00:00
public function getIndex ( Request $request )
{
return view ( 'admin.nodes.index' , [
'nodes' => Models\Node :: select (
'nodes.*' ,
'locations.long as a_locationName' ,
DB :: raw ( '(SELECT COUNT(*) FROM servers WHERE servers.node = nodes.id) as a_serverCount' )
) -> join ( 'locations' , 'nodes.location' , '=' , 'locations.id' ) -> paginate ( 20 ),
]);
}
public function getNew ( Request $request )
{
2016-09-30 20:05:39 +00:00
if ( ! Models\Location :: all () -> count ()) {
Alert :: warning ( 'You must add a location before you can add a new node.' ) -> flash ();
return redirect () -> route ( 'admin.locations' );
}
2016-01-05 04:59:45 +00:00
return view ( 'admin.nodes.new' , [
'locations' => Models\Location :: all ()
]);
}
public function postNew ( Request $request )
{
try {
$node = new NodeRepository ;
$new = $node -> create ( $request -> except ([
'_token'
]));
2016-09-29 21:47:47 +00:00
Alert :: success ( 'Successfully created new node. <strong>Before you can add any servers you need to first assign some IP addresses and ports.</strong>' ) -> flash ();
2016-01-05 04:59:45 +00:00
return redirect () -> route ( 'admin.nodes.view' , [
2016-09-29 21:47:47 +00:00
'id' => $new ,
'tab' => 'tab_allocation'
2016-01-05 04:59:45 +00:00
]);
2016-09-07 20:12:06 +00:00
} catch ( DisplayValidationException $e ) {
2016-01-05 04:59:45 +00:00
return redirect () -> route ( 'admin.nodes.new' ) -> withErrors ( json_decode ( $e -> getMessage ())) -> withInput ();
2016-09-07 20:12:06 +00:00
} catch ( DisplayException $e ) {
2016-01-05 04:59:45 +00:00
Alert :: danger ( $e -> getMessage ()) -> flash ();
} catch ( \Exception $e ) {
Log :: error ( $e );
Alert :: danger ( 'An unhandled exception occured while attempting to add this node. Please try again.' ) -> flash ();
}
return redirect () -> route ( 'admin.nodes.new' ) -> withInput ();
}
public function getView ( Request $request , $id )
{
$node = Models\Node :: findOrFail ( $id );
2016-09-30 01:34:20 +00:00
2016-01-05 04:59:45 +00:00
return view ( 'admin.nodes.view' , [
2016-01-05 05:52:20 +00:00
'node' => $node ,
'servers' => Models\Server :: select ( 'servers.*' , 'users.email as a_ownerEmail' , 'services.name as a_serviceName' )
-> join ( 'users' , 'users.id' , '=' , 'servers.owner' )
-> join ( 'services' , 'services.id' , '=' , 'servers.service' )
2016-09-30 01:34:20 +00:00
-> where ( 'node' , $id ) -> paginate ( 10 , [ '*' ], 'servers' ),
2016-01-05 23:31:25 +00:00
'stats' => Models\Server :: select ( DB :: raw ( 'SUM(memory) as memory, SUM(disk) as disk' )) -> where ( 'node' , $node -> id ) -> first (),
'locations' => Models\Location :: all (),
2016-09-30 01:34:20 +00:00
'allocations' => Models\Allocation :: select ( 'allocations.*' , 'servers.name as assigned_to_name' )
-> where ( 'allocations.node' , $node -> id )
-> leftJoin ( 'servers' , 'servers.id' , '=' , 'allocations.assigned_to' )
-> orderBy ( 'allocations.ip' , 'asc' )
-> orderBy ( 'allocations.port' , 'asc' )
-> paginate ( 20 , [ '*' ], 'allocations' ),
2016-01-05 04:59:45 +00:00
]);
}
2016-01-05 23:31:25 +00:00
public function postView ( Request $request , $id )
{
try {
$node = new NodeRepository ;
$node -> update ( $id , $request -> except ([
'_token'
]));
Alert :: success ( 'Successfully update this node\'s information. If you changed any daemon settings you will need to restart it now.' ) -> flash ();
return redirect () -> route ( 'admin.nodes.view' , [
'id' => $id ,
'tab' => 'tab_settings'
]);
2016-09-07 20:12:06 +00:00
} catch ( DisplayValidationException $e ) {
2016-01-05 23:31:25 +00:00
return redirect () -> route ( 'admin.nodes.view' , $id ) -> withErrors ( json_decode ( $e -> getMessage ())) -> withInput ();
2016-09-07 20:12:06 +00:00
} catch ( DisplayException $e ) {
2016-01-05 23:31:25 +00:00
Alert :: danger ( $e -> getMessage ()) -> flash ();
} catch ( \Exception $e ) {
Log :: error ( $e );
Alert :: danger ( 'An unhandled exception occured while attempting to edit this node. Please try again.' ) -> flash ();
}
return redirect () -> route ( 'admin.nodes.view' , [
'id' => $id ,
'tab' => 'tab_settings'
]) -> withInput ();
}
2016-09-30 01:34:20 +00:00
public function deallocateSingle ( Request $request , $node , $allocation )
2016-01-09 01:01:18 +00:00
{
2016-09-30 01:34:20 +00:00
$query = Models\Allocation :: where ( 'node' , $node ) -> whereNull ( 'assigned_to' ) -> where ( 'id' , $allocation ) -> delete ();
if (( int ) $query === 0 ) {
2016-01-09 01:01:18 +00:00
return response () -> json ([
'error' => 'Unable to find an allocation matching those details to delete.'
], 400 );
}
return response ( '' , 204 );
}
2016-09-30 01:34:20 +00:00
public function deallocateBlock ( Request $request , $node )
{
$query = Models\Allocation :: where ( 'node' , $node ) -> whereNull ( 'assigned_to' ) -> where ( 'ip' , $request -> input ( 'ip' )) -> delete ();
if (( int ) $query === 0 ) {
Alert :: danger ( 'There was an error while attempting to delete allocations on that IP.' ) -> flash ();
return redirect () -> route ( 'admin.nodes.view' , [
'id' => $node ,
'tab' => 'tab_allocations'
]);
}
Alert :: success ( 'Deleted all unallocated ports for <code>' . $request -> input ( 'ip' ) . '</code>.' ) -> flash ();
return redirect () -> route ( 'admin.nodes.view' , [
'id' => $node ,
'tab' => 'tab_allocations'
]);
}
public function setAlias ( Request $request , $node )
{
if ( ! $request -> input ( 'allocation' )) {
return response ( 'Missing required parameters.' , 422 );
}
try {
$update = Models\Allocation :: findOrFail ( $request -> input ( 'allocation' ));
2016-09-30 20:01:36 +00:00
$update -> ip_alias = ( empty ( $request -> input ( 'alias' ))) ? null : $request -> input ( 'alias' );
2016-09-30 01:34:20 +00:00
$update -> save ();
return response ( '' , 204 );
} catch ( \Exception $ex ) {
throw $ex ;
}
}
2016-01-10 05:38:16 +00:00
public function getAllocationsJson ( Request $request , $id )
{
$allocations = Models\Allocation :: select ( 'ip' ) -> where ( 'node' , $id ) -> groupBy ( 'ip' ) -> get ();
return response () -> json ( $allocations );
}
public function postAllocations ( Request $request , $id )
{
$processedData = [];
foreach ( $request -> input ( 'allocate_ip' ) as $ip ) {
if ( ! array_key_exists ( $ip , $processedData )) {
$processedData [ $ip ] = [];
}
}
foreach ( $request -> input ( 'allocate_port' ) as $portid => $ports ) {
if ( array_key_exists ( $portid , $request -> input ( 'allocate_ip' ))) {
$json = json_decode ( $ports );
if ( json_last_error () === 0 && ! empty ( $json )) {
foreach ( $json as & $parsed ) {
array_push ( $processedData [ $request -> input ( 'allocate_ip' )[ $portid ]], $parsed -> value );
}
}
}
}
try {
if ( empty ( $processedData )) {
2016-09-07 20:12:06 +00:00
throw new DisplayException ( 'It seems that no data was passed to this function.' );
2016-01-10 05:38:16 +00:00
}
$node = new NodeRepository ;
$node -> addAllocations ( $id , $processedData );
Alert :: success ( 'Successfully added new allocations to this node.' ) -> flash ();
2016-09-07 20:12:06 +00:00
} catch ( DisplayException $e ) {
2016-01-10 05:38:16 +00:00
Alert :: danger ( $e -> getMessage ()) -> flash ();
} catch ( \Exception $e ) {
Log :: error ( $e );
Alert :: danger ( 'An unhandled exception occured while attempting to add allocations this node. Please try again.' ) -> flash ();
} finally {
return redirect () -> route ( 'admin.nodes.view' , [
'id' => $id ,
'tab' => 'tab_allocation'
]);
}
}
2016-01-10 21:59:19 +00:00
public function deleteNode ( Request $request , $id )
{
$node = Models\Node :: findOrFail ( $id );
$servers = Models\Server :: where ( 'node' , $id ) -> count ();
if ( $servers > 0 ) {
Alert :: danger ( 'You cannot delete a node with servers currently attached to it.' ) -> flash ();
return redirect () -> route ( 'admin.nodes.view' , [
'id' => $id ,
'tab' => 'tab_delete'
]);
}
$node -> delete ();
Alert :: success ( 'Node successfully deleted.' ) -> flash ();
return redirect () -> route ( 'admin.nodes' );
}
2016-01-05 04:59:45 +00:00
}