From 6eac49e5aeae1ce33d030d23bcdac4ede95cfa70 Mon Sep 17 00:00:00 2001 From: Mark Stemm Date: Tue, 6 Nov 2018 11:14:10 -0800 Subject: [PATCH] Restart falco on SIGHUP. (#457) Add a signal handler for SIGHUP that sets a global variable g_restart. All the real execution of falco was already centralized in a standalone function falco_init(), so simply exit on g_restart=true and call falco_init() in a loop that restarts if g_restart is set to true. Take care to not daemonize more than once and to reset the getopt index to 1 on restart. This fixes https://github.com/falcosecurity/falco/issues/432. --- userspace/falco/falco.cpp | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/userspace/falco/falco.cpp b/userspace/falco/falco.cpp index f9f7c89b51b..5fd95ecb563 100644 --- a/userspace/falco/falco.cpp +++ b/userspace/falco/falco.cpp @@ -44,6 +44,8 @@ limitations under the License. bool g_terminate = false; bool g_reopen_outputs = false; +bool g_restart = false; +bool g_daemonized = false; // // Helper functions @@ -58,6 +60,11 @@ static void reopen_outputs(int signal) g_reopen_outputs = true; } +static void restart_falco(int signal) +{ + g_restart = true; +} + // // Program help // @@ -196,8 +203,9 @@ uint64_t do_inspect(falco_engine *engine, g_reopen_outputs = false; } - if (g_terminate) + if (g_terminate || g_restart) { + falco_logger::log(LOG_INFO, "SIGHUP Received, restarting...\n"); break; } else if(rc == SCAP_TIMEOUT) @@ -699,6 +707,13 @@ int falco_init(int argc, char **argv) goto exit; } + if(signal(SIGHUP, restart_falco) == SIG_ERR) + { + fprintf(stderr, "An error occurred while setting SIGHUP signal handler.\n"); + result = EXIT_FAILURE; + goto exit; + } + if (scap_filename.size()) { inspector->open(scap_filename); @@ -721,7 +736,7 @@ int falco_init(int argc, char **argv) // If daemonizing, do it here so any init errors will // be returned in the foreground process. - if (daemon) { + if (daemon && !g_daemonized) { pid_t pid, sid; pid = fork(); @@ -772,6 +787,8 @@ int falco_init(int argc, char **argv) open("/dev/null", O_RDONLY); open("/dev/null", O_RDWR); open("/dev/null", O_RDWR); + + g_daemonized = true; } if(outfile != "") @@ -887,5 +904,15 @@ int falco_init(int argc, char **argv) // int main(int argc, char **argv) { - return falco_init(argc, argv); + int rc; + + // g_restart will cause the falco loop to exit, but we + // should reload everything and start over. + while((rc = falco_init(argc, argv)) == EXIT_SUCCESS && g_restart) + { + g_restart = false; + optind = 1; + } + + return rc; }