Changeset a51e0c2 for installer/java


Ignore:
Timestamp:
Apr 20, 2004 7:32:21 AM (16 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
d26c56e
Parents:
180d3953
git-author:
jrandom <jrandom> (04/20/04 07:32:21)
git-committer:
zzz <zzz@…> (04/20/04 07:32:21)
Message:

added the eepProxy and harvester as part of the default clientApps run on startup
(with a commented out set of lines for a heartbeat client/server)
updated -cp lines accordingly
use javaw for windows users (so they can close the damn dos boxes)
toss the default logger logs into logs/ (say that three times fast)
formatting

Location:
installer/java/src
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • installer/java/src/Install.java

    r180d3953 ra51e0c2  
    9393   
    9494    public static void main(String args[]) {
    95         Install install = new CliInstall();
    96         install.runInstall();
     95        Install install = new CliInstall();
     96        install.runInstall();
    9797    }
    9898   
    9999    public Install() {
    100         _inTCP = -2;
    101         _i2cpPort = -2;
    102         _phttpRegister = null;
    103         _phttpSend = null;
    104         _inBPS = -2;
    105         _outBPS = -2;
    106         _externalAddressIsReachable = false;
     100        _inTCP = -2;
     101        _i2cpPort = -2;
     102        _phttpRegister = null;
     103        _phttpSend = null;
     104        _inBPS = -2;
     105        _outBPS = -2;
     106        _externalAddressIsReachable = false;
    107107    }
    108108   
    109109    public void runInstall() {
    110         askQuestions();
    111         detectOS();
    112         configureAll();
    113         createConfigFile();
    114         createLoggerConfig();
    115         createStartScript();
    116         createReseedScript();
    117         createEepProxyScript();
    118         //createScripts("startSquid.sh", "startSquid.bat", 5555, "squid.i2p", "log-squid-#.txt", "Squid Proxy", "Squid proxying scripts written to startSquid");
    119         createScripts("startIrcProxy.sh", "startIrcProxy.bat", 6668, "irc.duck.i2p", "log-irc-#.txt", "IRC Proxy", "IRC proxying scripts written to startIrcProxy", "Starting IRC proxy (when you see Ready! you can connect your IRC client to localhost:6668)");
    120         //createScripts("startI2PCVSProxy.sh", "startI2PCVSProxy.bat", 2401, "i2pcvs.i2p", "log-i2pcvs-#.txt", "CVS Proxy", "Proxying scripts for I2P's CVS server written to startCVSProxy");
    121         // only pulling them temporarily, duck, until the network is
    122         // reliable enough
    123         //createScripts("startJabber.sh", "startJabber.bat", 5222, "jabber.duck.i2p", "log-jabber-#.txt", "Jabber Proxy", "Squid proxying scripts written to startSquid");
    124 
    125         //createScripts("startNntpProxy.sh", "startNntpProxy.bat", 1119, "nntp.duck.i2p", "log-nntp-#.txt", "NNTP Proxy","NNTP proxying scripts written to startNntpProxy");
    126         createSeedNodes();
    127         copyLibraries();
    128         if (_isWindows) {
    129             showStatus("To run the router, please run startRouter.bat in " + _installDir.getAbsolutePath());
    130         } else {
    131             showStatus("To run the router, please run startRouter.sh in " + _installDir.getAbsolutePath());
    132         }
    133         showStatus("");
     110        askQuestions();
     111        detectOS();
     112        configureAll();
     113        createConfigFile();
     114        createLoggerConfig();
     115        createStartScript();
     116        createReseedScript();
     117        createScripts("startIrcProxy.sh", "startIrcProxy.bat", 6668, "irc.duck.i2p", "log-irc-#.txt", "IRC Proxy", "IRC proxying scripts written to startIrcProxy", "Starting IRC proxy (when you see Ready! you can connect your IRC client to localhost:6668)");
     118        //createScripts("startI2PCVSProxy.sh", "startI2PCVSProxy.bat", 2401, "i2pcvs.i2p", "log-i2pcvs-#.txt", "CVS Proxy", "Proxying scripts for I2P's CVS server written to startCVSProxy");
     119        // only pulling them temporarily, duck, until the network is
     120        // reliable enough
     121        //createScripts("startJabber.sh", "startJabber.bat", 5222, "jabber.duck.i2p", "log-jabber-#.txt", "Jabber Proxy", "Squid proxying scripts written to startSquid");
     122        //createScripts("startNntpProxy.sh", "startNntpProxy.bat", 1119, "nntp.duck.i2p", "log-nntp-#.txt", "NNTP Proxy","NNTP proxying scripts written to startNntpProxy");
     123        createSeedNodes();
     124        copyLibraries();
     125        if (_isWindows) {
     126            showStatus("To run the router, please run startRouter.bat in " + _installDir.getAbsolutePath());
     127        } else {
     128            showStatus("To run the router, please run startRouter.sh in " + _installDir.getAbsolutePath());
     129        }
     130        showStatus("");
    134131    }
    135132
    136133    private String numberTo4Digits(int number) {
    137         String res = "0000"+number; // use four digit indices
    138         return res.substring(res.length()-4);
     134        String res = "0000"+number; // use four digit indices
     135        return res.substring(res.length()-4);
    139136    }
    140137   
    141138    private void askQuestions() {
    142         try {
    143             InputStream in =
    144                 Install.class.getResourceAsStream("/install.config");
    145             _p = new Properties();
    146             _p.load(in);
    147             in.close();
    148         } catch (IOException ex) {
    149             ex.printStackTrace();
    150             System.exit(1);
    151         }
    152         int count = Integer.parseInt(_p.getProperty("qs.count"));
    153         _answers = new HashMap(count+count); // load factor is 0.75, so
    154                                              // there is some room left
    155         for (int i=1;i<=count;i++) {
    156             String ii = numberTo4Digits(i);
    157             String question = _p.getProperty("qs."+ii+".question"),
    158                 param = _p.getProperty("qs."+ii+".param"),
    159                 type = _p.getProperty("qs."+ii+".type"),
    160                 def = _p.getProperty("qs."+ii+".default");
    161             if (question == null) continue;
    162             if (type == null || "info".equals(type)) {
    163                 // just print some text
    164                 handleOptInfo(question);
    165             } else if ("info_spliced".equals(type)) {
    166                 // splice in some params already queried
    167                 handleOptInfo(handleSpliceParams(question));
    168             } else if ("category".equals(type)) {
    169                 startOptCategory(question);
    170             } else if ("skip".equals(type)) {
    171                 i = Integer.parseInt(question)-1;
    172             } else { // a real question
    173                 if ("<none>".equals(question)) {
    174                     if (!setOption(i, def))
    175                         throw new RuntimeException("Fixed and invalid value");
    176                 } else {
    177                     handleOption(i,question,def,type);
    178                 }
    179             }
    180         }
    181         finishOptions();
     139        try {
     140            InputStream in = Install.class.getResourceAsStream("/install.config");
     141            _p = new Properties();
     142            _p.load(in);
     143            in.close();
     144        } catch (IOException ex) {
     145            ex.printStackTrace();
     146            System.exit(1);
     147        }
     148        int count = Integer.parseInt(_p.getProperty("qs.count"));
     149        _answers = new HashMap(count+count); // load factor is 0.75, so
     150                                             // there is some room left
     151        for (int i=1;i<=count;i++) {
     152            String ii = numberTo4Digits(i);
     153            String question = _p.getProperty("qs."+ii+".question"),
     154            param = _p.getProperty("qs."+ii+".param"),
     155            type = _p.getProperty("qs."+ii+".type"),
     156            def = _p.getProperty("qs."+ii+".default");
     157            if (question == null) continue;
     158            if (type == null || "info".equals(type)) {
     159                // just print some text
     160                handleOptInfo(question);
     161            } else if ("info_spliced".equals(type)) {
     162                // splice in some params already queried
     163                handleOptInfo(handleSpliceParams(question));
     164            } else if ("category".equals(type)) {
     165                startOptCategory(question);
     166            } else if ("skip".equals(type)) {
     167                i = Integer.parseInt(question)-1;
     168            } else { // a real question
     169                if ("<none>".equals(question)) {
     170                    if (!setOption(i, def))
     171                        throw new RuntimeException("Fixed and invalid value");
     172                } else {
     173                    handleOption(i,question,def,type);
     174                }
     175            }
     176        }
     177        finishOptions();
    182178    }
    183179
    184180    public /* overridable */ String handleSpliceParams(String s) {
    185         return spliceParams(s);
     181        return spliceParams(s);
    186182    }
    187183
    188184    public boolean setOption(int number, String answer) {
    189         String ii = numberTo4Digits(number);
    190         String param = _p.getProperty("qs."+ii+".param"),
    191             type = _p.getProperty("qs."+ii+".type");
    192         Object value = getOptionValue(answer, type);
    193         if (value == null) {
    194             return false;
    195         } else {
    196             if (param == null || value == null)
    197                 throw new NullPointerException();
    198             _answers.put(param,value);
    199             return true;
    200         }
     185        String ii = numberTo4Digits(number);
     186        String param = _p.getProperty("qs."+ii+".param"),
     187        type = _p.getProperty("qs."+ii+".type");
     188        Object value = getOptionValue(answer, type);
     189        if (value == null) {
     190            return false;
     191        } else {
     192            if (param == null || value == null)
     193                throw new NullPointerException();
     194            _answers.put(param,value);
     195            return true;
     196        }
    201197    }   
    202198
    203199    private Object getOptionValue(String answer, String type) {
    204         if ("string".equals(type)) {
    205             // everything's okay till the very end
    206             return answer;
    207         } else if ("string>0".equals(type)) {
    208             if (answer.length() > 0) {
    209                 return answer;
    210             } else {
    211                 showOptError("Empty answers are not allowed.");
    212             }
    213         } else if ("directory".equals(type)) {
    214             File f = new File(answer);
    215             if (f.exists()) {
    216                 if (f.isDirectory()) {
    217                     showOptError("Using existing target directory " + f.getAbsolutePath());
    218                     return f;
    219                 } else {
    220                     showOptError("Location " + f.getAbsolutePath()+
    221                                  " is not a directory.  "+
    222                                  "Lets try again");
    223                 }
    224             } else {
    225                 boolean create = confirmOption
    226                     ("Target directory " + f.getAbsolutePath() +
    227                      " does not exist - create? ", false);
    228                 if (!create) {
    229                     showOptError("Lets try that again");
    230                 } else {
    231                     boolean created = f.mkdirs();
    232                     if (created) {
    233                         showOptError("Target directory " +
    234                                      f.getAbsolutePath() +
    235                                      " created");
    236                         return f;
    237                     } else {
    238                         showOptError("Failed to create the "+
    239                                      "directory.  Lets choose "+
    240                                      "another.");
    241                     }
    242                 }
    243             }
    244         } else if ("boolean".equals(type)) {
    245             answer=answer.toLowerCase();
    246             if ("yes".equals(answer) || "y".equals(answer))
    247                 answer="true";
    248             if ("no".equals(answer) || "n".equals(answer))
    249                 answer="false";
    250             if ("true".equals(answer) || "false".equals(answer)) {
    251                 return new Boolean("true".equals(answer));
    252             }
    253             showOptError("Incorrect boolean value, try `yes' òr `no'");
    254         } else if ("numeric".equals(type) || "port".equals(type)) {
    255             try {
    256                 int num = Integer.parseInt(answer);
    257                 if ("numeric".equals(type) ||
    258                     (num >0 && num < 65536)) {
    259                     return new Integer(num);
    260                 }
    261                 showOptError("Port number must be from 1 to 65535");
    262             } catch (NumberFormatException ex) {
    263                 showOptError("Incorrect value: "+ex.getMessage());
    264             }
    265         } else if ("bandwidth".equals(type)) {
    266             try {
    267                 answer = answer.toLowerCase();
    268                 int factor = 1;
    269                 // first check to see if it ends with m, k, or g
    270                 if (answer.endsWith("g"))
    271                     factor = 1024*1024*1024;
    272                 if (answer.endsWith("m"))
    273                     factor = 1024*1024;
    274                 if (answer.endsWith("k"))
    275                     factor = 1024;
    276                 if (factor > 1)
    277                     answer = answer.substring(0, answer.length()-1);
    278                 int val = factor * Integer.parseInt(answer);
    279                 if (val == -1 || val >0 ) {
    280                     return new Integer(val);
    281                 }
    282                 showOptError("Value must be -1 or positive.");
    283             } catch (NumberFormatException ex) {
    284                 showOptError("Invalid number [" + answer + "].  Valid numbers are of the form -1, 42, 68k, 7m, 9g");
    285             }
    286         } else {
    287             throw new RuntimeException ("cannot read installer option: " + type);
    288         }
    289         return null;
     200        if ("string".equals(type)) {
     201            // everything's okay till the very end
     202            return answer;
     203        } else if ("string>0".equals(type)) {
     204            if (answer.length() > 0) {
     205                return answer;
     206            } else {
     207                showOptError("Empty answers are not allowed.");
     208            }
     209        } else if ("directory".equals(type)) {
     210            File f = new File(answer);
     211            if (f.exists()) {
     212                if (f.isDirectory()) {
     213                    showOptError("Using existing target directory " + f.getAbsolutePath());
     214                    return f;
     215                } else {
     216                    showOptError("Location " + f.getAbsolutePath()+
     217                                 " is not a directory.  "+
     218                                 "Lets try again");
     219                }
     220            } else {
     221                boolean create = confirmOption("Target directory " + f.getAbsolutePath() +
     222                                               " does not exist - create? ", false);
     223                if (!create) {
     224                    showOptError("Lets try that again");
     225                } else {
     226                    boolean created = f.mkdirs();
     227                    if (created) {
     228                        showOptError("Target directory " + f.getAbsolutePath() +
     229                                     " created");
     230                        return f;
     231                    } else {
     232                        showOptError("Failed to create the "+
     233                                     "directory.  Lets choose another.");
     234                    }
     235                }
     236            }
     237        } else if ("boolean".equals(type)) {
     238            answer=answer.toLowerCase();
     239            if ("yes".equals(answer) || "y".equals(answer))
     240                answer="true";
     241            if ("no".equals(answer) || "n".equals(answer))
     242                answer="false";
     243            if ("true".equals(answer) || "false".equals(answer)) {
     244                return new Boolean("true".equals(answer));
     245            }
     246            showOptError("Incorrect boolean value, try `yes' òr `no'");
     247        } else if ("numeric".equals(type) || "port".equals(type)) {
     248            try {
     249                int num = Integer.parseInt(answer);
     250                if ("numeric".equals(type) ||
     251                    (num >0 && num < 65536)) {
     252                    return new Integer(num);
     253                }
     254                showOptError("Port number must be from 1 to 65535");
     255            } catch (NumberFormatException ex) {
     256                showOptError("Incorrect value: "+ex.getMessage());
     257            }
     258        } else if ("bandwidth".equals(type)) {
     259            try {
     260                answer = answer.toLowerCase();
     261                int factor = 1;
     262                // first check to see if it ends with m, k, or g
     263                if (answer.endsWith("g"))
     264                    factor = 1024*1024*1024;
     265                if (answer.endsWith("m"))
     266                    factor = 1024*1024;
     267                if (answer.endsWith("k"))
     268                    factor = 1024;
     269                if (factor > 1)
     270                    answer = answer.substring(0, answer.length()-1);
     271                int val = factor * Integer.parseInt(answer);
     272                if (val == -1 || val >0 ) {
     273                    return new Integer(val);
     274                }
     275                showOptError("Value must be -1 or positive.");
     276            } catch (NumberFormatException ex) {
     277                showOptError("Invalid number [" + answer + "].  Valid numbers are of the form -1, 42, 68k, 7m, 9g");
     278            }
     279        } else {
     280            throw new RuntimeException ("cannot read installer option: " + type);
     281        }
     282        return null;
    290283    }
    291284
    292285    private String spliceParams(String s) {
    293         StringBuffer txt = new StringBuffer(s.length()+100);
    294         int ind;
    295         while((ind = s.indexOf("##")) != -1) {
    296             txt.append(s.substring(0,ind));
    297             String temp = s.substring(ind+2);
    298             ind = temp.indexOf("##");
    299             if (ind == -1) throw new RuntimeException
    300                                ("Incorrect info_spliced param");
    301             s=temp.substring(ind+2);
    302             Object value = _answers.get(temp.substring(0,ind));
    303             if (value == null) {
    304                 System.err.println("ERROR: Could not insert parameter "+temp.substring(0,ind));
    305                 System.exit(1);
    306             } else {
    307                 txt.append(value.toString());
    308             }
    309         }
    310         txt.append(s);
    311         return txt.toString();
     286        StringBuffer txt = new StringBuffer(s.length()+100);
     287        int ind;
     288        while((ind = s.indexOf("##")) != -1) {
     289            txt.append(s.substring(0,ind));
     290            String temp = s.substring(ind+2);
     291            ind = temp.indexOf("##");
     292            if (ind == -1) throw new RuntimeException("Incorrect info_spliced param");
     293            s=temp.substring(ind+2);
     294            Object value = _answers.get(temp.substring(0,ind));
     295            if (value == null) {
     296                System.err.println("ERROR: Could not insert parameter "+temp.substring(0,ind));
     297                System.exit(1);
     298            } else {
     299                txt.append(value.toString());
     300            }
     301        }
     302        txt.append(s);
     303        return txt.toString();
    312304    }
    313305   
    314306    private void detectOS() {
    315         String os = System.getProperty("os.name");
    316         if (os.toLowerCase().indexOf("win") != -1)
    317             _isWindows = true;
    318         else
    319             _isWindows = false;
    320         // yes, this treats pre-os-x macs as unix, and perhaps some
    321         // windows-esque OSes don't have "win" in their name, or some
    322         // unix-esque OS does.  fix when it occurs.
     307        String os = System.getProperty("os.name");
     308        if (os.toLowerCase().indexOf("win") != -1)
     309            _isWindows = true;
     310        else
     311            _isWindows = false;
     312        // yes, this treats pre-os-x macs as unix, and perhaps some
     313        // windows-esque OSes don't have "win" in their name, or some
     314        // unix-esque OS does.  fix when it occurs.
    323315    }
    324316
    325317    private void configureAll() {
    326         _installDir = (File) _answers.get("installDir");
    327         _externalAddress = _answers.get("externalAddress").toString();
    328         _externalAddressIsReachable = ((Boolean)_answers.get("externalAddressIsReachable")).booleanValue();
    329        
    330         _inTCP=((Integer)_answers.get("inTCP")).intValue();
    331         _phttpRegister = _answers.get("phttpRegister").toString();
    332         _phttpSend = _answers.get("phttpSend").toString();
    333         _i2cpPort = ((Integer)_answers.get("i2cpPort")).intValue();
    334         _inBPS = ((Integer)_answers.get("inBPS")).intValue();
    335         _outBPS = ((Integer)_answers.get("outBPS")).intValue();
     318        _installDir = (File) _answers.get("installDir");
     319        _externalAddress = _answers.get("externalAddress").toString();
     320        _externalAddressIsReachable = ((Boolean)_answers.get("externalAddressIsReachable")).booleanValue();
     321
     322        _inTCP=((Integer)_answers.get("inTCP")).intValue();
     323        _phttpRegister = _answers.get("phttpRegister").toString();
     324        _phttpSend = _answers.get("phttpSend").toString();
     325        _i2cpPort = ((Integer)_answers.get("i2cpPort")).intValue();
     326        _inBPS = ((Integer)_answers.get("inBPS")).intValue();
     327        _outBPS = ((Integer)_answers.get("outBPS")).intValue();
    336328    }
    337329
    338330    private void useTemplate(String templateName, File destFile) {
    339         try {
    340             BufferedWriter bw = new BufferedWriter(new FileWriter(destFile));
    341             BufferedReader br = new BufferedReader
    342                 (new InputStreamReader
    343                  (Install.class.getResourceAsStream(templateName)));
    344             String line;
    345             while ((line = br.readLine()) != null) {
    346                 if (!line.startsWith("####")) {
    347                     bw.write(spliceParams(line));
    348                     bw.newLine();
    349                 }
    350             }
    351             br.close();
    352             bw.close();
    353         } catch (IOException ioe) {
    354             ioe.printStackTrace();
    355             System.exit(0);
    356         }
     331        try {
     332            BufferedWriter bw = new BufferedWriter(new FileWriter(destFile));
     333            BufferedReader br = new BufferedReader(new InputStreamReader(Install.class.getResourceAsStream(templateName)));
     334            String line;
     335            while ((line = br.readLine()) != null) {
     336                if (!line.startsWith("####")) {
     337                    bw.write(spliceParams(line));
     338                    bw.newLine();
     339                }
     340            }
     341            br.close();
     342            bw.close();
     343        } catch (IOException ioe) {
     344            ioe.printStackTrace();
     345            System.exit(0);
     346        }
    357347    }
    358348       
     
    365355   
    366356    private void createSeedNodes() {
    367         showStatus("To connect to I2P, you will need a reference to at least one other I2P router");
    368         showStatus("Rather than bundle some (soon to be out of date) references with the software, ");
    369         showStatus("you can either run the included reseed script or get get your own references ");
    370         showStatus("from some out of band location.  ");
    371         showStatus("");
    372         showStatus("The reseed script simply connects to http://i2p.net/i2pdb/ and downloads all");
    373         showStatus("of the routerInfo-*.dat files and save them into " + (new File(_installDir, "i2pdb")).getAbsolutePath());
    374         showStatus("That ../i2pdb/ directory is simply a mirror of one router's netDb directory, so those files");
    375         showStatus("can come from anyone else too");
    376         showStatus("");
    377         showStatus("You can run the reseed script or download references (from your friends, etc) as often");
    378         showStatus("as you like without restarting your router.  If you find your netDb directory to have ");
    379         showStatus("only one file in it (thats your router info), you will need more peers to get anything done.");
    380         showStatus("");
    381         boolean reseed = confirmOption("Do you want to run the reseed script now? ", true);
    382         if (reseed) {
    383             reseed();
    384         } else {
    385             showStatus("Ok ok, not reseeding - but please reseed before running the router");
    386         }
     357        showStatus("To connect to I2P, you will need a reference to at least one other I2P router");
     358        showStatus("Rather than bundle some (soon to be out of date) references with the software, ");
     359        showStatus("you can either run the included reseed script or get get your own references ");
     360        showStatus("from some out of band location.  ");
     361        showStatus("");
     362        showStatus("The reseed script simply connects to http://i2p.net/i2pdb/ and downloads all");
     363        showStatus("of the routerInfo-*.dat files and save them into " + (new File(_installDir, "i2pdb")).getAbsolutePath());
     364        showStatus("That ../i2pdb/ directory is simply a mirror of one router's netDb directory, so those files");
     365        showStatus("can come from anyone else too");
     366        showStatus("");
     367        showStatus("You can run the reseed script or download references (from your friends, etc) as often");
     368        showStatus("as you like without restarting your router.  If you find your netDb directory to have ");
     369        showStatus("only one file in it (thats your router info), you will need more peers to get anything done.");
     370        showStatus("");
     371        boolean reseed = confirmOption("Do you want to run the reseed script now? ", true);
     372        if (reseed) {
     373            reseed();
     374        } else {
     375            showStatus("Ok ok, not reseeding - but please reseed before running the router");
     376        }
    387377    }
    388378   
    389379    private void reseed() {
    390         try {
    391             URL dir = new URL("http://i2p.net/i2pdb/");
    392             String content = new String(readURL(dir));
    393             Set urls = new HashSet();
    394             int cur = 0;
    395             while (true) {
    396                 int start = content.indexOf("href=\"routerInfo-", cur);
    397                 if (start < 0)
    398                     break;
    399                
    400                 int end = content.indexOf(".dat\">", start);
    401                 String name = content.substring(start+"href=\"routerInfo-".length(), end);
    402                 urls.add(name);
    403                 cur = end + 1;
    404             }
    405            
    406             for (Iterator iter = urls.iterator(); iter.hasNext(); ) {
    407                 fetchSeed((String)iter.next());
    408             }
    409         } catch (Throwable t) {
    410             t.printStackTrace();
    411             showStatus("Error reseeding - " + t.getMessage());
    412         }
     380        try {
     381            URL dir = new URL("http://i2p.net/i2pdb/");
     382            String content = new String(readURL(dir));
     383            Set urls = new HashSet();
     384            int cur = 0;
     385            while (true) {
     386                int start = content.indexOf("href=\"routerInfo-", cur);
     387                if (start < 0)
     388                    break;
     389
     390                int end = content.indexOf(".dat\">", start);
     391                String name = content.substring(start+"href=\"routerInfo-".length(), end);
     392                urls.add(name);
     393                cur = end + 1;
     394            }
     395
     396            for (Iterator iter = urls.iterator(); iter.hasNext(); ) {
     397                fetchSeed((String)iter.next());
     398            }
     399        } catch (Throwable t) {
     400            t.printStackTrace();
     401            showStatus("Error reseeding - " + t.getMessage());
     402        }
    413403    }
    414404   
    415405    private void fetchSeed(String peer) throws Exception {
    416         URL url = new URL("http://i2p.net/i2pdb/routerInfo-" + peer + ".dat");
    417         showStatus("Fetching seed from " + url.toExternalForm());
    418        
    419         byte data[] = readURL(url);
    420         writeSeed(peer, data);
     406        URL url = new URL("http://i2p.net/i2pdb/routerInfo-" + peer + ".dat");
     407        showStatus("Fetching seed from " + url.toExternalForm());
     408
     409        byte data[] = readURL(url);
     410        writeSeed(peer, data);
    421411    }
    422412   
    423413    private byte[] readURL(URL url) throws Exception {
    424         ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
    425         URLConnection con = url.openConnection();
    426         InputStream in = con.getInputStream();
    427         byte buf[] = new byte[1024];
    428         while (true) {
    429             int read = in.read(buf);
    430             if (read < 0)
    431                 break;
    432             baos.write(buf, 0, read);
    433         }
    434         in.close();
    435         return baos.toByteArray();
     414        ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
     415        URLConnection con = url.openConnection();
     416        InputStream in = con.getInputStream();
     417        byte buf[] = new byte[1024];
     418        while (true) {
     419            int read = in.read(buf);
     420            if (read < 0)
     421                break;
     422            baos.write(buf, 0, read);
     423        }
     424        in.close();
     425        return baos.toByteArray();
    436426    }
    437427   
    438428    private void writeSeed(String name, byte data[]) throws Exception {
    439         File netDbDir = new File(_installDir, "netDb");
    440         if (!netDbDir.exists())
    441             netDbDir.mkdirs();
    442         FileOutputStream fos = new FileOutputStream(new File(netDbDir, "routerInfo-" + name + ".dat"));
    443         fos.write(data);
    444         fos.close();
     429        File netDbDir = new File(_installDir, "netDb");
     430        if (!netDbDir.exists())
     431            netDbDir.mkdirs();
     432        FileOutputStream fos = new FileOutputStream(new File(netDbDir, "routerInfo-" + name + ".dat"));
     433        fos.write(data);
     434        fos.close();
    445435    }
    446436   
    447437    private void copyLibraries() {
    448         File libDir = new File(_installDir, "lib");
    449         if (!libDir.exists()) {
    450             boolean libCreated = libDir.mkdirs();
    451             if (!libCreated) {
    452                 showStatus("Error creating library directory " + libDir.getAbsolutePath());
    453                 return;
    454             }
    455         }
    456         showStatus("Installing the libraries into " + libDir.getAbsolutePath());
    457         int cnt = Integer.parseInt(_p.getProperty("libs.count"));
    458         try {
    459             for (int i=1;i<=cnt;i++) {
    460                 String ii = numberTo4Digits(i),
    461                     file = _p.getProperty("libs."+ii+".name");
    462                 boolean isLib = "true".equals(_p.getProperty("libs."+ii+".islib"));
    463                 InputStream is = Install.class.getResourceAsStream("/"+file);
    464                 if (is == null) throw new IOException("Resource /"+file+" not found");
    465                 copyFile(is, file, isLib?libDir:_installDir);
    466             }
    467         } catch (IOException ioe) {
    468             showStatus("Error extracting the libraries: " + ioe.getMessage());
    469         }
    470         File dbDir = new File(_installDir, "netDb");
    471         dbDir.mkdirs();
    472         File logDir = new File(_installDir, "logs");
    473         logDir.mkdirs();
     438        File libDir = new File(_installDir, "lib");
     439        if (!libDir.exists()) {
     440            boolean libCreated = libDir.mkdirs();
     441            if (!libCreated) {
     442                showStatus("Error creating library directory " + libDir.getAbsolutePath());
     443                return;
     444            }
     445        }
     446        showStatus("Installing the libraries into " + libDir.getAbsolutePath());
     447        int cnt = Integer.parseInt(_p.getProperty("libs.count"));
     448        try {
     449            for (int i=1;i<=cnt;i++) {
     450                String ii = numberTo4Digits(i),
     451                file = _p.getProperty("libs."+ii+".name");
     452                boolean isLib = "true".equals(_p.getProperty("libs."+ii+".islib"));
     453                InputStream is = Install.class.getResourceAsStream("/"+file);
     454                if (is == null) throw new IOException("Resource /"+file+" not found");
     455                copyFile(is, file, isLib?libDir:_installDir);
     456            }
     457        } catch (IOException ioe) {
     458            showStatus("Error extracting the libraries: " + ioe.getMessage());
     459        }
     460        File dbDir = new File(_installDir, "netDb");
     461        dbDir.mkdirs();
     462        File logDir = new File(_installDir, "logs");
     463        logDir.mkdirs();
    474464    }
    475465   
    476466    private void copyFile(InputStream in, String name, File destDir) {
    477         File destFile = new File(destDir, name);
    478         try {
    479             byte buf[] = new byte[16*1024];
    480             FileOutputStream out = new FileOutputStream(destFile);
    481             while (true) {
    482                 int read = in.read(buf);
    483                 if (read == -1)
    484                     break;
    485                 out.write(buf, 0, read);
    486             }
    487             in.close();
    488             out.close();
    489             showStatus("Installed file " + destFile.getName() + " in " + destFile.getParent());
    490         } catch (IOException ioe) {
    491             showStatus("Error saving " + name + " to " + destFile.getAbsolutePath() + ": " + ioe.getMessage());
    492         }
     467        File destFile = new File(destDir, name);
     468        try {
     469            byte buf[] = new byte[16*1024];
     470            FileOutputStream out = new FileOutputStream(destFile);
     471            while (true) {
     472                int read = in.read(buf);
     473                if (read == -1)
     474                    break;
     475                out.write(buf, 0, read);
     476            }
     477            in.close();
     478            out.close();
     479            showStatus("Installed file " + destFile.getName() + " in " + destFile.getParent());
     480        } catch (IOException ioe) {
     481            showStatus("Error saving " + name + " to " + destFile.getAbsolutePath()
     482                       + ": " + ioe.getMessage());
     483        }
    493484    }
    494485   
    495486    private void createLogConfigOptions(boolean verbose) {
    496         _answers.put("_logger_level", verbose?"DEBUG":"INFO");
    497         _answers.put("_logger_level2", verbose?"WARN":"ERROR");
    498         StringBuffer buf = new StringBuffer();
    499         if (!verbose) {
    500             // overrides for particularly chatty classes
    501             _answers.put("_logger_notverbose",
    502                          "logger.record.net.i2p.router.transport.Triv=ERROR"+NL+
    503                          "logger.record.net.i2p.router.transport.Band=ERROR"+NL+
    504                          "logger.record.net.i2p.crypto=ERROR" +NL+
    505                          "logger.record.net.i2p.crypto.DH=ERROR");
    506         } else {
    507             _answers.put("_logger_notverbose","");
    508         }
    509     }
    510 
    511     private void createScripts(String unixName, String windowsName, int listenPort, String targetDest, String logfilePattern, String windowTitle, String message, String scriptMessage) {
    512         createScripts(unixName, windowsName, "client "+listenPort+" "+targetDest, logfilePattern, windowTitle, message, scriptMessage);
    513     }
    514    
    515     private void createScripts(String unixName, String windowsName, String command, String logfilePattern, String windowTitle, String message, String scriptMessage) {
    516         _answers.put("_scripts_port", ""+_i2cpPort);
    517         _answers.put("_scripts_cmd", command);
    518         _answers.put("_scripts_logname", logfilePattern);
    519         _answers.put("_scripts_winttl", windowTitle);
    520         _answers.put("_scripts_message", scriptMessage);
    521         if (_isWindows) {
    522             File windowsFile = new File(_installDir, windowsName);
    523             useTemplate("startFoo.bat.template", windowsFile);
    524         } else {
    525             File unixFile = new File(_installDir, unixName);
    526             useTemplate("startFoo.sh.template", unixFile);
    527             chmodaplusx(unixFile);
    528         }
    529         showStatus(message);
    530     }
    531    
    532     private void createEepProxyScript() {
    533         StringBuffer buf = new StringBuffer(512);
    534         buf.append("Eepsite proxying scripts written to startEepProxy").append(NL);
    535         buf.append("IMPORTANT: While this installer packages the latest hosts.txt file available at the time ($Date: 2004/03/25 00:56:23 $), ").append(NL);
    536         buf.append("a more recently updated one may be available.  You can check for updates by fetching the file ").append(NL);
    537         buf.append("http://i2p.net/i2p/hosts.txt and saving it in ").append(_installDir.getAbsolutePath()).append(NL);
    538         buf.append("Or, of course, you can edit and update hosts.txt yourself to include mappings of your liking").append(NL);
    539        
    540         createScripts("startEepProxy.sh", "startEepProxy.bat", "httpclient 4444", "log-eepProxy-#.txt", "Eep Proxy", buf.toString(), "Starting EepProxy (when you see Ready, set your browsers HTTP proxy to localhost:4444)");
     487        _answers.put("_logger_level", verbose?"DEBUG":"INFO");
     488        _answers.put("_logger_level2", verbose?"WARN":"ERROR");
     489        StringBuffer buf = new StringBuffer();
     490        if (!verbose) {
     491            // overrides for particularly chatty classes
     492            _answers.put("_logger_notverbose", "logger.record.net.i2p.router.transport.Triv=ERROR"+NL+
     493                                               "logger.record.net.i2p.router.transport.Band=ERROR"+NL+
     494                                               "logger.record.net.i2p.crypto=ERROR" +NL+
     495                                               "logger.record.net.i2p.crypto.DH=ERROR");
     496        } else {
     497            _answers.put("_logger_notverbose","");
     498        }
     499    }
     500
     501    private void createScripts(String unixName, String windowsName, int listenPort,
     502                               String targetDest, String logfilePattern, String windowTitle,
     503                               String message, String scriptMessage) {
     504        createScripts(unixName, windowsName, "client "+listenPort+" "+targetDest,
     505                      logfilePattern, windowTitle, message, scriptMessage);
     506    }
     507   
     508    private void createScripts(String unixName, String windowsName, String command,
     509                               String logfilePattern, String windowTitle, String message,
     510                               String scriptMessage) {
     511        _answers.put("_scripts_port", ""+_i2cpPort);
     512        _answers.put("_scripts_cmd", command);
     513        _answers.put("_scripts_logname", logfilePattern);
     514        _answers.put("_scripts_winttl", windowTitle);
     515        _answers.put("_scripts_message", scriptMessage);
     516        if (_isWindows) {
     517            File windowsFile = new File(_installDir, windowsName);
     518            useTemplate("startFoo.bat.template", windowsFile);
     519        } else {
     520            File unixFile = new File(_installDir, unixName);
     521            useTemplate("startFoo.sh.template", unixFile);
     522            chmodaplusx(unixFile);
     523        }
     524        showStatus(message);
    541525    }
    542526       
    543527    private void createReseedScript() {
    544         if (_isWindows) {
    545             File windowsFile = new File(_installDir, "reseed.bat");
    546             useTemplate("reseed.bat.template", windowsFile);
    547         } else {
    548             File unixFile = new File(_installDir, "reseed.sh");
    549             useTemplate("reseed.sh.template", unixFile);
    550             chmodaplusx(unixFile);
    551         }
     528        if (_isWindows) {
     529            File windowsFile = new File(_installDir, "reseed.bat");
     530            useTemplate("reseed.bat.template", windowsFile);
     531        } else {
     532            File unixFile = new File(_installDir, "reseed.sh");
     533            useTemplate("reseed.sh.template", unixFile);
     534            chmodaplusx(unixFile);
     535        }
    552536    }
    553537
    554538    private void chmodaplusx(File f) {
    555         try {
    556             Runtime.getRuntime().exec("chmod a+x " + f.getAbsolutePath());
    557         } catch (IOException ioe) {
    558             showStatus("Error setting "+f.getName()+" as executable");
    559         }
     539        try {
     540            Runtime.getRuntime().exec("chmod a+x " + f.getAbsolutePath());
     541        } catch (IOException ioe) {
     542            showStatus("Error setting "+f.getName()+" as executable");
     543        }
    560544    }
    561545
    562546    private void createStartScript() {
    563         _answers.put("_scripts_installdir", _installDir.getAbsolutePath());
    564         if (_isWindows) {
    565             File windowsFile = new File(_installDir, "startRouter.bat");
    566             useTemplate("startRouter.bat.template", windowsFile);
    567         } else {
    568             File unixFile = new File(_installDir, "startRouter.sh");
    569             useTemplate("startRouter.sh.template", unixFile);
    570             File unixStopFile = new File(_installDir, "stopRouter.sh");
    571             useTemplate("stopRouter.sh.template", unixStopFile);
    572             chmodaplusx(unixFile);
    573             chmodaplusx(unixStopFile);
    574         }
     547        _answers.put("_scripts_installdir", _installDir.getAbsolutePath());
     548        if (_isWindows) {
     549            File windowsFile = new File(_installDir, "startRouter.bat");
     550            useTemplate("startRouter.bat.template", windowsFile);
     551        } else {
     552            File unixFile = new File(_installDir, "startRouter.sh");
     553            useTemplate("startRouter.sh.template", unixFile);
     554            File unixStopFile = new File(_installDir, "stopRouter.sh");
     555            useTemplate("stopRouter.sh.template", unixStopFile);
     556            chmodaplusx(unixFile);
     557            chmodaplusx(unixStopFile);
     558        }
    575559    }
    576560   
    577561    private void createConfigFile() {
    578         File configFile = new File(_installDir, "router.config");
    579         setConfigFileOptions();
    580         useTemplate("router.config.template", configFile);
    581         showStatus("Router configuration file written to " + configFile.getAbsolutePath());
    582         showStatus("");
     562        File configFile = new File(_installDir, "router.config");
     563        setConfigFileOptions();
     564        useTemplate("router.config.template", configFile);
     565        showStatus("Router configuration file written to " + configFile.getAbsolutePath());
     566        showStatus("");
    583567    }
    584568   
    585569    private final static String NL = System.getProperty("line.separator");
    586    
     570
    587571    private void setConfigFileOptions() {
    588         // set fields needed for the config template
    589         _answers.put("NOW", new Date().toString());
    590         if (_inTCP <= 0) {
    591             _answers.put("_router_hn", "#i2np.tcp.hostname=[externally reachable hostname or IP address goes here]");
    592             _answers.put("_router_port", "#i2np.tcp.port=[TCP/IP port number]");
    593             _answers.put("_router_lavalid","#i2np.tcp.listenAddressIsValid=[true/false for whether your external address is locally reachable]");
    594             _answers.put("_router_tcpdisable","#i2np.tcp.disable=[true/false for whether you want absolutely no tcp connections to be established (forcing phttp, etc)])");
    595         } else {
    596             _answers.put("_router_hn","i2np.tcp.hostname="+_externalAddress);
    597             _answers.put("_router_port","i2np.tcp.port="+_inTCP);
    598             _answers.put("_router_lavalid","i2np.tcp.listenAddressIsValid="+_externalAddressIsReachable);
    599             _answers.put("_router_tcpdisable","i2np.tcp.disable=false");
    600         }
    601         if ( (_phttpRegister == null) || (_phttpSend == null) ) {
    602             _answers.put("_router_phttpreg","#i2np.phttp.registerURL=[full URL to a PHTTP registration server, e.g. http://someHost:8080/phttprelay/phttpRegister]");
    603             _answers.put("_router_phttpsend","#i2np.phttp.sendURL=[full URL to a PHTTP relay server, e.g. http://someHost:8080/phttprelay/phttpSend]");
    604         } else {
    605             _answers.put("_router_phttpreg","i2np.phttp.registerURL="+_phttpRegister);
    606             _answers.put("_router_phttpsend","i2np.phttp.sendURL="+_phttpSend);
    607         }
    608         _answers.put("_router_i2cp_port",""+_i2cpPort);
    609         _answers.put("_router_inbps",""+(_inBPS*60));
    610         _answers.put("_router_outbps",""+(_outBPS*60));
     572        // set fields needed for the config template
     573        _answers.put("NOW", new Date().toString());
     574        if (_inTCP <= 0) {
     575            _answers.put("_router_hn", "#i2np.tcp.hostname=[externally reachable hostname or IP address goes here]");
     576            _answers.put("_router_port", "#i2np.tcp.port=[TCP/IP port number]");
     577            _answers.put("_router_lavalid","#i2np.tcp.listenAddressIsValid=[true/false for whether your external address is locally reachable]");
     578            _answers.put("_router_tcpdisable","#i2np.tcp.disable=[true/false for whether you want absolutely no tcp connections to be established (forcing phttp, etc)])");
     579        } else {
     580            _answers.put("_router_hn","i2np.tcp.hostname="+_externalAddress);
     581            _answers.put("_router_port","i2np.tcp.port="+_inTCP);
     582            _answers.put("_router_lavalid","i2np.tcp.listenAddressIsValid="+_externalAddressIsReachable);
     583            _answers.put("_router_tcpdisable","i2np.tcp.disable=false");
     584        }
     585        if ( (_phttpRegister == null) || (_phttpSend == null) ) {
     586            _answers.put("_router_phttpreg","#i2np.phttp.registerURL=[full URL to a PHTTP registration server, e.g. http://someHost:8080/phttprelay/phttpRegister]");
     587            _answers.put("_router_phttpsend","#i2np.phttp.sendURL=[full URL to a PHTTP relay server, e.g. http://someHost:8080/phttprelay/phttpSend]");
     588        } else {
     589            _answers.put("_router_phttpreg","i2np.phttp.registerURL="+_phttpRegister);
     590            _answers.put("_router_phttpsend","i2np.phttp.sendURL="+_phttpSend);
     591        }
     592        _answers.put("_router_i2cp_port",""+_i2cpPort);
     593        _answers.put("_router_inbps",""+(_inBPS*60));
     594        _answers.put("_router_outbps",""+(_outBPS*60));
    611595    }
    612596}
  • installer/java/src/install.config

    r180d3953 ra51e0c2  
    8989
    9090
    91 libs.count=9
     91libs.count=13
    9292libs.0001.name=i2p.jar
    9393    libs.0001.islib=true
     
    108108libs.0009.name=sam.jar
    109109    libs.0009.islib=true
     110libs.0010.name=heartbeat.jar
     111    libs.0010.islib=true
     112libs.0011.name=netmonitor.jar
     113    libs.0011.islib=true
     114libs.0012.name=harvester.config
     115    libs.0012.islib=false
     116libs.0013.name=heartbeat.config
     117    libs.0013.islib=false
  • installer/java/src/logger.config.template

    r180d3953 ra51e0c2  
    1616# '#' is replaced with the current log number for that day
    1717# If # is not specified, logs are not rotated
    18 logger.logFileName=log-#.txt
     18logger.logFileName=logs/log-#.txt
    1919
    2020# Log file size:
  • installer/java/src/router.config.template

    r180d3953 ra51e0c2  
    145145# that many 'jobs' that want to run ASAP at any given time, additional jobs may
    146146# be summarily dropped.  That will reduce your load and cause others to reduce
    147 # their dependence on you (further reducing your load).  The default value of 20
     147# their dependence on you (further reducing your load).  The default value of 40
    148148# should be sufficient, but may be increased if desired.  Less than 20 is not
    149149# recommended, as certain normal events can queue up 10 or so jobs at a time
    150150# (all of which only take a few milliseconds).  Leave this alone unless you know
    151151# what you're doing
    152 router.maxWaitingJobs=20
     152router.maxWaitingJobs=40
     153
     154#
     155# the remaining lines describe how you can get your router to fire up client
     156# applications it is up and running, all within the router's JVM.  Uncomment the
     157# ones you want (revising the numbers and ports accordingly)
     158
     159# Network monitor (harvests data from the network database and stores it under
     160# monitorData/, and with the netviewer GUI you can browse through its results)
     161clientApp.0.main=net.i2p.netmonitor.NetMonitor
     162clientApp.0.name=NetMonitor
     163clientApp.0.args=
     164
     165# SAM bridge (a simplified socket based protocol for using I2P - listens on port 7656.  see
     166# the specs at http://www.i2p.net/node/view/144 for more info)
     167clientApp.1.main=net.i2p.sam.SAMBridge
     168clientApp.1.name=SAMBridge
     169clientApp.1.args=0.0.0.0 7656 i2cp.tcp.host=localhost i2cp.tcp.port=##_router_i2cp_port##
     170
     171# EepProxy (HTTP proxy that lets you browse both eepsites and the normal web via squid.i2p)
     172clientApp.2.main=net.i2p.i2ptunnel.I2PTunnel
     173clientApp.2.name=EepProxy
     174clientApp.2.args=-nogui -e "config localhost ##_router_i2cp_port##" -e "httpclient 4444"
     175
     176# Heartbeat engine (uber-simple ping/pong system, configured in heartbeat.config.  By itself
     177# it just writes out stat data where its told to, but there's a seperate HeartbeatMonitor
     178# GUI to let you visualize things)
     179#clientApp.3.main=net.i2p.heartbeat.Heartbeat
     180#clientApp.3.name=Heartbeat
     181#clientApp.3.args=heartbeat.config
  • installer/java/src/startFoo.bat.template

    r180d3953 ra51e0c2  
    33cd ##_scripts_installdir##
    44echo ##_scripts_message##
    5 java -DloggerFilenameOverride=logs\##_scripts_logname## -Djava.library.path=. -Dcrypto.dh.precalc.min=0 -cp lib\mstreaming.jar;lib\i2p.jar -jar lib\i2ptunnel.jar -nocli -e "config localhost ##_scripts_port##" -e "##_scripts_cmd##"
     5javaw -DloggerFilenameOverride=logs\##_scripts_logname## -Djava.library.path=. -Dcrypto.dh.precalc.min=0 -cp lib\mstreaming.jar;lib\i2p.jar -jar lib\i2ptunnel.jar -nocli -e "config localhost ##_scripts_port##" -e "##_scripts_cmd##"
  • installer/java/src/startRouter.bat.template

    r180d3953 ra51e0c2  
    66REM replace java with javaw if you don't want a window to pop up
    77
    8 java -cp lib\i2p.jar;lib\router.jar -Djava.library.path=. -DloggerFilenameOverride=logs\log-router-#.txt -XX:NewSize=4M -XX:MaxNewSize=8M -XX:PermSize=8M -XX:MaxPermSize=32M net.i2p.router.Router
    9 pause
     8javaw -cp lib\i2p.jar;lib\router.jar;lib\mstreaming.jar;lib\heartbeat.jar;lib\i2ptunnel.jar;lib\netmonitor.jar;lib\sam.jar -Djava.library.path=. -DloggerFilenameOverride=logs\log-router-#.txt -XX:NewSize=4M -XX:MaxNewSize=8M -XX:PermSize=8M -XX:MaxPermSize=32M net.i2p.router.Router
     9echo Router started up, please see http://localhost:7655/
  • installer/java/src/startRouter.sh.template

    r180d3953 ra51e0c2  
    33export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
    44# the -XX args are workarounds for bugs in java 1.4.2's garbage collector
    5 nohup nice java -cp lib/i2p.jar:lib/router.jar -Djava.library.path=. -DloggerFilenameOverride=logs/log-router-#.txt -XX:NewSize=4M -XX:MaxNewSize=8M -XX:PermSize=8M -XX:MaxPermSize=32M net.i2p.router.Router --quiet > /dev/null &
     5nohup nice java -cp lib/i2p.jar:lib/router.jar:lib/mstreaming.jar:lib/heartbeat.jar:lib/i2ptunnel.jar:lib/netmonitor.jar:lib/sam.jar -Djava.library.path=. -DloggerFilenameOverride=logs/log-router-#.txt -XX:NewSize=4M -XX:MaxNewSize=8M -XX:PermSize=8M -XX:MaxPermSize=32M net.i2p.router.Router --quiet > /dev/null &
    66# Save the pid just in case we ever want to stop the router
    77echo $! > router.pid
Note: See TracChangeset for help on using the changeset viewer.