2007-03-22 zzz
* i2psnark tracker handling tweaks: - Add link to tracker details page (Postman only for now, requires bytemonsoon patch) - Add Base URL to tracker list configuration - Web page links built from tracker list Base URLs - Only build and sort tracker list once - Add anonymityWeb tracker to default list - Add tooltip info for TrackerErrs - Stop torrent if not registered with tracker - Mark temp files as delete on exit
This commit is contained in:
@ -588,25 +588,29 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static final String DEFAULT_TRACKERS[] = {
|
private static final String DEFAULT_TRACKERS[] = {
|
||||||
"Postman's tracker", "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"
|
"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 Tracker", "http://E71FRom6PZNEqTN2Lr8P-sr23b7HJVC32KoGnVQjaX6zJiXwhJy2HsXob36Qmj81TYFZdewFZa9mSJ533UZgGyQkXo2ahctg82JKYZfDe5uDxAn1E9YPjxZCWJaFJh0S~UwSs~9AZ7UcauSJIoNtpxrtbmRNVFLqnkEDdLZi26TeucfOmiFmIWnVblLniWv3tG1boE9Abd-6j3FmYVrRucYuepAILYt6katmVNOk6sXmno1Eynrp~~MBuFq0Ko6~jsc2E2CRVYXDhGHEMdt-j6JUz5D7S2RIVzDRqQyAZLKJ7OdQDmI31przzmne1vOqqqLC~1xUumZVIvF~yOeJUGNjJ1Vx0J8i2BQIusn1pQJ6UCB~ZtZZLQtEb8EPVCfpeRi2ri1M5CyOuxN0V5ekmPHrYIBNevuTCRC26NP7ZS5VDgx1~NaC3A-CzJAE6f1QXi0wMI9aywNG5KGzOPifcsih8eyGyytvgLtrZtV7ykzYpPCS-rDfITncpn5hliPUAAAA.i2p/pub/bt/announce.php"
|
, "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 Tracker", "http://uxPWHbK1OIj9HxquaXuhMiIvi21iK0~ZiG9d8G0840ZXIg0r6CbiV71xlsqmdnU6wm0T2LySriM0doW2gUigo-5BNkUquHwOjLROiETnB3ZR0Ml4IGa6QBPn1aAq2d9~g1r1nVjLE~pcFnXB~cNNS7kIhX1d6nLgYVZf0C2cZopEow2iWVUggGGnAA9mHjE86zLEnTvAyhbAMTqDQJhEuLa0ZYSORqzJDMkQt90MV4YMjX1ICY6RfUSFmxEqu0yWTrkHsTtRw48l~dz9wpIgc0a0T9C~eeWvmBFTqlJPtQZwntpNeH~jF7nlYzB58olgV2HHFYpVYD87DYNzTnmNWxCJ5AfDorm6AIUCV2qaE7tZtI1h6fbmGpGlPyW~Kw5GXrRfJwNvr6ajwAVi~bPVnrBwDZezHkfW4slOO8FACPR28EQvaTu9nwhAbqESxV2hCTq6vQSGjuxHeOuzBOEvRWkLKOHWTC09t2DbJ94FSqETmZopTB1ukEmaxRWbKSIaAAAA.i2p/announce.php"
|
, "Gaytorrents", "http://uxPWHbK1OIj9HxquaXuhMiIvi21iK0~ZiG9d8G0840ZXIg0r6CbiV71xlsqmdnU6wm0T2LySriM0doW2gUigo-5BNkUquHwOjLROiETnB3ZR0Ml4IGa6QBPn1aAq2d9~g1r1nVjLE~pcFnXB~cNNS7kIhX1d6nLgYVZf0C2cZopEow2iWVUggGGnAA9mHjE86zLEnTvAyhbAMTqDQJhEuLa0ZYSORqzJDMkQt90MV4YMjX1ICY6RfUSFmxEqu0yWTrkHsTtRw48l~dz9wpIgc0a0T9C~eeWvmBFTqlJPtQZwntpNeH~jF7nlYzB58olgV2HHFYpVYD87DYNzTnmNWxCJ5AfDorm6AIUCV2qaE7tZtI1h6fbmGpGlPyW~Kw5GXrRfJwNvr6ajwAVi~bPVnrBwDZezHkfW4slOO8FACPR28EQvaTu9nwhAbqESxV2hCTq6vQSGjuxHeOuzBOEvRWkLKOHWTC09t2DbJ94FSqETmZopTB1ukEmaxRWbKSIaAAAA.i2p/announce.php=http://gaytorrents.i2p/"
|
||||||
, "NickyB Tracker", "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"
|
, "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's tracker", "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"
|
, "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"
|
// , "The freak's tracker", "http://mHKva9x24E5Ygfey2llR1KyQHv5f8hhMpDMwJDg1U-hABpJ2NrQJd6azirdfaR0OKt4jDlmP2o4Qx0H598~AteyD~RJU~xcWYdcOE0dmJ2e9Y8-HY51ie0B1yD9FtIV72ZI-V3TzFDcs6nkdX9b81DwrAwwFzx0EfNvK1GLVWl59Ow85muoRTBA1q8SsZImxdyZ-TApTVlMYIQbdI4iQRwU9OmmtefrCe~ZOf4UBS9-KvNIqUL0XeBSqm0OU1jq-D10Ykg6KfqvuPnBYT1BYHFDQJXW5DdPKwcaQE4MtAdSGmj1epDoaEBUa9btQlFsM2l9Cyn1hzxqNWXELmx8dRlomQLlV4b586dRzW~fLlOPIGC13ntPXogvYvHVyEyptXkv890jC7DZNHyxZd5cyrKC36r9huKvhQAmNABT2Y~pOGwVrb~RpPwT0tBuPZ3lHYhBFYmD8y~AOhhNHKMLzea1rfwTvovBMByDdFps54gMN1mX4MbCGT4w70vIopS9yAAAA.i2p/bytemonsoon/announce.php"
|
||||||
};
|
};
|
||||||
|
|
||||||
/** comma delimited list of name=announceURL for the trackers to be displayed */
|
/** comma delimited list of name=announceURL=baseURL for the trackers to be displayed */
|
||||||
public static final String PROP_TRACKERS = "i2psnark.trackers";
|
public static final String PROP_TRACKERS = "i2psnark.trackers";
|
||||||
/** unordered map of announceURL to name */
|
private static Map trackerMap = null;
|
||||||
|
/** sorted map of name to announceURL=baseURL */
|
||||||
public Map getTrackers() {
|
public Map getTrackers() {
|
||||||
HashMap rv = new HashMap();
|
if (trackerMap != null) // only do this once, can't be updated while running
|
||||||
|
return trackerMap;
|
||||||
|
Map rv = new TreeMap();
|
||||||
String trackers = _config.getProperty(PROP_TRACKERS);
|
String trackers = _config.getProperty(PROP_TRACKERS);
|
||||||
if ( (trackers == null) || (trackers.trim().length() <= 0) )
|
if ( (trackers == null) || (trackers.trim().length() <= 0) )
|
||||||
trackers = _context.getProperty(PROP_TRACKERS);
|
trackers = _context.getProperty(PROP_TRACKERS);
|
||||||
if ( (trackers == null) || (trackers.trim().length() <= 0) ) {
|
if ( (trackers == null) || (trackers.trim().length() <= 0) ) {
|
||||||
for (int i = 0; i < DEFAULT_TRACKERS.length; i += 2)
|
for (int i = 0; i < DEFAULT_TRACKERS.length; i += 2)
|
||||||
rv.put(DEFAULT_TRACKERS[i+1], DEFAULT_TRACKERS[i]);
|
rv.put(DEFAULT_TRACKERS[i], DEFAULT_TRACKERS[i+1]);
|
||||||
} else {
|
} else {
|
||||||
StringTokenizer tok = new StringTokenizer(trackers, ",");
|
StringTokenizer tok = new StringTokenizer(trackers, ",");
|
||||||
while (tok.hasMoreTokens()) {
|
while (tok.hasMoreTokens()) {
|
||||||
@ -617,11 +621,12 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
String name = pair.substring(0, split).trim();
|
String name = pair.substring(0, split).trim();
|
||||||
String url = pair.substring(split+1).trim();
|
String url = pair.substring(split+1).trim();
|
||||||
if ( (name.length() > 0) && (url.length() > 0) )
|
if ( (name.length() > 0) && (url.length() > 0) )
|
||||||
rv.put(url, name);
|
rv.put(name, url);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return rv;
|
trackerMap = rv;
|
||||||
|
return trackerMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class TorrentFilenameFilter implements FilenameFilter {
|
private static class TorrentFilenameFilter implements FilenameFilter {
|
||||||
|
@ -41,6 +41,7 @@ public class TrackerClient extends I2PThread
|
|||||||
private static final String STARTED_EVENT = "started";
|
private static final String STARTED_EVENT = "started";
|
||||||
private static final String COMPLETED_EVENT = "completed";
|
private static final String COMPLETED_EVENT = "completed";
|
||||||
private static final String STOPPED_EVENT = "stopped";
|
private static final String STOPPED_EVENT = "stopped";
|
||||||
|
private static final String NOT_REGISTERED = "torrent not registered"; //bytemonsoon
|
||||||
|
|
||||||
private final static int SLEEP = 5; // 5 minutes.
|
private final static int SLEEP = 5; // 5 minutes.
|
||||||
private final static int DELAY_MIN = 2000; // 2 secs.
|
private final static int DELAY_MIN = 2000; // 2 secs.
|
||||||
@ -151,6 +152,10 @@ public class TrackerClient extends I2PThread
|
|||||||
("WARNING: Could not contact tracker at '"
|
("WARNING: Could not contact tracker at '"
|
||||||
+ announce + "': " + ioe, Snark.WARNING);
|
+ announce + "': " + ioe, Snark.WARNING);
|
||||||
coordinator.trackerProblems = ioe.getMessage();
|
coordinator.trackerProblems = ioe.getMessage();
|
||||||
|
if (coordinator.trackerProblems.toLowerCase().startsWith(NOT_REGISTERED)) {
|
||||||
|
stop = true;
|
||||||
|
coordinator.snark.stopTorrent();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stop)
|
if (stop)
|
||||||
@ -254,6 +259,10 @@ public class TrackerClient extends I2PThread
|
|||||||
("WARNING: Could not contact tracker at '"
|
("WARNING: Could not contact tracker at '"
|
||||||
+ announce + "': " + ioe, Snark.WARNING);
|
+ announce + "': " + ioe, Snark.WARNING);
|
||||||
coordinator.trackerProblems = ioe.getMessage();
|
coordinator.trackerProblems = ioe.getMessage();
|
||||||
|
if (coordinator.trackerProblems.toLowerCase().startsWith(NOT_REGISTERED)) {
|
||||||
|
stop = true;
|
||||||
|
coordinator.snark.stopTorrent();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -298,6 +307,7 @@ public class TrackerClient extends I2PThread
|
|||||||
if (fetched == null) {
|
if (fetched == null) {
|
||||||
throw new IOException("Error fetching " + s);
|
throw new IOException("Error fetching " + s);
|
||||||
}
|
}
|
||||||
|
fetched.deleteOnExit();
|
||||||
|
|
||||||
InputStream in = null;
|
InputStream in = null;
|
||||||
try {
|
try {
|
||||||
@ -325,7 +335,7 @@ public class TrackerClient extends I2PThread
|
|||||||
* Very lazy byte[] to URL encoder. Just encodes everything, even
|
* Very lazy byte[] to URL encoder. Just encodes everything, even
|
||||||
* "normal" chars.
|
* "normal" chars.
|
||||||
*/
|
*/
|
||||||
static String urlencode(byte[] bs)
|
public static String urlencode(byte[] bs)
|
||||||
{
|
{
|
||||||
StringBuffer sb = new StringBuffer(bs.length*3);
|
StringBuffer sb = new StringBuffer(bs.length*3);
|
||||||
for (int i = 0; i < bs.length; i++)
|
for (int i = 0; i < bs.length; i++)
|
||||||
|
@ -67,14 +67,23 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
out.write("<tr><td width=\"20%\" class=\"snarkTitle\" valign=\"top\" align=\"left\">");
|
out.write("<tr><td width=\"20%\" class=\"snarkTitle\" valign=\"top\" align=\"left\">");
|
||||||
out.write("I2PSnark<br />\n");
|
out.write("I2PSnark<br />\n");
|
||||||
out.write("<table border=\"0\" width=\"100%\">\n");
|
out.write("<table border=\"0\" width=\"100%\">\n");
|
||||||
out.write("<tr><td><a href=\"" + req.getRequestURI() + peerString + "\" class=\"snarkRefresh\">Refresh</a><br />\n");
|
out.write("<tr><td><a href=\"" + req.getRequestURI() + peerString + "\" class=\"snarkRefresh\">Refresh</a>\n");
|
||||||
out.write("<td><a href=\"http://forum.i2p/viewforum.php?f=21\" class=\"snarkRefresh\">Forum</a><br />\n");
|
out.write("<td><a href=\"http://forum.i2p/viewforum.php?f=21\" class=\"snarkRefresh\">Forum</a>\n");
|
||||||
out.write("<tr><td><a href=\"http://de-ebook-archiv.i2p/pub/bt/\" class=\"snarkRefresh\">eBook</a><br />\n");
|
int count = 0;
|
||||||
out.write("<td><a href=\"http://gaytorrents.i2p/\" class=\"snarkRefresh\">GayTorrents</a><br />\n");
|
Map trackers = _manager.getTrackers();
|
||||||
out.write("<tr><td><a href=\"http://nickyb.i2p/bittorrent/\" class=\"snarkRefresh\">NickyB</a><br />\n");
|
for (Iterator iter = trackers.keySet().iterator(); iter.hasNext(); ) {
|
||||||
out.write("<td><a href=\"http://orion.i2p/bt/\" class=\"snarkRefresh\">Orion</a><br />\n");
|
String name = (String)iter.next();
|
||||||
out.write("<tr><td><a href=\"http://tracker.postman.i2p/\" class=\"snarkRefresh\">Postman</a><br />\n");
|
String baseURL = (String)trackers.get(name);
|
||||||
out.write("<td> \n");
|
int e = baseURL.indexOf('=');
|
||||||
|
if (e < 0)
|
||||||
|
continue;
|
||||||
|
baseURL = baseURL.substring(e + 1);
|
||||||
|
if (count++ % 2 == 0)
|
||||||
|
out.write("<tr>");
|
||||||
|
out.write("<td><a href=\"" + baseURL + "\" class=\"snarkRefresh\">" + name + "</a>\n");
|
||||||
|
}
|
||||||
|
if (count % 2 == 1)
|
||||||
|
out.write("<td> \n");
|
||||||
out.write("</table>\n");
|
out.write("</table>\n");
|
||||||
out.write("</td><td width=\"80%\" class=\"snarkMessages\" valign=\"top\" align=\"left\"><pre>");
|
out.write("</td><td width=\"80%\" class=\"snarkMessages\" valign=\"top\" align=\"left\"><pre>");
|
||||||
List msgs = _manager.getMessages();
|
List msgs = _manager.getMessages();
|
||||||
@ -335,7 +344,7 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static final int MAX_DISPLAYED_FILENAME_LENGTH = 60;
|
private static final int MAX_DISPLAYED_FILENAME_LENGTH = 60;
|
||||||
private static final int MAX_DISPLAYED_ERROR_LENGTH = 30;
|
private static final int MAX_DISPLAYED_ERROR_LENGTH = 40;
|
||||||
private void displaySnark(PrintWriter out, Snark snark, String uri, int row, long stats[], boolean showPeers) throws IOException {
|
private void displaySnark(PrintWriter out, Snark snark, String uri, int row, long stats[], boolean showPeers) throws IOException {
|
||||||
String filename = snark.torrent;
|
String filename = snark.torrent;
|
||||||
File f = new File(filename);
|
File f = new File(filename);
|
||||||
@ -388,15 +397,15 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
String statusString = "Unknown";
|
String statusString = "Unknown";
|
||||||
if (err != null) {
|
if (err != null) {
|
||||||
if (isRunning && curPeers > 0 && !showPeers)
|
if (isRunning && curPeers > 0 && !showPeers)
|
||||||
statusString = "TrackerErr (" +
|
statusString = "<a title=\"" + err + "\">TrackerErr</a> (" +
|
||||||
curPeers + "/" + knownPeers +
|
curPeers + "/" + knownPeers +
|
||||||
" <a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">peers</a>)";
|
" <a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">peers</a>)";
|
||||||
else if (isRunning)
|
else if (isRunning)
|
||||||
statusString = "TrackerErr (" + curPeers + "/" + knownPeers + " peers)";
|
statusString = "<a title=\"" + err + "\">TrackerErr (" + curPeers + "/" + knownPeers + " peers)";
|
||||||
else {
|
else {
|
||||||
if (err.length() > MAX_DISPLAYED_ERROR_LENGTH)
|
if (err.length() > MAX_DISPLAYED_ERROR_LENGTH)
|
||||||
err = err.substring(0, MAX_DISPLAYED_ERROR_LENGTH) + "...";
|
err = err.substring(0, MAX_DISPLAYED_ERROR_LENGTH) + "...";
|
||||||
statusString = "TrackerErr (" + err + ")";
|
statusString = "TrackerErr<br />(" + err + ")";
|
||||||
}
|
}
|
||||||
} else if (remaining <= 0) {
|
} else if (remaining <= 0) {
|
||||||
if (isRunning && curPeers > 0 && !showPeers)
|
if (isRunning && curPeers > 0 && !showPeers)
|
||||||
@ -438,6 +447,12 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
out.write(filename);
|
out.write(filename);
|
||||||
if (remaining == 0)
|
if (remaining == 0)
|
||||||
out.write("</a>");
|
out.write("</a>");
|
||||||
|
// temporarily hardcoded for postman, requires bytemonsoon patch for lookup by info_hash
|
||||||
|
if (snark.meta.getAnnounce().startsWith("http://YRgrgTLG")) {
|
||||||
|
out.write(" (<a href=\"http://tracker.postman.i2p/details.php?dllist=1&filelist=1&info_hash=");
|
||||||
|
out.write(TrackerClient.urlencode(snark.meta.getInfoHash()));
|
||||||
|
out.write("\" title=\"Postman Tracker\">Details</a>)");
|
||||||
|
}
|
||||||
out.write("</td>\n\t");
|
out.write("</td>\n\t");
|
||||||
|
|
||||||
out.write("<td valign=\"top\" align=\"right\" class=\"snarkTorrentETA " + rowClass + "\">");
|
out.write("<td valign=\"top\" align=\"right\" class=\"snarkTorrentETA " + rowClass + "\">");
|
||||||
@ -500,7 +515,7 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
client = "Azureus";
|
client = "Azureus";
|
||||||
else
|
else
|
||||||
client = "Unknown";
|
client = "Unknown";
|
||||||
out.write("<font size=-1>" + client + "</font> <tt>" + peer.toString().substring(5, 9) + "</tt>");
|
out.write("<font size=-1>" + client + "</font> <tt>" + peer.toString().substring(5, 9) + "</tt>");
|
||||||
out.write("</td>\n\t");
|
out.write("</td>\n\t");
|
||||||
out.write("<td class=\"snarkTorrentStatus " + rowClass + "\">");
|
out.write("<td class=\"snarkTorrentStatus " + rowClass + "\">");
|
||||||
out.write("</td>\n\t");
|
out.write("</td>\n\t");
|
||||||
@ -578,12 +593,14 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
+ "<input type=\"text\" name=\"baseFile\" size=\"20\" value=\"" + baseFile
|
+ "<input type=\"text\" name=\"baseFile\" size=\"20\" value=\"" + baseFile
|
||||||
+ "\" title=\"File to seed (must be within the specified path)\" /><br />\n");
|
+ "\" title=\"File to seed (must be within the specified path)\" /><br />\n");
|
||||||
out.write("Tracker: <select name=\"announceURL\"><option value=\"\">Select a tracker</option>\n");
|
out.write("Tracker: <select name=\"announceURL\"><option value=\"\">Select a tracker</option>\n");
|
||||||
Map trackers = sort(_manager.getTrackers());
|
Map trackers = _manager.getTrackers();
|
||||||
for (Iterator iter = trackers.keySet().iterator(); iter.hasNext(); ) {
|
for (Iterator iter = trackers.keySet().iterator(); iter.hasNext(); ) {
|
||||||
String name = (String)iter.next();
|
String name = (String)iter.next();
|
||||||
String announceURL = (String)trackers.get(name);
|
String announceURL = (String)trackers.get(name);
|
||||||
// we inject whitespace in sort(...) to guarantee uniqueness, but we can strip it off here
|
int e = announceURL.indexOf('=');
|
||||||
out.write("\t<option value=\"" + announceURL + "\">" + name.trim() + "</option>\n");
|
if (e > 0)
|
||||||
|
announceURL = announceURL.substring(0, e);
|
||||||
|
out.write("\t<option value=\"" + announceURL + "\">" + name + "</option>\n");
|
||||||
}
|
}
|
||||||
out.write("</select>\n");
|
out.write("</select>\n");
|
||||||
out.write("or <input type=\"text\" name=\"announceURLOther\" size=\"50\" value=\"http://\" " +
|
out.write("or <input type=\"text\" name=\"announceURLOther\" size=\"50\" value=\"http://\" " +
|
||||||
@ -592,18 +609,6 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
out.write("</form>\n</span>\n");
|
out.write("</form>\n</span>\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map sort(Map trackers) {
|
|
||||||
TreeMap rv = new TreeMap();
|
|
||||||
for (Iterator iter = trackers.keySet().iterator(); iter.hasNext(); ) {
|
|
||||||
String url = (String)iter.next();
|
|
||||||
String name = (String)trackers.get(url);
|
|
||||||
while (rv.containsKey(name))
|
|
||||||
name = name + " ";
|
|
||||||
rv.put(name, url);
|
|
||||||
}
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void writeConfigForm(PrintWriter out, HttpServletRequest req) throws IOException {
|
private void writeConfigForm(PrintWriter out, HttpServletRequest req) throws IOException {
|
||||||
String uri = req.getRequestURI();
|
String uri = req.getRequestURI();
|
||||||
String dataDir = _manager.getDataDir().getAbsolutePath();
|
String dataDir = _manager.getDataDir().getAbsolutePath();
|
||||||
|
13
history.txt
13
history.txt
@ -1,4 +1,15 @@
|
|||||||
$Id: history.txt,v 1.562 2007-03-17 16:19:37 jrandom Exp $
|
$Id: history.txt,v 1.563 2007-03-18 16:57:03 zzz Exp $
|
||||||
|
|
||||||
|
2007-03-22 zzz
|
||||||
|
* i2psnark tracker handling tweaks:
|
||||||
|
- Add link to tracker details page (Postman only for now, requires bytemonsoon patch)
|
||||||
|
- Add Base URL to tracker list configuration
|
||||||
|
- Web page links built from tracker list Base URLs
|
||||||
|
- Only build and sort tracker list once
|
||||||
|
- Add anonymityWeb tracker to default list
|
||||||
|
- Add tooltip info for TrackerErrs
|
||||||
|
- Stop torrent if not registered with tracker
|
||||||
|
- Mark temp files as delete on exit
|
||||||
|
|
||||||
2007-03-18 zzz
|
2007-03-18 zzz
|
||||||
* i2psnark: Cleanup some handling of saved partial pieces
|
* i2psnark: Cleanup some handling of saved partial pieces
|
||||||
|
@ -15,9 +15,9 @@ import net.i2p.CoreVersion;
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class RouterVersion {
|
public class RouterVersion {
|
||||||
public final static String ID = "$Revision: 1.498 $ $Date: 2007-03-17 20:48:13 $";
|
public final static String ID = "$Revision: 1.499 $ $Date: 2007-03-18 16:57:01 $";
|
||||||
public final static String VERSION = "0.6.1.28";
|
public final static String VERSION = "0.6.1.28";
|
||||||
public final static long BUILD = 1;
|
public final static long BUILD = 2;
|
||||||
public static void main(String args[]) {
|
public static void main(String args[]) {
|
||||||
System.out.println("I2P Router version: " + VERSION + "-" + BUILD);
|
System.out.println("I2P Router version: " + VERSION + "-" + BUILD);
|
||||||
System.out.println("Router ID: " + RouterVersion.ID);
|
System.out.println("Router ID: " + RouterVersion.ID);
|
||||||
|
Reference in New Issue
Block a user