CLI.java 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. package ui;
  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.InvocationTargetException;
  4. import java.net.InetSocketAddress;
  5. import org.apache.commons.cli.CommandLine;
  6. import org.apache.commons.cli.CommandLineParser;
  7. import org.apache.commons.cli.GnuParser;
  8. import org.apache.commons.cli.Options;
  9. import org.apache.commons.cli.ParseException;
  10. import communication.Communication;
  11. import exceptions.NoSuchPartyException;
  12. import oram.Global;
  13. import oram.Metadata;
  14. import protocols.*;
  15. import protocols.struct.Party;
  16. public class CLI {
  17. public static final int DEFAULT_PORT = 8000;
  18. public static final String DEFAULT_IP = "localhost";
  19. public static void main(String[] args) {
  20. // Setup command line argument parser
  21. Options options = new Options();
  22. options.addOption("config", true, "Config file");
  23. options.addOption("forest", true, "Forest file");
  24. options.addOption("eddie_ip", true, "IP to look for eddie");
  25. options.addOption("debbie_ip", true, "IP to look for debbie");
  26. options.addOption("protocol", true, "Algorithim to test");
  27. options.addOption("pipeline", false, "Whether to do pipelined eviction");
  28. // Parse the command line arguments
  29. CommandLineParser cmdParser = new GnuParser();
  30. CommandLine cmd = null;
  31. try {
  32. cmd = cmdParser.parse(options, args);
  33. } catch (ParseException e1) {
  34. e1.printStackTrace();
  35. }
  36. Global.pipeline = cmd.hasOption("pipeline");
  37. String configFile = cmd.getOptionValue("config", "config.yaml");
  38. String forestFile = cmd.getOptionValue("forest", null);
  39. String party = null;
  40. String[] positionalArgs = cmd.getArgs();
  41. if (positionalArgs.length > 0) {
  42. party = positionalArgs[0];
  43. } else {
  44. try {
  45. throw new ParseException("No party specified");
  46. } catch (ParseException e) {
  47. e.printStackTrace();
  48. System.exit(-1);
  49. }
  50. }
  51. int extra_port = 1;
  52. int eddiePort1 = DEFAULT_PORT;
  53. int eddiePort2 = eddiePort1 + extra_port;
  54. int debbiePort = eddiePort2 + extra_port;
  55. String eddieIp = cmd.getOptionValue("eddie_ip", DEFAULT_IP);
  56. String debbieIp = cmd.getOptionValue("debbie_ip", DEFAULT_IP);
  57. Class<? extends Protocol> operation = null;
  58. String protocol = cmd.getOptionValue("protocol", "retrieve").toLowerCase();
  59. if (protocol.equals("acc")) {
  60. operation = Access.class;
  61. } else if (protocol.equals("cot")) {
  62. operation = SSCOT.class;
  63. } else if (protocol.equals("iot")) {
  64. operation = SSIOT.class;
  65. } else if (protocol.equals("rsf")) {
  66. operation = Reshuffle.class;
  67. } else if (protocol.equals("ppt")) {
  68. operation = PostProcessT.class;
  69. } else if (protocol.equals("ur")) {
  70. operation = UpdateRoot.class;
  71. } else if (protocol.equals("evi")) {
  72. operation = Eviction.class;
  73. } else if (protocol.equals("pt")) {
  74. operation = PermuteTarget.class;
  75. } else if (protocol.equals("pi")) {
  76. operation = PermuteIndex.class;
  77. } else if (protocol.equals("xot")) {
  78. operation = SSXOT.class;
  79. } else if (protocol.equals("rtv")) {
  80. operation = Retrieve.class;
  81. } else {
  82. System.out.println("Protocol " + protocol + " not supported");
  83. System.exit(-1);
  84. }
  85. Constructor<? extends Protocol> operationCtor = null;
  86. try {
  87. operationCtor = operation.getDeclaredConstructor(Communication.class, Communication.class);
  88. } catch (NoSuchMethodException | SecurityException e1) {
  89. e1.printStackTrace();
  90. }
  91. // For now all logic happens here. Eventually this will get wrapped
  92. // up in party specific classes.
  93. System.out.println("Starting " + party + "...");
  94. Metadata md = new Metadata(configFile);
  95. int numComs = Global.pipeline ? md.getNumTrees() + 1 : 1;
  96. Communication[] con1 = new Communication[numComs];
  97. Communication[] con2 = new Communication[numComs];
  98. if (party.equals("eddie")) {
  99. System.out.print("Waiting to establish debbie connections...");
  100. for (int i = 0; i < numComs; i++) {
  101. con1[i] = new Communication();
  102. con1[i].start(eddiePort1);
  103. eddiePort1 += 3;
  104. while (con1[i].getState() != Communication.STATE_CONNECTED)
  105. ;
  106. }
  107. System.out.println(" done!");
  108. System.out.print("Waiting to establish charlie connections...");
  109. for (int i = 0; i < numComs; i++) {
  110. con2[i] = new Communication();
  111. con2[i].start(eddiePort2);
  112. eddiePort2 += 3;
  113. while (con2[i].getState() != Communication.STATE_CONNECTED)
  114. ;
  115. }
  116. System.out.println(" done!");
  117. for (int i = 0; i < numComs; i++) {
  118. con1[i].setTcpNoDelay(true);
  119. con2[i].setTcpNoDelay(true);
  120. }
  121. try {
  122. Protocol p = operationCtor.newInstance(con1[0], con2[0]);
  123. if (protocol.equals("rtv"))
  124. ((Retrieve) p).setCons(con1, con2);
  125. p.run(Party.Eddie, md, forestFile);
  126. } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
  127. | InvocationTargetException e) {
  128. e.printStackTrace();
  129. }
  130. } else if (party.equals("debbie")) {
  131. System.out.print("Waiting to establish eddie connections...");
  132. for (int i = 0; i < numComs; i++) {
  133. con1[i] = new Communication();
  134. InetSocketAddress addr = new InetSocketAddress(eddieIp, eddiePort1);
  135. con1[i].connect(addr);
  136. eddiePort1 += 3;
  137. while (con1[i].getState() != Communication.STATE_CONNECTED)
  138. ;
  139. }
  140. System.out.println(" done!");
  141. System.out.print("Waiting to establish charlie connections...");
  142. for (int i = 0; i < numComs; i++) {
  143. con2[i] = new Communication();
  144. con2[i].start(debbiePort);
  145. debbiePort += 3;
  146. while (con2[i].getState() != Communication.STATE_CONNECTED)
  147. ;
  148. }
  149. System.out.println(" done!");
  150. for (int i = 0; i < numComs; i++) {
  151. con1[i].setTcpNoDelay(true);
  152. con2[i].setTcpNoDelay(true);
  153. }
  154. try {
  155. Protocol p = operationCtor.newInstance(con1[0], con2[0]);
  156. if (protocol.equals("rtv"))
  157. ((Retrieve) p).setCons(con1, con2);
  158. p.run(Party.Debbie, md, forestFile);
  159. } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
  160. | InvocationTargetException e) {
  161. e.printStackTrace();
  162. }
  163. } else if (party.equals("charlie")) {
  164. System.out.print("Waiting to establish eddie connections...");
  165. for (int i = 0; i < numComs; i++) {
  166. con1[i] = new Communication();
  167. InetSocketAddress addr = new InetSocketAddress(eddieIp, eddiePort2);
  168. con1[i].connect(addr);
  169. eddiePort2 += 3;
  170. while (con1[i].getState() != Communication.STATE_CONNECTED)
  171. ;
  172. }
  173. System.out.println(" done!");
  174. System.out.print("Waiting to establish debbie connections...");
  175. for (int i = 0; i < numComs; i++) {
  176. con2[i] = new Communication();
  177. InetSocketAddress addr = new InetSocketAddress(debbieIp, debbiePort);
  178. con2[i].connect(addr);
  179. debbiePort += 3;
  180. while (con2[i].getState() != Communication.STATE_CONNECTED)
  181. ;
  182. }
  183. System.out.println(" done!");
  184. for (int i = 0; i < numComs; i++) {
  185. con1[i].setTcpNoDelay(true);
  186. con2[i].setTcpNoDelay(true);
  187. }
  188. try {
  189. Protocol p = operationCtor.newInstance(con1[0], con2[0]);
  190. if (protocol.equals("rtv"))
  191. ((Retrieve) p).setCons(con1, con2);
  192. p.run(Party.Charlie, md, forestFile);
  193. } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
  194. | InvocationTargetException e) {
  195. e.printStackTrace();
  196. }
  197. } else {
  198. throw new NoSuchPartyException(party);
  199. }
  200. try {
  201. Thread.sleep(1000);
  202. } catch (InterruptedException e) {
  203. e.printStackTrace();
  204. }
  205. for (int i = 0; i < numComs; i++) {
  206. con1[i].stop();
  207. con2[i].stop();
  208. }
  209. System.out.println(party + " exiting...");
  210. }
  211. }