]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
log: lua interface
authorLukáš Ježek <lukas.jezek@nic.cz>
Tue, 18 May 2021 06:42:13 +0000 (08:42 +0200)
committerTomas Krizek <tomas.krizek@nic.cz>
Thu, 29 Jul 2021 09:40:49 +0000 (11:40 +0200)
daemon/engine.c
daemon/main.c
lib/log.c
lib/log.h

index 8617ef4b517611634dd8b67ee54c17738c30ade7..28349db594447675d0fabaccb81e97405c00c494 100644 (file)
@@ -74,6 +74,7 @@ static int l_help(lua_State *L)
                "package_version()\n    return package version\n"
                "user(name[, group])\n    change process user (and group)\n"
                "verbose(true|false)\n    toggle verbose mode\n"
+               "set_log_level\n        logging level (crit, err, warning, notice, info or debug)\n"
                "option(opt[, new_val])\n    get/set server option\n"
                "mode(strict|normal|permissive)\n    set resolver strictness level\n"
                "reorder_RR([true|false])\n    set/get reordering of RRs within RRsets\n"
@@ -152,6 +153,26 @@ static int l_verbose(lua_State *L)
        return 1;
 }
 
+static int l_set_log_level(lua_State *L)
+{
+       if (lua_gettop(L) != 1 || !lua_isstring(L, 1)) {
+               lua_error_p(L, "takes one string parameter");
+               return 0;
+       }
+
+       log_level_t lvl = kr_log_name2level(lua_tostring(L, 1));
+
+       lua_pushinteger(L, kr_log_level_set(lvl));
+       return 1;
+}
+
+static int l_get_log_level(lua_State *L)
+{
+       printf("%s\n", kr_log_level2name(kr_log_level_get()));
+
+       return 0;
+}
+
 char *engine_get_hostname(struct engine *engine) {
        static char hostname_str[KNOT_DNAME_MAXLEN];
        if (!engine) {
@@ -432,6 +453,10 @@ static int init_state(struct engine *engine)
        lua_setglobal(engine->L, "package_version");
        lua_pushcfunction(engine->L, l_verbose);
        lua_setglobal(engine->L, "verbose");
+       lua_pushcfunction(engine->L, l_set_log_level);
+       lua_setglobal(engine->L, "set_log_level");
+       lua_pushcfunction(engine->L, l_get_log_level);
+       lua_setglobal(engine->L, "get_log_level");
        lua_pushcfunction(engine->L, l_setuser);
        lua_setglobal(engine->L, "user");
        lua_pushcfunction(engine->L, l_hint_root_file);
index b57a9ebdf236253a0f882a8ca80855db588fc8c6..f7e18896bda512d1e6002cee88b853583c20d092 100644 (file)
@@ -422,7 +422,7 @@ int main(int argc, char **argv)
 
        the_args = &the_args_value;
        args_init(the_args);
-       kr_log_init(LOG_WARNING, LOG_TARGET_STDOUT);
+       kr_log_init(LOG_DEFAULT_LEVEL, LOG_TARGET_STDOUT);
        int ret = parse_args(argc, argv, the_args);
        if (ret >= 0) goto cleanup_args;
 
index 2b80091ae16e74161cfbc6cac5ab84fe745b5623..90228f2a97d43df4259eb79acb67d01c1455682b 100644 (file)
--- a/lib/log.c
+++ b/lib/log.c
@@ -18,7 +18,19 @@ int use_journal = 0;
 
 log_level_t kr_log_level = LOG_CRIT;
 log_target_t kr_log_target = LOG_TARGET_STDOUT;
-
+#ifndef SYSLOG_NAMES
+syslog_code_t prioritynames[] = {
+       { "alert",      LOG_ALERT },
+       { "crit",       LOG_CRIT },
+       { "debug",      LOG_DEBUG },
+       { "emerg",      LOG_EMERG },
+       { "err",        LOG_ERR },
+       { "info",       LOG_INFO },
+       { "notice",     LOG_NOTICE },
+       { "warning",    LOG_WARNING },
+       { NULL,         -1 },
+};
+#endif
 
 void kr_log_fmt(log_level_t level, const char *fmt, ...)
 {
@@ -66,6 +78,28 @@ static void kres_gnutls_log(int level, const char *message)
        kr_log_debug("[gnutls] (%d) %s", level, message);
 }
 
+char *kr_log_level2name(log_level_t level)
+{
+       for (int i = 0; prioritynames[i].c_name; ++i)
+       {
+               if (prioritynames[i].c_val == level)
+                       return prioritynames[i].c_name;
+       }
+
+       return NULL;
+}
+
+log_level_t kr_log_name2level(const char *name)
+{
+       for (int i = 0; prioritynames[i].c_name; ++i)
+       {
+               if (strcmp(prioritynames[i].c_name, name) == 0)
+                       return prioritynames[i].c_val;
+       }
+
+       return -1;
+}
+
 int kr_log_level_set(log_level_t level)
 {
        if (level < LOG_CRIT || level > LOG_DEBUG)
@@ -93,13 +127,12 @@ log_level_t kr_log_level_get(void)
 
 void kr_log_init(log_level_t level, log_target_t target)
 {
-       kr_log_level = level;
        kr_log_target = target;
 
 #if ENABLE_LIBSYSTEMD
        use_journal = sd_booted();
 #endif
        openlog(NULL, LOG_PID, LOG_DAEMON);
-       setlogmask(LOG_UPTO(kr_log_level));
+       kr_log_level_set(level);
 }
 
index bce8e08f34b048e7cb796b9ce565de2323f1d701..3395e83f37109792588374d4f7cf76467df18f76 100644 (file)
--- a/lib/log.h
+++ b/lib/log.h
@@ -8,6 +8,9 @@
 #include <syslog.h>
 #include "lib/defines.h"
 
+
+#define LOG_DEFAULT_LEVEL      LOG_WARNING
+
 typedef int log_level_t;
 
 typedef enum {
@@ -28,6 +31,10 @@ KR_EXPORT
 log_level_t kr_log_level_get(void);
 KR_EXPORT
 void kr_log_init(log_level_t level, log_target_t target);
+KR_EXPORT
+char *kr_log_level2name(log_level_t level);
+KR_EXPORT
+log_level_t kr_log_name2level(const char *name);
 
 #define kr_log_debug(fmt, ...) kr_log_fmt(LOG_DEBUG, fmt, ## __VA_ARGS__)
 #define kr_log_info(fmt, ...) kr_log_fmt(LOG_INFO, fmt, ## __VA_ARGS__)
@@ -39,3 +46,14 @@ void kr_log_init(log_level_t level, log_target_t target);
 #define kr_log_deprecate(fmt, ...) kr_log_fmt(LOG_WARNING, "deprecation WARNING: " fmt, ## __VA_ARGS__)
 
 #define KR_LOG_LEVEL_IS(exp) ((kr_log_level >= (exp)) ? true : false)
+
+
+#ifndef SYSLOG_NAMES
+typedef struct _code {
+       char    *c_name;
+       int     c_val;
+} syslog_code_t;
+
+KR_EXPORT
+extern syslog_code_t prioritynames[];
+#endif