X-Git-Url: http://sraa.de/git/?a=blobdiff_plain;f=dol%2Fsrc%2Fdol%2Fvisitor%2Fhdsd%2FHdsdScriptVisitor.java;fp=dol%2Fsrc%2Fdol%2Fvisitor%2Fhdsd%2FHdsdScriptVisitor.java;h=322cb77d8b6e633287eaeb67b7b036501196447f;hb=8c411cf24ed0eb889191aaeafd8fa1e69081df42;hp=0000000000000000000000000000000000000000;hpb=dea7a4fb1ed110d3ce6e6d9255103d724bd66c0e;p=jump.git diff --git a/dol/src/dol/visitor/hdsd/HdsdScriptVisitor.java b/dol/src/dol/visitor/hdsd/HdsdScriptVisitor.java new file mode 100644 index 0000000..322cb77 --- /dev/null +++ b/dol/src/dol/visitor/hdsd/HdsdScriptVisitor.java @@ -0,0 +1,376 @@ +package dol.visitor.hdsd; + + +import java.io.FileOutputStream; +import java.io.OutputStream; +import java.util.Iterator; +import java.util.List; + +import dol.datamodel.architecture.Configuration; +import dol.datamodel.architecture.Processor; +import dol.datamodel.mapping.Mapping; +import dol.main.UserInterface; +import dol.util.CodePrintStream; +import dol.visitor.MapVisitor; + +/** + * Visitor that is used to generate a shell script to + * distribute, run, monitor, profile and clean up a distributed + * simulation. + */ +public class HdsdScriptVisitor extends MapVisitor { + + /** + * Constructor. + * + * @param dir path of the shell script + */ + public HdsdScriptVisitor(String dir) { + _dir = dir; + } + + /** + * Create the shell script for the given mapping. + * + * @param x mapping that needs to be rendered. + */ + public void visitComponent(Mapping x) { + try { + String filename = _dir + "/" + "scd.sh"; + OutputStream file = new FileOutputStream(filename); + CodePrintStream ps = new CodePrintStream(file); + + List pList = x.getProcessorList(); + int numProcessors = pList.size(); + + // arrays to hold strings for generation + String[] hNames = new String[numProcessors]; + String[] hAddrs = new String[numProcessors]; + String[] hDirs = new String[numProcessors]; + String[] hUsers = new String[numProcessors]; + + // get processor information and fill to string arrays + int numSlaves = 0; + Iterator iter = pList.iterator(); + while (iter.hasNext()) + { + Processor p = iter.next(); + int pIdx = numSlaves; + boolean master = false; + Configuration c = p.getCfg("master"); + if (c != null && c.getValue().equals("true")) + master = true; + + // if it is the master, it will be the last processor + if (master) + pIdx = numProcessors-1; + + // fill information to string arrays + hNames[pIdx] = p.getName(); + hAddrs[pIdx] = p.getCfg("address").getValue(); + c = p.getCfg("basedir"); + if (c != null) + { + String dir = c.getValue(); + // remove tailing '/' + if ( dir.endsWith("/") ) + dir = dir.replaceAll("/" + "$", ""); + if (dir.equals("")) + hDirs[pIdx] = hNames[pIdx]; + else + hDirs[pIdx] = dir + "/" + hNames[pIdx]; + } + else + hDirs[pIdx] = hNames[pIdx]; + c = p.getCfg("username"); + if (c != null) + hUsers[pIdx] = c.getValue() + "@"; + else + hUsers[pIdx] = ""; + + if (!master) + numSlaves++; + } // end get and fill information + + /* generate script */ + // head + ps.println("#!/bin/bash"); + ps.println(); + ps.println("SCRIPTNAME=\"`echo $0 | sed 's/.*\\///'`\""); + ps.println(); + + // host configuration + ps.println("### host configuration"); + ps.print("NAME=( "); + for (int i=0; i scd_profilerout.txt 2>&1"); + ps.printPrefixln("if [ $? -ne 0 ]; then"); + ps.prefixInc(); + ps.printPrefixln("echo"); + ps.printPrefixln("echo \"Profiling ${NAME[$1]} failed!\""); + ps.printPrefixln("echo \"Check scd_tmp_profilerout.txt for more information.\""); + ps.printPrefixln("echo"); + ps.printPrefixln("rm scd_tmp_profiled.xml"); + ps.printPrefixln("exit 1"); + ps.prefixDec(); + ps.printPrefixln("fi"); + ps.printPrefixln("rm scd_profilerout.txt"); + ps.printPrefixln("mv scd_tmp_profiled_annotated.xml scd_tmp_profiled.xml"); + ps.printPrefixln("rm profile_${NAME[$1]}.txt"); + ps.prefixDec(); + ps.println("}"); + ps.println(); + + // main programm start + ps.println("### main program"); + ps.println(); + ps.println("# require at least one argument"); + ps.println("if [ ! $# -ge 1 ]; then"); + ps.prefixInc(); + ps.printPrefixln("echo"); + ps.printPrefixln("echo \"Error: At least one argument is required!\""); + ps.printPrefixln("usage"); + ps.printPrefixln("exit 1"); + ps.prefixDec(); + ps.println("fi"); + ps.println(); + ps.println("# switch on operation"); + ps.println("case \"$1\" in"); + + // distribute binaries to simulators + ps.println("\"distribute\")"); + ps.prefixInc(); + ps.printPrefixln("echo \"Distributing binaries to simulators...\""); + ps.printPrefixln("# prepare directories"); + for (int i=0; i stdout_${NAME[" + i + "]}.txt 2>&1 &"); + ps.printPrefixln("ssh ${USER[" + (numProcessors-1) + + "]}${ADDR[" + (numProcessors-1) + + "]} \"cd ${DIR[" + (numProcessors-1) + + "]}; ./scd_${NAME[" + (numProcessors-1) + + "]}\" 2>&1 | tee stdout_${NAME[" + + (numProcessors-1) + "]}.txt"); + ps.prefixDec(); + ps.println(";;"); + + // check if simulators are running + ps.println("\"check\")"); + ps.prefixInc(); + ps.printPrefixln("echo \"Checking which simulators are active...\""); + for (int i=0; i /dev/null && echo ${NAME[" + i + "]} is active || echo ${NAME[" + i + "]} is not active\""); + ps.prefixDec(); + ps.println(";;"); + + // kill all simulators + ps.println("\"kill\")"); + ps.prefixInc(); + ps.printPrefixln("echo \"Killing all simulators...\""); + for (int i=0; i /dev/null"); + ps.printPrefixln("if [ $? -ne 0 ]; then"); + ps.prefixInc(); + ps.printPrefixln("echo"); + ps.printPrefixln("echo \"Error: Illegal file extension: required .xml!\""); + ps.printPrefixln("echo"); + ps.printPrefixln("exit 1"); + ps.prefixDec(); + ps.printPrefixln("fi"); + ps.println(); + ps.printPrefixln("PFILE=`echo $2 | sed 's/.*\\///' | sed 's/\\.xml$/_annotated.xml/'`"); + ps.printPrefixln("echo \"Profiling into ${PFILE}...\""); + ps.println(); + ps.printPrefixln("# check that the DOL is found and the classpath set correctly"); + ps.printPrefixln("java dol.main.Main > /dev/null 2>&1"); + ps.printPrefixln("if [ $? -eq 1 ]; then"); + ps.prefixInc(); + ps.printPrefixln("echo"); + ps.printPrefixln("echo \"DOL framework not found!\""); + ps.printPrefixln("echo"); + ps.printPrefixln("exit 1"); + ps.prefixDec(); + ps.printPrefixln("fi"); + ps.printPrefixln("cp \"$2\" scd_tmp_profiled.xml"); + ps.println(); + for (int i=0; i