1 package dol.visitor.hdsd;
4 import java.io.FileOutputStream;
5 import java.io.OutputStream;
6 import java.util.Iterator;
9 import dol.datamodel.architecture.Configuration;
10 import dol.datamodel.architecture.Processor;
11 import dol.datamodel.mapping.Mapping;
12 import dol.main.UserInterface;
13 import dol.util.CodePrintStream;
14 import dol.visitor.MapVisitor;
17 * Visitor that is used to generate a shell script to
18 * distribute, run, monitor, profile and clean up a distributed
21 public class HdsdScriptVisitor extends MapVisitor {
26 * @param dir path of the shell script
28 public HdsdScriptVisitor(String dir) {
33 * Create the shell script for the given mapping.
35 * @param x mapping that needs to be rendered.
37 public void visitComponent(Mapping x) {
39 String filename = _dir + "/" + "scd.sh";
40 OutputStream file = new FileOutputStream(filename);
41 CodePrintStream ps = new CodePrintStream(file);
43 List<Processor> pList = x.getProcessorList();
44 int numProcessors = pList.size();
46 // arrays to hold strings for generation
47 String[] hNames = new String[numProcessors];
48 String[] hAddrs = new String[numProcessors];
49 String[] hDirs = new String[numProcessors];
50 String[] hUsers = new String[numProcessors];
52 // get processor information and fill to string arrays
54 Iterator<Processor> iter = pList.iterator();
55 while (iter.hasNext())
57 Processor p = iter.next();
59 boolean master = false;
60 Configuration c = p.getCfg("master");
61 if (c != null && c.getValue().equals("true"))
64 // if it is the master, it will be the last processor
66 pIdx = numProcessors-1;
68 // fill information to string arrays
69 hNames[pIdx] = p.getName();
70 hAddrs[pIdx] = p.getCfg("address").getValue();
71 c = p.getCfg("basedir");
74 String dir = c.getValue();
76 if ( dir.endsWith("/") )
77 dir = dir.replaceAll("/" + "$", "");
79 hDirs[pIdx] = hNames[pIdx];
81 hDirs[pIdx] = dir + "/" + hNames[pIdx];
84 hDirs[pIdx] = hNames[pIdx];
85 c = p.getCfg("username");
87 hUsers[pIdx] = c.getValue() + "@";
93 } // end get and fill information
97 ps.println("#!/bin/bash");
99 ps.println("SCRIPTNAME=\"`echo $0 | sed 's/.*\\///'`\"");
102 // host configuration
103 ps.println("### host configuration");
105 for (int i=0; i<numProcessors; i++)
106 ps.print("\"" + hNames[i] + "\" ");
109 for (int i=0; i<numProcessors; i++)
110 ps.print("\"" + hAddrs[i] + "\" ");
113 for (int i=0; i<numProcessors; i++)
114 ps.print("\"" + hDirs[i] + "\" ");
117 for (int i=0; i<numProcessors; i++)
118 ps.print("\"" + hUsers[i] + "\" ");
123 ps.println("### dol classpath");
124 ps.println("DOLPATH=\"" + _ui.getDOLPath() + "\"");
125 ps.println("CLASSPATH=\"${DOLPATH}/jars/jdom.jar:"
126 + "${DOLPATH}/jars/xercesImpl.jar:"
127 + "${DOLPATH}/build/bin/main\"");
128 ps.println("export CLASSPATH");
130 ps.println("### systemcd path");
131 ps.println("SCDPATH=\"" + System.getProperty("user.dir")
132 + "/" + _dir + "\"");
136 ps.println("### function declarations");
138 ps.println("# function: prints usage information");
139 ps.println("function usage()");
142 ps.printPrefixln("echo");
143 ps.printPrefixln("echo \"Usage: ${SCRIPTNAME} COMMAND [OPTION]\"");
144 ps.printPrefixln("echo");
145 ps.printPrefixln("echo -e \"distribute\\tdistributes the binaries to the simulators\"");
146 ps.printPrefixln("echo");
147 ps.printPrefixln("echo -e \"run\\t\\truns the simulation and prints stdout of the master\"");
148 ps.printPrefixln("echo -e \"\\t\\tall stdouts are written to stdout_NETSIM.txt\"");
149 ps.printPrefixln("echo");
150 ps.printPrefixln("echo -e \"check\\t\\tchecks which simulators are still active\"");
151 ps.printPrefixln("echo");
152 ps.printPrefixln("echo -e \"kill\\t\\tkills all simulators\"");
153 ps.printPrefixln("echo");
154 ps.printPrefixln("echo -e \"profile PN.xml\\tretrieves the profiles from the simulators,\" \\");
156 ps.printPrefixln("\"processes them and\"");
158 ps.printPrefixln("echo -e \"\\t\\tstores the cumulative results in PN_annotaded.xml\"");
159 ps.printPrefixln("echo");
160 ps.printPrefixln("echo -e \"cleanup\\t\\tremoves the simulation directory on all simulators\"");
161 ps.printPrefixln("echo");
162 ps.printPrefixln("echo -e \"help, -h\\tprints this help\"");
163 ps.printPrefixln("echo");
169 ps.println("# function: adds profiling information of one simulator to xml");
170 ps.println("function profile()");
173 ps.printPrefixln("echo \"Retrieving profile from ${ADDR[$1]}\"");
174 ps.printPrefixln("scp ${USER[$1]}${ADDR[$1]}:${DIR[$1]}/profile_${NAME[$1]}.txt .");
175 ps.printPrefixln("if [ $? -ne 0 ]; then");
177 ps.printPrefixln("echo");
178 ps.printPrefixln("echo \"Retrieving profile from ${NAME[$1]} failed!\"");
179 ps.printPrefixln("echo");
180 ps.printPrefixln("rm scd_tmp_profiled.xml");
181 ps.printPrefixln("exit 1");
183 ps.printPrefixln("fi");
184 ps.printPrefixln("echo \"Profiling ${NAME[$1]}\"");
185 ps.printPrefixln("java dol.main.Main -P scd_tmp_profiled.xml -T profile_${NAME[$1]}.txt > scd_profilerout.txt 2>&1");
186 ps.printPrefixln("if [ $? -ne 0 ]; then");
188 ps.printPrefixln("echo");
189 ps.printPrefixln("echo \"Profiling ${NAME[$1]} failed!\"");
190 ps.printPrefixln("echo \"Check scd_tmp_profilerout.txt for more information.\"");
191 ps.printPrefixln("echo");
192 ps.printPrefixln("rm scd_tmp_profiled.xml");
193 ps.printPrefixln("exit 1");
195 ps.printPrefixln("fi");
196 ps.printPrefixln("rm scd_profilerout.txt");
197 ps.printPrefixln("mv scd_tmp_profiled_annotated.xml scd_tmp_profiled.xml");
198 ps.printPrefixln("rm profile_${NAME[$1]}.txt");
203 // main programm start
204 ps.println("### main program");
206 ps.println("# require at least one argument");
207 ps.println("if [ ! $# -ge 1 ]; then");
209 ps.printPrefixln("echo");
210 ps.printPrefixln("echo \"Error: At least one argument is required!\"");
211 ps.printPrefixln("usage");
212 ps.printPrefixln("exit 1");
216 ps.println("# switch on operation");
217 ps.println("case \"$1\" in");
219 // distribute binaries to simulators
220 ps.println("\"distribute\")");
222 ps.printPrefixln("echo \"Distributing binaries to simulators...\"");
223 ps.printPrefixln("# prepare directories");
224 for (int i=0; i<numProcessors; i++)
225 ps.printPrefixln("ssh ${USER[" + i + "]}${ADDR[" + i
226 + "]} \"test -d ${DIR[" + i + "]} || mkdir -p "
227 + "${DIR[" + i + "]}\"");
228 ps.printPrefixln("# copy files");
229 for (int i=0; i<numProcessors; i++)
230 ps.printPrefixln("scp ${SCDPATH}/scd_${NAME[" + i
231 + "]} ${USER[" + i + "]}${ADDR[" + i
232 + "]}:${DIR[" + i + "]}/");
236 // run the simulation
237 ps.println("\"run\")");
239 ps.printPrefixln("echo \"Running simulation...\"");
240 for (int i=0; i<numProcessors-1; i++)
241 ps.printPrefixln("ssh ${USER[" + i + "]}${ADDR[" + i
242 + "]} \"cd ${DIR[" + i + "]}; ./scd_${NAME["
243 + i + "]}\" > stdout_${NAME[" + i + "]}.txt 2>&1 &");
244 ps.printPrefixln("ssh ${USER[" + (numProcessors-1)
245 + "]}${ADDR[" + (numProcessors-1)
246 + "]} \"cd ${DIR[" + (numProcessors-1)
247 + "]}; ./scd_${NAME[" + (numProcessors-1)
248 + "]}\" 2>&1 | tee stdout_${NAME["
249 + (numProcessors-1) + "]}.txt");
253 // check if simulators are running
254 ps.println("\"check\")");
256 ps.printPrefixln("echo \"Checking which simulators are active...\"");
257 for (int i=0; i<numProcessors; i++)
258 ps.printPrefixln("ssh ${USER[" + i + "]}${ADDR[" + i + "]} \"pgrep -x scd_${NAME[" + i + "]} > /dev/null && echo ${NAME[" + i + "]} is active || echo ${NAME[" + i + "]} is not active\"");
262 // kill all simulators
263 ps.println("\"kill\")");
265 ps.printPrefixln("echo \"Killing all simulators...\"");
266 for (int i=0; i<numProcessors; i++)
267 ps.printPrefixln("ssh ${USER[" + i + "]}${ADDR[" + i + "]} \"killall -e scd_${NAME[" + i + "]}\"");
271 // get and process profiles
272 ps.println("\"profile\")");
274 ps.printPrefixln("# require 2 arguments");
275 ps.printPrefixln("if [ $# -ne 2 ]; then");
277 ps.printPrefixln("echo");
278 ps.printPrefixln("echo \"Error: Illegal number of arguments!\"");
279 ps.printPrefixln("echo");
280 ps.printPrefixln("echo \"Usage: ${SCRIPTNAME} profile processnetwork.xml\"");
281 ps.printPrefixln("echo");
282 ps.printPrefixln("exit 1");
284 ps.printPrefixln("fi");
286 ps.printPrefixln("# check if process nework file exists");
287 ps.printPrefixln("if [ ! -f \"$2\" ]; then");
289 ps.printPrefixln("echo");
290 ps.printPrefixln("echo \"Error: File not found!\"");
291 ps.printPrefixln("echo");
292 ps.printPrefixln("exit 1");
294 ps.printPrefixln("fi");
296 ps.printPrefixln("# check file extension");
297 ps.printPrefixln("echo $2 | grep -e '\\.xml$' > /dev/null");
298 ps.printPrefixln("if [ $? -ne 0 ]; then");
300 ps.printPrefixln("echo");
301 ps.printPrefixln("echo \"Error: Illegal file extension: required .xml!\"");
302 ps.printPrefixln("echo");
303 ps.printPrefixln("exit 1");
305 ps.printPrefixln("fi");
307 ps.printPrefixln("PFILE=`echo $2 | sed 's/.*\\///' | sed 's/\\.xml$/_annotated.xml/'`");
308 ps.printPrefixln("echo \"Profiling into ${PFILE}...\"");
310 ps.printPrefixln("# check that the DOL is found and the classpath set correctly");
311 ps.printPrefixln("java dol.main.Main > /dev/null 2>&1");
312 ps.printPrefixln("if [ $? -eq 1 ]; then");
314 ps.printPrefixln("echo");
315 ps.printPrefixln("echo \"DOL framework not found!\"");
316 ps.printPrefixln("echo");
317 ps.printPrefixln("exit 1");
319 ps.printPrefixln("fi");
320 ps.printPrefixln("cp \"$2\" scd_tmp_profiled.xml");
322 for (int i=0; i<numProcessors; i++)
323 ps.printPrefixln("profile " + i);
325 ps.printPrefixln("mv scd_tmp_profiled.xml \"${PFILE}\"");
329 // deleting remote files
330 ps.printPrefixln("\"cleanup\")");
332 ps.printPrefixln("echo \"Deleting simulator directory on simulators...\"");
333 for (int i=0; i<numProcessors; i++)
334 ps.printPrefixln("ssh ${USER[" + i + "]}${ADDR[" + i
335 + "]} \"rm -r ${DIR[" + i + "]}\"");
340 ps.println("\"help\")");
342 ps.printPrefixln("usage");
345 ps.println("\"-h\")");
347 ps.printPrefixln("usage");
350 ps.println("\"--help\")");
352 ps.printPrefixln("usage");
357 ps.printPrefixln("echo");
358 ps.printPrefixln("echo \"Error: Illegal command: $1\"");
359 ps.printPrefixln("usage");
360 ps.printPrefixln("exit 1");
365 } catch (Exception e) {
366 System.out.println("HdsdMakefileVisitor: exception occured: "
373 protected String _dir = null;
374 protected UserInterface _ui = UserInterface.getInstance();