23 use Symfony\Component\HttpFoundation\JsonResponse;
25 define(
"TITLE_AJAXSHOWJOBS", _(
"ShowJobs"));
35 const MAX_LOG_OUTPUT = 32768;
51 $this->Name =
"ajaxShowJobs";
52 $this->Title = TITLE_AJAXSHOWJOBS;
56 $this->OutputType =
'JSON';
57 $this->OutputToStdout =
true;
60 $this->showJobsDao = $container->get(
'dao.show_jobs');
61 $this->userDao = $container->get(
'dao.user');
62 $this->clearingDao = $container->get(
'dao.clearing');
63 $this->
dbManager = $container->get(
'db.manager');
65 parent::__construct();
70 if ($this->
State != PLUGIN_STATE_READY) {
74 if (empty($uploadId)) {
87 $job_pk1 = $JobsInfo1[
"job"][
"job_pk"];
88 $job_pk2 = $JobsInfo2[
"job"][
"job_pk"];
90 return $job_pk2 - $job_pk1;
101 $fields=array(
'jq_pk'=>
'jq_pk',
102 'job_pk'=>
'jq_job_fk',
103 'Job Name'=>
'job_name',
104 'Agent Name'=>
'jq_type',
105 'Priority'=>
'job_priority',
107 'jq_runonpfile'=>
'jq_runonpfile',
108 'Queued'=>
'job_queued',
109 'Started'=>
'jq_starttime',
110 'Ended'=>
'jq_endtime',
111 'Elapsed HH:MM:SS'=>
'elapsed',
112 'Status'=>
'jq_end_bits',
113 'Items processed'=>
'jq_itemsprocessed',
114 'Submitter'=>
'job_user_fk',
115 'Upload'=>
'job_upload_fk',
119 $row = $this->showJobsDao->getDataForASingleJob($job_pk);
122 foreach ($fields as $labelKey=>$field) {
129 if (! empty($row[$field])) {
133 case 'jq_itemsprocessed':
134 $value = number_format($row[$field]);
140 if (!empty($row[
'job_upload_fk'])) {
141 $value =
"<a href='$uri" . $row[
'job_upload_fk'] .
"'>" . htmlentities($row[$field]) .
"</a>".
" (" . _(
"Click to view jobs for this upload") .
")";
144 $back =
"(" . _(
"Click to return to Show Jobs") .
")";
145 $value =
"<a href='$uri2'>$row[$field] $back</a>";
148 case 'job_upload_fk':
149 if (!empty($row[$field])) {
150 $browse =
Traceback_uri() .
"?mod=browse&upload=" . htmlentities($row[$field]);
151 $value =
"<a href='$browse'>" . htmlentities($row[$field]) .
"</a>".
" (" . _(
"Click to browse upload") .
")";
155 if (empty($row[$field]) || $row[$field] ==
'removed' || !file_exists($row[$field])) {
158 if (filesize($row[$field]) > self::MAX_LOG_OUTPUT) {
159 $value =
"<pre>" .file_get_contents($row[$field],
false,
null,-1,self::MAX_LOG_OUTPUT).
"</pre>"
160 .
'<a href="'.
Traceback_uri() .
'?mod=download&log=' . $row[
'jq_pk'] .
'">Download full log</a>';
162 $value =
"<pre>" . file_get_contents($row[$field]).
"</pre>";
166 if (!empty($row[$field])) {
167 $value = $this->userDao->getUserName($row[$field]);
171 $jq_args_temp = $row[$field];
172 $jq_args_show = $jq_args_temp;
173 if (! empty($jq_args_temp)) {
174 $pos = strpos($jq_args_temp,
' SVN ');
176 $jq_args_show = substr($jq_args_temp, 0, $pos + 4);
178 $pos = strpos($jq_args_temp,
' CVS ');
180 $jq_args_show = substr($jq_args_temp, 0, $pos + 4);
182 $pos = strpos($jq_args_temp,
' Git ');
184 $jq_args_show = substr($jq_args_temp, 0, $pos + 4);
186 $value = $jq_args_show;
190 if (array_key_exists($field, $row)) {
191 $value = htmlentities($row[$field]);
195 $table[] = array(
'DT_RowId' => $i++,
199 $tableData = array_values($table);
200 return new JsonResponse(array(
'sEcho' => intval($_GET[
'sEcho']),
201 'aaData' => $tableData,
202 'iTotalRecords' => count($tableData),
203 'iTotalDisplayRecords' => count($tableData)));
214 if (count($jobData) == 0) {
215 return array(
'showJobsData' =>
"There are no jobs to display");
218 foreach ($jobData as $jobId => $jobs) {
220 'jobId' => $jobs[
'job'][
'job_pk'],
221 'jobName' => $jobs[
'job'][
'job_name'],
222 'jobQueue' => $jobs[
'jobqueue']
224 foreach ($jobArr[
'jobQueue'] as $key => $singleJobQueue) {
225 if (! empty($jobArr[
'jobQueue'][$key][
'jq_starttime'])) {
227 $jobArr[
'jobQueue'][$key][
'jq_starttime']);
229 if (! empty($jobArr[
'jobQueue'][$key][
'jq_endtime'])) {
231 $jobArr[
'jobQueue'][$key][
'jq_endtime']) ;
233 if (! empty($singleJobQueue[
"jq_endtime"])) {
234 $numSecs = strtotime($singleJobQueue[
'jq_endtime']) -
235 strtotime($singleJobQueue[
'jq_starttime']);
236 $numSecs = ($numSecs == 0) ? 1 : $numSecs;
238 $numSecs = time() - strtotime($singleJobQueue[
'jq_starttime']);
241 $jobArr[
'jobQueue'][$key][
'itemsPerSec'] = $itemsPerSec = 0;
242 if ($singleJobQueue[
'jq_starttime']) {
243 $itemsPerSec = $this->showJobsDao->getNumItemsPerSec(
244 $singleJobQueue[
'jq_itemsprocessed'], $numSecs);
245 $jobArr[
'jobQueue'][$key][
'itemsPerSec'] = $itemsPerSec;
247 if (empty($singleJobQueue[
'jq_endtime'])) {
248 $jobArr[
'jobQueue'][$key][
'eta'] = $this->showJobsDao->getEstimatedTime(
249 $singleJobQueue[
'jq_job_fk'], $singleJobQueue[
'jq_type'],
250 $itemsPerSec, $jobs[
'job'][
'job_upload_fk']);
251 if ($singleJobQueue[
'jq_type'] ===
'monkbulk' ||
252 $singleJobQueue[
'jq_type'] ===
'deciderjob') {
253 $noOfMonkBulk = $this->showJobsDao->getItemsProcessedForDecider(
254 'decider', $singleJobQueue[
'jq_job_fk']);
255 if (! empty($noOfMonkBulk)) {
256 $totalCountOfMb = $this->clearingDao->getPreviousBulkIds(
260 if (! empty($totalCountOfMb)) {
261 $jobArr[
'jobQueue'][$key][
'isNoOfMonkBulk'] = $noOfMonkBulk[0] .
262 "/" . $totalCountOfMb;
269 $jobArr[
'jobQueue'][$key][
'isInProgress'] = ($singleJobQueue[
'jq_end_bits'] ==
271 $jobArr[
'jobQueue'][$key][
'isReady'] = ($singleJobQueue[
'jq_end_bits'] ==
274 switch ($singleJobQueue[
'jq_type']) {
276 $jobArr[
'jobQueue'][$key][
'download'] =
"ReadMeOss";
279 $jobArr[
'jobQueue'][$key][
'download'] =
"SPDX2 report";
282 $jobArr[
'jobQueue'][$key][
'download'] =
"SPDX2 tag/value report";
285 $jobArr[
'jobQueue'][$key][
'download'] =
"SPDX2 CSV report";
288 $jobArr[
'jobQueue'][$key][
'download'] =
"DEP5 copyright file";
291 $jobArr[
'jobQueue'][$key][
'download'] =
"uploaded SPDX2 report";
293 case 'unifiedreport':
294 $jobArr[
'jobQueue'][$key][
'download'] =
"Unified Report";
297 $jobArr[
'jobQueue'][$key][
'download'] =
"Clixml Report";
300 $jobArr[
'jobQueue'][$key][
'download'] =
"CycloneDX json Report";
302 case 'decisionexporter':
303 $jobArr[
'jobQueue'][$key][
'download'] =
"FOSSology Decisions";
306 $jobArr[
'jobQueue'][$key][
'download'] =
"";
309 if (! empty($jobs[
'upload'])) {
311 'uploadName' => $jobs[
'upload'][
'upload_filename'],
312 'uploadId' => $jobs[
'upload'][
'upload_pk'],
313 'uploadDesc' => $jobs[
'upload'][
'upload_desc'],
314 'uploadItem' => empty($jobs[
'uploadtree']) ? -1 : $jobs[
'uploadtree'][
'uploadtree_pk'],
315 'uploadEta' => $this->showJobsDao->getEstimatedTime($jobs[
'job'][
'job_pk'],
'', 0, $jobs[
'upload'][
'upload_pk'])
320 $returnData[] = array(
322 'upload' => $uploadArr,
335 foreach ($job[
'jobqueue'] as $jobqueueRec) {
336 if ($jobqueueRec[
'jq_end_bits'] === 0) {
351 if ($jobqueueRec[
'jq_end_bits'] > 1) {
353 }
else if (! empty($jobqueueRec[
'jq_starttime']) &&
354 empty($jobqueueRec[
'jq_endtime'])) {
355 return 'jobScheduled';
356 }
else if (!empty($jobqueueRec[
'jq_starttime']) && !empty($jobqueueRec[
'jq_endtime'])) {
357 return 'jobFinished';
378 if (! empty($jobqueueRec[
'jq_endtext'])) {
379 $status .=
"$jobqueueRec[jq_endtext]";
382 if (! strstr($status,
"Success") && ! strstr($status,
"Fail") &&
383 $jobqueueRec[
"jq_end_bits"]) {
385 if ($jobqueueRec[
"jq_end_bits"] == 0x1) {
386 $status .= _(
"Success");
387 }
else if ($jobqueueRec[
"jq_end_bits"] == 0x2) {
388 $status .= _(
"Failure");
389 }
else if ($jobqueueRec[
"jq_end_bits"] == 0x4) {
390 $status .= _(
"Nonfatal");
406 $uri =
"?mod=showjobs";
407 if (!empty($allusers) && $allusers > 0) {
408 $uri .=
"&allusers=$allusers";
411 $uri .=
"&upload=$uploadPk";
414 if (empty($allusers)) {
419 $upload_pks = array($uploadPk);
420 list($jobs, $totalPages) = $this->showJobsDao->uploads2Jobs($upload_pks, $page);
422 list($jobs, $totalPages) = $this->showJobsDao->myJobs($allusers, $page);
424 $jobsInfo = $this->showJobsDao->getJobInfo($jobs);
425 usort($jobsInfo, array($this,
"compareJobsInfo"));
427 $pagination = ($totalPages > 1 ?
MenuPage($page, $totalPages, $uri) :
"");
430 return new JsonResponse(
432 'showJobsData' => $showJobData,
433 'pagination' => $pagination
439 if ($this->
State != PLUGIN_STATE_READY) {
442 $output = $this->jsonContent();
443 if (!$this->OutputToStdout) {
449 protected function jsonContent()
455 if (! empty($uploadPk)) {
456 return $this->
getJobs($uploadPk);
459 case "showSingleJob":
466 $NewPlugin =
new AjaxShowJobs();
This is the Plugin class. All plugins should:
Contains the constants and helpers for authentication of user.
static getUserId()
Get the current user's id.
static getGroupId()
Get the current user's group id.
Provide data for jobs table.
isUnfinishedJob($job)
Are there any unfinished jobqueues in this job?
__construct()
base constructor. Most plugins will just use this
getJobs($uploadPk)
get data of all jobs using uploadpk
Output()
This function is called when user output is requested. This function is responsible for content....
getGeekyScanDetailsForJob($job_pk)
Returns geeky scan details about the jobqueue item.
getClass($jobqueueRec)
array $jobqueueRec get the jobqueue row color
compareJobsInfo($JobsInfo1, $JobsInfo2)
Sort compare function to order $JobsInfo by job_pk.
OutputOpen()
This function is called when user output is requested. This function is responsible for assigning hea...
getShowJobsForEachJob($jobData)
Returns an upload job status in array.
jobqueueStatus($jobqueueRec)
Get the status of a jobqueue item If the job isn't known to the scheduler, then report the status bas...
Traceback_uri()
Get the URI without query to this location.
GetParm($parameterName, $parameterType)
This function will retrieve the variables and check data types.
Convert2BrowserTime($server_time)
Convert the server time to browser time.
#define PLUGIN_DB_WRITE
Plugin requires write permission on DB.
#define PLUGIN_DB_ADMIN
Plugin requires admin level permission on DB.
fo_dbManager * dbManager
fo_dbManager object
list_t type structure used to keep various lists. (e.g. there are multiple lists).