diff --git a/CMakeLists.txt b/CMakeLists.txt index 40e996e..fc4fb01 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,6 +19,7 @@ option(LINK_SUPPORT "Allow hub linking" OFF) option(SSL_SUPPORT "Enable SSL support" ON) option(USE_OPENSSL "Use OpenSSL's SSL support" ON ) option(SQLITE_SUPPORT "Enable SQLite support" ON) +option(SYSTEMD_SUPPORT "Enable systemd notify and journal logging" OFF) option(ADC_STRESS "Enable the stress tester client" OFF) find_package(Git) @@ -34,6 +35,12 @@ if (SSL_SUPPORT) endif() endif() +if (SYSTEMD_SUPPORT) + INCLUDE(FindPkgConfig) + pkg_search_module(SD_DAEMON REQUIRED libsystemd-daemon) + pkg_search_module(SD_JOURNAL REQUIRED libsystemd-journal) +endif() + if (MSVC) add_definitions(-D_CRT_SECURE_NO_WARNINGS) endif() @@ -175,6 +182,18 @@ if(SSL_SUPPORT) endif() endif() +if (SYSTEMD_SUPPORT) + target_link_libraries(uhub ${SD_DAEMON_LIBRARIES}) + target_link_libraries(uhub ${SD_JOURNAL_LIBRARIES}) + target_link_libraries(test ${SD_DAEMON_LIBRARIES}) + target_link_libraries(test ${SD_JOURNAL_LIBRARIES}) + target_link_libraries(uhub-passwd ${SD_JOURNAL_LIBRARIES}) + target_link_libraries(uhub-admin ${SD_JOURNAL_LIBRARIES}) + include_directories(${SD_DAEMON_INCLUDE_DIRS}) + include_directories(${SD_JOURNAL_INCLUDE_DIRS}) + add_definitions(-DSYSTEMD) +endif() + configure_file ("${PROJECT_SOURCE_DIR}/version.h.in" "${PROJECT_SOURCE_DIR}/version.h") mark_as_advanced(FORCE CMAKE_BUILD_TYPE) diff --git a/src/core/main.c b/src/core/main.c index bb78672..ac2d2a8 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -19,6 +19,10 @@ #include "uhub.h" +#ifdef SYSTEMD +#include +#endif + static int arg_verbose = 5; static int arg_fork = 0; static int arg_check_config = 0; @@ -145,7 +149,16 @@ int main_loop() } #if !defined(WIN32) setup_signal_handlers(hub); -#endif +#ifdef SYSTEMD + /* Notify the service manager that this daemon has + * been successfully initalized and shall enter the + * main loop. + */ + sd_notifyf(0, "READY=1\n" + "MAINPID=%lu", (unsigned long) getpid()); +#endif /* SYSTEMD */ + +#endif /* ! WIN32 */ } hub_set_variables(hub, &acl); @@ -216,13 +229,17 @@ void print_usage(char* program) " -q Quiet mode - no output\n" " -f Fork to background\n" " -l Log messages to given file (default: stderr)\n" - " -L Log messages to syslog\n" " -c Specify configuration file (default: " SERVER_CONFIG ")\n" " -C Check configuration and return\n" " -s Show configuration parameters\n" " -S Show configuration parameters, but ignore defaults\n" " -h This message\n" #ifndef WIN32 +#ifdef SYSTEMD + " -L Log messages to journal\n" +#else + " -L Log messages to syslog\n" +#endif " -u Run as given user\n" " -g Run with given group permissions\n" " -p Store pid in file (process id)\n" diff --git a/src/util/log.c b/src/util/log.c index 42badb3..2d97528 100644 --- a/src/util/log.c +++ b/src/util/log.c @@ -21,7 +21,15 @@ #include #ifndef WIN32 + +#ifdef SYSTEMD +#define SD_JOURNAL_SUPPRESS_LOCATION +#include + +#else #include +#endif + static int use_syslog = 0; #endif @@ -83,7 +91,9 @@ void hub_log_initialize(const char* file, int syslog) if (syslog) { use_syslog = 1; + #ifndef SYSTEMD openlog("uhub", LOG_PID, LOG_USER); + #endif } #endif @@ -132,7 +142,9 @@ void hub_log_shutdown() if (use_syslog) { use_syslog = 0; + #ifndef SYSTEMD closelog(); + #endif } #endif } @@ -212,7 +224,12 @@ void hub_log(int log_verbosity, const char *format, ...) case log_fatal: level = LOG_CRIT; break; case log_error: level = LOG_ERR; break; case log_warning: level = LOG_WARNING; break; - case log_user: level = LOG_INFO | LOG_AUTH; break; + #ifdef SYSTEMD + case log_user: level = LOG_INFO; break; + + #else + case log_user: level = LOG_INFO | LOG_AUTH; break; + #endif case log_info: level = LOG_INFO; break; case log_debug: level = LOG_DEBUG; break; @@ -224,8 +241,13 @@ void hub_log(int log_verbosity, const char *format, ...) if (level == 0) return; + #ifdef SYSTEMD + sd_journal_print(level, "%s", logmsg); + + #else level |= (LOG_USER | LOG_DAEMON); syslog(level, "%s", logmsg); + #endif } #endif