diff --git a/src/main/java/name/nathanmcrae/numbersstation/Main.java b/src/main/java/name/nathanmcrae/numbersstation/Main.java index 23fe7a3..fa85dae 100644 --- a/src/main/java/name/nathanmcrae/numbersstation/Main.java +++ b/src/main/java/name/nathanmcrae/numbersstation/Main.java @@ -17,6 +17,7 @@ import java.nio.file.Paths; import java.text.SimpleDateFormat; import java.time.format.DateTimeFormatter; import java.time.LocalDateTime; +import java.util.concurrent.TimeUnit; import java.util.Date; import java.util.logging.FileHandler; import java.util.logging.Logger; @@ -29,6 +30,7 @@ import javafx.scene.image.Image; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; +import javafx.util.Pair; import org.apache.commons.cli.*; public class Main extends Application { @@ -174,6 +176,14 @@ public class Main extends Application { public StationRunException(String message) { super(message); } + + public StationRunException(Throwable cause) { + super(cause); + } + + public StationRunException(String message, Throwable cause) { + super(message, cause); + } } public static void runStation(MainParsedArguments parsedArgs) throws StationRunException { @@ -223,6 +233,21 @@ public class Main extends Application { } switch (loadedStation.getMessageMethod()) { + case StationSettings.MessageMethod.EXTERNAL_PROGRAM: + Process process = new ProcessBuilder(loadedStation.getExternalProgramCommand(), nextMessagePath.toString()).start(); + // TODO: make timeout a setting + if (!process.waitFor(5, TimeUnit.SECONDS)) { + throw new StationRunException("Timeout while running external program " + loadedStation.getExternalProgramCommand()); + } + + Pair output = WindowsScheduler.captureProcessOutput(process); + if(process.exitValue() != 0) { + String message = "External program non-zero exit code. Exit code: " + process.exitValue() + ". stdout: " + output.getKey() + "\n\tstderr: " + output.getValue(); + logger.log(Level.SEVERE, message); + throw new StationRunException(message); + } + + break; case StationSettings.MessageMethod.SFTP: //loadedStation.uploadNextMessageToSFTP(); JSch jsch = new JSch();