Path: blob/1.0-develop/app/Console/Commands/Server/BulkPowerActionCommand.php
7461 views
<?php12namespace Pterodactyl\Console\Commands\Server;34use Pterodactyl\Models\Server;5use Illuminate\Console\Command;6use Illuminate\Database\Eloquent\Builder;7use Illuminate\Validation\ValidationException;8use Illuminate\Validation\Factory as ValidatorFactory;9use Pterodactyl\Repositories\Wings\DaemonPowerRepository;10use Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException;1112class BulkPowerActionCommand extends Command13{14protected $signature = 'p:server:bulk-power15{action : The action to perform (start, stop, restart, kill)}16{--servers= : A comma separated list of servers.}17{--nodes= : A comma separated list of nodes.}';1819protected $description = 'Perform bulk power management on large groupings of servers or nodes at once.';2021/**22* BulkPowerActionCommand constructor.23*/24public function __construct(private DaemonPowerRepository $powerRepository, private ValidatorFactory $validator)25{26parent::__construct();27}2829/**30* Handle the bulk power request.31*32* @throws ValidationException33*/34public function handle()35{36$action = $this->argument('action');37$nodes = empty($this->option('nodes')) ? [] : explode(',', $this->option('nodes'));38$servers = empty($this->option('servers')) ? [] : explode(',', $this->option('servers'));3940$validator = $this->validator->make([41'action' => $action,42'nodes' => $nodes,43'servers' => $servers,44], [45'action' => 'string|in:start,stop,kill,restart',46'nodes' => 'array',47'nodes.*' => 'integer|min:1',48'servers' => 'array',49'servers.*' => 'integer|min:1',50]);5152if ($validator->fails()) {53foreach ($validator->getMessageBag()->all() as $message) {54$this->output->error($message);55}5657throw new ValidationException($validator);58}5960$count = $this->getQueryBuilder($servers, $nodes)->count();61if (!$this->confirm(trans('command/messages.server.power.confirm', ['action' => $action, 'count' => $count])) && $this->input->isInteractive()) {62return;63}6465$bar = $this->output->createProgressBar($count);66$powerRepository = $this->powerRepository;67$this->getQueryBuilder($servers, $nodes)->each(function (Server $server) use ($action, $powerRepository, &$bar) {68$bar->clear();6970try {71$powerRepository->setServer($server)->send($action);72} catch (DaemonConnectionException $exception) {73$this->output->error(trans('command/messages.server.power.action_failed', [74'name' => $server->name,75'id' => $server->id,76'node' => $server->node->name,77'message' => $exception->getMessage(),78]));79}8081$bar->advance();82$bar->display();83});8485$this->line('');86}8788/**89* Returns the query builder instance that will return the servers that should be affected.90*/91protected function getQueryBuilder(array $servers, array $nodes): Builder92{93$instance = Server::query()->whereNull('status');9495if (!empty($nodes) && !empty($servers)) {96$instance->whereIn('id', $servers)->orWhereIn('node_id', $nodes);97} elseif (empty($nodes) && !empty($servers)) {98$instance->whereIn('id', $servers);99} elseif (!empty($nodes) && empty($servers)) {100$instance->whereIn('node_id', $nodes);101}102103return $instance->with('node');104}105}106107108