package be.nikiroo.utils.main;
import be.nikiroo.utils.TraceHandler;
import be.nikiroo.utils.serial.server.ServerBridge;
/**
* Serialiser bridge (starts a {@link ServerBridge} and can thus intercept
* communication between a client and a server).
*
* @author niki
*/
public class bridge {
/**
* The optional options that can be passed to the program.
*
* @author niki
*/
private enum Option {
/**
* The encryption key for the input data (optional, but can also be
* empty which is different (it will then use an empty encryption
* key)).
*/
KEY,
/**
* The encryption key for the output data (optional, but can also be
* empty which is different (it will then use an empty encryption
* key)).
*/
FORWARD_KEY,
/** The trace level (1, 2, 3.. default is 1). */
TRACE_LEVEL,
/**
* The maximum length after which to truncate data to display (the whole
* data will still be sent).
*/
MAX_DISPLAY_SIZE,
/** The help message. */
HELP,
}
static private String getSyntax() {
return "Syntax: (--options) (--) [NAME] [PORT] [FORWARD_HOST] [FORWARD_PORT]\n"//
+ "\tNAME : the bridge name for display/debug purposes\n"//
+ "\tPORT : the port to listen on\n"//
+ "\tFORWARD_HOST : the host to connect to\n"//
+ "\tFORWARD_PORT : the port to connect to\n"//
+ "\n" //
+ "\tOptions: \n" //
+ "\t-- : no more options in the rest of the parameters\n" //
+ "\t--help : this help message\n" //
+ "\t--key : the INCOMING encryption key\n" //
+ "\t--forward-key : the OUTGOING encryption key\n" //
+ "\t--trace-level : the trace level (1, 2, 3... default is 1)\n" //
+ "\t--max-display-size : the maximum size after which to \n"//
+ "\t truncate the messages to display (the full message will still be sent)\n" //
;
}
/**
* Start a bridge between 2 servers.
*
* @param args
* the parameters, which can be seen by passing "--help" or just
* calling the program without parameters
*/
public static void main(String[] args) {
final TraceHandler tracer = new TraceHandler(true, false, 0);
try {
if (args.length == 0) {
tracer.error(getSyntax());
System.exit(0);
}
String key = null;
String fkey = null;
int traceLevel = 1;
int maxPrintSize = 0;
int i = 0;
while (args[i].startsWith("--")) {
String arg = args[i];
i++;
if (arg.equals("--")) {
break;
}
arg = arg.substring(2).toUpperCase().replace("-", "_");
try {
Option opt = Enum.valueOf(Option.class, arg);
switch (opt) {
case HELP:
tracer.trace(getSyntax());
System.exit(0);
break;
case FORWARD_KEY:
fkey = args[i++];
break;
case KEY:
key = args[i++];
break;
case MAX_DISPLAY_SIZE:
maxPrintSize = Integer.parseInt(args[i++]);
break;
case TRACE_LEVEL:
traceLevel = Integer.parseInt(args[i++]);
break;
}
} catch (Exception e) {
tracer.error(getSyntax());
System.exit(1);
}
}
if ((args.length - i) != 4) {
tracer.error(getSyntax());
System.exit(2);
}
String name = args[i++];
int port = Integer.parseInt(args[i++]);
String fhost = args[i++];
int fport = Integer.parseInt(args[i++]);
ServerBridge bridge = new ServerBridge(name, port, key, fhost,
fport, fkey);
bridge.setTraceHandler(new TraceHandler(true, true, traceLevel,
maxPrintSize));
bridge.run();
} catch (Exception e) {
tracer.error(e);
System.exit(42);
}
}
}