argument('action'); $nodes = empty($this->option('nodes')) ? [] : explode(',', $this->option('nodes')); $servers = empty($this->option('servers')) ? [] : explode(',', $this->option('servers')); $validator = $validator->make([ 'action' => $action, 'nodes' => $nodes, 'servers' => $servers, ], [ 'action' => 'string|in:start,stop,kill,restart', 'nodes' => 'array', 'nodes.*' => 'integer|min:1', 'servers' => 'array', 'servers.*' => 'integer|min:1', ]); if ($validator->fails()) { foreach ($validator->getMessageBag()->all() as $message) { $this->output->error($message); } throw new ValidationException($validator); } $count = $this->getQueryBuilder($servers, $nodes)->count(); if (! $this->confirm(trans('command/messages.server.power.confirm', ['action' => $action, 'count' => $count])) && $this->input->isInteractive()) { return; } $bar = $this->output->createProgressBar($count); $this->getQueryBuilder($servers, $nodes)->each(function (Server $server) use ($action, $powerRepository, &$bar) { $bar->clear(); try { $powerRepository->setServer($server)->send($action); } catch (DaemonConnectionException $exception) { $this->output->error(trans('command/messages.server.power.action_failed', [ 'name' => $server->name, 'id' => $server->id, 'node' => $server->node->name, 'message' => $exception->getMessage(), ])); } $bar->advance(); $bar->display(); }); $this->line(''); } /** * Returns the query builder instance that will return the servers that should be affected. * * @param array $servers * @param array $nodes * @return \Illuminate\Database\Eloquent\Builder */ protected function getQueryBuilder(array $servers, array $nodes) { $instance = Server::query() ->where('suspended', false) ->where('installed', Server::STATUS_INSTALLED); if (! empty($nodes) && ! empty($servers)) { $instance->whereIn('id', $servers)->orWhereIn('node_id', $nodes); } else if (empty($nodes) && ! empty($servers)) { $instance->whereIn('id', $servers); } else if (! empty($nodes) && empty($servers)) { $instance->whereIn('node_id', $nodes); } return $instance->with('node'); } }