Skip to content

Commit

Permalink
#241 Include worker output if output file is empty
Browse files Browse the repository at this point in the history
  • Loading branch information
To-om committed Jan 16, 2020
1 parent 964ea00 commit a79ff4d
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 16 deletions.
10 changes: 6 additions & 4 deletions app/org/thp/cortex/services/DockerJobRunnerSrv.scala
Original file line number Diff line number Diff line change
Expand Up @@ -92,10 +92,12 @@ class DockerJobRunnerSrv(client: DockerClient, autoUpdate: Boolean, implicit val
()
}.andThen {
case r
if (!Files.exists(jobDirectory.resolve("output").resolve("output.json"))) {
val message = r.fold(e s"Docker creation error: ${e.getMessage}\n", _ "") +
Try(client.logs(containerCreation.id(), LogsParam.stdout(), LogsParam.stderr()).readFully())
.recover { case e s"Container logs can't be read (${e.getMessage}" }
val outputFile = jobDirectory.resolve("output").resolve("output.json")
if (!Files.exists(outputFile) || Files.size(outputFile) == 0) {
val output = Try(client.logs(containerCreation.id(), LogsParam.stdout(), LogsParam.stderr()).readFully())
.fold(e s"Container logs can't be read (${e.getMessage})", identity)
val message = r.fold(e s"Docker creation error: ${e.getMessage}\n$output", _ output)

val report = Json.obj("success" false, "errorMessage" message)
Files.write(jobDirectory.resolve("output").resolve("output.json"), report.toString.getBytes(StandardCharsets.UTF_8))
}
Expand Down
32 changes: 20 additions & 12 deletions app/org/thp/cortex/services/ProcessJobRunnerSrv.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,18 @@ package org.thp.cortex.services
import java.nio.charset.StandardCharsets
import java.nio.file.{Files, Path, Paths}

import scala.concurrent.duration.FiniteDuration
import scala.concurrent.{ExecutionContext, Future}
import scala.sys.process.{Process, ProcessLogger}

import play.api.Logger

import akka.actor.ActorSystem
import javax.inject.{Inject, Singleton}
import org.elastic4play.utils.RichFuture
import org.thp.cortex.models._
import play.api.Logger
import play.api.libs.json.Json

import org.elastic4play.utils.RichFuture
import scala.sys.process._
import scala.concurrent.duration.FiniteDuration
import scala.concurrent.{ExecutionContext, Future}
import scala.sys.process.{Process, ProcessLogger, _}
import scala.util.Try

import play.api.libs.json.Json

@Singleton
class ProcessJobRunnerSrv @Inject()(implicit val system: ActorSystem) {

Expand All @@ -37,19 +33,31 @@ class ProcessJobRunnerSrv @Inject()(implicit val system: ActorSystem) {

def run(jobDirectory: Path, command: String, job: Job, timeout: Option[FiniteDuration])(implicit ec: ExecutionContext): Future[Unit] = {
val baseDirectory = Paths.get(command).getParent.getParent
val output = StringBuilder.newBuilder
logger.info(s"Execute $command in $baseDirectory, timeout is ${timeout.fold("none")(_.toString)}")
val process = Process(Seq(command, jobDirectory.toString), baseDirectory.toFile)
.run(ProcessLogger(s logger.info(s" Job ${job.id}: $s")))
.run(ProcessLogger { s
logger.info(s" Job ${job.id}: $s")
output ++= s
})
val execution = Future
.apply {
process.exitValue()
()
}
.map { _
val outputFile = jobDirectory.resolve("output").resolve("output.json")
if (!Files.exists(outputFile) || Files.size(outputFile) == 0) {
val report = Json.obj("success" false, "errorMessage" output.toString)
Files.write(outputFile, report.toString.getBytes(StandardCharsets.UTF_8))
}
()
}
.recoverWith {
case error
logger.error(s"Execution of command $command failed", error)
Future.apply {
val report = Json.obj("success" false, "errorMessage" error.getMessage)
val report = Json.obj("success" false, "errorMessage" s"${error.getMessage}\n$output")
Files.write(jobDirectory.resolve("output").resolve("output.json"), report.toString.getBytes(StandardCharsets.UTF_8))
()
}
Expand Down

0 comments on commit a79ff4d

Please sign in to comment.