X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=iotjava%2Fiotruntime%2Fmaster%2FIoTMaster.java;h=bd69b0ac82f842d6839adf1055f71d1af292fec1;hb=d227810e27d0c63637497c4adaabc19dc67b186a;hp=6a66039bf12ec6fd0a2f15581788c297a6b77d67;hpb=d5670ab3ce3e0f1cc3a860cc19cb719122b4c58f;p=iot2.git diff --git a/iotjava/iotruntime/master/IoTMaster.java b/iotjava/iotruntime/master/IoTMaster.java index 6a66039..bd69b0a 100644 --- a/iotjava/iotruntime/master/IoTMaster.java +++ b/iotjava/iotruntime/master/IoTMaster.java @@ -40,7 +40,7 @@ import static java.lang.Math.toIntExact; * @version 1.0 * @since 2016-06-16 */ -public class IoTMaster { +public final class IoTMaster { /** * IoTMaster class properties @@ -51,6 +51,7 @@ public class IoTMaster { private CommunicationHandler commHan; private LoadBalancer lbIoT; private RouterConfig routerConfig; + private ProcessJailConfig processJailConfig; private ObjectInitHandler objInitHand; private ObjectAddressInitHandler objAddInitHand; private String[] strObjectNames; @@ -112,6 +113,8 @@ 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_MAC_POLICY_EXT = ".tomoyo.pol"; + 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,8 +133,12 @@ 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 final String STR_MAC_POL_PATH = "tomoyo/"; private static int INT_SIZE = 4; // send length in the size of integer (4 bytes) + private static final int INT_DNS_PORT = 53; /** * Runtime class name constants - not to be configured by users @@ -152,6 +159,7 @@ public class IoTMaster { commHan = null; lbIoT = null; routerConfig = null; + processJailConfig = null; objInitHand = null; objAddInitHand = null; strObjectNames = argObjNms; @@ -205,11 +213,31 @@ public class IoTMaster { lbIoT.setupLoadBalancer(); routerConfig = new RouterConfig(); routerConfig.getAddressList(STR_ROUTER_ADD); + processJailConfig = new ProcessJailConfig(); + //processJailConfig.setAddressListObject(routerConfig.getAddressListObject()); objInitHand = new ObjectInitHandler(BOOL_VERBOSE); objAddInitHand = new ObjectAddressInitHandler(BOOL_VERBOSE); mapClassNameToCrim = new HashMap(); } + /** + * 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 * @@ -486,7 +514,7 @@ public class IoTMaster { RuntimeOutput.print("IoTMaster: Number of rows for IoTZigbeeAddress: " + iRows, BOOL_VERBOSE); // TODO: DEBUG!!! - System.out.println("\n\n DEBUG: InstrumentZigbeeDevice: Object Name: " + strObjName); + System.out.println("\n\nDEBUG: InstrumentZigbeeDevice: Object Name: " + strObjName); System.out.println("DEBUG: InstrumentZigbeeDevice: Port number: " + commHan.getComPort(strZigbeeGWAddressKey)); System.out.println("DEBUG: InstrumentZigbeeDevice: Device address: " + strZigbeeGWAddress + "\n\n"); @@ -556,10 +584,11 @@ public class IoTMaster { * A private method to instrument an object on a specific machine and setting up policies * * @params strFieldObjectID String field object ID + * @params strObjControllerName String object controller name * @params strLanguage String language * @return void */ - private void instrumentObject(String strFieldObjectID, String strLanguage) throws IOException { + private void instrumentObject(String strFieldObjectID, String strObjControllerName, String strLanguage) throws IOException { // Extract the interface name for RMI // e.g. ProximitySensorInterface, TempSensorInterface, etc. @@ -604,6 +633,14 @@ public class IoTMaster { strIoTSlaveObjectHostAdd, STR_TCP_PROTOCOL); routerConfig.configureHostMainPolicies(strIoTSlaveObjectHostAdd, strIoTSlaveControllerHostAdd, strIoTSlaveObjectHostAdd, STR_TCP_PROTOCOL); + // Configure MAC policies for objects + //String strFileName = STR_MAC_POL_PATH + strObjClassName + STR_MAC_POLICY_EXT; + String strFileName = STR_MAC_POL_PATH + STR_JAVA + STR_MAC_POLICY_EXT; + processJailConfig.configureProcessJailDeviceDriverPolicies(strIoTSlaveObjectHostAdd, strObjName, strObjClassName, + strFileName, strIoTMasterHostAdd, commHan.getComPort(strObjName), commHan.getRMIRegPort(strObjName), + commHan.getRMIStubPort(strObjName)); + processJailConfig.configureProcessJailContRMIPolicies(strObjControllerName, strIoTSlaveObjectHostAdd, + commHan.getRMIRegPort(strObjName), commHan.getRMIStubPort(strObjName)); // Instrument the IoTSet declarations inside the class file instrumentObjectIoTSet(strFieldObjectID, strLanguage); } @@ -694,6 +731,8 @@ public class IoTMaster { routerConfig.configureHostMainPolicies(strIoTSlaveObjectHostAdd, strIoTSlaveObjectHostAdd, strDeviceAddress, STR_TCP_PROTOCOL, iDestDeviceDriverPort); routerConfig.configureRouterHTTPPolicies(STR_ROUTER_ADD, strIoTSlaveObjectHostAdd, strDeviceAddress); routerConfig.configureHostHTTPPolicies(strIoTSlaveObjectHostAdd, strIoTSlaveObjectHostAdd, strDeviceAddress); + // Configure MAC policies + processJailConfig.configureProcessJailGWDevicePolicies(strIoTSlaveObjectHostAdd, STR_ROUTER_ADD, INT_DNS_PORT); } else { // Other port numbers... commHan.addDevicePort(iDestDeviceDriverPort); @@ -701,6 +740,9 @@ public class IoTMaster { commHan.getComPort(strDeviceAddressKey), iDestDeviceDriverPort); routerConfig.configureHostMainPolicies(strIoTSlaveObjectHostAdd, strIoTSlaveObjectHostAdd, strDeviceAddress, strProtocol, commHan.getComPort(strDeviceAddressKey), iDestDeviceDriverPort); + // Configure MAC policies + processJailConfig.configureProcessJailDevicePolicies(strIoTSlaveObjectHostAdd, strProtocol, + commHan.getComPort(strDeviceAddressKey), strDeviceAddress, iDestDeviceDriverPort); } } } @@ -714,7 +756,7 @@ public class IoTMaster { * @return void */ private void setRouterPolicyIoTSetAddress(String strFieldIdentifier, Map.Entry map, - String strHostAddress) { + String strHostAddress, String strControllerName) { // Get information from the set SetInstrumenter setInstrumenter = (SetInstrumenter) map.getValue(); @@ -727,6 +769,11 @@ public class IoTMaster { // Get device address String strAddress = (String) arrFieldValues[0]; // Setting up router policies for HTTP/HTTPs + if (strControllerName != null) { + processJailConfig.configureProcessJailInetAddressPolicies(strControllerName, strAddress); + } else { + processJailConfig.configureProcessJailInetAddressPolicies(strHostAddress, strAddress); + } routerConfig.configureRouterHTTPPolicies(STR_ROUTER_ADD, strHostAddress, strAddress); routerConfig.configureHostHTTPPolicies(strHostAddress, strHostAddress, strAddress); } @@ -781,7 +828,7 @@ public class IoTMaster { setRouterPolicyIoTSetDevice(strFieldIdentifier, map, strIoTSlaveObjectHostAdd); } else if(setInstrumenter.getObjTableName().equals(STR_IOT_ADD_CLS)) { // Instrument the IoTAddress - setRouterPolicyIoTSetAddress(strFieldIdentifier, map, strIoTSlaveObjectHostAdd); + setRouterPolicyIoTSetAddress(strFieldIdentifier, map, strIoTSlaveObjectHostAdd, null); } else if(setInstrumenter.getObjTableName().equals(STR_IOT_ZB_ADD_CLS)) { // Instrument the IoTZigbeeAddress - special feature for Zigbee device support RuntimeOutput.print("IoTMaster: IoTZigbeeAddress found! No router policy is set here..", @@ -872,11 +919,18 @@ public class IoTMaster { */ 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 + " " + + // 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 &"; + 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 +947,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 * @@ -1101,7 +1171,7 @@ public class IoTMaster { * @params strLanguage String language * @return void */ - private void instrumentIoTSet(Map.Entry map, String strFieldName, String strLanguage) + private void instrumentIoTSet(Map.Entry map, String strFieldName, String strObjControllerName, String strLanguage) throws IOException, ClassNotFoundException, InterruptedException { // Get information from the set @@ -1117,7 +1187,7 @@ public class IoTMaster { String strObjID = setInstrumenter.fieldObjectID(iRow); strObjClassName = setInstrumenter.fieldEntryType(strObjID); // Call the method to create an object - instrumentObject(strObjID, strLanguage); + instrumentObject(strObjID, strObjControllerName, strLanguage); objInitHand.addObjectIntoField(strFieldName, strIoTSlaveObjectHostAdd, strObjName, strObjClassName, strObjClassInterfaceName, strObjStubClsIntfaceName, commHan.getRMIRegPort(strObjName), commHan.getRMIStubPort(strObjName)); @@ -1133,7 +1203,7 @@ public class IoTMaster { * @params strLanguage String language * @return void */ - private void instrumentIoTRelation(Map.Entry map, String strFieldName, String strLanguage) + private void instrumentIoTRelation(Map.Entry map, String strFieldName, String strObjControllerName, String strLanguage) throws IOException, ClassNotFoundException, InterruptedException { // Get information from the set @@ -1148,7 +1218,7 @@ public class IoTMaster { String strObjID = relationInstrumenter.firstFieldObjectID(iRow); strObjClassName = relationInstrumenter.firstEntryFieldType(strObjID); // Call the method to create an object - instrumentObject(strObjID, strLanguage); + instrumentObject(strObjID, strObjControllerName, strLanguage); // Get the first object controller host address String strFirstIoTSlaveObjectHostAdd = strIoTSlaveObjectHostAdd; objInitHand.addObjectIntoField(strFieldName, strIoTSlaveObjectHostAdd, strObjName, @@ -1160,7 +1230,7 @@ public class IoTMaster { strObjID = relationInstrumenter.secondFieldObjectID(iRow); strObjClassName = relationInstrumenter.secondEntryFieldType(strObjID); // Call the method to create an object - instrumentObject(strObjID, strLanguage); + instrumentObject(strObjID, strObjControllerName, strLanguage); // Get the second object controller host address String strSecondIoTSlaveObjectHostAdd = strIoTSlaveObjectHostAdd; objInitHand.addSecondObjectIntoField(strFieldName, strIoTSlaveObjectHostAdd, strObjName, @@ -1373,6 +1443,39 @@ public class IoTMaster { } } + /** + * A method to create a thread for policy deployment + * + * @param setHostAddresses Set of strings for host addresses to configure + * @return void + */ + private void createMACPolicyThreads(Set setHostAddresses) throws IOException { + + // Create a list of threads + List threads = new ArrayList(); + // Start threads for hosts + for(String strAddress : setHostAddresses) { + Thread policyThread = new Thread(new Runnable() { + public void run() { + synchronized(this) { + processJailConfig.sendMACPolicies(strAddress); + } + } + }); + threads.add(policyThread); + policyThread.start(); + RuntimeOutput.print("Deploying MAC policies for: " + strAddress, BOOL_VERBOSE); + } + // Join all threads + for (Thread thread : threads) { + try { + thread.join(); + } catch (InterruptedException ex) { + ex.printStackTrace(); + } + } + } + /** * A method to send files to Java IoTSlave @@ -1502,14 +1605,19 @@ public class IoTMaster { */ private String getCmdJavaIoTSlave(String strObjControllerName) { - return STR_SSH + " " + STR_USERNAME + strIoTSlaveControllerHostAdd + " cd " + - STR_RUNTIME_DIR + " sudo java " + 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 &"; + // 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; } @@ -1950,7 +2058,11 @@ public class IoTMaster { sendFileToCppSlave(strControllerFilePath, strControllerZipFile); createMainObjectCpp(strObjControllerName, outStream, inStream); } - + // Write basic MAC policies for controller + //String strFileName = STR_MAC_POL_PATH + strObjControllerName + STR_MAC_POLICY_EXT; + String strFileName = STR_MAC_POL_PATH + STR_JAVA + STR_MAC_POLICY_EXT; + processJailConfig.configureProcessJailControllerPolicies(strObjControllerName, strFileName, + strIoTMasterHostAdd, commHan.getComPort(strObjControllerName)); // PROFILING result = System.currentTimeMillis()-start; System.out.println("\n\n ==> From IoTSlave start until main controller object is created: " + result); @@ -1997,16 +2109,21 @@ public class IoTMaster { throw new Error(strErrMsg); } else if(setInstrumenter.getObjTableName().equals(STR_IOT_ADD_CLS)) { // Instrument the IoTAddress - setRouterPolicyIoTSetAddress(strFieldName, map, strIoTSlaveControllerHostAdd); + setRouterPolicyIoTSetAddress(strFieldName, map, strIoTSlaveControllerHostAdd, strObjControllerName); instrumentIoTSetAddress(strFieldName, strFieldName, inStream, outStream, STR_LANGUAGE_CONTROLLER); } else { // Any other cases - instrumentIoTSet(map, strFieldName, STR_LANGUAGE_CONTROLLER); + instrumentIoTSet(map, strFieldName, strObjControllerName, STR_LANGUAGE_CONTROLLER); } } else if (strClassName.equals(STR_REL_INSTRUMENTER_CLS)) { - instrumentIoTRelation(map, strFieldName, STR_LANGUAGE_CONTROLLER); + instrumentIoTRelation(map, strFieldName, strObjControllerName, STR_LANGUAGE_CONTROLLER); } } + // Combine controller MAC policies with the main policy file for the host + String strTempFileName = "./" + strObjControllerName + STR_MAC_POLICY_EXT; + processJailConfig.combineControllerMACPolicies(strIoTSlaveControllerHostAdd, strObjControllerName, strTempFileName); + processJailConfig.close(); + // PROFILING result = System.currentTimeMillis()-start; System.out.println("\n\n ==> Time needed to instrument device driver objects: " + result + "\n\n"); @@ -2075,6 +2192,8 @@ public class IoTMaster { serverSocket.close(); commHan.printLists(); lbIoT.printHostInfo(); + // TODO: Uncomment this - just for experiments! + createMACPolicyThreads(setAddresses); } } catch (IOException |