CLI.java 7.4 KB

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