error('This operation can take some time, depending on how many devices are configured for this task!!!'); // get ids from command $ids = (new FilterArgsForCommnds)->filterArgs($this->argument('taskid')); $this->debug = $this->option('debug'); $this->info('Start ' . $this->eventtype . ' IDs:' . implode(' ', $ids)); $logmsg = 'CLI Download Started for ' . ($this->eventtype . 'IDs:' . implode(' ', $ids)); activityLogIt(__CLASS__, __FUNCTION__, 'info', $logmsg, 'connection', '', '', $this->eventtype, $ids); $tasks = (new GetAndCheckTaskIds($ids))->GetTaskRecords(); // error if none returned if (count($tasks) === 0) { $this->info('No task records returned. Download will now terminate!'); return; } $this->report_data = collect(); foreach ($tasks as $task) { $this->report_data->report_id = (string) Str::uuid(); $this->report_data->task_type = 'Task Download Report'; $this->report_data->task = $task; $this->report_data->start_time = Carbon::now(); //CATEGORY BELOW HERE if ($task->category->count() > 0) { $categoryrecords = (new GetAndCheckCategoryIds($task->category->pluck('id')->toArray()))->GetCategoryRecords(); if (!$this->checkRecordCount(count($categoryrecords))) { return; } foreach ($categoryrecords as $categoryrecord) { $this->devicerecords = $categoryrecord->device; if ($this->debug) { $this->runDeviceManualJobs(); } else { $this->runDeviceBatchJob($task->task_name, 'Category: ' . $categoryrecord->categoryName . ' [' . $categoryrecord->id . ']'); } } } //TAGS BELOW HERE if ($task->tag->count() > 0) { $tagrecords = (new GetAndCheckTagIds($task->tag->pluck('id')->toArray()))->GetTagRecords(); if (!$this->checkRecordCount(count($tagrecords))) { return; } foreach ($tagrecords as $tagrecord) { $this->devicerecords = $tagrecord->device; if ($this->debug) { $this->runDeviceManualJobs(); } else { $this->runDeviceBatchJob($task->task_name, 'Tag: ' . $tagrecord->tagname . ' [' . $tagrecord->id . ']'); } } } //DEVICES BELOW HERE if ($task->device->count() > 0) { $this->devicerecords = (new GetAndCheckDeviceIds($task->device->pluck('id')->toArray()))->GetDeviceRecords(); if (!$this->checkRecordCount(count($this->devicerecords))) { return; } if ($this->debug) { $this->runDeviceManualJobs(); } else { $this->runDeviceBatchJob($task->task_name, 'Devices [Count: ' . $task->device->count() . ']'); } } if (!isDocker()) { if (app()->runningInConsole()) { custom_chown(storage_path()); } } $this->create_report(); $logmsg = 'CLI Download ended for ' . ($this->eventtype . ' IDs:' . implode(' ', $ids)); activityLogIt(__CLASS__, __FUNCTION__, 'info', $logmsg, 'connection', '', '', $this->eventtype, $ids); $this->info(''); $this->info('End ' . $this->eventtype . ''); } } private function runDeviceManualJobs() { $output = (new DeviceDownloadClass($this->devicerecords, $this->eventtype, $this->debug, $this->report_data->report_id))->downloadDevices(); foreach ($output as $output_type => $values) { foreach ($values as $key1 => $value1) { $this->$output_type($value1); // cli output type and value } } } private function runDeviceBatchJob($taskname, $jobname = '') { $jobs = []; foreach ($this->devicerecords as $devicerecord) { $jobs[] = new DeviceDownloadJob($devicerecord, $this->eventtype, $this->debug, $this->report_data->report_id); } $batch = Bus::batch($jobs)->then(function (Batch $batch) { // All jobs completed successfully... $msg = 'Batch [' . $batch->id . ']/[' . $batch->name . '] has been finished successfully'; info($msg); activity('info')->log($msg); })->catch(function (Batch $batch, \Throwable $e) { // First batch job failure detected... $msg = 'Batch [' . $batch->id . ']/[' . $batch->name . '] failed to process all jobs'; info($msg); activity('error')->log($msg); activity('error')->log($e->getMessage()); })->finally(function (Batch $batch) { // The batch has finished executing... $msg = 'Batch [' . $batch->id . ']/[' . $batch->name . '] finished processing'; info($msg); activity('info')->log($msg); DB::table('job_batches')->where('id', $batch->id)->update(['finished_at' => now()->timestamp]); // need this as allowFailures( does not write finished_at) })->name('Process TestBatchJob') ->allowFailures() ->onQueue('downloadqueue') ->name('download-task: ' . $taskname . ' (' . $jobname . ')') ->dispatch(); $progress = $this->output->createProgressBar(100); $this->info('Total device download jobs: ' . $batch->totalJobs); $this->info(''); if (!\App::runningUnitTests()) { while (($batch = $batch->fresh()) && !$batch->finished()) { // dump('Pending: ' . $batch->pendingJobs); // dump('Status: ' . $batch->finished()); $progress->setProgress($batch->progress()); sleep(3); } } $progress->finish(); $this->info(''); } private function create_report() { activity('info')->log('Creating report for ' . $this->report_data->task->task_name); $this->report_data->end_time = Carbon::now(); $this->report_data->file_name = $this->report_data->report_id . '.html'; $this->report_data->report_path = report_path() . $this->report_data->file_name; if (App::runningUnitTests()) { // required for testing dispatch(new TaskReportJob($this->report_data))->onConnection('sync'); } else { dispatch(new TaskReportJob($this->report_data)); } if ($this->report_data->task->task_email_notify == 1) { dispatch(new TaskCompleteNotificationJob($this->report_data)); } if ($this->report_data->task->download_report_notify == 1) { \Log::info('Sending report notification: SendTaskReportNotificationJob'); dispatch(new SendTaskReportNotificationJob($this->report_data)); } activity('info')->log('Report completed for ' . $this->report_data->task->task_name); } private function checkRecordCount($count) { $status = true; if ($count === 0) { $logmsg = 'No category/ task or tag records returned. Download will now terminate!'; activityLogIt(__CLASS__, __FUNCTION__, 'info', $logmsg, 'connection', '', '', $this->eventtype); $this->info($logmsg); $status = false; } return $status; } }