From 0216ac3b61c901179232415c405eae7ba7061aef Mon Sep 17 00:00:00 2001 From: jogerj <30559735+jogerj@users.noreply.github.com> Date: Sun, 22 Oct 2023 00:10:07 +0200 Subject: [PATCH] feat: log output from external command --- .../com/tonikelope/megabasterd/MainPanel.java | 26 +++++++++++++++-- .../megabasterd/SettingsDialog.java | 28 +++++++++++++++---- 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/tonikelope/megabasterd/MainPanel.java b/src/main/java/com/tonikelope/megabasterd/MainPanel.java index 32670a2e9..6aa4748a1 100644 --- a/src/main/java/com/tonikelope/megabasterd/MainPanel.java +++ b/src/main/java/com/tonikelope/megabasterd/MainPanel.java @@ -26,9 +26,11 @@ import java.awt.event.MouseEvent; import java.awt.event.WindowEvent; import static java.awt.event.WindowEvent.WINDOW_CLOSING; +import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.InputStreamReader; import java.io.IOException; import java.io.PrintStream; import static java.lang.Integer.parseInt; @@ -46,6 +48,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import java.util.StringTokenizer; import java.util.UUID; import java.util.concurrent.ExecutorService; import static java.util.concurrent.Executors.newCachedThreadPool; @@ -872,10 +875,27 @@ public static synchronized void run_external_command() { if (_run_command && (LAST_EXTERNAL_COMMAND_TIMESTAMP == -1 || LAST_EXTERNAL_COMMAND_TIMESTAMP + RUN_COMMAND_TIME * 1000 < System.currentTimeMillis())) { if (_run_command_path != null && !_run_command_path.equals("")) { + Logger logger = Logger.getLogger(MainPanel.class.getName()); try { - Runtime.getRuntime().exec(_run_command_path); - } catch (IOException ex) { - Logger.getLogger(MainPanel.class.getName()).log(Level.SEVERE, ex.getMessage()); + StringTokenizer st = new StringTokenizer(_run_command_path); + String[] cmdarray = new String[st.countTokens()]; + for (int i = 0; st.hasMoreTokens(); i++) + cmdarray[i] = st.nextToken(); + + ProcessBuilder pb = new ProcessBuilder(cmdarray) + .redirectErrorStream(true); + Process pr = pb.start(); + + BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream())); + String line; + while ((line = in.readLine()) != null) { + logger.log(Level.INFO, "[Command output] " + line); + } + pr.waitFor(); + in.close(); + pr.destroy(); + } catch (IOException | InterruptedException ex) { + logger.log(Level.SEVERE, ex.getMessage()); } LAST_EXTERNAL_COMMAND_TIMESTAMP = System.currentTimeMillis(); diff --git a/src/main/java/com/tonikelope/megabasterd/SettingsDialog.java b/src/main/java/com/tonikelope/megabasterd/SettingsDialog.java index 15ae5714f..481269269 100644 --- a/src/main/java/com/tonikelope/megabasterd/SettingsDialog.java +++ b/src/main/java/com/tonikelope/megabasterd/SettingsDialog.java @@ -17,12 +17,14 @@ import java.awt.Frame; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; +import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.nio.file.Files; @@ -38,6 +40,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.StringTokenizer; import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; @@ -54,7 +57,6 @@ import javax.swing.RowSorter; import javax.swing.SortOrder; import javax.swing.SpinnerNumberModel; -import static javax.swing.WindowConstants.DISPOSE_ON_CLOSE; import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.table.DefaultTableModel; @@ -2907,13 +2909,29 @@ private void limit_upload_speed_checkboxStateChanged(javax.swing.event.ChangeEve private void run_command_test_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_run_command_test_buttonActionPerformed // TODO add your handling code here: + Logger logger = Logger.getLogger(MiscTools.class.getName()); if (run_command_textbox.getText() != null && !"".equals(run_command_textbox.getText().trim())) { - try { - Runtime.getRuntime().exec(run_command_textbox.getText().trim()); - } catch (IOException ex) { - Logger.getLogger(MiscTools.class.getName()).log(Level.SEVERE, ex.getMessage()); + StringTokenizer st = new StringTokenizer(run_command_textbox.getText().trim()); + String[] cmdarray = new String[st.countTokens()]; + for (int i = 0; st.hasMoreTokens(); i++) + cmdarray[i] = st.nextToken(); + + ProcessBuilder pb = new ProcessBuilder(cmdarray) + .redirectErrorStream(true); + Process pr = pb.start(); + + BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream())); + String line; + while ((line = in.readLine()) != null) { + logger.log(Level.INFO, "[Command output] " + line); + } + pr.waitFor(); + in.close(); + pr.destroy(); + } catch (IOException | InterruptedException ex) { + logger.log(Level.SEVERE, ex.getMessage()); JOptionPane.showMessageDialog(this, ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } }