Skip to content

Commit

Permalink
If the control console fd is closed, handle this as a "quit" command.
Browse files Browse the repository at this point in the history
Fixes #1694
  • Loading branch information
miodvallat committed Jan 15, 2025
1 parent 5557d8c commit 9441e68
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 10 deletions.
12 changes: 6 additions & 6 deletions pdns/auth-main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1026,11 +1026,11 @@ static int guardian(int argc, char** argv)
int infd = 0, outfd = 1;

DynListener dlg(g_programname);
dlg.registerFunc("QUIT", &DLQuitHandler, "quit daemon");
dlg.registerFunc("CYCLE", &DLCycleHandler, "restart instance");
dlg.registerFunc("PING", &DLPingHandler, "ping guardian");
dlg.registerFunc("STATUS", &DLStatusHandler, "get instance status from guardian");
dlg.registerRestFunc(&DLRestHandler);
DynListener::registerExitFunc("QUIT", &DLQuitHandler);
DynListener::registerFunc("CYCLE", &DLCycleHandler, "restart instance");
DynListener::registerFunc("PING", &DLPingHandler, "ping guardian");
DynListener::registerFunc("STATUS", &DLStatusHandler, "get instance status from guardian");
DynListener::registerRestFunc(&DLRestHandler);
dlg.go();
string progname = argv[0];

Expand Down Expand Up @@ -1415,7 +1415,7 @@ int main(int argc, char** argv)
}
DynListener::registerFunc("SHOW", &DLShowHandler, "show a specific statistic or * to get a list", "<statistic>");
DynListener::registerFunc("RPING", &DLPingHandler, "ping instance");
DynListener::registerFunc("QUIT", &DLRQuitHandler, "quit daemon");
DynListener::registerExitFunc("QUIT", &DLRQuitHandler);
DynListener::registerFunc("UPTIME", &DLUptimeHandler, "get instance uptime");
DynListener::registerFunc("NOTIFY-HOST", &DLNotifyHostHandler, "notify host for specific zone", "<zone> <host>");
DynListener::registerFunc("NOTIFY", &DLNotifyHandler, "queue a notification", "<zone>");
Expand Down
23 changes: 19 additions & 4 deletions pdns/dynlistener.cc
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,10 @@
#include <netinet/in.h>
#include <iostream>
#include <sstream>
#include <sys/types.h>
#include <csignal>

#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <boost/algorithm/string.hpp>
#include <thread>

#include "misc.hh"
Expand All @@ -59,6 +56,7 @@ extern StatBag S;

DynListener::g_funkdb_t DynListener::s_funcdb;
DynListener::g_funk_t* DynListener::s_restfunc;
std::string DynListener::s_exitfuncname;

DynListener::~DynListener()
{
Expand Down Expand Up @@ -280,7 +278,14 @@ string DynListener::getLine()
}

if (len == 0) {
throw PDNSException("Guardian exited - going down as well");
// File descriptor has been closed. We translate this into an exit
// request, but if it did not succeed and we are back attempting to
// read data, there's not much we can do but throw up.
static bool firstTime = true;
if (!firstTime) {
throw PDNSException("Guardian exited - going down as well");
}
firstTime = false;
}

if (static_cast<size_t>(len) == mesg.size()) {
Expand Down Expand Up @@ -319,6 +324,13 @@ void DynListener::sendlines(const string &l)
}
}

void DynListener::registerExitFunc(const string &name, g_funk_t *gf) // NOLINT(readability-identifier-length)
{
g_funkwithusage_t funk = {gf, "", "quit daemon"};
s_exitfuncname = name;
s_funcdb[s_exitfuncname] = std::move(funk);
}

void DynListener::registerFunc(const string &name, g_funk_t *gf, const string &usage, const string &args)
{
g_funkwithusage_t e = {gf, args, usage};
Expand All @@ -339,6 +351,9 @@ void DynListener::theListener()

for(;;) {
string line=getLine();
if (line.empty()) {
line = s_exitfuncname;
}
boost::trim_right(line);

vector<string>parts;
Expand Down
2 changes: 2 additions & 0 deletions pdns/dynlistener.hh
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ public:
typedef struct { g_funk_t *func; string args; string usage; } g_funkwithusage_t;
typedef map<string,g_funkwithusage_t> g_funkdb_t;

static void registerExitFunc(const string &name, g_funk_t *gf);
static void registerFunc(const string &name, g_funk_t *gf, const string &usage="", const string &args="");
static void registerRestFunc(g_funk_t *gf);
static g_funk_t* getFunc(const string& fname) { return s_funcdb[fname].func; }
Expand All @@ -72,5 +73,6 @@ private:
ComboAddress d_socketaddress;
static g_funkdb_t s_funcdb;
static g_funk_t* s_restfunc;
static string s_exitfuncname;
bool testLive(const string& fname);
};

0 comments on commit 9441e68

Please sign in to comment.