Tweak command handling
Modularize, add help and exit commands. Fix shutdown_tcp() and p2pool to make sure servers exit immediately when terminating.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
/*
|
||||
* This file is part of the Monero P2Pool <https://github.com/SChernykh/p2pool>
|
||||
* Copyright (c) 2021 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright (c) 2021 hyc <https://github.com/hyc>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -51,6 +52,89 @@ ConsoleCommands::~ConsoleCommands()
|
||||
LOGINFO(1, "stopped");
|
||||
}
|
||||
|
||||
typedef struct strconst {
|
||||
const char *str;
|
||||
size_t len;
|
||||
} strconst;
|
||||
|
||||
#define STRCONST(x) {x, sizeof(x)-1}
|
||||
#define STRCNULL {NULL, 0}
|
||||
|
||||
typedef int (cmdfunc)(p2pool *pool, const char *args);
|
||||
|
||||
typedef struct cmd {
|
||||
strconst name;
|
||||
const char *arg;
|
||||
const char *descr;
|
||||
cmdfunc *func;
|
||||
} cmd;
|
||||
|
||||
static cmdfunc do_help, do_status, do_loglevel, do_addpeers, do_droppeers, do_exit;
|
||||
|
||||
static cmd cmds[] = {
|
||||
{ STRCONST("help"), "", "display list of commands", do_help },
|
||||
{ STRCONST("status"), "", "display p2pool status", do_status },
|
||||
{ STRCONST("loglevel"), "<level>", "set log level", do_loglevel },
|
||||
{ STRCONST("addpeers"), "<peeraddr>", "add peer", do_addpeers },
|
||||
{ STRCONST("droppeers"), "", "disconnect all peers", do_droppeers },
|
||||
{ STRCONST("exit"), "", "terminate p2pool", do_exit },
|
||||
{ STRCNULL, NULL, NULL, NULL }
|
||||
};
|
||||
|
||||
static int do_help(p2pool * /* m_pool */, const char * /* args */)
|
||||
{
|
||||
int i;
|
||||
|
||||
LOGINFO(0, "List of commands");
|
||||
for (i=0; cmds[i].name.len; i++)
|
||||
LOGINFO(0, cmds[i].name.str << " " << cmds[i].arg << "\t" << cmds[i].descr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int do_status(p2pool *m_pool, const char * /* args */)
|
||||
{
|
||||
m_pool->side_chain().print_status();
|
||||
if (m_pool->stratum_server()) {
|
||||
m_pool->stratum_server()->print_status();
|
||||
}
|
||||
if (m_pool->p2p_server()) {
|
||||
m_pool->p2p_server()->print_status();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int do_loglevel(p2pool * /* m_pool */, const char *args)
|
||||
{
|
||||
int level = atoi(args);
|
||||
level = std::min(std::max(level, 0), 5);
|
||||
log::GLOBAL_LOG_LEVEL = level;
|
||||
LOGINFO(0, "log level set to " << level);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int do_addpeers(p2pool *m_pool, const char *args)
|
||||
{
|
||||
if (m_pool->p2p_server()) {
|
||||
m_pool->p2p_server()->connect_to_peers(args);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int do_droppeers(p2pool *m_pool, const char * /* args */)
|
||||
{
|
||||
if (m_pool->p2p_server()) {
|
||||
m_pool->p2p_server()->drop_connections();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int do_exit(p2pool *m_pool, const char * /* args */)
|
||||
{
|
||||
m_pool->stop();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void ConsoleCommands::run()
|
||||
{
|
||||
LOGINFO(1, "started");
|
||||
@@ -58,51 +142,24 @@ void ConsoleCommands::run()
|
||||
std::string command;
|
||||
command.reserve(1024);
|
||||
|
||||
constexpr char status[] = "status";
|
||||
constexpr char loglevel[] = "loglevel";
|
||||
constexpr char addpeers[] = "addpeers";
|
||||
constexpr char droppeers[] = "droppeers";
|
||||
|
||||
do {
|
||||
std::getline(std::cin, command);
|
||||
if (stopped || std::cin.eof()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (command.find(status) == 0) {
|
||||
m_pool->side_chain().print_status();
|
||||
if (m_pool->stratum_server()) {
|
||||
m_pool->stratum_server()->print_status();
|
||||
int i;
|
||||
for (i=0; cmds[i].name.len; i++) {
|
||||
if (!strncmp(command.c_str(), cmds[i].name.str, cmds[i].name.len)) {
|
||||
const char *args = command.c_str() + cmds[i].name.len + 1;
|
||||
int rc = cmds[i].func(m_pool, args);
|
||||
if ( rc )
|
||||
return;
|
||||
break;
|
||||
}
|
||||
if (m_pool->p2p_server()) {
|
||||
m_pool->p2p_server()->print_status();
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (command.find(loglevel) == 0) {
|
||||
int level = atoi(command.c_str() + sizeof(loglevel));
|
||||
level = std::min(std::max(level, 0), 5);
|
||||
log::GLOBAL_LOG_LEVEL = level;
|
||||
LOGINFO(0, "log level set to " << level);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (command.find(addpeers) == 0) {
|
||||
if (m_pool->p2p_server()) {
|
||||
m_pool->p2p_server()->connect_to_peers(command.c_str() + sizeof(addpeers));
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (command.find(droppeers) == 0) {
|
||||
if (m_pool->p2p_server()) {
|
||||
m_pool->p2p_server()->drop_connections();
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
LOGWARN(0, "Unknown command " << command);
|
||||
if (!cmds[i].name.len)
|
||||
LOGWARN(0, "Unknown command " << command);
|
||||
} while (true);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user