From 9f0a602ce3d2ffb4426fc6f0da0db257fbc90333 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sat, 9 May 2009 14:01:35 +0000 Subject: [PATCH] 2009-05-09 Tatsuhiro Tsujikawa Removed --enable-http-server and --http-server-listen-port options. Added --enable-xml-rpc and --xml-rpc-listen-port instead. The original feature for --enable-http-server that reports download progress in HTML was officially removed. Persist XML-RPC connection if client supports keep-alive. * src/DownloadEngineFactory.cc * src/HttpServerCommand.cc * src/HttpServerResponseCommand.cc * src/Makefile.am * src/Makefile.in * src/OptionHandlerFactory.cc * src/RequestGroupMan.cc * src/main.cc * src/option_processing.cc * src/prefs.cc * src/prefs.h * src/usage_text.h --- ChangeLog | 20 ++++ src/DownloadEngineFactory.cc | 10 +- src/HttpServerCommand.cc | 158 ------------------------------- src/HttpServerResponseCommand.cc | 10 +- src/Makefile.am | 10 +- src/Makefile.in | 27 +++--- src/OptionHandlerFactory.cc | 28 +++--- src/RequestGroupMan.cc | 4 +- src/main.cc | 2 +- src/option_processing.cc | 2 +- src/prefs.cc | 4 +- src/prefs.h | 4 +- src/usage_text.h | 16 ++-- 13 files changed, 83 insertions(+), 212 deletions(-) diff --git a/ChangeLog b/ChangeLog index 80e49f99..f82873c1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,23 @@ +2009-05-09 Tatsuhiro Tsujikawa + + Removed --enable-http-server and --http-server-listen-port + options. Added --enable-xml-rpc and --xml-rpc-listen-port + instead. The original feature for --enable-http-server that + reports download progress in HTML was officially removed. Persist + XML-RPC connection if client supports keep-alive. + * src/DownloadEngineFactory.cc + * src/HttpServerCommand.cc + * src/HttpServerResponseCommand.cc + * src/Makefile.am + * src/Makefile.in + * src/OptionHandlerFactory.cc + * src/RequestGroupMan.cc + * src/main.cc + * src/option_processing.cc + * src/prefs.cc + * src/prefs.h + * src/usage_text.h + 2009-05-09 Tatsuhiro Tsujikawa Added "uris" key to the response of tellStatus command. Added diff --git a/src/DownloadEngineFactory.cc b/src/DownloadEngineFactory.cc index 4a97da44..e45a0414 100644 --- a/src/DownloadEngineFactory.cc +++ b/src/DownloadEngineFactory.cc @@ -63,7 +63,9 @@ #include "SelectEventPoll.h" #include "DlAbortEx.h" #include "FileAllocationEntry.h" -#include "HttpListenCommand.h" +#ifdef ENABLE_XML_RPC +# include "HttpListenCommand.h" +#endif // ENABLE_XML_RPC namespace aria2 { @@ -139,15 +141,17 @@ DownloadEngineFactory::newDownloadEngine(Option* op, stopSec)); } } - if(op->getAsBool(PREF_ENABLE_HTTP_SERVER)) { +#ifdef ENABLE_XML_RPC + if(op->getAsBool(PREF_ENABLE_XML_RPC)) { HttpListenCommand* httpListenCommand = new HttpListenCommand(e->newCUID(), e.get()); - if(httpListenCommand->bindPort(op->getAsInt(PREF_HTTP_SERVER_LISTEN_PORT))){ + if(httpListenCommand->bindPort(op->getAsInt(PREF_XML_RPC_LISTEN_PORT))){ e->addRoutineCommand(httpListenCommand); } else { delete httpListenCommand; } } +#endif // ENABLE_XML_RPC return e; } diff --git a/src/HttpServerCommand.cc b/src/HttpServerCommand.cc index a06e53f9..7d889945 100644 --- a/src/HttpServerCommand.cc +++ b/src/HttpServerCommand.cc @@ -33,12 +33,6 @@ */ /* copyright --> */ #include "HttpServerCommand.h" - -#include -#include -#include -#include - #include "SocketCore.h" #include "DownloadEngine.h" #include "HttpServer.h" @@ -46,12 +40,7 @@ #include "Logger.h" #include "RequestGroup.h" #include "RequestGroupMan.h" -#include "BtContext.h" -#include "Util.h" -#include "HttpServerResponseCommand.h" #include "HttpServerBodyCommand.h" -#include "CheckIntegrityEntry.h" -#include "FileAllocationEntry.h" #include "RecoverableException.h" namespace aria2 { @@ -83,153 +72,6 @@ HttpServerCommand::~HttpServerCommand() _e->deleteSocketForReadCheck(_socket, this); } -class PrintSummaryHtml -{ -private: - std::ostream& _o; - -public: - PrintSummaryHtml(std::ostream& o):_o(o) {} - - void operator()(const SharedHandle& rg) - { - _o << "
getGID() << "\">" - << "[#" << rg->getGID() << "]" - << " FILE:" << "" - << Util::htmlEscape(rg->getFilePath()) << ""; -#ifdef ENABLE_BITTORRENT - SharedHandle btContext = - dynamic_pointer_cast(rg->getDownloadContext()); - if(!btContext.isNull()) { - _o << "
" << " Info Hash:" << btContext->getInfoHashAsString(); - } -#endif // ENABLE_BITTORRENT - _o << "
"; - - TransferStat stat = rg->calculateStat(); - unsigned int eta = 0; - if(rg->getTotalLength() > 0 && stat.getDownloadSpeed() > 0) { - eta = - (rg->getTotalLength()-rg->getCompletedLength())/stat.getDownloadSpeed(); - } -#ifdef ENABLE_BITTORRENT - if(!btContext.isNull() && rg->downloadFinished()) { - _o << "SEEDING" << "(" << "ratio:" - << std::fixed << std::setprecision(1) - << ((stat.getAllTimeUploadLength()*10)/rg->getCompletedLength())/10.0 - << ") "; - } -#endif // ENABLE_BITTORRENT - _o << Util::abbrevSize(rg->getCompletedLength()) - << "B" - << "/" - << Util::abbrevSize(rg->getTotalLength()) - << "B"; - if(rg->getTotalLength() > 0) { - _o << "(" - << 100*rg->getCompletedLength()/rg->getTotalLength() - << "%)"; - } - _o << " " - << "CN:" - << rg->getNumConnection(); - if(!rg->downloadFinished()) { - _o << " " - << "SPD:" - << std::fixed << std::setprecision(2) - << stat.getDownloadSpeed()/1024.0 << "KiB/s"; - } - if(stat.getSessionUploadLength() > 0) { - _o << " " - << "UP:" - << std::fixed << std::setprecision(2) - << stat.getUploadSpeed()/1024.0 << "KiB/s" - << "(" << Util::abbrevSize(stat.getAllTimeUploadLength()) << "B)"; - } - if(eta > 0) { - _o << " " - << "ETA:" - << Util::htmlEscape(Util::secfmt(eta)); - } - _o << "
" - << "
"; - } -}; - -static std::string createResponse(DownloadEngine* e) -{ - std::ostringstream strm; - const std::deque > groups = - e->_requestGroupMan->getRequestGroups(); - std::for_each(groups.begin(), groups.end(), PrintSummaryHtml(strm)); - - { - SharedHandle entry = - e->_fileAllocationMan->getPickedEntry(); - if(!entry.isNull()) { - strm << "
" - << "[FileAlloc:" - << "#" << entry->getRequestGroup()->getGID() << " " - << Util::abbrevSize(entry->getCurrentLength()) - << "B" - << "/" - << Util::abbrevSize(entry->getTotalLength()) - << "B" - << "("; - if(entry->getTotalLength() > 0) { - strm << 100*entry->getCurrentLength()/entry->getTotalLength(); - } else { - strm << "--"; - } - strm << "%)" - << "]"; - if(e->_fileAllocationMan->hasNext()) { - strm << "(" - << e->_fileAllocationMan->countEntryInQueue() - << "waiting...)"; - } - strm << "

"; - } - } -#ifdef ENABLE_MESSAGE_DIGEST - { - SharedHandle entry = - e->_checkIntegrityMan->getPickedEntry(); - if(!entry.isNull()) { - strm << "
" - << "[HashCheck:" - << "#" << entry->getRequestGroup()->getGID() << " " - << Util::abbrevSize(entry->getCurrentLength()) - << "B" - << "/" - << Util::abbrevSize(entry->getTotalLength()) - << "B" - << "(" - << 100*entry->getCurrentLength()/entry->getTotalLength() - << "%)" - << "]"; - if(e->_checkIntegrityMan->hasNext()) { - strm << "(" - << e->_checkIntegrityMan->countEntryInQueue() - << "waiting...)"; - } - strm << "

"; - } - } -#endif // ENABLE_MESSAGE_DIGEST - std::string body = - "" - "" - "" - "" - "aria2" - "" - "

aria2 - Download Progress

"+strm.str()+"" - ""; - return body; -} - bool HttpServerCommand::execute() { if(_e->_requestGroupMan->downloadFinished() || _e->isHaltRequested()) { diff --git a/src/HttpServerResponseCommand.cc b/src/HttpServerResponseCommand.cc index 60d9766e..ca096b93 100644 --- a/src/HttpServerResponseCommand.cc +++ b/src/HttpServerResponseCommand.cc @@ -69,11 +69,11 @@ bool HttpServerResponseCommand::execute() _httpServer->sendResponse(); if(_httpServer->sendBufferIsEmpty()) { logger->info("CUID#%d - HttpServer: all response transmitted.", cuid); -// if(_httpServer->supportsPersistentConnection()) { -// logger->info("CUID#%d - Persist connection.", cuid); -// _e->commands.push_back -// (new HttpServerCommand(cuid, _httpServer, _e, _socket)); -// } + if(_httpServer->supportsPersistentConnection()) { + logger->info("CUID#%d - Persist connection.", cuid); + _e->commands.push_back + (new HttpServerCommand(cuid, _httpServer, _e, _socket)); + } return true; } else { if(_timeout.elapsed(10)) { diff --git a/src/Makefile.am b/src/Makefile.am index 404fc8b0..5ea95636 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -200,10 +200,6 @@ SRCS = Socket.h\ SelectEventPoll.cc SelectEventPoll.h\ SequentialPicker.h\ SequentialDispatcherCommand.h\ - HttpListenCommand.cc HttpListenCommand.h\ - HttpServerCommand.cc HttpServerCommand.h\ - HttpServerResponseCommand.cc HttpServerResponseCommand.h\ - HttpServer.cc HttpServer.h\ PieceSelector.h\ LongestSequencePieceSelector.cc LongestSequencePieceSelector.h\ bitfield.h\ @@ -220,7 +216,11 @@ SRCS += XmlRpcRequestParserController.cc XmlRpcRequestParserController.h\ HttpServerBodyCommand.cc HttpServerBodyCommand.h\ XmlRpcMethod.cc XmlRpcMethod.h\ XmlRpcMethodImpl.cc XmlRpcMethodImpl.h\ - XmlRpcMethodFactory.cc XmlRpcMethodFactory.h + XmlRpcMethodFactory.cc XmlRpcMethodFactory.h\ + HttpListenCommand.cc HttpListenCommand.h\ + HttpServerCommand.cc HttpServerCommand.h\ + HttpServerResponseCommand.cc HttpServerResponseCommand.h\ + HttpServer.cc HttpServer.h endif # ENABLE_XML_RPC if HAVE_LIBXML2 diff --git a/src/Makefile.in b/src/Makefile.in index b909dc12..9a5149a5 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -45,7 +45,11 @@ bin_PROGRAMS = aria2c$(EXEEXT) @ENABLE_XML_RPC_TRUE@ HttpServerBodyCommand.cc HttpServerBodyCommand.h\ @ENABLE_XML_RPC_TRUE@ XmlRpcMethod.cc XmlRpcMethod.h\ @ENABLE_XML_RPC_TRUE@ XmlRpcMethodImpl.cc XmlRpcMethodImpl.h\ -@ENABLE_XML_RPC_TRUE@ XmlRpcMethodFactory.cc XmlRpcMethodFactory.h +@ENABLE_XML_RPC_TRUE@ XmlRpcMethodFactory.cc XmlRpcMethodFactory.h\ +@ENABLE_XML_RPC_TRUE@ HttpListenCommand.cc HttpListenCommand.h\ +@ENABLE_XML_RPC_TRUE@ HttpServerCommand.cc HttpServerCommand.h\ +@ENABLE_XML_RPC_TRUE@ HttpServerResponseCommand.cc HttpServerResponseCommand.h\ +@ENABLE_XML_RPC_TRUE@ HttpServer.cc HttpServer.h @HAVE_LIBXML2_TRUE@am__append_2 = Xml2XmlRpcRequestProcessor.cc Xml2XmlRpcRequestProcessor.h @HAVE_LIBEXPAT_TRUE@am__append_3 = ExpatXmlRpcRequestProcessor.cc ExpatXmlRpcRequestProcessor.h @@ -418,9 +422,6 @@ am__libaria2c_a_SOURCES_DIST = Socket.h SocketCore.cc SocketCore.h \ OptionHandlerException.h bencode.cc bencode.h URIResult.cc \ URIResult.h EventPoll.h SelectEventPoll.cc SelectEventPoll.h \ SequentialPicker.h SequentialDispatcherCommand.h \ - HttpListenCommand.cc HttpListenCommand.h HttpServerCommand.cc \ - HttpServerCommand.h HttpServerResponseCommand.cc \ - HttpServerResponseCommand.h HttpServer.cc HttpServer.h \ PieceSelector.h LongestSequencePieceSelector.cc \ LongestSequencePieceSelector.h bitfield.h BDE.cc BDE.h \ XmlRpcRequestParserController.cc \ @@ -432,7 +433,10 @@ am__libaria2c_a_SOURCES_DIST = Socket.h SocketCore.cc SocketCore.h \ XmlRpcRequestProcessor.h HttpServerBodyCommand.cc \ HttpServerBodyCommand.h XmlRpcMethod.cc XmlRpcMethod.h \ XmlRpcMethodImpl.cc XmlRpcMethodImpl.h XmlRpcMethodFactory.cc \ - XmlRpcMethodFactory.h Xml2XmlRpcRequestProcessor.cc \ + XmlRpcMethodFactory.h HttpListenCommand.cc HttpListenCommand.h \ + HttpServerCommand.cc HttpServerCommand.h \ + HttpServerResponseCommand.cc HttpServerResponseCommand.h \ + HttpServer.cc HttpServer.h Xml2XmlRpcRequestProcessor.cc \ Xml2XmlRpcRequestProcessor.h ExpatXmlRpcRequestProcessor.cc \ ExpatXmlRpcRequestProcessor.h FallocFileAllocationIterator.cc \ FallocFileAllocationIterator.h EpollEventPoll.cc \ @@ -596,7 +600,11 @@ am__libaria2c_a_SOURCES_DIST = Socket.h SocketCore.cc SocketCore.h \ @ENABLE_XML_RPC_TRUE@ HttpServerBodyCommand.$(OBJEXT) \ @ENABLE_XML_RPC_TRUE@ XmlRpcMethod.$(OBJEXT) \ @ENABLE_XML_RPC_TRUE@ XmlRpcMethodImpl.$(OBJEXT) \ -@ENABLE_XML_RPC_TRUE@ XmlRpcMethodFactory.$(OBJEXT) +@ENABLE_XML_RPC_TRUE@ XmlRpcMethodFactory.$(OBJEXT) \ +@ENABLE_XML_RPC_TRUE@ HttpListenCommand.$(OBJEXT) \ +@ENABLE_XML_RPC_TRUE@ HttpServerCommand.$(OBJEXT) \ +@ENABLE_XML_RPC_TRUE@ HttpServerResponseCommand.$(OBJEXT) \ +@ENABLE_XML_RPC_TRUE@ HttpServer.$(OBJEXT) @HAVE_LIBXML2_TRUE@am__objects_2 = \ @HAVE_LIBXML2_TRUE@ Xml2XmlRpcRequestProcessor.$(OBJEXT) @HAVE_LIBEXPAT_TRUE@am__objects_3 = \ @@ -835,9 +843,7 @@ am__objects_26 = SocketCore.$(OBJEXT) Command.$(OBJEXT) \ NsCookieParser.$(OBJEXT) CookieStorage.$(OBJEXT) \ SocketBuffer.$(OBJEXT) OptionHandlerException.$(OBJEXT) \ bencode.$(OBJEXT) URIResult.$(OBJEXT) \ - SelectEventPoll.$(OBJEXT) HttpListenCommand.$(OBJEXT) \ - HttpServerCommand.$(OBJEXT) \ - HttpServerResponseCommand.$(OBJEXT) HttpServer.$(OBJEXT) \ + SelectEventPoll.$(OBJEXT) \ LongestSequencePieceSelector.$(OBJEXT) BDE.$(OBJEXT) \ $(am__objects_1) $(am__objects_2) $(am__objects_3) \ $(am__objects_4) $(am__objects_5) $(am__objects_6) \ @@ -1172,9 +1178,6 @@ SRCS = Socket.h SocketCore.cc SocketCore.h BinaryStream.h Command.cc \ OptionHandlerException.h bencode.cc bencode.h URIResult.cc \ URIResult.h EventPoll.h SelectEventPoll.cc SelectEventPoll.h \ SequentialPicker.h SequentialDispatcherCommand.h \ - HttpListenCommand.cc HttpListenCommand.h HttpServerCommand.cc \ - HttpServerCommand.h HttpServerResponseCommand.cc \ - HttpServerResponseCommand.h HttpServer.cc HttpServer.h \ PieceSelector.h LongestSequencePieceSelector.cc \ LongestSequencePieceSelector.h bitfield.h BDE.cc BDE.h \ $(am__append_1) $(am__append_2) $(am__append_3) \ diff --git a/src/OptionHandlerFactory.cc b/src/OptionHandlerFactory.cc index b4a92f97..91cd928e 100644 --- a/src/OptionHandlerFactory.cc +++ b/src/OptionHandlerFactory.cc @@ -168,15 +168,17 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers() handlers.push_back(op); } #endif // ENABLE_DIRECT_IO +#ifdef ENABLE_XML_RPC { SharedHandle op(new BooleanOptionHandler - (PREF_ENABLE_HTTP_SERVER, - TEXT_ENABLE_HTTP_SERVER, + (PREF_ENABLE_XML_RPC, + TEXT_ENABLE_XML_RPC, V_FALSE, OptionHandler::OPT_ARG)); - op->addTag(TAG_EXPERIMENTAL); + op->addTag(TAG_ADVANCED); handlers.push_back(op); } +#endif // ENABLE_XML_RPC { std::string params[] = { #ifdef HAVE_EPOLL @@ -220,15 +222,6 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers() op->addTag(TAG_BASIC); handlers.push_back(op); } - { - SharedHandle op(new NumberOptionHandler - (PREF_HTTP_SERVER_LISTEN_PORT, - TEXT_HTTP_SERVER_LISTEN_PORT, - "6800", - 1024, UINT16_MAX)); - op->addTag(TAG_EXPERIMENTAL); - handlers.push_back(op); - } { SharedHandle op(new DefaultOptionHandler (PREF_INPUT_FILE, @@ -361,6 +354,17 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers() op->addTag(TAG_ADVANCED); handlers.push_back(op); } +#ifdef ENABLE_XML_RPC + { + SharedHandle op(new NumberOptionHandler + (PREF_XML_RPC_LISTEN_PORT, + TEXT_XML_RPC_LISTEN_PORT, + "6800", + 1024, UINT16_MAX)); + op->addTag(TAG_ADVANCED); + handlers.push_back(op); + } +#endif // ENABLE_XML_RPC // HTTP/FTP options { SharedHandle op(new NumberOptionHandler diff --git a/src/RequestGroupMan.cc b/src/RequestGroupMan.cc index 6e8bbb23..d79d54b7 100644 --- a/src/RequestGroupMan.cc +++ b/src/RequestGroupMan.cc @@ -83,9 +83,11 @@ RequestGroupMan::RequestGroupMan(const RequestGroups& requestGroups, bool RequestGroupMan::downloadFinished() { - if(_option->getAsBool(PREF_ENABLE_HTTP_SERVER)) { +#ifdef ENABLE_XML_RPC + if(_option->getAsBool(PREF_ENABLE_XML_RPC)) { return false; } +#endif // ENABLE_XML_RPC if(!_reservedGroups.empty()) { return false; } diff --git a/src/main.cc b/src/main.cc index e7a58896..1c4210bd 100644 --- a/src/main.cc +++ b/src/main.cc @@ -240,7 +240,7 @@ DownloadResult::RESULT main(int argc, char* argv[]) if( #ifdef ENABLE_XML_RPC - !op->getAsBool(PREF_ENABLE_HTTP_SERVER) && + !op->getAsBool(PREF_ENABLE_XML_RPC) && #endif // ENABLE_XML_RPC requestGroups.empty()) { std::cout << MSG_NO_FILES_TO_DOWNLOAD << std::endl; diff --git a/src/option_processing.cc b/src/option_processing.cc index a3587e5b..713251be 100644 --- a/src/option_processing.cc +++ b/src/option_processing.cc @@ -174,7 +174,7 @@ void option_processing(Option& op, std::deque& uris, } if( #ifdef ENABLE_XML_RPC - !op.getAsBool(PREF_ENABLE_HTTP_SERVER) && + !op.getAsBool(PREF_ENABLE_XML_RPC) && #endif // ENABLE_XML_RPC #ifdef ENABLE_BITTORRENT op.blank(PREF_TORRENT_FILE) && diff --git a/src/prefs.cc b/src/prefs.cc index 0cca4040..4837b853 100644 --- a/src/prefs.cc +++ b/src/prefs.cc @@ -154,9 +154,9 @@ const std::string PREF_EVENT_POLL("event-poll"); const std::string V_EPOLL("epoll"); const std::string V_SELECT("select"); // value: 1*digit -const std::string PREF_HTTP_SERVER_LISTEN_PORT("http-server-listen-port"); +const std::string PREF_XML_RPC_LISTEN_PORT("xml-rpc-listen-port"); // value: true | false -const std::string PREF_ENABLE_HTTP_SERVER("enable-http-server"); +const std::string PREF_ENABLE_XML_RPC("enable-xml-rpc"); // value: true | false const std::string PREF_RESET_URI("reset-uri"); // value: true | false diff --git a/src/prefs.h b/src/prefs.h index c7974c3e..cd69cc9d 100644 --- a/src/prefs.h +++ b/src/prefs.h @@ -158,9 +158,9 @@ extern const std::string PREF_EVENT_POLL; extern const std::string V_EPOLL; extern const std::string V_SELECT; // value: 1*digit -extern const std::string PREF_HTTP_SERVER_LISTEN_PORT; +extern const std::string PREF_XML_RPC_LISTEN_PORT; // value: true | false -extern const std::string PREF_ENABLE_HTTP_SERVER; +extern const std::string PREF_ENABLE_XML_RPC; // value: true | false extern const std::string PREF_RESET_URI; // value: true | false diff --git a/src/usage_text.h b/src/usage_text.h index e3b4962a..6108fa89 100644 --- a/src/usage_text.h +++ b/src/usage_text.h @@ -478,17 +478,13 @@ _(" --use-head[=true|false] Use HEAD method for the first request to the HT " server.") #define TEXT_EVENT_POLL \ _(" --event-poll=POLL Specify the method for polling events.") -#define TEXT_HTTP_SERVER_LISTEN_PORT \ - " --http-server-listen-port=PORT Specify a port number for the built-in HTTP\n"\ - " Server to listen to." +#define TEXT_XML_RPC_LISTEN_PORT \ +_(" --xml-rpc-listen-port=PORT Specify a port number for XML-RPC server to listen\n"\ + " to.") // Excluded from translation candidiates because it is subject to change. -#define TEXT_ENABLE_HTTP_SERVER \ - " --enable-http-server[=true|false] Enable the built-in HTTP server. Currently,\n"\ - " this is the experimental feature and it just\n"\ - " provides the current download progress. Use your\n"\ - " web browser(console-based ones, such as elinks,\n"\ - " w3m, are recommended) to connect the server and\n"\ - " see what's what." +#define TEXT_ENABLE_XML_RPC \ +_(" --enable-xml-rpc[=true|false] Enable XML-RPC server.\n"\ + " See also --xml-rpc-listen-port option.") #define TEXT_BT_EXTERNAL_IP \ _(" --bt-external-ip=IPADDRESS Specify the external IP address to report to a\n"\ " BitTorrent tracker. Although this function is\n"\