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

index 0ad23f902da1a7d77fdd38873d4bb5c98d43021b..6b4b5b82b2b52ac682e2e3e861a7d17152078088 100644 (file)
@@ -173,6 +173,48 @@ static int l_get_log_level(lua_State *L)
        return 0;
 }
 
+static int handle_log_groups(lua_State *L, void (*action)(log_groups_t grp))
+{
+       if (lua_gettop(L) != 1 || (!lua_isstring(L, 1) && !lua_istable(L, 1)))
+               lua_error_p(L, "takes string or table of strings");
+
+       if (lua_isstring(L, 1)) {
+               log_groups_t grp = kr_log_name2grp(lua_tostring(L, 1));
+               if (grp == 0)
+                       lua_error_p(L, "unknown group");
+               action(grp);
+       }
+
+       if (lua_istable(L, 1)) {
+               int idx = 1;
+               log_groups_t grp;
+               lua_pushnil(L);
+               while (lua_next(L, 1) != 0) {
+                       if (!lua_isstring(L, -1))
+                               lua_error_p(L, "wrong value at index %d, must be string", idx);
+                       grp = kr_log_name2grp(lua_tostring(L, -1));
+                       if (grp == 0)
+                               lua_error_p(L, "unknown group \"%s\", type add_log_group() for help.", lua_tostring(L, -1));
+
+                       action(grp);
+                       ++idx;
+                       lua_pop(L, 1);
+               }
+       }
+
+       return 0;
+}
+
+static int l_add_log_group(lua_State *L)
+{
+       return handle_log_groups(L, kr_log_add_group);
+}
+
+static int l_del_log_group(lua_State *L)
+{
+       return handle_log_groups(L, kr_log_del_group);
+}
+
 char *engine_get_hostname(struct engine *engine) {
        static char hostname_str[KNOT_DNAME_MAXLEN];
        if (!engine) {
@@ -457,6 +499,10 @@ static int init_state(struct engine *engine)
        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_add_log_group);
+       lua_setglobal(engine->L, "add_log_group");
+       lua_pushcfunction(engine->L, l_del_log_group);
+       lua_setglobal(engine->L, "del_log_group");
        lua_pushcfunction(engine->L, l_setuser);
        lua_setglobal(engine->L, "user");
        lua_pushcfunction(engine->L, l_hint_root_file);
index 72ce0294083bb9f92b3a6073bd8f317189dfd9ef..4b335b3b48cbadc75f43858455d330b82454c399 100644 (file)
--- a/lib/log.c
+++ b/lib/log.c
@@ -20,6 +20,24 @@ log_level_t kr_log_level = LOG_CRIT;
 log_target_t kr_log_target = LOG_TARGET_STDOUT;
 log_groups_t kr_log_groups = 0;
 
+log_group_names_t log_group_names[] = {
+       { "system",     LOG_GRP_SYSTEM },
+       { "cache",      LOG_GRP_CACHE },
+       { "io",         LOG_GRP_IO },
+       { "network",    LOG_GRP_NETWORK },
+       { "ta",         LOG_GRP_TA },
+       { "tls",        LOG_GRP_TLS },
+       { "gnutls",     LOG_GRP_GNUTLS },
+       { "tlsclient",  LOG_GRP_TLSCLIENT },
+       { "xdp",        LOG_GRP_XDP },
+       { "zimport",    LOG_GRP_ZIMPORT },
+       { "zscanner",   LOG_GRP_ZSCANNER },
+       { "doh",        LOG_GRP_DOH },
+       { "dnssec",     LOG_GRP_DNSSEC },
+       { "hint",       LOG_GRP_HINT },
+       { NULL,         -1 },
+};
+
 #ifndef SYSLOG_NAMES
 syslog_code_t prioritynames[] = {
        { "alert",      LOG_ALERT },
@@ -107,6 +125,33 @@ log_level_t kr_log_name2level(const char *name)
        return -1;
 }
 
+char *kr_log_grp2name(log_groups_t group)
+{
+       for (int i = 0; log_group_names[i].g_val != -1; ++i)
+       {
+               if (log_group_names[i].g_val == group)
+                       return log_group_names[i].g_name;
+       }
+
+       return NULL;
+}
+
+log_groups_t kr_log_name2grp(const char *name)
+{
+       if (!name)
+               return 0;
+
+       for (int i = 0; log_group_names[i].g_name; ++i)
+       {
+               if (strcmp(log_group_names[i].g_name, name) == 0)
+                       return log_group_names[i].g_val;
+       }
+
+       return 0;
+}
+
+
+
 int kr_log_level_set(log_level_t level)
 {
        if (level < LOG_CRIT || level > LOG_DEBUG)
index b5f76df56b5e986e442a052e92a95c8152ad0627..18481272b3954f2e45c1d6e376af5f2f25ffb221 100644 (file)
--- a/lib/log.h
+++ b/lib/log.h
@@ -13,7 +13,6 @@
 
 /* Targets */
 
-typedef int log_level_t;
 typedef enum {
        LOG_TARGET_SYSLOG = 0,
        LOG_TARGET_STDERR = 1,
@@ -23,6 +22,10 @@ typedef enum {
 /* Groups */
 
 typedef uint32_t log_groups_t;
+typedef struct {
+       char            *g_name;
+       log_groups_t    g_val;
+} log_group_names_t;
 
 /* Don't forget add name to log_group_names[] (log.c) */
 #define LOG_GRP_SYSTEM         (1 << 1)
@@ -43,12 +46,20 @@ typedef uint32_t log_groups_t;
 KR_EXPORT
 extern log_groups_t kr_log_groups;
 KR_EXPORT
+int group_is_set(log_groups_t group);
+KR_EXPORT
 void kr_log_add_group(log_groups_t mask);
 KR_EXPORT
 void kr_log_del_group(log_groups_t mask);
+KR_EXPORT
+char *kr_log_grp2name(log_groups_t group);
+KR_EXPORT
+log_groups_t kr_log_name2grp(const char *name);
 
 /* Log */
 
+typedef int log_level_t;
+
 KR_EXPORT
 extern log_level_t kr_log_level;
 KR_EXPORT