From 437f10b247cdf496714a6ddc5837a92f9636cace Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Wed, 3 Jul 2013 18:09:56 -0700 Subject: [PATCH] Add rpc_ip and rpc_port command line overrides --- TODO.txt | 3 + .../ripple_core/functional/ripple_Config.cpp | 6 +- .../ripple_core/functional/ripple_Config.h | 55 ++++++++++++++++++- src/cpp/ripple/CallRPC.cpp | 9 +-- src/cpp/ripple/RPCDoor.cpp | 6 +- src/cpp/ripple/ripple_Application.cpp | 2 +- src/cpp/ripple/ripple_Main.cpp | 37 ++++++++++++- 7 files changed, 104 insertions(+), 14 deletions(-) diff --git a/TODO.txt b/TODO.txt index 8d772e67e1..2e228a99ed 100644 --- a/TODO.txt +++ b/TODO.txt @@ -31,6 +31,9 @@ WEBSOCKET TODO RIPPLE TODO -------------------------------------------------------------------------------- +- Class to represent IP and Port number, with members to print, check syntax, + etc... replace the boost calls. + - Remove dependence on JobQueue, LoadFeeTrack, and NetworkOPs from LoadManager by providing an observer (beast::ListenerList or Listeners). This way LoadManager does not need stopThread() function. diff --git a/modules/ripple_core/functional/ripple_Config.cpp b/modules/ripple_core/functional/ripple_Config.cpp index b30f5c21f3..c58a0664e7 100644 --- a/modules/ripple_core/functional/ripple_Config.cpp +++ b/modules/ripple_core/functional/ripple_Config.cpp @@ -209,6 +209,7 @@ void Config::setup (const std::string& strConf, bool bTestNet, bool bQuiet) Config::Config () : SSL_CONTEXT (boost::asio::ssl::context::sslv23) + , m_rpcPort (5001) { // // Defaults @@ -218,7 +219,6 @@ Config::Config () NETWORK_START_TIME = 1319844908; PEER_PORT = SYSTEM_PEER_PORT; - RPC_PORT = 5001; RPC_SECURE = 0; WEBSOCKET_PORT = SYSTEM_WEBSOCKET_PORT; WEBSOCKET_PUBLIC_PORT = SYSTEM_WEBSOCKET_PUBLIC_PORT; @@ -373,14 +373,14 @@ void Config::load () (void) SectionSingleB (secConfig, SECTION_RPC_ADMIN_PASSWORD, RPC_ADMIN_PASSWORD); (void) SectionSingleB (secConfig, SECTION_RPC_ADMIN_USER, RPC_ADMIN_USER); - (void) SectionSingleB (secConfig, SECTION_RPC_IP, RPC_IP); + (void) SectionSingleB (secConfig, SECTION_RPC_IP, m_rpcIP); (void) SectionSingleB (secConfig, SECTION_RPC_PASSWORD, RPC_PASSWORD); (void) SectionSingleB (secConfig, SECTION_RPC_USER, RPC_USER); (void) SectionSingleB (secConfig, SECTION_NODE_DB, NODE_DB); (void) SectionSingleB (secConfig, SECTION_LDB_EPHEMERAL, LDB_EPHEMERAL); if (SectionSingleB (secConfig, SECTION_RPC_PORT, strTemp)) - RPC_PORT = boost::lexical_cast (strTemp); + m_rpcPort = boost::lexical_cast (strTemp); if (SectionSingleB (secConfig, "ledger_creator" , strTemp)) LEDGER_CREATOR = boost::lexical_cast (strTemp); diff --git a/modules/ripple_core/functional/ripple_Config.h b/modules/ripple_core/functional/ripple_Config.h index 865cc32c32..d59da96ef6 100644 --- a/modules/ripple_core/functional/ripple_Config.h +++ b/modules/ripple_core/functional/ripple_Config.h @@ -160,9 +160,59 @@ public: std::string WEBSOCKET_SSL_CHAIN; std::string WEBSOCKET_SSL_KEY; + //---------------------------------------------------------------------------- + // + // VFALCO NOTE Please follow this style for modifying or adding code in the file. + // +public: + /** Get the client or server RPC IP address. + + @note The string may not always be in a valid parsable state. + + @return A string representing the address. + */ + std::string getRpcIP () const { return m_rpcIP; } + + /** Get the client or server RPC port number. + + @note The port number may be invalid (out of range or zero) + + @return The RPC port number. + */ + int getRpcPort () const { return m_rpcPort; } + + /** Set the client or server RPC IP. + + @note The string is not syntax-checked. + + @param newIP A string representing the IP address to use. + */ + void setRpcIP (std::string const& newIP) { m_rpcIP = newIP; } + + /** Set the client or server RPC port number. + + @note The port number is not range checked. + + @param newPort The RPC port number to use. + */ + void setRpcPort (int newPort) { m_rpcPort = newPort; } + + /** Convert the RPC/port combination to a readable string. + */ + String const getRpcAddress () + { + return String (m_rpcIP.c_str ()) << ":" << m_rpcPort; + } + +private: + std::string m_rpcIP; + // VFALCO TODO This should be a short. + int m_rpcPort; + // + //---------------------------------------------------------------------------- + +public: // RPC parameters - std::string RPC_IP; - int RPC_PORT; std::vector RPC_ADMIN_ALLOW; std::string RPC_ADMIN_PASSWORD; std::string RPC_ADMIN_USER; @@ -175,6 +225,7 @@ public: std::string RPC_SSL_CERT; std::string RPC_SSL_CHAIN; std::string RPC_SSL_KEY; + //---------------------------------------------------------------------------- // Path searching int PATH_SEARCH_SIZE; diff --git a/src/cpp/ripple/CallRPC.cpp b/src/cpp/ripple/CallRPC.cpp index cf18272c82..01c3a15782 100644 --- a/src/cpp/ripple/CallRPC.cpp +++ b/src/cpp/ripple/CallRPC.cpp @@ -878,12 +878,13 @@ int commandLineRPC (const std::vector& vCmd) callRPC ( isService, - theConfig.RPC_IP, theConfig.RPC_PORT, - theConfig.RPC_USER, theConfig.RPC_PASSWORD, + theConfig.getRpcIP (), + theConfig.getRpcPort (), + theConfig.RPC_USER, + theConfig.RPC_PASSWORD, "", jvRequest.isMember ("method") // Allow parser to rewrite method. - ? jvRequest["method"].asString () - : vCmd[0], + ? jvRequest["method"].asString () : vCmd[0], jvParams, // Parsed, execute. false, BIND_TYPE (callRPCHandler, &jvOutput, P_1)); diff --git a/src/cpp/ripple/RPCDoor.cpp b/src/cpp/ripple/RPCDoor.cpp index 4b08f60140..ae6f115602 100644 --- a/src/cpp/ripple/RPCDoor.cpp +++ b/src/cpp/ripple/RPCDoor.cpp @@ -11,11 +11,11 @@ extern void initSSLContext (boost::asio::ssl::context& context, RPCDoor::RPCDoor (boost::asio::io_service& io_service) : mAcceptor (io_service, - boost::asio::ip::tcp::endpoint (boost::asio::ip::address::from_string (theConfig.RPC_IP), theConfig.RPC_PORT)) + boost::asio::ip::tcp::endpoint (boost::asio::ip::address::from_string (theConfig.getRpcIP ()), theConfig.getRpcPort ())) , mDelayTimer (io_service) , mSSLContext (boost::asio::ssl::context::sslv23) { - WriteLog (lsINFO, RPCDoor) << "RPC port: " << theConfig.RPC_IP << " " << theConfig.RPC_PORT << " allow remote: " << theConfig.RPC_ALLOW_REMOTE; + WriteLog (lsINFO, RPCDoor) << "RPC port: " << theConfig.getRpcAddress().toRawUTF8() << " allow remote: " << theConfig.RPC_ALLOW_REMOTE; if (theConfig.RPC_SECURE != 0) initSSLContext (mSSLContext, theConfig.RPC_SSL_KEY, theConfig.RPC_SSL_CERT, theConfig.RPC_SSL_CHAIN); @@ -25,7 +25,7 @@ RPCDoor::RPCDoor (boost::asio::io_service& io_service) RPCDoor::~RPCDoor () { - WriteLog (lsINFO, RPCDoor) << "RPC port: " << theConfig.RPC_IP << " " << theConfig.RPC_PORT << " allow remote: " << theConfig.RPC_ALLOW_REMOTE; + WriteLog (lsINFO, RPCDoor) << "RPC port: " << theConfig.getRpcAddress().toRawUTF8() << " allow remote: " << theConfig.RPC_ALLOW_REMOTE; } void RPCDoor::startListening () diff --git a/src/cpp/ripple/ripple_Application.cpp b/src/cpp/ripple/ripple_Application.cpp index f6e0997653..bee25627f7 100644 --- a/src/cpp/ripple/ripple_Application.cpp +++ b/src/cpp/ripple/ripple_Application.cpp @@ -588,7 +588,7 @@ void Application::setup () // // Allow RPC connections. // - if (!theConfig.RPC_IP.empty () && theConfig.RPC_PORT) + if (! theConfig.getRpcIP().empty () && theConfig.getRpcPort() != 0) { try { diff --git a/src/cpp/ripple/ripple_Main.cpp b/src/cpp/ripple/ripple_Main.cpp index d9f9552947..23b2f619cf 100644 --- a/src/cpp/ripple/ripple_Main.cpp +++ b/src/cpp/ripple/ripple_Main.cpp @@ -57,6 +57,10 @@ void printHelp (const po::options_description& desc) cerr << desc << endl; + cerr << "Options: " << endl; + cerr << " -rpc-ip=[':']" << endl; + cerr << " -rpc-port=" << endl; + cerr << endl; cerr << "Commands: " << endl; cerr << " account_info |||| [] [strict]" << endl; cerr << " account_lines |\"\" []" << endl; @@ -155,6 +159,7 @@ int rippleMain (int argc, char** argv) int iResult = 0; po::variables_map vm; // Map of options. + // VFALCO TODO Replace boost program options with something from Beast. // // Set up option parsing. // @@ -163,6 +168,8 @@ int rippleMain (int argc, char** argv) ("help,h", "Display this message.") ("conf", po::value (), "Specify the configuration file.") ("rpc", "Perform rpc command (default).") + ("rpc_ip", po::value (), "Specify the IP address for RPC command.") + ("rpc_port", po::value (), "Specify the port number for RPC command.") ("standalone,a", "Run with no peers.") ("testnet,t", "Run in test net mode.") ("unittest,u", "Perform unit tests.") @@ -232,13 +239,21 @@ int rippleMain (int argc, char** argv) } if (vm.count ("quiet")) + { Log::setMinSeverity (lsFATAL, true); + } else if (vm.count ("verbose")) + { Log::setMinSeverity (lsTRACE, true); + } else + { Log::setMinSeverity (lsINFO, true); + } - // VFALCO TODO make these singletons that initialize statically + // VFALCO TODO make this a singleton that initializes statically + // Or could make it a SharedSingleton + // LEFInit (); if (vm.count ("unittest")) @@ -283,6 +298,26 @@ int rippleMain (int argc, char** argv) theConfig.VALIDATION_QUORUM = 2; } + if (iResult == 0) + { + // These overrides must happen after the config file is loaded. + + // Override the RPC destination IP address + // + if (vm.count ("rpc_ip")) + { + theConfig.setRpcIP (vm ["rpc_ip"].as ()); + } + + // Override the RPC destination port number + // + if (vm.count ("rpc_port")) + { + // VFALCO TODO This should be a short. + theConfig.setRpcPort (vm ["rpc_port"].as ()); + } + } + if (iResult) { nothing ();