Changeset 5878fae


Ignore:
Timestamp:
Jun 17, 2015 2:22:28 AM (5 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
b6cb074c
Parents:
233cce8
Message:

Use getopt for SAM args processing
Args processing cleanups
Change default host from 0.0.0.0 to 127.0.0.1
Add -s option for SSL (unimplemented)
Put help text in a single string

File:
1 edited

Legend:

Unmodified
Added
Removed
  • apps/sam/java/src/net/i2p/sam/SAMBridge.java

    r233cce8 r5878fae  
    2828import java.util.Set;
    2929
     30import gnu.getopt.Getopt;
     31
    3032import net.i2p.I2PAppContext;
    3133import net.i2p.app.*;
     
    7375    public static final String PROP_TCP_HOST = "sam.tcp.host";
    7476    public static final String PROP_TCP_PORT = "sam.tcp.port";
    75     protected static final String DEFAULT_TCP_HOST = "0.0.0.0";
     77    protected static final String DEFAULT_TCP_HOST = "127.0.0.1";
    7678    protected static final String DEFAULT_TCP_PORT = "7656";
    7779   
    7880    public static final String PROP_DATAGRAM_HOST = "sam.udp.host";
    7981    public static final String PROP_DATAGRAM_PORT = "sam.udp.port";
    80     protected static final String DEFAULT_DATAGRAM_HOST = "0.0.0.0";
     82    protected static final String DEFAULT_DATAGRAM_HOST = "127.0.0.1";
    8183    protected static final String DEFAULT_DATAGRAM_PORT = "7655";
    8284
     
    457459        private final int port;
    458460        private final Properties opts;
    459 
    460         public Options(String host, int port, Properties opts, String keyFile) {
     461        private final boolean isSSL;
     462
     463        public Options(String host, int port, boolean isSSL, Properties opts, String keyFile) {
    461464            this.host = host; this.port = port; this.opts = opts; this.keyFile = keyFile;
     465            this.isSSL = isSSL;
    462466        }
    463467    }
     
    480484        int port = SAM_LISTENPORT;
    481485        String host = DEFAULT_TCP_HOST;
     486        boolean isSSL = false;
    482487        Properties opts = null;
    483         if (args.length > 0) {
    484                 opts = parseOptions(args, 0);
    485                 keyfile = args[0];
    486                 int portIndex = 1;
    487                 try {
    488                         if (args.length>portIndex) port = Integer.parseInt(args[portIndex]);
    489                 } catch (NumberFormatException nfe) {
    490                         host = args[portIndex];
    491                         portIndex++;
    492                         try {
    493                                 if (args.length>portIndex) port = Integer.parseInt(args[portIndex]);
    494                         } catch (NumberFormatException nfe1) {
    495                                 port = Integer.parseInt(opts.getProperty(SAMBridge.PROP_TCP_PORT, SAMBridge.DEFAULT_TCP_PORT));
    496                                 host = opts.getProperty(SAMBridge.PROP_TCP_HOST, SAMBridge.DEFAULT_TCP_HOST);
    497                         }
    498                 }
    499         }
    500         return new Options(host, port, opts, keyfile);
    501     }
    502 
     488        Getopt g = new Getopt("SAM", args, "hs");
     489        int c;
     490        while ((c = g.getopt()) != -1) {
     491          switch (c) {
     492            case 's':
     493                isSSL = true;
     494                break;
     495
     496            case 'h':
     497            case '?':
     498            case ':':
     499            default:
     500                throw new HelpRequestedException();
     501          }  // switch
     502        } // while
     503
     504        int startArgs = g.getOptind();
     505        // possible args before ones containing '=';
     506        // (none)
     507        // key port
     508        // key host port
     509        int startOpts;
     510        for (startOpts = startArgs; startOpts < args.length; startOpts++) {
     511            if (args[startOpts].contains("="))
     512                break;
     513        }
     514        int numArgs = startOpts - startArgs;
     515        switch (numArgs) {
     516            case 0:
     517                break;
     518
     519            case 2:
     520                keyfile = args[startArgs];
     521                try {
     522                    port = Integer.parseInt(args[startArgs + 1]);
     523                } catch (NumberFormatException nfe) {
     524                    throw new HelpRequestedException();
     525                }
     526                break;
     527
     528            case 3:
     529                keyfile = args[startArgs];
     530                host = args[startArgs + 1];
     531                try {
     532                    port = Integer.parseInt(args[startArgs + 2]);
     533                } catch (NumberFormatException nfe) {
     534                    throw new HelpRequestedException();
     535                }
     536                break;
     537
     538            default:
     539                throw new HelpRequestedException();
     540        }
     541
     542        int remaining = args.length - startOpts;
     543        if (remaining > 0) {
     544                opts = parseOptions(args, startOpts);
     545        }
     546        return new Options(host, port, isSSL, opts, keyfile);
     547    }
     548
     549    /**
     550     *  Parse key=value options starting at startArgs.
     551     *  @throws HelpRequestedException on any item not of the form key=value.
     552     */
    503553    private static Properties parseOptions(String args[], int startArgs) throws HelpRequestedException {
    504554        Properties props = new Properties();
    505         // skip over first few options
    506555        for (int i = startArgs; i < args.length; i++) {
    507                 if (args[i].equals("-h")) throw new HelpRequestedException();
    508556            int eq = args[i].indexOf('=');
    509             if (eq <= 0) continue;
    510             if (eq >= args[i].length()-1) continue;
     557            if (eq <= 0)
     558                throw new HelpRequestedException();
     559            if (eq >= args[i].length()-1)
     560                throw new HelpRequestedException();
    511561            String key = args[i].substring(0, eq);
    512562            String val = args[i].substring(eq+1);
     
    515565            if ( (key.length() > 0) && (val.length() > 0) )
    516566                props.setProperty(key, val);
     567            else
     568                throw new HelpRequestedException();
    517569        }
    518570        return props;
     
    520572   
    521573    private static void usage() {
    522         System.err.println("Usage: SAMBridge [keyfile [listenHost] listenPortNum[ name=val]*]");
    523         System.err.println("or:");
    524         System.err.println("       SAMBridge [ name=val ]*");
    525         System.err.println(" keyfile: location to persist private keys (default sam.keys)");
    526         System.err.println(" listenHost: interface to listen on (0.0.0.0 for all interfaces)");
    527         System.err.println(" listenPort: port to listen for SAM connections on (default 7656)");
    528         System.err.println(" name=val: options to pass when connecting via I2CP, such as ");
    529         System.err.println("           i2cp.host=localhost and i2cp.port=7654");
    530         System.err.println("");
    531         System.err.println("Host and ports of the SAM bridge can be specified with the alternate");
    532         System.err.println("form by specifying options "+SAMBridge.PROP_TCP_HOST+" and/or "+
    533                         SAMBridge.PROP_TCP_PORT);
    534         System.err.println("");
    535         System.err.println("Options "+SAMBridge.PROP_DATAGRAM_HOST+" and "+SAMBridge.PROP_DATAGRAM_PORT+
    536                         " specify the listening ip");
    537         System.err.println("range and the port of SAM datagram server. This server is");
    538         System.err.println("only launched after a client creates the first SAM datagram");
    539         System.err.println("or raw session, after a handshake with SAM version >= 3.0.");
    540         System.err.println("");
    541         System.err.println("The option loglevel=[DEBUG|WARN|ERROR|CRIT] can be used");
    542         System.err.println("for tuning the log verbosity.\n");
     574        System.err.println("Usage: SAMBridge [keyfile [listenHost] listenPortNum[ name=val]*]\n" +
     575                           "or:\n" +
     576                           "       SAMBridge [ name=val ]*\n" +
     577                           " keyfile: location to persist private keys (default sam.keys)\n" +
     578                           " listenHost: interface to listen on (0.0.0.0 for all interfaces)\n" +
     579                           " listenPort: port to listen for SAM connections on (default 7656)\n" +
     580                           " name=val: options to pass when connecting via I2CP, such as \n" +
     581                           "           i2cp.host=localhost and i2cp.port=7654\n" +
     582                           "\n" +
     583                           "Host and ports of the SAM bridge can be specified with the alternate\n" +
     584                           "form by specifying options "+SAMBridge.PROP_TCP_HOST+" and/or "+
     585                           SAMBridge.PROP_TCP_PORT +
     586                           "\n" +
     587                           "Options "+SAMBridge.PROP_DATAGRAM_HOST+" and "+SAMBridge.PROP_DATAGRAM_PORT+
     588                           " specify the listening ip\n" +
     589                           "range and the port of SAM datagram server. This server is\n" +
     590                           "only launched after a client creates the first SAM datagram\n" +
     591                           "or raw session, after a handshake with SAM version >= 3.0.\n" +
     592                           "\n" +
     593                           "The option loglevel=[DEBUG|WARN|ERROR|CRIT] can be used\n" +
     594                           "for tuning the log verbosity.");
    543595    }
    544596   
Note: See TracChangeset for help on using the changeset viewer.