View Javadoc

1   package au.com.loftinspace.tcpreflector;
2   
3   import au.com.loftinspace.tcpreflector.packet.AsciiLoggingPacketListener;
4   import au.com.loftinspace.tcpreflector.packet.BinaryLoggingPacketListener;
5   
6   import java.io.IOException;
7   import java.net.InetSocketAddress;
8   
9   /***
10   * Author: Jem
11   * Date: 17/02/2004
12   * Time: 22:57:11
13   */
14  public class TcpReflectorMain {
15      private static final String TAG_PORT = "-port";
16      private static final String TAG_HELP = "-help";
17      private static final String TAG_DESTINATION = "-dest";
18      private static final String TAG_FORMAT = "-format";
19      private static final String VALUE_ASCII = "ascii";
20      private static final String VALUE_BINARY = "binary";
21      private static final String VALUE_NONE = "none";
22  
23      private static int listenPort;
24      private static InetSocketAddress destination;
25      private static String listenerType;
26  
27      public static void main(String[] args) throws IOException {
28          parseArguments(args);
29          TcpReflector reflectorSpawner = new TcpReflector(listenPort, destination);
30          addPacketListener(reflectorSpawner);
31          printStartedMessage();
32          reflectorSpawner.run();
33      }
34  
35      private static void parseArguments(String[] args) {
36          int index = 0;
37  
38          while (index < args.length) {
39              if (args[index].equals(TAG_HELP)) {
40                  printUsageAndExit(0);
41  
42              } else if (args[index].equals(TAG_PORT)) {
43                  ensureMoreArgumentsExist(args, index);
44                  listenPort = parseInt(args[++index]);
45  
46              } else if (args[index].equals(TAG_DESTINATION)) {
47                  ensureMoreArgumentsExist(args, index);
48                  destination = parseAddress(args[++index]);
49  
50              } else if (args[index].equals(TAG_FORMAT)) {
51                  ensureMoreArgumentsExist(args, index);
52                  listenerType = parseListenerType(args[++index]);
53  
54              } else {
55                  printUsageAndExit(-1);
56              }
57  
58              index++;
59          }
60  
61          if ((listenPort == 0) || (destination == null)) {
62              printUsageAndExit(-1);
63          }
64      }
65  
66      private static String parseListenerType(String argument) {
67          if (!((VALUE_ASCII.equalsIgnoreCase(argument)) || (VALUE_BINARY.equalsIgnoreCase(argument)) || (VALUE_NONE.equalsIgnoreCase(argument)))) {
68              printUsageAndExit(-1);
69          }
70          return argument;
71      }
72  
73      private static InetSocketAddress parseAddress(String argument) {
74          String[] hostAndPort = argument.split(":");
75          if (hostAndPort.length != 2) {
76              printUsageAndExit(-1);
77          }
78          return new InetSocketAddress(hostAndPort[0], parseInt(hostAndPort[1]));
79      }
80  
81      private static int parseInt(String argument) {
82          int value = 0;
83          try {
84              value = Integer.parseInt(argument);
85          } catch (NumberFormatException e) {
86              printUsageAndExit(-1);
87          }
88          return value;
89      }
90  
91      private static void ensureMoreArgumentsExist(String[] args, int index) {
92          if (args.length <= index) {
93              printUsageAndExit(-1);
94          }
95      }
96  
97      private static void addPacketListener(TcpReflector reflectorSpawner) {
98          if (VALUE_ASCII.equals(listenerType)) {
99              reflectorSpawner.addListener(new AsciiLoggingPacketListener());
100         }
101         if (VALUE_BINARY.equals(listenerType)) {
102             reflectorSpawner.addListener(new BinaryLoggingPacketListener());
103         }
104     }
105 
106     private static void printStartedMessage() {
107         System.out.println("TcpReflectorMain running on port " + listenPort + ", redirecting to " + destination + " and using logger [" + listenerType + "]");
108     }
109 
110     private static void printUsageAndExit(int exitCode) {
111         System.out.println("TcpReflectorMain usage:");
112         System.out.println("java -port {localPortNumber} -dest {destinationAddress}:{destinationPort} [-format {binary|ascii|none}]");
113         System.out.println();
114         System.out.println("localPortNumber:    TcpReflectorMain will listen for socket connections at this port");
115         System.out.println("destinationAddress: Host to reflect all packets to and from");
116         System.out.println("destinationPort:    Port to reflect all packets to and from");
117         System.out.println("binary|ascii|none:  How to log packets. Either ASCII, binary or not at all");
118         System.exit(exitCode);
119     }
120 }