diff --git a/app/Console/Commands/RebuildServer.php b/app/Console/Commands/RebuildServer.php new file mode 100644 index 000000000..8f6f1fe1b --- /dev/null +++ b/app/Console/Commands/RebuildServer.php @@ -0,0 +1,122 @@ +. + * + * 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. + */ + +namespace Pterodactyl\Console\Commands; + +use Pterodactyl\Models\Node; +use Pterodactyl\Models\Server; +use Illuminate\Console\Command; + +class RebuildServer extends Command +{ + /** + * The name and signature of the console command. + * + * @var string + */ + protected $signature = 'pterodactyl:rebuild + {--all} + {--node= : Id of node to rebuild all servers on.} + {--server= : UUID of server to rebuild.}'; + + /** + * The console command description. + * + * @var string + */ + protected $description = 'Rebuild docker containers for a server or multiple servers.'; + + /** + * Create a new command instance. + * + * @return void + */ + public function __construct() + { + parent::__construct(); + } + + /** + * Execute the console command. + * + * @return mixed + */ + public function handle() + { + if ($this->option('all')) { + $servers = Server::with('node')->get(); + } elseif ($this->option('node')) { + $servers = Server::with('node')->where('node_id', $this->option('node'))->get(); + } elseif ($this->option('server')) { + $servers = Server::with('node')->where('id', $this->option('server'))->get(); + } else { + $this->error('You must pass a flag to determine which server(s) to rebuild.'); + return; + } + + $this->line('Beginning processing, do not exit this script.'); + $bar = $this->output->createProgressBar(count($servers)); + $results = collect([]); + foreach($servers as $server) { + try { + $server->node->guzzleClient([ + 'X-Access-Server' => $server->uuid, + 'X-Access-Token' => $server->node->daemonSecret, + ])->request('POST', '/server/rebuild'); + + $results = $results->merge([ + $server->uuid => [ + 'status' => 'info', + 'messages' => [ + '[✓] Processed rebuild request for ' . $server->uuid, + ], + ], + ]); + } catch (\Exception $ex) { + $results = $results->merge([ + $server->uuid => [ + 'status' => 'error', + 'messages' => [ + '[✗] Failed to process rebuild request for ' . $server->uuid, + $ex->getMessage(), + ], + ], + ]); + } + + $bar->advance(); + } + + $bar->finish(); + $console = $this; + + $this->line("\n"); + $results->each(function ($item, $key) use ($console) { + foreach($item['messages'] as $line) { + $console->{$item['status']}($line); + } + }); + $this->line("\nCompleted rebuild command processing."); + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index d55c3525f..bba5bb66e 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -24,6 +24,7 @@ class Kernel extends ConsoleKernel \Pterodactyl\Console\Commands\CleanServiceBackup::class, \Pterodactyl\Console\Commands\AddNode::class, \Pterodactyl\Console\Commands\AddLocation::class, + \Pterodactyl\Console\Commands\RebuildServer::class, ]; /**