Modifying master for Tomoyo process jailing; Adding basic policies for Tomoyo environ...
[iot2.git] / iotjava / iotruntime / master / IoTMaster.java
index 6a66039bf12ec6fd0a2f15581788c297a6b77d67..ce99125e4f947f06ba975df66a253f463fa3ae54 100644 (file)
@@ -112,6 +112,7 @@ public class IoTMaster {
        private static final String STR_CFG_FILE_EXT = ".config";
        private static final String STR_CLS_FILE_EXT = ".class";
        private static final String STR_JAR_FILE_EXT = ".jar";
+       private static final String STR_SHELL_FILE_EXT = ".sh";
        private static final String STR_SO_FILE_EXT = ".so";
        private static final String STR_ZIP_FILE_EXT = ".zip";
        private static final String STR_TCP_PROTOCOL = "tcp";
@@ -130,6 +131,8 @@ public class IoTMaster {
        private static final String STR_SSH = "ssh";
        private static final String STR_SCP = "scp";
        private static final String STR_IOTSLAVE_CPP = "./IoTSlave.o";
+       private static final String STR_SHELL_HEADER = "#!/bin/sh";
+       private static final String STR_JAVA_PATH = "/usr/bin/java";
 
        private static int INT_SIZE = 4;        // send length in the size of integer (4 bytes)
 
@@ -210,6 +213,24 @@ public class IoTMaster {
                mapClassNameToCrim = new HashMap<String,Object>();
        }
 
+       /**
+        * getPrintWriter() gets a new PrintWriter for a new object
+        *
+        * @param   strObjectName       String object name
+        * @return  PrintWriter
+        */
+       private PrintWriter getPrintWriter(String strObjectName) {
+
+               FileWriter fw = null;
+               try {
+                       fw = new FileWriter(strObjectName);
+               } catch (IOException ex) {
+                       ex.printStackTrace();
+               }
+               PrintWriter printWriter = new PrintWriter(new BufferedWriter(fw));
+               return printWriter;
+       }
+
        /**
         * A method to initialize constants from config file
         *
@@ -870,13 +891,28 @@ public class IoTMaster {
         *
         * @return       String
         */
-       private String getCmdJavaDriverIoTSlave(String strIoTMasterHostAdd, String strIoTSlaveObjectHostAdd, String strObjName) {
+       /*private String getCmdJavaDriverIoTSlave(String strIoTMasterHostAdd, String strIoTSlaveObjectHostAdd, String strObjName) {
 
                return STR_SSH + " " + STR_USERNAME + strIoTSlaveObjectHostAdd + " cd " + STR_RUNTIME_DIR + " sudo java " +
                        STR_CLS_PATH + " " + STR_RMI_PATH + " " + STR_RMI_HOSTNAME +
                        strIoTSlaveObjectHostAdd + " " + STR_IOT_SLAVE_CLS + " " + strIoTMasterHostAdd + " " +
                        commHan.getComPort(strObjName) + " " + commHan.getRMIRegPort(strObjName) + " " +
                        commHan.getRMIStubPort(strObjName) + " >& " + STR_LOG_FILE_PATH + strObjName + ".log &";
+       }*/
+       private String getCmdJavaDriverIoTSlave(String strIoTMasterHostAdd, String strIoTSlaveObjectHostAdd, String strObjName) {
+
+               // Create an Shell executable
+               String strJavaCommand = STR_SHELL_HEADER + "\nexec " + STR_JAVA_PATH + " " + STR_CLS_PATH + " " + STR_RMI_PATH + " " + 
+                       STR_RMI_HOSTNAME + strIoTSlaveObjectHostAdd + " " + STR_IOT_SLAVE_CLS + " " + strIoTMasterHostAdd + " " +
+                       commHan.getComPort(strObjName) + " " + commHan.getRMIRegPort(strObjName) + " " +
+                       commHan.getRMIStubPort(strObjName) + " > " + STR_LOG_FILE_PATH + strObjName + ".log &";
+               String shellFile = "./" + strObjName + STR_SHELL_FILE_EXT;
+               createWrapperShellScript(strJavaCommand, shellFile);
+               // Send the file to the compute node
+               String strCmdSend = "scp " + shellFile + " " + STR_USERNAME + strIoTSlaveObjectHostAdd + ":" + STR_RUNTIME_DIR;
+               runCommand(strCmdSend);
+               System.out.println("IoTMaster: Sending shell file: " + strCmdSend);
+               return STR_SSH + " " + STR_USERNAME + strIoTSlaveObjectHostAdd + " cd " + STR_RUNTIME_DIR + " " + shellFile;
        }
 
 
@@ -893,6 +929,22 @@ public class IoTMaster {
        }
 
 
+       /**
+        * createWrapperShellScript() gets a wrapper shell script
+        *
+        * @param   strCommand          String command
+        * @param   strObjectName       String object name
+        * @return  PrintWriter
+        */
+       private void createWrapperShellScript(String strCommand, String strFileName) {
+
+               PrintWriter printWriter = getPrintWriter(strFileName);
+               printWriter.println(strCommand);
+               printWriter.close();
+               runCommand("chmod 755 " + strFileName);
+       }
+
+
        /**
         * A private method to create an object on a specific machine
         *
@@ -1500,7 +1552,7 @@ public class IoTMaster {
         *
         * @return       String
         */
-       private String getCmdJavaIoTSlave(String strObjControllerName) {
+       /*private String getCmdJavaIoTSlave(String strObjControllerName) {
 
                return STR_SSH + " " + STR_USERNAME + strIoTSlaveControllerHostAdd + " cd " +
                                        STR_RUNTIME_DIR + " sudo java " + STR_JVM_INIT_HEAP_SIZE + " " + 
@@ -1510,6 +1562,22 @@ public class IoTMaster {
                                        commHan.getRMIRegPort(strObjControllerName) + " " +
                                        commHan.getRMIStubPort(strObjControllerName) + " >& " +
                                        STR_LOG_FILE_PATH + strObjControllerName + ".log &";
+       }*/
+       private String getCmdJavaIoTSlave(String strObjControllerName) {
+
+               // Create an Shell executable
+               String strJavaCommand = STR_SHELL_HEADER + "\nexec " + STR_JAVA_PATH + " " + STR_JVM_INIT_HEAP_SIZE + " " + 
+                                       STR_JVM_MAX_HEAP_SIZE + " " + STR_CLS_PATH + " " + STR_RMI_PATH + " " + STR_IOT_SLAVE_CLS + " " + 
+                                       strIoTMasterHostAdd + " " + commHan.getComPort(strObjControllerName) + " " +
+                                       commHan.getRMIRegPort(strObjControllerName) + " " + commHan.getRMIStubPort(strObjControllerName) + 
+                                       " > " + STR_LOG_FILE_PATH + strObjControllerName + ".log &";
+               String shellFile = "./" + strObjControllerName + STR_SHELL_FILE_EXT;
+               createWrapperShellScript(strJavaCommand, shellFile);
+               // Send the file to the compute node
+               String strCmdSend = "scp " + shellFile + " " + STR_USERNAME + strIoTSlaveControllerHostAdd + ":" + STR_RUNTIME_DIR;
+               runCommand(strCmdSend);
+               System.out.println("IoTMaster: Sending main controller shell file: " + strCmdSend);
+               return STR_SSH + " " + STR_USERNAME + strIoTSlaveControllerHostAdd + " cd " + STR_RUNTIME_DIR + " " + shellFile;
        }