From 9c6196a8ca882143fc8b6b287a462173210eb8f2 Mon Sep 17 00:00:00 2001 From: To-om Date: Tue, 21 Jun 2022 08:10:26 +0200 Subject: [PATCH] #417 Add API to check status of several jobs --- app/org/thp/cortex/controllers/JobCtrl.scala | 20 +++++++++++++++++--- conf/routes | 1 + 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/app/org/thp/cortex/controllers/JobCtrl.scala b/app/org/thp/cortex/controllers/JobCtrl.scala index f3a762217..fcc22bc2b 100644 --- a/app/org/thp/cortex/controllers/JobCtrl.scala +++ b/app/org/thp/cortex/controllers/JobCtrl.scala @@ -3,21 +3,20 @@ package org.thp.cortex.controllers import scala.concurrent.duration.{Duration, FiniteDuration} import scala.concurrent.{ExecutionContext, Future} import scala.concurrent.duration.DurationInt - import play.api.http.Status import play.api.libs.json.{JsObject, JsString, JsValue, Json} import play.api.mvc.{AbstractController, Action, AnyContent, ControllerComponents} - import akka.actor.{ActorRef, ActorSystem} import akka.pattern.ask import akka.stream.Materializer import akka.stream.scaladsl.Sink import akka.util.Timeout +import org.elastic4play.NotFoundError + import javax.inject.{Inject, Named, Singleton} import org.thp.cortex.models.{Job, JobStatus, Roles} import org.thp.cortex.services.AuditActor.{JobEnded, Register} import org.thp.cortex.services.JobSrv - import org.elastic4play.controllers.{Authenticated, Fields, FieldsBodyParser, Renderer} import org.elastic4play.models.JsonFormat.baseModelEntityWrites import org.elastic4play.services.JsonFormat.queryReads @@ -159,6 +158,21 @@ class JobCtrl @Inject() ( .map(Ok(_)) } + def getJobStatus: Action[Fields] = authenticated(Roles.read).async(fieldsBodyParser) { implicit request => + val jobIds = request.body.getStrings("jobIds").getOrElse(Nil) + Future + .traverse(jobIds) { jobId => + jobSrv + .getForUser(request.userId, jobId) + .map(j => jobId -> JsString(j.status().toString)) + .recover { + case _: NotFoundError => jobId -> JsString("NotFound") + case error => jobId -> JsString(s"Error($error)") + } + } + .map(statuses => Ok(JsObject(statuses))) + } + def listArtifacts(jobId: String): Action[Fields] = authenticated(Roles.read).async(fieldsBodyParser) { implicit request => val query = request.body.getValue("query").fold[QueryDef](QueryDSL.any)(_.as[QueryDef]) val range = request.body.getString("range") diff --git a/conf/routes b/conf/routes index 8389c614d..20f7519fd 100644 --- a/conf/routes +++ b/conf/routes @@ -65,6 +65,7 @@ POST /api/job/_search org.thp.cort DELETE /api/job/:id org.thp.cortex.controllers.JobCtrl.delete(id) GET /api/job/:id org.thp.cortex.controllers.JobCtrl.get(id) GET /api/job/:id/report org.thp.cortex.controllers.JobCtrl.report(id) +POST /api/job/status org.thp.cortex.controllers.JobCtrl.getJobStatus POST /api/stream org.thp.cortex.controllers.StreamCtrl.create()