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 }