Skip to content

Commit

Permalink
Restore daemon interactive mode
Browse files Browse the repository at this point in the history
Daemon interactive mode is now working again.

RPC mapped calls in daemon and wallet have both had connection_context
removed as an argument as that argument was not being used anywhere.
  • Loading branch information
tewinget committed Mar 27, 2015
1 parent cd31ea9 commit a0590d2
Show file tree
Hide file tree
Showing 16 changed files with 512 additions and 162 deletions.
12 changes: 7 additions & 5 deletions contrib/epee/include/console_handler.h
Expand Up @@ -269,17 +269,19 @@ namespace epee
string_tools::trim(command);

LOG_PRINT_L2("Read command: " << command);
if(0 == command.compare("exit") || 0 == command.compare("q"))
{
continue_handle = false;
}else if (command.empty())
if (command.empty())
{
continue;
}
else if(cmd_handler(command))
{
continue;
} else
}
else if(0 == command.compare("exit") || 0 == command.compare("q"))
{
continue_handle = false;
}
else
{
std::cout << "unknown command: " << command << std::endl;
std::cout << usage;
Expand Down
8 changes: 4 additions & 4 deletions contrib/epee/include/net/http_server_handlers_map2.h
Expand Up @@ -65,7 +65,7 @@
CHECK_AND_ASSERT_MES(parse_res, false, "Failed to parse json: \r\n" << query_info.m_body); \
uint64_t ticks1 = epee::misc_utils::get_tick_count(); \
boost::value_initialized<command_type::response> resp;\
if(!callback_f(static_cast<command_type::request&>(req), static_cast<command_type::response&>(resp), m_conn_context)) \
if(!callback_f(static_cast<command_type::request&>(req), static_cast<command_type::response&>(resp))) \
{ \
LOG_ERROR("Failed to " << #callback_f << "()"); \
response_info.m_response_code = 500; \
Expand All @@ -90,7 +90,7 @@
CHECK_AND_ASSERT_MES(parse_res, false, "Failed to parse bin body data, body size=" << query_info.m_body.size()); \
uint64_t ticks1 = misc_utils::get_tick_count(); \
boost::value_initialized<command_type::response> resp;\
if(!callback_f(static_cast<command_type::request&>(req), static_cast<command_type::response&>(resp), m_conn_context)) \
if(!callback_f(static_cast<command_type::request&>(req), static_cast<command_type::response&>(resp))) \
{ \
LOG_ERROR("Failed to " << #callback_f << "()"); \
response_info.m_response_code = 500; \
Expand Down Expand Up @@ -173,7 +173,7 @@
epee::json_rpc::error_response fail_resp = AUTO_VAL_INIT(fail_resp); \
fail_resp.jsonrpc = "2.0"; \
fail_resp.id = req.id; \
if(!callback_f(req.params, resp.result, fail_resp.error, m_conn_context)) \
if(!callback_f(req.params, resp.result, fail_resp.error)) \
{ \
epee::serialization::store_t_to_json(static_cast<epee::json_rpc::error_response&>(fail_resp), response_info.m_body); \
return true; \
Expand Down Expand Up @@ -202,7 +202,7 @@
else if(callback_name == method_name) \
{ \
PREPARE_OBJECTS_FROM_JSON(command_type) \
if(!callback_f(req.params, resp.result, m_conn_context)) \
if(!callback_f(req.params, resp.result)) \
{ \
epee::json_rpc::error_response fail_resp = AUTO_VAL_INIT(fail_resp); \
fail_resp.jsonrpc = "2.0"; \
Expand Down
4 changes: 3 additions & 1 deletion src/daemon/command_parser_executor.cpp
Expand Up @@ -34,8 +34,10 @@ namespace daemonize {
t_command_parser_executor::t_command_parser_executor(
uint32_t ip
, uint16_t port
, bool is_rpc
, cryptonote::core_rpc_server* rpc_server
)
: m_executor(ip, port)
: m_executor(ip, port, is_rpc, rpc_server)
{}

bool t_command_parser_executor::print_peer_list(const std::vector<std::string>& args)
Expand Down
3 changes: 3 additions & 0 deletions src/daemon/command_parser_executor.h
Expand Up @@ -37,6 +37,7 @@
#pragma once

#include "daemon/rpc_command_executor.h"
#include "rpc/core_rpc_server.h"

namespace daemonize {

Expand All @@ -48,6 +49,8 @@ class t_command_parser_executor final
t_command_parser_executor(
uint32_t ip
, uint16_t port
, bool is_rpc
, cryptonote::core_rpc_server* rpc_server = NULL
);

bool print_peer_list(const std::vector<std::string>& args);
Expand Down
31 changes: 30 additions & 1 deletion src/daemon/command_server.cpp
Expand Up @@ -37,10 +37,18 @@ namespace p = std::placeholders;
t_command_server::t_command_server(
uint32_t ip
, uint16_t port
, bool is_rpc
, cryptonote::core_rpc_server* rpc_server
)
: m_parser(ip, port)
: m_parser(ip, port, is_rpc, rpc_server)
, m_command_lookup()
, m_is_rpc(is_rpc)
{
m_command_lookup.set_handler(
"q"
, [] (const std::vector<std::string>& args) {return true;}
, "ignored"
);
m_command_lookup.set_handler(
"help"
, std::bind(&t_command_server::help, this, p::_1)
Expand Down Expand Up @@ -126,6 +134,11 @@ t_command_server::t_command_server(
, std::bind(&t_command_parser_executor::stop_daemon, &m_parser, p::_1)
, "Stop the daemon"
);
m_command_lookup.set_handler(
"exit"
, std::bind(&t_command_parser_executor::stop_daemon, &m_parser, p::_1)
, "Stop the daemon"
);
m_command_lookup.set_handler(
"print_status"
, std::bind(&t_command_parser_executor::print_status, &m_parser, p::_1)
Expand Down Expand Up @@ -163,6 +176,22 @@ bool t_command_server::process_command_vec(const std::vector<std::string>& cmd)
return result;
}

bool t_command_server::start_handling()
{
if (m_is_rpc) return false;

m_command_lookup.start_handling("", get_commands_str());

return true;
}

void t_command_server::stop_handling()
{
if (m_is_rpc) return;

m_command_lookup.stop_handling();
}

bool t_command_server::help(const std::vector<std::string>& args)
{
std::cout << get_commands_str() << std::endl;
Expand Down
10 changes: 9 additions & 1 deletion src/daemon/command_server.h
Expand Up @@ -47,17 +47,25 @@ namespace daemonize {
class t_command_server {
private:
t_command_parser_executor m_parser;
epee::command_handler m_command_lookup;
epee::console_handlers_binder m_command_lookup;
bool m_is_rpc;

public:
t_command_server(
uint32_t ip
, uint16_t port
, bool is_rpc = true
, cryptonote::core_rpc_server* rpc_server = NULL
);

bool process_command_str(const std::string& cmd);

bool process_command_vec(const std::vector<std::string>& cmd);

bool start_handling();

void stop_handling();

private:
bool help(const std::vector<std::string>& args);

Expand Down
20 changes: 18 additions & 2 deletions src/daemon/daemon.cpp
Expand Up @@ -35,6 +35,7 @@
#include "daemon/p2p.h"
#include "daemon/protocol.h"
#include "daemon/rpc.h"
#include "daemon/command_server.h"
#include "misc_log_ex.h"
#include "version.h"
#include <boost/program_options.hpp>
Expand Down Expand Up @@ -101,7 +102,7 @@ t_daemon & t_daemon::operator=(t_daemon && other)
return *this;
}

bool t_daemon::run()
bool t_daemon::run(bool interactive)
{
if (nullptr == mp_internals)
{
Expand All @@ -113,7 +114,22 @@ bool t_daemon::run()
{
mp_internals->core.run();
mp_internals->rpc.run();
mp_internals->p2p.run();

daemonize::t_command_server* rpc_commands;

if (interactive)
{
rpc_commands = new daemonize::t_command_server(0, 0, false, mp_internals->rpc.get_server());
rpc_commands->start_handling();
}

mp_internals->p2p.run(); // blocks until p2p goes down

if (interactive)
{
rpc_commands->stop_handling();
}

mp_internals->rpc.stop();
LOG_PRINT("Node stopped.", LOG_LEVEL_0);
return true;
Expand Down
2 changes: 1 addition & 1 deletion src/daemon/daemon.h
Expand Up @@ -48,7 +48,7 @@ class t_daemon final {
t_daemon & operator=(t_daemon && other);
~t_daemon();

bool run();
bool run(bool interactive = false);
void stop();
};
}
2 changes: 1 addition & 1 deletion src/daemon/executor.cpp
Expand Up @@ -65,7 +65,7 @@ namespace daemonize
)
{
epee::log_space::log_singletone::add_logger(LOGGER_CONSOLE, NULL, NULL);
return t_daemon{vm}.run();
return t_daemon{vm}.run(true);
}
}

5 changes: 5 additions & 0 deletions src/daemon/rpc.h
Expand Up @@ -82,6 +82,11 @@ class t_rpc final
m_server.timed_wait_server_stop(5000);
}

cryptonote::core_rpc_server* get_server()
{
return &m_server;
}

~t_rpc()
{
LOG_PRINT_L0("Deinitializing rpc server...");
Expand Down

0 comments on commit a0590d2

Please sign in to comment.