2016-11-16 01:20:32 +00:00
< ? php
/**
* Pterodactyl - Panel
2017-01-24 22:57:08 +00:00
* Copyright ( c ) 2015 - 2017 Dane Everitt < dane @ daneeveritt . com >.
2016-11-16 01:20:32 +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 :
*
* 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 .
*/
2016-12-14 21:56:25 +00:00
2016-11-16 01:20:32 +00:00
namespace Pterodactyl\Repositories\ServiceRepository ;
use DB ;
use Uuid ;
2016-12-14 21:56:25 +00:00
use Storage ;
2016-11-16 01:20:32 +00:00
use Validator ;
use Pterodactyl\Models ;
use Pterodactyl\Services\UuidService ;
use Pterodactyl\Exceptions\DisplayException ;
use Pterodactyl\Exceptions\DisplayValidationException ;
class Pack
{
public function __construct ()
{
//
}
public function create ( array $data )
{
$validator = Validator :: make ( $data , [
'name' => 'required|string' ,
'version' => 'required|string' ,
2016-11-16 22:22:22 +00:00
'description' => 'sometimes|nullable|string' ,
2016-11-16 01:20:32 +00:00
'option' => 'required|exists:service_options,id' ,
'selectable' => 'sometimes|boolean' ,
'visible' => 'sometimes|boolean' ,
'build_memory' => 'required|integer|min:0' ,
'build_swap' => 'required|integer|min:0' ,
'build_cpu' => 'required|integer|min:0' ,
'build_io' => 'required|integer|min:10|max:1000' ,
'build_container' => 'required|string' ,
2016-12-14 21:56:25 +00:00
'build_script' => 'sometimes|nullable|string' ,
2016-11-16 01:20:32 +00:00
]);
if ( $validator -> fails ()) {
throw new DisplayValidationException ( $validator -> errors ());
}
if ( isset ( $data [ 'file_upload' ])) {
2016-12-14 21:56:25 +00:00
if ( ! $data [ 'file_upload' ] -> isValid ()) {
2016-11-16 01:20:32 +00:00
throw new DisplayException ( 'The file provided does not appear to be valid.' );
}
2017-01-25 23:20:41 +00:00
if ( $data [ 'file_upload' ] -> getMimeType () !== 'application/gzip' ) {
throw new DisplayException ( 'The file provided does not meet the required filetype of application/gzip.' );
2016-11-16 01:20:32 +00:00
}
}
2016-11-16 22:22:22 +00:00
DB :: beginTransaction ();
try {
2016-11-16 01:20:32 +00:00
$uuid = new UuidService ;
$pack = Models\ServicePack :: create ([
'option' => $data [ 'option' ],
'uuid' => $uuid -> generate ( 'servers' , 'uuid' ),
'build_memory' => $data [ 'build_memory' ],
'build_swap' => $data [ 'build_swap' ],
'build_cpu' => $data [ 'build_swap' ],
'build_io' => $data [ 'build_io' ],
'build_script' => ( empty ( $data [ 'build_script' ])) ? null : $data [ 'build_script' ],
'build_container' => $data [ 'build_container' ],
'name' => $data [ 'name' ],
'version' => $data [ 'version' ],
'description' => ( empty ( $data [ 'description' ])) ? null : $data [ 'description' ],
'selectable' => isset ( $data [ 'selectable' ]),
2016-12-14 21:56:25 +00:00
'visible' => isset ( $data [ 'visible' ]),
2016-11-16 01:20:32 +00:00
]);
2016-11-16 22:22:22 +00:00
Storage :: makeDirectory ( 'packs/' . $pack -> uuid );
if ( isset ( $data [ 'file_upload' ])) {
2017-01-25 23:20:41 +00:00
$data [ 'file_upload' ] -> storeAs ( 'packs/' . $pack -> uuid , 'archive.tar.gz' );
2016-11-16 22:22:22 +00:00
}
DB :: commit ();
} catch ( \Exception $ex ) {
DB :: rollBack ();
throw $ex ;
}
return $pack -> id ;
}
public function createWithTemplate ( array $data )
{
2016-12-14 21:56:25 +00:00
if ( ! isset ( $data [ 'file_upload' ])) {
2016-11-16 22:22:22 +00:00
throw new DisplayException ( 'No template file was found submitted with this request.' );
}
2016-11-16 01:20:32 +00:00
2016-12-14 21:56:25 +00:00
if ( ! $data [ 'file_upload' ] -> isValid ()) {
2016-11-16 22:22:22 +00:00
throw new DisplayException ( 'The file provided does not appear to be valid.' );
}
2016-11-16 01:20:32 +00:00
2016-12-14 21:56:25 +00:00
if ( ! in_array ( $data [ 'file_upload' ] -> getMimeType (), [
2016-11-16 22:22:22 +00:00
'application/zip' ,
'text/plain' ,
2016-12-14 21:56:25 +00:00
'application/json' ,
2016-11-16 22:22:22 +00:00
])) {
throw new DisplayException ( 'The file provided (' . $data [ 'file_upload' ] -> getMimeType () . ') does not meet the required filetypes of application/zip or application/json.' );
}
if ( $data [ 'file_upload' ] -> getMimeType () === 'application/zip' ) {
$zip = new \ZipArchive ;
2016-12-14 21:56:25 +00:00
if ( ! $zip -> open ( $data [ 'file_upload' ] -> path ())) {
2016-11-16 22:22:22 +00:00
throw new DisplayException ( 'The uploaded archive was unable to be opened.' );
}
$isTar = $zip -> locateName ( 'archive.tar.gz' );
2017-01-25 23:20:41 +00:00
if ( ! $zip -> locateName ( 'import.json' ) || ! $isTar ) {
2016-11-16 22:22:22 +00:00
throw new DisplayException ( 'This contents of the provided archive were in an invalid format.' );
}
$json = json_decode ( $zip -> getFromName ( 'import.json' ));
$id = $this -> create ([
'name' => $json -> name ,
'version' => $json -> version ,
'description' => $json -> description ,
'option' => $data [ 'option' ],
'selectable' => $json -> selectable ,
'visible' => $json -> visible ,
'build_memory' => $json -> build -> memory ,
'build_swap' => $json -> build -> swap ,
'build_cpu' => $json -> build -> cpu ,
'build_io' => $json -> build -> io ,
'build_container' => $json -> build -> container ,
2016-12-14 21:56:25 +00:00
'build_script' => $json -> build -> script ,
2016-11-16 22:22:22 +00:00
]);
$pack = Models\ServicePack :: findOrFail ( $id );
2017-01-25 23:20:41 +00:00
if ( ! $zip -> extractTo ( storage_path ( 'app/packs/' . $pack -> uuid ), 'archive.tar.gz' )) {
2016-11-16 22:22:22 +00:00
$pack -> delete ();
throw new DisplayException ( 'Unable to extract the archive file to the correct location.' );
}
$zip -> close ();
2016-12-14 21:56:25 +00:00
2016-11-16 01:20:32 +00:00
return $pack -> id ;
2016-11-16 22:22:22 +00:00
} else {
$json = json_decode ( file_get_contents ( $data [ 'file_upload' ] -> path ()));
2016-12-14 21:56:25 +00:00
2016-11-16 22:22:22 +00:00
return $this -> create ([
'name' => $json -> name ,
'version' => $json -> version ,
'description' => $json -> description ,
'option' => $data [ 'option' ],
'selectable' => $json -> selectable ,
'visible' => $json -> visible ,
'build_memory' => $json -> build -> memory ,
'build_swap' => $json -> build -> swap ,
'build_cpu' => $json -> build -> cpu ,
'build_io' => $json -> build -> io ,
'build_container' => $json -> build -> container ,
2016-12-14 21:56:25 +00:00
'build_script' => $json -> build -> script ,
2016-11-16 22:22:22 +00:00
]);
}
2016-11-16 01:20:32 +00:00
}
2016-11-16 21:09:28 +00:00
public function update ( $id , array $data )
{
$validator = Validator :: make ( $data , [
'name' => 'required|string' ,
'version' => 'required|string' ,
'description' => 'string' ,
'option' => 'required|exists:service_options,id' ,
'selectable' => 'sometimes|boolean' ,
'visible' => 'sometimes|boolean' ,
'build_memory' => 'required|integer|min:0' ,
'build_swap' => 'required|integer|min:0' ,
'build_cpu' => 'required|integer|min:0' ,
'build_io' => 'required|integer|min:10|max:1000' ,
'build_container' => 'required|string' ,
2016-12-14 21:56:25 +00:00
'build_script' => 'sometimes|string' ,
2016-11-16 21:09:28 +00:00
]);
if ( $validator -> fails ()) {
throw new DisplayValidationException ( $validator -> errors ());
}
DB :: transaction ( function () use ( $id , $data ) {
Models\ServicePack :: findOrFail ( $id ) -> update ([
'option' => $data [ 'option' ],
'build_memory' => $data [ 'build_memory' ],
'build_swap' => $data [ 'build_swap' ],
'build_cpu' => $data [ 'build_swap' ],
'build_io' => $data [ 'build_io' ],
'build_script' => ( empty ( $data [ 'build_script' ])) ? null : $data [ 'build_script' ],
'build_container' => $data [ 'build_container' ],
'name' => $data [ 'name' ],
'version' => $data [ 'version' ],
'description' => ( empty ( $data [ 'description' ])) ? null : $data [ 'description' ],
'selectable' => isset ( $data [ 'selectable' ]),
2016-12-14 21:56:25 +00:00
'visible' => isset ( $data [ 'visible' ]),
2016-11-16 21:09:28 +00:00
]);
return true ;
});
}
2016-12-14 21:56:25 +00:00
public function delete ( $id )
{
2016-11-18 22:31:57 +00:00
$pack = Models\ServicePack :: findOrFail ( $id );
// @TODO Check for linked servers; foreign key should block this.
DB :: transaction ( function () use ( $pack ) {
$pack -> delete ();
Storage :: deleteDirectory ( 'packs/' . $pack -> uuid );
});
}
2016-11-16 01:20:32 +00:00
}