forked from I2P_Developers/i2p.i2p
Compare commits
34 Commits
0.6.1.30-2
...
i2p-0.6.1.
Author | SHA1 | Date | |
---|---|---|---|
cffcbe5f94 | |||
c46b06fb81 | |||
a7397879aa | |||
9b86da7ce5 | |||
c68977ca8c | |||
bc7bd628db | |||
bc7ab39131 | |||
100163e03b | |||
49c02f13b2 | |||
40f072e25e | |||
918b1acb8f | |||
bc16078e3f | |||
4a8dbd0634 | |||
38c0184f95 | |||
68829ddb99 | |||
19089bd6a7 | |||
69cc0afd1b | |||
d2f3a262db | |||
![]() |
c1703b872d | ||
![]() |
f7b0e8181b | ||
43f2695901 | |||
![]() |
ea0d4ffd7f | ||
![]() |
0ed29573a7 | ||
1365d3e3b9 | |||
40befb5a92 | |||
9c16eec361 | |||
093c69637d | |||
134ec7acea | |||
![]() |
0802a5ae40 | ||
![]() |
14ddfb360f | ||
![]() |
78ad831028 | ||
22f1684262 | |||
83f51b4a66 | |||
9c28de0704 |
@@ -169,7 +169,16 @@ public class AddressBook {
|
||||
(! host.startsWith("-")) &&
|
||||
(! host.endsWith("-.i2p")) &&
|
||||
host.indexOf("..") < 0 &&
|
||||
// IDN - basic check, not complete validation
|
||||
(host.indexOf("--") < 0 || host.startsWith("xn--") || host.indexOf(".xn--") > 0) &&
|
||||
host.replaceAll("[a-z0-9.-]", "").length() == 0 &&
|
||||
// some reserved names that may be used for local configuration someday
|
||||
(! host.equals("proxy.i2p")) &&
|
||||
(! host.equals("router.i2p")) &&
|
||||
(! host.equals("console.i2p")) &&
|
||||
(! host.endsWith(".proxy.i2p")) &&
|
||||
(! host.endsWith(".router.i2p")) &&
|
||||
(! host.endsWith(".console.i2p")) &&
|
||||
|
||||
dest.length() == 516 &&
|
||||
dest.endsWith("AAAA") &&
|
||||
|
@@ -98,7 +98,8 @@ public class Daemon {
|
||||
AddressBook router = new AddressBook(routerFile);
|
||||
|
||||
List defaultSubs = new LinkedList();
|
||||
defaultSubs.add("http://i2p/NF2RLVUxVulR3IqK0sGJR0dHQcGXAzwa6rEO4WAWYXOHw-DoZhKnlbf1nzHXwMEJoex5nFTyiNMqxJMWlY54cvU~UenZdkyQQeUSBZXyuSweflUXFqKN-y8xIoK2w9Ylq1k8IcrAFDsITyOzjUKoOPfVq34rKNDo7fYyis4kT5bAHy~2N1EVMs34pi2RFabATIOBk38Qhab57Umpa6yEoE~rbyR~suDRvD7gjBvBiIKFqhFueXsR2uSrPB-yzwAGofTXuklofK3DdKspciclTVzqbDjsk5UXfu2nTrC1agkhLyqlOfjhyqC~t1IXm-Vs2o7911k7KKLGjB4lmH508YJ7G9fLAUyjuB-wwwhejoWqvg7oWvqo4oIok8LG6ECR71C3dzCvIjY2QcrhoaazA9G4zcGMm6NKND-H4XY6tUWhpB~5GefB3YczOqMbHq4wi0O9MzBFrOJEOs3X4hwboKWANf7DT5PZKJZ5KorQPsYRSq0E3wSOsFCSsdVCKUGsAAAA/i2p/hosts.txt");
|
||||
// defaultSubs.add("http://i2p/NF2RLVUxVulR3IqK0sGJR0dHQcGXAzwa6rEO4WAWYXOHw-DoZhKnlbf1nzHXwMEJoex5nFTyiNMqxJMWlY54cvU~UenZdkyQQeUSBZXyuSweflUXFqKN-y8xIoK2w9Ylq1k8IcrAFDsITyOzjUKoOPfVq34rKNDo7fYyis4kT5bAHy~2N1EVMs34pi2RFabATIOBk38Qhab57Umpa6yEoE~rbyR~suDRvD7gjBvBiIKFqhFueXsR2uSrPB-yzwAGofTXuklofK3DdKspciclTVzqbDjsk5UXfu2nTrC1agkhLyqlOfjhyqC~t1IXm-Vs2o7911k7KKLGjB4lmH508YJ7G9fLAUyjuB-wwwhejoWqvg7oWvqo4oIok8LG6ECR71C3dzCvIjY2QcrhoaazA9G4zcGMm6NKND-H4XY6tUWhpB~5GefB3YczOqMbHq4wi0O9MzBFrOJEOs3X4hwboKWANf7DT5PZKJZ5KorQPsYRSq0E3wSOsFCSsdVCKUGsAAAA/i2p/hosts.txt");
|
||||
defaultSubs.add("http://www.i2p2.i2p/hosts.txt");
|
||||
|
||||
SubscriptionList subscriptions = new SubscriptionList(subscriptionFile,
|
||||
etagsFile, lastModifiedFile, defaultSubs, (String) settings
|
||||
|
@@ -595,9 +595,9 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
private static final String DEFAULT_TRACKERS[] = {
|
||||
"Postman", "http://YRgrgTLGnbTq2aZOZDJQ~o6Uk5k6TK-OZtx0St9pb0G-5EGYURZioxqYG8AQt~LgyyI~NCj6aYWpPO-150RcEvsfgXLR~CxkkZcVpgt6pns8SRc3Bi-QSAkXpJtloapRGcQfzTtwllokbdC-aMGpeDOjYLd8b5V9Im8wdCHYy7LRFxhEtGb~RL55DA8aYOgEXcTpr6RPPywbV~Qf3q5UK55el6Kex-6VCxreUnPEe4hmTAbqZNR7Fm0hpCiHKGoToRcygafpFqDw5frLXToYiqs9d4liyVB-BcOb0ihORbo0nS3CLmAwZGvdAP8BZ7cIYE3Z9IU9D1G8JCMxWarfKX1pix~6pIA-sp1gKlL1HhYhPMxwyxvuSqx34o3BqU7vdTYwWiLpGM~zU1~j9rHL7x60pVuYaXcFQDR4-QVy26b6Pt6BlAZoFmHhPcAuWfu-SFhjyZYsqzmEmHeYdAwa~HojSbofg0TMUgESRXMw6YThK1KXWeeJVeztGTz25sL8AAAA.i2p/announce.php=http://tracker.postman.i2p/"
|
||||
, "eBook", "http://E71FRom6PZNEqTN2Lr8P-sr23b7HJVC32KoGnVQjaX6zJiXwhJy2HsXob36Qmj81TYFZdewFZa9mSJ533UZgGyQkXo2ahctg82JKYZfDe5uDxAn1E9YPjxZCWJaFJh0S~UwSs~9AZ7UcauSJIoNtpxrtbmRNVFLqnkEDdLZi26TeucfOmiFmIWnVblLniWv3tG1boE9Abd-6j3FmYVrRucYuepAILYt6katmVNOk6sXmno1Eynrp~~MBuFq0Ko6~jsc2E2CRVYXDhGHEMdt-j6JUz5D7S2RIVzDRqQyAZLKJ7OdQDmI31przzmne1vOqqqLC~1xUumZVIvF~yOeJUGNjJ1Vx0J8i2BQIusn1pQJ6UCB~ZtZZLQtEb8EPVCfpeRi2ri1M5CyOuxN0V5ekmPHrYIBNevuTCRC26NP7ZS5VDgx1~NaC3A-CzJAE6f1QXi0wMI9aywNG5KGzOPifcsih8eyGyytvgLtrZtV7ykzYpPCS-rDfITncpn5hliPUAAAA.i2p/pub/bt/announce.php=http://de-ebook-archiv.i2p/pub/bt/"
|
||||
, "Gaytorrents", "http://uxPWHbK1OIj9HxquaXuhMiIvi21iK0~ZiG9d8G0840ZXIg0r6CbiV71xlsqmdnU6wm0T2LySriM0doW2gUigo-5BNkUquHwOjLROiETnB3ZR0Ml4IGa6QBPn1aAq2d9~g1r1nVjLE~pcFnXB~cNNS7kIhX1d6nLgYVZf0C2cZopEow2iWVUggGGnAA9mHjE86zLEnTvAyhbAMTqDQJhEuLa0ZYSORqzJDMkQt90MV4YMjX1ICY6RfUSFmxEqu0yWTrkHsTtRw48l~dz9wpIgc0a0T9C~eeWvmBFTqlJPtQZwntpNeH~jF7nlYzB58olgV2HHFYpVYD87DYNzTnmNWxCJ5AfDorm6AIUCV2qaE7tZtI1h6fbmGpGlPyW~Kw5GXrRfJwNvr6ajwAVi~bPVnrBwDZezHkfW4slOO8FACPR28EQvaTu9nwhAbqESxV2hCTq6vQSGjuxHeOuzBOEvRWkLKOHWTC09t2DbJ94FSqETmZopTB1ukEmaxRWbKSIaAAAA.i2p/announce.php=http://gaytorrents.i2p/"
|
||||
// , "Gaytorrents", "http://uxPWHbK1OIj9HxquaXuhMiIvi21iK0~ZiG9d8G0840ZXIg0r6CbiV71xlsqmdnU6wm0T2LySriM0doW2gUigo-5BNkUquHwOjLROiETnB3ZR0Ml4IGa6QBPn1aAq2d9~g1r1nVjLE~pcFnXB~cNNS7kIhX1d6nLgYVZf0C2cZopEow2iWVUggGGnAA9mHjE86zLEnTvAyhbAMTqDQJhEuLa0ZYSORqzJDMkQt90MV4YMjX1ICY6RfUSFmxEqu0yWTrkHsTtRw48l~dz9wpIgc0a0T9C~eeWvmBFTqlJPtQZwntpNeH~jF7nlYzB58olgV2HHFYpVYD87DYNzTnmNWxCJ5AfDorm6AIUCV2qaE7tZtI1h6fbmGpGlPyW~Kw5GXrRfJwNvr6ajwAVi~bPVnrBwDZezHkfW4slOO8FACPR28EQvaTu9nwhAbqESxV2hCTq6vQSGjuxHeOuzBOEvRWkLKOHWTC09t2DbJ94FSqETmZopTB1ukEmaxRWbKSIaAAAA.i2p/announce.php=http://gaytorrents.i2p/"
|
||||
, "NickyB", "http://9On6d3cZ27JjwYCtyJJbowe054d5tFnfMjv4PHsYs-EQn4Y4mk2zRixatvuAyXz2MmRfXG-NAUfhKr0KCxRNZbvHmlckYfT-WBzwwpiMAl0wDFY~Pl8cqXuhfikSG5WrqdPfDNNIBuuznS0dqaczf~OyVaoEOpvuP3qV6wKqbSSLpjOwwAaQPHjlRtNIW8-EtUZp-I0LT45HSoowp~6b7zYmpIyoATvIP~sT0g0MTrczWhbVTUZnEkZeLhOR0Duw1-IRXI2KHPbA24wLO9LdpKKUXed05RTz0QklW5ROgR6TYv7aXFufX8kC0-DaKvQ5JKG~h8lcoHvm1RCzNqVE-2aiZnO2xH08H-iCWoLNJE-Td2kT-Tsc~3QdQcnEUcL5BF-VT~QYRld2--9r0gfGl-yDrJZrlrihHGr5J7ImahelNn9PpkVp6eIyABRmJHf2iicrk3CtjeG1j9OgTSwaNmEpUpn4aN7Kx0zNLdH7z6uTgCGD9Kmh1MFYrsoNlTp4AAAA.i2p/bittorrent/announce.php=http://nickyb.i2p/bittorrent/"
|
||||
, "Orion", "http://gKik1lMlRmuroXVGTZ~7v4Vez3L3ZSpddrGZBrxVriosCQf7iHu6CIk8t15BKsj~P0JJpxrofeuxtm7SCUAJEr0AIYSYw8XOmp35UfcRPQWyb1LsxUkMT4WqxAT3s1ClIICWlBu5An~q-Mm0VFlrYLIPBWlUFnfPR7jZ9uP5ZMSzTKSMYUWao3ejiykr~mtEmyls6g-ZbgKZawa9II4zjOy-hdxHgP-eXMDseFsrym4Gpxvy~3Fv9TuiSqhpgm~UeTo5YBfxn6~TahKtE~~sdCiSydqmKBhxAQ7uT9lda7xt96SS09OYMsIWxLeQUWhns-C~FjJPp1D~IuTrUpAFcVEGVL-BRMmdWbfOJEcWPZ~CBCQSO~VkuN1ebvIOr9JBerFMZSxZtFl8JwcrjCIBxeKPBmfh~xYh16BJm1BBBmN1fp2DKmZ2jBNkAmnUbjQOqWvUcehrykWk5lZbE7bjJMDFH48v3SXwRuDBiHZmSbsTY6zhGY~GkMQHNGxPMMSIAAAA.i2p/bt/announce.php=http://orion.i2p/bt/"
|
||||
// , "Orion", "http://gKik1lMlRmuroXVGTZ~7v4Vez3L3ZSpddrGZBrxVriosCQf7iHu6CIk8t15BKsj~P0JJpxrofeuxtm7SCUAJEr0AIYSYw8XOmp35UfcRPQWyb1LsxUkMT4WqxAT3s1ClIICWlBu5An~q-Mm0VFlrYLIPBWlUFnfPR7jZ9uP5ZMSzTKSMYUWao3ejiykr~mtEmyls6g-ZbgKZawa9II4zjOy-hdxHgP-eXMDseFsrym4Gpxvy~3Fv9TuiSqhpgm~UeTo5YBfxn6~TahKtE~~sdCiSydqmKBhxAQ7uT9lda7xt96SS09OYMsIWxLeQUWhns-C~FjJPp1D~IuTrUpAFcVEGVL-BRMmdWbfOJEcWPZ~CBCQSO~VkuN1ebvIOr9JBerFMZSxZtFl8JwcrjCIBxeKPBmfh~xYh16BJm1BBBmN1fp2DKmZ2jBNkAmnUbjQOqWvUcehrykWk5lZbE7bjJMDFH48v3SXwRuDBiHZmSbsTY6zhGY~GkMQHNGxPMMSIAAAA.i2p/bt/announce.php=http://orion.i2p/bt/"
|
||||
// , "anonymity", "http://8EoJZIKrWgGuDrxA3nRJs1jsPfiGwmFWL91hBrf0HA7oKhEvAna4Ocx47VLUR9retVEYBAyWFK-eZTPcvhnz9XffBEiJQQ~kFSCqb1fV6IfPiV3HySqi9U5Caf6~hC46fRd~vYnxmaBLICT3N160cxBETqH3v2rdxdJpvYt8q4nMk9LUeVXq7zqCTFLLG5ig1uKgNzBGe58iNcsvTEYlnbYcE930ABmrzj8G1qQSgSwJ6wx3tUQNl1z~4wSOUMan~raZQD60lRK70GISjoX0-D0Po9WmPveN3ES3g72TIET3zc3WPdK2~lgmKGIs8GgNLES1cXTolvbPhdZK1gxddRMbJl6Y6IPFyQ9o4-6Rt3Lp-RMRWZ2TG7j2OMcNSiOmATUhKEFBDfv-~SODDyopGBmfeLw16F4NnYednvn4qP10dyMHcUASU6Zag4mfc2-WivrOqeWhD16fVAh8MoDpIIT~0r9XmwdaVFyLcjbXObabJczxCAW3fodQUnvuSkwzAAAA.i2p/anonymityTracker/announce.php=http://anonymityweb.i2p/anonymityTracker/"
|
||||
// , "The freak's tracker", "http://mHKva9x24E5Ygfey2llR1KyQHv5f8hhMpDMwJDg1U-hABpJ2NrQJd6azirdfaR0OKt4jDlmP2o4Qx0H598~AteyD~RJU~xcWYdcOE0dmJ2e9Y8-HY51ie0B1yD9FtIV72ZI-V3TzFDcs6nkdX9b81DwrAwwFzx0EfNvK1GLVWl59Ow85muoRTBA1q8SsZImxdyZ-TApTVlMYIQbdI4iQRwU9OmmtefrCe~ZOf4UBS9-KvNIqUL0XeBSqm0OU1jq-D10Ykg6KfqvuPnBYT1BYHFDQJXW5DdPKwcaQE4MtAdSGmj1epDoaEBUa9btQlFsM2l9Cyn1hzxqNWXELmx8dRlomQLlV4b586dRzW~fLlOPIGC13ntPXogvYvHVyEyptXkv890jC7DZNHyxZd5cyrKC36r9huKvhQAmNABT2Y~pOGwVrb~RpPwT0tBuPZ3lHYhBFYmD8y~AOhhNHKMLzea1rfwTvovBMByDdFps54gMN1mX4MbCGT4w70vIopS9yAAAA.i2p/bytemonsoon/announce.php"
|
||||
};
|
||||
|
@@ -647,7 +647,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
|
||||
|
||||
private static String jumpServers[] = {
|
||||
"http://i2host.i2p/cgi-bin/i2hostjump?",
|
||||
"http://orion.i2p/jump/",
|
||||
// "http://orion.i2p/jump/",
|
||||
"http://stats.i2p/cgi-bin/jump.cgi?a=",
|
||||
"http://trevorreznik.i2p/cgi-bin/jump.php?hostname="
|
||||
};
|
||||
|
@@ -164,7 +164,7 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
_log.info("inbound: "+outmsg);
|
||||
}
|
||||
outmsg=outmsg+"\n";
|
||||
outmsg=outmsg+"\r\n"; // rfc1459 sec. 2.3
|
||||
output.write(outmsg.getBytes("ISO-8859-1"));
|
||||
} else {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
@@ -238,7 +238,7 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
_log.info("outbound: "+outmsg);
|
||||
}
|
||||
outmsg=outmsg+"\n";
|
||||
outmsg=outmsg+"\r\n"; // rfc1459 sec. 2.3
|
||||
output.write(outmsg.getBytes("ISO-8859-1"));
|
||||
} else {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
|
@@ -186,8 +186,9 @@
|
||||
%><option value="0"<%=(tunnelDepth == 0 ? " selected=\"selected\"" : "") %>>0 hop tunnel (low anonymity, low latency)</option>
|
||||
<option value="1"<%=(tunnelDepth == 1 ? " selected=\"selected\"" : "") %>>1 hop tunnel (medium anonymity, medium latency)</option>
|
||||
<option value="2"<%=(tunnelDepth == 2 ? " selected=\"selected\"" : "") %>>2 hop tunnel (high anonymity, high latency)</option>
|
||||
<% if (tunnelDepth > 2) {
|
||||
%> <option value="<%=tunnelDepth%>" selected="selected"><%=tunnelDepth%> hop tunnel</option>
|
||||
<option value="3"<%=(tunnelDepth == 3 ? " selected=\"selected\"" : "") %>>3 hop tunnel (very high anonymity, poor performance)</option>
|
||||
<% if (tunnelDepth > 3) {
|
||||
%> <option value="<%=tunnelDepth%>" selected="selected"><%=tunnelDepth%> hop tunnel (very poor performance)</option>
|
||||
<% }
|
||||
%></select>
|
||||
</div>
|
||||
@@ -213,11 +214,11 @@
|
||||
</label>
|
||||
<select id="tunnelQuantity" name="tunnelQuantity" title="Number of Tunnels in Group" class="selectbox">
|
||||
<% int tunnelQuantity = editBean.getTunnelQuantity(curTunnel, 2);
|
||||
%><option value="1"<%=(tunnelQuantity == 1 ? " selected=\"selected\"" : "") %>>1 inbound tunnel (low bandwidth usage, less reliability)</option>
|
||||
<option value="2"<%=(tunnelQuantity == 2 ? " selected=\"selected\"" : "") %>>2 inbound tunnels (standard bandwidth usage, standard reliability)</option>
|
||||
<option value="3"<%=(tunnelQuantity == 3 ? " selected=\"selected\"" : "") %>>3 inbound tunnels (higher bandwidth usage, higher reliability)</option>
|
||||
%><option value="1"<%=(tunnelQuantity == 1 ? " selected=\"selected\"" : "") %>>1 inbound, 1 outbound tunnel (low bandwidth usage, less reliability)</option>
|
||||
<option value="2"<%=(tunnelQuantity == 2 ? " selected=\"selected\"" : "") %>>2 inbound, 2 outbound tunnels (standard bandwidth usage, standard reliability)</option>
|
||||
<option value="3"<%=(tunnelQuantity == 3 ? " selected=\"selected\"" : "") %>>3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)</option>
|
||||
<% if (tunnelQuantity > 3) {
|
||||
%> <option value="<%=tunnelQuantity%>" selected="selected"><%=tunnelQuantity%> inbound tunnels</option>
|
||||
%> <option value="<%=tunnelQuantity%>" selected="selected"><%=tunnelQuantity%> tunnels</option>
|
||||
<% }
|
||||
%></select>
|
||||
</div>
|
||||
@@ -228,9 +229,9 @@
|
||||
<select id="tunnelBackupQuantity" name="tunnelBackupQuantity" title="Number of Reserve Tunnels" class="selectbox">
|
||||
<% int tunnelBackupQuantity = editBean.getTunnelBackupQuantity(curTunnel, 0);
|
||||
%><option value="0"<%=(tunnelBackupQuantity == 0 ? " selected=\"selected\"" : "") %>>0 backup tunnels (0 redundancy, no added resource usage)</option>
|
||||
<option value="1"<%=(tunnelBackupQuantity == 1 ? " selected=\"selected\"" : "") %>>1 backup tunnel (low redundancy, low resource usage)</option>
|
||||
<option value="2"<%=(tunnelBackupQuantity == 2 ? " selected=\"selected\"" : "") %>>2 backup tunnels (medium redundancy, medium resource usage)</option>
|
||||
<option value="3"<%=(tunnelBackupQuantity == 3 ? " selected=\"selected\"" : "") %>>3 backup tunnels (high redundancy, high resource usage)</option>
|
||||
<option value="1"<%=(tunnelBackupQuantity == 1 ? " selected=\"selected\"" : "") %>>1 backup tunnel each direction (low redundancy, low resource usage)</option>
|
||||
<option value="2"<%=(tunnelBackupQuantity == 2 ? " selected=\"selected\"" : "") %>>2 backup tunnels each direction (medium redundancy, medium resource usage)</option>
|
||||
<option value="3"<%=(tunnelBackupQuantity == 3 ? " selected=\"selected\"" : "") %>>3 backup tunnels each direction (high redundancy, high resource usage)</option>
|
||||
<% if (tunnelBackupQuantity > 3) {
|
||||
%> <option value="<%=tunnelBackupQuantity%>" selected="selected"><%=tunnelBackupQuantity%> backup tunnels</option>
|
||||
<% }
|
||||
@@ -284,4 +285,4 @@
|
||||
<div id="pageFooter">
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
@@ -158,8 +158,9 @@
|
||||
%><option value="0"<%=(tunnelDepth == 0 ? " selected=\"selected\"" : "") %>>0 hop tunnel (low anonymity, low latency)</option>
|
||||
<option value="1"<%=(tunnelDepth == 1 ? " selected=\"selected\"" : "") %>>1 hop tunnel (medium anonymity, medium latency)</option>
|
||||
<option value="2"<%=(tunnelDepth == 2 ? " selected=\"selected\"" : "") %>>2 hop tunnel (high anonymity, high latency)</option>
|
||||
<% if (tunnelDepth > 2) {
|
||||
%> <option value="<%=tunnelDepth%>" selected="selected"><%=tunnelDepth%> hop tunnel</option>
|
||||
<option value="3"<%=(tunnelDepth == 3 ? " selected=\"selected\"" : "") %>>3 hop tunnel (very high anonymity, poor performance)</option>
|
||||
<% if (tunnelDepth > 3) {
|
||||
%> <option value="<%=tunnelDepth%>" selected="selected"><%=tunnelDepth%> hop tunnel (very poor performance)</option>
|
||||
<% }
|
||||
%></select>
|
||||
</div>
|
||||
@@ -185,11 +186,11 @@
|
||||
</label>
|
||||
<select id="tunnelQuantity" name="tunnelQuantity" title="Number of Tunnels in Group" class="selectbox">
|
||||
<% int tunnelQuantity = editBean.getTunnelQuantity(curTunnel, 2);
|
||||
%><option value="1"<%=(tunnelQuantity == 1 ? " selected=\"selected\"" : "") %>>1 inbound tunnel (low bandwidth usage, less reliability)</option>
|
||||
<option value="2"<%=(tunnelQuantity == 2 ? " selected=\"selected\"" : "") %>>2 inbound tunnels (standard bandwidth usage, standard reliability)</option>
|
||||
<option value="3"<%=(tunnelQuantity == 3 ? " selected=\"selected\"" : "") %>>3 inbound tunnels (higher bandwidth usage, higher reliability)</option>
|
||||
%><option value="1"<%=(tunnelQuantity == 1 ? " selected=\"selected\"" : "") %>>1 inbound, 1 outbound tunnel (low bandwidth usage, less reliability)</option>
|
||||
<option value="2"<%=(tunnelQuantity == 2 ? " selected=\"selected\"" : "") %>>2 inbound, 2 outbound tunnels (standard bandwidth usage, standard reliability)</option>
|
||||
<option value="3"<%=(tunnelQuantity == 3 ? " selected=\"selected\"" : "") %>>3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)</option>
|
||||
<% if (tunnelQuantity > 3) {
|
||||
%> <option value="<%=tunnelQuantity%>" selected="selected"><%=tunnelQuantity%> inbound tunnels</option>
|
||||
%> <option value="<%=tunnelQuantity%>" selected="selected"><%=tunnelQuantity%> tunnels</option>
|
||||
<% }
|
||||
%></select>
|
||||
</div>
|
||||
@@ -200,9 +201,9 @@
|
||||
<select id="tunnelBackupQuantity" name="tunnelBackupQuantity" title="Number of Reserve Tunnels" class="selectbox">
|
||||
<% int tunnelBackupQuantity = editBean.getTunnelBackupQuantity(curTunnel, 0);
|
||||
%><option value="0"<%=(tunnelBackupQuantity == 0 ? " selected=\"selected\"" : "") %>>0 backup tunnels (0 redundancy, no added resource usage)</option>
|
||||
<option value="1"<%=(tunnelBackupQuantity == 1 ? " selected=\"selected\"" : "") %>>1 backup tunnel (low redundancy, low resource usage)</option>
|
||||
<option value="2"<%=(tunnelBackupQuantity == 2 ? " selected=\"selected\"" : "") %>>2 backup tunnels (medium redundancy, medium resource usage)</option>
|
||||
<option value="3"<%=(tunnelBackupQuantity == 3 ? " selected=\"selected\"" : "") %>>3 backup tunnels (high redundancy, high resource usage)</option>
|
||||
<option value="1"<%=(tunnelBackupQuantity == 1 ? " selected=\"selected\"" : "") %>>1 backup tunnel each direction (low redundancy, low resource usage)</option>
|
||||
<option value="2"<%=(tunnelBackupQuantity == 2 ? " selected=\"selected\"" : "") %>>2 backup tunnels each direction (medium redundancy, medium resource usage)</option>
|
||||
<option value="3"<%=(tunnelBackupQuantity == 3 ? " selected=\"selected\"" : "") %>>3 backup tunnels each direction (high redundancy, high resource usage)</option>
|
||||
<% if (tunnelBackupQuantity > 3) {
|
||||
%> <option value="<%=tunnelBackupQuantity%>" selected="selected"><%=tunnelBackupQuantity%> backup tunnels</option>
|
||||
<% }
|
||||
@@ -256,4 +257,4 @@
|
||||
<div id="pageFooter">
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
@@ -164,7 +164,7 @@ public class ConfigNetHelper {
|
||||
if (rate != null)
|
||||
return rate;
|
||||
else
|
||||
return "16";
|
||||
return "32";
|
||||
}
|
||||
public String getOutboundRate() {
|
||||
String rate = _context.getProperty(PROP_OUTBOUND_KBPS);
|
||||
@@ -178,7 +178,7 @@ public class ConfigNetHelper {
|
||||
if (rate != null)
|
||||
return rate;
|
||||
else
|
||||
return "32";
|
||||
return "48";
|
||||
}
|
||||
public String getOutboundBurstRate() {
|
||||
String rate = _context.getProperty(PROP_OUTBOUND_BURST_KBPS);
|
||||
@@ -276,21 +276,21 @@ public class ConfigNetHelper {
|
||||
}
|
||||
|
||||
public int getShareBandwidth() {
|
||||
String irate = _context.getProperty(PROP_INBOUND_KBPS);
|
||||
String orate = _context.getProperty(PROP_OUTBOUND_KBPS);
|
||||
String pctStr = _context.getProperty(PROP_SHARE_PERCENTAGE);
|
||||
String irate = _context.getProperty(PROP_INBOUND_KBPS, "32");
|
||||
String orate = _context.getProperty(PROP_OUTBOUND_KBPS, "16");
|
||||
String pctStr = _context.getProperty(PROP_SHARE_PERCENTAGE, "" + DEFAULT_SHARE_PERCENTAGE);
|
||||
if ( (irate != null) && (orate != null) && (pctStr != null)) {
|
||||
try {
|
||||
int irateKBps = Integer.parseInt(irate);
|
||||
int orateKBps = Integer.parseInt(orate);
|
||||
if (irateKBps < 0 || orateKBps < 0)
|
||||
return 0;
|
||||
return 12;
|
||||
int pct = Integer.parseInt(pctStr);
|
||||
return (int) (((float) pct) * Math.min(irateKBps, orateKBps) / 100);
|
||||
} catch (NumberFormatException nfe) {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
return 12;
|
||||
}
|
||||
}
|
||||
|
@@ -22,7 +22,7 @@ public class ConfigUpdateHandler extends FormHandler {
|
||||
|
||||
public static final String PROP_NEWS_URL = "router.newsURL";
|
||||
// public static final String DEFAULT_NEWS_URL = "http://dev.i2p.net/cgi-bin/cvsweb.cgi/i2p/news.xml?rev=HEAD";
|
||||
public static final String DEFAULT_NEWS_URL = "http://dev.i2p/cgi-bin/cvsweb.cgi/i2p/news.xml?rev=HEAD";
|
||||
public static final String DEFAULT_NEWS_URL = "http://complication.i2p/news.xml";
|
||||
public static final String PROP_REFRESH_FREQUENCY = "router.newsRefreshFrequency";
|
||||
public static final String DEFAULT_REFRESH_FREQUENCY = 12*60*60*1000 + "";
|
||||
public static final String PROP_UPDATE_POLICY = "router.updatePolicy";
|
||||
|
@@ -70,19 +70,32 @@ public class GraphHelper {
|
||||
}
|
||||
|
||||
if (hasTx && hasRx && !_showEvents)
|
||||
_out.write("<a href=\"viewstat.jsp?stat=bw.combined"
|
||||
+ "&periodCount=" + (3 * _periodCount )
|
||||
+ "&width=" + (3 * _width)
|
||||
+ "&height=" + (3 * _height)
|
||||
+ "\" />");
|
||||
_out.write("<img width=\""
|
||||
+ (_width + 83) + "\" height=\"" + (_height + 92)
|
||||
+ "\" src=\"viewstat.jsp?stat=bw.combined"
|
||||
+ "&periodCount=" + _periodCount
|
||||
+ "&width=" + _width
|
||||
+ "&height=" + (_height - 14)
|
||||
+ "\" title=\"Combined bandwidth graph\" />\n");
|
||||
+ "\" title=\"Combined bandwidth graph\" /></a>\n");
|
||||
|
||||
for (Iterator iter = ordered.iterator(); iter.hasNext(); ) {
|
||||
SummaryListener lsnr = (SummaryListener)iter.next();
|
||||
Rate r = lsnr.getRate();
|
||||
String title = r.getRateStat().getName() + " for " + DataHelper.formatDuration(_periodCount * r.getPeriod());
|
||||
_out.write("<img width=\""
|
||||
_out.write("<a href=\"viewstat.jsp?stat="
|
||||
+ r.getRateStat().getName()
|
||||
+ "&showEvents=" + _showEvents
|
||||
+ "&period=" + r.getPeriod()
|
||||
+ "&periodCount=" + (3 * _periodCount)
|
||||
+ "&width=" + (3 * _width)
|
||||
+ "&height=" + (3 * _height)
|
||||
+ "\" />");
|
||||
_out.write("<img border=\"0\" width=\""
|
||||
+ (_width + 83) + "\" height=\"" + (_height + 92)
|
||||
+ "\" src=\"viewstat.jsp?stat="
|
||||
+ r.getRateStat().getName()
|
||||
@@ -91,7 +104,7 @@ public class GraphHelper {
|
||||
+ "&periodCount=" + _periodCount
|
||||
+ "&width=" + _width
|
||||
+ "&height=" + _height
|
||||
+ "\" title=\"" + title + "\" />\n");
|
||||
+ "\" title=\"" + title + "\" /></a>\n");
|
||||
}
|
||||
if (_refreshDelaySeconds > 0)
|
||||
_out.write("<meta http-equiv=\"refresh\" content=\"" + _refreshDelaySeconds + "\" />\n");
|
||||
|
@@ -221,8 +221,8 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
|
||||
}
|
||||
|
||||
public void transferFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt) {
|
||||
if (_log.shouldLog(Log.ERROR))
|
||||
_log.error("Failed to fetch the news from " + url);
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Failed to fetch the news from " + url);
|
||||
File temp = new File(TEMP_NEWS_FILE);
|
||||
temp.delete();
|
||||
}
|
||||
|
@@ -18,8 +18,8 @@ import net.i2p.util.I2PThread;
|
||||
import net.i2p.util.EepGet;
|
||||
|
||||
/**
|
||||
* Handler to deal with reseed requests. This reseed from the URL
|
||||
* http://dev.i2p.net/i2pdb2/ unless the I2P configuration property "i2p.reseedURL" is
|
||||
* Handler to deal with reseed requests. This will reseed from the URL
|
||||
* http://i2pdb.tin0.de/netDb/ unless the I2P configuration property "i2p.reseedURL" is
|
||||
* set. It always writes to ./netDb/, so don't mess with that.
|
||||
*
|
||||
*/
|
||||
@@ -31,7 +31,7 @@ public class ReseedHandler {
|
||||
// Reject unreasonably big files, because we download into a ByteArrayOutputStream.
|
||||
private static final long MAX_RESEED_RESPONSE_SIZE = 8 * 1024 * 1024;
|
||||
|
||||
private static final String DEFAULT_SEED_URL = "http://dev.i2p.net/i2pdb2/";
|
||||
private static final String DEFAULT_SEED_URL = "http://i2pdb.tin0.de/netDb/";
|
||||
|
||||
public ReseedHandler() {
|
||||
this(ContextHelper.getContext(null));
|
||||
|
@@ -162,7 +162,8 @@ public class UpdateHandler {
|
||||
_status = "<b>Update verified</b><br />Restarting<br />";
|
||||
restart();
|
||||
} else {
|
||||
_log.log(Log.CRIT, "Update was INVALID - have you changed your keys?");
|
||||
_log.log(Log.CRIT, "Update was INVALID - signing key is not trusted!");
|
||||
_status = "<b>Update signing key invalid</b><br />";
|
||||
System.setProperty("net.i2p.router.web.UpdateHandler.updateInProgress", "false");
|
||||
}
|
||||
}
|
||||
|
@@ -40,7 +40,8 @@
|
||||
<input name="outboundburstrate" type="text" size="2" value="<jsp:getProperty name="nethelper" property="outboundBurstRate" />" /> KBps for
|
||||
<jsp:getProperty name="nethelper" property="outboundBurstFactorBox" /><br />
|
||||
<i>KBps = kilobytes per second = 1024 bytes per second.<br />
|
||||
A negative rate means a default limit of 16KBytes per second.</i><br />
|
||||
A negative inbound rate means a default limit of 32KBytes per second.
|
||||
A negative outbound rate means a default limit of 16KBytes per second.</i><br />
|
||||
Bandwidth share percentage:
|
||||
<jsp:getProperty name="nethelper" property="sharePercentageBox" /><br />
|
||||
<% int share = nethelper.getShareBandwidth();
|
||||
|
@@ -34,7 +34,7 @@ Their XML parser requires the Sun XML APIs (JAXP) which is included in binary fo
|
||||
by their binary code license. This product includes software developed by the Apache Software Foundation
|
||||
(http://www.apache.org/). </p>
|
||||
|
||||
<p>Another application you can see on this webpage is <a href="http://www.i2p.net/i2ptunnel">I2PTunnel</a>
|
||||
<p>Another application you can see on this webpage is <a href="http://www.i2p2.i2p/i2ptunnel">I2PTunnel</a>
|
||||
(your <a href="i2ptunnel/" target="_blank">web interface</a>) - a GPL'ed application written by mihi that
|
||||
lets you tunnel normal TCP/IP traffic over I2P (such as the eepproxy and the irc proxy). There is also a
|
||||
<a href="http://susi.i2p/">susimail</a> web based mail client <a href="susimail/susimail">available</a> on
|
||||
@@ -42,14 +42,14 @@ the console, which is a GPL'ed application written by susi23. The addressbook a
|
||||
<a href="http://ragnarok.i2p/">Ragnarok</a> helps maintain your hosts.txt files (see ./addressbook/ for
|
||||
more information).</p>
|
||||
|
||||
<p>The router by default also includes human's public domain <a href="http://www.i2p.net/sam">SAM</a> bridge,
|
||||
<p>The router by default also includes human's public domain <a href="http://www.i2p2.i2p/sam">SAM</a> bridge,
|
||||
which other client applications (such the <a href="http://duck.i2p/i2p-bt/">bittorrent port</a>) can use.
|
||||
There is also an optimized library for doing large number calculations - jbigi - which in turn uses the
|
||||
LGPL licensed <a href="http://swox.com/gmp/">GMP</a> library, tuned for various PC architectures. Launchers for windows users are built with <a href="http://launch4j.sourceforge.net/">Launch4J</a>, and the installer is built with <a href="http://www.izforge.com/izpack/">IzPack</a>. For
|
||||
details on other applications available, as well as their licenses, please see the
|
||||
<a href="http://www.i2p.net/licenses">license policy</a>. Source for the I2P code and most bundled
|
||||
client applications can be found on our <a href="http://www.i2p.net/download">download page</a>, and is
|
||||
in <a href="http://www.i2p.net/cvs">cvs</a>.</p>
|
||||
<a href="http://www.i2p2.i2p/licenses">license policy</a>. Source for the I2P code and most bundled
|
||||
client applications can be found on our <a href="http://www.i2p2.i2p/download">download page</a>.
|
||||
.</p>
|
||||
|
||||
<h2>Release history</h2>
|
||||
<jsp:useBean class="net.i2p.router.web.ContentHelper" id="contenthelper" scope="request" />
|
||||
@@ -59,9 +59,8 @@ in <a href="http://www.i2p.net/cvs">cvs</a>.</p>
|
||||
<jsp:getProperty name="contenthelper" property="textContent" />
|
||||
|
||||
<p>
|
||||
A more complete list of updates can be found
|
||||
<a href="http://dev.i2p.net/cgi-bin/cvsweb.cgi/i2p/history.txt?rev=HEAD">online</a>
|
||||
(<a href="http://dev.i2p/cgi-bin/cvsweb.cgi/i2p/history.txt?rev=HEAD">anonymously</a>)
|
||||
A more complete list of changes can be found
|
||||
in the history.txt file in your i2p directory.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
@@ -59,7 +59,7 @@ eepsites announced on other sites if you subscribe to those sites' addressbooks.
|
||||
</p>
|
||||
<p>
|
||||
(To speak the truth: In its default configuration the addressbook does not poll
|
||||
additional sites, but dev.i2p only. Subscribing to additional sites is an easy task,
|
||||
additional sites, but www.i2p2.i2p only. Subscribing to additional sites is an easy task,
|
||||
just add them to your <a href="subscriptions.jsp">subscriptions</a> file.)
|
||||
</p>
|
||||
<p>If you have questions about naming in i2p, there is an excellent <a href="http://forum.i2p.net/viewtopic.php?t=134">introduction</a>
|
||||
|
@@ -68,7 +68,7 @@ subscriptions *
|
||||
<p class="help">
|
||||
The subscription file contains a list of (i2p) URLs. The addressbook application
|
||||
regularly (once per hour) checks this list for new eepsites. Those URLs simply contain the published hosts.txt
|
||||
file of other people. The default subscription is the hosts.txt from dev.i2p, which is updated infrequently.
|
||||
file of other people. The default subscription is the hosts.txt from www.i2p2.i2p, which is updated infrequently.
|
||||
So it is a good idea to add additional subscriptions to sites that have the latest addresses.
|
||||
</p>
|
||||
</div>
|
||||
|
@@ -138,6 +138,9 @@
|
||||
<pathelement location="apps/i2ptunnel/java/src" />
|
||||
<pathelement location="apps/systray/java/src" />
|
||||
<pathelement location="apps/routerconsole/java/src" />
|
||||
<pathelement location="apps/addressbook/java/src" />
|
||||
<pathelement location="apps/i2psnark/java/src" />
|
||||
<pathelement location="apps/sam/java/src" />
|
||||
</sourcepath>
|
||||
<classpath>
|
||||
<pathelement location="apps/jetty/jettylib/org.mortbay.jetty.jar" />
|
||||
|
55
checklist.txt
Normal file
55
checklist.txt
Normal file
@@ -0,0 +1,55 @@
|
||||
Release checklist
|
||||
-----------------
|
||||
|
||||
Sync with mtn.i2p2.i2p
|
||||
Start with a clean checkout mtn -d i2p.mtn co --branch=i2p.i2p
|
||||
Double-check trust list
|
||||
|
||||
Change revision in:
|
||||
history.txt
|
||||
initialNews.xml
|
||||
installer/install.xml
|
||||
news.xml
|
||||
router/java/src/net/i2p/router/RouterVersion.java
|
||||
core/java/src/net/i2p/CoreVersion.java
|
||||
|
||||
Build and tag:
|
||||
ant dist
|
||||
mtn ci
|
||||
mtn tag i2p-0.6.1.xx h:
|
||||
Sync with mtn.i2p2.i2p
|
||||
|
||||
Create a signed update file with:
|
||||
export I2P=~/i2p
|
||||
java -cp $I2P/lib/i2p.jar net.i2p.crypto.TrustedUpdate sign i2pupdate.zip i2pupdate.sud /path/to/private.key 0.6.1.xx
|
||||
|
||||
Verify signed update file with:
|
||||
java -cp $I2P/lib/i2p.jar net.i2p.crypto.TrustedUpdate showversion i2pupdate.sud
|
||||
java -cp $I2P/lib/i2p.jar net.i2p.crypto.TrustedUpdate verifysig i2pupdate.sud
|
||||
|
||||
Make the source tarball:
|
||||
Start with a clean checkout mtn -d i2p.mtn co --branch=i2p.i2p i2p-0.6.1.xx
|
||||
Double-check trust list
|
||||
tar cjf i2psource-0.6.1.xx.tar.bz2 --exclude i2p-0.6.1.xx/_MTN i2p-0.6.1.xx
|
||||
mv i2p-0.6.1.xx.tar.bz2 i2p.i2p
|
||||
|
||||
More signatures:
|
||||
sha1sum i2pinstall.exe i2p.tar.bz2 i2psource-0.6.1.xx.tar.bz2 i2pupdate.zip
|
||||
gpg -b i2pinstall.exe
|
||||
gpg -b i2p.tar.bz2
|
||||
gpg -b i2p-0.6.1.xx.tar.bz2
|
||||
gpg -b i2pupdate.zip
|
||||
|
||||
Distribute files to download locations and to www.i2p2.i2p
|
||||
|
||||
Website files to change:
|
||||
Sync with mtn.i2p2.i2p
|
||||
announcements.html
|
||||
download.html (change SHA1s)
|
||||
index.html
|
||||
hosts.txt (copy from mtn)
|
||||
Sync with mtn.i2p2.i2p
|
||||
|
||||
Copy news.xml to subscription location
|
||||
|
||||
Announce on #i2p, forum.i2p, Syndie
|
@@ -1,9 +1,27 @@
|
||||
Prior to building the jbigi library, you will need to fetch the GMP source
|
||||
from http://www.swox.com/gmp/, saving it to jbigi/gmp-4.1.4.tar.bz2 (it will
|
||||
from http://www.swox.com/gmp/, saving it to jbigi/gmp-4.2.2.tar.bz2 (it will
|
||||
be unpacked and built as necessary).
|
||||
|
||||
Version 4.2.2 has not been extensively tested with I2P. If you would like
|
||||
to use a well-tested version, get gmp-4.1.4.tar.bz2, and edit jbigi/build.sh
|
||||
to change the version number.
|
||||
|
||||
To build the native jbigi and jcpuid libraries for the current host CPU,
|
||||
simply run sh build.sh and the results will be packaged up into jbigi.jar
|
||||
and the libjbigi.so library. To test, copy jbigi/lib/libjbigi.so
|
||||
and jcpuid/lib/freenet/support/CPUInformation/libjcpuid-*.so
|
||||
to your i2p/ directory. You can also copy jbigi.jar to the i2p/lib/ directory;
|
||||
it will be used only if the router fails to load the native library.
|
||||
|
||||
To build the native jbigi libraries for all supported CPUs (on the current OS),
|
||||
go into jbigi/ and run build-all.sh (the results will be under jbigi/lib/)
|
||||
|
||||
After copying the files to the i2p/ directory,
|
||||
to run a speed test comparing the native library to the java library,
|
||||
run the shell script below.
|
||||
|
||||
-----------------
|
||||
|
||||
#!/bin/sh
|
||||
export I2P=~/i2p
|
||||
java -cp $I2P/lib/i2p.jar:$I2P/lib/jbigi.jar net.i2p.util.NativeBigInteger
|
||||
|
0
core/c/build.sh
Normal file → Executable file
0
core/c/build.sh
Normal file → Executable file
7
core/c/jbigi/build-all.sh
Normal file → Executable file
7
core/c/jbigi/build-all.sh
Normal file → Executable file
@@ -12,8 +12,9 @@ FreeBSD*)
|
||||
exit;;
|
||||
esac
|
||||
|
||||
echo "Extracting GMP..."
|
||||
tar -xjf gmp-4.1.4.tar.bz2
|
||||
VER=4.2.2
|
||||
echo "Extracting GMP Version $VER ..."
|
||||
tar -xjf gmp-$VER.tar.bz2
|
||||
echo "Building..."
|
||||
mkdir bin
|
||||
mkdir lib
|
||||
@@ -24,7 +25,7 @@ for x in none pentium pentiummmx pentium2 pentium3 pentium4 k6 k62 k63 athlon
|
||||
do
|
||||
mkdir bin/$x
|
||||
cd bin/$x
|
||||
../../gmp-4.1.4/configure --build=$x
|
||||
../../gmp-$VER/configure --build=$x
|
||||
make
|
||||
sh ../../build_jbigi.sh static
|
||||
case `uname -sr` in
|
||||
|
9
core/c/jbigi/build.sh
Normal file → Executable file
9
core/c/jbigi/build.sh
Normal file → Executable file
@@ -1,9 +1,10 @@
|
||||
#/bin/sh
|
||||
|
||||
echo "Building the jbigi library with GMP"
|
||||
VER=4.2.2
|
||||
echo "Building the jbigi library with GMP Version $VER"
|
||||
|
||||
echo "Extracting GMP..."
|
||||
tar -xjf gmp-4.1.4.tar.bz2
|
||||
tar -xjf gmp-$VER.tar.bz2
|
||||
echo "Building..."
|
||||
mkdir -p lib/
|
||||
mkdir -p bin/local
|
||||
@@ -11,9 +12,9 @@ cd bin/local
|
||||
case `uname -sr` in
|
||||
Darwin*)
|
||||
# --with-pic is required for static linking
|
||||
../../gmp-4.1.4/configure --with-pic;;
|
||||
../../gmp-$VER/configure --with-pic;;
|
||||
*)
|
||||
../../gmp-4.1.4/configure;;
|
||||
../../gmp-$VER/configure;;
|
||||
esac
|
||||
make
|
||||
sh ../../build_jbigi.sh static
|
||||
|
0
core/c/jbigi/build_jbigi.sh
Normal file → Executable file
0
core/c/jbigi/build_jbigi.sh
Normal file → Executable file
0
core/c/jcpuid/build.sh
Normal file → Executable file
0
core/c/jcpuid/build.sh
Normal file → Executable file
@@ -15,7 +15,7 @@ package net.i2p;
|
||||
*/
|
||||
public class CoreVersion {
|
||||
public final static String ID = "$Revision: 1.72 $ $Date: 2007-08-23 19:33:31 $";
|
||||
public final static String VERSION = "0.6.1.30";
|
||||
public final static String VERSION = "0.6.1.32";
|
||||
|
||||
public static void main(String args[]) {
|
||||
System.out.println("I2P Core version: " + VERSION);
|
||||
|
@@ -79,6 +79,26 @@ lFm5Fqx/iW5+k0QaQZ3W9mY=
|
||||
=V3i7
|
||||
-----END PGP SIGNATURE-----
|
||||
*/
|
||||
/*
|
||||
-----BEGIN PGP SIGNED MESSAGE-----
|
||||
Hash: SHA1
|
||||
|
||||
*/
|
||||
/* Complication's key */
|
||||
private static final String DEFAULT_TRUSTED_KEY3 =
|
||||
"JHFA0yXUgKtmhajXFZH9Nk62OPRHbvvQHTi8EANV-D~3tjLjaz9p9cs6F" +
|
||||
"s8W3FSLfUwsQeFg7dfVSQQZga~1jMjboo94vIcm3j6XbW4mbcorVQ74uP" +
|
||||
"jd8EA1AQhJ6bBTxDAFk~6fVDOdhHT0Wo5CcUn7v8bAYY3x3UWiL8Remx0=";
|
||||
/*
|
||||
-----BEGIN PGP SIGNATURE-----
|
||||
Version: GnuPG v1.4.6 (GNU/Linux)
|
||||
|
||||
iD8DBQFHphOV+h38a3n8zjMRAll+AJ9KA6WiDJcTN4qfrslSemUMr+FBrwCeM8pF
|
||||
D8usM7Dxp5yrDrCYZ5AIijc=
|
||||
=SrXI
|
||||
-----END PGP SIGNATURE-----
|
||||
*/
|
||||
|
||||
private static final String VALID_VERSION_CHARS = "0123456789.";
|
||||
private static final int VERSION_BYTES = 16;
|
||||
private static final int HEADER_BYTES = Signature.SIGNATURE_BYTES + VERSION_BYTES;
|
||||
@@ -119,6 +139,7 @@ lFm5Fqx/iW5+k0QaQZ3W9mY=
|
||||
} else {
|
||||
_trustedKeys.add(DEFAULT_TRUSTED_KEY);
|
||||
_trustedKeys.add(DEFAULT_TRUSTED_KEY2);
|
||||
_trustedKeys.add(DEFAULT_TRUSTED_KEY3);
|
||||
}
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("TrustedUpdate created, trusting " + _trustedKeys.size() + " keys.");
|
||||
|
@@ -207,11 +207,11 @@ public class SimpleTimer {
|
||||
_occurredEventCount += eventsToFire.size();
|
||||
} else {
|
||||
_occurredTime = now;
|
||||
if (_occurredEventCount > 1000) {
|
||||
if (_occurredEventCount > 2500) {
|
||||
StringBuffer buf = new StringBuffer(128);
|
||||
buf.append("Too many simpleTimerJobs (").append(_occurredEventCount);
|
||||
buf.append(") in a second!");
|
||||
_log.log(Log.CRIT, buf.toString());
|
||||
_log.log(Log.WARN, buf.toString());
|
||||
}
|
||||
_occurredEventCount = 0;
|
||||
}
|
||||
|
115
history.txt
115
history.txt
@@ -1,4 +1,116 @@
|
||||
$Id: history.txt,v 1.613 2008-01-08 21:15:45 zzz Exp $
|
||||
* 2008-03-09 0.6.1.32 released
|
||||
|
||||
2008-03-07 zzz
|
||||
* Update news and version numbers
|
||||
|
||||
2008-03-01 zzz
|
||||
* Fix netdb.knownLeaseSets count reported by floodfill routers
|
||||
(was broken by -3)
|
||||
|
||||
2008-02-27 zzz
|
||||
* i2ptunnel: Add 3-hop option to edit.jsp to match configtunnels.jsp
|
||||
* i2psnark: Remove orion and gaytorrents from default tracker list
|
||||
* Remove orion from jump list and from eepsite_index.html
|
||||
* Jbigi: Change jbigi version to 4.2.2 in build scripts - tested by amiga
|
||||
* Capitalize OutboundMessageDistributor job name
|
||||
* TunnelPool: Add a warning if all tunnels are backlogged
|
||||
|
||||
2008-02-26 zzz
|
||||
* Reintroduce NTCP backlog pushback, with switch back to
|
||||
previous tunnel when no longer backlogged
|
||||
* Catch an nio exception in an NTCP logging statement if loglevel is WARN
|
||||
* IRC Proxy: terminate all messages with \r\n (thanks TrivialPursuit!)
|
||||
|
||||
2008-02-21 zzz
|
||||
* Raise inbound default bandwidth to 32KBps
|
||||
* Fix config.jsp that showed 0KBps share bandwidth by default
|
||||
|
||||
2008-02-19 zzz
|
||||
* Addressbook: Disallow '--' in host names except in IDN,
|
||||
add some reserved host names
|
||||
* I2PTunnel: Clarify edit form
|
||||
* NetDb: Remove many stats from netDb, effective as of .32
|
||||
* profiles.jsp: Display capabilities
|
||||
* Tunnels: Enforce max tunnel length of 8, catch an index error
|
||||
http://forum.i2p/viewtopic.php?t=2561
|
||||
|
||||
2008-02-16 zzz
|
||||
* Fix race in TunnelDispatcher which caused
|
||||
participating tunnel count to seesaw -
|
||||
should increase network capacity
|
||||
* Leave participating tunnels in 10s batches for efficiency
|
||||
* Update participating tunnel ratestat when leaving a tunnel too,
|
||||
to generate a smoother graph
|
||||
* Fix tunnel.participatingMessageCount stat to include all
|
||||
participating tunnels, not just outbound endpoints
|
||||
* Simplify Expire Tunnel job name
|
||||
|
||||
2008-02-13 zzz
|
||||
* PersistentDataStore: Write out 300 records every 10 min
|
||||
rather than 1 every 10 sec;
|
||||
Don't store leasesets to disk or read them in
|
||||
* Combine rates for pools with the same length setting
|
||||
in the new tunnel build algorithm
|
||||
* Clarify a log message in the UpdateHandler
|
||||
|
||||
2008-02-13 zzz
|
||||
* Make graphs clickable to get larger graphs
|
||||
* Change SimpleTimer CRIT to a WARN, increase threshold
|
||||
* Checklist update
|
||||
|
||||
2008-02-11 welterde
|
||||
* Fix an NPE in UDP http://forum.i2p/viewtopic.php?t=2545
|
||||
|
||||
2008-02-10 zzz
|
||||
* Add new tunnel build algorithm (preliminary)
|
||||
* Change NTCP backlogged message from error to warning
|
||||
* Checklist updates
|
||||
|
||||
* 2008-02-10 0.6.1.31 released
|
||||
|
||||
2008-02-10 Complication
|
||||
* Update news and version numbers
|
||||
|
||||
2008-02-06 zzz
|
||||
* build.xml: Add some apps to javadoc
|
||||
* checklist.txt: Add some things
|
||||
* news.xml: make links relative
|
||||
* runplain.sh: Add some comments
|
||||
* wrapper.config: Add some comments
|
||||
|
||||
2008-02-05 Complication
|
||||
* Change the dates too (sorry for such forgetfulness!)
|
||||
|
||||
2008-02-04 Complication
|
||||
* Also use the new key for checking, and add it into news.xml
|
||||
|
||||
2008-02-04 Complication
|
||||
* Added my release signing key into TrustedUpdate.java
|
||||
|
||||
2008-01-31 zzz
|
||||
* NewsFetcher: Change fetch failed from error to warning
|
||||
* installer: Fix URL and "email"
|
||||
* checklist.txt: New release checklist
|
||||
|
||||
2008-01-29 zzz
|
||||
* Addressbook: Change default subscription
|
||||
* ConfigUpdateHandler: Change default news URL
|
||||
* initialNews.xml: Update version to .31
|
||||
* news.xml: More updates
|
||||
* hosts.txt: Add i2p-projekt.i2p
|
||||
* readme.html: More URL updates
|
||||
* SusiDNS: Change references to default subscription
|
||||
|
||||
2008-01-28 zzz
|
||||
* news.xml: Updates, still preliminary
|
||||
* ReseedHandler: Change default URL
|
||||
* i2ptunnel.config: Change default outproxies
|
||||
* readme.html: Change *.i2p.net URLs
|
||||
* help.jsp: Change *.i2p.net URLs
|
||||
* eepsite_index.html: Change stats.i2p addressbook subscription URL
|
||||
* hosts.txt: Add krabs.i2p, true.i2p, www.i2p2.i2p
|
||||
|
||||
* 2008-01-28 0.6.1.30-20 converted from CVS to MTN
|
||||
|
||||
2008-01-08 zzz
|
||||
* addressbook: Limit size of subscribed hosts.txt,
|
||||
@@ -12,7 +124,6 @@ $Id: history.txt,v 1.613 2008-01-08 21:15:45 zzz Exp $
|
||||
* Error pages: add icon and logo,
|
||||
clarify 'destination not found' and 'proxy not found' pages
|
||||
|
||||
|
||||
2008-01-07 zzz
|
||||
* profiles.jsp formatting cleanup
|
||||
* NTCP: Reduce max idle time from 60m to 20m
|
||||
|
216
hosts.txt
216
hosts.txt
@@ -1,214 +1,3 @@
|
||||
; TC's hosts.txt guaranteed freshness
|
||||
; $Id: hosts.txt,v 1.172 2007-11-06 06:26:01 jrandom Exp $
|
||||
; changelog:
|
||||
; (1.193) added i2host.i2p (was i2phost.i2p)
|
||||
; (1.192) added trevorreznik.i2p
|
||||
; (1.191) added trac.i2p
|
||||
; (1.190) added archive.syndie.i2p
|
||||
; (1.189) added mtn.i2p
|
||||
; (1.188) added downloads.legion.i2p, politguy.i2p, ninja.i2p
|
||||
; (1.187) added hidden.i2p, bk1k.i2p, antipiracyagency.i2p
|
||||
; (1.186) added decadence.i2p, freedomarchives.i2p, closedshop.i2p
|
||||
; (1.185) added TheBreton.i2p adab.i2p awup.i2p china.i2p davidkra.i2p
|
||||
; comwiz.i2p dust.i2p eepsites.i2p jmg.i2p kuroneko.i2p
|
||||
; mywastedlife.i2p site.games.i2p squid2.i2p striker.i2p
|
||||
; tracker.awup.i2p zzz.i2p
|
||||
; (1.184) added sion.i2p, betaguru.i2p jnymo.i2p always.i2p gonzo2000.i2p
|
||||
; flipkick.i2p mindisl0st.i2p torapa.i2p wahoo.i2p badfish.i2p
|
||||
; slack.i2p bobcat.i2p pycache.awup.i2p lp.i2p amazone.i2p
|
||||
; inproxy.tino.i2p kohaar.i2p
|
||||
; (1.183) added ttc.i2p
|
||||
; (1.182) added tracker-fr.i2p
|
||||
; (1.181) added syncline.i2p, cerebrum.i2p, news.underscore.i2p,
|
||||
; onionforum.i2p, frostmirror.i2p, ptm.i2p, gloinsblog.i2p
|
||||
; underscore.i2p, mac7.i2p, wiht.i2p, jazzy.i2p, trwcln.i2p
|
||||
; (1.180) added tino.i2p and fproxy.tino.i2p
|
||||
; (1.179) added glog.i2p
|
||||
; (1.178) added syndie.i2p and syndiemedia.i2p
|
||||
; (1.177) added irc.freshcoffee.i2p
|
||||
; (1.176) added surrender.adab.i2p
|
||||
; (1.175) added terror.i2p
|
||||
; (1.174) added irc.arcturus.i2p
|
||||
; (1.173) added tracker.postman.i2p, hq.postman.i2p
|
||||
; (1.172) added i2p-bt.postman.i2p
|
||||
; (1.171) added luckypunk.i2p
|
||||
; (1.170) added bash.i2p, stats.i2p
|
||||
; (1.169) added archive.i2p, www.fr.i2p, romster.i2p, marshmallow.i2p, openforums.i2p
|
||||
; (1.168) removed duplicate manveru.i2p
|
||||
; (1.167) added bittorrent.i2p
|
||||
; (1.166) added elf.i2p, de-ebooks.i2p, i2pchan.i2p, longhorn.i2p
|
||||
; (1.165) added amobius.i2p
|
||||
; (1.164) added google.i2p
|
||||
; (1.163) added mrplod.i2p
|
||||
; (1.162) added sirup.i2p
|
||||
; (1.161) added connelly.i2p
|
||||
; (1.160) added wspucktracker.i2p
|
||||
; (1.159) added 55cancri.i2p
|
||||
; (1.158) added tracker.fr.i2p
|
||||
; (1.157) added v2mail.i2p, complication.i2p
|
||||
; (1.156) added lazyguy.i2p
|
||||
; (1.155) added confessions.i2p, rsync.thetower.i2p, redzara.i2p, gaytorrents.i2p
|
||||
; (1.154) added arkan.i2p, search.i2p, floureszination.i2p, antipiratbyran.i2p
|
||||
; asylum.i2p, templar.i2p
|
||||
; (1.153) added feedspace.i2p
|
||||
; (1.152) added wiki.fr.i2p
|
||||
; (1.151) added septu.i2p
|
||||
; (1.150) added music.i2p, rotten.i2p, wintermute.i2p, kaji2.i2p, aspnet.i2p,
|
||||
; gaming.i2p, nntp.i2p
|
||||
; (1.149) added cowsay.i2p
|
||||
; (1.148) added irc.postman.i2p
|
||||
; (1.147) added subrosa.i2p
|
||||
; (1.146) added moxonom.i2p
|
||||
; (1.145) added sex0r.i2p flock.i2p cneal.i2p www.nntp.i2p wallsgetbombed.i2p
|
||||
; thedarkside.i2p legion.i2p manveru.i2p books.manveru.i2p bt.i2p
|
||||
; (1.144) added riaa.i2p
|
||||
; (1.143) added mpaa.i2p
|
||||
; (1.142) added pants.i2p
|
||||
; (1.141) added irc.carambar.i2p
|
||||
; (1.140) added general.i2p
|
||||
; (1.139) added smeghead.i2p
|
||||
; (1.138) added nntp.fr.i2p
|
||||
; (1.137) added deadgod.i2p
|
||||
; (1.136) added manveru.i2p
|
||||
; (1.135) added fr.i2p
|
||||
; (1.134) added imhotep.i2p
|
||||
; (1.133) added jrandom.dev.i2p (ed. note: yes, i am me)
|
||||
; (1.132) added ttp.i2p
|
||||
; (1.131) added freenet.eco.i2p, tracker.i2p, photo.i2p
|
||||
; (1.130) added hopekiller.i2p, microsoft.i2p, jhor.i2p, badtoys.i2p
|
||||
; (1.129) added mindspore.i2p
|
||||
; (1.128) added irc.ircbnc.i2p
|
||||
; (1.127) added dvdr-core.i2p
|
||||
; (1.126) added j.i2p
|
||||
; (1.125) added bl.i2p
|
||||
; (1.124) removed jap.eco.i2p and bt1.eco.i2p (obsolete)
|
||||
; (1.123) added chat.i2p
|
||||
; (1.122) added phonebooth.i2p
|
||||
; (1.121) added up.i2p
|
||||
; (1.120) added dm.i2p
|
||||
; (1.119) added piespy.i2p
|
||||
; (1.118) added sciencebooks.i2p
|
||||
; (1.117) added forum.fr.i2p, fedo.i2p, and pastebin.i2p
|
||||
; (1.116) added frosk.i2p
|
||||
; (1.115) added theland.i2p
|
||||
; (1.114) added dox.i2p
|
||||
; (1.113) added amiga.i2p
|
||||
; (1.112) added frooze.i2p
|
||||
; (1.111) aliased gott.i2p as jrandom.i2p (ed. note: no, i am not gott)
|
||||
; (1.110) added sonax.i2p
|
||||
; (1.109) added 1.fcp.freenet.i2p and copied fcp.i2p to 2.fcp.freenet.i2p
|
||||
; (1.108) added asciiwhite.i2p
|
||||
; (1.107) added fcp.i2p
|
||||
; (1.106) added greenflog.i2p
|
||||
; (1.105) added bdl.i2p
|
||||
; (1.104) added bacardi.i2p and guttersnipe.i2p
|
||||
; (1.103) added evil.i2p
|
||||
; (1.102) added bsdm.i2p
|
||||
; (1.101) added eschaton.i2p
|
||||
; (1.100) added blog.curiosity.i2p
|
||||
; (1.99) added slacker.i2p
|
||||
; (1.98) added ses.i2p and pdforge.i2p
|
||||
; (1.97) added orion.i2p and protokol.i2p
|
||||
; (1.96) added blog.polecat.i2p
|
||||
; (1.95) added ciaran.i2p
|
||||
; (1.94) added polecat.i2p
|
||||
; (1.93) added susi.i2p
|
||||
; (1.92) removed duplicate beyond.i2p, added edge.i2p
|
||||
; (1.91) added shiftfox.i2p
|
||||
; (1.90) added underground.i2p
|
||||
; (1.89) renamed newsbytetest.i2p to newsbyte.i2p
|
||||
; (1.88) added newsbytetest.i2p
|
||||
; (1.87) updated curiosity.i2p (via signed email)
|
||||
; (1.86) added blueheron.i2p
|
||||
; (1.85) updated files.i2p (after verifying ident)
|
||||
; (1.84) added utansans.i2p
|
||||
; (1.83) added irc.orz.i2p
|
||||
; (1.82) added nano.i2p
|
||||
; (1.81) added ragnarok.i2p
|
||||
; (1.80) added marcos.i2p
|
||||
; (1.79) updated beyond.i2p's key
|
||||
; (1.78) added b.i2p
|
||||
; (1.77) added tinyurl.i2p
|
||||
; (1.76) added detonate.i2p
|
||||
; (1.75) added identiguy.i2p
|
||||
; (1.74) added jabber-2.i2p
|
||||
; (1.73) added jake.i2p
|
||||
; (1.72) added anonymnet.i2p sasquotch.i2p orz.i2p microbleu.i2p {www,smtp,pop3}.postman.i2p
|
||||
; (1.71) added curiosity.i2p
|
||||
; (1.70) added freeciv.nightblade.i2p
|
||||
; (1.69) added xolotl.i2p
|
||||
; (1.68) added modulus.i2p
|
||||
; (1.67) added eepdot.i2p
|
||||
; (1.66) removed datagram_test.i2p
|
||||
; (1.65) added socks1.tor.i2p
|
||||
; (1.64) added sugadude.i2p
|
||||
; (1.63) added files.i2p
|
||||
; (1.62) added beyond.i2p
|
||||
; (1.61) added gott.i2p
|
||||
; (1.60) added linuxagent.i2p
|
||||
; (1.59) added www.i2p, dev.i2p, and cvs.i2p, removed i2pcvs.i2p
|
||||
; (1.58) updated lucky.i2p (after not checking ID, but, c'mon...)
|
||||
; (1.57) added firerabbit.i2p
|
||||
; (1.56) added datagram_test.i2p
|
||||
; (1.55) updated ardvark.i2p (after checking ID)
|
||||
; (1.54) added files.nickster.i2p
|
||||
; (1.53) added brittanyworld.i2p
|
||||
; (1.52) added stasher.i2p
|
||||
; (1.51) changed quadn.i2p to library.i2p
|
||||
; (1.50) added freshcoffee.i2p
|
||||
; (1.49) added ems.i2p
|
||||
; (1.48) added ooo.i2p
|
||||
; (1.47) added fproxy2.i2p
|
||||
; (1.46) removed hypercubus.i2p
|
||||
; (1.45) added thetower.i2p
|
||||
; (1.44) added fproxy.i2p and mrflibble.i2p
|
||||
; (1.43) added files.hypercubus.i2p
|
||||
; (1.42) added www1.squid.i2p
|
||||
; (1.41) added quadn.i2p
|
||||
; (1.40) added nickster2.i2p and irc.nickster.i2p (pointing at IIP)
|
||||
; (1.39) added jdot.i2p
|
||||
; (1.38) added forum.i2p
|
||||
; (1.36) added ferret.i2p
|
||||
; (1.36) added anonynanny.i2p
|
||||
; (1.35) added hypercubus.i2p
|
||||
; (1.34) added ogg.baffled.i2p
|
||||
; (1.33) added morph.i2p
|
||||
; (1.32) added nickster.i2p
|
||||
; (1.31) added mush.zeit.i2p (i2p's first eepMUSH)
|
||||
; (1.30) added xilog.i2p
|
||||
; (1.29) added lucky.i2p, removed lp.i2p
|
||||
; (1.28) added sungo.i2p
|
||||
; (1.27) added jar.i2p
|
||||
; (1.26) added tor-www-proxy.i2p (WWW through tor by human - won't be up 24/7!)
|
||||
; (1.25) added ugha.i2p
|
||||
; (1.24) added reefer.i2p
|
||||
; (1.23) added nic.i2p
|
||||
; (1.22) added www.janonymous.i2p
|
||||
; (1.21) added bluebeam.i2p
|
||||
; (1.20) added echo.baffled.i2p (which runs mihi's echo server - telnet and get replies)
|
||||
; (1.19) added irc.baffled.i2p (which is hooked up with irc.duck.i2p over i2p)
|
||||
; (1.18) added www.aum.i2p, nntp.baffled.i2p, www.baffled.i2p, and ardvark.i2p
|
||||
; (1.17) added gernika's eepsite
|
||||
; (1.16) added duck's scp and hosting server
|
||||
; (1.15) added eco's beta i2psnark server
|
||||
; (1.14) added duck's pgp keyserver
|
||||
; (1.13) added human's eepsite, the mail servers, and luckypunk's eepsite
|
||||
; (1.12) added fillament's chessd server (FICS based clients or telnet to it)
|
||||
; (1.11) added mp3.tc.i2p and mesh.firerabbit.i2p
|
||||
; (1.10) added aum's mp3 and ogg streams
|
||||
; (1.9) added the FCP and HTTP keys for a private entropy node, as well as nm's eepsite
|
||||
; (1.8) updated nightblade's eepsite (after confirming ident w/ trent on iip)
|
||||
; (1.7) added aum's eepsite
|
||||
; (1.6) added fillament's flog/plog and eco's eepsite
|
||||
; (1.5) added duck's irc
|
||||
; (1.4) added eco's JAP tunnel
|
||||
; (1.3) added duck's eepsite
|
||||
; (1.2) fixed duck's subdomain names
|
||||
; (1.1) added nntp, jabber, squid, and i2pcvs (and imported into i2p's cvs for distribution)
|
||||
; (1.0) added dyad.i2p and nightblade.i2p
|
||||
; (0.5) added bozo.i2p
|
||||
; (0.0) added tc.i2p
|
||||
;
|
||||
tc.i2p=3RPLOkQGlq8anNyNWhjbMyHxpAvUyUJKbiUejI80DnPR59T3blc7-XrBhQ2iPbf-BRAR~v1j34Kpba1eDyhPk2gevsE6ULO1irarJ3~C9WcQH2wAbNiVwfWqbh6onQ~YmkSpGNwGHD6ytwbvTyXeBJcS8e6gmfNN-sYLn1aQu8UqWB3D6BmTfLtyS3eqWVk66Nrzmwy8E1Hvq5z~1lukYb~cyiDO1oZHAOLyUQtd9eN16yJY~2SRG8LiscpPMl9nSJUr6fmXMUubW-M7QGFH82Om-735PJUk6WMy1Hi9Vgh4Pxhdl7gfqGRWioFABdhcypb7p1Ca77p73uabLDFK-SjIYmdj7TwSdbNa6PCmzEvCEW~IZeZmnZC5B6pK30AdmD9vc641wUGce9xTJVfNRupf5L7pSsVIISix6FkKQk-FTW2RsZKLbuMCYMaPzLEx5gzODEqtI6Jf2teMd5xCz51RPayDJl~lJ-W0IWYfosnjM~KxYaqc4agviBuF5ZWeAAAA
|
||||
dyad.i2p=W~JFpqSH8uopylox2V5hMbpcHSsb-dJkSKvdJ1vj~KQcUFJWXFyfbetBAukcGH5S559aK9oslU0qbVoMDlJITVC4OXfXSnVbJBP1IhsK8SvjSYicjmIi2fA~k4HvSh9Wxu~bg8yo~jgfHA8tjYppK9QKc56BpkJb~hx0nNGy4Ny9eW~6A5AwAmHvwdt5NqcREYRMjRd63dMGm8BcEe-6FbOyMo3dnIFcETWAe8TCeoMxm~S1n~6Jlinw3ETxv-L6lQkhFFWnC5zyzQ~4JhVxxT3taTMYXg8td4CBGmrS078jcjW63rlSiQgZBlYfN3iEYmurhuIEV9NXRcmnMrBOQUAoXPpVuRIxJbaQNDL71FO2iv424n4YjKs84suAho34GGQKq7WoL5V5KQgihfcl0f~xne-qP3FtpoPFeyA9x-sA2JWDAsxoZlfvgkiP5eyOn23prT9TJK47HCVilHSV11uTVaC4Jc5YsjoBCZadWbgQnMCKlZ4jk-bLE1PSWLg7AAAA
|
||||
nightblade.i2p=nyErwSseXbsojcWtNkDyUul0YULtqr6qyWSzIp639Ygpe8juCdgPMLURVXcmlCvo~QPoHg6zt53KpgpGvB1-Wv2SGvc2Mvs~o8USw3ius8fP1URphqcBbulK8Ci0bgknt0kD0AfxqfMz-p~xk1QEMxq2kZEoB3oyIIFnQlpb2ByS74Lx8iKzXTrwWk19I3Dvu4nIq8CBDDwu3lYoCD2kC-jT5pjgglverGPEGN4o55LYVTtfSg4gAJFZeaE4KjBR5P1z7cca6UDjGMWfR0iCa8P3qpkY2ODYpk~8w2xgBbgDq-8Hzik~uraHc598ccS8QpwB0f0Jw~2PZcTjOPdZ-239U6p3tESXa7FXzRBCujv4Bx6CVFRhCmBHpyFnCD-MugZ~vR6XFSS2XBsCT~duXKq94HH2n1iAWslG4Vu44ut1JVhDPFzp~Dk7wujB0tCo2HXH2icRQxOWe37foU4LZSJ4oMpFDACBzwSfcZdIPsVRxGttKQx4yzgffR1Q~Jl7AAAA
|
||||
@@ -508,4 +297,7 @@ archive.syndie.i2p=iXX0DadZTJQpPr1to0OmQ4xokHgx1HYd5ec7~zIjQ80W~p4kRCYJmEzibH2Kn
|
||||
trac.i2p=OBnF9NtkEsPij2F-lp3bWDVrJsPQQPdq6adlpq0N4BY1XRjtDBZl~EpDdk7roq49~ptKAQG2cNUeBEKIIrdlZhJio5pMwUl6YinizzkNTFfZipB5OKoB7PBulxkw-N9mKMhS1btd9ajcV8tiP3xiv7VSlgiDwbdKg1fmkvNrVrJnzkN3-ey2kebYnbh7jjU2gPFUl~CwSEkIi6AK9EfqmFR-DUVohyygqAY~fi4EMeTVXGUqftXSNFYUwpRJgFrWRPTurtZnJK5403q67oEk0eWrPIZ8ytJWSBfffAXL3ts~0O1FZeKXUccsAl33j70~lklSolNVLJ40y-6X5ZLWajmX0ONU3j0qI5A~7fgNgsg-vKypPDuzl8ug-D~BmhqdAf0sRYmziDVwTgU~WRB6IzhhXFR6CbwrGXdgOGg2qNT1eOnMwGo3SMMJ7kK88VC5LdYg2dyiyjZATuvT92QdZglrVQIeBqAehcFjOBuycC1ED3AOak8D9Xplj7V6hN-HAAAA
|
||||
trevorreznik.i2p=FxoG5dx6WuF8gu0Fc4ItB61hd8dBZ0L6FjkvoA-kQrC0DcY5YUqKBUmrcxzKhKo4nLyg0jRV-RSNUuWsali44dmpHQ6wuFjCGTr5zMk0NoVUpBsBNtHLEQWxROnuQFlQAq6x~eVdU5bAvnNFd-6RXDJ86Br9bf5YG4PHmZPon7ld3t1kAvPaZepITKlIq5iXy3va-pzAMFEIhDtLMzFjGhLWMg9m-8tkx4577WvzUWbSAUdxKkxwjecIzbTDTQsZld~t5MkaMmn5UpNX6Gh3iDUPWHXOjn4I8MIELiSaeRdpHDgua3mo~p8oO0QvWBgn~jQ8yr6nz7vMAdoRtOwPlUqHCCM1BsPVcN9a92rPpTFBk0BXikjJJrkDDIaFjJnKmRAsEUoa-eHaPV~RS0QPrfuzlp0XjBzQcAQjNIw6hO4xqJujSs8SdObMpQAqCR5Sc5NzOvTr5eAzCIz0gmQnKrA1RJVOebKDERM~qQ6rFrdVDkjLEJd6SyjUr-TdIrayAAAA
|
||||
i2host.i2p=FkX89~FOWc2HjTeVerud7hzZCtQNDKqEvMeJiDEnSzneA44hhDEDSbjiDuEWOCPwvgCwrzMg9o3apHXosNMnRVTYlYIJWb1~fgRnzkHIJnz2yrojLcTElTLMgQSzHdV04ock3oPHjw8r2j73hnTiq5u3HhexT0D-IK02S0GUd9cPcP2YnWlNMnGuA-J6s7VHUd5mUhBO3LeOcOusBUOjsbt79bwBZYsnnVV~JRSVzHPd8kYbRMEjDuyaIJHEr2pkwwtrk~BqLeZ5UCbbVob1-733FtOfQXjKTpFPK~IlHDM7ItgXt77U5KZHkZ54WQYJNCE6HlE7LhFB79cqjgvxXTfvyjoqZVJ1lq1yFS8GtLcnurJLkN5BleCEDJEK3D7kCymCpngW9wlKjakEc85ZculU65neqIpqIk6noir6e1vseeUZKxBM3k6AYkLoFYSh98PpENjTHUdaNTl1kQA2Mmi9zobGS0gn0~RWHFord19TC5ReBtOFWkseksHp-5-nAAAA
|
||||
|
||||
true.i2p=Jeb1Ctlh55wWezbA~sCxYQsreDPS~qFJ6DeNMPl7~Kx0w1Odh8YE3QKrZS7WlNqeoRNJLyPgf7h19Tosb-ATZOPDH7B4pQvI4CdlTv-Uimq4dI71PRRZQr3mCBihW~WtVReDOO3JiDf1Bx225xhTmWp0KYo5AM91EW0TcHi8immHBFB9jcjekPoU~zlVAqy5S07LnS7f7rWtC7kno983Dyi9arWDPmnnzu2QD4mMrH0EkuuoBqwUi1HBUNhTn~lL8KqfSpg9j9q-eqd~eixF3nOlsrxMFuWVV1HOUtyMUTRGEX4i4IDPWmRQeFZ0gmfeBYdad~nG1X7uBVeeEtGSrggnegXoSE4oaIuONNXYORsevZn8UahC~kkNWg1wPQtr57TirhLirkF2qHUuwAqe5G00PIhC0-J8K5Ye0QDd5a1coQT87kBgcqLcbSR1oGIjxv2Ma6970Fv65a2a~YKqZZbuGof5-5-7X48SVhOigmo2c-COyt2rXoQlGQpBWtDsAAAA
|
||||
krabs.i2p=k6qIwzff6s1RiRQQy9O6cliBTfHffKZ2F~pVG8nmCqMxEpPnywynFa9XVS6VBbhxGRAMG~PIb2IaFRYS5GFdM3fnnJ~Cn2AbN-qsqbl6cXExj5Fy9Cd-aPR44XW0NE9qjFPiN~6JUOg0fitF65RmsMrFvHq9LM2zOFxOfnPKVsBJGRpjhp6EPRNrkXvzQTw7x6~kqUJ-VGW0avjrz4EmgT6Wias5z0EPioneKOhG-1NepL8HqEv9ryGt31~kmI1-B0cS8v1riaXH0rZWjJ0VvUFEoJ3sHCir4vsnSf1YQIKMUO~zKlgTVZBsw8P2ILFFihs0g9KMIWVjJqqo0PzCM1O-LW90hirn~Ryh4zOZI-orIiV9Oqu96Fj2bvBYSka11TY7erLOCk64tc5NwxvlJQ3F-lk0ZFGvYuU~l45mi0khFLnDnzhDFtcY6YNLRG8hmv9IR2MrG9TJFfSwXdx11LI-57tkRi9Jw4s8OjLijNNDOJX~rVgwZVVIEQcOhGxkAAAA
|
||||
www.i2p2.i2p=-KR6qyfPWXoN~F3UzzYSMIsaRy4udcRkHu2Dx9syXSzUQXQdi2Af1TV2UMH3PpPuNu-GwrqihwmLSkPFg4fv4yQQY3E10VeQVuI67dn5vlan3NGMsjqxoXTSHHt7C3nX3szXK90JSoO~tRMDl1xyqtKm94-RpIyNcLXofd0H6b02683CQIjb-7JiCpDD0zharm6SU54rhdisIUVXpi1xYgg2pKVpssL~KCp7RAGzpt2rSgz~RHFsecqGBeFwJdiko-6CYW~tcBcigM8ea57LK7JjCFVhOoYTqgk95AG04-hfehnmBtuAFHWklFyFh88x6mS9sbVPvi-am4La0G0jvUJw9a3wQ67jMr6KWQ~w~bFe~FDqoZqVXl8t88qHPIvXelvWw2Y8EMSF5PJhWw~AZfoWOA5VQVYvcmGzZIEKtFGE7bgQf3rFtJ2FAtig9XXBsoLisHbJgeVb29Ew5E7bkwxvEe9NYkIqvrKvUAt1i55we0Nkt6xlEdhBqg6xXOyIAAAA
|
||||
i2p-projekt.i2p=8ZAW~KzGFMUEj0pdchy6GQOOZbuzbqpWtiApEj8LHy2~O~58XKxRrA43cA23a9oDpNZDqWhRWEtehSnX5NoCwJcXWWdO1ksKEUim6cQLP-VpQyuZTIIqwSADwgoe6ikxZG0NGvy5FijgxF4EW9zg39nhUNKRejYNHhOBZKIX38qYyXoB8XCVJybKg89aMMPsCT884F0CLBKbHeYhpYGmhE4YW~aV21c5pebivvxeJPWuTBAOmYxAIgJE3fFU-fucQn9YyGUFa8F3t-0Vco-9qVNSEWfgrdXOdKT6orr3sfssiKo3ybRWdTpxycZ6wB4qHWgTSU5A-gOA3ACTCMZBsASN3W5cz6GRZCspQ0HNu~R~nJ8V06Mmw~iVYOu5lDvipmG6-dJky6XRxCedczxMM1GWFoieQ8Ysfuxq-j8keEtaYmyUQme6TcviCEvQsxyVirr~dTC-F8aZ~y2AlG5IJz5KD02nO6TRkI2fgjHhv9OZ9nskh-I2jxAzFP6Is1kyAAAA
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<i2p.news date="$Date: 2007-08-23 19:33:29 $">
|
||||
<i2p.release version="0.6.1.30" date="2007/02/15" minVersion="0.6"
|
||||
<i2p.news date="$Date: 2008-03-09 15:00:00 $">
|
||||
<i2p.release version="0.6.1.32" date="2008/03/09" minVersion="0.6"
|
||||
anonurl="http://i2p/NF2RLVUxVulR3IqK0sGJR0dHQcGXAzwa6rEO4WAWYXOHw-DoZhKnlbf1nzHXwMEJoex5nFTyiNMqxJMWlY54cvU~UenZdkyQQeUSBZXyuSweflUXFqKN-y8xIoK2w9Ylq1k8IcrAFDsITyOzjUKoOPfVq34rKNDo7fYyis4kT5bAHy~2N1EVMs34pi2RFabATIOBk38Qhab57Umpa6yEoE~rbyR~suDRvD7gjBvBiIKFqhFueXsR2uSrPB-yzwAGofTXuklofK3DdKspciclTVzqbDjsk5UXfu2nTrC1agkhLyqlOfjhyqC~t1IXm-Vs2o7911k7KKLGjB4lmH508YJ7G9fLAUyjuB-wwwhejoWqvg7oWvqo4oIok8LG6ECR71C3dzCvIjY2QcrhoaazA9G4zcGMm6NKND-H4XY6tUWhpB~5GefB3YczOqMbHq4wi0O9MzBFrOJEOs3X4hwboKWANf7DT5PZKJZ5KorQPsYRSq0E3wSOsFCSsdVCKUGsAAAA/i2p/i2pupdate.sud"
|
||||
publicurl="http://dev.i2p.net/i2p/i2pupdate.sud"
|
||||
anonannouncement="http://i2p/NF2RLVUxVulR3IqK0sGJR0dHQcGXAzwa6rEO4WAWYXOHw-DoZhKnlbf1nzHXwMEJoex5nFTyiNMqxJMWlY54cvU~UenZdkyQQeUSBZXyuSweflUXFqKN-y8xIoK2w9Ylq1k8IcrAFDsITyOzjUKoOPfVq34rKNDo7fYyis4kT5bAHy~2N1EVMs34pi2RFabATIOBk38Qhab57Umpa6yEoE~rbyR~suDRvD7gjBvBiIKFqhFueXsR2uSrPB-yzwAGofTXuklofK3DdKspciclTVzqbDjsk5UXfu2nTrC1agkhLyqlOfjhyqC~t1IXm-Vs2o7911k7KKLGjB4lmH508YJ7G9fLAUyjuB-wwwhejoWqvg7oWvqo4oIok8LG6ECR71C3dzCvIjY2QcrhoaazA9G4zcGMm6NKND-H4XY6tUWhpB~5GefB3YczOqMbHq4wi0O9MzBFrOJEOs3X4hwboKWANf7DT5PZKJZ5KorQPsYRSq0E3wSOsFCSsdVCKUGsAAAA/pipermail/i2p/2005-September/000878.html"
|
||||
|
@@ -4,11 +4,11 @@
|
||||
|
||||
<info>
|
||||
<appname>i2p</appname>
|
||||
<appversion>0.6.1.30</appversion>
|
||||
<appversion>0.6.1.32</appversion>
|
||||
<authors>
|
||||
<author name="I2P" email="support@i2p.net"/>
|
||||
<author name="I2P" email="http://forum.i2p.net"/>
|
||||
</authors>
|
||||
<url>http://www.i2p.net</url>
|
||||
<url>http://www.i2p2.de</url>
|
||||
</info>
|
||||
|
||||
<guiprefs width="590" height="356" resizable="yes">
|
||||
|
0
installer/lib/launch4j/bin/ld
Normal file → Executable file
0
installer/lib/launch4j/bin/ld
Normal file → Executable file
0
installer/lib/launch4j/bin/ld.exe
Normal file → Executable file
0
installer/lib/launch4j/bin/ld.exe
Normal file → Executable file
0
installer/lib/launch4j/bin/windres
Normal file → Executable file
0
installer/lib/launch4j/bin/windres
Normal file → Executable file
0
installer/lib/launch4j/bin/windres.exe
Normal file → Executable file
0
installer/lib/launch4j/bin/windres.exe
Normal file → Executable file
@@ -38,8 +38,7 @@ div.logo {
|
||||
<div class=warning id=warning>
|
||||
The eepsite was not found in your router's addressbook.
|
||||
Check the link or find a BASE64 address.
|
||||
If you have the BASE64 address, paste it into your userhosts.txt using SusiDNS
|
||||
<a href="http://localhost:7657/susidns/addressbook.jsp?book=master">here</a>.
|
||||
or use a BASE64 address helper.
|
||||
You may be able to find the eepsite's address helper at <a href="http://orion.i2p">orion.i2p</a>.
|
||||
If you have the BASE64 address, paste it into your userhosts.txt using
|
||||
<a href="http://localhost:7657/susidns/addressbook.jsp?book=master">SusiDNS</a>,
|
||||
use a BASE64 address helper, or use a jump service link below.
|
||||
<BR><BR>Could not find the following destination:<BR><BR>
|
||||
|
@@ -56,7 +56,7 @@
|
||||
That is, you must enter
|
||||
your eepsite name and key into a web interface on one or more of these sites.
|
||||
Here is <a href="http://stats.i2p/i2p/addkey.html">the key entry form at stats.i2p</a>,
|
||||
here is <a href="http://orion.i2p/list/">the key entry form at orion.i2p</a> and
|
||||
and
|
||||
here is <a href="http://trevorreznik.i2p/host-database/">the key entry form at trevorreznik.i2p</a>.
|
||||
Again, your key is the entire "Local destination" key on the
|
||||
<a href="http://localhost:7657/i2ptunnel/edit.jsp?tunnel=3">eepsite i2ptunnel configuration page</a>.
|
||||
@@ -68,15 +68,14 @@
|
||||
<li>Speaking of address book updates, this would be a good time to add some more addressbooks
|
||||
to your own subscription list. Go to your <a href="http://localhost:7657/susidns/subscriptions.jsp">subscriptions configuration page</a>
|
||||
and add a couple of these -
|
||||
<a href="http://orion.i2p/hosts.txt">http://orion.i2p/hosts.txt</a>,
|
||||
<a href="http://tino.i2p/hosts.txt">http://tino.i2p/hosts.txt</a>,
|
||||
<a href="http://stats.i2p/newhosts.txt">http://stats.i2p/newhosts.txt</a>,
|
||||
<a href="http://stats.i2p/cgi-bin/newhosts.txt">http://stats.i2p/cgi-bin/newhosts.txt</a>,
|
||||
<a href="http://trevorreznik.i2p/hosts.txt">http://trevorreznik.i2p/hosts.txt</a> and hit "Save".
|
||||
Now you will get updates too!
|
||||
<li>If you are in a hurry and can't wait a few hours, you can tell people to use a "jump" address helper redirection service.
|
||||
This will work within a few minutes of your entering the key to an address book.
|
||||
Test it yourself first by entering http://orion.i2p/jump/<i>something</i>.i2p
|
||||
or http://stats.i2p/cgi-bin/jump.cgi?a=<i>something</i>.i2p or
|
||||
Test it yourself first by entering
|
||||
http://stats.i2p/cgi-bin/jump.cgi?a=<i>something</i>.i2p or
|
||||
or http://trevorreznik.i2p/cgi-bin/jump.php?hostname=<i>something</i>.i2p into your browser.
|
||||
Once it's working, then you can tell others to use it.
|
||||
<li>Some people check eepsite lists such as
|
||||
@@ -86,7 +85,7 @@
|
||||
<li>Post a message on the <a href="http://forum.i2p/viewforum.php?f=16">Eepsite announce forum</a>
|
||||
on <a href="http://forum.i2p/">forum.i2p</a>.
|
||||
<li>Tell people about it on the #i2p or #i2p-chat channels on IRC.
|
||||
<li>Put it in a new post on <a href="http://syndie.i2p.net">the new Syndie</a>.
|
||||
<li>Put it in a new post on <a href="http://syndie.i2p2.de/">the new Syndie</a>.
|
||||
<li>Put it in <a href="http://ugha.i2p/EepsiteIndex">Ugha's Eepsite Index Wiki</a>
|
||||
</ul>
|
||||
Note that some sites recommend pasting in that really long destination key.
|
||||
|
@@ -5,7 +5,7 @@ tunnel.0.type=httpclient
|
||||
tunnel.0.sharedClient=true
|
||||
tunnel.0.interface=127.0.0.1
|
||||
tunnel.0.listenPort=4444
|
||||
tunnel.0.proxyList=squid.i2p
|
||||
tunnel.0.proxyList=true.i2p,krabs.i2p
|
||||
tunnel.0.i2cpHost=127.0.0.1
|
||||
tunnel.0.i2cpPort=7654
|
||||
tunnel.0.option.inbound.nickname=shared clients
|
||||
|
@@ -1,3 +1,10 @@
|
||||
#
|
||||
# This runs the router by itself, WITHOUT the wrapper.
|
||||
# This means the router will not restart if it crashes.
|
||||
# Also, you will be using the default memory size, which is
|
||||
# probably not enough for i2p.
|
||||
# You should really use the i2prouter script instead.
|
||||
#
|
||||
export CP=. ; for j in lib/* ; do export CP=$CP:$j ; done;
|
||||
JAVA=java
|
||||
|
||||
|
@@ -1,5 +1,11 @@
|
||||
#********************************************************************
|
||||
# Wrapper Properties
|
||||
#
|
||||
# WARNING - for any changes to take effect, you must completely
|
||||
# stop the router and the wrapper. Clicking 'Restart' on your
|
||||
# router console will NOT reread this file! You must
|
||||
# click "Shutdown", wait 11 minutes, then start i2p.
|
||||
#
|
||||
#********************************************************************
|
||||
# Java Application
|
||||
wrapper.java.command=java
|
||||
@@ -60,6 +66,13 @@ wrapper.java.additional.4=-Dorg.mortbay.xml.XmlParser.NotValidating=true
|
||||
# The JVM's default is 64MB, and I2P can work fine in that, but to handle
|
||||
# lots of I2PSnark activity in the same JVM, increasing the default max heap
|
||||
# size should help. Feel free to reduce this if not using I2PSnark in the jvm
|
||||
# High-bandwidth routers may need to increase to 256 or more.
|
||||
#
|
||||
# WARNING - for any changes to take effect, you must completely
|
||||
# stop the router and the wrapper. Clicking 'Restart' on your
|
||||
# router console will NOT reread this file! You must
|
||||
# click "Shutdown", wait 11 minutes, then start i2p.
|
||||
#
|
||||
wrapper.java.maxmemory=128
|
||||
|
||||
# Application parameters. Add parameters as needed starting from 1
|
||||
|
110
news.xml
110
news.xml
@@ -1,5 +1,5 @@
|
||||
<i2p.news date="$Date: 2007-10-07 22:09:35 $">
|
||||
<i2p.release version="0.6.1.30" date="2007/02/15" minVersion="0.6"
|
||||
<i2p.news date="$Date: 2008-03-09 15:00:00 $">
|
||||
<i2p.release version="0.6.1.32" date="2008/03/09" minVersion="0.6"
|
||||
anonurl="http://i2p/NF2RLVUxVulR3IqK0sGJR0dHQcGXAzwa6rEO4WAWYXOHw-DoZhKnlbf1nzHXwMEJoex5nFTyiNMqxJMWlY54cvU~UenZdkyQQeUSBZXyuSweflUXFqKN-y8xIoK2w9Ylq1k8IcrAFDsITyOzjUKoOPfVq34rKNDo7fYyis4kT5bAHy~2N1EVMs34pi2RFabATIOBk38Qhab57Umpa6yEoE~rbyR~suDRvD7gjBvBiIKFqhFueXsR2uSrPB-yzwAGofTXuklofK3DdKspciclTVzqbDjsk5UXfu2nTrC1agkhLyqlOfjhyqC~t1IXm-Vs2o7911k7KKLGjB4lmH508YJ7G9fLAUyjuB-wwwhejoWqvg7oWvqo4oIok8LG6ECR71C3dzCvIjY2QcrhoaazA9G4zcGMm6NKND-H4XY6tUWhpB~5GefB3YczOqMbHq4wi0O9MzBFrOJEOs3X4hwboKWANf7DT5PZKJZ5KorQPsYRSq0E3wSOsFCSsdVCKUGsAAAA/i2p/i2pupdate.sud"
|
||||
publicurl="http://dev.i2p.net/i2p/i2pupdate.sud"
|
||||
anonannouncement="http://i2p/NF2RLVUxVulR3IqK0sGJR0dHQcGXAzwa6rEO4WAWYXOHw-DoZhKnlbf1nzHXwMEJoex5nFTyiNMqxJMWlY54cvU~UenZdkyQQeUSBZXyuSweflUXFqKN-y8xIoK2w9Ylq1k8IcrAFDsITyOzjUKoOPfVq34rKNDo7fYyis4kT5bAHy~2N1EVMs34pi2RFabATIOBk38Qhab57Umpa6yEoE~rbyR~suDRvD7gjBvBiIKFqhFueXsR2uSrPB-yzwAGofTXuklofK3DdKspciclTVzqbDjsk5UXfu2nTrC1agkhLyqlOfjhyqC~t1IXm-Vs2o7911k7KKLGjB4lmH508YJ7G9fLAUyjuB-wwwhejoWqvg7oWvqo4oIok8LG6ECR71C3dzCvIjY2QcrhoaazA9G4zcGMm6NKND-H4XY6tUWhpB~5GefB3YczOqMbHq4wi0O9MzBFrOJEOs3X4hwboKWANf7DT5PZKJZ5KorQPsYRSq0E3wSOsFCSsdVCKUGsAAAA/pipermail/i2p/2005-September/000878.html"
|
||||
@@ -9,12 +9,110 @@
|
||||
publicurl="http://dev.i2p.net/pipermail/i2p/2005-July/000826.html"
|
||||
anonlogs="http://i2p/Nf3ab-ZFkmI-LyMt7GjgT-jfvZ3zKDl0L96pmGQXF1B82W2Bfjf0n7~288vafocjFLnQnVcmZd~-p0-Oolfo9aW2Rm-AhyqxnxyLlPBqGxsJBXjPhm1JBT4Ia8FB-VXt0BuY0fMKdAfWwN61-tj4zIcQWRxv3DFquwEf035K~Ra4SWOqiuJgTRJu7~o~DzHVljVgWIzwf8Z84cz0X33pv-mdG~~y0Bsc2qJVnYwjjR178YMcRSmNE0FVMcs6f17c6zqhMw-11qjKpY~EJfHYCx4lBWF37CD0obbWqTNUIbL~78vxqZRT3dgAgnLixog9nqTO-0Rh~NpVUZnoUi7fNR~awW5U3Cf7rU7nNEKKobLue78hjvRcWn7upHUF45QqTDuaM3yZa7OsjbcH-I909DOub2Q0Dno6vIwuA7yrysccN1sbnkwZbKlf4T6~iDdhaSLJd97QCyPOlbyUfYy9QLNExlRqKgNVJcMJRrIual~Lb1CLbnzt0uvobM57UpqSAAAA/meeting141"
|
||||
publiclogs="http://www.i2p.net/meeting141" />
|
||||
<p>
|
||||
•
|
||||
2007-10-07: 0.6.1.30
|
||||
<a href="http://dev.i2p/pipermail/i2p/2007-October/001356.html">released</a>
|
||||
with
|
||||
streaming lib, eepget, and i2psnark improvements, and a memory leak fix.
|
||||
2008-03-09: <b>0.6.1.32 Released</b>
|
||||
</p><p>
|
||||
The 0.6.1.32 release contains a new, more efficient
|
||||
tunnel build algorithm, and fixes participating tunnel counts.
|
||||
These changes should help network capacity, so please
|
||||
upgrade when you get a chance.
|
||||
This release also increases the default inbound bandwidth limit to 32KBps.
|
||||
You may wish to adjust your limits on
|
||||
<a href="config.jsp">config.jsp</a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
•
|
||||
2008-02-29: <b>Upcoming 0.6.1.32 Release</b>
|
||||
</p><p>
|
||||
If you upgraded from 0.6.1.30 to 0.6.1.31, you may wish to take advantage
|
||||
of the new round-robin update downloading when .32 is released. This is optional.
|
||||
On
|
||||
<a href="configadvanced.jsp">configadvanced.jsp</a>,
|
||||
delete the line "router.updateURL=..." and click "Apply".
|
||||
Verify that you now have three default Update URLs listed on
|
||||
<a href="configupdate.jsp">configupdate.jsp</a>.
|
||||
If you already have three Update URLs, you do not have to do anything.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
•
|
||||
2008-02-05: <b>Upgrading from 0.6.1.30 and Earlier Releases</b>
|
||||
</p><p>
|
||||
Since i2p's lead developer
|
||||
<a href="http://dreamtheaterfan.i2p/jrandom-awol.html">has gone AWOL</a>,
|
||||
we do not have his update signing key or write access to
|
||||
<a href="http://www.i2p/">www.i2p</a> or
|
||||
<a href="http://dev.i2p/">dev.i2p</a>.
|
||||
Complication and zzz have generated new signing keys, and they and Amiga are providing
|
||||
update file hosting. These changes must be configured in your router to take effect.
|
||||
</p><p>
|
||||
Make the following configuration changes and your router will automatically install
|
||||
the latest release.
|
||||
</p><p>
|
||||
We recommend the automated process as it will verify the key of the signed update file.
|
||||
If you do not make these changes,
|
||||
you may manually download the i2pupdate.zip file from
|
||||
<a href="http://www.i2p2.i2p/download.html">www.i2p2.i2p/download</a>.
|
||||
<ol><li>
|
||||
On
|
||||
<a href="configupdate.jsp">configupdate.jsp</a>:
|
||||
</li><ol type="a"><li>
|
||||
Change the News URL to: http://complication.i2p/news.xml
|
||||
</li><li>
|
||||
Select ONE of the following new Update URLs at random and enter it into the Update URL box:
|
||||
<br />http://amiga.i2p/i2p/i2pupdate.sud
|
||||
<br />http://complication.i2p/i2p/i2pupdate.sud
|
||||
<br />http://stats.i2p/i2p/i2pupdate.sud
|
||||
</li><li>
|
||||
Check the box "Update through the eepProxy?"
|
||||
</li><li>
|
||||
Click "Save"
|
||||
</li></ol>
|
||||
<li>
|
||||
On
|
||||
<a href="configadvanced.jsp">configadvanced.jsp</a>:
|
||||
<ol type="a"><li>
|
||||
Add the following line:
|
||||
<br />
|
||||
<textarea rows="1" cols="80" readonly="readonly">router.trustedUpdateKeys=W4kJbnv9KSVwbnapV7SaNW2kMIZKs~hwL0ro9pZXFo1xTwqz45nykCp1HM7sAKYDZay5z1HvYYOl9CNVz00xF03KPU9RUCVxhDZ1YXhZIskPKjUPUsCIpE~Z1C~N9KSEV6~2stDlBNH10VZ4T0X1TrcXwb3IBXliWo2y2GAx~Ow=,lT54eq3SH0TWWwQ1wgH6XPelIno7wH7UfiZOpQg-ZuxdNhc4UjjrohKdKZqfswt1ANPnmOlMewLGBESl7kJB9c5sByz~IOlNyz5BMLRC~R~ZC9QI4WXwUBYW8BhYO2mkvtdOrcy690lDkwzdf5xLxlCBpQlTaLYzQVjVWBcvbCA=,JHFA0yXUgKtmhajXFZH9Nk62OPRHbvvQHTi8EANV-D~3tjLjaz9p9cs6Fs8W3FSLfUwsQeFg7dfVSQQZga~1jMjboo94vIcm3j6XbW4mbcorVQ74uPjd8EA1AQhJ6bBTxDAFk~6fVDOdhHT0Wo5CcUn7v8bAYY3x3UWiL8Remx0=</textarea>
|
||||
</li><li>
|
||||
Click "Apply"
|
||||
</li></ol>
|
||||
<li>
|
||||
You are now ready to automatically receive the release update file,
|
||||
either by setting your update policy to "download and install" or by clicking on the
|
||||
"update available" link when it appears.
|
||||
</li></li></ol>
|
||||
</p><p>
|
||||
If you would like to verify the trusted update keys, they are also
|
||||
<a href="http://stats.i2p/i2p/signingkeys.html">posted and signed here</a>.
|
||||
Thank you for your support during this transition. For help please contact us on #i2p.
|
||||
</p><p>
|
||||
Amiga, Complication, welterde, zzz
|
||||
</p>
|
||||
|
||||
<p>
|
||||
•
|
||||
2008-02-05: <b>*.i2p[.net] Replacements</b>
|
||||
<p>
|
||||
As you probably know, <a href="http://www.i2p.net/">www.i2p.net</a>
|
||||
and its related sites and services went down January 13 after
|
||||
a power outage at the hosting facility, and did not return fully to service.
|
||||
While some pages are still available at
|
||||
<a href="http://66.111.51.110/">66.111.51.110</a>
|
||||
we have a new official site at
|
||||
<a href="http://www.i2p2.de/">www.i2p2.de</a>
|
||||
and
|
||||
<a href="http://www.i2p2.i2p/">www.i2p2.i2p</a>.
|
||||
Extensive information about replacements for the various services
|
||||
is available at
|
||||
<a href="http://forum.i2p/viewtopic.php?t=2500">the forums</a>,
|
||||
<a href="http://complication.i2p/">complication.i2p</a>, and
|
||||
<a href="http://zzz.i2p/">zzz.i2p</a>.
|
||||
</p>
|
||||
|
||||
<!--
|
||||
•
|
||||
2007-04-10:
|
||||
|
@@ -14,10 +14,10 @@ you can:</p>
|
||||
<li><a href="http://inproxy.tino.i2p/status.php">inproxy.tino.i2p</a> and
|
||||
<a href="http://perv.i2p/stats.cgi">perv.i2p</a>: sites tracking active eepsites</li>
|
||||
<li><a href="http://forum.i2p/">forum.i2p</a>: a secure and anonymous connection to <a href="http://forum.i2p.net/">forum.i2p.net</a></li>
|
||||
<li><a href="http://www.i2p/">www.i2p</a>: a secure and anonymous connection to <a href="http://www.i2p.net/">www.i2p.net</a></li>
|
||||
<li><a href="http://www.i2p2.i2p/">www.i2p2.i2p</a> and mirror <a href="http://i2p-projekt.i2p">i2p-projekt.i2p</a>:
|
||||
secure and anonymous connections to <a href="http://www.i2p2.de/">www.i2p2.de</a></li>
|
||||
<li><a href="http://eepsites.i2p/">eepsites.i2p</a>: an anonymously hosted search engine of eepsites</li>
|
||||
<li><a href="http://ugha.i2p/">ugha.i2p</a>: ugha's eepsite, a wiki that anyone can edit, and lots of links</li>
|
||||
<li><a href="http://dev.i2p/">dev.i2p</a>: a secure and anonymous connection to <a href="http://dev.i2p.net/">dev.i2p.net</a></li>
|
||||
<li><a href="http://fproxy.tino.i2p">fproxy.tino.i2p</a>: Freenet proxy</li>
|
||||
</ul>
|
||||
There are many more eepsites - just follow the links from the ones you see,
|
||||
@@ -55,10 +55,10 @@ Detailed instructions for starting your eepsite are on
|
||||
<p>Be patient - I2P may be slow to start the first time as it searches for peers.
|
||||
If, after 30 minutes, your Active: connected/recent count has less than 10 connected
|
||||
peers, you should open port 8887 on your firewall for better connectivity.
|
||||
If you cannot see any eepsites at all (even <a href="http://www.i2p">www.i2p</a>),
|
||||
If you cannot see any eepsites at all (even <a href="http://www.i2p2.i2p">www.i2p2.i2p</a>),
|
||||
be sure your browser proxy is set to localhost port 4444.
|
||||
You may also want to review the information on the
|
||||
<a href="http://www.i2p.net/">I2P website</a>, post up messages to the
|
||||
<a href="http://www.i2p2.i2p/">I2P website</a>, post up messages to the
|
||||
<a href="http://forum.i2p.net/">I2P discussion forum</a>, or swing by #i2p or
|
||||
#i2p-chat on IRC at <a href="irc://irc.freenode.net/#i2p">irc.freenode.net</a>, irc.postman.i2p or irc.freshcoffee.i2p (they're linked together).</p>
|
||||
|
||||
|
@@ -15,9 +15,9 @@ import net.i2p.CoreVersion;
|
||||
*
|
||||
*/
|
||||
public class RouterVersion {
|
||||
public final static String ID = "$Revision: 1.548 $ $Date: 2008-01-08 21:15:43 $";
|
||||
public final static String VERSION = "0.6.1.30";
|
||||
public final static long BUILD = 20;
|
||||
public final static String ID = "$Revision: 1.548 $ $Date: 2008-02-10 15:00:00 $";
|
||||
public final static String VERSION = "0.6.1.32";
|
||||
public final static long BUILD = 0;
|
||||
public static void main(String args[]) {
|
||||
System.out.println("I2P Router version: " + VERSION + "-" + BUILD);
|
||||
System.out.println("Router ID: " + RouterVersion.ID);
|
||||
|
@@ -128,11 +128,15 @@ public class StatisticsManager implements Service {
|
||||
if (false)
|
||||
stats.putAll(_context.profileManager().summarizePeers(_publishedStats));
|
||||
|
||||
// provide cover for developers, change to false or comment out below after .32 is out
|
||||
boolean commentMeOutInDot32 = RouterVersion.VERSION.equals("0.6.1.31");
|
||||
includeThroughput(stats);
|
||||
if (commentMeOutInDot32) {
|
||||
includeRate("router.invalidMessageTime", stats, new long[] { 10*60*1000 });
|
||||
includeRate("router.duplicateMessageId", stats, new long[] { 24*60*60*1000 });
|
||||
//includeRate("tunnel.duplicateIV", stats, new long[] { 24*60*60*1000 });
|
||||
includeRate("tunnel.fragmentedDropped", stats, new long[] { 10*60*1000, 3*60*60*1000 });
|
||||
}
|
||||
//includeRate("tunnel.fullFragments", stats, new long[] { 10*60*1000, 3*60*60*1000 });
|
||||
//includeRate("tunnel.smallFragments", stats, new long[] { 10*60*1000, 3*60*60*1000 });
|
||||
includeRate("tunnel.testFailedTime", stats, new long[] { 10*60*1000 });
|
||||
@@ -141,6 +145,7 @@ public class StatisticsManager implements Service {
|
||||
includeRate("tunnel.buildSuccess", stats, new long[] { 60*60*1000 });
|
||||
|
||||
//includeRate("tunnel.batchDelaySent", stats, new long[] { 10*60*1000, 60*60*1000 });
|
||||
if (commentMeOutInDot32)
|
||||
includeRate("tunnel.batchMultipleCount", stats, new long[] { 10*60*1000, 60*60*1000 });
|
||||
includeRate("tunnel.corruptMessage", stats, new long[] { 60*60*1000l, 3*60*60*1000l });
|
||||
|
||||
@@ -150,6 +155,7 @@ public class StatisticsManager implements Service {
|
||||
|
||||
includeRate("router.fastPeers", stats, new long[] { 60*60*1000 });
|
||||
|
||||
if (commentMeOutInDot32) {
|
||||
includeRate("udp.statusOK", stats, new long[] { 20*60*1000 });
|
||||
includeRate("udp.statusDifferent", stats, new long[] { 20*60*1000 });
|
||||
includeRate("udp.statusReject", stats, new long[] { 20*60*1000 });
|
||||
@@ -157,6 +163,7 @@ public class StatisticsManager implements Service {
|
||||
includeRate("udp.statusKnownCharlie", stats, new long[] { 1*60*1000, 10*60*1000 });
|
||||
includeRate("udp.addressUpdated", stats, new long[] { 1*60*1000 });
|
||||
includeRate("udp.addressTestInsteadOfUpdate", stats, new long[] { 1*60*1000 });
|
||||
}
|
||||
|
||||
includeRate("clock.skew", stats, new long[] { 10*60*1000, 3*60*60*1000, 24*60*60*1000 });
|
||||
|
||||
@@ -164,12 +171,15 @@ public class StatisticsManager implements Service {
|
||||
//includeRate("jobQueue.jobRunSlow", stats, new long[] { 10*60*1000l, 60*60*1000l });
|
||||
includeRate("crypto.elGamal.encrypt", stats, new long[] { 60*1000, 60*60*1000 });
|
||||
includeRate("tunnel.participatingTunnels", stats, new long[] { 5*60*1000, 60*60*1000 });
|
||||
if (commentMeOutInDot32)
|
||||
includeRate("tunnel.testSuccessTime", stats, new long[] { 10*60*1000l });
|
||||
includeRate("client.sendAckTime", stats, new long[] { 60*60*1000 }, true);
|
||||
if (commentMeOutInDot32) {
|
||||
includeRate("udp.sendConfirmTime", stats, new long[] { 10*60*1000 });
|
||||
includeRate("udp.sendVolleyTime", stats, new long[] { 10*60*1000 });
|
||||
includeRate("udp.ignoreRecentDuplicate", stats, new long[] { 60*1000 });
|
||||
includeRate("udp.congestionOccurred", stats, new long[] { 10*60*1000 });
|
||||
}
|
||||
//includeRate("stream.con.sendDuplicateSize", stats, new long[] { 60*60*1000 });
|
||||
//includeRate("stream.con.receiveDuplicateSize", stats, new long[] { 60*60*1000 });
|
||||
|
||||
@@ -178,9 +188,11 @@ public class StatisticsManager implements Service {
|
||||
if (publishedUptime < 60*60*1000) publishedUptime = 60*60*1000;
|
||||
|
||||
stats.setProperty("stat_uptime", DataHelper.formatDuration(publishedUptime));
|
||||
if (commentMeOutInDot32)
|
||||
stats.setProperty("stat__rateKey", "avg;maxAvg;pctLifetime;[sat;satLim;maxSat;maxSatLim;][num;lifetimeFreq;maxFreq]");
|
||||
|
||||
includeRate("tunnel.buildRequestTime", stats, new long[] { 60*1000, 10*60*1000 });
|
||||
if (commentMeOutInDot32)
|
||||
includeRate("tunnel.decryptRequestTime", stats, new long[] { 60*1000, 10*60*1000 });
|
||||
includeRate("tunnel.buildClientExpire", stats, new long[] { 60*1000, 10*60*1000 });
|
||||
includeRate("tunnel.buildClientReject", stats, new long[] { 60*1000, 10*60*1000 });
|
||||
@@ -189,8 +201,10 @@ public class StatisticsManager implements Service {
|
||||
includeRate("tunnel.buildExploratoryReject", stats, new long[] { 60*1000, 10*60*1000 });
|
||||
includeRate("tunnel.buildExploratorySuccess", stats, new long[] { 60*1000, 10*60*1000 });
|
||||
includeRate("tunnel.rejectTimeout", stats, new long[] { 60*1000, 10*60*1000 });
|
||||
if (commentMeOutInDot32) {
|
||||
includeRate("udp.packetDequeueTime", stats, new long[] { 60*1000 });
|
||||
includeRate("udp.packetVerifyTime", stats, new long[] { 60*1000 });
|
||||
}
|
||||
|
||||
includeRate("tunnel.rejectOverloaded", stats, new long[] { 60*1000, 10*60*1000 });
|
||||
includeRate("tunnel.acceptLoad", stats, new long[] { 60*1000, 10*60*1000 });
|
||||
|
@@ -255,6 +255,9 @@ public class OutboundClientMessageOneShotJob extends JobImpl {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Right here is where we should use a persistent lease and caching like
|
||||
// we do for outbound tunnel selection below???
|
||||
|
||||
// randomize the ordering (so leases with equal # of failures per next
|
||||
// sort are randomly ordered)
|
||||
Collections.shuffle(leases);
|
||||
@@ -435,39 +438,79 @@ public class OutboundClientMessageOneShotJob extends JobImpl {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Clean out old tunnels from a set.
|
||||
* Caller must synchronize on tc.
|
||||
*/
|
||||
private void cleanTunnelCache(HashMap tc) {
|
||||
List deleteList = new ArrayList();
|
||||
for (Iterator iter = tc.keySet().iterator(); iter.hasNext(); ) {
|
||||
Destination dest = (Destination) iter.next();
|
||||
TunnelInfo tunnel = (TunnelInfo) tc.get(dest);
|
||||
if (!getContext().tunnelManager().isValidTunnel(_from.calculateHash(), tunnel))
|
||||
deleteList.add(dest);
|
||||
}
|
||||
for (Iterator iter = deleteList.iterator(); iter.hasNext(); ) {
|
||||
Destination dest = (Destination) iter.next();
|
||||
tc.remove(dest);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Use the same outbound tunnel as we did for the same destination previously,
|
||||
* if possible, to keep the streaming lib happy
|
||||
* Use two caches - although a cache of a list of tunnels per dest might be
|
||||
* more elegant.
|
||||
* Key the caches just on the dest, not on source+dest, as different sources
|
||||
* simultaneously talking to the same dest is probably rare enough
|
||||
* to not bother separating out.
|
||||
*
|
||||
*/
|
||||
private static HashMap _tunnelCache = new HashMap();
|
||||
private static HashMap _backloggedTunnelCache = new HashMap();
|
||||
private static long _cleanTime = 0;
|
||||
private TunnelInfo selectOutboundTunnel(Destination to) {
|
||||
TunnelInfo tunnel;
|
||||
long now = getContext().clock().now();
|
||||
synchronized (_tunnelCache) {
|
||||
if (now - _cleanTime > 5*60*1000) { // clean out periodically
|
||||
List deleteList = new ArrayList();
|
||||
for (Iterator iter = _tunnelCache.keySet().iterator(); iter.hasNext(); ) {
|
||||
Destination dest = (Destination) iter.next();
|
||||
tunnel = (TunnelInfo) _tunnelCache.get(dest);
|
||||
if (!getContext().tunnelManager().isValidTunnel(_from.calculateHash(), tunnel))
|
||||
deleteList.add(dest);
|
||||
}
|
||||
for (Iterator iter = deleteList.iterator(); iter.hasNext(); ) {
|
||||
Destination dest = (Destination) iter.next();
|
||||
_tunnelCache.remove(dest);
|
||||
}
|
||||
cleanTunnelCache(_tunnelCache);
|
||||
cleanTunnelCache(_backloggedTunnelCache);
|
||||
_cleanTime = now;
|
||||
}
|
||||
/**
|
||||
* If old tunnel is valid and no longer backlogged, use it.
|
||||
* This prevents an active anonymity attack, where a peer could tell
|
||||
* if you were the originator by backlogging the tunnel, then removing the
|
||||
* backlog and seeing if traffic came back or not.
|
||||
*/
|
||||
tunnel = (TunnelInfo) _backloggedTunnelCache.get(to);
|
||||
if (tunnel != null) {
|
||||
if (getContext().tunnelManager().isValidTunnel(_from.calculateHash(), tunnel)) {
|
||||
if (!getContext().commSystem().isBacklogged(tunnel.getPeer(1))) {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Switching back to tunnel " + tunnel + " for dest " + to.calculateHash().toBase64());
|
||||
_backloggedTunnelCache.remove(to);
|
||||
_tunnelCache.put(to, tunnel);
|
||||
return tunnel;
|
||||
} // else still backlogged
|
||||
} else // no longer valid
|
||||
_backloggedTunnelCache.remove(to);
|
||||
}
|
||||
// Use the same tunnel unless backlogged
|
||||
tunnel = (TunnelInfo) _tunnelCache.get(to);
|
||||
if (tunnel != null) {
|
||||
if (getContext().tunnelManager().isValidTunnel(_from.calculateHash(), tunnel))
|
||||
return(tunnel);
|
||||
else
|
||||
_tunnelCache.remove(to);
|
||||
if (getContext().tunnelManager().isValidTunnel(_from.calculateHash(), tunnel)) {
|
||||
if (tunnel.getLength() <= 1 || !getContext().commSystem().isBacklogged(tunnel.getPeer(1)))
|
||||
return tunnel;
|
||||
// backlogged
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Switching from backlogged " + tunnel + " for dest " + to.calculateHash().toBase64());
|
||||
_backloggedTunnelCache.put(to, tunnel);
|
||||
} // else no longer valid
|
||||
_tunnelCache.remove(to);
|
||||
}
|
||||
// Pick a new tunnel
|
||||
tunnel = selectOutboundTunnel();
|
||||
if (tunnel != null)
|
||||
_tunnelCache.put(to, tunnel);
|
||||
|
@@ -66,9 +66,14 @@ class PersistentDataStore extends TransientDataStore {
|
||||
public void put(Hash key, DataStructure data) {
|
||||
if ( (data == null) || (key == null) ) return;
|
||||
super.put(key, data);
|
||||
_writer.queue(key, data);
|
||||
// Don't bother writing LeaseSets to disk
|
||||
if (data instanceof RouterInfo)
|
||||
_writer.queue(key, data);
|
||||
}
|
||||
|
||||
/*
|
||||
* We don't store leasesets here anymore, use the TransientDataStore count
|
||||
*
|
||||
public int countLeaseSets() {
|
||||
File dbDir = null;
|
||||
try {
|
||||
@@ -84,6 +89,7 @@ class PersistentDataStore extends TransientDataStore {
|
||||
else
|
||||
return leaseSetFiles.length;
|
||||
}
|
||||
*/
|
||||
|
||||
private void accept(LeaseSet ls) {
|
||||
super.put(ls.getDestination().calculateHash(), ls);
|
||||
@@ -103,7 +109,7 @@ class PersistentDataStore extends TransientDataStore {
|
||||
}
|
||||
public String getName() { return "Remove Key"; }
|
||||
public void runJob() {
|
||||
_log.info("Removing key " + _key, getAddedBy());
|
||||
_log.info("Removing key " + _key /* , getAddedBy() */);
|
||||
try {
|
||||
File dbDir = getDbDir();
|
||||
removeFile(_key, dbDir);
|
||||
@@ -113,6 +119,9 @@ class PersistentDataStore extends TransientDataStore {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Queue up writes, write up to 300 files every 10 minutes
|
||||
*/
|
||||
private class Writer implements Runnable {
|
||||
private Map _keys;
|
||||
private List _keyOrder;
|
||||
@@ -137,12 +146,15 @@ class PersistentDataStore extends TransientDataStore {
|
||||
public void run() {
|
||||
Hash key = null;
|
||||
DataStructure data = null;
|
||||
int count = 0;
|
||||
while (true) { // hmm, probably want a shutdown handle... though this is a daemon thread
|
||||
try {
|
||||
synchronized (_keys) {
|
||||
if (_keyOrder.size() <= 0) {
|
||||
count = 0;
|
||||
_keys.wait();
|
||||
} else {
|
||||
count++;
|
||||
key = (Hash)_keyOrder.remove(0);
|
||||
data = (DataStructure)_keys.remove(key);
|
||||
}
|
||||
@@ -153,7 +165,10 @@ class PersistentDataStore extends TransientDataStore {
|
||||
write(key, data);
|
||||
key = null;
|
||||
data = null;
|
||||
try { Thread.sleep(10*1000); } catch (InterruptedException ie) {}
|
||||
if (count >= 300)
|
||||
count = 0;
|
||||
if (count == 0)
|
||||
try { Thread.sleep(10*60*1000); } catch (InterruptedException ie) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -227,6 +242,7 @@ class PersistentDataStore extends TransientDataStore {
|
||||
int routerCount = 0;
|
||||
try {
|
||||
File dbDir = getDbDir();
|
||||
/****
|
||||
if (getContext().router().getUptime() < 10*60*1000) {
|
||||
File leaseSetFiles[] = dbDir.listFiles(LeaseSetFilter.getInstance());
|
||||
if (leaseSetFiles != null) {
|
||||
@@ -237,6 +253,7 @@ class PersistentDataStore extends TransientDataStore {
|
||||
}
|
||||
}
|
||||
}
|
||||
****/
|
||||
File routerInfoFiles[] = dbDir.listFiles(RouterInfoFilter.getInstance());
|
||||
if (routerInfoFiles != null) {
|
||||
routerCount += routerInfoFiles.length;
|
||||
@@ -259,6 +276,7 @@ class PersistentDataStore extends TransientDataStore {
|
||||
}
|
||||
}
|
||||
|
||||
/****
|
||||
private class ReadLeaseJob extends JobImpl {
|
||||
private File _leaseFile;
|
||||
private Hash _key;
|
||||
@@ -313,6 +331,7 @@ class PersistentDataStore extends TransientDataStore {
|
||||
}
|
||||
}
|
||||
}
|
||||
****/
|
||||
|
||||
private class ReadRouterJob extends JobImpl {
|
||||
private File _routerFile;
|
||||
|
@@ -60,8 +60,17 @@ class TransientDataStore implements DataStore {
|
||||
}
|
||||
}
|
||||
|
||||
public int countLeaseSets() { return 0; }
|
||||
|
||||
public int countLeaseSets() {
|
||||
int count = 0;
|
||||
synchronized (_data) {
|
||||
for (Iterator iter = _data.values().iterator(); iter.hasNext();) {
|
||||
DataStructure data = (DataStructure)iter.next();
|
||||
if (data instanceof LeaseSet)
|
||||
count++;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
/** nothing published more than 5 minutes in the future */
|
||||
private final static long MAX_FUTURE_PUBLISH_DATE = 5*60*1000;
|
||||
|
@@ -13,6 +13,7 @@ import java.util.Set;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import net.i2p.data.Hash;
|
||||
import net.i2p.data.RouterInfo;
|
||||
import net.i2p.router.RouterContext;
|
||||
|
||||
/**
|
||||
@@ -52,7 +53,7 @@ class ProfileOrganizerRenderer {
|
||||
buf.append("<table border=\"1\">");
|
||||
buf.append("<tr>");
|
||||
buf.append("<td><b>Peer</b> (").append(order.size()).append(", hiding ").append(peers.size()-order.size()).append(")</td>");
|
||||
buf.append("<td><b>Groups</b></td>");
|
||||
buf.append("<td><b>Groups (Caps)</b></td>");
|
||||
buf.append("<td><b>Speed</b></td>");
|
||||
buf.append("<td><b>Capacity</b></td>");
|
||||
buf.append("<td><b>Integration</b></td>");
|
||||
@@ -109,6 +110,9 @@ class ProfileOrganizerRenderer {
|
||||
default: buf.append("Failing"); break;
|
||||
}
|
||||
if (isIntegrated) buf.append(", Integrated");
|
||||
RouterInfo info = _context.netDb().lookupRouterInfoLocally(peer);
|
||||
if (info != null)
|
||||
buf.append(" (" + info.getCapabilities() + ")");
|
||||
|
||||
buf.append("<td align=\"right\">").append(num(prof.getSpeedValue()));
|
||||
//buf.append('/').append(num(prof.getOldSpeedValue()));
|
||||
@@ -123,7 +127,9 @@ class ProfileOrganizerRenderer {
|
||||
buf.append("</tr>");
|
||||
}
|
||||
buf.append("</table>");
|
||||
buf.append("<i>Definitions:<ul>");
|
||||
buf.append("<p><i>Definitions:<ul>");
|
||||
buf.append("<li><b>groups</b>: as determined by the profile organizer</li>");
|
||||
buf.append("<li><b>caps</b>: capabilities in the netDb, not used to determine profiles</li>");
|
||||
buf.append("<li><b>speed</b>: peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel</li>");
|
||||
buf.append("<li><b>capacity</b>: how many tunnels can we ask them to join in an hour?</li>");
|
||||
buf.append("<li><b>integration</b>: how many new peers have they told us about lately?</li>");
|
||||
@@ -131,8 +137,8 @@ class ProfileOrganizerRenderer {
|
||||
buf.append("</ul></i>");
|
||||
buf.append("Red peers prefixed with '--' means the peer is failing, and blue peers prefixed ");
|
||||
buf.append("with '++' means we've sent or received a message from them ");
|
||||
buf.append("in the last five minutes</i><br />");
|
||||
buf.append("<b>Thresholds:</b><br />");
|
||||
buf.append("in the last five minutes.</i><br />");
|
||||
buf.append("<p><b>Thresholds:</b><br />");
|
||||
buf.append("<b>Speed:</b> ").append(num(_organizer.getSpeedThreshold())).append(" (").append(fast).append(" fast peers)<br />");
|
||||
buf.append("<b>Capacity:</b> ").append(num(_organizer.getCapacityThreshold())).append(" (").append(reliable).append(" high capacity peers)<br />");
|
||||
buf.append("<b>Integration:</b> ").append(num(_organizer.getIntegrationThreshold())).append(" (").append(integrated).append(" well integrated peers)<br />");
|
||||
|
@@ -31,11 +31,11 @@ class FIFOBandwidthRefiller implements Runnable {
|
||||
public static final String PROP_OUTBOUND_BANDWIDTH_PEAK = "i2np.bandwidth.outboundBurstKBytes";
|
||||
//public static final String PROP_REPLENISH_FREQUENCY = "i2np.bandwidth.replenishFrequencyMs";
|
||||
|
||||
// no longer allow unlimited bandwidth - the user must specify a value, and if they do not, it is 16KBps
|
||||
public static final int DEFAULT_INBOUND_BANDWIDTH = 16;
|
||||
// no longer allow unlimited bandwidth - the user must specify a value, and if they do not, it is 32/16KBps
|
||||
public static final int DEFAULT_INBOUND_BANDWIDTH = 32;
|
||||
public static final int DEFAULT_OUTBOUND_BANDWIDTH = 16;
|
||||
public static final int DEFAULT_INBOUND_BURST_BANDWIDTH = 16;
|
||||
public static final int DEFAULT_OUTBOUND_BURST_BANDWIDTH = 16;
|
||||
public static final int DEFAULT_INBOUND_BURST_BANDWIDTH = 48;
|
||||
public static final int DEFAULT_OUTBOUND_BURST_BANDWIDTH = 32;
|
||||
|
||||
public static final int DEFAULT_BURST_SECONDS = 60;
|
||||
|
||||
|
@@ -555,7 +555,8 @@ public class EventPumper implements Runnable {
|
||||
con.setKey(key);
|
||||
try {
|
||||
NTCPAddress naddr = con.getRemoteAddress();
|
||||
if (naddr.getPort() <= 0) throw new IOException("Invalid NTCP address: " + naddr);
|
||||
if (naddr.getPort() <= 0)
|
||||
throw new IOException("Invalid NTCP address: " + naddr);
|
||||
InetSocketAddress saddr = new InetSocketAddress(naddr.getHost(), naddr.getPort());
|
||||
boolean connected = con.getChannel().connect(saddr);
|
||||
if (connected) {
|
||||
|
@@ -268,8 +268,8 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
|
||||
try { wantsWrite = ( (_conKey.interestOps() & SelectionKey.OP_WRITE) != 0); } catch (Exception e) {}
|
||||
int blocks = 0;
|
||||
synchronized (_writeBufs) { blocks = _writeBufs.size(); }
|
||||
if (_log.shouldLog(Log.ERROR))
|
||||
_log.error("Too backlogged for too long (" + _consecutiveBacklog + " messages for " + DataHelper.formatDuration(queueTime()) + ", sched? " + wantsWrite + ", blocks: " + blocks + ") sending to " + _remotePeer.calculateHash().toBase64());
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Too backlogged for too long (" + _consecutiveBacklog + " messages for " + DataHelper.formatDuration(queueTime()) + ", sched? " + wantsWrite + ", blocks: " + blocks + ") sending to " + _remotePeer.calculateHash().toBase64());
|
||||
_context.statManager().addRateData("ntcp.closeOnBacklog", getUptime(), getUptime());
|
||||
close();
|
||||
}
|
||||
@@ -325,10 +325,12 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
|
||||
int writeBufs = 0;
|
||||
synchronized (_writeBufs) { writeBufs = _writeBufs.size(); }
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Too backlogged: queue time " + queueTime + " and the size is " + size
|
||||
try {
|
||||
_log.warn("Too backlogged: queue time " + queueTime + " and the size is " + size
|
||||
+ ", wantsWrite? " + (0 != (_conKey.interestOps()&SelectionKey.OP_WRITE))
|
||||
+ ", currentOut set? " + currentOutboundSet
|
||||
+ ", writeBufs: " + writeBufs + " on " + toString());
|
||||
} catch (Exception e) {} // java.nio.channels.CancelledKeyException
|
||||
_context.statManager().addRateData("ntcp.sendBacklogTime", queueTime, size);
|
||||
return true;
|
||||
//} else if (size > 32) { // another arbitrary limit.
|
||||
|
@@ -167,8 +167,7 @@ public class InboundEstablishState {
|
||||
int off = 0;
|
||||
System.arraycopy(_receivedX, 0, signed, off, _receivedX.length);
|
||||
off += _receivedX.length;
|
||||
if (_sentY == null)
|
||||
_sentY = getSentY();
|
||||
getSentY();
|
||||
System.arraycopy(_sentY, 0, signed, off, _sentY.length);
|
||||
off += _sentY.length;
|
||||
System.arraycopy(_aliceIP, 0, signed, off, _aliceIP.length);
|
||||
@@ -300,6 +299,7 @@ public class InboundEstablishState {
|
||||
off = 0;
|
||||
System.arraycopy(_receivedX, 0, signed, off, _receivedX.length);
|
||||
off += _receivedX.length;
|
||||
getSentY();
|
||||
System.arraycopy(_sentY, 0, signed, off, _sentY.length);
|
||||
off += _sentY.length;
|
||||
System.arraycopy(_aliceIP, 0, signed, off, _aliceIP.length);
|
||||
|
@@ -80,7 +80,7 @@ public class OutboundMessageDistributor {
|
||||
_target = target;
|
||||
_tunnel = id;
|
||||
}
|
||||
public String getName() { return "distribute outbound message"; }
|
||||
public String getName() { return "Distribute outbound message"; }
|
||||
public void runJob() {
|
||||
RouterInfo info = getContext().netDb().lookupRouterInfoLocally(_target);
|
||||
if (info != null) {
|
||||
|
@@ -338,14 +338,19 @@ public class TunnelDispatcher implements Service {
|
||||
_log.debug("removing " + cfg);
|
||||
|
||||
boolean removed = false;
|
||||
int numParticipants = 0;
|
||||
synchronized (_participatingConfig) {
|
||||
removed = (null != _participatingConfig.remove(recvId));
|
||||
numParticipants = _participatingConfig.size();
|
||||
}
|
||||
if (!removed) {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Participating tunnel, but no longer listed in participatingConfig? " + cfg);
|
||||
}
|
||||
|
||||
_context.statManager().addRateData("tunnel.participatingTunnels", numParticipants, 0);
|
||||
_context.statManager().addRateData("tunnel.participatingMessageCount", cfg.getProcessedMessagesCount(), 10*60*1000);
|
||||
|
||||
synchronized (_participants) {
|
||||
removed = (null != _participants.remove(recvId));
|
||||
}
|
||||
@@ -357,8 +362,6 @@ public class TunnelDispatcher implements Service {
|
||||
synchronized (_outboundEndpoints) {
|
||||
removed = (null != _outboundEndpoints.remove(recvId));
|
||||
}
|
||||
|
||||
_context.statManager().addRateData("tunnel.participatingMessageCount", cfg.getProcessedMessagesCount(), 10*60*1000);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -635,32 +638,41 @@ public class TunnelDispatcher implements Service {
|
||||
_times = new ArrayList(128);
|
||||
}
|
||||
|
||||
private static final int LEAVE_BATCH_TIME = 10*1000;
|
||||
public void add(HopConfig cfg) {
|
||||
Long dropTime = new Long(cfg.getExpiration() + 2*Router.CLOCK_FUDGE_FACTOR);
|
||||
Long dropTime = new Long(cfg.getExpiration() + 2*Router.CLOCK_FUDGE_FACTOR + LEAVE_BATCH_TIME);
|
||||
boolean noTunnels;
|
||||
synchronized (LeaveTunnel.this) {
|
||||
noTunnels = _configs.size() <= 0;
|
||||
_configs.add(cfg);
|
||||
_times.add(dropTime);
|
||||
}
|
||||
|
||||
// Make really sure we queue or requeue the job only when we have to, or else bad things happen.
|
||||
// Locking around this part may not be sufficient but there was nothing before.
|
||||
// Symptom is the Leave Participant job not running for 12m, leading to seesaw participating tunnel count
|
||||
|
||||
long oldAfter = getTiming().getStartAfter();
|
||||
long oldStart = getTiming().getActualStart();
|
||||
if ( noTunnels || (oldAfter <= 0) ||
|
||||
(oldAfter < getContext().clock().now() && oldAfter <= oldStart) || // if oldAfter > oldStart, it's late but it will run, so don't do this (race)
|
||||
(oldAfter >= dropTime.longValue()) ) {
|
||||
getTiming().setStartAfter(dropTime.longValue());
|
||||
getContext().jobQueue().addJob(LeaveTunnel.this);
|
||||
} else {
|
||||
// already scheduled for the future, and before this expiration
|
||||
}
|
||||
}
|
||||
if (_log.shouldLog(Log.INFO)) {
|
||||
long now = getContext().clock().now();
|
||||
_log.info("Scheduling leave in " + DataHelper.formatDuration(dropTime.longValue()-now) +": " + cfg);
|
||||
}
|
||||
|
||||
long oldAfter = getTiming().getStartAfter();
|
||||
if ( (oldAfter <= 0) || (oldAfter < getContext().clock().now()) || (oldAfter >= dropTime.longValue()) ) {
|
||||
getTiming().setStartAfter(dropTime.longValue());
|
||||
getContext().jobQueue().addJob(LeaveTunnel.this);
|
||||
} else {
|
||||
// already scheduled for the future, and before this expiration
|
||||
}
|
||||
}
|
||||
|
||||
public String getName() { return "Leave participant"; }
|
||||
public void runJob() {
|
||||
HopConfig cur = null;
|
||||
Long nextTime = null;
|
||||
long now = getContext().clock().now();
|
||||
long now = getContext().clock().now() + LEAVE_BATCH_TIME; // leave all expiring in next 10 sec
|
||||
while (true) {
|
||||
synchronized (LeaveTunnel.this) {
|
||||
if (_configs.size() <= 0)
|
||||
@@ -685,8 +697,10 @@ public class TunnelDispatcher implements Service {
|
||||
}
|
||||
|
||||
if (nextTime != null) {
|
||||
getTiming().setStartAfter(nextTime.longValue());
|
||||
getContext().jobQueue().addJob(LeaveTunnel.this);
|
||||
synchronized (LeaveTunnel.this) {
|
||||
getTiming().setStartAfter(nextTime.longValue());
|
||||
getContext().jobQueue().addJob(LeaveTunnel.this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -224,6 +224,10 @@ class BuildHandler {
|
||||
for (int i = 0; i < cfg.getLength(); i++) {
|
||||
Hash peer = cfg.getPeer(i);
|
||||
int record = order.indexOf(new Integer(i));
|
||||
if (record < 0) {
|
||||
_log.error("Bad status index " + i);
|
||||
return;
|
||||
}
|
||||
int howBad = statuses[record];
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
_log.info(msg.getUniqueId() + ": Peer " + peer.toBase64() + " replied with status " + howBad);
|
||||
|
@@ -19,31 +19,17 @@ class ExpireJob extends JobImpl {
|
||||
// so we rebuild out of sync. otoh, we will honor tunnel messages on it
|
||||
// up through the full lifetime of the tunnel, plus a clock skew, since
|
||||
// others may be sending to the published lease expirations
|
||||
// Also skew the inbound away from the outbound
|
||||
long expire = cfg.getExpiration();
|
||||
_dropAfter = expire + Router.CLOCK_FUDGE_FACTOR;
|
||||
expire -= ctx.random().nextLong(5*60*1000);
|
||||
expire -= ctx.random().nextLong(60*1000);
|
||||
if (_pool.getSettings().isInbound())
|
||||
expire -= ctx.random().nextLong(15*1000);
|
||||
cfg.setExpiration(expire);
|
||||
getTiming().setStartAfter(expire);
|
||||
}
|
||||
public String getName() {
|
||||
if (_pool.getSettings().isExploratory()) {
|
||||
if (_pool.getSettings().isInbound()) {
|
||||
return "Expire exploratory inbound tunnel";
|
||||
} else {
|
||||
return "Expire exploratory outbound tunnel";
|
||||
}
|
||||
} else {
|
||||
StringBuffer rv = new StringBuffer(32);
|
||||
if (_pool.getSettings().isInbound())
|
||||
rv.append("Expire inbound client tunnel for ");
|
||||
else
|
||||
rv.append("Expire outbound client tunnel for ");
|
||||
if (_pool.getSettings().getDestinationNickname() != null)
|
||||
rv.append(_pool.getSettings().getDestinationNickname());
|
||||
else
|
||||
rv.append(_pool.getSettings().getDestination().toBase64().substring(0,4));
|
||||
return rv.toString();
|
||||
}
|
||||
return "Expire tunnel";
|
||||
}
|
||||
public void runJob() {
|
||||
if (!_leaseUpdated) {
|
||||
|
@@ -43,9 +43,11 @@ public abstract class TunnelPeerSelector {
|
||||
else
|
||||
length -= off;
|
||||
}
|
||||
if (length < 0)
|
||||
length = 0;
|
||||
}
|
||||
if (length < 0)
|
||||
length = 0;
|
||||
if (length > 8) // as documented in tunnel.html
|
||||
length = 8;
|
||||
/*
|
||||
if ( (ctx.tunnelManager().getOutboundTunnelCount() <= 0) ||
|
||||
(ctx.tunnelManager().getFreeTunnelCount() <= 0) ) {
|
||||
|
@@ -1,5 +1,6 @@
|
||||
package net.i2p.router.tunnel.pool;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
@@ -16,6 +17,8 @@ import net.i2p.router.RouterContext;
|
||||
import net.i2p.router.TunnelPoolSettings;
|
||||
import net.i2p.router.TunnelInfo;
|
||||
import net.i2p.router.tunnel.HopConfig;
|
||||
import net.i2p.stat.Rate;
|
||||
import net.i2p.stat.RateStat;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
/**
|
||||
@@ -36,7 +39,8 @@ public class TunnelPool {
|
||||
private long _started;
|
||||
private long _lastRateUpdate;
|
||||
private long _lastLifetimeProcessed;
|
||||
private String _rateName;
|
||||
private final String _rateName;
|
||||
private static final int TUNNEL_LIFETIME = 10*60*1000;
|
||||
|
||||
public TunnelPool(RouterContext ctx, TunnelPoolManager mgr, TunnelPoolSettings settings, TunnelPeerSelector sel) {
|
||||
_context = ctx;
|
||||
@@ -148,25 +152,46 @@ public class TunnelPool {
|
||||
|
||||
// if there are nonzero hop tunnels and the zero hop tunnels are fallbacks,
|
||||
// avoid the zero hop tunnels
|
||||
TunnelInfo backloggedTunnel = null;
|
||||
if (avoidZeroHop) {
|
||||
for (int i = 0; i < _tunnels.size(); i++) {
|
||||
TunnelInfo info = (TunnelInfo)_tunnels.get(i);
|
||||
if ( (info.getLength() > 1) && (info.getExpiration() > _context.clock().now()) ) {
|
||||
_lastSelected = info;
|
||||
return info;
|
||||
// avoid outbound tunnels where the 1st hop is backlogged
|
||||
if (_settings.isInbound() || !_context.commSystem().isBacklogged(info.getPeer(1))) {
|
||||
_lastSelected = info;
|
||||
return info;
|
||||
} else {
|
||||
backloggedTunnel = info;
|
||||
}
|
||||
}
|
||||
}
|
||||
// return a random backlogged tunnel
|
||||
if (backloggedTunnel != null) {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn(toString() + ": All tunnels are backlogged");
|
||||
return backloggedTunnel;
|
||||
}
|
||||
}
|
||||
// ok, either we are ok using zero hop tunnels, or only fallback tunnels remain. pick 'em
|
||||
// randomly
|
||||
for (int i = 0; i < _tunnels.size(); i++) {
|
||||
TunnelInfo info = (TunnelInfo)_tunnels.get(i);
|
||||
if (info.getExpiration() > _context.clock().now()) {
|
||||
//_log.debug("Selecting tunnel: " + info + " - " + _tunnels);
|
||||
_lastSelected = info;
|
||||
return info;
|
||||
// avoid outbound tunnels where the 1st hop is backlogged
|
||||
if (_settings.isInbound() || info.getLength() <= 1 ||
|
||||
!_context.commSystem().isBacklogged(info.getPeer(1))) {
|
||||
//_log.debug("Selecting tunnel: " + info + " - " + _tunnels);
|
||||
_lastSelected = info;
|
||||
return info;
|
||||
} else {
|
||||
backloggedTunnel = info;
|
||||
}
|
||||
}
|
||||
}
|
||||
// return a random backlogged tunnel
|
||||
if (backloggedTunnel != null)
|
||||
return backloggedTunnel;
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn(toString() + ": after " + _tunnels.size() + " tries, no unexpired ones were found: " + _tunnels);
|
||||
}
|
||||
@@ -431,6 +456,17 @@ public class TunnelPool {
|
||||
|
||||
public long getLifetimeProcessed() { return _lifetimeProcessed; }
|
||||
|
||||
/**
|
||||
* Keep a separate stat for each type, direction, and length of tunnel.
|
||||
*/
|
||||
private final String buildRateName() {
|
||||
if (_settings.isExploratory())
|
||||
return "tunnel.buildRatio.exploratory." + (_settings.isInbound() ? "in" : "out");
|
||||
else
|
||||
return "tunnel.buildRatio.l" + _settings.getLength() + "v" + _settings.getLengthVariance() +
|
||||
(_settings.isInbound() ? ".in" : ".out");
|
||||
}
|
||||
|
||||
/**
|
||||
* Gather the data to see how many tunnels to build, and then actually compute that value (delegated to
|
||||
* the countHowManyToBuild function below)
|
||||
@@ -445,6 +481,115 @@ public class TunnelPool {
|
||||
|
||||
boolean allowZeroHop = ((getSettings().getLength() + getSettings().getLengthVariance()) <= 0);
|
||||
|
||||
/**
|
||||
* This algorithm builds based on the previous average length of time it takes
|
||||
* to build a tunnel. This average is kept in the _buildRateName stat.
|
||||
* It is a separate stat for each pool, since in and out building use different methods,
|
||||
* and each pool can have separate length and length variance settings.
|
||||
* We add one minute to the stat for safety.
|
||||
*
|
||||
* We linearly increase the number of builds per expiring tunnel from
|
||||
* 1 to PANIC_FACTOR as the time-to-expire gets shorter.
|
||||
*
|
||||
* The stat will be 0 for first 10m of uptime so we will use the conservative algorithm
|
||||
* further below instead. It will take about 30m of uptime to settle down.
|
||||
* Or, if we are building more than 33% of the time something is seriously wrong,
|
||||
* we also use the conservative algorithm instead
|
||||
*
|
||||
**/
|
||||
|
||||
// Compute the average time it takes us to build a single tunnel of this type.
|
||||
int avg = 0;
|
||||
RateStat rs = _context.statManager().getRate(buildRateName());
|
||||
if (rs == null) {
|
||||
// Create the RateStat here rather than at the top because
|
||||
// the user could change the length settings while running
|
||||
_context.statManager().createRateStat(buildRateName(),
|
||||
"Tunnel Build Frequency", "Tunnels",
|
||||
new long[] { TUNNEL_LIFETIME });
|
||||
rs = _context.statManager().getRate(buildRateName());
|
||||
}
|
||||
if (rs != null) {
|
||||
Rate r = rs.getRate(TUNNEL_LIFETIME);
|
||||
if (r != null)
|
||||
avg = (int) ( TUNNEL_LIFETIME * r.getAverageValue() / wanted);
|
||||
}
|
||||
|
||||
if (avg > 0 && avg < TUNNEL_LIFETIME / 3) {
|
||||
final int PANIC_FACTOR = 4; // how many builds to kick off when time gets short
|
||||
avg += 60*1000; // one minute safety factor
|
||||
if (_settings.isExploratory())
|
||||
avg += 60*1000; // two minute safety factor
|
||||
long now = _context.clock().now();
|
||||
|
||||
int expireSoon = 0;
|
||||
int expireLater = 0;
|
||||
int expireTime[];
|
||||
int fallback = 0;
|
||||
synchronized (_tunnels) {
|
||||
expireTime = new int[_tunnels.size()];
|
||||
for (int i = 0; i < _tunnels.size(); i++) {
|
||||
TunnelInfo info = (TunnelInfo)_tunnels.get(i);
|
||||
if (allowZeroHop || (info.getLength() > 1)) {
|
||||
int timeToExpire = (int) (info.getExpiration() - now);
|
||||
if (timeToExpire > 0 && timeToExpire < avg) {
|
||||
expireTime[expireSoon++] = timeToExpire;
|
||||
} else {
|
||||
expireLater++;
|
||||
}
|
||||
} else if (info.getExpiration() - now > avg) {
|
||||
fallback++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int inProgress;
|
||||
synchronized (_inProgress) {
|
||||
inProgress = _inProgress.size();
|
||||
}
|
||||
int remainingWanted = (wanted - expireLater) - inProgress;
|
||||
if (allowZeroHop)
|
||||
remainingWanted -= fallback;
|
||||
|
||||
int rv = 0;
|
||||
int latesttime = 0;
|
||||
if (remainingWanted > 0) {
|
||||
if (remainingWanted > expireSoon) {
|
||||
rv = PANIC_FACTOR * (remainingWanted - expireSoon); // for tunnels completely missing
|
||||
remainingWanted = expireSoon;
|
||||
}
|
||||
// add from 1 to PANIC_FACTOR builds, depending on how late it is
|
||||
// only use the expire times of the latest-expiring tunnels,
|
||||
// the other ones are extras
|
||||
for (int i = 0; i < remainingWanted; i++) {
|
||||
int latestidx = 0;
|
||||
// given the small size of the array this is efficient enough
|
||||
for (int j = 0; j < expireSoon; j++) {
|
||||
if (expireTime[j] > latesttime) {
|
||||
latesttime = expireTime[j];
|
||||
latestidx = j;
|
||||
}
|
||||
}
|
||||
expireTime[latestidx] = 0;
|
||||
if (latesttime > avg / 2)
|
||||
rv += 1;
|
||||
else
|
||||
rv += 2 + ((PANIC_FACTOR - 2) * (((avg / 2) - latesttime) / (avg / 2)));
|
||||
}
|
||||
}
|
||||
|
||||
if (rv > 0 && _log.shouldLog(Log.DEBUG))
|
||||
_log.debug("New Count: rv: " + rv + " allow? " + allowZeroHop
|
||||
+ " avg " + avg + " latesttime " + latesttime
|
||||
+ " soon " + expireSoon + " later " + expireLater
|
||||
+ " std " + wanted + " inProgress " + inProgress + " fallback " + fallback
|
||||
+ " for " + toString());
|
||||
_context.statManager().addRateData(buildRateName(), rv + inProgress, 0);
|
||||
return rv;
|
||||
}
|
||||
|
||||
// fixed, conservative algorithm - starts building 3 1/2 - 6m before expiration
|
||||
// (210 or 270s) + (0..90s random)
|
||||
long expireAfter = _context.clock().now() + _expireSkew; // + _settings.getRebuildPeriod() + _expireSkew;
|
||||
int expire30s = 0;
|
||||
int expire90s = 0;
|
||||
@@ -491,8 +636,11 @@ public class TunnelPool {
|
||||
}
|
||||
}
|
||||
|
||||
return countHowManyToBuild(allowZeroHop, expire30s, expire90s, expire150s, expire210s, expire270s,
|
||||
int rv = countHowManyToBuild(allowZeroHop, expire30s, expire90s, expire150s, expire210s, expire270s,
|
||||
expireLater, wanted, inProgress, fallback);
|
||||
_context.statManager().addRateData(buildRateName(), (rv > 0 || inProgress > 0) ? 1 : 0, 0);
|
||||
return rv;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -590,7 +738,7 @@ public class TunnelPool {
|
||||
if ( (lifetime < 60*1000) && (rv + inProgress + fallback >= standardAmount) )
|
||||
rv = standardAmount - inProgress - fallback;
|
||||
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
if (rv > 0 && _log.shouldLog(Log.DEBUG))
|
||||
_log.debug("Count: rv: " + rv + " allow? " + allowZeroHop
|
||||
+ " 30s " + expire30s + " 90s " + expire90s + " 150s " + expire150s + " 210s " + expire210s
|
||||
+ " 270s " + expire270s + " later " + expireLater
|
||||
|
Reference in New Issue
Block a user