package mpe;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Map;
import java.util.Vector;
import xmlcomponents.Jocument;
import xmlcomponents.Jode;
/**
* AutoLauncher will try to automatically execute MPE processes on remote nodes with SSH.
* @author Brandt Westing TACC
*
*/
public class AutoLauncher extends Thread {
String configFile_;
String sketchPath_;
Vector<java.lang.Process> processVector_;
public AutoLauncher(String configFile, String sketchPath)
{
configFile_ = configFile;
sketchPath_ = sketchPath;
processVector_ = new Vector<java.lang.Process>();
}
public void run()
{
System.out.println("AutoLauncher:loading XML configuration file");
Jode root = null;
File file = new File(configFile_);
if (file.isAbsolute()) {
System.out.println("Absolute file path specified, loading config: " + file.getPath());
root = Jocument.load(configFile_);
} else {
configFile_ = sketchPath_ + "/data/" + configFile_;
System.out.println("Relative file path specified, loading config: " + configFile_);
root = Jocument.load(configFile_);
}
System.out.println("AutoLauncher:loading XML configuration node");
Jode config = root.single("configuration");
System.out.println("AutoLauncher:loading XML processingPath node");
String processingPath = config.first("config").attribute("processingPath").v;
System.out.println("processingPath = "+processingPath);
// launch each child process
for(Jode child : config.children())
{
if (child.n.equals("process"))
{
if(!child.hasAttribute("rank"))
{
System.out.println("Rank not specified in configuration for all processes. Aborting.");
// kill all previously launched process'
for(java.lang.Process p : processVector_)
p.destroy();
System.exit(-1);
}
else
{
final String rank = child.attribute("rank").v;
final String hostName = child.attribute("host").v;
String display=":0.0";
if(child.hasAttribute("display"))
display = child.attribute("display").v;
String[] command = {"ssh",
hostName,
"export RANK="+rank,
"export PATH=$PATH:"+processingPath,
"export DISPLAY="+display,
";", // seperate the exports with the executable
"processing-java",
"--sketch="+sketchPath_,
"--run",
"--output="+sketchPath_+"/"+hostName+"_"+rank,
"--force"};
// the ProcessBuilder will launch the process external to the VM with specified env. parameters
ProcessBuilder pb = new ProcessBuilder(command);
Map<String, String> env = pb.environment();
//env.put("RANK", rank);
//env.put("PATH", "PATH=" + processingPath);
//System.out.println(Arrays.toString(command));
// start the process and merge output streams of child process' with head stream
try {
pb.redirectErrorStream(true);
java.lang.Process p = pb.start();
processVector_.add(p);
final InputStream is = p.getInputStream();
new Thread(new Runnable() {
public void run() {
try {
BufferedReader reader =
new BufferedReader(new InputStreamReader(is));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(hostName + "-rank" + rank + ": " + line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
//System.out.println("Exit code: " + exitCode);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
/*
public void replace() {
String oldFileName = "~/.processing/preferences.txt";
String tmpFileName = "~/.processing/tmp_preferences.txt";
BufferedReader br = null;
BufferedWriter bw = null;
try {
br = new BufferedReader(new FileReader(oldFileName));
bw = new BufferedWriter(new FileWriter(tmpFileName));
String line;
while ((line = br.readLine()) != null) {
if (line.contains("run.display"))
line = line.replaceAll(":0.0", "");
bw.write(line+"\n");
}
} catch (Exception e) {
return;
} finally {
try {
if(br != null)
br.close();
} catch (IOException e) {
//
}
try {
if(bw != null)
bw.close();
} catch (IOException e) {
//
}
}
// Once everything is complete, delete old file..
File oldFile = new File(oldFileName);
oldFile.delete();
// And rename tmp file's name to old file name
File newFile = new File(tmpFileName);
newFile.renameTo(oldFile);
}
*/
public void shutDown()
{
// kill all previously launched process'
for(java.lang.Process p : processVector_)
p.destroy();
System.exit(0);
}
}