diff --git a/CHANGELOG.md b/CHANGELOG.md
index 438425131..e1426d64a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,7 @@ This project follows [Semantic Versioning](http://semver.org) guidelines.
### Added
* Support for creating server without having to assign a node and allocation manually. Simply select the checkbox or pass `auto_deploy=true` to the API to auto-select a node and allocation given a location.
+* Support for setting IP Aliases through the panel on the node overview page. Also cleaned up allocation removal.
### Changed
* Prevent clicking server start button until server is completely off, not just stopping.
diff --git a/app/Http/Controllers/Admin/NodesController.php b/app/Http/Controllers/Admin/NodesController.php
index 75ed5043a..26051081e 100644
--- a/app/Http/Controllers/Admin/NodesController.php
+++ b/app/Http/Controllers/Admin/NodesController.php
@@ -96,32 +96,21 @@ class NodesController extends Controller
public function getView(Request $request, $id)
{
$node = Models\Node::findOrFail($id);
- $allocations = [];
- $alloc = Models\Allocation::select('ip', 'port', 'assigned_to')->where('node', $node->id)->orderBy('ip', 'asc')->orderBy('port', 'asc')->get();
- if ($alloc) {
- foreach($alloc as &$alloc) {
- if (!array_key_exists($alloc->ip, $allocations)) {
- $allocations[$alloc->ip] = [[
- 'port' => $alloc->port,
- 'assigned_to' => $alloc->assigned_to
- ]];
- } else {
- array_push($allocations[$alloc->ip], [
- 'port' => $alloc->port,
- 'assigned_to' => $alloc->assigned_to
- ]);
- }
- }
- }
+
return view('admin.nodes.view', [
'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')
- ->where('node', $id)->paginate(10),
+ ->where('node', $id)->paginate(10, ['*'], 'servers'),
'stats' => Models\Server::select(DB::raw('SUM(memory) as memory, SUM(disk) as disk'))->where('node', $node->id)->first(),
'locations' => Models\Location::all(),
- 'allocations' => json_decode(json_encode($allocations), false),
+ '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'),
]);
}
@@ -151,24 +140,51 @@ class NodesController extends Controller
])->withInput();
}
- public function deleteAllocation(Request $request, $id, $ip, $port = null)
+ public function deallocateSingle(Request $request, $node, $allocation)
{
- $query = Models\Allocation::where('node', $id)->whereNull('assigned_to')->where('ip', $ip);
- if (is_null($port) || $port === 'undefined') {
- $allocation = $query;
- } else {
- $allocation = $query->where('port', $port)->first();
- }
-
- if (!$allocation) {
+ $query = Models\Allocation::where('node', $node)->whereNull('assigned_to')->where('id', $allocation)->delete();
+ if ((int) $query === 0) {
return response()->json([
'error' => 'Unable to find an allocation matching those details to delete.'
], 400);
}
- $allocation->delete();
return response('', 204);
}
+ 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 ' . $request->input('ip') . '
.')->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'));
+ $update->ip_alias = $request->input('alias');
+ $update->save();
+
+ return response('', 204);
+ } catch (\Exception $ex) {
+ throw $ex;
+ }
+ }
+
public function getAllocationsJson(Request $request, $id)
{
$allocations = Models\Allocation::select('ip')->where('node', $id)->groupBy('ip')->get();
diff --git a/app/Http/Routes/AdminRoutes.php b/app/Http/Routes/AdminRoutes.php
index 2a209e35b..a1d1956e0 100644
--- a/app/Http/Routes/AdminRoutes.php
+++ b/app/Http/Routes/AdminRoutes.php
@@ -243,8 +243,17 @@ class AdminRoutes {
'uses' => 'Admin\NodesController@postView'
]);
- $router->delete('/view/{id}/allocation/{ip}/{port?}', [
- 'uses' => 'Admin\NodesController@deleteAllocation'
+ $router->delete('/view/{id}/deallocate/single/{allocation}', [
+ 'uses' => 'Admin\NodesController@deallocateSingle'
+ ]);
+
+ $router->post('/view/{id}/deallocate/block', [
+ 'uses' => 'Admin\NodesController@deallocateBlock'
+ ]);
+
+ $router->post('/view/{id}/alias', [
+ 'as' => 'admin.nodes.alias',
+ 'uses' => 'Admin\NodesController@setAlias'
]);
$router->get('/view/{id}/allocations.json', [
diff --git a/public/themes/default/css/pterodactyl.css b/public/themes/default/css/pterodactyl.css
index 04798f049..6284089f9 100755
--- a/public/themes/default/css/pterodactyl.css
+++ b/public/themes/default/css/pterodactyl.css
@@ -90,6 +90,21 @@ body{font-size:13px}
.btn-xxs{padding:2px 6px;font-size:10px;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:2px}
.form-control{height:36px}
.input-group-addon{font-size:12px;}
+.input-sm {
+ height: 30px;
+ padding: 4px 8px !important;
+ font-size: 12px !important;
+ border-radius: 2px;
+}
+.input-loader {
+ display: none;
+ position:relative;
+ top: -23px;
+ float: right;
+ right: 5px;
+ color: #cccccc;
+ height: 0;
+}
pre{display:block;padding:12px 12px;margin:0;font-size:12px;color:#c7254e;background-color:#f9f2f4;border:1px solid #c7254e;border-radius:0;white-space:pre}
.badge.label-danger {background: #d9534f !important;}
.close {color:#000;opacity:0.2;font-size:1.6em;}
@@ -102,6 +117,9 @@ form .text-muted {margin: 0 0 -5.5px}
.label{border-radius: .25em;padding: .2em .6em .3em;}
kbd{border-radius: .25em}
.modal-open .modal {padding-left: 0px !important;padding-right: 0px !important;overflow-y: scroll;}
+.align-middle {
+ vertical-align: middle !important;
+}
/**
* Pillboxes
diff --git a/resources/views/admin/nodes/view.blade.php b/resources/views/admin/nodes/view.blade.php
index 811ebda29..5f70604fd 100644
--- a/resources/views/admin/nodes/view.blade.php
+++ b/resources/views/admin/nodes/view.blade.php
@@ -307,45 +307,6 @@
IP Address | -Ports | -- - - @foreach($allocations as $ip => $ports) - |
{{ $ip }} | -
- @foreach($ports as $id => $allocation)
- @if (($id % 2) === 0)
- @if($allocation->assigned_to === null)
- {{ $allocation->port }} - @else - {{ $allocation->port }} - @endif - @endif - @endforeach - |
-
- @foreach($ports as $id => $allocation)
- @if (($id % 2) === 1)
- @if($allocation->assigned_to === null)
- {{ $allocation->port }} - @else - {{ $allocation->port }} - @endif - @endif - @endforeach - |
-
IP Address | +IP Alias | +Port | +Assigned To | ++ + + @foreach($allocations as $allocation) + |
{{ $allocation->ip }} | ++ + + | +{{ $allocation->port }} | +@if(!is_null($allocation->assigned_to)){{ $allocation->assigned_to_name }}@endif | ++ @if(is_null($allocation->assigned_to)) + + @else + + @endif + | +