diff --git a/nano/core_test/rpc.cpp b/nano/core_test/rpc.cpp index 4b12b4c5..a797958f 100644 --- a/nano/core_test/rpc.cpp +++ b/nano/core_test/rpc.cpp @@ -4135,3 +4135,21 @@ TEST (rpc, node_id_delete) nano::keypair node_id (system.nodes[0]->store.get_node_id (transaction)); ASSERT_NE (node_id.pub.to_string (), system.nodes[0]->node_id.pub.to_string ()); } + +TEST (rpc, uptime) +{ + nano::system system (24000, 1); + nano::rpc rpc (system.io_ctx, *system.nodes[0], nano::rpc_config (true)); + rpc.start (); + boost::property_tree::ptree request; + request.put ("action", "uptime"); + std::this_thread::sleep_for (std::chrono::seconds (1)); + test_response response (request, rpc, system.io_ctx); + system.deadline_set (5s); + while (response.status == 0) + { + ASSERT_NO_ERROR (system.poll ()); + } + ASSERT_EQ (200, response.status); + ASSERT_LE (1, response.json.get ("seconds")); +} diff --git a/nano/node/node.cpp b/nano/node/node.cpp index 8ea60eb3..3c7df81f 100644 --- a/nano/node/node.cpp +++ b/nano/node/node.cpp @@ -1648,7 +1648,8 @@ block_processor_thread ([this]() { }), online_reps (*this), stats (config.stat_config), -vote_uniquer (block_uniquer) +vote_uniquer (block_uniquer), +startup_time (std::chrono::steady_clock::now ()) { wallets.observer = [this](bool active) { observers.wallet.notify (active); diff --git a/nano/node/node.hpp b/nano/node/node.hpp index 3b0682a6..5400ce04 100644 --- a/nano/node/node.hpp +++ b/nano/node/node.hpp @@ -534,6 +534,7 @@ public: nano::keypair node_id; nano::block_uniquer block_uniquer; nano::vote_uniquer vote_uniquer; + const std::chrono::steady_clock::time_point startup_time; static double constexpr price_max = 16.0; static double constexpr free_cutoff = 1024.0; static std::chrono::seconds constexpr period = std::chrono::seconds (60); diff --git a/nano/node/rpc.cpp b/nano/node/rpc.cpp index 33931973..1c158433 100644 --- a/nano/node/rpc.cpp +++ b/nano/node/rpc.cpp @@ -3083,6 +3083,12 @@ void nano::rpc_handler::unchecked_keys () response_errors (); } +void nano::rpc_handler::uptime () +{ + response_l.put ("seconds", std::chrono::duration_cast (std::chrono::steady_clock::now () - node.startup_time).count ()); + response_errors (); +} + void nano::rpc_handler::version () { response_l.put ("rpc_version", "1"); @@ -4265,6 +4271,10 @@ void nano::rpc_handler::process_request () { unchecked_keys (); } + else if (action == "uptime") + { + uptime (); + } else if (action == "validate_account_number") { validate_account_number (); diff --git a/nano/node/rpc.hpp b/nano/node/rpc.hpp index 03a852ad..09d9f66d 100644 --- a/nano/node/rpc.hpp +++ b/nano/node/rpc.hpp @@ -195,6 +195,7 @@ public: void unchecked_clear (); void unchecked_get (); void unchecked_keys (); + void uptime (); void validate_account_number (); void version (); void wallet_add ();