#include #include #include #include #include #include "Application.h" #include "CallRPC.h" #include "Config.h" #include "RPCHandler.h" #include "utils.h" namespace po = boost::program_options; extern void TFInit(); extern void LEFInit(); extern void SVFInit(); using namespace std; using namespace boost::unit_test; void setupServer() { theApp = new Application(); theApp->setup(); } void startServer() { // // Execute start up rpc commands. // if (theConfig.RPC_STARTUP.isArray()) { for (int i = 0; i != theConfig.RPC_STARTUP.size(); ++i) { const Json::Value& jvCommand = theConfig.RPC_STARTUP[i]; if (!theConfig.QUIET) std::cerr << "Startup RPC: " << jvCommand << std::endl; RPCHandler rhHandler(&theApp->getOPs()); int cost = 10; Json::Value jvResult = rhHandler.doCommand(jvCommand, RPCHandler::ADMIN, cost); if (!theConfig.QUIET) std::cerr << "Result: " << jvResult << std::endl; } } theApp->run(); // Blocks till we get a stop RPC. } bool init_unit_test() { theApp = new Application(); return true; } void printHelp(const po::options_description& desc) { cerr << SYSTEM_NAME "d [options] " << endl; cerr << desc << endl; cerr << "Commands: " << endl; cerr << " account_info |||| [] [strict]" << endl; cerr << " account_lines |\"\" []" << endl; cerr << " account_offers || []" << endl; cerr << " account_tx accountID [ledger_min [ledger_max [limit [offset]]]] [binary] [count] [descending]" << endl; cerr << " book_offers [ [ [ []]]]]" << endl; cerr << " connect []" << endl; cerr << " consensus_info" << endl; #if ENABLE_INSECURE cerr << " data_delete " << endl; cerr << " data_fetch " << endl; cerr << " data_store " << endl; #endif cerr << " get_counts" << endl; cerr << " json " << endl; cerr << " ledger [|current|closed|validated] [full]" << endl; cerr << " ledger_accept" << endl; cerr << " ledger_closed" << endl; cerr << " ledger_current" << endl; cerr << " ledger_header " << endl; cerr << " logrotate " << endl; cerr << " peers" << endl; cerr << " proof_create [] []" << endl; cerr << " proof_solve " << endl; cerr << " proof_verify [] []" << endl; cerr << " random" << endl; cerr << " ripple ..." << endl; cerr << " ripple_path_find []" << endl; // cerr << " send [] [] []" << endl; cerr << " stop" << endl; cerr << " tx " << endl; cerr << " unl_add | []" << endl; cerr << " unl_delete |" << endl; cerr << " unl_list" << endl; cerr << " unl_load" << endl; cerr << " unl_network" << endl; cerr << " unl_reset" << endl; cerr << " validation_create [||]" << endl; cerr << " validation_seed [||]" << endl; cerr << " wallet_add [] []" << endl; cerr << " wallet_accounts " << endl; cerr << " wallet_claim [] []" << endl; cerr << " wallet_seed [||]" << endl; cerr << " wallet_propose []" << endl; // Transaction helpers (that were removed): // cerr << " account_domain_set []" << endl; // cerr << " account_email_set []" << endl; // cerr << " account_rate_set " << endl; // cerr << " account_wallet_set []" << endl; // cerr << " nickname_info " << endl; // cerr << " nickname_set [] []" << endl; // cerr << " offer_create [passive]" << endl; // cerr << " offer_cancel " << endl; // cerr << " password_fund []" << endl; // cerr << " password_set []" << endl; // cerr << " trust_set [] []" << endl; } int main(int argc, char* argv[]) { setCallingThreadName("main"); int iResult = 0; po::variables_map vm; // Map of options. // // Set up option parsing. // po::options_description desc("General Options"); desc.add_options() ("help,h", "Display this message.") ("conf", po::value(), "Specify the configuration file.") ("rpc", "Perform rpc command (default).") ("standalone,a", "Run with no peers.") ("testnet,t", "Run in test net mode.") ("unittest,u", "Perform unit tests.") ("parameters", po::value< vector >(), "Specify comma separated parameters.") ("quiet,q", "Reduce diagnotics.") ("verbose,v", "Verbose logging.") ("load", "Load the current ledger from the local DB.") ("ledger", po::value(), "Load the specified ledger and start from .") ("start", "Start from a fresh Ledger.") ("net", "Get the initial ledger from the network.") ("fg", "Run in the foreground.") #ifdef USE_LEVELDB ("import", "Import SQLite node DB into LevelDB.") #endif ; // Interpret positional arguments as --parameters. po::positional_options_description p; p.add("parameters", -1); // // Prepare to run // if (!AddSystemEntropy()) { std::cerr << "Unable to add system entropy" << std::endl; iResult = 2; } if (iResult) { nothing(); } else { // Parse options, if no error. try { po::store(po::command_line_parser(argc, argv) .options(desc) // Parse options. .positional(p) // Remainder as --parameters. .run(), vm); po::notify(vm); // Invoke option notify functions. } catch (...) { iResult = 1; } } if (iResult) { nothing(); } else if (vm.count("help")) { iResult = 1; } if (HaveSustain() && !iResult && !vm.count("parameters") && !vm.count("fg") && !vm.count("standalone") && !vm.count("unittest")) { std::string logMe = DoSustain(); if (!logMe.empty()) Log(lsWARNING) << logMe; } if (vm.count("quiet")) Log::setMinSeverity(lsFATAL, true); else if (vm.count("verbose")) Log::setMinSeverity(lsTRACE, true); else Log::setMinSeverity(lsINFO, true); InstanceType::multiThread(); TFInit(); LEFInit(); SVFInit(); if (vm.count("unittest")) { unit_test_main(init_unit_test, argc, argv); InstanceType::shutdown(); return 0; } if (!iResult) { theConfig.setup( vm.count("conf") ? vm["conf"].as() : "", // Config file. !!vm.count("testnet"), // Testnet flag. !!vm.count("quiet")); // Quiet flag. if (vm.count("standalone")) { theConfig.RUN_STANDALONE = true; theConfig.LEDGER_HISTORY = 0; } } if (vm.count("start")) theConfig.START_UP = Config::FRESH; if (vm.count("import")) theConfig.LDB_IMPORT = true; if (vm.count("ledger")) { theConfig.START_LEDGER = vm["ledger"].as(); theConfig.START_UP = Config::LOAD; } else if (vm.count("load")) { theConfig.START_UP = Config::LOAD; } else if (vm.count("net")) { theConfig.START_UP = Config::NETWORK; if (theConfig.VALIDATION_QUORUM < 2) theConfig.VALIDATION_QUORUM = 2; } if (iResult) { nothing(); } else if (!vm.count("parameters")) { // No arguments. Run server. setupServer(); setCallingThreadName("io"); startServer(); InstanceType::shutdown(); } else { // Have a RPC command. setCallingThreadName("rpc"); std::vector vCmd = vm["parameters"].as >(); iResult = commandLineRPC(vCmd); } if (1 == iResult && !vm.count("quiet")) printHelp(desc); InstanceType::shutdown(); return iResult; } // vim:ts=4