server instanceof Server === false) { throw new \RuntimeException('Server is not set or is not an instance of Server model'); } $commandsText->each(function ($single_command) { $command = data_get($single_command, 'command') ?? $single_command[0] ?? null; if ($command === null) { throw new \RuntimeException('Command is not set'); } $hidden = data_get($single_command, 'hidden', false); $customType = data_get($single_command, 'type'); $ignore_errors = data_get($single_command, 'ignore_errors', false); $this->save = data_get($single_command, 'save'); $remote_command = generateSshCommand($this->server, $command); $process = Process::timeout(3600)->idleTimeout(3600)->start($remote_command, function (string $type, string $output) use ($command, $hidden, $customType) { $output = Str::of($output)->trim(); if ($output->startsWith('╔')) { $output = "\n" . $output; } $new_log_entry = [ 'command' => remove_iip($command), 'output' => remove_iip($output), 'type' => $customType ?? $type === 'err' ? 'stderr' : 'stdout', 'timestamp' => Carbon::now('UTC'), 'hidden' => $hidden, 'batch' => static::$batch_counter, ]; if (!$this->log_model->logs) { $new_log_entry['order'] = 1; } else { $previous_logs = json_decode($this->log_model->logs, associative: true, flags: JSON_THROW_ON_ERROR); $new_log_entry['order'] = count($previous_logs) + 1; } $previous_logs[] = $new_log_entry; $this->log_model->logs = json_encode($previous_logs, flags: JSON_THROW_ON_ERROR); $this->log_model->save(); if ($this->save) { $this->saved_outputs[$this->save] = Str::of($output)->trim(); } }); $this->log_model->update([ 'current_process_id' => $process->id(), ]); $process_result = $process->wait(); if ($process_result->exitCode() !== 0) { if (!$ignore_errors) { $status = ApplicationDeploymentStatus::FAILED->value; $this->log_model->status = $status; $this->log_model->save(); throw new \RuntimeException($process_result->errorOutput()); } } }); } }